Commit fb09ba8e authored by Lionel Gauthier's avatar Lionel Gauthier

OK for start of MME_GW and HSS on same host

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7110 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent ecff2e01
...@@ -349,6 +349,10 @@ _gtpuah_tg4_add(struct sk_buff *old_skb_pP, const struct xt_action_param *par_pP ...@@ -349,6 +349,10 @@ _gtpuah_tg4_add(struct sk_buff *old_skb_pP, const struct xt_action_param *par_pP
} }
} }
}; };
/*pr_info("GTPUAH: PACKET -> NF_HOOK NF_INET_POST_ROUTING/%s encapsulated src: %u.%u.%u.%u dst: %u.%u.%u.%u\n",
gtpuah_tg_reg[0].table,
NIPADDR(old_iph_p->saddr),
NIPADDR(old_iph_p->daddr));*/
rt = ip_route_output_key(&init_net, &fl.u.ip4); rt = ip_route_output_key(&init_net, &fl.u.ip4);
......
This diff is collapsed.
...@@ -58,7 +58,7 @@ typedef enum { ...@@ -58,7 +58,7 @@ typedef enum {
typedef struct gtpv1u_teid_data_s { typedef struct gtpv1u_teid_data_s {
/* UE identifier for oaisim stack */ /* UE identifier for oaisim stack */
module_id_t enb_id; module_id_t enb_id;
module_id_t ue_id; rnti_t ue_id;
ebi_t eps_bearer_id; ebi_t eps_bearer_id;
} gtpv1u_teid_data_t; } gtpv1u_teid_data_t;
...@@ -76,7 +76,7 @@ typedef struct gtpv1u_bearer_s { ...@@ -76,7 +76,7 @@ typedef struct gtpv1u_bearer_s {
typedef struct gtpv1u_ue_data_s { typedef struct gtpv1u_ue_data_s {
/* UE identifier for oaisim stack */ /* UE identifier for oaisim stack */
module_id_t ue_id; rnti_t ue_id;
/* Unique identifier used between PDCP and GTP-U to distinguish UEs */ /* Unique identifier used between PDCP and GTP-U to distinguish UEs */
uint32_t instance_id; uint32_t instance_id;
...@@ -121,12 +121,13 @@ typedef struct gtpv1u_data_s { ...@@ -121,12 +121,13 @@ typedef struct gtpv1u_data_s {
int int
gtpv1u_new_data_req( gtpv1u_new_data_req(
uint8_t enb_id, uint8_t enb_module_idP,
uint8_t ue_id, rnti_t ue_rntiP,
uint8_t rab_id, uint8_t rab_idP,
uint8_t *buffer, uint8_t *buffer_pP,
uint32_t buf_len, uint32_t buf_lenP,
uint32_t buf_offset); uint32_t buf_offsetP
);
int int
gtpv1u_initial_req( gtpv1u_initial_req(
......
...@@ -54,7 +54,9 @@ ...@@ -54,7 +54,9 @@
//static NwGtpv1uStackHandleT gtpv1u_stack = 0; //static NwGtpv1uStackHandleT gtpv1u_stack = 0;
static gtpv1u_data_t gtpv1u_sgw_data; static gtpv1u_data_t gtpv1u_sgw_data;
#if !defined(ENABLE_USE_GTPU_IN_KERNEL)
static int gtpv1u_send_init_udp(uint16_t port_number); static int gtpv1u_send_init_udp(uint16_t port_number);
#endif
static int gtpv1u_create_s1u_tunnel(Gtpv1uCreateTunnelReq *create_tunnel_reqP); static int gtpv1u_create_s1u_tunnel(Gtpv1uCreateTunnelReq *create_tunnel_reqP);
static int gtpv1u_delete_s1u_tunnel(Teid_t context_teidP, Teid_t S1U_teidP); static int gtpv1u_delete_s1u_tunnel(Teid_t context_teidP, Teid_t S1U_teidP);
static int gtpv1u_update_s1u_tunnel(Gtpv1uUpdateTunnelReq *reqP); static int gtpv1u_update_s1u_tunnel(Gtpv1uUpdateTunnelReq *reqP);
...@@ -147,6 +149,7 @@ void gtpu_print_hex_octets(unsigned char* dataP, unsigned long sizeP) ...@@ -147,6 +149,7 @@ void gtpu_print_hex_octets(unsigned char* dataP, unsigned long sizeP)
} }
#if !defined(ENABLE_USE_GTPU_IN_KERNEL)
static int gtpv1u_send_init_udp(uint16_t port_number) static int gtpv1u_send_init_udp(uint16_t port_number)
{ {
// Create and alloc new message // Create and alloc new message
...@@ -168,6 +171,7 @@ static int gtpv1u_send_init_udp(uint16_t port_number) ...@@ -168,6 +171,7 @@ static int gtpv1u_send_init_udp(uint16_t port_number)
return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p); return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p);
} }
#endif
NwGtpv1uRcT gtpv1u_log_request(NwGtpv1uLogMgrHandleT hLogMgr, NwGtpv1uRcT gtpv1u_log_request(NwGtpv1uLogMgrHandleT hLogMgr,
NwU32T logLevel, NwU32T logLevel,
...@@ -179,6 +183,7 @@ NwGtpv1uRcT gtpv1u_log_request(NwGtpv1uLogMgrHandleT hLogMgr, ...@@ -179,6 +183,7 @@ NwGtpv1uRcT gtpv1u_log_request(NwGtpv1uLogMgrHandleT hLogMgr,
return NW_GTPV1U_OK; return NW_GTPV1U_OK;
} }
#if !defined(ENABLE_USE_GTPU_IN_KERNEL)
NwGtpv1uRcT gtpv1u_send_udp_msg( NwGtpv1uRcT gtpv1u_send_udp_msg(
NwGtpv1uUdpHandleT udpHandle, NwGtpv1uUdpHandleT udpHandle,
NwU8T *buffer, NwU8T *buffer,
...@@ -203,7 +208,7 @@ NwGtpv1uRcT gtpv1u_send_udp_msg( ...@@ -203,7 +208,7 @@ NwGtpv1uRcT gtpv1u_send_udp_msg(
return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p); return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p);
} }
#endif
/* Callback called when a gtpv1u message arrived on UDP interface */ /* Callback called when a gtpv1u message arrived on UDP interface */
NwGtpv1uRcT gtpv1u_process_stack_req( NwGtpv1uRcT gtpv1u_process_stack_req(
NwGtpv1uUlpHandleT hUlp, NwGtpv1uUlpHandleT hUlp,
......
...@@ -128,6 +128,7 @@ nwGtpv1uGpduMsgNew( NW_IN NwGtpv1uStackHandleT hGtpuStackHandle, ...@@ -128,6 +128,7 @@ nwGtpv1uGpduMsgNew( NW_IN NwGtpv1uStackHandleT hGtpuStackHandle,
{ {
NwGtpv1uStackT *pStack = (NwGtpv1uStackT *) hGtpuStackHandle; NwGtpv1uStackT *pStack = (NwGtpv1uStackT *) hGtpuStackHandle;
NwGtpv1uMsgT *pMsg; NwGtpv1uMsgT *pMsg;
//NwU32T header_len = 0;
NwU32T msgExtraLen = 0; NwU32T msgExtraLen = 0;
if(gpGtpv1uMsgPool) { if(gpGtpv1uMsgPool) {
......
...@@ -45,19 +45,20 @@ ...@@ -45,19 +45,20 @@
#include "assertions.h" #include "assertions.h"
static static
int mme_app_request_authentication_info(const mme_app_imsi_t imsi, int mme_app_request_authentication_info(const char *imsi,
const uint8_t nb_of_vectors, const uint8_t nb_of_vectors,
const plmn_t *plmn, const plmn_t *plmn,
const uint8_t *auts); const uint8_t *auts);
static static
int mme_app_request_authentication_info(const mme_app_imsi_t imsi, int mme_app_request_authentication_info(const char *imsi,
const uint8_t nb_of_vectors, const uint8_t nb_of_vectors,
const plmn_t *plmn, const plmn_t *plmn,
const uint8_t *auts) const uint8_t *auts)
{ {
s6a_auth_info_req_t *auth_info_req = NULL; s6a_auth_info_req_t *auth_info_req = NULL;
MessageDef *message_p = NULL; MessageDef *message_p = NULL;
int imsi_length = strlen(imsi);
DevAssert(plmn != NULL); DevAssert(plmn != NULL);
...@@ -66,7 +67,9 @@ int mme_app_request_authentication_info(const mme_app_imsi_t imsi, ...@@ -66,7 +67,9 @@ int mme_app_request_authentication_info(const mme_app_imsi_t imsi,
auth_info_req = &message_p->ittiMsg.s6a_auth_info_req; auth_info_req = &message_p->ittiMsg.s6a_auth_info_req;
memset(auth_info_req, 0, sizeof(*auth_info_req)); memset(auth_info_req, 0, sizeof(*auth_info_req));
auth_info_req->imsi_length = MME_APP_IMSI_TO_STRING(imsi, auth_info_req->imsi); strncpy(auth_info_req->imsi, imsi, imsi_length);
auth_info_req->imsi_length = imsi_length;
//MME_APP_IMSI_TO_STRING(imsi, auth_info_req->imsi);
memcpy(&auth_info_req->visited_plmn, plmn, sizeof(plmn_t)); memcpy(&auth_info_req->visited_plmn, plmn, sizeof(plmn_t));
MME_APP_DEBUG("%s visited_plmn MCC %X%X%X MNC %X%X%X\n", MME_APP_DEBUG("%s visited_plmn MCC %X%X%X MNC %X%X%X\n",
...@@ -214,122 +217,7 @@ mme_app_handle_authentication_info_answer( ...@@ -214,122 +217,7 @@ mme_app_handle_authentication_info_answer(
return 0; return 0;
} }
#if defined(DISABLE_USE_NAS)
int mme_app_handle_attach_req(nas_attach_req_t *attach_req_p)
{
/* An attach request has been received from NAS layer.
* If the UE authentication vectors for the UE are known within MME then the
* authentication procedure should be triggered only if the request is an
* initial attach, otherwise an update location should be sent to the HSS
* and default bearer should be established for the provided APN.
* In case of initial attach procedure, the default APN retrieved from the
* HSS will be used to establish the default bearer within EPC.
* The default APN is the one that matches the context-identifier
*/
struct ue_context_s *ue_context;
uint64_t imsi = 0;
DevAssert(attach_req_p != NULL);
MME_APP_STRING_TO_IMSI((char *)attach_req_p->imsi, &imsi);
MME_APP_DEBUG("Handling imsi %"IMSI_FORMAT"\n", imsi);
ue_context = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, imsi);
if (ue_context == NULL) {
/* The MME doesn't know this IMSI.
* Insert the UE to the list of known equipements and
* Retrieve the authentication vector from HSS.
*/
MME_APP_DEBUG("UE context doesn't exist -> create one\n");
if ((ue_context = mme_create_new_ue_context()) == NULL) {
/* Error during ue context malloc */
/* TODO */
DevMessage("mme_create_new_ue_context");
return -1;
}
ue_context->imsi = imsi;
ue_context->eNB_ue_s1ap_id = attach_req_p->transparent.eNB_ue_s1ap_id;
ue_context->mme_ue_s1ap_id = attach_req_p->transparent.mme_ue_s1ap_id;
ue_context->ue_id = attach_req_p->transparent.mme_ue_s1ap_id;
// STAILQ_INIT(&ue_context->vector_list);
DevAssert(mme_insert_ue_context(&mme_app_desc.mme_ue_contexts, ue_context) == 0);
goto request_auth;
} else {
/* MME knows this IMSI, check if UE is authenticated and authentication
* vectors are known.
*/
MME_APP_DEBUG("UE context already exists, use it\n");
/* Update mme ue s1ap id */
ue_context->mme_ue_s1ap_id = attach_req_p->transparent.mme_ue_s1ap_id;
if ((ue_context->imsi_auth == IMSI_AUTHENTICATED) &&
(attach_req_p->initial != INITIAL_REQUEST)) {
/* We have to send an update location request to the HSS */
MME_APP_DEBUG("UE is authenticated\n");
} else {
MME_APP_DEBUG("UE is not authenticated\n");
/* UE is not authenticated or an initial request */
// if (STAILQ_EMPTY(&ue_context->vector_list))
if (ue_context->nb_of_vectors == 0)
request_auth: {
/* We have no vector for this UE, send an authentication request
* to the HSS.
*/
AssertFatal(0, "Hardcoded MCC/MNC");
plmn_t plmn = {
.MCCdigit2 = 0,
.MCCdigit1 = 8,
.MCCdigit3 = 2,
.MNCdigit1 = 0,
.MNCdigit2 = 4,
.MNCdigit3 = 3,
};
memcpy(&ue_context->e_utran_cgi, &attach_req_p->transparent.e_utran_cgi,
sizeof(cgi_t));
/* Acquire the current time */
time(&ue_context->cell_age);
/* Some random values for GUTI */
ue_context->guti.m_tmsi = 0x24568956;
ue_context->guti.gummei.MMEcode = 0x01;
ue_context->guti.gummei.MMEgid = 0x5691;
memcpy(&ue_context->guti.gummei.plmn, &plmn, sizeof(plmn_t));
MME_APP_DEBUG("and we have no auth. vector for it, request"
" authentication information\n");
// mme_app_dump_ue_contexts();
mme_app_request_authentication_info(imsi, 1, &plmn, NULL);
} else {
nas_auth_req_t *nas_auth_req_p;
MessageDef *message_p;
/* We have a vector... USE it */
MME_APP_DEBUG("but we have an auth. vector for it, request"
" authentication from NAS\n");
message_p = itti_alloc_new_message(TASK_MME_APP, NAS_AUTHENTICATION_PARAM_FAIL);
nas_auth_req_p = &message_p->ittiMsg.nas_auth_req;
MME_APP_IMSI_TO_STRING(imsi, nas_auth_req_p->imsi);
nas_auth_req_p->failure = NAS_FAILURE_OK;
return itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p);
}
}
}
return 0;
}
#else
void void
mme_app_handle_nas_auth_param_req( mme_app_handle_nas_auth_param_req(
const nas_auth_param_req_t * const nas_auth_param_req_pP) const nas_auth_param_req_t * const nas_auth_param_req_pP)
...@@ -354,13 +242,14 @@ mme_app_handle_nas_auth_param_req( ...@@ -354,13 +242,14 @@ mme_app_handle_nas_auth_param_req(
visited_plmn_from_req.MCCdigit2 = nas_auth_param_req_pP->imsi[1]; visited_plmn_from_req.MCCdigit2 = nas_auth_param_req_pP->imsi[1];
visited_plmn_from_req.MCCdigit3 = nas_auth_param_req_pP->imsi[2]; visited_plmn_from_req.MCCdigit3 = nas_auth_param_req_pP->imsi[2];
mnc_length = find_mnc_length(nas_auth_param_req_pP->imsi[0], mnc_length = find_mnc_length(
nas_auth_param_req_pP->imsi[1], nas_auth_param_req_pP->imsi[0],
nas_auth_param_req_pP->imsi[2], nas_auth_param_req_pP->imsi[1],
nas_auth_param_req_pP->imsi[3], nas_auth_param_req_pP->imsi[2],
nas_auth_param_req_pP->imsi[4], nas_auth_param_req_pP->imsi[3],
nas_auth_param_req_pP->imsi[5] nas_auth_param_req_pP->imsi[4],
); nas_auth_param_req_pP->imsi[5]
);
if (mnc_length == 2) { if (mnc_length == 2) {
visited_plmn_from_req.MNCdigit1 = nas_auth_param_req_pP->imsi[3]; visited_plmn_from_req.MNCdigit1 = nas_auth_param_req_pP->imsi[3];
...@@ -439,11 +328,10 @@ mme_app_handle_nas_auth_param_req( ...@@ -439,11 +328,10 @@ mme_app_handle_nas_auth_param_req(
memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t)); memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t));
MME_APP_DEBUG("and we have no auth. vector for it, request" MME_APP_DEBUG("and we have no auth. vector for it, request"
" authentication information\n"); " authentication information\n");
mme_app_request_authentication_info(imsi, 1, visited_plmn, NULL); mme_app_request_authentication_info(nas_auth_param_req_pP->imsi, 1, visited_plmn, NULL);
} else { } else {
memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t)); memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t));
mme_app_request_authentication_info(imsi, 1, visited_plmn, nas_auth_param_req_pP->auts); mme_app_request_authentication_info(nas_auth_param_req_pP->imsi, 1, visited_plmn, nas_auth_param_req_pP->auts);
} }
} }
#endif
...@@ -50,8 +50,8 @@ ...@@ -50,8 +50,8 @@
#include "mme_app_ue_context.h" #include "mme_app_ue_context.h"
#include "mme_app_defs.h" #include "mme_app_defs.h"
static inline int ue_context_compare_identifiers(struct ue_context_s *p1, int ue_context_compare_identifiers(struct ue_context_s *p1,
struct ue_context_s *p2); struct ue_context_s *p2);
RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry, RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry,
ue_context_compare_identifiers); ue_context_compare_identifiers);
...@@ -59,7 +59,7 @@ RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry, ...@@ -59,7 +59,7 @@ RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry,
RB_GENERATE(ue_context_map, ue_context_s, rb_entry, RB_GENERATE(ue_context_map, ue_context_s, rb_entry,
ue_context_compare_identifiers); ue_context_compare_identifiers);
static inline int ue_context_compare_identifiers( extern inline int ue_context_compare_identifiers(
struct ue_context_s *p1, struct ue_context_s *p2) struct ue_context_s *p1, struct ue_context_s *p2)
{ {
MME_APP_DEBUG(" ue_context_compare_identifiers IMSI %"SCNu64"\n", p1->imsi); MME_APP_DEBUG(" ue_context_compare_identifiers IMSI %"SCNu64"\n", p1->imsi);
...@@ -68,6 +68,8 @@ static inline int ue_context_compare_identifiers( ...@@ -68,6 +68,8 @@ static inline int ue_context_compare_identifiers(
MME_APP_DEBUG(" ue_context_compare_identifiers ue_id %08x\n" , p1->ue_id); MME_APP_DEBUG(" ue_context_compare_identifiers ue_id %08x\n" , p1->ue_id);
if (p1->imsi > 0) { if (p1->imsi > 0) {
MME_APP_DEBUG(" with IMSI %"SCNu64"\n", p2->imsi);
/* if IMSI provided */ /* if IMSI provided */
if (p1->imsi > p2->imsi) { if (p1->imsi > p2->imsi) {
return 1; return 1;
...@@ -77,6 +79,8 @@ static inline int ue_context_compare_identifiers( ...@@ -77,6 +79,8 @@ static inline int ue_context_compare_identifiers(
return -1; return -1;
} }
} else if (p1->mme_s11_teid > 0) { } else if (p1->mme_s11_teid > 0) {
MME_APP_DEBUG(" with mme_s11_teid %08x\n", p2->mme_s11_teid);
/* if s11 teid provided */ /* if s11 teid provided */
if (p1->mme_s11_teid > p2->mme_s11_teid) { if (p1->mme_s11_teid > p2->mme_s11_teid) {
return 1; return 1;
...@@ -86,7 +90,7 @@ static inline int ue_context_compare_identifiers( ...@@ -86,7 +90,7 @@ static inline int ue_context_compare_identifiers(
return -1; return -1;
} }
} else if (p1->mme_ue_s1ap_id > 0) { } else if (p1->mme_ue_s1ap_id > 0) {
MME_APP_DEBUG(" with mme_ue_s1ap_id %d\n" , p2->mme_ue_s1ap_id); MME_APP_DEBUG(" with mme_ue_s1ap_id %08x\n", p2->mme_ue_s1ap_id);
/* if s1ap ue id provided */ /* if s1ap ue id provided */
if (p1->mme_ue_s1ap_id > p2->mme_ue_s1ap_id) { if (p1->mme_ue_s1ap_id > p2->mme_ue_s1ap_id) {
...@@ -97,6 +101,8 @@ static inline int ue_context_compare_identifiers( ...@@ -97,6 +101,8 @@ static inline int ue_context_compare_identifiers(
return -1; return -1;
} }
} else if (p1->ue_id > 0) { } else if (p1->ue_id > 0) {
MME_APP_DEBUG(" with ue_id %08x\n", p2->ue_id);
/* if nas ue_id provided */ /* if nas ue_id provided */
if (p1->ue_id > p2->ue_id) { if (p1->ue_id > p2->ue_id) {
return 1; return 1;
...@@ -152,7 +158,7 @@ ue_context_t *mme_create_new_ue_context(void) ...@@ -152,7 +158,7 @@ ue_context_t *mme_create_new_ue_context(void)
return new_p; return new_p;
} }
inline
struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context, struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
mme_app_imsi_t imsi) mme_app_imsi_t imsi)
{ {
...@@ -166,7 +172,7 @@ struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context ...@@ -166,7 +172,7 @@ struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context
&reference); &reference);
} }
inline
struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context, struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
uint32_t teid) uint32_t teid)
{ {
...@@ -180,7 +186,8 @@ struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_con ...@@ -180,7 +186,8 @@ struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_con
&reference); &reference);
} }
inline
ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id( ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(
mme_ue_context_t *mme_ue_context, mme_ue_context_t *mme_ue_context,
uint32_t mme_ue_s1ap_id) uint32_t mme_ue_s1ap_id)
...@@ -195,7 +202,8 @@ ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id( ...@@ -195,7 +202,8 @@ ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(
&reference); &reference);
} }
inline
ue_context_t *mme_ue_context_exists_nas_ue_id( ue_context_t *mme_ue_context_exists_nas_ue_id(
mme_ue_context_t *mme_ue_context, mme_ue_context_t *mme_ue_context,
uint32_t nas_ue_id) uint32_t nas_ue_id)
...@@ -211,7 +219,8 @@ ue_context_t *mme_ue_context_exists_nas_ue_id( ...@@ -211,7 +219,8 @@ ue_context_t *mme_ue_context_exists_nas_ue_id(
} }
inline
ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context, ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context,
GUTI_t guti) GUTI_t guti)
{ {
......
...@@ -200,7 +200,6 @@ typedef struct { ...@@ -200,7 +200,6 @@ typedef struct {
* \param imsi Imsi to find in UE map * \param imsi Imsi to find in UE map
* @returns an UE context matching the IMSI or NULL if the context doesn't exists * @returns an UE context matching the IMSI or NULL if the context doesn't exists
**/ **/
inline
ue_context_t *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context, ue_context_t *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
mme_app_imsi_t imsi); mme_app_imsi_t imsi);
...@@ -208,7 +207,6 @@ ue_context_t *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context, ...@@ -208,7 +207,6 @@ ue_context_t *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
* \param teid The tunnel endpoint identifier used between MME and S-GW * \param teid The tunnel endpoint identifier used between MME and S-GW
* @returns an UE context matching the teid or NULL if the context doesn't exists * @returns an UE context matching the teid or NULL if the context doesn't exists
**/ **/
inline
ue_context_t *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context, ue_context_t *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
uint32_t teid); uint32_t teid);
...@@ -216,7 +214,6 @@ ue_context_t *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context, ...@@ -216,7 +214,6 @@ ue_context_t *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
* \param mme_ue_s1ap_id The UE id identifier used in S1AP MME (and NAS) * \param mme_ue_s1ap_id The UE id identifier used in S1AP MME (and NAS)
* @returns an UE context matching the mme_ue_s1ap_id or NULL if the context doesn't exists * @returns an UE context matching the mme_ue_s1ap_id or NULL if the context doesn't exists
**/ **/
inline
ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(mme_ue_context_t *mme_ue_context, ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(mme_ue_context_t *mme_ue_context,
uint32_t mme_ue_s1ap_id); uint32_t mme_ue_s1ap_id);
...@@ -224,7 +221,6 @@ ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(mme_ue_context_t *mme_ue_cont ...@@ -224,7 +221,6 @@ ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(mme_ue_context_t *mme_ue_cont
* \param nas_ue_id The UE id identifier used in S1AP MME and NAS * \param nas_ue_id The UE id identifier used in S1AP MME and NAS
* @returns an UE context matching the nas_ue_id or NULL if the context doesn't exists * @returns an UE context matching the nas_ue_id or NULL if the context doesn't exists
**/ **/
inline
ue_context_t *mme_ue_context_exists_nas_ue_id(mme_ue_context_t *mme_ue_context, ue_context_t *mme_ue_context_exists_nas_ue_id(mme_ue_context_t *mme_ue_context,
uint32_t nas_ue_id); uint32_t nas_ue_id);
...@@ -232,7 +228,6 @@ ue_context_t *mme_ue_context_exists_nas_ue_id(mme_ue_context_t *mme_ue_context, ...@@ -232,7 +228,6 @@ ue_context_t *mme_ue_context_exists_nas_ue_id(mme_ue_context_t *mme_ue_context,
* \param guti The GUTI used by the UE * \param guti The GUTI used by the UE
* @returns an UE context matching the guti or NULL if the context doesn't exists * @returns an UE context matching the guti or NULL if the context doesn't exists
**/ **/
inline
ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context, ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context,
GUTI_t guti); GUTI_t guti);
......
...@@ -251,14 +251,14 @@ static int _mme_api_pdn_id = 0; ...@@ -251,14 +251,14 @@ static int _mme_api_pdn_id = 0;
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
int mme_api_get_emm_config(mme_api_emm_config_t *config, int mme_api_get_emm_config(mme_api_emm_config_t *config,
mme_config_t *mme_config_p) 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
{ {
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
int i; int i;
#endif #endif
LOG_FUNC_IN; LOG_FUNC_IN;
...@@ -285,7 +285,7 @@ int mme_api_get_emm_config(mme_api_emm_config_t *config) ...@@ -285,7 +285,7 @@ int mme_api_get_emm_config(mme_api_emm_config_t *config)
config->gummei.MMEgid = mme_config_p->gummei.mme_gid[0]; config->gummei.MMEgid = mme_config_p->gummei.mme_gid[0];
config->gummei.MMEcode = mme_config_p->gummei.mmec[0]; config->gummei.MMEcode = mme_config_p->gummei.mmec[0];
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
/* SR: this config param comes from MME global config */ /* SR: this config param comes from MME global config */
if (mme_config_p->emergency_attach_supported != 0) { if (mme_config_p->emergency_attach_supported != 0) {
......
...@@ -47,7 +47,7 @@ Description Implements the API used by the NAS layer running in the MME ...@@ -47,7 +47,7 @@ Description Implements the API used by the NAS layer running in the MME
#define __MME_API_H__ #define __MME_API_H__
#ifdef NAS_MME #ifdef NAS_MME
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
# include "mme_config.h" # include "mme_config.h"
# endif # endif
#include "commonDef.h" #include "commonDef.h"
...@@ -127,7 +127,7 @@ typedef struct mme_api_tft_s { ...@@ -127,7 +127,7 @@ typedef struct mme_api_tft_s {
/****************** E X P O R T E D F U N C T I O N S ******************/ /****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/ /****************************************************************************/
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
int mme_api_get_emm_config(mme_api_emm_config_t *config, int mme_api_get_emm_config(mme_api_emm_config_t *config,
mme_config_t *mme_config_p); mme_config_t *mme_config_p);
#else #else
......
...@@ -54,7 +54,7 @@ Description Defines the layer 3 messages supported by the NAS sublayer ...@@ -54,7 +54,7 @@ Description Defines the layer 3 messages supported by the NAS sublayer
#include <stdlib.h> // malloc, free #include <stdlib.h> // malloc, free
#include <string.h> // memcpy #include <string.h> // memcpy
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
# include "nas_itti_messaging.h" # include "nas_itti_messaging.h"
#endif #endif
#include "secu_defs.h" #include "secu_defs.h"
...@@ -313,7 +313,6 @@ int nas_message_decrypt( ...@@ -313,7 +313,6 @@ int nas_message_decrypt(
#endif #endif
emm_security_context); emm_security_context);
/* Check NAS message integrity */ /* Check NAS message integrity */
if (mac != header->message_authentication_code) { if (mac != header->message_authentication_code) {
LOG_TRACE(DEBUG, LOG_TRACE(DEBUG,
...@@ -425,6 +424,24 @@ int nas_message_decode( ...@@ -425,6 +424,24 @@ int nas_message_decode(
emm_security_context emm_security_context
); );
#define NAS_CODE_TO_BE_MODIFIED 1
#ifdef NAS_CODE_TO_BE_MODIFIED
// According to 3GPP TS 24.301 version 10.15.0 Release 10, 4.4.4.3 Integrity checking of NAS signalling messages in the MME
if ((!emm_security_context) && (mac == 0) && (msg->header.message_authentication_code != 0)) {
// force mac to be the same, but we should check for message types.
// TODO Reverse order of processing in NAS code: decode message type then check MAC
LOG_TRACE(DEBUG,
"Forced computed MAC to be the MSG MAC %04x",
msg->header.message_authentication_code);
mac = msg->header.message_authentication_code;
LOG_TRACE(DEBUG,
"Forced computed MAC to be the same as MAC in message %04x",
msg->header.message_authentication_code);
}
#endif
/* Check NAS message integrity */ /* Check NAS message integrity */
if (mac != msg->header.message_authentication_code) { if (mac != msg->header.message_authentication_code) {
LOG_TRACE(DEBUG, LOG_TRACE(DEBUG,
...@@ -434,7 +451,7 @@ int nas_message_decode( ...@@ -434,7 +451,7 @@ int nas_message_decode(
LOG_FUNC_RETURN (TLV_DECODE_MAC_MISMATCH); LOG_FUNC_RETURN (TLV_DECODE_MAC_MISMATCH);
} }
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
/* Log message header */ /* Log message header */
#endif #endif
...@@ -566,7 +583,7 @@ int nas_message_encode( ...@@ -566,7 +583,7 @@ int nas_message_encode(
} }
} }
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
/* Log message header */ /* Log message header */
#endif #endif
} else { } else {
...@@ -970,7 +987,9 @@ static int _nas_message_decrypt( ...@@ -970,7 +987,9 @@ static int _nas_message_decrypt(
"No decryption of message length %u according to security header type 0x%02x", "No decryption of message length %u according to security header type 0x%02x",
length, security_header_type); length, security_header_type);
memcpy(dest, src, length); memcpy(dest, src, length);
LOG_FUNC_RETURN (length); DECODE_U8(dest, *(UInt8_t*)(&header), size);
LOG_FUNC_RETURN (header.protocol_discriminator);
//LOG_FUNC_RETURN (length);
break; break;
case SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_CYPHERED: case SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_CYPHERED:
...@@ -1268,7 +1287,7 @@ static UInt32_t _nas_message_get_mac( ...@@ -1268,7 +1287,7 @@ static UInt32_t _nas_message_get_mac(
if (!emm_security_context) { if (!emm_security_context) {
LOG_TRACE(DEBUG, LOG_TRACE(DEBUG,
"No security context set for integrity protection algorithm"); "No security context set for integrity protection algorithm");
#if defined(EPC_BUILD) || defined(UE_BUILD) #if defined(NAS_BUILT_IN_EPC) || defined(NAS_BUILT_IN_UE)
LOG_FUNC_RETURN (0); LOG_FUNC_RETURN (0);
#else #else
LOG_FUNC_RETURN (0xabababab); LOG_FUNC_RETURN (0xabababab);
...@@ -1398,7 +1417,7 @@ static UInt32_t _nas_message_get_mac( ...@@ -1398,7 +1417,7 @@ static UInt32_t _nas_message_get_mac(
(direction == SECU_DIRECTION_UPLINK) ? emm_security_context->ul_count.seq_num:emm_security_context->dl_count.seq_num (direction == SECU_DIRECTION_UPLINK) ? emm_security_context->ul_count.seq_num:emm_security_context->dl_count.seq_num
); );
#if defined(EPC_BUILD) || defined(UE_BUILD) #if defined(NAS_BUILT_IN_EPC) || defined(NAS_BUILT_IN_UE)
LOG_FUNC_RETURN (0); LOG_FUNC_RETURN (0);
#else #else
LOG_FUNC_RETURN (0xabababab); LOG_FUNC_RETURN (0xabababab);
......
...@@ -49,7 +49,7 @@ Description Defines the layer 3 messages supported by the NAS sublayer ...@@ -49,7 +49,7 @@ Description Defines the layer 3 messages supported by the NAS sublayer
#include "commonDef.h" #include "commonDef.h"
#include "emm_msg.h" #include "emm_msg.h"
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
#include "emmData.h" #include "emmData.h"
#endif #endif
#include "esm_msg.h" #include "esm_msg.h"
......
...@@ -1084,7 +1084,7 @@ static int _at_response_encode_cgpaddr(char* buffer, const at_response_t* data) ...@@ -1084,7 +1084,7 @@ static int _at_response_encode_cgpaddr(char* buffer, const at_response_t* data)
if (cgpaddr->PDP_addr_2[i] != NULL) { if (cgpaddr->PDP_addr_2[i] != NULL) {
/* IPv6 Link-local address prefixe */ /* IPv6 Link-local address prefixe */
offset += sprintf(buffer+offset, offset += sprintf(buffer+offset,
",%u.%u.%u.%u.%u.%u.%u.%u", ",%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu",
0xfe, 0x80, 0, 0, 0, 0, 0, 0); 0xfe, 0x80, 0, 0, 0, 0, 0, 0);
/* IPv6 Link-local address */ /* IPv6 Link-local address */
offset += sprintf(buffer+offset, offset += sprintf(buffer+offset,
......
...@@ -76,7 +76,7 @@ Description Defines the attach related EMM procedure executed by the ...@@ -76,7 +76,7 @@ Description Defines the attach related EMM procedure executed by the
#ifdef NAS_MME #ifdef NAS_MME
#include "mme_api.h" #include "mme_api.h"
#include "mme_config.h" #include "mme_config.h"
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
# include "nas_itti_messaging.h" # include "nas_itti_messaging.h"
# endif # endif
#endif #endif
...@@ -1075,13 +1075,18 @@ int emm_proc_attach_set_detach(void) ...@@ -1075,13 +1075,18 @@ int emm_proc_attach_set_detach(void)
** Others: _emm_data ** ** Others: _emm_data **
** ** ** **
***************************************************************************/ ***************************************************************************/
int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type, int emm_proc_attach_request(
int native_ksi, int ksi, int native_guti, unsigned int ueid,
GUTI_t *guti, imsi_t *imsi, imei_t *imei, emm_proc_attach_type_t type,
tai_t *tai, int native_ksi, int ksi,
int eea, int eia, int ucs2, int uea, int uia, int gea, int native_guti,
int umts_present, int gprs_present, GUTI_t *guti,
const OctetString *esm_msg) imsi_t *imsi,
imei_t *imei,
tai_t *tai,
int eea, int eia, int ucs2, int uea, int uia, int gea,
int umts_present, int gprs_present,
const OctetString *esm_msg)
{ {
LOG_FUNC_IN; LOG_FUNC_IN;
...@@ -1098,7 +1103,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type, ...@@ -1098,7 +1103,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
ue_ctx.is_dynamic = FALSE; ue_ctx.is_dynamic = FALSE;
ue_ctx.ueid = ueid; ue_ctx.ueid = ueid;
#if !defined(EPC_BUILD) #if !defined(NAS_BUILT_IN_EPC)
/* UE identifier sanity check */ /* UE identifier sanity check */
if (ueid >= EMM_DATA_NB_UE_MAX) { if (ueid >= EMM_DATA_NB_UE_MAX) {
...@@ -1126,7 +1131,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type, ...@@ -1126,7 +1131,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
/* Get the UE's EMM context if it exists */ /* Get the UE's EMM context if it exists */
emm_data_context_t **emm_ctx = NULL; emm_data_context_t **emm_ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_data_context_t *temp = NULL; emm_data_context_t *temp = NULL;
temp = emm_data_context_get(&_emm_data, ueid); temp = emm_data_context_get(&_emm_data, ueid);
...@@ -1197,7 +1202,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type, ...@@ -1197,7 +1202,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
(*emm_ctx)->ueid = ueid; (*emm_ctx)->ueid = ueid;
emm_fsm_set_status(ueid, *emm_ctx, EMM_DEREGISTERED); emm_fsm_set_status(ueid, *emm_ctx, EMM_DEREGISTERED);
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_data_context_add(&_emm_data, *(emm_ctx)); emm_data_context_add(&_emm_data, *(emm_ctx));
#endif #endif
...@@ -1265,7 +1270,7 @@ int emm_proc_attach_reject(unsigned int ueid, int emm_cause) ...@@ -1265,7 +1270,7 @@ int emm_proc_attach_reject(unsigned int ueid, int emm_cause)
ue_ctx.ueid = ueid; ue_ctx.ueid = ueid;
/* Update the EMM cause code */ /* Update the EMM cause code */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) if (ueid > 0)
#else #else
...@@ -1333,7 +1338,7 @@ int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg) ...@@ -1333,7 +1338,7 @@ int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg)
/* Get the UE context */ /* Get the UE context */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) { if (ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
...@@ -1670,7 +1675,7 @@ static void *_emm_attach_t3450_handler(void *args) ...@@ -1670,7 +1675,7 @@ static void *_emm_attach_t3450_handler(void *args)
/* Get the UE's EMM context */ /* Get the UE's EMM context */
emm_data_context_t *emm_ctx = NULL; emm_data_context_t *emm_ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, data->ueid); emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
#else #else
emm_ctx = _emm_data.ctx[data->ueid]; emm_ctx = _emm_data.ctx[data->ueid];
...@@ -1768,7 +1773,7 @@ static int _emm_attach_release(void *args) ...@@ -1768,7 +1773,7 @@ static int _emm_attach_release(void *args)
} }
/* Release the EMM context */ /* Release the EMM context */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_data_context_remove(&_emm_data, emm_ctx); emm_data_context_remove(&_emm_data, emm_ctx);
#else #else
free(_emm_data.ctx[ueid]); free(_emm_data.ctx[ueid]);
...@@ -1903,7 +1908,7 @@ static int _emm_attach_abort(void *args) ...@@ -1903,7 +1908,7 @@ static int _emm_attach_abort(void *args)
free(data); free(data);
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
ctx = emm_data_context_get(&_emm_data, ueid); ctx = emm_data_context_get(&_emm_data, ueid);
#else #else
ctx = _emm_data.ctx[ueid]; ctx = _emm_data.ctx[ueid];
...@@ -1979,7 +1984,7 @@ static int _emm_attach_identify(void *args) ...@@ -1979,7 +1984,7 @@ static int _emm_attach_identify(void *args)
*/ */
if (emm_ctx->imsi) { if (emm_ctx->imsi) {
/* The UE identifies itself using an IMSI */ /* The UE identifies itself using an IMSI */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (!emm_ctx->security) { if (!emm_ctx->security) {
/* Ask upper layer to fetch new security context */ /* Ask upper layer to fetch new security context */
nas_itti_auth_info_req(emm_ctx->ueid, emm_ctx->imsi, 1, NULL); nas_itti_auth_info_req(emm_ctx->ueid, emm_ctx->imsi, 1, NULL);
...@@ -2096,7 +2101,7 @@ static int _emm_attach_identify(void *args) ...@@ -2096,7 +2101,7 @@ static int _emm_attach_identify(void *args)
rc = _emm_attach_security(emm_ctx); rc = _emm_attach_security(emm_ctx);
} }
#if !defined(EPC_BUILD) #if !defined(NAS_BUILT_IN_EPC)
else { else {
/* 3GPP TS 24.401, Figure 5.3.2.1-1, point 5a /* 3GPP TS 24.401, Figure 5.3.2.1-1, point 5a
* No EMM context exists for the UE in the network; authentication * No EMM context exists for the UE in the network; authentication
...@@ -2145,7 +2150,7 @@ static int _emm_attach_identify(void *args) ...@@ -2145,7 +2150,7 @@ static int _emm_attach_identify(void *args)
** Others: _emm_data ** ** Others: _emm_data **
** ** ** **
***************************************************************************/ ***************************************************************************/
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
int emm_attach_security(void *args) int emm_attach_security(void *args)
{ {
return _emm_attach_security(args); return _emm_attach_security(args);
......
...@@ -76,7 +76,7 @@ Description Defines the authentication EMM procedure executed by the ...@@ -76,7 +76,7 @@ Description Defines the authentication EMM procedure executed by the
#endif #endif
#ifdef NAS_MME #ifdef NAS_MME
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
# include "nas_itti_messaging.h" # include "nas_itti_messaging.h"
# endif # endif
#endif #endif
...@@ -710,7 +710,7 @@ int emm_proc_authentication_complete(unsigned int ueid, int emm_cause, ...@@ -710,7 +710,7 @@ int emm_proc_authentication_complete(unsigned int ueid, int emm_cause,
/* Get the UE context */ /* Get the UE context */
emm_data_context_t *emm_ctx = NULL; emm_data_context_t *emm_ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) { if (ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
...@@ -739,7 +739,7 @@ int emm_proc_authentication_complete(unsigned int ueid, int emm_cause, ...@@ -739,7 +739,7 @@ int emm_proc_authentication_complete(unsigned int ueid, int emm_cause,
if (emm_cause != EMM_CAUSE_SUCCESS) { if (emm_cause != EMM_CAUSE_SUCCESS) {
switch (emm_cause) { switch (emm_cause) {
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
case EMM_CAUSE_SYNCH_FAILURE: case EMM_CAUSE_SYNCH_FAILURE:
/* USIM has detected a mismatch in SQN. /* USIM has detected a mismatch in SQN.
...@@ -1408,7 +1408,7 @@ int _authentication_request(authentication_data_t *data) ...@@ -1408,7 +1408,7 @@ int _authentication_request(authentication_data_t *data)
emm_sap.u.emm_as.u.security.autn = &data->autn; emm_sap.u.emm_as.u.security.autn = &data->autn;
/* TODO: check for pointer validity */ /* TODO: check for pointer validity */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, data->ueid); emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
#else #else
emm_ctx = _emm_data.ctx[data->ueid]; emm_ctx = _emm_data.ctx[data->ueid];
...@@ -1467,7 +1467,7 @@ static int _authentication_reject(unsigned int ueid) ...@@ -1467,7 +1467,7 @@ static int _authentication_reject(unsigned int ueid)
emm_sap.u.emm_as.u.security.ueid = ueid; emm_sap.u.emm_as.u.security.ueid = ueid;
emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
#else #else
emm_ctx = _emm_data.ctx[ueid]; emm_ctx = _emm_data.ctx[ueid];
......
...@@ -456,7 +456,7 @@ int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type, ...@@ -456,7 +456,7 @@ int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type,
_emm_detach_type_str[type], type, ueid); _emm_detach_type_str[type], type, ueid);
/* Get the UE context */ /* Get the UE context */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) { if (ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
...@@ -513,7 +513,7 @@ int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type, ...@@ -513,7 +513,7 @@ int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type,
} }
/* Release the EMM context */ /* Release the EMM context */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_data_context_remove(&_emm_data, emm_ctx); emm_data_context_remove(&_emm_data, emm_ctx);
free(emm_ctx); free(emm_ctx);
#else #else
......
...@@ -65,7 +65,7 @@ Description Defines callback functions executed within EMM common procedures ...@@ -65,7 +65,7 @@ Description Defines callback functions executed within EMM common procedures
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
# include "assertions.h" # include "assertions.h"
#endif #endif
...@@ -90,12 +90,12 @@ typedef struct emm_common_data_s { ...@@ -90,12 +90,12 @@ typedef struct emm_common_data_s {
emm_common_abort_callback_t abort; emm_common_abort_callback_t abort;
void *args; void *args;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
RB_ENTRY(emm_common_data_s) entries; RB_ENTRY(emm_common_data_s) entries;
#endif #endif
} emm_common_data_t; } emm_common_data_t;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
typedef struct emm_common_data_head_s { typedef struct emm_common_data_head_s {
RB_HEAD(emm_common_data_map, emm_common_data_s) emm_common_data_root; RB_HEAD(emm_common_data_map, emm_common_data_s) emm_common_data_root;
} emm_common_data_head_t; } emm_common_data_head_t;
...@@ -185,7 +185,7 @@ int emm_proc_common_initialize(unsigned int ueid, ...@@ -185,7 +185,7 @@ int emm_proc_common_initialize(unsigned int ueid,
struct emm_common_data_s *emm_common_data_ctx = NULL; struct emm_common_data_s *emm_common_data_ctx = NULL;
LOG_FUNC_IN; LOG_FUNC_IN;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
assert(ueid > 0); assert(ueid > 0);
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
#else #else
...@@ -195,7 +195,7 @@ int emm_proc_common_initialize(unsigned int ueid, ...@@ -195,7 +195,7 @@ int emm_proc_common_initialize(unsigned int ueid,
if (emm_common_data_ctx == NULL) { if (emm_common_data_ctx == NULL) {
emm_common_data_ctx = (emm_common_data_t *)malloc(sizeof(emm_common_data_t)); emm_common_data_ctx = (emm_common_data_t *)malloc(sizeof(emm_common_data_t));
emm_common_data_ctx->ueid = ueid; emm_common_data_ctx->ueid = ueid;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
RB_INSERT(emm_common_data_map, &emm_common_data_head.emm_common_data_root, RB_INSERT(emm_common_data_map, &emm_common_data_head.emm_common_data_root,
emm_common_data_ctx); emm_common_data_ctx);
#endif #endif
...@@ -244,7 +244,7 @@ int emm_proc_common_success(unsigned int ueid) ...@@ -244,7 +244,7 @@ int emm_proc_common_success(unsigned int ueid)
LOG_FUNC_IN; LOG_FUNC_IN;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
DevCheck(ueid > 0, ueid, 0, 0); DevCheck(ueid > 0, ueid, 0, 0);
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
#else #else
...@@ -259,7 +259,7 @@ int emm_proc_common_success(unsigned int ueid) ...@@ -259,7 +259,7 @@ int emm_proc_common_success(unsigned int ueid)
if (emm_callback) { if (emm_callback) {
struct emm_data_context_s *ctx = NULL; struct emm_data_context_s *ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
ctx = emm_data_context_get(&_emm_data, ueid); ctx = emm_data_context_get(&_emm_data, ueid);
#else #else
ctx = _emm_data.ctx[ueid]; ctx = _emm_data.ctx[ueid];
...@@ -297,7 +297,7 @@ int emm_proc_common_reject(unsigned int ueid) ...@@ -297,7 +297,7 @@ int emm_proc_common_reject(unsigned int ueid)
LOG_FUNC_IN; LOG_FUNC_IN;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
DevCheck(ueid > 0, ueid, 0, 0); DevCheck(ueid > 0, ueid, 0, 0);
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
#else #else
...@@ -312,7 +312,7 @@ int emm_proc_common_reject(unsigned int ueid) ...@@ -312,7 +312,7 @@ int emm_proc_common_reject(unsigned int ueid)
if (emm_callback) { if (emm_callback) {
struct emm_data_context_s *ctx = NULL; struct emm_data_context_s *ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
ctx = emm_data_context_get(&_emm_data, ueid); ctx = emm_data_context_get(&_emm_data, ueid);
#else #else
ctx = _emm_data.ctx[ueid]; ctx = _emm_data.ctx[ueid];
...@@ -352,7 +352,7 @@ int emm_proc_common_failure(unsigned int ueid) ...@@ -352,7 +352,7 @@ int emm_proc_common_failure(unsigned int ueid)
LOG_FUNC_IN; LOG_FUNC_IN;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
DevCheck(ueid > 0, ueid, 0, 0); DevCheck(ueid > 0, ueid, 0, 0);
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
#else #else
...@@ -366,7 +366,7 @@ int emm_proc_common_failure(unsigned int ueid) ...@@ -366,7 +366,7 @@ int emm_proc_common_failure(unsigned int ueid)
if (emm_callback) { if (emm_callback) {
struct emm_data_context_s *ctx = NULL; struct emm_data_context_s *ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
ctx = emm_data_context_get(&_emm_data, ueid); ctx = emm_data_context_get(&_emm_data, ueid);
#else #else
ctx = _emm_data.ctx[ueid]; ctx = _emm_data.ctx[ueid];
...@@ -405,7 +405,7 @@ int emm_proc_common_abort(unsigned int ueid) ...@@ -405,7 +405,7 @@ int emm_proc_common_abort(unsigned int ueid)
LOG_FUNC_IN; LOG_FUNC_IN;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
DevCheck(ueid > 0, ueid, 0, 0); DevCheck(ueid > 0, ueid, 0, 0);
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
#else #else
...@@ -419,7 +419,7 @@ int emm_proc_common_abort(unsigned int ueid) ...@@ -419,7 +419,7 @@ int emm_proc_common_abort(unsigned int ueid)
if (emm_callback) { if (emm_callback) {
struct emm_data_context_s *ctx = NULL; struct emm_data_context_s *ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
ctx = emm_data_context_get(&_emm_data, ueid); ctx = emm_data_context_get(&_emm_data, ueid);
#else #else
ctx = _emm_data.ctx[ueid]; ctx = _emm_data.ctx[ueid];
...@@ -453,7 +453,7 @@ void *emm_proc_common_get_args(unsigned int ueid) ...@@ -453,7 +453,7 @@ void *emm_proc_common_get_args(unsigned int ueid)
emm_common_data_t *emm_common_data_ctx = NULL; emm_common_data_t *emm_common_data_ctx = NULL;
LOG_FUNC_IN; LOG_FUNC_IN;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
DevCheck(ueid > 0, ueid, 0, 0); DevCheck(ueid > 0, ueid, 0, 0);
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
#else #else
...@@ -490,7 +490,7 @@ static void _emm_common_cleanup(unsigned int ueid) ...@@ -490,7 +490,7 @@ static void _emm_common_cleanup(unsigned int ueid)
{ {
emm_common_data_t *emm_common_data_ctx = NULL; emm_common_data_t *emm_common_data_ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
DevCheck(ueid > 0, ueid, 0, 0); DevCheck(ueid > 0, ueid, 0, 0);
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid); emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
#else #else
...@@ -503,7 +503,7 @@ static void _emm_common_cleanup(unsigned int ueid) ...@@ -503,7 +503,7 @@ static void _emm_common_cleanup(unsigned int ueid)
if (emm_common_data_ctx->ref_count == 0) { if (emm_common_data_ctx->ref_count == 0) {
/* Release the callback functions */ /* Release the callback functions */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
RB_REMOVE(emm_common_data_map, RB_REMOVE(emm_common_data_map,
&emm_common_data_head.emm_common_data_root, &emm_common_data_head.emm_common_data_root,
emm_common_data_ctx); emm_common_data_ctx);
......
...@@ -147,7 +147,7 @@ int emm_proc_status(unsigned int ueid, int emm_cause) ...@@ -147,7 +147,7 @@ int emm_proc_status(unsigned int ueid, int emm_cause)
#endif #endif
#ifdef NAS_MME #ifdef NAS_MME
emm_sap.u.emm_as.u.status.guti = NULL; emm_sap.u.emm_as.u.status.guti = NULL;
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
ctx = emm_data_context_get(&_emm_data, ueid); ctx = emm_data_context_get(&_emm_data, ueid);
# else # else
ctx = _emm_data.ctx[ueid]; ctx = _emm_data.ctx[ueid];
......
...@@ -384,7 +384,7 @@ int emm_proc_identification_complete(unsigned int ueid, const imsi_t *imsi, ...@@ -384,7 +384,7 @@ int emm_proc_identification_complete(unsigned int ueid, const imsi_t *imsi,
} }
/* Get the UE context */ /* Get the UE context */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) { if (ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
...@@ -551,7 +551,7 @@ int _identification_request(identification_data_t *data) ...@@ -551,7 +551,7 @@ int _identification_request(identification_data_t *data)
emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT;
emm_sap.u.emm_as.u.security.identType = data->type; emm_sap.u.emm_as.u.security.identType = data->type;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (data->ueid > 0) { if (data->ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, data->ueid); emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
......
...@@ -236,7 +236,7 @@ int lowerlayer_data_ind(unsigned int ueid, const OctetString *data) ...@@ -236,7 +236,7 @@ int lowerlayer_data_ind(unsigned int ueid, const OctetString *data)
LOG_FUNC_IN; LOG_FUNC_IN;
#if defined(EPC_BUILD) && defined(NAS_MME) #if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
if (ueid > 0) { if (ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
...@@ -290,7 +290,7 @@ int lowerlayer_data_req(unsigned int ueid, const OctetString *data) ...@@ -290,7 +290,7 @@ int lowerlayer_data_req(unsigned int ueid, const OctetString *data)
#ifdef NAS_MME #ifdef NAS_MME
emm_sap.u.emm_as.u.data.guti = NULL; emm_sap.u.emm_as.u.data.guti = NULL;
emm_sap.u.emm_as.u.data.ueid = ueid; emm_sap.u.emm_as.u.data.ueid = ueid;
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) { if (ueid > 0) {
ctx = emm_data_context_get(&_emm_data, ueid); ctx = emm_data_context_get(&_emm_data, ueid);
......
...@@ -446,7 +446,7 @@ int emm_proc_security_mode_control(unsigned int ueid, int ksi, ...@@ -446,7 +446,7 @@ int emm_proc_security_mode_control(unsigned int ueid, int ksi,
"KSI = %d EEA = %d EIA = %d", "KSI = %d EEA = %d EIA = %d",
ksi, eea, eia); ksi, eea, eia);
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) { if (ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
...@@ -638,7 +638,7 @@ int emm_proc_security_mode_complete(unsigned int ueid) ...@@ -638,7 +638,7 @@ int emm_proc_security_mode_complete(unsigned int ueid)
} }
/* Get the UE context */ /* Get the UE context */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) { if (ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
...@@ -721,7 +721,7 @@ int emm_proc_security_mode_reject(unsigned int ueid) ...@@ -721,7 +721,7 @@ int emm_proc_security_mode_reject(unsigned int ueid)
} }
/* Get the UE context */ /* Get the UE context */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) { if (ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
...@@ -1074,7 +1074,7 @@ int _security_request(security_data_t *data, int is_new) ...@@ -1074,7 +1074,7 @@ int _security_request(security_data_t *data, int is_new)
emm_sap.u.emm_as.u.security.selected_eea = data->selected_eea; emm_sap.u.emm_as.u.security.selected_eea = data->selected_eea;
emm_sap.u.emm_as.u.security.selected_eia = data->selected_eia; emm_sap.u.emm_as.u.security.selected_eia = data->selected_eia;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (data->ueid > 0) { if (data->ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, data->ueid); emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
......
...@@ -123,7 +123,7 @@ int emm_proc_tracking_area_update_reject(unsigned int ueid, int emm_cause) ...@@ -123,7 +123,7 @@ int emm_proc_tracking_area_update_reject(unsigned int ueid, int emm_cause)
ue_ctx.ueid = ueid; ue_ctx.ueid = ueid;
/* Update the EMM cause code */ /* Update the EMM cause code */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (ueid > 0) if (ueid > 0)
#else #else
......
...@@ -58,7 +58,7 @@ Description Defines internal private data handled by EPS Mobility ...@@ -58,7 +58,7 @@ Description Defines internal private data handled by EPS Mobility
#ifdef NAS_MME #ifdef NAS_MME
#include "emm_fsm.h" #include "emm_fsm.h"
#include "mme_api.h" #include "mme_api.h"
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
# include "tree.h" # include "tree.h"
# endif # endif
#endif #endif
...@@ -356,7 +356,7 @@ typedef struct { ...@@ -356,7 +356,7 @@ typedef struct {
* --------------------------------------------------------------------------- * ---------------------------------------------------------------------------
*/ */
typedef struct emm_data_context_s { typedef struct emm_data_context_s {
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
RB_ENTRY(emm_data_context_s) entries; RB_ENTRY(emm_data_context_s) entries;
#endif #endif
...@@ -409,7 +409,7 @@ typedef struct { ...@@ -409,7 +409,7 @@ typedef struct {
* EMM contexts * EMM contexts
* ------------ * ------------
*/ */
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
/* Use a tree for ue data context within MME */ /* Use a tree for ue data context within MME */
RB_HEAD(emm_data_context_map, emm_data_context_s) ctx_map; RB_HEAD(emm_data_context_map, emm_data_context_s) ctx_map;
# else # else
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#if defined(EPC_BUILD) && defined(NAS_MME) #if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
#include "assertions.h" #include "assertions.h"
#include "tree.h" #include "tree.h"
#include "emmData.h" #include "emmData.h"
......
...@@ -58,7 +58,7 @@ Description Defines the EPS Mobility Management procedure call manager, ...@@ -58,7 +58,7 @@ Description Defines the EPS Mobility Management procedure call manager,
#include <stdlib.h> // malloc, free #include <stdlib.h> // malloc, free
#endif #endif
#if defined(EPC_BUILD) && defined(NAS_MME) #if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
# include "mme_config.h" # include "mme_config.h"
#endif #endif
...@@ -425,7 +425,7 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei) ...@@ -425,7 +425,7 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei)
** Others: _emm_data ** ** Others: _emm_data **
** ** ** **
***************************************************************************/ ***************************************************************************/
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
void emm_main_initialize(mme_config_t *mme_config_p) void emm_main_initialize(mme_config_t *mme_config_p)
#else #else
void emm_main_initialize(void) void emm_main_initialize(void)
...@@ -434,7 +434,7 @@ void emm_main_initialize(void) ...@@ -434,7 +434,7 @@ void emm_main_initialize(void)
LOG_FUNC_IN; LOG_FUNC_IN;
/* Retreive MME supported configuration data */ /* Retreive MME supported configuration data */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (mme_api_get_emm_config(&_emm_data.conf, mme_config_p) != RETURNok) if (mme_api_get_emm_config(&_emm_data.conf, mme_config_p) != RETURNok)
#else #else
...@@ -444,7 +444,7 @@ void emm_main_initialize(void) ...@@ -444,7 +444,7 @@ void emm_main_initialize(void)
LOG_TRACE(ERROR, "EMM-MAIN - Failed to get MME configuration data"); LOG_TRACE(ERROR, "EMM-MAIN - Failed to get MME configuration data");
} }
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
RB_INIT(&_emm_data.ctx_map); RB_INIT(&_emm_data.ctx_map);
#endif #endif
......
...@@ -46,7 +46,7 @@ Description Defines the EPS Mobility Management procedure call manager, ...@@ -46,7 +46,7 @@ Description Defines the EPS Mobility Management procedure call manager,
#ifndef __EMM_MAIN_H__ #ifndef __EMM_MAIN_H__
#define __EMM_MAIN_H__ #define __EMM_MAIN_H__
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
# include "mme_config.h" # include "mme_config.h"
#endif #endif
...@@ -73,7 +73,7 @@ Description Defines the EPS Mobility Management procedure call manager, ...@@ -73,7 +73,7 @@ Description Defines the EPS Mobility Management procedure call manager,
void emm_main_initialize(emm_indication_callback_t cb, const char *imei); void emm_main_initialize(emm_indication_callback_t cb, const char *imei);
#endif #endif
#ifdef NAS_MME #ifdef NAS_MME
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
void emm_main_initialize(mme_config_t *mme_config_p); void emm_main_initialize(mme_config_t *mme_config_p);
# else # else
void emm_main_initialize(void); void emm_main_initialize(void);
......
...@@ -51,7 +51,7 @@ Description Defines EPS Mobility Management messages ...@@ -51,7 +51,7 @@ Description Defines EPS Mobility Management messages
#include "TLVDecoder.h" #include "TLVDecoder.h"
#include "TLVEncoder.h" #include "TLVEncoder.h"
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
# include "nas_itti_messaging.h" # include "nas_itti_messaging.h"
#endif #endif
...@@ -97,12 +97,12 @@ int emm_msg_decode(EMM_msg *msg, uint8_t *buffer, uint32_t len) ...@@ -97,12 +97,12 @@ int emm_msg_decode(EMM_msg *msg, uint8_t *buffer, uint32_t len)
int header_result; int header_result;
int decode_result; int decode_result;
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
uint8_t *buffer_log = buffer; uint8_t *buffer_log = buffer;
uint32_t len_log = len; uint32_t len_log = len;
int down_link; int down_link;
# if ((defined(EPC_BUILD) && defined(NAS_MME))) # if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
down_link = 0; down_link = 0;
# else # else
down_link = 1; down_link = 1;
...@@ -265,7 +265,7 @@ int emm_msg_decode(EMM_msg *msg, uint8_t *buffer, uint32_t len) ...@@ -265,7 +265,7 @@ int emm_msg_decode(EMM_msg *msg, uint8_t *buffer, uint32_t len)
"(%d)", msg->header.message_type, decode_result); "(%d)", msg->header.message_type, decode_result);
LOG_FUNC_RETURN (decode_result); LOG_FUNC_RETURN (decode_result);
} else { } else {
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
/* Message has been decoded and security header removed, handle it has a plain message */ /* Message has been decoded and security header removed, handle it has a plain message */
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link); nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link);
#endif #endif
...@@ -298,11 +298,11 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len) ...@@ -298,11 +298,11 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len)
int header_result; int header_result;
int encode_result; int encode_result;
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
uint8_t *buffer_log = buffer; uint8_t *buffer_log = buffer;
int down_link; int down_link;
# if ((defined(EPC_BUILD) && defined(NAS_MME))) # if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
down_link = 1; down_link = 1;
# else # else
down_link = 0; down_link = 0;
...@@ -466,7 +466,7 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len) ...@@ -466,7 +466,7 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len)
LOG_TRACE(ERROR, "EMM-MSG - Failed to encode L3 EMM message 0x%x " LOG_TRACE(ERROR, "EMM-MSG - Failed to encode L3 EMM message 0x%x "
"(%d)", msg->header.message_type, encode_result); "(%d)", msg->header.message_type, encode_result);
} else { } else {
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link); nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link);
#endif #endif
} }
......
...@@ -63,7 +63,7 @@ Description Defines the EMMAS Service Access Point that provides ...@@ -63,7 +63,7 @@ Description Defines the EMMAS Service Access Point that provides
#include <string.h> // memset #include <string.h> // memset
#include <stdlib.h> // malloc, free #include <stdlib.h> // malloc, free
#if (defined(EPC_BUILD) && defined(NAS_MME)) || (defined(UE_BUILD) && defined(NAS_UE)) #if (defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(NAS_BUILT_IN_UE) && defined(NAS_UE))
# include "nas_itti_messaging.h" # include "nas_itti_messaging.h"
#endif #endif
...@@ -356,11 +356,11 @@ static int _emm_as_recv(unsigned int ueid, const char *msg, int len, ...@@ -356,11 +356,11 @@ static int _emm_as_recv(unsigned int ueid, const char *msg, int len,
emm_security_context_t *security = NULL; /* Current EPS NAS security context */ emm_security_context_t *security = NULL; /* Current EPS NAS security context */
#if defined(NAS_MME) #if defined(NAS_MME)
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_data_context_t *emm_ctx = NULL; emm_data_context_t *emm_ctx = NULL;
#endif #endif
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, ueid); emm_ctx = emm_data_context_get(&_emm_data, ueid);
if (emm_ctx) { if (emm_ctx) {
...@@ -552,7 +552,7 @@ static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause) ...@@ -552,7 +552,7 @@ static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause)
/* Decrypt the received security protected message */ /* Decrypt the received security protected message */
#if defined(NAS_MME) #if defined(NAS_MME)
emm_data_context_t *emm_ctx = NULL; emm_data_context_t *emm_ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
if (msg->ueid > 0) { if (msg->ueid > 0) {
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
...@@ -825,7 +825,7 @@ static int _emm_as_establish_req(const emm_as_establish_t *msg, int *emm_cause) ...@@ -825,7 +825,7 @@ static int _emm_as_establish_req(const emm_as_establish_t *msg, int *emm_cause)
memset(&nas_msg, 0 , sizeof(nas_message_t)); memset(&nas_msg, 0 , sizeof(nas_message_t));
#if defined(NAS_MME) #if defined(NAS_MME)
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
#else #else
...@@ -1279,7 +1279,7 @@ static int _emm_as_send(const emm_as_t *msg) ...@@ -1279,7 +1279,7 @@ static int _emm_as_send(const emm_as_t *msg)
/* Send the message to the Access Stratum or S1AP in case of MME */ /* Send the message to the Access Stratum or S1AP in case of MME */
if (as_msg.msgID > 0) { if (as_msg.msgID > 0) {
#if defined(EPC_BUILD) && defined(NAS_MME) #if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
LOG_TRACE(DEBUG, "EMMAS-SAP - " LOG_TRACE(DEBUG, "EMMAS-SAP - "
"Sending msg with id 0x%x, primitive %s (%d) to S1AP layer for transmission", "Sending msg with id 0x%x, primitive %s (%d) to S1AP layer for transmission",
as_msg.msgID, as_msg.msgID,
...@@ -1330,7 +1330,7 @@ static int _emm_as_send(const emm_as_t *msg) ...@@ -1330,7 +1330,7 @@ static int _emm_as_send(const emm_as_t *msg)
} }
#else #else
# if defined(UE_BUILD) && defined(NAS_UE) # if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
LOG_TRACE(DEBUG, "EMMAS-SAP - " LOG_TRACE(DEBUG, "EMMAS-SAP - "
"Sending msg with id 0x%x, primitive %s (%d) to RRC layer for transmission", "Sending msg with id 0x%x, primitive %s (%d) to RRC layer for transmission",
as_msg.msgID, as_msg.msgID,
...@@ -1467,7 +1467,7 @@ static int _emm_as_data_req(const emm_as_data_t *msg, ...@@ -1467,7 +1467,7 @@ static int _emm_as_data_req(const emm_as_data_t *msg,
emm_security_context_t *emm_security_context = NULL; emm_security_context_t *emm_security_context = NULL;
#if defined(NAS_MME) #if defined(NAS_MME)
struct emm_data_context_s *emm_ctx = NULL; struct emm_data_context_s *emm_ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
#else #else
...@@ -1573,7 +1573,7 @@ static int _emm_as_status_ind(const emm_as_status_t *msg, ...@@ -1573,7 +1573,7 @@ static int _emm_as_status_ind(const emm_as_status_t *msg,
emm_security_context_t *emm_security_context = NULL; emm_security_context_t *emm_security_context = NULL;
#if defined(NAS_MME) #if defined(NAS_MME)
struct emm_data_context_s *emm_ctx = NULL; struct emm_data_context_s *emm_ctx = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
#else #else
...@@ -1914,7 +1914,7 @@ static int _emm_as_security_req(const emm_as_security_t *msg, ...@@ -1914,7 +1914,7 @@ static int _emm_as_security_req(const emm_as_security_t *msg,
if (size > 0) { if (size > 0) {
struct emm_data_context_s *emm_ctx = NULL; struct emm_data_context_s *emm_ctx = NULL;
emm_security_context_t *emm_security_context = NULL; emm_security_context_t *emm_security_context = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
#else #else
...@@ -2004,7 +2004,7 @@ static int _emm_as_security_rej(const emm_as_security_t *msg, ...@@ -2004,7 +2004,7 @@ static int _emm_as_security_rej(const emm_as_security_t *msg,
if (size > 0) { if (size > 0) {
struct emm_data_context_s *emm_ctx = NULL; struct emm_data_context_s *emm_ctx = NULL;
emm_security_context_t *emm_security_context = NULL; emm_security_context_t *emm_security_context = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
#else #else
...@@ -2099,7 +2099,7 @@ static int _emm_as_establish_cnf(const emm_as_establish_t *msg, ...@@ -2099,7 +2099,7 @@ static int _emm_as_establish_cnf(const emm_as_establish_t *msg,
if (size > 0) { if (size > 0) {
struct emm_data_context_s *emm_ctx = NULL; struct emm_data_context_s *emm_ctx = NULL;
emm_security_context_t *emm_security_context = NULL; emm_security_context_t *emm_security_context = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
#else #else
...@@ -2217,7 +2217,7 @@ static int _emm_as_establish_rej(const emm_as_establish_t *msg, ...@@ -2217,7 +2217,7 @@ static int _emm_as_establish_rej(const emm_as_establish_t *msg,
if (size > 0) { if (size > 0) {
struct emm_data_context_s *emm_ctx = NULL; struct emm_data_context_s *emm_ctx = NULL;
emm_security_context_t *emm_security_context = NULL; emm_security_context_t *emm_security_context = NULL;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid); emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
#else #else
......
...@@ -46,7 +46,7 @@ Description ...@@ -46,7 +46,7 @@ Description
#include <string.h> #include <string.h>
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
#include "nas_log.h" #include "nas_log.h"
#include "commonDef.h" #include "commonDef.h"
......
...@@ -49,7 +49,7 @@ Description ...@@ -49,7 +49,7 @@ Description
#ifndef _EMM_CN_H_ #ifndef _EMM_CN_H_
#define _EMM_CN_H_ #define _EMM_CN_H_
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
int emm_cn_send(const emm_cn_t *msg); int emm_cn_send(const emm_cn_t *msg);
#endif #endif
......
...@@ -44,7 +44,7 @@ Description ...@@ -44,7 +44,7 @@ Description
*****************************************************************************/ *****************************************************************************/
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
#include "intertask_interface.h" #include "intertask_interface.h"
#endif #endif
...@@ -53,7 +53,7 @@ Description ...@@ -53,7 +53,7 @@ Description
typedef enum emmcn_primitive_s { typedef enum emmcn_primitive_s {
_EMMCN_START = 400, _EMMCN_START = 400,
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
_EMMCN_AUTHENTICATION_PARAM_RES, _EMMCN_AUTHENTICATION_PARAM_RES,
_EMMCN_AUTHENTICATION_PARAM_FAIL, _EMMCN_AUTHENTICATION_PARAM_FAIL,
_EMMCN_DEREGISTER_UE, _EMMCN_DEREGISTER_UE,
...@@ -63,7 +63,7 @@ typedef enum emmcn_primitive_s { ...@@ -63,7 +63,7 @@ typedef enum emmcn_primitive_s {
_EMMCN_END _EMMCN_END
} emm_cn_primitive_t; } emm_cn_primitive_t;
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
typedef nas_auth_param_rsp_t emm_cn_auth_res_t; typedef nas_auth_param_rsp_t emm_cn_auth_res_t;
typedef nas_auth_param_fail_t emm_cn_auth_fail_t; typedef nas_auth_param_fail_t emm_cn_auth_fail_t;
typedef nas_pdn_connectivity_rsp_t emm_cn_pdn_res_t; typedef nas_pdn_connectivity_rsp_t emm_cn_pdn_res_t;
......
...@@ -52,7 +52,7 @@ Description Defines the EPS Mobility Management procedures executed at ...@@ -52,7 +52,7 @@ Description Defines the EPS Mobility Management procedures executed at
#include "mme_api.h" #include "mme_api.h"
#include "emmData.h" #include "emmData.h"
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
# include "assertions.h" # include "assertions.h"
#endif #endif
...@@ -229,7 +229,7 @@ static const emm_fsm_handler_t _emm_fsm_handlers[EMM_STATE_MAX] = { ...@@ -229,7 +229,7 @@ static const emm_fsm_handler_t _emm_fsm_handlers[EMM_STATE_MAX] = {
* ----------------------------------------------------------------------------- * -----------------------------------------------------------------------------
*/ */
#if !defined(EPC_BUILD) #if !defined(NAS_BUILT_IN_EPC)
emm_fsm_state_t _emm_fsm_status[EMM_FSM_NB_UE_MAX]; emm_fsm_state_t _emm_fsm_status[EMM_FSM_NB_UE_MAX];
#endif #endif
...@@ -260,7 +260,7 @@ void emm_fsm_initialize(void) ...@@ -260,7 +260,7 @@ void emm_fsm_initialize(void)
_emm_fsm_status[0] = EMM_NULL; _emm_fsm_status[0] = EMM_NULL;
#endif #endif
#if defined(NAS_MME) && !defined(EPC_BUILD) #if defined(NAS_MME) && !defined(NAS_BUILT_IN_EPC)
for (ueid = 0; ueid < EMM_FSM_NB_UE_MAX; ueid++) { for (ueid = 0; ueid < EMM_FSM_NB_UE_MAX; ueid++) {
_emm_fsm_status[ueid] = EMM_DEREGISTERED; _emm_fsm_status[ueid] = EMM_DEREGISTERED;
...@@ -299,7 +299,7 @@ int emm_fsm_set_status( ...@@ -299,7 +299,7 @@ int emm_fsm_set_status(
unsigned int ueid = 0; unsigned int ueid = 0;
#endif #endif
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx; emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx;
DevAssert(emm_ctx != NULL); DevAssert(emm_ctx != NULL);
...@@ -360,7 +360,7 @@ emm_fsm_state_t emm_fsm_get_status(void) ...@@ -360,7 +360,7 @@ emm_fsm_state_t emm_fsm_get_status(void)
#ifdef NAS_MME #ifdef NAS_MME
emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx) emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx)
{ {
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx; emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx;
if (emm_ctx != NULL) { if (emm_ctx != NULL) {
...@@ -406,7 +406,7 @@ int emm_fsm_process(const emm_reg_t *evt) ...@@ -406,7 +406,7 @@ int emm_fsm_process(const emm_reg_t *evt)
status = _emm_fsm_status[0]; status = _emm_fsm_status[0];
#endif #endif
#ifdef NAS_MME #ifdef NAS_MME
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
emm_data_context_t *emm_ctx = (emm_data_context_t *)evt->ctx; emm_data_context_t *emm_ctx = (emm_data_context_t *)evt->ctx;
DevAssert(emm_ctx != NULL); DevAssert(emm_ctx != NULL);
...@@ -426,7 +426,7 @@ int emm_fsm_process(const emm_reg_t *evt) ...@@ -426,7 +426,7 @@ int emm_fsm_process(const emm_reg_t *evt)
_emm_fsm_event_str[primitive - _EMMREG_START - 1], primitive, _emm_fsm_event_str[primitive - _EMMREG_START - 1], primitive,
_emm_fsm_status_str[status]); _emm_fsm_status_str[status]);
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
DevAssert(status != EMM_INVALID); DevAssert(status != EMM_INVALID);
#endif #endif
......
...@@ -112,7 +112,7 @@ int emm_fsm_set_status(emm_fsm_state_t status); ...@@ -112,7 +112,7 @@ int emm_fsm_set_status(emm_fsm_state_t status);
emm_fsm_state_t emm_fsm_get_status(void); emm_fsm_state_t emm_fsm_get_status(void);
#endif #endif
#ifdef NAS_MME #ifdef NAS_MME
struct emm_data_context_t; //LG 2015-03-13 struct emm_data_context_t;
int emm_fsm_set_status(unsigned int ueid, void *ctx, emm_fsm_state_t status); int emm_fsm_set_status(unsigned int ueid, void *ctx, emm_fsm_state_t status);
emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx); emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx);
#endif #endif
......
...@@ -510,7 +510,8 @@ int emm_recv_security_mode_command(security_mode_command_msg *msg, ...@@ -510,7 +510,8 @@ int emm_recv_security_mode_command(security_mode_command_msg *msg,
int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg, int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg,
int *emm_cause) int *emm_cause)
{ {
int rc; int rc;
uint8_t gea = 0;
emm_proc_attach_type_t type; emm_proc_attach_type_t type;
LOG_FUNC_IN; LOG_FUNC_IN;
...@@ -639,6 +640,16 @@ int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg, ...@@ -639,6 +640,16 @@ int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg,
} }
/* Execute the requested UE attach procedure */ /* Execute the requested UE attach procedure */
#warning " TODO gea to be review"
if (msg->msnetworkcapability.msnetworkcapabilityvalue.length > 0) {
gea = (msg->msnetworkcapability.msnetworkcapabilityvalue.value[0] & 0x80) >> 1;
if ((gea) && (msg->msnetworkcapability.msnetworkcapabilityvalue.length >= 2)) {
gea |= ((msg->msnetworkcapability.msnetworkcapabilityvalue.value[1] & 0x60) >> 1);
}
}
rc = emm_proc_attach_request(ueid, type, rc = emm_proc_attach_request(ueid, type,
msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED, msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED,
msg->naskeysetidentifier.naskeysetidentifier, msg->naskeysetidentifier.naskeysetidentifier,
...@@ -648,13 +659,7 @@ int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg, ...@@ -648,13 +659,7 @@ int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg,
msg->uenetworkcapability.ucs2, msg->uenetworkcapability.ucs2,
msg->uenetworkcapability.uea, msg->uenetworkcapability.uea,
msg->uenetworkcapability.uia, msg->uenetworkcapability.uia,
0x00 | gea,
//((msg->uenetworkcapability.spare & 0x7) << 5) | // spare coded as zero
((msg->uenetworkcapability.csfb & 0x1) << 4) |
((msg->uenetworkcapability.lpp & 0x1) << 3) |
((msg->uenetworkcapability.lcs & 0x1) << 2) |
((msg->uenetworkcapability.srvcc & 0x1) << 1) |
(msg->uenetworkcapability.nf & 0x1),
msg->uenetworkcapability.umts_present, msg->uenetworkcapability.umts_present,
msg->uenetworkcapability.gprs_present, msg->uenetworkcapability.gprs_present,
&msg->esmmessagecontainer.esmmessagecontainercontents); &msg->esmmessagecontainer.esmmessagecontainercontents);
......
...@@ -132,7 +132,7 @@ int emm_sap_send(emm_sap_t *msg) ...@@ -132,7 +132,7 @@ int emm_sap_send(emm_sap_t *msg)
rc = emm_as_send(&msg->u.emm_as); rc = emm_as_send(&msg->u.emm_as);
} }
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
else if ( (primitive > EMMCN_PRIMITIVE_MIN) && else if ( (primitive > EMMCN_PRIMITIVE_MIN) &&
(primitive < EMMCN_PRIMITIVE_MAX) ) { (primitive < EMMCN_PRIMITIVE_MAX) ) {
/* Forward to the EMMCN-SAP */ /* Forward to the EMMCN-SAP */
......
...@@ -133,7 +133,7 @@ typedef enum { ...@@ -133,7 +133,7 @@ typedef enum {
EMMAS_CELL_INFO_RES = _EMMAS_CELL_INFO_RES, EMMAS_CELL_INFO_RES = _EMMAS_CELL_INFO_RES,
EMMAS_CELL_INFO_IND = _EMMAS_CELL_INFO_IND, EMMAS_CELL_INFO_IND = _EMMAS_CELL_INFO_IND,
#ifdef EPC_BUILD #ifdef NAS_BUILT_IN_EPC
EMMCN_AUTHENTICATION_PARAM_RES = _EMMCN_AUTHENTICATION_PARAM_RES, EMMCN_AUTHENTICATION_PARAM_RES = _EMMCN_AUTHENTICATION_PARAM_RES,
EMMCN_AUTHENTICATION_PARAM_FAIL = _EMMCN_AUTHENTICATION_PARAM_FAIL, EMMCN_AUTHENTICATION_PARAM_FAIL = _EMMCN_AUTHENTICATION_PARAM_FAIL,
EMMCN_DEREGISTER_UE = _EMMCN_DEREGISTER_UE, EMMCN_DEREGISTER_UE = _EMMCN_DEREGISTER_UE,
...@@ -171,7 +171,7 @@ typedef struct { ...@@ -171,7 +171,7 @@ typedef struct {
emm_reg_t emm_reg; /* EMMREG-SAP primitives */ emm_reg_t emm_reg; /* EMMREG-SAP primitives */
emm_esm_t emm_esm; /* EMMESM-SAP primitives */ emm_esm_t emm_esm; /* EMMESM-SAP primitives */
emm_as_t emm_as; /* EMMAS-SAP primitives */ emm_as_t emm_as; /* EMMAS-SAP primitives */
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
emm_cn_t emm_cn; /* EMMCN-SAP primitives */ emm_cn_t emm_cn; /* EMMCN-SAP primitives */
#endif #endif
} u; } u;
......
...@@ -666,7 +666,7 @@ int esm_proc_pdn_connectivity_request(emm_data_context_t *ctx, int pti, ...@@ -666,7 +666,7 @@ int esm_proc_pdn_connectivity_request(emm_data_context_t *ctx, int pti,
(apn) ? (char *)(apn->value) : "null", (apn) ? (char *)(apn->value) : "null",
(pdn_addr) ? (char *)(pdn_addr->value) : "null"); (pdn_addr) ? (char *)(pdn_addr->value) : "null");
#if !defined(EPC_BUILD) #if !defined(NAS_BUILT_IN_EPC)
/* UE identifier sanity check */ /* UE identifier sanity check */
if (ctx->ueid >= ESM_DATA_NB_UE_MAX) { if (ctx->ueid >= ESM_DATA_NB_UE_MAX) {
......
...@@ -53,7 +53,7 @@ Description Defines internal private data handled by EPS Session ...@@ -53,7 +53,7 @@ Description Defines internal private data handled by EPS Session
#include "mme_api.h" #include "mme_api.h"
#endif #endif
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
# include "tree.h" # include "tree.h"
#endif #endif
...@@ -244,7 +244,7 @@ typedef struct { ...@@ -244,7 +244,7 @@ typedef struct {
* ESM contexts * ESM contexts
* ------------ * ------------
*/ */
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
/* Use a tree for ue data context within MME */ /* Use a tree for ue data context within MME */
RB_HEAD(esm_data_context_map, esm_data_context_s) ctx_map; RB_HEAD(esm_data_context_map, esm_data_context_s) ctx_map;
# else # else
...@@ -253,7 +253,7 @@ typedef struct { ...@@ -253,7 +253,7 @@ typedef struct {
# endif # endif
} esm_data_t; } esm_data_t;
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
struct esm_data_context_s *esm_data_context_get( struct esm_data_context_s *esm_data_context_get(
esm_data_t *esm_data, unsigned int _ueid); esm_data_t *esm_data, unsigned int _ueid);
...@@ -282,10 +282,10 @@ esm_data_t _esm_data; ...@@ -282,10 +282,10 @@ esm_data_t _esm_data;
extern char ip_addr_str[100]; extern char ip_addr_str[100];
extern inline char *esm_data_get_ipv4_addr(const OctetString *ip_addr); extern char *esm_data_get_ipv4_addr(const OctetString *ip_addr);
extern inline char *esm_data_get_ipv6_addr(const OctetString *ip_addr); extern char *esm_data_get_ipv6_addr(const OctetString *ip_addr);
extern inline char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr); extern char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr);
#endif /* __ESMDATA_H__*/ #endif /* __ESMDATA_H__*/
...@@ -86,7 +86,7 @@ static const char *_esm_ebr_state_str[ESM_EBR_STATE_MAX] = { ...@@ -86,7 +86,7 @@ static const char *_esm_ebr_state_str[ESM_EBR_STATE_MAX] = {
* ---------------------------------- * ----------------------------------
*/ */
#if !defined(EPC_BUILD) #if !defined(NAS_BUILT_IN_EPC)
static esm_ebr_data_t _esm_ebr_data[ESM_EBR_NB_UE_MAX]; static esm_ebr_data_t _esm_ebr_data[ESM_EBR_NB_UE_MAX];
#endif #endif
...@@ -151,7 +151,7 @@ void esm_ebr_initialize( ...@@ -151,7 +151,7 @@ void esm_ebr_initialize(
#endif #endif
) )
{ {
#if !defined(EPC_BUILD) #if !defined(NAS_BUILT_IN_EPC)
int ueid, i; int ueid, i;
LOG_FUNC_IN; LOG_FUNC_IN;
...@@ -249,7 +249,7 @@ int esm_ebr_assign(emm_data_context_t *ctx, int ebi) ...@@ -249,7 +249,7 @@ int esm_ebr_assign(emm_data_context_t *ctx, int ebi)
LOG_FUNC_RETURN(ESM_EBI_UNASSIGNED); LOG_FUNC_RETURN(ESM_EBI_UNASSIGNED);
} }
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN] = ebr_ctx; ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN] = ebr_ctx;
#else #else
_esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN] = ebr_ctx; _esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN] = ebr_ctx;
......
...@@ -128,7 +128,7 @@ int esm_ebr_context_create( ...@@ -128,7 +128,7 @@ int esm_ebr_context_create(
esm_ctx = &_esm_data; esm_ctx = &_esm_data;
#endif #endif
#ifdef NAS_MME #ifdef NAS_MME
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
esm_ctx = &ctx->esm_data_ctx; esm_ctx = &ctx->esm_data_ctx;
# else # else
...@@ -369,7 +369,7 @@ int esm_ebr_context_release( ...@@ -369,7 +369,7 @@ int esm_ebr_context_release(
#endif #endif
#ifdef NAS_MME #ifdef NAS_MME
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
esm_ctx = &ctx->esm_data_ctx; esm_ctx = &ctx->esm_data_ctx;
# else # else
......
...@@ -135,7 +135,7 @@ void esm_main_initialize(void) ...@@ -135,7 +135,7 @@ void esm_main_initialize(void)
LOG_TRACE(ERROR, "ESM-MAIN - Failed to get MME configuration data"); LOG_TRACE(ERROR, "ESM-MAIN - Failed to get MME configuration data");
} }
# if !defined(EPC_BUILD) # if !defined(NAS_BUILT_IN_EPC)
/* Initialize ESM contexts */ /* Initialize ESM contexts */
for (i = 0; i < ESM_DATA_NB_UE_MAX; i++) { for (i = 0; i < ESM_DATA_NB_UE_MAX; i++) {
......
...@@ -50,7 +50,7 @@ Description Defines EPS Session Management messages ...@@ -50,7 +50,7 @@ Description Defines EPS Session Management messages
#include "TLVDecoder.h" #include "TLVDecoder.h"
#include "TLVEncoder.h" #include "TLVEncoder.h"
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
# include "nas_itti_messaging.h" # include "nas_itti_messaging.h"
#endif #endif
...@@ -92,12 +92,12 @@ int esm_msg_decode(ESM_msg *msg, uint8_t *buffer, uint32_t len) ...@@ -92,12 +92,12 @@ int esm_msg_decode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
int header_result; int header_result;
int decode_result; int decode_result;
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
uint8_t *buffer_log = buffer; uint8_t *buffer_log = buffer;
uint32_t len_log = len; uint32_t len_log = len;
int down_link; int down_link;
# if ((defined(EPC_BUILD) && defined(NAS_MME))) # if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
down_link = 0; down_link = 0;
# else # else
down_link = 1; down_link = 1;
...@@ -219,7 +219,7 @@ int esm_msg_decode(ESM_msg *msg, uint8_t *buffer, uint32_t len) ...@@ -219,7 +219,7 @@ int esm_msg_decode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
"(%u)", msg->header.message_type, decode_result); "(%u)", msg->header.message_type, decode_result);
LOG_FUNC_RETURN (decode_result); LOG_FUNC_RETURN (decode_result);
} else { } else {
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
/* Message has been decoded and security header removed, handle it has a plain message */ /* Message has been decoded and security header removed, handle it has a plain message */
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link); nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link);
#endif #endif
...@@ -252,11 +252,11 @@ int esm_msg_encode(ESM_msg *msg, uint8_t *buffer, uint32_t len) ...@@ -252,11 +252,11 @@ int esm_msg_encode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
int header_result; int header_result;
int encode_result; int encode_result;
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
uint8_t *buffer_log = buffer; uint8_t *buffer_log = buffer;
int down_link; int down_link;
# if ((defined(EPC_BUILD) && defined(NAS_MME))) # if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
down_link = 1; down_link = 1;
# else # else
down_link = 0; down_link = 0;
...@@ -378,7 +378,7 @@ int esm_msg_encode(ESM_msg *msg, uint8_t *buffer, uint32_t len) ...@@ -378,7 +378,7 @@ int esm_msg_encode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
LOG_TRACE(ERROR, "ESM-MSG - Failed to encode L3 ESM message 0x%x " LOG_TRACE(ERROR, "ESM-MSG - Failed to encode L3 ESM message 0x%x "
"(%d)", msg->header.message_type, encode_result); "(%d)", msg->header.message_type, encode_result);
} else { } else {
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link); nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link);
#endif #endif
} }
......
...@@ -80,6 +80,9 @@ int decode_ue_network_capability(UeNetworkCapability *uenetworkcapability, uint8 ...@@ -80,6 +80,9 @@ int decode_ue_network_capability(UeNetworkCapability *uenetworkcapability, uint8
uenetworkcapability->gprs_present =1; uenetworkcapability->gprs_present =1;
LOG_TRACE(INFO, "uenetworkcapability decoded GPRS\n"); LOG_TRACE(INFO, "uenetworkcapability decoded GPRS\n");
} }
#warning "Force GPRS present if UMTS present"
uenetworkcapability->gprs_present =1;
} }
} }
......
...@@ -96,18 +96,32 @@ int encode_ue_security_capability(UeSecurityCapability *uesecuritycapability, ui ...@@ -96,18 +96,32 @@ int encode_ue_security_capability(UeSecurityCapability *uesecuritycapability, ui
*(buffer + encoded) = uesecuritycapability->eia; *(buffer + encoded) = uesecuritycapability->eia;
encoded++; encoded++;
// From ETSI TS 124 301 V10.15.0 (2014-10) 9.9.3.36 Security capability:
// Octets 5, 6, and 7 are optional. If octet 5 is included, then also octet 6 shall be included and octet 7 may be included.
// If a UE did not indicate support of any security algorithm for Gb mode, octet 7 shall not be included. If the UE did not
// indicate support of any security algorithm for Iu mode and Gb mode, octets 5, 6, and 7 shall not be included.
// If the UE did not indicate support of any security algorithm for Iu mode but indicated support of a security algorithm for
// Gb mode, octets 5, 6, and 7 shall be included. In this case octets 5 and 6 are filled with the value of zeroes.
if (uesecuritycapability->umts_present) { if (uesecuritycapability->umts_present) {
*(buffer + encoded) = uesecuritycapability->uea; *(buffer + encoded) = uesecuritycapability->uea;
encoded++; encoded++;
*(buffer + encoded) = 0x00 | *(buffer + encoded) = 0x00 |
(uesecuritycapability->uia & 0x7f); (uesecuritycapability->uia & 0x7f);
encoded++; encoded++;
#warning "force gea to 0x60 if umts security capability present"
//if (uesecuritycapability->gprs_present) { if (uesecuritycapability->gprs_present) {
*(buffer + encoded) = 0x00 | 0x60; *(buffer + encoded) = 0x00 | (uesecuritycapability->gea & 0x7f);
//(uesecuritycapability->gea & 0x7f); encoded++;
encoded++; }
//} } else {
if (uesecuritycapability->gprs_present) {
*(buffer + encoded) = 0x00;
encoded++;
*(buffer + encoded) = 0x00;
encoded++;
*(buffer + encoded) = 0x00 | (uesecuritycapability->gea & 0x7f);
encoded++;
}
} }
*lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0); *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
......
...@@ -77,7 +77,7 @@ Description NAS procedure functions triggered by the network ...@@ -77,7 +77,7 @@ Description NAS procedure functions triggered by the network
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
#if defined(EPC_BUILD) && defined(NAS_MME) #if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
void nas_network_initialize(mme_config_t *mme_config_p) void nas_network_initialize(mme_config_t *mme_config_p)
#else #else
void nas_network_initialize(void) void nas_network_initialize(void)
...@@ -87,7 +87,7 @@ void nas_network_initialize(void) ...@@ -87,7 +87,7 @@ void nas_network_initialize(void)
#ifdef NAS_MME #ifdef NAS_MME
/* Initialize the internal NAS processing data */ /* Initialize the internal NAS processing data */
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
nas_timer_init(); nas_timer_init();
nas_proc_initialize(mme_config_p); nas_proc_initialize(mme_config_p);
# else # else
......
...@@ -43,7 +43,7 @@ Description NAS procedure functions triggered by the network ...@@ -43,7 +43,7 @@ Description NAS procedure functions triggered by the network
*****************************************************************************/ *****************************************************************************/
#if defined(EPC_BUILD) && defined(NAS_MME) #if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
# include "mme_config.h" # include "mme_config.h"
#endif #endif
...@@ -66,7 +66,7 @@ Description NAS procedure functions triggered by the network ...@@ -66,7 +66,7 @@ Description NAS procedure functions triggered by the network
/****************** E X P O R T E D F U N C T I O N S ******************/ /****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/ /****************************************************************************/
#if defined(EPC_BUILD) && defined(NAS_MME) #if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
void nas_network_initialize(mme_config_t *mme_config_p); void nas_network_initialize(mme_config_t *mme_config_p);
#else #else
void nas_network_initialize(void); void nas_network_initialize(void);
......
...@@ -140,7 +140,7 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb, ...@@ -140,7 +140,7 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb,
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
void nas_proc_initialize(mme_config_t *mme_config_p) void nas_proc_initialize(mme_config_t *mme_config_p)
{ {
LOG_FUNC_IN; LOG_FUNC_IN;
...@@ -1482,7 +1482,7 @@ int nas_proc_ul_transfer_ind(UInt32_t ueid, const Byte_t *data, UInt32_t len) ...@@ -1482,7 +1482,7 @@ int nas_proc_ul_transfer_ind(UInt32_t ueid, const Byte_t *data, UInt32_t len)
LOG_FUNC_RETURN (rc); LOG_FUNC_RETURN (rc);
} }
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res) int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res)
{ {
int rc = RETURNerror; int rc = RETURNerror;
......
...@@ -45,7 +45,7 @@ Description NAS procedure call manager ...@@ -45,7 +45,7 @@ Description NAS procedure call manager
#ifndef __NAS_PROC_H__ #ifndef __NAS_PROC_H__
#define __NAS_PROC_H__ #define __NAS_PROC_H__
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
# include "mme_config.h" # include "mme_config.h"
# include "emm_cnDef.h" # include "emm_cnDef.h"
#endif #endif
...@@ -74,7 +74,7 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb, ...@@ -74,7 +74,7 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb,
esm_indication_callback_t esm_cb, const char *imei); esm_indication_callback_t esm_cb, const char *imei);
#endif #endif
#ifdef NAS_MME #ifdef NAS_MME
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
void nas_proc_initialize(mme_config_t *mme_config_p); void nas_proc_initialize(mme_config_t *mme_config_p);
# else # else
void nas_proc_initialize(void); void nas_proc_initialize(void);
...@@ -159,7 +159,7 @@ int nas_proc_ul_transfer_ind(UInt32_t ueid, const Byte_t *data, UInt32_t len); ...@@ -159,7 +159,7 @@ int nas_proc_ul_transfer_ind(UInt32_t ueid, const Byte_t *data, UInt32_t len);
* NAS procedures triggered by the mme applicative layer * NAS procedures triggered by the mme applicative layer
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
#if defined(NAS_MME) && defined(EPC_BUILD) #if defined(NAS_MME) && defined(NAS_BUILT_IN_EPC)
int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res); int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res);
int nas_proc_auth_param_fail(emm_cn_auth_fail_t *emm_cn_auth_fail); int nas_proc_auth_param_fail(emm_cn_auth_fail_t *emm_cn_auth_fail);
int nas_proc_deregister_ue(UInt32_t ue_id); int nas_proc_deregister_ue(UInt32_t ue_id);
......
...@@ -44,7 +44,7 @@ Description Usefull logging functions ...@@ -44,7 +44,7 @@ Description Usefull logging functions
*****************************************************************************/ *****************************************************************************/
#include "nas_log.h" #include "nas_log.h"
#if defined(UE_BUILD) && defined(NAS_UE) #if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
int nas_log_func_indent; int nas_log_func_indent;
#else #else
#include <stdio.h> // stderr, sprintf, fprintf, vfprintf #include <stdio.h> // stderr, sprintf, fprintf, vfprintf
......
...@@ -45,7 +45,7 @@ Description Usefull logging functions ...@@ -45,7 +45,7 @@ Description Usefull logging functions
#ifndef __NAS_LOG_H__ #ifndef __NAS_LOG_H__
#define __NAS_LOG_H__ #define __NAS_LOG_H__
#if defined(UE_BUILD) && defined(NAS_UE) #if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
# include "UTIL/LOG/log.h" # include "UTIL/LOG/log.h"
# undef LOG_TRACE # undef LOG_TRACE
#endif #endif
...@@ -102,7 +102,7 @@ typedef enum { ...@@ -102,7 +102,7 @@ typedef enum {
/****************** E X P O R T E D F U N C T I O N S ******************/ /****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/ /****************************************************************************/
#if defined(UE_BUILD) && defined(NAS_UE) #if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
# define LOG_TRACE(s, x, args...) \ # define LOG_TRACE(s, x, args...) \
do { \ do { \
switch (s) { \ switch (s) { \
......
...@@ -278,7 +278,7 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args) ...@@ -278,7 +278,7 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args)
/* Insert the new entry into the timer queue */ /* Insert the new entry into the timer queue */
_nas_timer_db_insert_entry(id, te); _nas_timer_db_insert_entry(id, te);
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
# if defined(EPC_BUILD) # if defined(NAS_BUILT_IN_EPC)
ret = timer_setup(sec, 0, TASK_NAS_MME, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id); ret = timer_setup(sec, 0, TASK_NAS_MME, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
# else # else
ret = timer_setup(sec, 0, TASK_NAS_UE, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id); ret = timer_setup(sec, 0, TASK_NAS_UE, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
......
...@@ -81,7 +81,7 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args); ...@@ -81,7 +81,7 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args);
int nas_timer_stop(int id); int nas_timer_stop(int id);
int nas_timer_restart(int id); int nas_timer_restart(int id);
#if defined(EPC_BUILD) #if defined(NAS_BUILT_IN_EPC)
void nas_timer_handle_signal_expiry(long timer_id, void *arg_p); void nas_timer_handle_signal_expiry(long timer_id, void *arg_p);
#endif #endif
......
...@@ -52,6 +52,7 @@ Description Defines a list of PLMN network operators ...@@ -52,6 +52,7 @@ Description Defines a list of PLMN network operators
/********************* G L O B A L C O N S T A N T S *******************/ /********************* G L O B A L C O N S T A N T S *******************/
/****************************************************************************/ /****************************************************************************/
#define TEST_PLMN {0,0,0x0f,1,1,0} // 00101
#define SFR_PLMN_1 {0,2,0x0f,8,0,1} // 20810 #define SFR_PLMN_1 {0,2,0x0f,8,0,1} // 20810
#define SFR_PLMN_2 {0,2,0x0f,8,1,1} // 20811 #define SFR_PLMN_2 {0,2,0x0f,8,1,1} // 20811
#define SFR_PLMN_3 {0,2,0x0f,8,3,1} // 20813 #define SFR_PLMN_3 {0,2,0x0f,8,3,1} // 20813
...@@ -71,7 +72,8 @@ Description Defines a list of PLMN network operators ...@@ -71,7 +72,8 @@ Description Defines a list of PLMN network operators
* PLMN network operator record index * PLMN network operator record index
*/ */
enum { enum {
SFR1=0, TEST1=0,
SFR1,
SFR2, SFR2,
SFR3, SFR3,
TM1, TM1,
...@@ -104,6 +106,7 @@ typedef struct { ...@@ -104,6 +106,7 @@ typedef struct {
* The list of PLMN network operator records * The list of PLMN network operator records
*/ */
network_record_t network_records[] = { network_record_t network_records[] = {
{00101, TEST_PLMN, "Test network", "OAI4G", 0x0001, 0xfffd},
{20810, SFR_PLMN_1, "SFR France", "SFR", 0x0001, 0xfffd}, {20810, SFR_PLMN_1, "SFR France", "SFR", 0x0001, 0xfffd},
{20811, SFR_PLMN_2, "SFR France", "SFR", 0x0001, 0xfffd}, {20811, SFR_PLMN_2, "SFR France", "SFR", 0x0001, 0xfffd},
{20813, SFR_PLMN_3, "SFR France", "SFR", 0x0001, 0xfffd}, {20813, SFR_PLMN_3, "SFR France", "SFR", 0x0001, 0xfffd},
......
...@@ -53,7 +53,7 @@ Description Implements the utility used to generate data stored in the ...@@ -53,7 +53,7 @@ Description Implements the utility used to generate data stored in the
#include <stdlib.h> // exit, free #include <stdlib.h> // exit, free
#include <string.h> // memset, strncpy #include <string.h> // memset, strncpy
#define SELECTED_PLMN SFR1 #define SELECTED_PLMN TEST1
/****************************************************************************/ /****************************************************************************/
/**************** E X T E R N A L D E F I N I T I O N S ****************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/
...@@ -331,31 +331,34 @@ static void _gen_emm_data(emm_nvdata_t* data) ...@@ -331,31 +331,34 @@ static void _gen_emm_data(emm_nvdata_t* data)
* International Mobile Subscriber Identity * International Mobile Subscriber Identity
* IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234
*/ */
#warning "IMSI 208.10.000001234"
/* data->imsi.length = 8; /* data->imsi.length = 8;
data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even
data->imsi.u.num.digit1 = 2; // MCC digit 1 data->imsi.u.num.digit1 = 2; // MCC digit 1
data->imsi.u.num.digit2 = 0; // MCC digit 2 data->imsi.u.num.digit2 = 0; // MCC digit 2
data->imsi.u.num.digit3 = 8; // MCC digit 3 data->imsi.u.num.digit3 = 8; // MCC digit 3
data->imsi.u.num.digit4 = 1; // MNC digit 1 data->imsi.u.num.digit4 = 1; // MNC digit 1
data->imsi.u.num.digit5 = 0; // MNC digit 2 data->imsi.u.num.digit5 = 0; // MNC digit 2
data->imsi.u.num.digit6 = 0xF; // MNC digit 3 data->imsi.u.num.digit6 = 0xF; // MNC digit 3
data->imsi.u.num.digit7 = 0; data->imsi.u.num.digit7 = 0;
data->imsi.u.num.digit8 = 0; data->imsi.u.num.digit8 = 0;
data->imsi.u.num.digit9 = 0; data->imsi.u.num.digit9 = 0;
data->imsi.u.num.digit10 = 0; data->imsi.u.num.digit10 = 0;
data->imsi.u.num.digit11 = 1; data->imsi.u.num.digit11 = 1;
data->imsi.u.num.digit12 = 2; data->imsi.u.num.digit12 = 2;
data->imsi.u.num.digit13 = 3; data->imsi.u.num.digit13 = 3;
data->imsi.u.num.digit14 = 4; data->imsi.u.num.digit14 = 4;
data->imsi.u.num.digit15 = 0xF;*/ data->imsi.u.num.digit15 = 0xF;*/
/*
* International Mobile Subscriber Identity
* IMSI = MCC + MNC + MSIN = 001 + 01 + 00001234
*/
data->imsi.length = 8; data->imsi.length = 8;
data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even
data->imsi.u.num.digit1 = 2; // MCC digit 1 data->imsi.u.num.digit1 = 0; // MCC digit 1
data->imsi.u.num.digit2 = 0; // MCC digit 2 data->imsi.u.num.digit2 = 0; // MCC digit 2
data->imsi.u.num.digit3 = 8; // MCC digit 3 data->imsi.u.num.digit3 = 1; // MCC digit 3
data->imsi.u.num.digit4 = 1; // MNC digit 1 data->imsi.u.num.digit4 = 0; // MNC digit 1
data->imsi.u.num.digit5 = 0; // MNC digit 2 data->imsi.u.num.digit5 = 1; // MNC digit 2
data->imsi.u.num.digit6 = 0; data->imsi.u.num.digit6 = 0;
data->imsi.u.num.digit7 = 0; data->imsi.u.num.digit7 = 0;
data->imsi.u.num.digit8 = 0; data->imsi.u.num.digit8 = 0;
...@@ -370,11 +373,11 @@ static void _gen_emm_data(emm_nvdata_t* data) ...@@ -370,11 +373,11 @@ static void _gen_emm_data(emm_nvdata_t* data)
/* /*
* Last registered home PLMN * Last registered home PLMN
*/ */
data->rplmn.MCCdigit1 = 2; data->rplmn.MCCdigit1 = 0;
data->rplmn.MCCdigit2 = 0; data->rplmn.MCCdigit2 = 0;
data->rplmn.MCCdigit3 = 8; data->rplmn.MCCdigit3 = 1;
data->rplmn.MNCdigit1 = 1; data->rplmn.MNCdigit1 = 0;
data->rplmn.MNCdigit2 = 0; data->rplmn.MNCdigit2 = 1;
data->rplmn.MNCdigit3 = 0xf; data->rplmn.MNCdigit3 = 0xf;
#endif #endif
/* /*
......
...@@ -307,7 +307,7 @@ CFLAGS = \ ...@@ -307,7 +307,7 @@ CFLAGS = \
-g \ -g \
-Wall \ -Wall \
-DNAS_UE \ -DNAS_UE \
-DUE_BUILD \ -DNAS_BUILT_IN_UE \
-Wuninitialized \ -Wuninitialized \
-Werror=implicit-function-declaration \ -Werror=implicit-function-declaration \
$(UENAS_CFLAGS) \ $(UENAS_CFLAGS) \
......
...@@ -33,7 +33,7 @@ libnas_la_LDFLAGS = -all-static ...@@ -33,7 +33,7 @@ libnas_la_LDFLAGS = -all-static
AM_CFLAGS = \ AM_CFLAGS = \
@ADD_CFLAGS@ \ @ADD_CFLAGS@ \
-DNAS_MME \ -DNAS_MME \
-DEPC_BUILD \ -DNAS_BUILT_IN_EPC \
-DENABLE_ITTI \ -DENABLE_ITTI \
-I$(top_srcdir)/COMMON \ -I$(top_srcdir)/COMMON \
-I$(top_srcdir)/SECU \ -I$(top_srcdir)/SECU \
......
...@@ -31,15 +31,15 @@ ...@@ -31,15 +31,15 @@
#include "intertask_interface.h" #include "intertask_interface.h"
#include "nas_itti_messaging.h" #include "nas_itti_messaging.h"
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
# if (defined(EPC_BUILD) && defined(NAS_MME)) # if (defined(NAS_BUILT_IN_EPC) && defined(NAS_MME))
# define TASK_ORIGIN TASK_NAS_MME # define TASK_ORIGIN TASK_NAS_MME
# else # else
# define TASK_ORIGIN TASK_NAS_UE # define TASK_ORIGIN TASK_NAS_UE
# endif # endif
#endif #endif
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) #if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
static const UInt8_t emm_message_ids[] = { static const UInt8_t emm_message_ids[] = {
ATTACH_REQUEST, ATTACH_REQUEST,
ATTACH_ACCEPT, ATTACH_ACCEPT,
...@@ -188,7 +188,7 @@ int nas_itti_protected_msg(const char *buffer, const nas_message_t *msg, const i ...@@ -188,7 +188,7 @@ int nas_itti_protected_msg(const char *buffer, const nas_message_t *msg, const i
} }
#endif #endif
#if defined(EPC_BUILD) && defined(NAS_MME) #if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
int nas_itti_dl_data_req(const uint32_t ue_id, void *const data, int nas_itti_dl_data_req(const uint32_t ue_id, void *const data,
const uint32_t length) const uint32_t length)
{ {
...@@ -205,7 +205,7 @@ int nas_itti_dl_data_req(const uint32_t ue_id, void *const data, ...@@ -205,7 +205,7 @@ int nas_itti_dl_data_req(const uint32_t ue_id, void *const data,
#endif #endif
#if defined(UE_BUILD) && defined(NAS_UE) #if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
extern unsigned char NB_eNB_INST; extern unsigned char NB_eNB_INST;
int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat) int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat)
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#ifndef NAS_ITTI_MESSAGING_H_ #ifndef NAS_ITTI_MESSAGING_H_
#define NAS_ITTI_MESSAGING_H_ #define NAS_ITTI_MESSAGING_H_
# if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE))) # if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
int nas_itti_plain_msg( int nas_itti_plain_msg(
const char *buffer, const char *buffer,
const nas_message_t *msg, const nas_message_t *msg,
...@@ -51,7 +51,7 @@ int nas_itti_protected_msg( ...@@ -51,7 +51,7 @@ int nas_itti_protected_msg(
const int instance); const int instance);
# endif # endif
# if defined(EPC_BUILD) && defined(NAS_MME) # if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
#include "conversions.h" #include "conversions.h"
int nas_itti_dl_data_req( int nas_itti_dl_data_req(
...@@ -223,7 +223,7 @@ static inline void nas_itti_establish_rej( ...@@ -223,7 +223,7 @@ static inline void nas_itti_establish_rej(
} }
# endif # endif
# if defined(UE_BUILD) && defined(NAS_UE) # if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat); int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat);
int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t s_tmsi, plmn_t plmnID, Byte_t *data_pP, UInt32_t lengthP); int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t s_tmsi, plmn_t plmnID, Byte_t *data_pP, UInt32_t lengthP);
......
...@@ -85,7 +85,9 @@ int main(int argc, char *argv[]) ...@@ -85,7 +85,9 @@ int main(int argc, char *argv[])
CHECK_INIT_RETURN(mme_app_init(&mme_config)); CHECK_INIT_RETURN(mme_app_init(&mme_config));
CHECK_INIT_RETURN(s6a_init(&mme_config)); CHECK_INIT_RETURN(s6a_init(&mme_config));
CHECK_INIT_RETURN(sgw_lite_init(mme_config.config_file)); CHECK_INIT_RETURN(sgw_lite_init(mme_config.config_file));
#if ! defined(ENABLE_USE_GTPU_IN_KERNEL)
CHECK_INIT_RETURN(sgi_init(&spgw_config.pgw_config)); CHECK_INIT_RETURN(sgi_init(&spgw_config.pgw_config));
#endif
/* Handle signals here */ /* Handle signals here */
itti_wait_tasks_end(); itti_wait_tasks_end();
......
...@@ -55,6 +55,9 @@ ...@@ -55,6 +55,9 @@
#include "s1ap_eNB_itti_messaging.h" #include "s1ap_eNB_itti_messaging.h"
#include "s1ap_eNB_ue_context.h" // test, to be removed
#include "assertions.h" #include "assertions.h"
#include "conversions.h" #include "conversions.h"
...@@ -322,8 +325,22 @@ void *s1ap_eNB_task(void *arg) ...@@ -322,8 +325,22 @@ void *s1ap_eNB_task(void *arg)
break; break;
case S1AP_UE_CONTEXT_RELEASE_REQ: { case S1AP_UE_CONTEXT_RELEASE_REQ: {
s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL; // test
struct s1ap_eNB_ue_context_s *ue_context_p = NULL; // test
s1ap_ue_context_release_req(ITTI_MESSAGE_GET_INSTANCE(received_msg), s1ap_ue_context_release_req(ITTI_MESSAGE_GET_INSTANCE(received_msg),
&S1AP_UE_CONTEXT_RELEASE_REQ(received_msg)); &S1AP_UE_CONTEXT_RELEASE_REQ(received_msg));
s1ap_eNB_instance_p = s1ap_eNB_get_instance(ITTI_MESSAGE_GET_INSTANCE(received_msg)); // test
DevAssert(s1ap_eNB_instance_p != NULL); // test
if ((ue_context_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance_p,
S1AP_UE_CONTEXT_RELEASE_REQ(received_msg).eNB_ue_s1ap_id)) == NULL) { // test
/* The context for this eNB ue s1ap id doesn't exist in the map of eNB UEs */
S1AP_ERROR("Failed to find ue context associated with eNB ue s1ap id: %u\n",
S1AP_UE_CONTEXT_RELEASE_REQ(received_msg).eNB_ue_s1ap_id); // test
} // test
} }
break; break;
......
...@@ -48,6 +48,9 @@ ...@@ -48,6 +48,9 @@
#include "s1ap_eNB_nas_procedures.h" #include "s1ap_eNB_nas_procedures.h"
#include "s1ap_eNB_management_procedures.h" #include "s1ap_eNB_management_procedures.h"
#include "s1ap_eNB_context_management_procedures.h" #include "s1ap_eNB_context_management_procedures.h"
#ifdef MESSAGE_CHART_GENERATOR
#include "msc.h"
#endif
int s1ap_ue_context_release_complete(instance_t instance, int s1ap_ue_context_release_complete(instance_t instance,
...@@ -98,6 +101,18 @@ int s1ap_ue_context_release_complete(instance_t instance, ...@@ -98,6 +101,18 @@ int s1ap_ue_context_release_complete(instance_t instance,
return -1; return -1;
} }
#ifdef MESSAGE_CHART_GENERATOR
msc_log_tx_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
buffer,
length,
MSC_AS_TIME_FMT" UEContextRelease successfulOutcome eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
0,0, //MSC_AS_TIME_ARGS(ctxt_pP),
ue_ctxt_release_complete_ies_p->eNB_UE_S1AP_ID,
ue_ctxt_release_complete_ies_p->mme_ue_s1ap_id);
#endif
/* UE associated signalling -> use the allocated stream */ /* UE associated signalling -> use the allocated stream */
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
ue_context_p->mme_ref->assoc_id, buffer, ue_context_p->mme_ref->assoc_id, buffer,
...@@ -114,7 +129,12 @@ int s1ap_ue_context_release_complete(instance_t instance, ...@@ -114,7 +129,12 @@ int s1ap_ue_context_release_complete(instance_t instance,
if ((ue_context2_p = RB_REMOVE(s1ap_ue_map, &s1ap_eNB_instance_p->s1ap_ue_head, ue_context_p)) if ((ue_context2_p = RB_REMOVE(s1ap_ue_map, &s1ap_eNB_instance_p->s1ap_ue_head, ue_context_p))
== NULL) { == NULL) {
S1AP_WARN("Removed UE context eNB_ue_s1ap_id %u\n",
ue_context2_p->eNB_ue_s1ap_id);
s1ap_eNB_free_ue_context(ue_context2_p); s1ap_eNB_free_ue_context(ue_context2_p);
} else {
S1AP_WARN("Removing UE context eNB_ue_s1ap_id %u: did not find context\n",
ue_context_p->eNB_ue_s1ap_id);
} }
return ret; return ret;
...@@ -195,6 +215,18 @@ int s1ap_ue_context_release_req(instance_t instance, ...@@ -195,6 +215,18 @@ int s1ap_ue_context_release_req(instance_t instance,
return -1; return -1;
} }
#ifdef MESSAGE_CHART_GENERATOR
msc_log_tx_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
buffer,
length,
MSC_AS_TIME_FMT" UEContextReleaseRequest initiatingMessage eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
ue_ctxt_release_request_ies_p->eNB_UE_S1AP_ID,
ue_ctxt_release_request_ies_p->mme_ue_s1ap_id);
#endif
/* UE associated signalling -> use the allocated stream */ /* UE associated signalling -> use the allocated stream */
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
ue_context_p->mme_ref->assoc_id, buffer, ue_context_p->mme_ref->assoc_id, buffer,
......
...@@ -226,7 +226,7 @@ typedef struct { ...@@ -226,7 +226,7 @@ typedef struct {
uint16_t global_cnx_id; uint16_t global_cnx_id;
} s1ap_eNB_internal_data_t; } s1ap_eNB_internal_data_t;
inline int s1ap_eNB_compare_assoc_id( int s1ap_eNB_compare_assoc_id(
struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2); struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2);
/* Generate the tree management functions */ /* Generate the tree management functions */
......
...@@ -47,9 +47,14 @@ ...@@ -47,9 +47,14 @@
#include "s1ap_eNB_ue_context.h" #include "s1ap_eNB_ue_context.h"
#include "s1ap_eNB_nas_procedures.h" #include "s1ap_eNB_nas_procedures.h"
#include "s1ap_eNB_management_procedures.h" #include "s1ap_eNB_management_procedures.h"
#ifdef MESSAGE_CHART_GENERATOR
#include "msc.h"
#endif
//------------------------------------------------------------------------------
int s1ap_eNB_handle_nas_first_req( int s1ap_eNB_handle_nas_first_req(
instance_t instance, s1ap_nas_first_req_t *s1ap_nas_first_req_p) instance_t instance, s1ap_nas_first_req_t *s1ap_nas_first_req_p)
//------------------------------------------------------------------------------
{ {
s1ap_eNB_instance_t *instance_p = NULL; s1ap_eNB_instance_t *instance_p = NULL;
struct s1ap_eNB_mme_data_s *mme_desc_p = NULL; struct s1ap_eNB_mme_data_s *mme_desc_p = NULL;
...@@ -221,8 +226,21 @@ int s1ap_eNB_handle_nas_first_req( ...@@ -221,8 +226,21 @@ int s1ap_eNB_handle_nas_first_req(
mme_desc_p->nextstream += 1; mme_desc_p->nextstream += 1;
} }
#if defined(S1AP_LIMIT_STREAM_ID_TO_1)
mme_desc_p->nextstream = 1;
#endif
ue_desc_p->stream = mme_desc_p->nextstream; ue_desc_p->stream = mme_desc_p->nextstream;
#ifdef MESSAGE_CHART_GENERATOR
msc_log_tx_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
(const char *)NULL,
0,
MSC_AS_TIME_FMT" initialUEMessage initiatingMessage eNB_ue_s1ap_id %u",
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
initial_ue_message_p->eNB_UE_S1AP_ID);
#endif
/* Send encoded message over sctp */ /* Send encoded message over sctp */
s1ap_eNB_itti_send_sctp_data_req(instance_p->instance, mme_desc_p->assoc_id, s1ap_eNB_itti_send_sctp_data_req(instance_p->instance, mme_desc_p->assoc_id,
buffer, length, ue_desc_p->stream); buffer, length, ue_desc_p->stream);
...@@ -230,11 +248,13 @@ int s1ap_eNB_handle_nas_first_req( ...@@ -230,11 +248,13 @@ int s1ap_eNB_handle_nas_first_req(
return 0; return 0;
} }
//------------------------------------------------------------------------------
int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
const uint32_t stream, const uint32_t stream,
const struct s1ap_message_s *const message_p) const struct s1ap_message_s *const message_p)
//------------------------------------------------------------------------------
{ {
S1ap_DownlinkNASTransportIEs_t *downlink_NAS_transport_p = NULL; const S1ap_DownlinkNASTransportIEs_t *downlink_NAS_transport_p = NULL;
s1ap_eNB_mme_data_t *mme_desc_p = NULL; s1ap_eNB_mme_data_t *mme_desc_p = NULL;
s1ap_eNB_ue_context_t *ue_desc_p = NULL; s1ap_eNB_ue_context_t *ue_desc_p = NULL;
...@@ -262,7 +282,19 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, ...@@ -262,7 +282,19 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
if ((ue_desc_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance, if ((ue_desc_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance,
downlink_NAS_transport_p->eNB_UE_S1AP_ID)) == NULL) { downlink_NAS_transport_p->eNB_UE_S1AP_ID)) == NULL) {
S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context: 0x%08x %l(10)\n", #ifdef MESSAGE_CHART_GENERATOR
msc_log_rx_discarded_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
(const char *)downlink_NAS_transport_p,
sizeof(S1ap_DownlinkNASTransportIEs_t),
MSC_AS_TIME_FMT" downlinkNASTransport eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
downlink_NAS_transport_p->eNB_UE_S1AP_ID,
downlink_NAS_transport_p->mme_ue_s1ap_id);
#endif
S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%"PRIx32" %u\n",
assoc_id, assoc_id,
downlink_NAS_transport_p->eNB_UE_S1AP_ID, downlink_NAS_transport_p->eNB_UE_S1AP_ID,
downlink_NAS_transport_p->eNB_UE_S1AP_ID); downlink_NAS_transport_p->eNB_UE_S1AP_ID);
...@@ -277,7 +309,7 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, ...@@ -277,7 +309,7 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
} else { } else {
/* We already have a mme ue s1ap id check the received is the same */ /* We already have a mme ue s1ap id check the received is the same */
if (ue_desc_p->mme_ue_s1ap_id != downlink_NAS_transport_p->mme_ue_s1ap_id) { if (ue_desc_p->mme_ue_s1ap_id != downlink_NAS_transport_p->mme_ue_s1ap_id) {
S1AP_ERROR("[SCTP %d] Mismatch in MME UE S1AP ID (0x%08x != 0x%08x)\n", S1AP_ERROR("[SCTP %d] Mismatch in MME UE S1AP ID (0x%"PRIx32" != 0x%"PRIx32")\n",
assoc_id, assoc_id,
downlink_NAS_transport_p->mme_ue_s1ap_id, downlink_NAS_transport_p->mme_ue_s1ap_id,
ue_desc_p->mme_ue_s1ap_id ue_desc_p->mme_ue_s1ap_id
...@@ -285,6 +317,18 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, ...@@ -285,6 +317,18 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
} }
} }
#ifdef MESSAGE_CHART_GENERATOR
msc_log_rx_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
(const char *)downlink_NAS_transport_p,
sizeof(S1ap_DownlinkNASTransportIEs_t),
MSC_AS_TIME_FMT" downlinkNASTransport eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
downlink_NAS_transport_p->eNB_UE_S1AP_ID,
downlink_NAS_transport_p->mme_ue_s1ap_id);
#endif
/* Forward the NAS PDU to RRC */ /* Forward the NAS PDU to RRC */
s1ap_eNB_itti_send_nas_downlink_ind(s1ap_eNB_instance->instance, s1ap_eNB_itti_send_nas_downlink_ind(s1ap_eNB_instance->instance,
ue_desc_p->ue_initial_id, ue_desc_p->ue_initial_id,
...@@ -292,12 +336,15 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, ...@@ -292,12 +336,15 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
downlink_NAS_transport_p->nas_pdu.buf, downlink_NAS_transport_p->nas_pdu.buf,
downlink_NAS_transport_p->nas_pdu.size); downlink_NAS_transport_p->nas_pdu.size);
ue_desc_p->ue_initial_id = 0; // LG: Why set to 0 ??
//ue_desc_p->ue_initial_id = 0;
return 0; return 0;
} }
//------------------------------------------------------------------------------
int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_p) int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_p)
//------------------------------------------------------------------------------
{ {
struct s1ap_eNB_ue_context_s *ue_context_p; struct s1ap_eNB_ue_context_s *ue_context_p;
s1ap_eNB_instance_t *s1ap_eNB_instance_p; s1ap_eNB_instance_t *s1ap_eNB_instance_p;
...@@ -370,6 +417,18 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_ ...@@ -370,6 +417,18 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_
return -1; return -1;
} }
#ifdef MESSAGE_CHART_GENERATOR
msc_log_tx_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
(const char *)NULL,
0,
MSC_AS_TIME_FMT" uplinkNASTransport initiatingMessage eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
uplink_NAS_transport_p->eNB_UE_S1AP_ID,
uplink_NAS_transport_p->mme_ue_s1ap_id);
#endif
/* UE associated signalling -> use the allocated stream */ /* UE associated signalling -> use the allocated stream */
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
ue_context_p->mme_ref->assoc_id, buffer, ue_context_p->mme_ref->assoc_id, buffer,
...@@ -378,8 +437,11 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_ ...@@ -378,8 +437,11 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_
return 0; return 0;
} }
//------------------------------------------------------------------------------
void s1ap_eNB_nas_non_delivery_ind(instance_t instance, void s1ap_eNB_nas_non_delivery_ind(instance_t instance,
s1ap_nas_non_delivery_ind_t *s1ap_nas_non_delivery_ind) s1ap_nas_non_delivery_ind_t *s1ap_nas_non_delivery_ind)
//------------------------------------------------------------------------------
{ {
struct s1ap_eNB_ue_context_s *ue_context_p; struct s1ap_eNB_ue_context_s *ue_context_p;
s1ap_eNB_instance_t *s1ap_eNB_instance_p; s1ap_eNB_instance_t *s1ap_eNB_instance_p;
...@@ -426,6 +488,17 @@ void s1ap_eNB_nas_non_delivery_ind(instance_t instance, ...@@ -426,6 +488,17 @@ void s1ap_eNB_nas_non_delivery_ind(instance_t instance,
/* Send a dummy cause */ /* Send a dummy cause */
nas_non_delivery_p->cause.present = S1ap_Cause_PR_radioNetwork; nas_non_delivery_p->cause.present = S1ap_Cause_PR_radioNetwork;
nas_non_delivery_p->cause.choice.radioNetwork = S1ap_CauseRadioNetwork_radio_connection_with_ue_lost; nas_non_delivery_p->cause.choice.radioNetwork = S1ap_CauseRadioNetwork_radio_connection_with_ue_lost;
#ifdef MESSAGE_CHART_GENERATOR
msc_log_tx_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
(const char *)s1ap_nas_non_delivery_ind,
sizeof(s1ap_nas_non_delivery_ind_t),
MSC_AS_TIME_FMT" NASNonDeliveryIndication initiatingMessage eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
nas_non_delivery_p->eNB_UE_S1AP_ID,
nas_non_delivery_p->mme_ue_s1ap_id);
#endif
/* UE associated signalling -> use the allocated stream */ /* UE associated signalling -> use the allocated stream */
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
...@@ -433,8 +506,10 @@ void s1ap_eNB_nas_non_delivery_ind(instance_t instance, ...@@ -433,8 +506,10 @@ void s1ap_eNB_nas_non_delivery_ind(instance_t instance,
length, ue_context_p->stream); length, ue_context_p->stream);
} }
//------------------------------------------------------------------------------
int s1ap_eNB_initial_ctxt_resp( int s1ap_eNB_initial_ctxt_resp(
instance_t instance, s1ap_initial_context_setup_resp_t *initial_ctxt_resp_p) instance_t instance, s1ap_initial_context_setup_resp_t *initial_ctxt_resp_p)
//------------------------------------------------------------------------------
{ {
s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL; s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL;
struct s1ap_eNB_ue_context_s *ue_context_p = NULL; struct s1ap_eNB_ue_context_s *ue_context_p = NULL;
...@@ -505,6 +580,18 @@ int s1ap_eNB_initial_ctxt_resp( ...@@ -505,6 +580,18 @@ int s1ap_eNB_initial_ctxt_resp(
return -1; return -1;
} }
#ifdef MESSAGE_CHART_GENERATOR
msc_log_tx_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
(const char *)buffer,
length,
MSC_AS_TIME_FMT" InitialContextSetup successfulOutcome eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
initial_ies_p->eNB_UE_S1AP_ID,
initial_ies_p->mme_ue_s1ap_id);
#endif
/* UE associated signalling -> use the allocated stream */ /* UE associated signalling -> use the allocated stream */
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
ue_context_p->mme_ref->assoc_id, buffer, ue_context_p->mme_ref->assoc_id, buffer,
...@@ -513,8 +600,10 @@ int s1ap_eNB_initial_ctxt_resp( ...@@ -513,8 +600,10 @@ int s1ap_eNB_initial_ctxt_resp(
return ret; return ret;
} }
//------------------------------------------------------------------------------
int s1ap_eNB_ue_capabilities(instance_t instance, int s1ap_eNB_ue_capabilities(instance_t instance,
s1ap_ue_cap_info_ind_t *ue_cap_info_ind_p) s1ap_ue_cap_info_ind_t *ue_cap_info_ind_p)
//------------------------------------------------------------------------------
{ {
s1ap_eNB_instance_t *s1ap_eNB_instance_p; s1ap_eNB_instance_t *s1ap_eNB_instance_p;
struct s1ap_eNB_ue_context_s *ue_context_p; struct s1ap_eNB_ue_context_s *ue_context_p;
...@@ -572,6 +661,18 @@ int s1ap_eNB_ue_capabilities(instance_t instance, ...@@ -572,6 +661,18 @@ int s1ap_eNB_ue_capabilities(instance_t instance,
return -1; return -1;
} }
#ifdef MESSAGE_CHART_GENERATOR
msc_log_tx_message(
MSC_S1AP_ENB,
MSC_S1AP_MME,
(const char *)buffer,
length,
MSC_AS_TIME_FMT" UECapabilityInfoIndication initiatingMessage eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
ue_cap_info_ind_ies_p->eNB_UE_S1AP_ID,
ue_cap_info_ind_ies_p->mme_ue_s1ap_id);
#endif
/* UE associated signalling -> use the allocated stream */ /* UE associated signalling -> use the allocated stream */
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
ue_context_p->mme_ref->assoc_id, buffer, ue_context_p->mme_ref->assoc_id, buffer,
......
...@@ -78,7 +78,7 @@ typedef struct s1ap_eNB_ue_context_s { ...@@ -78,7 +78,7 @@ typedef struct s1ap_eNB_ue_context_s {
s1ap_eNB_instance_t *eNB_instance; s1ap_eNB_instance_t *eNB_instance;
} s1ap_eNB_ue_context_t; } s1ap_eNB_ue_context_t;
inline int s1ap_eNB_compare_eNB_ue_s1ap_id( int s1ap_eNB_compare_eNB_ue_s1ap_id(
struct s1ap_eNB_ue_context_s *p1, struct s1ap_eNB_ue_context_s *p2); struct s1ap_eNB_ue_context_s *p1, struct s1ap_eNB_ue_context_s *p2);
/* Generate the tree management functions prototypes */ /* Generate the tree management functions prototypes */
......
...@@ -291,14 +291,14 @@ void s1ap_dump_ue(ue_description_t *ue_ref) ...@@ -291,14 +291,14 @@ void s1ap_dump_ue(ue_description_t *ue_ref)
#endif #endif
} }
eNB_description_t* s1ap_is_eNB_id_in_list(uint32_t eNB_id) eNB_description_t* s1ap_is_eNB_id_in_list(const uint32_t eNB_id)
{ {
eNB_description_t *eNB_ref; eNB_description_t *eNB_ref;
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
if (eNB_ref->eNB_id == eNB_id) { if (eNB_ref->eNB_id == eNB_id) {
/* We fount a matching reference, return it */ /* We found a matching reference, return it */
return eNB_ref; return eNB_ref;
} }
} }
...@@ -306,14 +306,14 @@ eNB_description_t* s1ap_is_eNB_id_in_list(uint32_t eNB_id) ...@@ -306,14 +306,14 @@ eNB_description_t* s1ap_is_eNB_id_in_list(uint32_t eNB_id)
return eNB_ref; return eNB_ref;
} }
eNB_description_t* s1ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id) eNB_description_t* s1ap_is_eNB_assoc_id_in_list(const uint32_t sctp_assoc_id)
{ {
eNB_description_t *eNB_ref; eNB_description_t *eNB_ref;
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
if (eNB_ref->sctp_assoc_id == sctp_assoc_id) { if (eNB_ref->sctp_assoc_id == sctp_assoc_id) {
/* We fount a matching reference, return it */ /* We found a matching reference, return it */
return eNB_ref; return eNB_ref;
} }
} }
...@@ -322,7 +322,7 @@ eNB_description_t* s1ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id) ...@@ -322,7 +322,7 @@ eNB_description_t* s1ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id)
} }
ue_description_t *s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref, ue_description_t *s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref,
uint32_t eNB_ue_s1ap_id) const uint32_t eNB_ue_s1ap_id)
{ {
ue_description_t *ue_ref; ue_description_t *ue_ref;
...@@ -337,7 +337,7 @@ ue_description_t *s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref, ...@@ -337,7 +337,7 @@ ue_description_t *s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref,
return NULL; return NULL;
} }
ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t mme_ue_s1ap_id) ue_description_t* s1ap_is_ue_mme_id_in_list(const uint32_t mme_ue_s1ap_id)
{ {
ue_description_t *ue_ref; ue_description_t *ue_ref;
...@@ -345,7 +345,7 @@ ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t mme_ue_s1ap_id) ...@@ -345,7 +345,7 @@ ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t mme_ue_s1ap_id)
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) { STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) {
// We fount a matching reference, return it // We found a matching reference, return it
if (ue_ref->mme_ue_s1ap_id == mme_ue_s1ap_id) { if (ue_ref->mme_ue_s1ap_id == mme_ue_s1ap_id) {
return ue_ref; return ue_ref;
} }
...@@ -355,7 +355,7 @@ ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t mme_ue_s1ap_id) ...@@ -355,7 +355,7 @@ ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t mme_ue_s1ap_id)
return NULL; return NULL;
} }
ue_description_t* s1ap_is_teid_in_list(uint32_t teid) ue_description_t* s1ap_is_teid_in_list(const uint32_t teid)
{ {
ue_description_t *ue_ref; ue_description_t *ue_ref;
...@@ -363,7 +363,7 @@ ue_description_t* s1ap_is_teid_in_list(uint32_t teid) ...@@ -363,7 +363,7 @@ ue_description_t* s1ap_is_teid_in_list(uint32_t teid)
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) { STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) { STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) {
// We fount a matching reference, return it // We found a matching reference, return it
if (ue_ref->teid == teid) { if (ue_ref->teid == teid) {
return ue_ref; return ue_ref;
} }
...@@ -397,7 +397,7 @@ eNB_description_t* s1ap_new_eNB(void) ...@@ -397,7 +397,7 @@ eNB_description_t* s1ap_new_eNB(void)
return eNB_ref; return eNB_ref;
} }
ue_description_t* s1ap_new_ue(uint32_t sctp_assoc_id) ue_description_t* s1ap_new_ue(const uint32_t sctp_assoc_id)
{ {
eNB_description_t *eNB_ref = NULL; eNB_description_t *eNB_ref = NULL;
...@@ -438,6 +438,7 @@ void s1ap_remove_ue(ue_description_t *ue_ref) ...@@ -438,6 +438,7 @@ void s1ap_remove_ue(ue_description_t *ue_ref)
/* Freeing memory */ /* Freeing memory */
free(ue_ref); free(ue_ref);
ue_ref = NULL;
} }
void s1ap_remove_eNB(eNB_description_t *eNB_ref) void s1ap_remove_eNB(eNB_description_t *eNB_ref)
...@@ -456,6 +457,7 @@ void s1ap_remove_eNB(eNB_description_t *eNB_ref) ...@@ -456,6 +457,7 @@ void s1ap_remove_eNB(eNB_description_t *eNB_ref)
STAILQ_REMOVE(&eNB_list_head, eNB_ref, eNB_description_s, eNB_entries); STAILQ_REMOVE(&eNB_list_head, eNB_ref, eNB_description_s, eNB_entries);
free(eNB_ref); free(eNB_ref);
eNB_ref = NULL;
nb_eNB_associated--; nb_eNB_associated--;
} }
......
...@@ -123,27 +123,27 @@ int s1ap_mme_init(const mme_config_t *mme_config); ...@@ -123,27 +123,27 @@ int s1ap_mme_init(const mme_config_t *mme_config);
* \param eNB_id The unique eNB id to search in list * \param eNB_id The unique eNB id to search in list
* @returns NULL if no eNB matchs the eNB id, or reference to the eNB element in list if matches * @returns NULL if no eNB matchs the eNB id, or reference to the eNB element in list if matches
**/ **/
eNB_description_t* s1ap_is_eNB_id_in_list(uint32_t eNB_id); eNB_description_t* s1ap_is_eNB_id_in_list(const uint32_t eNB_id);
/** \brief Look for given eNB SCTP assoc id in the list /** \brief Look for given eNB SCTP assoc id in the list
* \param eNB_id The unique sctp assoc id to search in list * \param eNB_id The unique sctp assoc id to search in list
* @returns NULL if no eNB matchs the sctp assoc id, or reference to the eNB element in list if matches * @returns NULL if no eNB matchs the sctp assoc id, or reference to the eNB element in list if matches
**/ **/
eNB_description_t* s1ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id); eNB_description_t* s1ap_is_eNB_assoc_id_in_list(const uint32_t sctp_assoc_id);
/** \brief Look for given ue eNB id in the list /** \brief Look for given ue eNB id in the list
* \param eNB_id The unique ue_eNB_id to search in list * \param eNB_id The unique ue_eNB_id to search in list
* @returns NULL if no UE matchs the ue_eNB_id, or reference to the ue element in list if matches * @returns NULL if no UE matchs the ue_eNB_id, or reference to the ue element in list if matches
**/ **/
ue_description_t* s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref, ue_description_t* s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref,
uint32_t eNB_ue_s1ap_id); const uint32_t eNB_ue_s1ap_id);
/** \brief Look for given ue mme id in the list /** \brief Look for given ue mme id in the list
* \param eNB_id The unique ue_mme_id to search in list * \param eNB_id The unique ue_mme_id to search in list
* @returns NULL if no UE matchs the ue_mme_id, or reference to the ue element in list if matches * @returns NULL if no UE matchs the ue_mme_id, or reference to the ue element in list if matches
**/ **/
ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t ue_mme_id); ue_description_t* s1ap_is_ue_mme_id_in_list(const uint32_t ue_mme_id);
ue_description_t* s1ap_is_teid_in_list(uint32_t teid); ue_description_t* s1ap_is_teid_in_list(const uint32_t teid);
/** \brief Allocate and add to the list a new eNB descriptor /** \brief Allocate and add to the list a new eNB descriptor
* @returns Reference to the new eNB element in list * @returns Reference to the new eNB element in list
...@@ -154,7 +154,7 @@ eNB_description_t* s1ap_new_eNB(void); ...@@ -154,7 +154,7 @@ eNB_description_t* s1ap_new_eNB(void);
* \param sctp_assoc_id association ID over SCTP * \param sctp_assoc_id association ID over SCTP
* @returns Reference to the new UE element in list * @returns Reference to the new UE element in list
**/ **/
ue_description_t* s1ap_new_ue(uint32_t sctp_assoc_id); ue_description_t* s1ap_new_ue(const uint32_t sctp_assoc_id);
/** \brief Dump the eNB list /** \brief Dump the eNB list
* Calls dump_eNB for each eNB in list * Calls dump_eNB for each eNB in list
......
...@@ -77,7 +77,7 @@ s1ap_message_decoded_callback messages_callback[][3] = { ...@@ -77,7 +77,7 @@ s1ap_message_decoded_callback messages_callback[][3] = {
{ 0, 0, 0 }, /* ErrorIndication */ { 0, 0, 0 }, /* ErrorIndication */
{ s1ap_mme_handle_nas_non_delivery, 0, 0 }, /* NASNonDeliveryIndication */ { s1ap_mme_handle_nas_non_delivery, 0, 0 }, /* NASNonDeliveryIndication */
{ s1ap_mme_handle_s1_setup_request, 0, 0 }, /* S1Setup */ { s1ap_mme_handle_s1_setup_request, 0, 0 }, /* S1Setup */
{ 0, 0, 0 }, /* UEContextReleaseRequest */ { s1ap_mme_handle_ue_context_release_request, 0, 0 }, /* UEContextReleaseRequest */
{ 0, 0, 0 }, /* DownlinkS1cdma2000tunneling */ { 0, 0, 0 }, /* DownlinkS1cdma2000tunneling */
{ 0, 0, 0 }, /* UplinkS1cdma2000tunneling */ { 0, 0, 0 }, /* UplinkS1cdma2000tunneling */
{ 0, 0, 0 }, /* UEContextModification */ { 0, 0, 0 }, /* UEContextModification */
...@@ -586,6 +586,9 @@ int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id, ...@@ -586,6 +586,9 @@ int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id,
/* MME doesn't know the MME UE S1AP ID provided. /* MME doesn't know the MME UE S1AP ID provided.
* TODO * TODO
*/ */
S1AP_DEBUG("UE_CONTEXT_RELEASE_REQUEST ignored cause could not get context with mme_ue_s1ap_id 0x%08x %u(10)\n",
ueContextReleaseRequest_p->mme_ue_s1ap_id,
ueContextReleaseRequest_p->mme_ue_s1ap_id);
return -1; return -1;
} else { } else {
if (ue_ref->eNB_ue_s1ap_id == (ueContextReleaseRequest_p->eNB_UE_S1AP_ID & if (ue_ref->eNB_ue_s1ap_id == (ueContextReleaseRequest_p->eNB_UE_S1AP_ID &
...@@ -594,6 +597,8 @@ int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id, ...@@ -594,6 +597,8 @@ int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id,
* -> Send a UE context Release Command to eNB. * -> Send a UE context Release Command to eNB.
* TODO * TODO
*/ */
s1ap_mme_generate_ue_context_release_command(ue_ref);
// UE context will be removed when receiving UE_CONTEXT_RELEASE_COMPLETE
} else { } else {
// TODO // TODO
return -1; return -1;
...@@ -888,15 +893,15 @@ int s1ap_handle_create_session_response(SgwCreateSessionResponse ...@@ -888,15 +893,15 @@ int s1ap_handle_create_session_response(SgwCreateSessionResponse
initialContextSetupRequest_p->eNB_UE_S1AP_ID = ue_ref->eNB_ue_s1ap_id; initialContextSetupRequest_p->eNB_UE_S1AP_ID = ue_ref->eNB_ue_s1ap_id;
/* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */ /* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */
// asn_int642INTEGER( asn_int642INTEGER(
// &initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL, &initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL,
// 100000000UL); 100000000UL);
// asn_int642INTEGER( asn_int642INTEGER(
// &initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL, &initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL,
// 50000000UL); 50000000UL);
initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = 100000000UL; //initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = 100000000UL;
initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = 50000000UL; //initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = 50000000UL;
e_RABToBeSetup.e_RAB_ID = e_RABToBeSetup.e_RAB_ID =
session_response_p->bearer_context_created.eps_bearer_id; /* ??? */ session_response_p->bearer_context_created.eps_bearer_id; /* ??? */
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include "s1ap_common.h" #include "s1ap_common.h"
#include "s1ap_ies_defs.h" #include "s1ap_ies_defs.h"
#include "s1ap_mme_encoder.h" #include "s1ap_mme_encoder.h"
...@@ -211,7 +212,7 @@ int s1ap_generate_downlink_nas_transport(const uint32_t ue_id, void * const data ...@@ -211,7 +212,7 @@ int s1ap_generate_downlink_nas_transport(const uint32_t ue_id, void * const data
/* If the UE-associated logical S1-connection is not established, /* If the UE-associated logical S1-connection is not established,
* the MME shall allocate a unique MME UE S1AP ID to be used for the UE. * the MME shall allocate a unique MME UE S1AP ID to be used for the UE.
*/ */
DevMessage("This case is not handled right now\n"); S1AP_DEBUG("Unknown UE MME ID %08X, This case is not handled right now\n", ue_id);
return -1; return -1;
} else { } else {
...@@ -580,8 +581,8 @@ void s1ap_handle_conn_est_cnf(const mme_app_connection_establishment_cnf_t * con ...@@ -580,8 +581,8 @@ void s1ap_handle_conn_est_cnf(const mme_app_connection_establishment_cnf_t * con
initialContextSetupRequest_p->eNB_UE_S1AP_ID = (unsigned long)ue_ref->eNB_ue_s1ap_id; initialContextSetupRequest_p->eNB_UE_S1AP_ID = (unsigned long)ue_ref->eNB_ue_s1ap_id;
/* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */ /* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */
initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = conn_est_cnf_pP->ambr.br_dl; asn_uint642INTEGER(&initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL, conn_est_cnf_pP->ambr.br_dl);
initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = conn_est_cnf_pP->ambr.br_ul; asn_uint642INTEGER(&initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL, conn_est_cnf_pP->ambr.br_ul);
e_RABToBeSetup.e_RAB_ID = conn_est_cnf_pP->eps_bearer_id; //5; e_RABToBeSetup.e_RAB_ID = conn_est_cnf_pP->eps_bearer_id; //5;
e_RABToBeSetup.e_RABlevelQoSParameters.qCI = conn_est_cnf_pP->bearer_qos_qci; e_RABToBeSetup.e_RABlevelQoSParameters.qCI = conn_est_cnf_pP->bearer_qos_qci;
......
...@@ -55,7 +55,7 @@ RB_PROTOTYPE(s1ap_timer_map, s1ap_timer_map_s, entries, ...@@ -55,7 +55,7 @@ RB_PROTOTYPE(s1ap_timer_map, s1ap_timer_map_s, entries,
RB_GENERATE(s1ap_timer_map, s1ap_timer_map_s, entries, RB_GENERATE(s1ap_timer_map, s1ap_timer_map_s, entries,
s1ap_mme_timer_map_compare_id); s1ap_mme_timer_map_compare_id);
inline int s1ap_mme_timer_map_compare_id( int s1ap_mme_timer_map_compare_id(
struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2) struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2)
{ {
if (p1->mme_ue_s1ap_id > 0) { if (p1->mme_ue_s1ap_id > 0) {
......
...@@ -39,7 +39,7 @@ typedef struct s1ap_timer_map_s { ...@@ -39,7 +39,7 @@ typedef struct s1ap_timer_map_s {
RB_ENTRY(s1ap_timer_map_s) entries; RB_ENTRY(s1ap_timer_map_s) entries;
} s1ap_timer_map_t; } s1ap_timer_map_t;
inline int s1ap_mme_timer_map_compare_id( int s1ap_mme_timer_map_compare_id(
struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2); struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2);
int s1ap_handle_timer_expiry(timer_has_expired_t *timer_has_expired); int s1ap_handle_timer_expiry(timer_has_expired_t *timer_has_expired);
......
...@@ -171,7 +171,7 @@ diff -rupN freeDiameter-1.2.0/extensions/dict_s6a/dict_s6a.c freeDiameter-1.2.0. ...@@ -171,7 +171,7 @@ diff -rupN freeDiameter-1.2.0/extensions/dict_s6a/dict_s6a.c freeDiameter-1.2.0.
+ { + {
+ struct dict_avp_data data = { + struct dict_avp_data data = {
+ 493, /* Code */ + 493, /* Code */
+ 0, /* Vendor */ + VENDOR_3GPP_Id, /* Vendor , EURECOM: with FD 1.2.0 does not work if vendor ID is 0 for this AVP*/
+ "Service-Selection", /* Name */ + "Service-Selection", /* Name */
+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ + AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */
+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ + AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */
......
...@@ -117,6 +117,7 @@ typedef struct { ...@@ -117,6 +117,7 @@ typedef struct {
struct dict_object *dataobj_s6a_immediate_response_pref; struct dict_object *dataobj_s6a_immediate_response_pref;
struct dict_object *dataobj_s6a_authentication_info; struct dict_object *dataobj_s6a_authentication_info;
struct dict_object *dataobj_s6a_re_synchronization_info; struct dict_object *dataobj_s6a_re_synchronization_info;
struct dict_object *dataobj_s6a_service_selection;
struct dict_object *dataobj_s6a_ue_srvcc_cap; struct dict_object *dataobj_s6a_ue_srvcc_cap;
/* Handlers */ /* Handlers */
......
...@@ -148,6 +148,9 @@ int s6a_fd_init_dict_objs(void) ...@@ -148,6 +148,9 @@ int s6a_fd_init_dict_objs(void)
CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP,
AVP_BY_NAME_ALL_VENDORS, "Re-Synchronization-Info", AVP_BY_NAME_ALL_VENDORS, "Re-Synchronization-Info",
&s6a_fd_cnf.dataobj_s6a_re_synchronization_info, ENOENT)); &s6a_fd_cnf.dataobj_s6a_re_synchronization_info, ENOENT));
CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP,
AVP_BY_NAME_ALL_VENDORS, "Service-Selection",
&s6a_fd_cnf.dataobj_s6a_service_selection, ENOENT));
CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP,
AVP_BY_NAME_ALL_VENDORS, "UE-SRVCC-Capability", AVP_BY_NAME_ALL_VENDORS, "UE-SRVCC-Capability",
&s6a_fd_cnf.dataobj_s6a_ue_srvcc_cap, ENOENT)); &s6a_fd_cnf.dataobj_s6a_ue_srvcc_cap, ENOENT));
......
...@@ -89,8 +89,7 @@ void *s6a_thread(void *args) ...@@ -89,8 +89,7 @@ void *s6a_thread(void *args)
itti_exit_task(); itti_exit_task();
} break; } break;
default: { default: {
S6A_DEBUG("Unkwnon message ID %d: S6A_DEBUG("Unkwnon message ID %d: %s\n",
%s\n",
ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p)); ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p));
} break; } break;
} }
...@@ -121,8 +120,7 @@ int s6a_init(const mme_config_t *mme_config_p) ...@@ -121,8 +120,7 @@ int s6a_init(const mme_config_t *mme_config_p)
S6A_DEBUG("Initializing freeDiameter core...\n"); S6A_DEBUG("Initializing freeDiameter core...\n");
ret = fd_core_initialize(); ret = fd_core_initialize();
if (ret != 0) { if (ret != 0) {
S6A_ERROR("An error occurred during freeDiameter core library initialization: S6A_ERROR("An error occurred during freeDiameter core library initialization: %d\n",ret);
%d\n",ret);
return ret; return ret;
} else { } else {
S6A_DEBUG("Initializing freeDiameter core done\n"); S6A_DEBUG("Initializing freeDiameter core done\n");
...@@ -130,13 +128,11 @@ int s6a_init(const mme_config_t *mme_config_p) ...@@ -130,13 +128,11 @@ int s6a_init(const mme_config_t *mme_config_p)
S6A_DEBUG("Default ext path: S6A_DEBUG("Default ext path: %s\n", DEFAULT_EXTENSIONS_PATH);
%s\n", DEFAULT_EXTENSIONS_PATH);
ret = fd_core_parseconf(mme_config_p->s6a_config.conf_file); ret = fd_core_parseconf(mme_config_p->s6a_config.conf_file);
if (ret != 0) { if (ret != 0) {
S6A_ERROR("An error occurred during fd_core_parseconf file : S6A_ERROR("An error occurred during fd_core_parseconf file : %s.\n", mme_config_p->s6a_config.conf_file);
%s.\n", mme_config_p->s6a_config.conf_file);
return ret; return ret;
} else { } else {
S6A_DEBUG("fd_core_parseconf done\n"); S6A_DEBUG("fd_core_parseconf done\n");
...@@ -183,8 +179,7 @@ int s6a_init(const mme_config_t *mme_config_p) ...@@ -183,8 +179,7 @@ int s6a_init(const mme_config_t *mme_config_p)
S6A_ERROR("s6a create task\n"); S6A_ERROR("s6a create task\n");
return -1; return -1;
} }
S6A_DEBUG("Initializing S6a interface: S6A_DEBUG("Initializing S6a interface: DONE\n");
DONE\n");
return 0; return 0;
} }
...@@ -155,6 +155,15 @@ int sgw_lite_init(char* config_file_name_pP) ...@@ -155,6 +155,15 @@ int sgw_lite_init(char* config_file_name_pP)
spgw_system("rmmod x_tables > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); spgw_system("rmmod x_tables > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
spgw_system("rmmod nf_conntrack_netlink nfnetlink nf_nat nf_conntrack_ipv4 nf_conntrack > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); spgw_system("rmmod nf_conntrack_netlink nfnetlink nf_nat nf_conntrack_ipv4 nf_conntrack > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe ip_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); spgw_system("modprobe ip_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe iptable_filter", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe iptable_mangle", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe iptable_nat", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe iptable_raw", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe ipt_MASQUERADE", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe ipt_LOG", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe nf_conntrack", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe nf_conntrack_ipv4", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe nf_nat", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("modprobe x_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__); spgw_system("modprobe x_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
spgw_system("sysctl -w net.ipv4.netfilter.ip_conntrack_max=16000", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); spgw_system("sysctl -w net.ipv4.netfilter.ip_conntrack_max=16000", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
spgw_system("sysctl -w net.ipv4.ip_forward=1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__); spgw_system("sysctl -w net.ipv4.ip_forward=1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
......
...@@ -168,7 +168,7 @@ int udp_eNB_create_socket(int port, char *ip_addr, task_id_t task_id) ...@@ -168,7 +168,7 @@ int udp_eNB_create_socket(int port, char *ip_addr, task_id_t task_id)
sin.sin_port = htons(port); sin.sin_port = htons(port);
if (ip_addr == NULL) { if (ip_addr == NULL) {
sin.sin_addr.s_addr = INADDR_ANY; sin.sin_addr.s_addr = inet_addr(INADDR_ANY);
} else { } else {
sin.sin_addr.s_addr = inet_addr(ip_addr); sin.sin_addr.s_addr = inet_addr(ip_addr);
} }
......
# ------- Interfaces definitions
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IP_ADDRESS_FOR_S1_MME = "192.168.12.30";
ENB_IP_NETMASK_FOR_S1_MME = 24;
ENB_INTERFACE_NAME_FOR_S1U = "eth2";
ENB_IP_ADDRESS_FOR_S1U = "192.168.14.30";
ENB_IP_NETMASK_FOR_S1U = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.175";
MME_IP_NETMASK_FOR_S1_MME = 24;
# ------- Interfaces definitions
ENB_INTERFACE_NAME_FOR_S1_MME = "eth2";
ENB_IP_ADDRESS_FOR_S1_MME = "192.168.14.30";
ENB_IP_NETMASK_FOR_S1_MME = 24;
ENB_INTERFACE_NAME_FOR_S1U = "eth2";
ENB_IP_ADDRESS_FOR_S1U = "192.168.14.30";
ENB_IP_NETMASK_FOR_S1U = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.14.162";
MME_IP_NETMASK_FOR_S1_MME = 24;
# ------- Interfaces definitions
ENB_INTERFACE_NAME_FOR_S1_MME = "cpenb0";
ENB_IP_ADDRESS_FOR_S1_MME = "192.168.30.117";
ENB_IP_NETMASK_FOR_S1_MME = 24;
ENB_INTERFACE_NAME_FOR_S1U = "upenb0";
ENB_IP_ADDRESS_FOR_S1U = "192.168.31.117";
ENB_IP_NETMASK_FOR_S1U = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "cpmme0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.30.17";
MME_IP_NETMASK_FOR_S1_MME = 24;
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
REALM = "eur";
# Define the limits of the system in terms of served eNB and served UE.
# When the limits will be reached, overload procedure will take place.
MAXENB = 10;
MAXUE = 100;
RELATIVE_CAPACITY = 10;
# Display statistics about whole system (expressed in seconds)
MME_STATISTIC_TIMER = 60;
# max queue size per task
ITTI_QUEUE_SIZE = 2000000;
# ------- SCTP definitions
# Number of streams to use in input/output
SCTP_INSTREAMS = 32;
SCTP_OUTSTREAMS = 32;
# ------- S1AP definitions
# outcome drop timer value (seconds)
S1AP_OUTCOME_TIMER = 10;
# ------- MME served GUMMEI
# MME code DEFAULT = 0
# size = 8 bits
# maximum of 256 values, comma separated
MME_CODE = 30,56,1,8;
# MME GROUP ID DEFAULT = 0
# size = 16 bits
# maximum of 65535 values, comma separated
MME_GID = 3,4,5,30,8,9,50021;
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = 208.38:0,209.130:4,208.92:1;
# ------- Interfaces definitions
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
SGW_IP_ADDRESS_FOR_S11 = "192.168.12.87";
SGW_IP_NETMASK_FOR_S11 = 24;
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.12.87";
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
PGW_IP_NETMASK_FOR_S5_S8 = 24;
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
PGW_IP_ADDR_FOR_SGI = "192.168.12.87";
PGW_IP_NETMASK_FOR_SGI = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.87";
MME_IP_NETMASK_FOR_S1_MME = 24;
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
MME_IP_ADDRESS_FOR_S11_MME = "192.168.12.87";
MME_IP_NETMASK_FOR_S11_MME = 24;
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
REALM = "eur";
# Define the limits of the system in terms of served eNB and served UE.
# When the limits will be reached, overload procedure will take place.
MAXENB = 10;
MAXUE = 100;
RELATIVE_CAPACITY = 10;
# Display statistics about whole system (expressed in seconds)
MME_STATISTIC_TIMER = 10;
# max queue size per task
ITTI_QUEUE_SIZE = 2000000;
# ------- SCTP definitions
# Number of streams to use in input/output
SCTP_INSTREAMS = 32;
SCTP_OUTSTREAMS = 32;
# ------- S1AP definitions
# outcome drop timer value (seconds)
S1AP_OUTCOME_TIMER = 10;
# ------- MME served GUMMEI
# MME code DEFAULT = 0
# size = 8 bits
# maximum of 256 values, comma separated
MME_CODE = 30,56,1,8;
# MME GROUP ID DEFAULT = 0
# size = 16 bits
# maximum of 65535 values, comma separated
MME_GID = 3,4,5,30,8,9,50021;
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = 208.38:0,209.130:4,208.35:8;
# ------- Interfaces definitions
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
SGW_IP_ADDRESS_FOR_S11 = "192.168.14.162";
SGW_IP_NETMASK_FOR_S11 = 24;
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.14.162";
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
PGW_IP_NETMASK_FOR_S5_S8 = 24;
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
PGW_IP_ADDR_FOR_SGI = "192.168.14.162";
PGW_IP_NETMASK_FOR_SGI = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.30";
MME_IP_NETMASK_FOR_S1_MME = 24;
MME_INTERFACE_NAME_FOR_S11_MME = "eth2";
MME_IP_ADDRESS_FOR_S11_MME = "192.168.14.30";
MME_IP_NETMASK_FOR_S11_MME = 24;
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
REALM = "eur";
# Define the limits of the system in terms of served eNB and served UE.
# When the limits will be reached, overload procedure will take place.
MAXENB = 10;
MAXUE = 100;
RELATIVE_CAPACITY = 10;
# Display statistics about whole system (expressed in seconds)
MME_STATISTIC_TIMER = 10;
# max queue size per task
ITTI_QUEUE_SIZE = 2000000;
# ------- SCTP definitions
# Number of streams to use in input/output
SCTP_INSTREAMS = 32;
SCTP_OUTSTREAMS = 32;
# ------- S1AP definitions
# outcome drop timer value (seconds)
S1AP_OUTCOME_TIMER = 10;
# ------- MME served GUMMEI
# MME code DEFAULT = 0
# size = 8 bits
# maximum of 256 values, comma separated
MME_CODE = 30,56,1,8;
# MME GROUP ID DEFAULT = 0
# size = 16 bits
# maximum of 65535 values, comma separated
MME_GID = 3,4,5,30,8,9,50021;
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = 208.38:0,209.130:4,208.35:8;
# ------- Interfaces definitions
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
SGW_IP_ADDRESS_FOR_S11 = "192.168.14.162";
SGW_IP_NETMASK_FOR_S11 = 24;
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.14.162";
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
PGW_IP_NETMASK_FOR_S5_S8 = 24;
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
PGW_IP_ADDR_FOR_SGI = "192.168.14.162";
PGW_IP_NETMASK_FOR_SGI = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.14.162";
MME_IP_NETMASK_FOR_S1_MME = 24;
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
MME_IP_ADDRESS_FOR_S11_MME = "192.168.14.162";
MME_IP_NETMASK_FOR_S11_MME = 24;
S6A_CONF = "../epc_nas/UTILS/CONF/s6a.conf";
REALM = "eur";
# Define the limits of the system in terms of served eNB and served UE.
# When the limits will be reached, overload procedure will take place.
MAXENB = 10;
MAXUE = 100;
RELATIVE_CAPACITY = 10;
# Display statistics about whole system (expressed in seconds)
MME_STATISTIC_TIMER = 10;
# max queue size per task
ITTI_QUEUE_SIZE = 2000000;
# ------- SCTP definitions
# Number of streams to use in input/output
SCTP_INSTREAMS = 32;
SCTP_OUTSTREAMS = 32;
# ------- S1AP definitions
# outcome drop timer value (seconds)
S1AP_OUTCOME_TIMER = 10;
# ------- MME served GUMMEI
# MME code DEFAULT = 0
# size = 8 bits
# maximum of 256 values, comma separated
MME_CODE = 30,56,1,8;
# MME GROUP ID DEFAULT = 0
# size = 16 bits
# maximum of 65535 values, comma separated
MME_GID = 3,4,5,30,8,9,50021;
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = 208.38:0,209.130:4,208.92:1,208.10:1;
# ------- Interfaces definitions
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
SGW_IP_ADDRESS_FOR_S11 = "192.168.12.31";
SGW_IP_NETMASK_FOR_S11 = 24;
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.12.31";
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "eth0";
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.12.31";
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
PGW_INTERFACE_NAME_FOR_S5_S8 = "eth0";
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.12.31";
PGW_IP_NETMASK_FOR_S5_S8 = 24;
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
PGW_IP_ADDR_FOR_SGI = "192.168.12.31";
PGW_IP_NETMASK_FOR_SGI = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.31";
MME_IP_NETMASK_FOR_S1_MME = 24;
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
MME_IP_ADDRESS_FOR_S11_MME = "192.168.12.31";
MME_IP_NETMASK_FOR_S11_MME = 24;
S6A_CONF = "../epc_nas/UTILS/CONF/s6a.conf";
REALM = "eur";
# Define the limits of the system in terms of served eNB and served UE.
# When the limits will be reached, overload procedure will take place.
MAXENB = 10;
MAXUE = 100;
RELATIVE_CAPACITY = 10;
# Display statistics about whole system (expressed in seconds)
MME_STATISTIC_TIMER = 60;
# max queue size per task
ITTI_QUEUE_SIZE = 2000000;
# ------- SCTP definitions
# Number of streams to use in input/output
SCTP_INSTREAMS = 32;
SCTP_OUTSTREAMS = 32;
# ------- S1AP definitions
# outcome drop timer value (seconds)
S1AP_OUTCOME_TIMER = 10;
# ------- MME served GUMMEI
# MME code DEFAULT = 0
# size = 8 bits
# maximum of 256 values, comma separated
MME_CODE = 30,56,1,8;
# MME GROUP ID DEFAULT = 0
# size = 16 bits
# maximum of 65535 values, comma separated
MME_GID = 3,4,5,30,8,9,50021;
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = 208.38:0,209.130:4,208.92:1,208.10:1;
# ------- Interfaces definitions
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
SGW_IP_ADDRESS_FOR_S11 = "192.168.12.86";
SGW_IP_NETMASK_FOR_S11 = 24;
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.12.86";
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "eth0";
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.12.86";
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
PGW_INTERFACE_NAME_FOR_S5_S8 = "eth0";
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.12.86";
PGW_IP_NETMASK_FOR_S5_S8 = 24;
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
PGW_IP_ADDR_FOR_SGI = "192.168.12.86";
PGW_IP_NETMASK_FOR_SGI = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.86";
MME_IP_NETMASK_FOR_S1_MME = 24;
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
MME_IP_ADDRESS_FOR_S11_MME = "192.168.12.86";
MME_IP_NETMASK_FOR_S11_MME = 24;
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
REALM = "eur";
# Define the limits of the system in terms of served eNB and served UE.
# When the limits will be reached, overload procedure will take place.
MAXENB = 10;
MAXUE = 100;
RELATIVE_CAPACITY = 10;
# Display statistics about whole system (expressed in seconds)
MME_STATISTIC_TIMER = 10;
# max queue size per task
ITTI_QUEUE_SIZE = 2000000;
# ------- SCTP definitions
# Number of streams to use in input/output
SCTP_INSTREAMS = 32;
SCTP_OUTSTREAMS = 32;
# ------- S1AP definitions
# outcome drop timer value (seconds)
S1AP_OUTCOME_TIMER = 10;
# ------- MME served GUMMEI
# MME code DEFAULT = 0
# size = 8 bits
# maximum of 256 values, comma separated
MME_CODE = 30,56,1,8;
# MME GROUP ID DEFAULT = 0
# size = 16 bits
# maximum of 65535 values, comma separated
MME_GID = 3,4,5,30,8,9,50021;
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = 208.38:0,209.130:4,208.35:8;
# ------- Interfaces definitions
SGW_INTERFACE_NAME_FOR_S11 = "s11sgw";
SGW_IP_ADDRESS_FOR_S11 = "192.168.33.17";
SGW_IP_NETMASK_FOR_S11 = 24;
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "upsgw0";
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.31.17";
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
PGW_IP_NETMASK_FOR_S5_S8 = 24;
PGW_INTERFACE_NAME_FOR_SGI = "eth2";
PGW_IP_ADDR_FOR_SGI = "192.168.13.17";
PGW_IP_NETMASK_FOR_SGI = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "cpmme0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.30.17";
MME_IP_NETMASK_FOR_S1_MME = 24;
MME_INTERFACE_NAME_FOR_S11_MME = "s11mme";
MME_IP_ADDRESS_FOR_S11_MME = "192.168.33.117";
MME_IP_NETMASK_FOR_S11_MME = 24;
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
REALM = "eur";
# Define the limits of the system in terms of served eNB and served UE.
# When the limits will be reached, overload procedure will take place.
MAXENB = 10;
MAXUE = 100;
RELATIVE_CAPACITY = 10;
# Display statistics about whole system (expressed in seconds)
MME_STATISTIC_TIMER = 10;
# max queue size per task
ITTI_QUEUE_SIZE = 2000000;
# ------- SCTP definitions
# Number of streams to use in input/output
SCTP_INSTREAMS = 32;
SCTP_OUTSTREAMS = 32;
# ------- S1AP definitions
# outcome drop timer value (seconds)
S1AP_OUTCOME_TIMER = 10;
# ------- MME served GUMMEI
# MME code DEFAULT = 0
# size = 8 bits
# maximum of 256 values, comma separated
MME_CODE = 30,56,1,8;
# MME GROUP ID DEFAULT = 0
# size = 16 bits
# maximum of 65535 values, comma separated
MME_GID = 3,4,5,30,8,9,50021;
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = 208.38:0,209.130:4,208.35:8;
# ------- Interfaces definitions
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
SGW_IP_ADDRESS_FOR_S11 = "192.168.14.162";
SGW_IP_NETMASK_FOR_S11 = 24;
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.14.162";
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
PGW_IP_NETMASK_FOR_S5_S8 = 24;
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
PGW_IP_ADDR_FOR_SGI = "192.168.14.162";
PGW_IP_NETMASK_FOR_SGI = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.175";
MME_IP_NETMASK_FOR_S1_MME = 24;
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
MME_IP_ADDRESS_FOR_S11_MME = "192.168.12.175";
MME_IP_NETMASK_FOR_S11_MME = 24;
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
REALM = "eur";
# Define the limits of the system in terms of served eNB and served UE.
# When the limits will be reached, overload procedure will take place.
MAXENB = 10;
MAXUE = 100;
RELATIVE_CAPACITY = 10;
# Display statistics about whole system (expressed in seconds)
MME_STATISTIC_TIMER = 10;
# max queue size per task
ITTI_QUEUE_SIZE = 2000000;
# ------- SCTP definitions
# Number of streams to use in input/output
SCTP_INSTREAMS = 32;
SCTP_OUTSTREAMS = 32;
# ------- S1AP definitions
# outcome drop timer value (seconds)
S1AP_OUTCOME_TIMER = 10;
# ------- MME served GUMMEI
# MME code DEFAULT = 0
# size = 8 bits
# maximum of 256 values, comma separated
MME_CODE = 30,56,1,8;
# MME GROUP ID DEFAULT = 0
# size = 16 bits
# maximum of 65535 values, comma separated
MME_GID = 3,4,5,30,8,9,50021;
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
# max values = 999.999:65535
# maximum of 32 values, comma separated
PLMN = 208.38:0,209.130:4,208.35:8;
# ------- Interfaces definitions
SGW_INTERFACE_NAME_FOR_S11 = "s11sgw";
SGW_IP_ADDRESS_FOR_S11 = "192.168.33.17";
SGW_IP_NETMASK_FOR_S11 = 24;
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "upsgw0";
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.31.17";
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
PGW_IP_NETMASK_FOR_S5_S8 = 24;
PGW_INTERFACE_NAME_FOR_SGI = "eth2";
PGW_IP_ADDR_FOR_SGI = "192.168.13.17";
PGW_IP_NETMASK_FOR_SGI = 24;
MME_INTERFACE_NAME_FOR_S1_MME = "cpmme0";
MME_IP_ADDRESS_FOR_S1_MME = "192.168.30.17";
MME_IP_NETMASK_FOR_S1_MME = 24;
MME_INTERFACE_NAME_FOR_S11_MME = "s11mme";
MME_IP_ADDRESS_FOR_S11_MME = "192.168.33.117";
MME_IP_NETMASK_FOR_S11_MME = 24;
# -------- Local ---------
# Uncomment if the framework cannot resolv it.
Identity = "@MME_FQDN@";
Realm = "@REALM@";
# TLS configuration (see previous section)
TLS_Cred = "${FREEDIAMETER_PATH}/../etc/freeDiameter/mme.cert.pem",
"${FREEDIAMETER_PATH}/../etc/freeDiameter/mme.key.pem";
TLS_CA = "${FREEDIAMETER_PATH}/../etc/freeDiameter/mme.cacert.pem";
# Disable use of TCP protocol (only listen and connect in SCTP)
# Default : TCP enabled
@TRANSPORT_option@;
# This option is ignored if freeDiameter is compiled with DISABLE_SCTP option.
# Prefer TCP instead of SCTP for establishing new connections.
# This setting may be overwritten per peer in peer configuration blocs.
# Default : SCTP is attempted first.
@TRANSPORT_PREFER_TCP_option@;
No_IPv6;
# Overwrite the number of SCTP streams. This value should be kept low,
# especially if you are using TLS over SCTP, because it consumes a lot of
# resources in that case. See tickets 19 and 27 for some additional details on
# this.
# Limit the number of SCTP streams
SCTP_streams = 3;
# By default, freeDiameter acts as a Diameter Relay Agent by forwarding all
# messages it cannot handle locally. This parameter disables this behavior.
NoRelay;
TLS_old_method;
AppServThreads = 1;
# Specify the addresses on which to bind the listening server. This must be
# specified if the framework is unable to auto-detect these addresses, or if the
# auto-detected values are incorrect. Note that the list of addresses is sent
# in CER or CEA message, so one should pay attention to this parameter if some
# adresses should be kept hidden.
@ListenOn@
@DIAMETER_PORT@;
@DIAMETER_SEC_PORT@;
# -------- Extensions ---------
# Uncomment (and create rtd.conf) to specify routing table for this peer.
#LoadExtension = "rt_default.fdx" : "rtd.conf";
# Uncomment (and create acl.conf) to allow incoming connections from other peers.
#LoadExtension = "acl_wl.fdx" : "acl.conf";
# Uncomment to display periodic state information
#LoadExtension = "dbg_monitor.fdx";
# Uncomment to enable an interactive Python interpreter session.
# (see doc/dbg_interactive.py.sample for more information)
#LoadExtension = "dbg_interactive.fdx";
# Load the RFC4005 dictionary objects
#LoadExtension = "dict_nasreq.fdx";
LoadExtension = "dict_nas_mipv6.fdx";
LoadExtension = "dict_s6a.fdx";
# Load RFC4072 dictionary objects
#LoadExtension = "dict_eap.fdx";
# Load the Diameter EAP server extension (requires diameap.conf)
#LoadExtension = "app_diameap.fdx" : "diameap.conf";
# Load the Accounting Server extension (requires app_acct.conf)
#LoadExtension = "app_acct.fdx" : "app_acct.conf";
# -------- Peers ---------
# The framework will actively attempt to establish and maintain a connection
# with the peers listed here.
# For only accepting incoming connections, see the acl_wl.fx extension.
# ConnectPeer
# Declare a remote peer to which this peer must maintain a connection.
# In addition, this allows specifying non-default parameters for this peer only
# (for example disable SCTP with this peer, or use RFC3588-flavour TLS).
# Note that by default, if a peer is not listed as a ConnectPeer entry, an
# incoming connection from this peer will be rejected. If you want to accept
# incoming connections from other peers, see the acl_wl.fdx? extension which
# allows exactly this.
@ConnectPeer@ = "@HSS_FQDN@" { ConnectTo = "@HSS_IP@"; No_IPv6; No_TLS ; port = 3868; Realm = "@REALM@"; };
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