- 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_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_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)
|
||||
|
||||
/* NAS layer -> MME app messages */
|
||||
MESSAGE_DEF(NAS_AUTHENTICATION_REQ, MESSAGE_PRIORITY_MED, nas_auth_req_t, nas_auth_req)
|
||||
MESSAGE_DEF(NAS_AUTHENTICATION_PARAM_REQ, MESSAGE_PRIORITY_MED, nas_auth_param_req_t, nas_auth_param_req)
|
||||
|
||||
/* MME app -> NAS layer messages */
|
||||
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)
|
||||
MESSAGE_DEF(NAS_ATTACH_REQ, MESSAGE_PRIORITY_MED, nas_attach_req_t, nas_attach_req)
|
||||
|
||||
@@ -3,11 +3,14 @@
|
||||
#ifndef NAS_MESSAGES_TYPES_H_
|
||||
#define NAS_MESSAGES_TYPES_H_
|
||||
|
||||
#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_CNF(mSGpTR) (mSGpTR)->ittiMsg.nas_dl_data_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_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_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_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 {
|
||||
|
||||
@@ -90,17 +93,28 @@ typedef struct {
|
||||
} nas_attach_req_t;
|
||||
|
||||
typedef struct {
|
||||
/* UE imsi */
|
||||
char imsi[16];
|
||||
|
||||
#define NAS_FAILURE_OK 0x0
|
||||
#define NAS_FAILURE_IND 0x1
|
||||
unsigned failure:1;
|
||||
int cause;
|
||||
|
||||
} nas_auth_req_t;
|
||||
|
||||
typedef struct {
|
||||
char imsi[16];
|
||||
} 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_ */
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source mme_api.c
|
||||
Source mme_api.c
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/02/28
|
||||
Date 2013/02/28
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem Application Programming Interface
|
||||
Subsystem Application Programming Interface
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Implements the API used by the NAS layer running in the MME
|
||||
to interact with a Mobility Management Entity
|
||||
Description Implements the API used by the NAS layer running in the MME
|
||||
to interact with a Mobility Management Entity
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -24,7 +24,7 @@ Description Implements the API used by the NAS layer running in the MME
|
||||
#include "mme_api.h"
|
||||
#include "nas_log.h"
|
||||
|
||||
#include <string.h> // memcpy
|
||||
#include <string.h> // memcpy
|
||||
|
||||
/****************************************************************************/
|
||||
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
||||
@@ -35,32 +35,34 @@ Description Implements the API used by the NAS layer running in the MME
|
||||
/****************************************************************************/
|
||||
|
||||
/* Maximum number of PDN connections the MME may simultaneously support */
|
||||
#define MME_API_PDN_MAX 10
|
||||
#define MME_API_PDN_MAX 10
|
||||
|
||||
/* MME group identifier */
|
||||
#define MME_API_MME_GID 0x0102
|
||||
#define MME_API_MME_GID 0x0102
|
||||
|
||||
/* MME code */
|
||||
#define MME_API_MME_CODE 0x12
|
||||
#define MME_API_MME_CODE 0x12
|
||||
|
||||
/* 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 */
|
||||
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 */
|
||||
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
|
||||
|
||||
/* Number of concecutive tracking areas */
|
||||
#define MME_API_NB_TACS 4
|
||||
#define MME_API_NB_TACS 4
|
||||
/* Code of the first tracking area belonging to the PLMN */
|
||||
#define MME_API_FIRST_TAC 0x0001
|
||||
#define MME_API_FIRST_TAC 0x0001
|
||||
|
||||
/* NAS security key */
|
||||
#define MME_API_KASME "CAFECAFECAFECAFECAFECAFECAFECAFE"
|
||||
#define MME_API_KASME "CAFECAFECAFECAFECAFECAFECAFECAFE"
|
||||
|
||||
/* Authentication parameter RAND */
|
||||
static const UInt8_t _mme_api_rand[AUTH_RAND_SIZE] = {
|
||||
@@ -90,111 +92,110 @@ enum {
|
||||
|
||||
/* Pool of IPv4 addresses */
|
||||
static uint8_t _mme_api_ipv4_addr[MME_API_PDN_MAX][4] = {
|
||||
{0xC0, 0xA8, 0x02, 0x3C}, /* 192.168.02.60 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBB}, /* 192.168.12.187 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBC}, /* 192.168.12.188 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD}, /* 192.168.12.189 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBE}, /* 192.168.12.190 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBF}, /* 192.168.12.191 */
|
||||
{0xC0, 0xA8, 0x0C, 0xC0}, /* 192.168.12.192 */
|
||||
{0xC0, 0xA8, 0x0C, 0xC1}, /* 192.168.12.193 */
|
||||
{0xC0, 0xA8, 0x0C, 0xC2}, /* 192.168.12.194 */
|
||||
{0xC0, 0xA8, 0x0C, 0xC3}, /* 192.168.12.195 */
|
||||
{0xC0, 0xA8, 0x02, 0x3C}, /* 192.168.02.60 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBB}, /* 192.168.12.187 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBC}, /* 192.168.12.188 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD}, /* 192.168.12.189 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBE}, /* 192.168.12.190 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBF}, /* 192.168.12.191 */
|
||||
{0xC0, 0xA8, 0x0C, 0xC0}, /* 192.168.12.192 */
|
||||
{0xC0, 0xA8, 0x0C, 0xC1}, /* 192.168.12.193 */
|
||||
{0xC0, 0xA8, 0x0C, 0xC2}, /* 192.168.12.194 */
|
||||
{0xC0, 0xA8, 0x0C, 0xC3}, /* 192.168.12.195 */
|
||||
};
|
||||
/* Pool of IPv6 addresses */
|
||||
static uint8_t _mme_api_ipv6_addr[MME_API_PDN_MAX][8] = {
|
||||
/* FE80::221:70FF:C0A8:023C/64 */
|
||||
/* FE80::221:70FF:C0A8:023C/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x02, 0x3C},
|
||||
/* FE80::221:70FF:C0A8:0CBB/64 */
|
||||
/* FE80::221:70FF:C0A8:0CBB/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBB},
|
||||
/* FE80::221:70FF:C0A8:0CBC/64 */
|
||||
/* FE80::221:70FF:C0A8:0CBC/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBC},
|
||||
/* FE80::221:70FF:C0A8:0CBD/64 */
|
||||
/* FE80::221:70FF:C0A8:0CBD/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBD},
|
||||
/* FE80::221:70FF:C0A8:0CBE/64 */
|
||||
/* FE80::221:70FF:C0A8:0CBE/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBE},
|
||||
/* FE80::221:70FF:C0A8:0CBF/64 */
|
||||
/* FE80::221:70FF:C0A8:0CBF/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBF},
|
||||
/* FE80::221:70FF:C0A8:0CC0/64 */
|
||||
/* FE80::221:70FF:C0A8:0CC0/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC0},
|
||||
/* FE80::221:70FF:C0A8:0CC1/64 */
|
||||
/* FE80::221:70FF:C0A8:0CC1/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC1},
|
||||
/* FE80::221:70FF:C0A8:0CC2/64 */
|
||||
/* FE80::221:70FF:C0A8:0CC2/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC2},
|
||||
/* FE80::221:70FF:C0A8:0CC3/64 */
|
||||
/* FE80::221:70FF:C0A8:0CC3/64 */
|
||||
{0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC3},
|
||||
};
|
||||
/* Pool of IPv4v6 addresses */
|
||||
static uint8_t _mme_api_ipv4v6_addr[MME_API_PDN_MAX][12] = {
|
||||
/* 192.168.02.60, FE80::221:70FF:C0A8:023C/64 */
|
||||
{0xC0, 0xA8, 0x02, 0x3C, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x02, 0x3C},
|
||||
/* 192.168.12.187, FE80::221:70FF:C0A8:0CBB/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBB, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBB},
|
||||
/* 192.168.12.188, FE80::221:70FF:C0A8:0CBC/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBC, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBC},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CBD/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBD},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CBE/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBE},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CBF/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBF},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC0/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC0},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC1/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC1},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC2/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC2},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC3/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC3},
|
||||
/* 192.168.02.60, FE80::221:70FF:C0A8:023C/64 */
|
||||
{0xC0, 0xA8, 0x02, 0x3C, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x02, 0x3C},
|
||||
/* 192.168.12.187, FE80::221:70FF:C0A8:0CBB/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBB, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBB},
|
||||
/* 192.168.12.188, FE80::221:70FF:C0A8:0CBC/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBC, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBC},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CBD/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBD},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CBE/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBE},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CBF/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xBF},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC0/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC0},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC1/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC1},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC2/64 */
|
||||
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC2},
|
||||
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC3/64 */
|
||||
{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 */
|
||||
{4, _mme_api_ipv4_addr[0]},
|
||||
{4, _mme_api_ipv4_addr[1]},
|
||||
{4, _mme_api_ipv4_addr[2]},
|
||||
{4, _mme_api_ipv4_addr[3]},
|
||||
{4, _mme_api_ipv4_addr[4]},
|
||||
{4, _mme_api_ipv4_addr[5]},
|
||||
{4, _mme_api_ipv4_addr[6]},
|
||||
{4, _mme_api_ipv4_addr[7]},
|
||||
{4, _mme_api_ipv4_addr[8]},
|
||||
{4, _mme_api_ipv4_addr[9]},
|
||||
{4, _mme_api_ipv4_addr[0]},
|
||||
{4, _mme_api_ipv4_addr[1]},
|
||||
{4, _mme_api_ipv4_addr[2]},
|
||||
{4, _mme_api_ipv4_addr[3]},
|
||||
{4, _mme_api_ipv4_addr[4]},
|
||||
{4, _mme_api_ipv4_addr[5]},
|
||||
{4, _mme_api_ipv4_addr[6]},
|
||||
{4, _mme_api_ipv4_addr[7]},
|
||||
{4, _mme_api_ipv4_addr[8]},
|
||||
{4, _mme_api_ipv4_addr[9]},
|
||||
},
|
||||
{ /* IPv6 network capability */
|
||||
{8, _mme_api_ipv6_addr[0]},
|
||||
{8, _mme_api_ipv6_addr[1]},
|
||||
{8, _mme_api_ipv6_addr[2]},
|
||||
{8, _mme_api_ipv6_addr[3]},
|
||||
{8, _mme_api_ipv6_addr[4]},
|
||||
{8, _mme_api_ipv6_addr[5]},
|
||||
{8, _mme_api_ipv6_addr[6]},
|
||||
{8, _mme_api_ipv6_addr[7]},
|
||||
{8, _mme_api_ipv6_addr[8]},
|
||||
{8, _mme_api_ipv6_addr[9]},
|
||||
{8, _mme_api_ipv6_addr[0]},
|
||||
{8, _mme_api_ipv6_addr[1]},
|
||||
{8, _mme_api_ipv6_addr[2]},
|
||||
{8, _mme_api_ipv6_addr[3]},
|
||||
{8, _mme_api_ipv6_addr[4]},
|
||||
{8, _mme_api_ipv6_addr[5]},
|
||||
{8, _mme_api_ipv6_addr[6]},
|
||||
{8, _mme_api_ipv6_addr[7]},
|
||||
{8, _mme_api_ipv6_addr[8]},
|
||||
{8, _mme_api_ipv6_addr[9]},
|
||||
},
|
||||
{ /* IPv4v6 network capability */
|
||||
{12, _mme_api_ipv4v6_addr[0]},
|
||||
{12, _mme_api_ipv4v6_addr[1]},
|
||||
{12, _mme_api_ipv4v6_addr[2]},
|
||||
{12, _mme_api_ipv4v6_addr[3]},
|
||||
{12, _mme_api_ipv4v6_addr[4]},
|
||||
{12, _mme_api_ipv4v6_addr[5]},
|
||||
{12, _mme_api_ipv4v6_addr[6]},
|
||||
{12, _mme_api_ipv4v6_addr[7]},
|
||||
{12, _mme_api_ipv4v6_addr[8]},
|
||||
{12, _mme_api_ipv4v6_addr[9]},
|
||||
{12, _mme_api_ipv4v6_addr[0]},
|
||||
{12, _mme_api_ipv4v6_addr[1]},
|
||||
{12, _mme_api_ipv4v6_addr[2]},
|
||||
{12, _mme_api_ipv4v6_addr[3]},
|
||||
{12, _mme_api_ipv4v6_addr[4]},
|
||||
{12, _mme_api_ipv4v6_addr[5]},
|
||||
{12, _mme_api_ipv4v6_addr[6]},
|
||||
{12, _mme_api_ipv4v6_addr[7]},
|
||||
{12, _mme_api_ipv4v6_addr[8]},
|
||||
{12, _mme_api_ipv4v6_addr[9]},
|
||||
},
|
||||
};
|
||||
|
||||
/* Subscribed QCI */
|
||||
#define MME_API_QCI 3
|
||||
#define MME_API_QCI 3
|
||||
|
||||
/* Data bit rates */
|
||||
#define MME_API_BIT_RATE_64K 0x40
|
||||
#define MME_API_BIT_RATE_128K 0x48
|
||||
#define MME_API_BIT_RATE_512K 0x78
|
||||
#define MME_API_BIT_RATE_1024K 0x87
|
||||
#define MME_API_BIT_RATE_64K 0x40
|
||||
#define MME_API_BIT_RATE_128K 0x48
|
||||
#define MME_API_BIT_RATE_512K 0x78
|
||||
#define MME_API_BIT_RATE_1024K 0x87
|
||||
|
||||
/* Total number of PDN connections (should not exceed MME_API_PDN_MAX) */
|
||||
static int _mme_api_pdn_id = 0;
|
||||
@@ -209,23 +210,24 @@ static int _mme_api_pdn_id = 0;
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: mme_api_get_emm_config() **
|
||||
** Name: mme_api_get_emm_config() **
|
||||
** **
|
||||
** Description: Retreives MME configuration data related to EPS mobility **
|
||||
** management **
|
||||
** management **
|
||||
** **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
#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
|
||||
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
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
@@ -255,31 +257,31 @@ int mme_api_get_emm_config(mme_api_emm_config_t* config)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: mme_api_get_config() **
|
||||
** Name: mme_api_get_config() **
|
||||
** **
|
||||
** Description: Retreives MME configuration data related to EPS session **
|
||||
** management **
|
||||
** management **
|
||||
** **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** 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;
|
||||
|
||||
if (_mme_api_ip_capability == MME_API_IPV4_ADDR) {
|
||||
config->features = MME_API_IPV4;
|
||||
config->features = MME_API_IPV4;
|
||||
} else if (_mme_api_ip_capability == MME_API_IPV6_ADDR) {
|
||||
config->features = MME_API_IPV6;
|
||||
config->features = MME_API_IPV6;
|
||||
} else if (_mme_api_ip_capability == MME_API_IPV4V6_ADDR) {
|
||||
config->features = MME_API_IPV4 | MME_API_IPV6;
|
||||
config->features = MME_API_IPV4 | MME_API_IPV6;
|
||||
} else {
|
||||
config->features = 0;
|
||||
config->features = 0;
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN (RETURNok);
|
||||
@@ -287,55 +289,55 @@ int mme_api_get_esm_config(mme_api_esm_config_t* config)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: mme_api_identify_guti() **
|
||||
** Name: mme_api_identify_guti() **
|
||||
** **
|
||||
** Description: Requests the MME to identify the UE using the specified **
|
||||
** GUTI. If the UE is known by the MME (a Mobility Manage- **
|
||||
** ment context exists for this UE in the MME), its se- **
|
||||
** curity context is returned. **
|
||||
** GUTI. If the UE is known by the MME (a Mobility Manage- **
|
||||
** ment context exists for this UE in the MME), its se- **
|
||||
** curity context is returned. **
|
||||
** **
|
||||
** Inputs: guti: EPS Globally Unique Temporary UE Identity **
|
||||
** Others: None **
|
||||
** Inputs: guti: EPS Globally Unique Temporary UE Identity **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: vector: The EPS authentication vector of the UE if **
|
||||
** known by the network; NULL otherwise. **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: vector: The EPS authentication vector of the UE if **
|
||||
** known by the network; NULL otherwise. **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** 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;
|
||||
|
||||
LOG_FUNC_IN;
|
||||
|
||||
LOG_FUNC_RETURN(rc);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: mme_api_identify_imsi() **
|
||||
** Name: mme_api_identify_imsi() **
|
||||
** **
|
||||
** Description: Requests the MME to identify the UE using the specified **
|
||||
** IMSI. If the UE is known by the MME (a Mobility Manage- **
|
||||
** ment context exists for this UE in the MME), its se- **
|
||||
** curity context is returned. **
|
||||
** IMSI. If the UE is known by the MME (a Mobility Manage- **
|
||||
** ment context exists for this UE in the MME), its se- **
|
||||
** curity context is returned. **
|
||||
** **
|
||||
** Inputs: imsi: International Mobile Subscriber Identity **
|
||||
** Others: None **
|
||||
** Inputs: imsi: International Mobile Subscriber Identity **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: vector: The EPS authentication vector of the UE if **
|
||||
** known by the network; NULL otherwise. **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: vector: The EPS authentication vector of the UE if **
|
||||
** known by the network; NULL otherwise. **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** 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;
|
||||
|
||||
LOG_FUNC_IN;
|
||||
|
||||
memcpy(vector->rand, _mme_api_rand, AUTH_RAND_SIZE);
|
||||
memcpy(vector->autn, _mme_api_autn, AUTH_AUTN_SIZE);
|
||||
memcpy(vector->xres, _mme_api_xres, AUTH_XRES_SIZE);
|
||||
@@ -345,61 +347,61 @@ int mme_api_identify_imsi(const imsi_t* imsi, auth_vector_t* vector)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: mme_api_identify_imei() **
|
||||
** Name: mme_api_identify_imei() **
|
||||
** **
|
||||
** Description: Requests the MME to identify the UE using the specified **
|
||||
** IMEI. If the UE is known by the MME (a Mobility Manage- **
|
||||
** ment context exists for this UE in the MME), its se- **
|
||||
** curity context is returned. **
|
||||
** IMEI. If the UE is known by the MME (a Mobility Manage- **
|
||||
** ment context exists for this UE in the MME), its se- **
|
||||
** curity context is returned. **
|
||||
** **
|
||||
** Inputs: imei: International Mobile Equipment Identity **
|
||||
** Others: None **
|
||||
** Inputs: imei: International Mobile Equipment Identity **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: vector: The EPS authentication vector of the UE if **
|
||||
** known by the network; NULL otherwise. **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: vector: The EPS authentication vector of the UE if **
|
||||
** known by the network; NULL otherwise. **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** 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;
|
||||
|
||||
LOG_FUNC_IN;
|
||||
|
||||
LOG_FUNC_RETURN(rc);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: mme_api_new_guti() **
|
||||
** Name: mme_api_new_guti() **
|
||||
** **
|
||||
** Description: Requests the MME to assign a new GUTI to the UE identi- **
|
||||
** fied by the given IMSI. **
|
||||
** fied by the given IMSI. **
|
||||
** **
|
||||
** Description: Requests the MME to assign a new GUTI to the UE identi- **
|
||||
** fied by the given IMSI and returns the list of consecu- **
|
||||
** tive tracking areas the UE is registered to. **
|
||||
** fied by the given IMSI and returns the list of consecu- **
|
||||
** tive tracking areas the UE is registered to. **
|
||||
** **
|
||||
** Inputs: imsi: International Mobile Subscriber Identity **
|
||||
** Others: None **
|
||||
** Inputs: imsi: International Mobile Subscriber Identity **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: guti: The new assigned GUTI **
|
||||
** tac: Code of the first tracking area belonging **
|
||||
** to the PLMN **
|
||||
** n_tacs: Number of concecutive tracking areas **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: guti: The new assigned GUTI **
|
||||
** tac: Code of the first tracking area belonging **
|
||||
** to the PLMN **
|
||||
** n_tacs: Number of concecutive tracking areas **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** 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;
|
||||
|
||||
static unsigned int tmsi = 1;
|
||||
|
||||
LOG_FUNC_IN;
|
||||
|
||||
guti->gummei.plmn = mme_api_plmn;
|
||||
guti->gummei.MMEgid = MME_API_MME_GID;
|
||||
guti->gummei.MMEcode = MME_API_MME_CODE;
|
||||
@@ -413,72 +415,72 @@ int mme_api_new_guti(const imsi_t* imsi, GUTI_t* guti, tac_t* tac, int* n_tacs)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: mme_api_subscribe() **
|
||||
** Name: mme_api_subscribe() **
|
||||
** **
|
||||
** Description: Requests the MME to check whether connectivity with the **
|
||||
** requested PDN can be established using the specified APN. **
|
||||
** If accepted the MME returns PDN subscription context con- **
|
||||
** taining EPS subscribed QoS profile, the default APN if **
|
||||
** required and UE's IPv4 address and/or the IPv6 prefix. **
|
||||
** requested PDN can be established using the specified APN. **
|
||||
** If accepted the MME returns PDN subscription context con- **
|
||||
** taining EPS subscribed QoS profile, the default APN if **
|
||||
** required and UE's IPv4 address and/or the IPv6 prefix. **
|
||||
** **
|
||||
** Inputs: apn: If not NULL, Access Point Name of the PDN **
|
||||
** to connect to **
|
||||
** is_emergency: TRUE if the PDN connectivity is requested **
|
||||
** for emergency bearer services **
|
||||
** Others: None **
|
||||
** Inputs: apn: If not NULL, Access Point Name of the PDN **
|
||||
** to connect to **
|
||||
** is_emergency: TRUE if the PDN connectivity is requested **
|
||||
** for emergency bearer services **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: apn: If NULL, default APN or APN configured for **
|
||||
** emergency bearer services **
|
||||
** pdn_addr: PDN connection IPv4 address or IPv6 inter- **
|
||||
** face identifier to be used to build the **
|
||||
** IPv6 link local address **
|
||||
** qos: EPS subscribed QoS profile **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: apn: If NULL, default APN or APN configured for **
|
||||
** emergency bearer services **
|
||||
** pdn_addr: PDN connection IPv4 address or IPv6 inter- **
|
||||
** face identifier to be used to build the **
|
||||
** IPv6 link local address **
|
||||
** qos: EPS subscribed QoS profile **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
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 is_emergency, mme_api_qos_t *qos)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
int rc = RETURNok;
|
||||
|
||||
LOG_FUNC_IN;
|
||||
|
||||
if ( apn && (apn->length == 0) ) {
|
||||
/* PDN connectivity to default APN */
|
||||
if (is_emergency) {
|
||||
apn->length = mme_api_emergency_apn.length;
|
||||
apn->value = mme_api_emergency_apn.value;
|
||||
} else {
|
||||
apn->length = mme_api_default_apn.length;
|
||||
apn->value = mme_api_default_apn.value;
|
||||
}
|
||||
/* PDN connectivity to default APN */
|
||||
if (is_emergency) {
|
||||
apn->length = mme_api_emergency_apn.length;
|
||||
apn->value = mme_api_emergency_apn.value;
|
||||
} else {
|
||||
apn->length = mme_api_default_apn.length;
|
||||
apn->value = mme_api_default_apn.value;
|
||||
}
|
||||
}
|
||||
|
||||
/* Assign PDN address */
|
||||
if ( pdn_addr && (_mme_api_pdn_id < MME_API_PDN_MAX) ) {
|
||||
pdn_addr->length =
|
||||
_mme_api_pdn_addr[_mme_api_ip_capability][_mme_api_pdn_id].length;
|
||||
pdn_addr->value =
|
||||
_mme_api_pdn_addr[_mme_api_ip_capability][_mme_api_pdn_id].value;
|
||||
/* Increment the total number of PDN connections */
|
||||
_mme_api_pdn_id += 1;
|
||||
pdn_addr->length =
|
||||
_mme_api_pdn_addr[_mme_api_ip_capability][_mme_api_pdn_id].length;
|
||||
pdn_addr->value =
|
||||
_mme_api_pdn_addr[_mme_api_ip_capability][_mme_api_pdn_id].value;
|
||||
/* Increment the total number of PDN connections */
|
||||
_mme_api_pdn_id += 1;
|
||||
} else {
|
||||
/* Maximum number of PDN connections exceeded */
|
||||
rc = RETURNerror;
|
||||
/* Maximum number of PDN connections exceeded */
|
||||
rc = RETURNerror;
|
||||
}
|
||||
|
||||
/* Setup EPS subscribed QoS profile */
|
||||
if (qos) {
|
||||
qos->qci = MME_API_QCI;
|
||||
/* Uplink bit rate */
|
||||
qos->gbr[MME_API_UPLINK] = MME_API_BIT_RATE_64K;
|
||||
qos->mbr[MME_API_UPLINK] = MME_API_BIT_RATE_128K;
|
||||
/* Downlink bit rate */
|
||||
qos->gbr[MME_API_DOWNLINK] = MME_API_BIT_RATE_512K;
|
||||
qos->mbr[MME_API_DOWNLINK] = MME_API_BIT_RATE_1024K;
|
||||
qos->qci = MME_API_QCI;
|
||||
/* Uplink bit rate */
|
||||
qos->gbr[MME_API_UPLINK] = MME_API_BIT_RATE_64K;
|
||||
qos->mbr[MME_API_UPLINK] = MME_API_BIT_RATE_128K;
|
||||
/* Downlink bit rate */
|
||||
qos->gbr[MME_API_DOWNLINK] = MME_API_BIT_RATE_512K;
|
||||
qos->mbr[MME_API_DOWNLINK] = MME_API_BIT_RATE_1024K;
|
||||
} else {
|
||||
rc = RETURNerror;
|
||||
rc = RETURNerror;
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN(rc);
|
||||
@@ -486,21 +488,21 @@ int mme_api_subscribe(OctetString* apn, OctetString* pdn_addr,
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: mme_api_unsubscribe() **
|
||||
** Name: mme_api_unsubscribe() **
|
||||
** **
|
||||
** Description: Requests the MME to release connectivity with the reques- **
|
||||
** ted PDN using the specified APN. **
|
||||
** ted PDN using the specified APN. **
|
||||
** **
|
||||
** Inputs: apn: Access Point Name of the PDN to disconnect **
|
||||
** from **
|
||||
** Others: None **
|
||||
** Inputs: apn: Access Point Name of the PDN to disconnect **
|
||||
** from **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int mme_api_unsubscribe(OctetString* apn)
|
||||
int mme_api_unsubscribe(OctetString *apn)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source mme_api.h
|
||||
Source mme_api.h
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/02/28
|
||||
Date 2013/02/28
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem Application Programming Interface
|
||||
Subsystem Application Programming Interface
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Implements the API used by the NAS layer running in the MME
|
||||
to interact with a Mobility Management Entity
|
||||
Description Implements the API used by the NAS layer running in the MME
|
||||
to interact with a Mobility Management Entity
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __MME_API_H__
|
||||
@@ -35,35 +35,35 @@ Description Implements the API used by the NAS layer running in the MME
|
||||
/****************************************************************************/
|
||||
|
||||
/* Maximum number of UEs the MME may simultaneously support */
|
||||
#define MME_API_NB_UE_MAX 1
|
||||
#define MME_API_NB_UE_MAX 1
|
||||
|
||||
#ifdef NAS_MME
|
||||
|
||||
/* Features supported by the MME */
|
||||
typedef enum {
|
||||
MME_API_NO_FEATURE_SUPPORTED = 0,
|
||||
MME_API_EMERGENCY_ATTACH = (1<<0),
|
||||
MME_API_UNAUTHENTICATED_IMSI = (1<<1),
|
||||
MME_API_IPV4 = (1<<2),
|
||||
MME_API_IPV6 = (1<<3),
|
||||
MME_API_SINGLE_ADDR_BEARERS = (1<<4),
|
||||
typedef enum mme_api_feature_s {
|
||||
MME_API_NO_FEATURE_SUPPORTED = 0,
|
||||
MME_API_EMERGENCY_ATTACH = (1<<0),
|
||||
MME_API_UNAUTHENTICATED_IMSI = (1<<1),
|
||||
MME_API_IPV4 = (1<<2),
|
||||
MME_API_IPV6 = (1<<3),
|
||||
MME_API_SINGLE_ADDR_BEARERS = (1<<4),
|
||||
} mme_api_feature_t;
|
||||
|
||||
/*
|
||||
* EPS Mobility Management configuration data
|
||||
* ------------------------------------------
|
||||
*/
|
||||
typedef struct {
|
||||
mme_api_feature_t features; /* Supported features */
|
||||
gummei_t gummei; /* EPS Globally Unique MME Identity */
|
||||
typedef struct mme_api_emm_config_s {
|
||||
mme_api_feature_t features; /* Supported features */
|
||||
gummei_t gummei; /* EPS Globally Unique MME Identity */
|
||||
} mme_api_emm_config_t;
|
||||
|
||||
/*
|
||||
* EPS Session Management configuration data
|
||||
* -----------------------------------------
|
||||
*/
|
||||
typedef struct {
|
||||
mme_api_feature_t features; /* Supported features */
|
||||
typedef struct mme_api_esm_config_s {
|
||||
mme_api_feature_t features; /* Supported features */
|
||||
} mme_api_esm_config_t;
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -71,17 +71,17 @@ typedef struct {
|
||||
/****************************************************************************/
|
||||
|
||||
/* EPS subscribed QoS profile */
|
||||
typedef struct {
|
||||
#define MME_API_UPLINK 0
|
||||
#define MME_API_DOWNLINK 1
|
||||
#define MME_API_DIRECTION 2
|
||||
int gbr[MME_API_DIRECTION]; /* Guaranteed Bit Rate */
|
||||
int mbr[MME_API_DIRECTION]; /* Maximum Bit Rate */
|
||||
int qci; /* QoS Class Identifier */
|
||||
typedef struct mme_api_qos_s {
|
||||
#define MME_API_UPLINK 0
|
||||
#define MME_API_DOWNLINK 1
|
||||
#define MME_API_DIRECTION 2
|
||||
int gbr[MME_API_DIRECTION]; /* Guaranteed Bit Rate */
|
||||
int mbr[MME_API_DIRECTION]; /* Maximum Bit Rate */
|
||||
int qci; /* QoS Class Identifier */
|
||||
} mme_api_qos_t;
|
||||
|
||||
/* Traffic Flow Template */
|
||||
typedef struct {
|
||||
typedef struct mme_api_tft_s {
|
||||
} mme_api_tft_t;
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -93,19 +93,21 @@ typedef struct {
|
||||
/****************************************************************************/
|
||||
|
||||
#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
|
||||
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
|
||||
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_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_new_guti(const imsi_t* imsi, GUTI_t* guti, tac_t* tac, int* n_tacs);
|
||||
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_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_subscribe(OctetString* apn, OctetString* pdn_addr, int is_emergency, mme_api_qos_t* qos);
|
||||
int mme_api_unsubscribe(OctetString* apn);
|
||||
int mme_api_subscribe(OctetString *apn, OctetString *pdn_addr,
|
||||
int is_emergency, mme_api_qos_t *qos);
|
||||
int mme_api_unsubscribe(OctetString *apn);
|
||||
|
||||
#endif // NAS_MME
|
||||
|
||||
|
||||
@@ -47,6 +47,9 @@ Description Defines the attach related EMM procedure executed by the
|
||||
|
||||
#ifdef NAS_MME
|
||||
#include "mme_api.h"
|
||||
# if defined(EPC_BUILD)
|
||||
# include "nas_itti_messaging.h"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#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->imei)? "IMEI" : "none");
|
||||
|
||||
#if defined(EPC_BUILD)
|
||||
nas_itti_auth_info_req(emm_ctx->imsi, 1);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* UE's identification
|
||||
* -------------------
|
||||
|
||||
@@ -529,15 +529,15 @@ int emm_proc_authentication(unsigned int ueid, int ksi,
|
||||
emm_common_failure_callback_t failure)
|
||||
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
int rc = RETURNerror;
|
||||
authentication_data_t *data;
|
||||
|
||||
LOG_FUNC_IN;
|
||||
|
||||
LOG_TRACE(INFO, "EMM-PROC - Initiate authentication KSI = %d", ksi);
|
||||
|
||||
/* Allocate parameters of the retransmission timer callback */
|
||||
authentication_data_t *data =
|
||||
(authentication_data_t *)malloc(sizeof(authentication_data_t));
|
||||
data = (authentication_data_t *)malloc(sizeof(authentication_data_t));
|
||||
|
||||
if (data != NULL) {
|
||||
/* Setup ongoing EMM procedure callback functions */
|
||||
|
||||
@@ -320,6 +320,10 @@ typedef struct {
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
typedef struct emm_data_context_s {
|
||||
#if defined(EPC_BUILD)
|
||||
RB_ENTRY(emm_data_context_s) entries;
|
||||
#endif
|
||||
|
||||
unsigned int ueid; /* UE identifier */
|
||||
int is_dynamic; /* Dynamically allocated context indicator */
|
||||
int is_attached; /* Attachment indicator */
|
||||
@@ -344,10 +348,6 @@ typedef struct emm_data_context_s {
|
||||
int emm_cause; /* EMM failure cause code */
|
||||
|
||||
emm_fsm_state_t _emm_fsm_status;
|
||||
|
||||
#if defined(EPC_BUILD)
|
||||
RB_ENTRY(emm_data_context_s) entries;
|
||||
#endif
|
||||
} 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_
|
||||
#define NAS_DEFS_H_
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "intertask_interface.h"
|
||||
#include "nas_itti_messaging.h"
|
||||
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include "intertask_interface.h"
|
||||
#include "conversions.h"
|
||||
|
||||
#ifndef 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,
|
||||
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_ */
|
||||
|
||||
@@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
*******************************************************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
@@ -38,10 +39,30 @@
|
||||
int s1ap_mme_itti_send_sctp_request(uint8_t *buffer, uint32_t length,
|
||||
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);
|
||||
|
||||
int s1ap_mme_itti_nas_downlink_cnf(const uint32_t ue_id,
|
||||
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_ */
|
||||
|
||||
@@ -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",
|
||||
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.
|
||||
* Create new UE context by associating new mme_ue_s1ap_id.
|
||||
* 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
|
||||
* 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;
|
||||
OCTET_STRING_TO_TAC(&initialUEMessage_p->tai.tAC, 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);
|
||||
}
|
||||
/* We received the first NAS transport message: initial UE message.
|
||||
* Send a NAS ESTABLISH IND to NAS layer
|
||||
*/
|
||||
s1ap_mme_itti_nas_establish_ind(ue_ref->mme_ue_s1ap_id,
|
||||
initialUEMessage_p->nas_pdu.buf,
|
||||
initialUEMessage_p->nas_pdu.size,
|
||||
initialUEMessage_p->rrC_Establishment_Cause,
|
||||
tac);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user