From 346d66d2fd8cb86d1ffa42712ce3e2d06a16cae0 Mon Sep 17 00:00:00 2001 From: Cedric Roux <cedric.roux@eurecom.fr> Date: Tue, 3 Dec 2013 15:36:01 +0000 Subject: [PATCH] - Use MME global config for NAS parameters git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4568 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- .../NAS/EURECOM-NAS/src/api/mme/mme_api.c | 14 ++++ .../NAS/EURECOM-NAS/src/api/mme/mme_api.h | 7 ++ openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c | 15 +++- openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.h | 8 +++ openair-cn/NAS/EURECOM-NAS/src/nas_network.c | 8 +++ openair-cn/NAS/EURECOM-NAS/src/nas_network.h | 9 +++ openair-cn/NAS/EURECOM-NAS/src/nas_proc.c | 15 ++++ openair-cn/NAS/EURECOM-NAS/src/nas_proc.h | 8 +++ openair-cn/NAS/nas_defs.h | 2 +- openair-cn/NAS/nas_main.c | 8 ++- openair-cn/UTILS/mme_config.c | 69 ++++++++++--------- openair-cn/UTILS/mme_config.h | 3 + openair-cn/UTILS/mme_parser.y | 22 ++++++ openair-cn/UTILS/mme_scanner.l | 2 + 14 files changed, 154 insertions(+), 36 deletions(-) diff --git a/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.c b/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.c index cfb0163e9b..3615378462 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.c +++ b/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.c @@ -222,7 +222,11 @@ static int _mme_api_pdn_id = 0; ** Others: None ** ** ** ***************************************************************************/ +#if defined(EPC_BUILD) +int mme_api_get_emm_config(mme_api_emm_config_t* config, mme_config_t *mme_config_p) +#else int mme_api_get_emm_config(mme_api_emm_config_t* config) +#endif { LOG_FUNC_IN; @@ -234,7 +238,17 @@ int mme_api_get_emm_config(mme_api_emm_config_t* config) config->gummei.plmn.MNCdigit3 = 0xf; config->gummei.MMEgid = MME_API_MME_GID; config->gummei.MMEcode = MME_API_MME_CODE; +#if defined(EPC_BUILD) + /* SR: this config param comes from MME global config */ + if (mme_config_p->emergency_attach_supported != 0) { + config->features |= MME_API_EMERGENCY_ATTACH; + } + if (mme_config_p->unauthenticated_imsi_supported != 0) { + config->features |= MME_API_UNAUTHENTICATED_IMSI; + } +#else config->features = MME_API_EMERGENCY_ATTACH | MME_API_UNAUTHENTICATED_IMSI; +#endif LOG_FUNC_RETURN (RETURNok); } diff --git a/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.h b/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.h index ee6d0e540d..4f87228f8f 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.h +++ b/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.h @@ -22,6 +22,9 @@ Description Implements the API used by the NAS layer running in the MME #define __MME_API_H__ #ifdef NAS_MME +# if defined(EPC_BUILD) +# include "mme_config.h" +# endif #include "commonDef.h" #include "securityDef.h" #include "OctetString.h" @@ -89,7 +92,11 @@ typedef struct { /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ +#if defined(EPC_BUILD) +int mme_api_get_emm_config(mme_api_emm_config_t* config, mme_config_t *mme_config_p); +#else int mme_api_get_emm_config(mme_api_emm_config_t* config); +#endif int mme_api_get_esm_config(mme_api_esm_config_t* config); int mme_api_identify_guti(const GUTI_t* guti, auth_vector_t* vector); diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c index b9171d1d96..a5a833554c 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c @@ -33,6 +33,10 @@ Description Defines the EPS Mobility Management procedure call manager, #include <stdlib.h> // malloc, free #endif +#if defined(EPC_BUILD) && defined(NAS_MME) +# include "mme_config.h" +#endif + /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ @@ -382,12 +386,21 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei) ** Others: _emm_data ** ** ** ***************************************************************************/ +#if defined(EPC_BUILD) +void emm_main_initialize(mme_config_t *mme_config_p) +#else void emm_main_initialize(void) +#endif { LOG_FUNC_IN; /* Retreive MME supported configuration data */ - if (mme_api_get_emm_config(&_emm_data.conf) != RETURNok) { +#if defined(EPC_BUILD) + if (mme_api_get_emm_config(&_emm_data.conf, mme_config_p) != RETURNok) +#else + if (mme_api_get_emm_config(&_emm_data.conf) != RETURNok) +#endif + { LOG_TRACE(ERROR, "EMM-MAIN - Failed to get MME configuration data"); } diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.h b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.h index eae046373f..d1658e6e49 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.h +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.h @@ -21,6 +21,10 @@ Description Defines the EPS Mobility Management procedure call manager, #ifndef __EMM_MAIN_H__ #define __EMM_MAIN_H__ +#if defined(EPC_BUILD) +# include "mme_config.h" +#endif + #include "commonDef.h" #include "networkDef.h" @@ -44,7 +48,11 @@ Description Defines the EPS Mobility Management procedure call manager, void emm_main_initialize(emm_indication_callback_t cb, const char *imei); #endif #ifdef NAS_MME +# if defined(EPC_BUILD) +void emm_main_initialize(mme_config_t *mme_config_p); +# else void emm_main_initialize(void); +# endif #endif void emm_main_cleanup(void); diff --git a/openair-cn/NAS/EURECOM-NAS/src/nas_network.c b/openair-cn/NAS/EURECOM-NAS/src/nas_network.c index 52bc5ffaa2..6898bc1f24 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/nas_network.c +++ b/openair-cn/NAS/EURECOM-NAS/src/nas_network.c @@ -51,13 +51,21 @@ Description NAS procedure functions triggered by the network ** Others: None ** ** ** ***************************************************************************/ +#if defined(EPC_BUILD) && defined(NAS_MME) +void nas_network_initialize(mme_config_t *mme_config_p) +#else void nas_network_initialize(void) +#endif { LOG_FUNC_IN; #ifdef NAS_MME /* Initialize the internal NAS processing data */ +# if defined(EPC_BUILD) + nas_proc_initialize(mme_config_p); +# else nas_proc_initialize(); +# endif #endif LOG_FUNC_OUT; diff --git a/openair-cn/NAS/EURECOM-NAS/src/nas_network.h b/openair-cn/NAS/EURECOM-NAS/src/nas_network.h index 608aadad43..32831b6254 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/nas_network.h +++ b/openair-cn/NAS/EURECOM-NAS/src/nas_network.h @@ -17,6 +17,11 @@ Author Frederic Maurel Description NAS procedure functions triggered by the network *****************************************************************************/ + +#if defined(EPC_BUILD) && defined(NAS_MME) +# include "mme_config.h" +#endif + #ifndef __NAS_NETWORK_H__ #define __NAS_NETWORK_H__ @@ -36,7 +41,11 @@ 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 ******************/ /****************************************************************************/ +#if defined(EPC_BUILD) && defined(NAS_MME) +void nas_network_initialize(mme_config_t *mme_config_p); +#else void nas_network_initialize(void); +#endif void nas_network_cleanup(void); diff --git a/openair-cn/NAS/EURECOM-NAS/src/nas_proc.c b/openair-cn/NAS/EURECOM-NAS/src/nas_proc.c index 2f88b016cc..c7728d8df8 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/nas_proc.c +++ b/openair-cn/NAS/EURECOM-NAS/src/nas_proc.c @@ -115,6 +115,20 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb, ** Others: None ** ** ** ***************************************************************************/ +# if defined(EPC_BUILD) +void nas_proc_initialize(mme_config_t *mme_config_p) +{ + LOG_FUNC_IN; + + /* Initialize the EMM procedure manager */ + emm_main_initialize(mme_config_p); + + /* Initialize the ESM procedure manager */ + esm_main_initialize(); + + LOG_FUNC_OUT; +} +# else void nas_proc_initialize(void) { LOG_FUNC_IN; @@ -127,6 +141,7 @@ void nas_proc_initialize(void) LOG_FUNC_OUT; } +# endif #endif /**************************************************************************** diff --git a/openair-cn/NAS/EURECOM-NAS/src/nas_proc.h b/openair-cn/NAS/EURECOM-NAS/src/nas_proc.h index 3d0a022dcf..205e76e4dc 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/nas_proc.h +++ b/openair-cn/NAS/EURECOM-NAS/src/nas_proc.h @@ -20,6 +20,10 @@ Description NAS procedure call manager #ifndef __NAS_PROC_H__ #define __NAS_PROC_H__ +#if defined(EPC_BUILD) +# include "mme_config.h" +#endif + #include "commonDef.h" #include "networkDef.h" @@ -44,7 +48,11 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb, esm_indication_callback_t esm_cb, const char *imei); #endif #ifdef NAS_MME +# if defined(EPC_BUILD) +void nas_proc_initialize(mme_config_t *mme_config_p); +# else void nas_proc_initialize(void); +# endif #endif void nas_proc_cleanup(void); diff --git a/openair-cn/NAS/nas_defs.h b/openair-cn/NAS/nas_defs.h index c60a1b6bc6..99a15998b5 100644 --- a/openair-cn/NAS/nas_defs.h +++ b/openair-cn/NAS/nas_defs.h @@ -1,6 +1,6 @@ #ifndef NAS_DEFS_H_ #define NAS_DEFS_H_ -int nas_init(const mme_config_t *mme_config_p); +int nas_init(mme_config_t *mme_config_p); #endif /* NAS_DEFS_H_ */ diff --git a/openair-cn/NAS/nas_main.c b/openair-cn/NAS/nas_main.c index 0f5ad9a7c0..7612c31561 100644 --- a/openair-cn/NAS/nas_main.c +++ b/openair-cn/NAS/nas_main.c @@ -10,6 +10,7 @@ #include "nas_defs.h" #if !defined(DISABLE_USE_NAS) +# include "nas_network.h" # include "nas_proc.h" # include "emm_main.h" # include "nas_log.h" @@ -92,7 +93,7 @@ next_message: } break; case NAS_DOWNLINK_DATA_CNF: { - nas_proc_dl_transfer_cnf(NAS_DL_DATA_CNF(received_message_p).UEid); +// nas_proc_dl_transfer_cnf(NAS_DL_DATA_CNF(received_message_p).UEid); } break; #endif @@ -112,12 +113,13 @@ next_message: return NULL; } -int nas_init(const mme_config_t *mme_config_p) +int nas_init(mme_config_t *mme_config_p) { NAS_DEBUG("Initializing NAS task interface\n"); + #if !defined(DISABLE_USE_NAS) nas_log_init(LOG_DEBUG); - emm_main_initialize(); + nas_network_initialize(mme_config_p); #endif if (itti_create_task(TASK_NAS, &nas_intertask_interface, diff --git a/openair-cn/UTILS/mme_config.c b/openair-cn/UTILS/mme_config.c index 04366aa605..6bbb8d566f 100644 --- a/openair-cn/UTILS/mme_config.c +++ b/openair-cn/UTILS/mme_config.c @@ -53,10 +53,14 @@ void config_init(mme_config_t *mme_config_p) pthread_rwlock_init(&mme_config_p->rw_lock, NULL); - mme_config_p->verbosity_level = 0; - mme_config_p->config_file = NULL; - mme_config_p->max_eNBs = MAX_NUMBER_OF_ENB; - mme_config_p->max_ues = MAX_NUMBER_OF_UE; + mme_config_p->verbosity_level = 0; + mme_config_p->config_file = NULL; + mme_config_p->max_eNBs = MAX_NUMBER_OF_ENB; + mme_config_p->max_ues = MAX_NUMBER_OF_UE; + + mme_config_p->emergency_attach_supported = 0; + mme_config_p->unauthenticated_imsi_supported = 0; + /* Timer configuration */ mme_config_p->gtpv1u_config.port_number = GTPV1_U_PORT_NUMBER; mme_config_p->s1ap_config.port_number = S1AP_PORT_NUMBER; @@ -167,55 +171,58 @@ static void config_display(mme_config_t *mme_config_p) { fprintf(stdout, "==== EURECOM %s v%s ====\n", PACKAGE_NAME, PACKAGE_VERSION); fprintf(stdout, "Configuration:\n"); - fprintf(stdout, "- File .............: %s\n", mme_config_p->config_file); - fprintf(stdout, "- Verbosity level ..: %d\n", mme_config_p->verbosity_level); - fprintf(stdout, "- Realm ............: %s\n", mme_config_p->realm); - fprintf(stdout, "- Max eNBs .........: %u\n", mme_config_p->max_eNBs); - fprintf(stdout, "- Max UEs ..........: %u\n", mme_config_p->max_ues); - fprintf(stdout, "- Relative capa ....: %u\n\n", mme_config_p->relative_capacity); - fprintf(stdout, "- Statistics timer .: %u (seconds)\n\n", mme_config_p->mme_statistic_timer); + fprintf(stdout, "- File ...............: %s\n", mme_config_p->config_file); + fprintf(stdout, "- Verbosity level ....: %d\n", mme_config_p->verbosity_level); + fprintf(stdout, "- Realm ..............: %s\n", mme_config_p->realm); + fprintf(stdout, "- Max eNBs ...........: %u\n", mme_config_p->max_eNBs); + fprintf(stdout, "- Max UEs ............: %u\n", mme_config_p->max_ues); + fprintf(stdout, "- Emergency support ..: %s\n", mme_config_p->emergency_attach_supported == 0 ? "FALSE" : "TRUE"); + fprintf(stdout, "- Unauth IMSI support : %s\n", mme_config_p->unauthenticated_imsi_supported == 0 ? "FALSE" : "TRUE"); + fprintf(stdout, "- Max UEs ............: %u\n", mme_config_p->max_ues); + fprintf(stdout, "- Relative capa ......: %u\n\n", mme_config_p->relative_capacity); + fprintf(stdout, "- Statistics timer ...: %u (seconds)\n\n", mme_config_p->mme_statistic_timer); fprintf(stdout, "- S1-U:\n"); - fprintf(stdout, " port number ....: %d\n", mme_config_p->gtpv1u_config.port_number); + fprintf(stdout, " port number ......: %d\n", mme_config_p->gtpv1u_config.port_number); fprintf(stdout, "- S1-MME:\n"); - fprintf(stdout, " port number ....: %d\n", mme_config_p->s1ap_config.port_number); + fprintf(stdout, " port number ......: %d\n", mme_config_p->s1ap_config.port_number); fprintf(stdout, "- IP:\n"); - fprintf(stdout, " s1-u iface .....: %s\n", mme_config_p->ipv4.sgw_interface_name_for_S1u_S12_S4_up); - fprintf(stdout, " s1-u ip ........: %s/%d\n", + fprintf(stdout, " s1-u iface .......: %s\n", mme_config_p->ipv4.sgw_interface_name_for_S1u_S12_S4_up); + fprintf(stdout, " s1-u ip ..........: %s/%d\n", inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.sgw_ip_address_for_S1u_S12_S4_up)), mme_config_p->ipv4.sgw_ip_netmask_for_S1u_S12_S4_up); - fprintf(stdout, " sgi iface ......: %s\n", mme_config_p->ipv4.pgw_interface_name_for_SGI); - fprintf(stdout, " sgi ip .........: %s/%d\n", + fprintf(stdout, " sgi iface ........: %s\n", mme_config_p->ipv4.pgw_interface_name_for_SGI); + fprintf(stdout, " sgi ip ...........: %s/%d\n", inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.pgw_ip_addr_for_SGI)), mme_config_p->ipv4.pgw_ip_netmask_for_SGI); - fprintf(stdout, " s1-MME iface ...: %s\n", mme_config_p->ipv4.mme_interface_name_for_S1_MME); - fprintf(stdout, " s1-MME ip ......: %s/%d\n", + fprintf(stdout, " s1-MME iface .....: %s\n", mme_config_p->ipv4.mme_interface_name_for_S1_MME); + fprintf(stdout, " s1-MME ip ........: %s/%d\n", inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.mme_ip_address_for_S1_MME)), mme_config_p->ipv4.mme_ip_netmask_for_S1_MME); - fprintf(stdout, " s11 S-GW iface .: %s\n", mme_config_p->ipv4.sgw_interface_name_for_S11); - fprintf(stdout, " s11 S-GW ip ....: %s/%d\n", + fprintf(stdout, " s11 S-GW iface ...: %s\n", mme_config_p->ipv4.sgw_interface_name_for_S11); + fprintf(stdout, " s11 S-GW ip ......: %s/%d\n", inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.sgw_ip_address_for_S11)), mme_config_p->ipv4.sgw_ip_netmask_for_S11); - fprintf(stdout, " s11 MME iface ..: %s\n", mme_config_p->ipv4.mme_interface_name_for_S11); - fprintf(stdout, " s11 S-GW ip ....: %s/%d\n", + fprintf(stdout, " s11 MME iface ....: %s\n", mme_config_p->ipv4.mme_interface_name_for_S11); + fprintf(stdout, " s11 S-GW ip ......: %s/%d\n", inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.mme_ip_address_for_S11)), mme_config_p->ipv4.mme_ip_netmask_for_S11); fprintf(stdout, "- ITTI:\n"); - fprintf(stdout, " queue size .....: %u (bytes)\n", mme_config_p->itti_config.queue_size); - fprintf(stdout, " log file .......: %s\n", mme_config_p->itti_config.log_file); + fprintf(stdout, " queue size .......: %u (bytes)\n", mme_config_p->itti_config.queue_size); + fprintf(stdout, " log file .........: %s\n", mme_config_p->itti_config.log_file); fprintf(stdout, "- SCTP:\n"); - fprintf(stdout, " in streams .....: %u\n", mme_config_p->sctp_config.in_streams); - fprintf(stdout, " out streams ....: %u\n", mme_config_p->sctp_config.out_streams); + fprintf(stdout, " in streams .......: %u\n", mme_config_p->sctp_config.in_streams); + fprintf(stdout, " out streams ......: %u\n", mme_config_p->sctp_config.out_streams); fprintf(stdout, "- GUMMEI:\n"); - fprintf(stdout, " mme group ids ..:\n "); + fprintf(stdout, " mme group ids ....:\n "); DISPLAY_ARRAY(mme_config_p->gummei.nb_mme_gid, "| %u ", mme_config_p->gummei.mme_gid[i]); - fprintf(stdout, " mme codes ......:\n "); + fprintf(stdout, " mme codes ........:\n "); DISPLAY_ARRAY(mme_config_p->gummei.nb_mmec, "| %u ", mme_config_p->gummei.mmec[i]); - fprintf(stdout, " plmns ..........: (mcc.mnc:tac)\n "); + fprintf(stdout, " plmns ............: (mcc.mnc:tac)\n "); DISPLAY_ARRAY(mme_config_p->gummei.nb_plmns, "| %3u.%3u:%u ", mme_config_p->gummei.plmn_mcc[i], mme_config_p->gummei.plmn_mnc[i], mme_config_p->gummei.plmn_tac[i]); fprintf(stdout, "- S6A:\n"); - fprintf(stdout, " conf file ......: %s\n", mme_config_p->s6a_config.conf_file); + fprintf(stdout, " conf file ........: %s\n", mme_config_p->s6a_config.conf_file); } static void usage(void) diff --git a/openair-cn/UTILS/mme_config.h b/openair-cn/UTILS/mme_config.h index 0c8501d908..0dd5f3eaaf 100644 --- a/openair-cn/UTILS/mme_config.h +++ b/openair-cn/UTILS/mme_config.h @@ -53,6 +53,9 @@ typedef struct mme_config_s { uint32_t mme_statistic_timer; + uint8_t emergency_attach_supported; + uint8_t unauthenticated_imsi_supported; + struct { uint16_t nb_mme_gid; uint16_t *mme_gid; diff --git a/openair-cn/UTILS/mme_parser.y b/openair-cn/UTILS/mme_parser.y index 2fcd78fa39..ceaedeb8e4 100644 --- a/openair-cn/UTILS/mme_parser.y +++ b/openair-cn/UTILS/mme_parser.y @@ -41,6 +41,8 @@ int fddlex(YYSTYPE *lvalp, YYLTYPE *llocp); %token <string> QSTRING %token <integer> INTEGER +%token EMERGENCY_ATTACH_SUPPORTED +%token UNAUTHENTICATED_IMSI_SUPPORTED %token S6A_CONF %token MAX_UE %token MAX_ENB @@ -79,6 +81,8 @@ int fddlex(YYSTYPE *lvalp, YYLTYPE *llocp); %% conffile: /* If options not provided, we will default values */ | conffile s6aconf + | conffile emergency_attach_supported + | conffile unauthenticated_imsi_supported | conffile maxenb | conffile maxue | conffile mmec @@ -119,6 +123,24 @@ conffile: /* If options not provided, we will default values */ } ; +emergency_attach_supported: EMERGENCY_ATTACH_SUPPORTED '=' INTEGER ';' + { + if ($3 != 0 && $3 != 1) { + yyerror(&yylloc, mme_config_p, "Invalid value (possible values are 0 or 1"); + return EINVAL; + } + mme_config_p->emergency_attach_supported = $3; + }; + +unauthenticated_imsi_supported: UNAUTHENTICATED_IMSI_SUPPORTED '=' INTEGER ';' + { + if ($3 != 0 && $3 != 1) { + yyerror(&yylloc, mme_config_p, "Invalid value (possible values are 0 or 1"); + return EINVAL; + } + mme_config_p->unauthenticated_imsi_supported = $3; + }; + mme_statistic_timer: MME_STATISTIC_TIMER '=' INTEGER ';' { if ($3 <= 0) { diff --git a/openair-cn/UTILS/mme_scanner.l b/openair-cn/UTILS/mme_scanner.l index f8b5264ac9..064a13f5f2 100644 --- a/openair-cn/UTILS/mme_scanner.l +++ b/openair-cn/UTILS/mme_scanner.l @@ -79,6 +79,8 @@ qstring \"[^\"\n]*\" } /* Full words tokens (keywords) */ +(?i:"EMERGENCY_ATTACH_SUPPORTED") { return EMERGENCY_ATTACH_SUPPORTED; } +(?i:"UNAUTHENTICATED_IMSI_SUPPORTED") { return UNAUTHENTICATED_IMSI_SUPPORTED; } (?i:"MAXENB") { return MAX_ENB; } (?i:"MAXUE") { return MAX_UE; } (?i:"S6A_CONF") { return S6A_CONF; } -- GitLab