From 88b7be9c2cba6d2a85039258efc281d53708cc69 Mon Sep 17 00:00:00 2001 From: Lionel Gauthier Date: Wed, 8 Oct 2014 13:03:02 +0000 Subject: [PATCH] Ok for MNC 2 and 3 digits, tested wit 208.10 and 310.028 git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5846 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair-cn/MME_APP/mme_app_authentication.c | 31 ++-- .../NAS/EURECOM-NAS/src/api/mme/mme_api.c | 31 +++- openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c | 70 ++++++-- .../VoiceDomainPreferenceAndUeUsageSetting.c | 1 + openair-cn/NAS/EURECOM-NAS/tools/Makefile | 3 +- openair-cn/NAS/EURECOM-NAS/tools/network.h | 26 +-- openair-cn/NAS/EURECOM-NAS/tools/ue_data.c | 149 ++++++++++++++++-- openair-cn/NAS/EURECOM-NAS/tools/usim_data.c | 67 ++++++-- openair-cn/S6A/s6a_auth_info.c | 11 +- openair-cn/S6A/s6a_up_loc.c | 11 +- openair-cn/UTILS/conversions.h | 12 +- openair-cn/UTILS/mcc_mnc_itu.c | 4 +- openair-cn/UTILS/mme_config.c | 40 +++++ openair-cn/UTILS/mme_config.h | 6 + 14 files changed, 379 insertions(+), 83 deletions(-) diff --git a/openair-cn/MME_APP/mme_app_authentication.c b/openair-cn/MME_APP/mme_app_authentication.c index 1e06be4225..ee0e16dc4a 100644 --- a/openair-cn/MME_APP/mme_app_authentication.c +++ b/openair-cn/MME_APP/mme_app_authentication.c @@ -64,7 +64,10 @@ int mme_app_request_authentication_info(const mme_app_imsi_t imsi, message_p = itti_alloc_new_message(TASK_MME_APP, S6A_AUTH_INFO_REQ); auth_info_req = &message_p->ittiMsg.s6a_auth_info_req; - MME_APP_IMSI_TO_STRING(imsi, auth_info_req->imsi); + memset(auth_info_req, 0, sizeof(*auth_info_req)); + + auth_info_req->imsi_length = MME_APP_IMSI_TO_STRING(imsi, auth_info_req->imsi); + 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", __FUNCTION__, @@ -75,11 +78,11 @@ int mme_app_request_authentication_info(const mme_app_imsi_t imsi, auth_info_req->visited_plmn.MNCdigit2, auth_info_req->visited_plmn.MNCdigit3); uint8_t *ptr = (uint8_t *)&auth_info_req->visited_plmn; - MME_APP_DEBUG("%s visited_plmn %X%X%X%X%X%X\n", - __FUNCTION__, - ptr[0], - ptr[1], - ptr[2]); + MME_APP_DEBUG("%s visited_plmn %02X%02X%02X\n", + __FUNCTION__, + ptr[0], + ptr[1], + ptr[2]); auth_info_req->nb_of_vectors = nb_of_vectors; if (auts != NULL) { @@ -273,6 +276,7 @@ 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, @@ -357,9 +361,9 @@ mme_app_handle_nas_auth_param_req( //visited_plmn = &visited_plmn_dongle; visited_plmn = &visited_plmn_from_req; - visited_plmn_from_req.MCCdigit3 = nas_auth_param_req_pP->imsi[0]; + visited_plmn_from_req.MCCdigit1 = nas_auth_param_req_pP->imsi[0]; visited_plmn_from_req.MCCdigit2 = nas_auth_param_req_pP->imsi[1]; - visited_plmn_from_req.MCCdigit1 = 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], nas_auth_param_req_pP->imsi[1], @@ -369,9 +373,9 @@ mme_app_handle_nas_auth_param_req( nas_auth_param_req_pP->imsi[5] ); if (mnc_length == 2) { - visited_plmn_from_req.MNCdigit1 = 0; - visited_plmn_from_req.MNCdigit2 = nas_auth_param_req_pP->imsi[3]; - visited_plmn_from_req.MNCdigit3 = nas_auth_param_req_pP->imsi[4]; + visited_plmn_from_req.MNCdigit1 = nas_auth_param_req_pP->imsi[3]; + visited_plmn_from_req.MNCdigit2 = nas_auth_param_req_pP->imsi[4]; + visited_plmn_from_req.MNCdigit3 = "F"; } else if (mnc_length == 3) { visited_plmn_from_req.MNCdigit1 = nas_auth_param_req_pP->imsi[3]; visited_plmn_from_req.MNCdigit2 = nas_auth_param_req_pP->imsi[4]; @@ -383,7 +387,10 @@ mme_app_handle_nas_auth_param_req( MME_APP_STRING_TO_IMSI(nas_auth_param_req_pP->imsi, &imsi); MME_APP_DEBUG("%s Handling imsi %"IMSI_FORMAT"\n", __FUNCTION__, imsi); - MME_APP_DEBUG("%s Handling imsi from req %s\n", __FUNCTION__, nas_auth_param_req_pP->imsi); + MME_APP_DEBUG("%s Handling imsi from req %s (mnc length %d)\n", + __FUNCTION__, + nas_auth_param_req_pP->imsi, + mnc_length); /* Fetch the context associated with this IMSI */ ue_context = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, imsi); 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 1f5e71981c..4056b18234 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 @@ -48,6 +48,7 @@ Description Implements the API used by the NAS layer running in the MME #include "mme_api.h" #include "nas_log.h" +#include "assertions.h" #include // memcpy @@ -261,15 +262,27 @@ int mme_api_get_emm_config(mme_api_emm_config_t *config) int i; #endif LOG_FUNC_IN; + AssertFatal(mme_config_p->gummei.nb_plmns >= 1, "No PLMN configured"); + AssertFatal(mme_config_p->gummei.nb_mmec >= 1, "No MME Code configured"); + AssertFatal(mme_config_p->gummei.nb_mme_gid >= 1, "No MME Group ID configured"); - config->gummei.plmn.MCCdigit1 = 2; - config->gummei.plmn.MCCdigit2 = 0; - config->gummei.plmn.MCCdigit3 = 8; - config->gummei.plmn.MNCdigit1 = 1; - config->gummei.plmn.MNCdigit2 = 0; - config->gummei.plmn.MNCdigit3 = 0xf; - config->gummei.MMEgid = MME_API_MME_GID; - config->gummei.MMEcode = MME_API_MME_CODE; + config->gummei.plmn.MCCdigit1 = (mme_config_p->gummei.plmn_mcc[0]/100)%10; + config->gummei.plmn.MCCdigit2 = (mme_config_p->gummei.plmn_mcc[0]/10)%10; + config->gummei.plmn.MCCdigit3 = mme_config_p->gummei.plmn_mcc[0]%10; + if (mme_config_p->gummei.plmn_mnc_len[0] == 2) { + config->gummei.plmn.MNCdigit1 = (mme_config_p->gummei.plmn_mnc[0]/10)%10; + config->gummei.plmn.MNCdigit2 = mme_config_p->gummei.plmn_mnc[0]%10; + config->gummei.plmn.MNCdigit3 = 0xf; + } else if (mme_config_p->gummei.plmn_mnc_len[0] == 3) { + config->gummei.plmn.MNCdigit1 = (mme_config_p->gummei.plmn_mnc[0]/100)%10; + config->gummei.plmn.MNCdigit2 = (mme_config_p->gummei.plmn_mnc[0]/10)%10; + config->gummei.plmn.MNCdigit3 = mme_config_p->gummei.plmn_mnc[0]%10; + } else { + AssertFatal((mme_config_p->gummei.plmn_mnc_len[0] >= 2) && + (mme_config_p->gummei.plmn_mnc_len[0] <= 3), "BAD MNC length for GUMMEI"); + } + config->gummei.MMEgid = mme_config_p->gummei.mme_gid[0]; + config->gummei.MMEcode = mme_config_p->gummei.mmec[0]; #if defined(EPC_BUILD) /* SR: this config param comes from MME global config */ if (mme_config_p->emergency_attach_supported != 0) { @@ -371,6 +384,7 @@ int mme_api_identify_imsi(const imsi_t *imsi, auth_vector_t *vector) int rc = RETURNok; LOG_FUNC_IN; + AssertFatal(0, "Hardcoded values"); memcpy(vector->rand, _mme_api_rand, AUTH_RAND_SIZE); memcpy(vector->autn, _mme_api_autn, AUTH_AUTN_SIZE); @@ -435,6 +449,7 @@ int mme_api_new_guti(const imsi_t *imsi, GUTI_t *guti, tac_t *tac, int *n_tacs) static unsigned int tmsi = 1; LOG_FUNC_IN; + AssertFatal(0, "Hardcoded values"); guti->gummei.plmn = mme_api_plmn; guti->gummei.MMEgid = MME_API_MME_GID; diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c b/openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c index b4dae2da93..8e1827279d 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c @@ -75,6 +75,7 @@ Description Defines the attach related EMM procedure executed by the #ifdef NAS_MME #include "mme_api.h" +#include "mme_config.h" # if defined(EPC_BUILD) # include "nas_itti_messaging.h" # endif @@ -2507,6 +2508,7 @@ static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid, int umts_present, int gprs_present, const OctetString *esm_msg) { + int mnc_length; LOG_FUNC_IN; /* UE identifier */ ctx->ueid = ueid; @@ -2538,24 +2540,62 @@ static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid, } } else { if (ctx->guti == NULL) { - ctx->guti = (GUTI_t *)malloc(sizeof(GUTI_t)); + ctx->guti = (GUTI_t *)calloc(1, sizeof(GUTI_t)); } - if (ctx->guti != NULL) { - /* TODO: FIXME */ - LOG_TRACE(WARNING, "EMM-PROC - Assign GUTI hardcoded PLMN 208.92 and tac 15 to emm_data_context"); - ctx->guti->gummei.plmn.MCCdigit1 = 2; - ctx->guti->gummei.plmn.MCCdigit2 = 0; - ctx->guti->gummei.plmn.MCCdigit3 = 8; - ctx->guti->gummei.plmn.MNCdigit1 = 9; - ctx->guti->gummei.plmn.MNCdigit2 = 2; - ctx->guti->gummei.plmn.MNCdigit3 = 15; - ctx->tac = 15; - ctx->guti->gummei.MMEcode = 29; - ctx->guti->gummei.MMEgid = 30; +#warning "LG: We should assign the GUTI accordingly to the visited plmn id" + if ((ctx->guti != NULL) && (imsi)) { + ctx->tac = mme_config.gummei.plmn_tac[0]; + ctx->guti->gummei.MMEcode = mme_config.gummei.mmec[0]; + ctx->guti->gummei.MMEgid = mme_config.gummei.mme_gid[0]; ctx->guti->m_tmsi = (uint32_t) ctx; - LOG_TRACE(WARNING, "EMM-PROC - Set ctx->guti_is_new to emm_data_context"); - ctx->guti_is_new = TRUE; + mnc_length = mme_config_find_mnc_length( + imsi->u.num.digit1, + imsi->u.num.digit2, + imsi->u.num.digit3, + imsi->u.num.digit4, + imsi->u.num.digit5, + imsi->u.num.digit6); + + if ((mnc_length == 2) || (mnc_length == 3)) { + ctx->guti->gummei.plmn.MCCdigit1 = imsi->u.num.digit1; + ctx->guti->gummei.plmn.MCCdigit2 = imsi->u.num.digit2; + ctx->guti->gummei.plmn.MCCdigit3 = imsi->u.num.digit3; + if (mnc_length == 2) { + ctx->guti->gummei.plmn.MNCdigit1 = imsi->u.num.digit5; + ctx->guti->gummei.plmn.MNCdigit2 = imsi->u.num.digit6; + ctx->guti->gummei.plmn.MNCdigit3 = 15; + LOG_TRACE(WARNING, "EMM-PROC - Assign GUTI from IMSI %01X%01X%01X.%01X%01X.%04X.%02X.%08X to emm_data_context", + ctx->guti->gummei.plmn.MCCdigit1, + ctx->guti->gummei.plmn.MCCdigit2, + ctx->guti->gummei.plmn.MCCdigit3, + ctx->guti->gummei.plmn.MNCdigit1, + ctx->guti->gummei.plmn.MNCdigit2, + ctx->guti->gummei.MMEgid, + ctx->guti->gummei.MMEcode, + ctx->guti->m_tmsi + ); + } else { + ctx->guti->gummei.plmn.MNCdigit1 = imsi->u.num.digit5; + ctx->guti->gummei.plmn.MNCdigit2 = imsi->u.num.digit6; + ctx->guti->gummei.plmn.MNCdigit3 = imsi->u.num.digit4; + LOG_TRACE(WARNING, "EMM-PROC - Assign GUTI from IMSI %01X%01X%01X.%01X%01X%01X.%04X.%02X.%08X to emm_data_context", + ctx->guti->gummei.plmn.MCCdigit1, + ctx->guti->gummei.plmn.MCCdigit2, + ctx->guti->gummei.plmn.MCCdigit3, + ctx->guti->gummei.plmn.MNCdigit1, + ctx->guti->gummei.plmn.MNCdigit2, + ctx->guti->gummei.plmn.MNCdigit3, + ctx->guti->gummei.MMEgid, + ctx->guti->gummei.MMEcode, + ctx->guti->m_tmsi + ); + } + LOG_TRACE(WARNING, "EMM-PROC - Set ctx->guti_is_new to emm_data_context"); + ctx->guti_is_new = TRUE; + } else { + LOG_FUNC_RETURN (RETURNerror); + } } else { LOG_FUNC_RETURN (RETURNerror); } diff --git a/openair-cn/NAS/EURECOM-NAS/src/ies/VoiceDomainPreferenceAndUeUsageSetting.c b/openair-cn/NAS/EURECOM-NAS/src/ies/VoiceDomainPreferenceAndUeUsageSetting.c index 47565d0e87..3329bbb498 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/ies/VoiceDomainPreferenceAndUeUsageSetting.c +++ b/openair-cn/NAS/EURECOM-NAS/src/ies/VoiceDomainPreferenceAndUeUsageSetting.c @@ -52,6 +52,7 @@ int decode_voice_domain_preference_and_ue_usage_setting(VoiceDomainPreferenceAnd voicedomainpreferenceandueusagesetting->ue_usage_setting = (*(buffer + decoded) >> 2) & 0x1; voicedomainpreferenceandueusagesetting->voice_domain_for_eutran = *(buffer + decoded) & 0x3; + decoded++; #if defined (NAS_DEBUG) dump_voice_domain_preference_and_ue_usage_setting_xml(voicedomainpreferenceandueusagesetting, iei); diff --git a/openair-cn/NAS/EURECOM-NAS/tools/Makefile b/openair-cn/NAS/EURECOM-NAS/tools/Makefile index db503e0786..0e56cfce85 100644 --- a/openair-cn/NAS/EURECOM-NAS/tools/Makefile +++ b/openair-cn/NAS/EURECOM-NAS/tools/Makefile @@ -52,8 +52,9 @@ TARGETS = $(USIM_TARGET) $(UE_TARGET) all: $(TARGETS) +#-DIMSI_USA_MNC_3DIGITS %.o: %.c Makefile - $(CC) $(CFLAGS) -c $< -o $@ + $(CC) $(CFLAGS) -c $< -o $@ $(USIM_TARGET): $(USIM_OBJ) $(LIBSUTIL) $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) $(SECUDIR)/*.o -lnettle -lcrypto -lm diff --git a/openair-cn/NAS/EURECOM-NAS/tools/network.h b/openair-cn/NAS/EURECOM-NAS/tools/network.h index 7637f33c1f..e8f7b32d97 100644 --- a/openair-cn/NAS/EURECOM-NAS/tools/network.h +++ b/openair-cn/NAS/EURECOM-NAS/tools/network.h @@ -55,11 +55,13 @@ Description Defines a list of PLMN network operators #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_3 {0,2,0x0f,8,3,1} // 20813 +#define TM_PLMN_1 {1,3,0,0,8,2} // 310280 +#define FCT_PLMN_1 {1,3,8,0,2,0} // 310028 #define VDF_PLMN_1 {2,2,0x0f,2,0,1} // 22210 #define VDF_PLMN_2 {1,2,0x0f,4,0x0f,1} // 2141 #define VDF_PLMN_3 {1,2,0x0f,4,0x0f,6} // 2146 #define VDF_PLMN_4 {6,2,0x0f,2,0x0f,2} // 2622 -#define VDF_PLMN_5 {6,2,0x0f,2,0x0f,4} // 2624 +#define VDF_PLMN_5 {6,2,0x0f,2,0x0f,4} // 2624 /****************************************************************************/ /************************ G L O B A L T Y P E S ************************/ @@ -72,11 +74,13 @@ enum { SFR1=0, SFR2, SFR3, + TM1, + FCT1, VDF1, VDF2, VDF3, VDF4, - VDF5 + VDF5, }; /* @@ -100,14 +104,16 @@ typedef struct { * The list of PLMN network operator records */ network_record_t network_records[] = { - {20810, SFR_PLMN_1, "SFR France", "SFR", 0x0000, 0xfffe}, - {20811, SFR_PLMN_2, "SFR France", "SFR", 0x0000, 0xfffe}, - {20813, SFR_PLMN_3, "SFR France", "SFR", 0x0000, 0xfffe}, - {22210, VDF_PLMN_1, "Vodafone Italia", "VODAFONE", 0x0000, 0xfffe}, - {2141, VDF_PLMN_2, "Vodafone Spain", "VODAFONE", 0x0000, 0xfffe}, - {2146, VDF_PLMN_3, "Vodafone Spain", "VODAFONE", 0x0000, 0xfffe}, - {2622, VDF_PLMN_4, "Vodafone Germ", "VODAFONE", 0x0000, 0xfffe}, - {2624, VDF_PLMN_5, "Vodafone Germ", "VODAFONE", 0x0000, 0xfffe}, + {20810, SFR_PLMN_1, "SFR France", "SFR", 0x0001, 0xfffd}, + {20811, SFR_PLMN_2, "SFR France", "SFR", 0x0001, 0xfffd}, + {20813, SFR_PLMN_3, "SFR France", "SFR", 0x0001, 0xfffd}, + {310280,TM_PLMN_1, "T-Mobile USA", "T-Mobile", 0x0001, 0xfffd}, + {310028,FCT_PLMN_1, "FICTITIOUS USA", "FICTITIO", 0x0001, 0xfffd}, + {22210, VDF_PLMN_1, "Vodafone Italia", "VODAFONE", 0x0001, 0xfffd}, + {2141, VDF_PLMN_2, "Vodafone Spain", "VODAFONE", 0x0001, 0xfffd}, + {2146, VDF_PLMN_3, "Vodafone Spain", "VODAFONE", 0x0001, 0xfffd}, + {2622, VDF_PLMN_4, "Vodafone Germ", "VODAFONE", 0x0001, 0xfffd}, + {2624, VDF_PLMN_5, "Vodafone Germ", "VODAFONE", 0x0001, 0xfffd}, }; /****************************************************************************/ diff --git a/openair-cn/NAS/EURECOM-NAS/tools/ue_data.c b/openair-cn/NAS/EURECOM-NAS/tools/ue_data.c index b27fe0233a..f3a1fb67de 100644 --- a/openair-cn/NAS/EURECOM-NAS/tools/ue_data.c +++ b/openair-cn/NAS/EURECOM-NAS/tools/ue_data.c @@ -53,6 +53,9 @@ Description Implements the utility used to generate data stored in the #include // exit, free #include // memset, strncpy +//#define SELECTED_PLMN SFR1 +#define SELECTED_PLMN FCT1 + /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ @@ -286,19 +289,70 @@ static void _gen_user_data(user_nvdata_t* data) */ static void _gen_emm_data(emm_nvdata_t* data) { +//#if (SELECTED_PLMN == FCT1) +#if 1 + /* + * International Mobile Subscriber Identity + * IMSI = MCC + MNC + MSIN = 310 (USA) + 028 (UNKNOWN) + 90832150 + */ +#warning "IMSI 310.028.90832150" + data->imsi.length = 8; + data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even + data->imsi.u.num.digit1 = 3; // MCC digit 1 + data->imsi.u.num.digit2 = 1; // MCC digit 2 + data->imsi.u.num.digit3 = 0; // MCC digit 3 + data->imsi.u.num.digit4 = 0; // MNC digit 1 + data->imsi.u.num.digit5 = 2; // MNC digit 2 + data->imsi.u.num.digit6 = 8; // MNC digit 3 + data->imsi.u.num.digit7 = 9; + data->imsi.u.num.digit8 = 0; + data->imsi.u.num.digit9 = 8; + data->imsi.u.num.digit10 = 3; + data->imsi.u.num.digit11 = 2; + data->imsi.u.num.digit12 = 1; + data->imsi.u.num.digit13 = 5; + data->imsi.u.num.digit14 = 0; + data->imsi.u.num.digit15 = 0xF; + /* + * Last registered home PLMN + */ + data->rplmn.MCCdigit1 = 3; + data->rplmn.MCCdigit2 = 1; + data->rplmn.MCCdigit3 = 0; + data->rplmn.MNCdigit1 = 0; + data->rplmn.MNCdigit2 = 2; + data->rplmn.MNCdigit3 = 8; +#else /* * International Mobile Subscriber Identity * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 */ - data->imsi.length = 8; +#warning "IMSI 208.10.000001234" +/* data->imsi.length = 8; data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even data->imsi.u.num.digit1 = 2; // MCC digit 1 data->imsi.u.num.digit2 = 0; // MCC digit 2 data->imsi.u.num.digit3 = 8; // MCC digit 3 data->imsi.u.num.digit4 = 1; // MNC digit 1 data->imsi.u.num.digit5 = 0; // MNC digit 2 - data->imsi.u.num.digit6 = 0; // MNC digit 3 - //LG 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.digit8 = 0; + data->imsi.u.num.digit9 = 0; + data->imsi.u.num.digit10 = 0; + data->imsi.u.num.digit11 = 1; + data->imsi.u.num.digit12 = 2; + data->imsi.u.num.digit13 = 3; + data->imsi.u.num.digit14 = 4; + data->imsi.u.num.digit15 = 0xF;*/ + data->imsi.length = 8; + data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even + data->imsi.u.num.digit1 = 2; // MCC digit 1 + data->imsi.u.num.digit2 = 0; // MCC digit 2 + data->imsi.u.num.digit3 = 8; // MCC digit 3 + data->imsi.u.num.digit4 = 1; // MNC digit 1 + data->imsi.u.num.digit5 = 0; // MNC digit 2 + data->imsi.u.num.digit6 = 0; data->imsi.u.num.digit7 = 0; data->imsi.u.num.digit8 = 0; data->imsi.u.num.digit9 = 0; @@ -308,6 +362,7 @@ static void _gen_emm_data(emm_nvdata_t* data) data->imsi.u.num.digit13 = 3; data->imsi.u.num.digit14 = 4; data->imsi.u.num.digit15 = 0xF; + /* * Last registered home PLMN */ @@ -317,6 +372,7 @@ static void _gen_emm_data(emm_nvdata_t* data) data->rplmn.MNCdigit1 = 1; data->rplmn.MNCdigit2 = 0; data->rplmn.MNCdigit3 = 0xf; +#endif /* * List of Equivalent PLMNs */ @@ -356,20 +412,79 @@ static void _display_ue_data(const user_nvdata_t* data) static void _display_emm_data(const emm_nvdata_t* data) { printf("IMSI\t\t= "); - printf("%u%u%u%u%u%u%u%u%u%u%u%u%u\n", - data->imsi.u.num.digit1, - data->imsi.u.num.digit2, - data->imsi.u.num.digit3, - data->imsi.u.num.digit4, - data->imsi.u.num.digit5, - data->imsi.u.num.digit7, - data->imsi.u.num.digit8, - data->imsi.u.num.digit9, - data->imsi.u.num.digit10, - data->imsi.u.num.digit11, - data->imsi.u.num.digit12, - data->imsi.u.num.digit13, - data->imsi.u.num.digit14); + if (data->imsi.u.num.digit6 == 0b1111) { + if (data->imsi.u.num.digit15 == 0b1111) { + printf("%u%u%u.%u%u.%u%u%u%u%u%u%u%u\n", + data->imsi.u.num.digit1, + data->imsi.u.num.digit2, + data->imsi.u.num.digit3, + data->imsi.u.num.digit4, + data->imsi.u.num.digit5, + + data->imsi.u.num.digit7, + data->imsi.u.num.digit8, + data->imsi.u.num.digit9, + data->imsi.u.num.digit10, + data->imsi.u.num.digit11, + data->imsi.u.num.digit12, + data->imsi.u.num.digit13, + data->imsi.u.num.digit14); + } else { + printf("%u%u%u.%u%u.%u%u%u%u%u%u%u%u%u\n", + data->imsi.u.num.digit1, + data->imsi.u.num.digit2, + data->imsi.u.num.digit3, + data->imsi.u.num.digit4, + data->imsi.u.num.digit5, + + data->imsi.u.num.digit7, + data->imsi.u.num.digit8, + data->imsi.u.num.digit9, + data->imsi.u.num.digit10, + data->imsi.u.num.digit11, + data->imsi.u.num.digit12, + data->imsi.u.num.digit13, + data->imsi.u.num.digit14, + data->imsi.u.num.digit15); + } + } else { + if (data->imsi.u.num.digit15 == 0b1111) { + printf("%u%u%u.%u%u%u.%u%u%u%u%u%u%u%u\n", + data->imsi.u.num.digit1, + data->imsi.u.num.digit2, + data->imsi.u.num.digit3, + data->imsi.u.num.digit4, + data->imsi.u.num.digit5, + data->imsi.u.num.digit6, + + data->imsi.u.num.digit7, + data->imsi.u.num.digit8, + data->imsi.u.num.digit9, + data->imsi.u.num.digit10, + data->imsi.u.num.digit11, + data->imsi.u.num.digit12, + data->imsi.u.num.digit13, + data->imsi.u.num.digit14); + } else { + printf("%u%u%u.%u%u%u.%u%u%u%u%u%u%u%u\n", + data->imsi.u.num.digit1, + data->imsi.u.num.digit2, + data->imsi.u.num.digit3, + data->imsi.u.num.digit4, + data->imsi.u.num.digit5, + data->imsi.u.num.digit6, + + data->imsi.u.num.digit7, + data->imsi.u.num.digit8, + data->imsi.u.num.digit9, + data->imsi.u.num.digit10, + data->imsi.u.num.digit11, + data->imsi.u.num.digit12, + data->imsi.u.num.digit13, + data->imsi.u.num.digit14, + data->imsi.u.num.digit15); + } + } printf("RPLMN\t\t= "); PRINT_PLMN(data->rplmn); printf("\n"); diff --git a/openair-cn/NAS/EURECOM-NAS/tools/usim_data.c b/openair-cn/NAS/EURECOM-NAS/tools/usim_data.c index 38d3d60cdb..cee5c80427 100644 --- a/openair-cn/NAS/EURECOM-NAS/tools/usim_data.c +++ b/openair-cn/NAS/EURECOM-NAS/tools/usim_data.c @@ -53,6 +53,9 @@ Description Implements the utility used to generate data stored in the #include // exit #include // memset, memcpy, strncpy +//#define SELECTED_PLMN SFR1 +#define SELECTED_PLMN FCT1 + /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ @@ -60,7 +63,7 @@ Description Implements the utility used to generate data stored in the #define KSI USIM_KSI_NOT_AVAILABLE #define KSI_ASME USIM_KSI_NOT_AVAILABLE #define INT_ALGO USIM_INT_EIA1 -#define ENC_ALGO USIM_ENC_EEA1 +#define ENC_ALGO USIM_ENC_EEA0 #define SECURITY_ALGORITHMS (ENC_ALGO | INT_ALGO) #define MIN_TAC 0x0000 @@ -135,19 +138,45 @@ int main (int argc, const char* argv[]) * Initialize USIM data */ memset(&usim_data, 0, sizeof(usim_data_t)); + +//#if (SELECTED_PLMN == FCT1) +#if 1 + /* + * International Mobile Subscriber Identity + * IMSI = MCC + MNC + MSIN = 310 (USA) + 028 (UNKNOWN) + 90832150 + */ +#warning "IMSI 310.028.90832150" + usim_data.imsi.length = 8; + usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even + usim_data.imsi.u.num.digit1 = 3; // MCC digit 1 + usim_data.imsi.u.num.digit2 = 1; // MCC digit 2 + usim_data.imsi.u.num.digit3 = 0; // MCC digit 3 + usim_data.imsi.u.num.digit4 = 0; // MNC digit 1 + usim_data.imsi.u.num.digit5 = 2; // MNC digit 2 + usim_data.imsi.u.num.digit6 = 8; // MNC digit 3 + usim_data.imsi.u.num.digit7 = 9; + usim_data.imsi.u.num.digit8 = 0; + usim_data.imsi.u.num.digit9 = 8; + usim_data.imsi.u.num.digit10 = 3; + usim_data.imsi.u.num.digit11 = 2; + usim_data.imsi.u.num.digit12 = 1; + usim_data.imsi.u.num.digit13 = 5; + usim_data.imsi.u.num.digit14 = 0; + usim_data.imsi.u.num.digit15 = 0b1111; +#else /* * International Mobile Subscriber Identity * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 */ - usim_data.imsi.length = 8; - usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even +#warning "IMSI 208.10.00001234" +/* usim_data.imsi.length = 8; + usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even usim_data.imsi.u.num.digit1 = 2; // MCC digit 1 usim_data.imsi.u.num.digit2 = 0; // MCC digit 2 usim_data.imsi.u.num.digit3 = 8; // MCC digit 3 usim_data.imsi.u.num.digit4 = 1; // MNC digit 1 usim_data.imsi.u.num.digit5 = 0; // MNC digit 2 - // LG usim_data.imsi.u.num.digit6 = 0b1111; // MNC digit 3 - usim_data.imsi.u.num.digit6 = 0; // MNC digit 3 + usim_data.imsi.u.num.digit6 = 0b1111; // MNC digit 3 usim_data.imsi.u.num.digit7 = 0; usim_data.imsi.u.num.digit8 = 0; usim_data.imsi.u.num.digit9 = 0; @@ -156,7 +185,25 @@ int main (int argc, const char* argv[]) usim_data.imsi.u.num.digit12 = 2; usim_data.imsi.u.num.digit13 = 3; usim_data.imsi.u.num.digit14 = 4; - usim_data.imsi.u.num.digit15 = 0b1111; + usim_data.imsi.u.num.digit15 = 0b1111;*/ + usim_data.imsi.length = 8; + usim_data.imsi.u.num.parity = 0x0; // Type of identity = IMSI, even + usim_data.imsi.u.num.digit1 = 2; // MCC digit 1 + usim_data.imsi.u.num.digit2 = 0; // MCC digit 2 + usim_data.imsi.u.num.digit3 = 8; // MCC digit 3 + usim_data.imsi.u.num.digit4 = 1; // MNC digit 1 + usim_data.imsi.u.num.digit5 = 0; // MNC digit 2 + usim_data.imsi.u.num.digit6 = 0; + usim_data.imsi.u.num.digit7 = 0; + usim_data.imsi.u.num.digit8 = 0; + usim_data.imsi.u.num.digit9 = 0; + usim_data.imsi.u.num.digit10 = 0; + usim_data.imsi.u.num.digit11 = 1; + usim_data.imsi.u.num.digit12 = 2; + usim_data.imsi.u.num.digit13 = 3; + usim_data.imsi.u.num.digit14 = 4; + usim_data.imsi.u.num.digit15 = 0xF; +#endif /* * Ciphering and Integrity Keys */ @@ -178,7 +225,7 @@ int main (int argc, const char* argv[]) * Location Information */ usim_data.loci.tmsi = DEFAULT_TMSI; - usim_data.loci.lai.plmn = network_records[SFR1].plmn; + usim_data.loci.lai.plmn = network_records[SELECTED_PLMN].plmn; usim_data.loci.lai.lac = DEFAULT_LAC; usim_data.loci.status = USIM_LOCI_NOT_UPDATED; /* @@ -188,7 +235,7 @@ int main (int argc, const char* argv[]) usim_data.psloci.signature[0] = 0x01; usim_data.psloci.signature[1] = 0x02; usim_data.psloci.signature[2] = 0x03; - usim_data.psloci.rai.plmn = network_records[SFR1].plmn; + usim_data.psloci.rai.plmn = network_records[SELECTED_PLMN].plmn; usim_data.psloci.rai.lac = DEFAULT_LAC; usim_data.psloci.rai.rac = DEFAULT_RAC; usim_data.psloci.status = USIM_PSLOCI_NOT_UPDATED; @@ -279,7 +326,7 @@ int main (int argc, const char* argv[]) /* * Home PLMN Selector with Access Technology */ - usim_data.hplmn.plmn = network_records[SFR1].plmn; + usim_data.hplmn.plmn = network_records[SELECTED_PLMN].plmn; usim_data.hplmn.AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); /* * List of user controlled PLMN selector with Access Technology @@ -306,7 +353,7 @@ int main (int argc, const char* argv[]) /* * EPS Location Information */ - usim_data.epsloci.guti.gummei.plmn = network_records[SFR1].plmn; + usim_data.epsloci.guti.gummei.plmn = network_records[SELECTED_PLMN].plmn; usim_data.epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID; usim_data.epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE; usim_data.epsloci.guti.m_tmsi = DEFAULT_M_TMSI; diff --git a/openair-cn/S6A/s6a_auth_info.c b/openair-cn/S6A/s6a_auth_info.c index ccc85dc639..bb75843e13 100644 --- a/openair-cn/S6A/s6a_auth_info.c +++ b/openair-cn/S6A/s6a_auth_info.c @@ -348,7 +348,16 @@ int s6a_generate_authentication_info_req(s6a_auth_info_req_t *air_p) CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_visited_plmn_id, 0, &avp)); - PLMN_T_TO_TBCD(air_p->visited_plmn, plmn); + PLMN_T_TO_TBCD(air_p->visited_plmn, + plmn, + mme_config_find_mnc_length(air_p->visited_plmn.MCCdigit1, + air_p->visited_plmn.MCCdigit2, + air_p->visited_plmn.MCCdigit3, + air_p->visited_plmn.MNCdigit1, + air_p->visited_plmn.MNCdigit2, + air_p->visited_plmn.MNCdigit3 + ) + ); value.os.data = plmn; value.os.len = 3; CHECK_FCT(fd_msg_avp_setvalue(avp, &value)); diff --git a/openair-cn/S6A/s6a_up_loc.c b/openair-cn/S6A/s6a_up_loc.c index 787e47637f..a2cec99e62 100644 --- a/openair-cn/S6A/s6a_up_loc.c +++ b/openair-cn/S6A/s6a_up_loc.c @@ -245,7 +245,16 @@ int s6a_generate_update_location(s6a_update_location_req_t *ulr_pP) CHECK_FCT(fd_msg_avp_new(s6a_fd_cnf.dataobj_s6a_visited_plmn_id, 0, &avp_p)); - PLMN_T_TO_TBCD(ulr_pP->visited_plmn, plmn); + PLMN_T_TO_TBCD(ulr_pP->visited_plmn, + plmn, + mme_config_find_mnc_length(ulr_pP->visited_plmn.MCCdigit1, + ulr_pP->visited_plmn.MCCdigit2, + ulr_pP->visited_plmn.MCCdigit3, + ulr_pP->visited_plmn.MNCdigit1, + ulr_pP->visited_plmn.MNCdigit2, + ulr_pP->visited_plmn.MNCdigit3 + ) + ); printf("PLMN: %3s\n", plmn); diff --git a/openair-cn/UTILS/conversions.h b/openair-cn/UTILS/conversions.h index 0d9eac09d4..decd2fd095 100644 --- a/openair-cn/UTILS/conversions.h +++ b/openair-cn/UTILS/conversions.h @@ -238,15 +238,15 @@ do { \ (pLMN)->MNCdigit1 = ((tBCDsTRING)->buf[2] & 0x0f); \ } while(0) -#define PLMN_T_TO_TBCD(pLMN, tBCDsTRING) \ +#define PLMN_T_TO_TBCD(pLMN, tBCDsTRING, mNClENGTH) \ do { \ - tBCDsTRING[0] = (pLMN.MCCdigit2 << 4) | pLMN.MCCdigit3; \ + tBCDsTRING[0] = (pLMN.MCCdigit2 << 4) | pLMN.MCCdigit1; \ /* ambiguous (think about len 2) */ \ - if (pLMN.MNCdigit1 == 0) { \ - tBCDsTRING[1] = (0x0F << 4) | pLMN.MCCdigit1; \ - tBCDsTRING[2] = (pLMN.MNCdigit3 << 4) | pLMN.MNCdigit2; \ + if (mNClENGTH == 2) { \ + tBCDsTRING[1] = (0x0F << 4) | pLMN.MCCdigit3; \ + tBCDsTRING[2] = (pLMN.MNCdigit2 << 4) | pLMN.MNCdigit1; \ } else { \ - tBCDsTRING[1] = (pLMN.MNCdigit3 << 4) | pLMN.MCCdigit1; \ + tBCDsTRING[1] = (pLMN.MNCdigit3 << 4) | pLMN.MCCdigit3; \ tBCDsTRING[2] = (pLMN.MNCdigit2 << 4) | pLMN.MNCdigit1; \ } \ } while(0) diff --git a/openair-cn/UTILS/mcc_mnc_itu.c b/openair-cn/UTILS/mcc_mnc_itu.c index 86b3f0c27c..d9727d2c0e 100755 --- a/openair-cn/UTILS/mcc_mnc_itu.c +++ b/openair-cn/UTILS/mcc_mnc_itu.c @@ -1777,8 +1777,8 @@ int find_mnc_length(const char mcc_digit1P, "BAD MCC PARAMETER (%d%d%d)!\n", mcc_digit1P, mcc_digit2P, mcc_digit3P); - AssertFatal((mnc_digit2P >= '0') && (mnc_digit2P <= '9') - && (mnc_digit3P >= '0') && (mnc_digit3P <= '9') , + AssertFatal((mnc_digit1P >= '0') && (mnc_digit1P <= '9') + && (mnc_digit2P >= '0') && (mnc_digit2P <= '9') , "BAD MNC PARAMETER ((%d)%d%d)!\n", mnc_digit1P, mnc_digit2P, mnc_digit3P); diff --git a/openair-cn/UTILS/mme_config.c b/openair-cn/UTILS/mme_config.c index e955da5492..53cbac63a8 100644 --- a/openair-cn/UTILS/mme_config.c +++ b/openair-cn/UTILS/mme_config.c @@ -48,6 +48,46 @@ mme_config_t mme_config; +int mme_config_find_mnc_length(const char mcc_digit1P, + const char mcc_digit2P, + const char mcc_digit3P, + const char mnc_digit1P, + const char mnc_digit2P, + const char mnc_digit3P) { + + uint16_t mcc = 100*mcc_digit1P + 10*mcc_digit2P + mcc_digit3P; + uint16_t mnc3= 100*mnc_digit1P + 10*mnc_digit2P + mnc_digit3P; + uint16_t mnc2= 10*mnc_digit1P + mnc_digit2P; + int plmn_index = 0; + + AssertFatal((mcc_digit1P >= 0) && (mcc_digit1P <= 9) + && (mcc_digit2P >= 0) && (mcc_digit2P <= 9) + && (mcc_digit3P >= 0) && (mcc_digit3P <= 9) , + "BAD MCC PARAMETER (%d%d%d)!\n", + mcc_digit1P, mcc_digit2P, mcc_digit3P); + + AssertFatal((mnc_digit2P >= 0) && (mnc_digit2P <= 9) + && (mnc_digit1P >= 0) && (mnc_digit1P <= 9) , + "BAD MNC PARAMETER (%d.%d.%d)!\n", + mnc_digit1P, mnc_digit2P, mnc_digit3P); + + + while (plmn_index < mme_config.gummei.nb_plmns) { + if (mme_config.gummei.plmn_mcc[plmn_index] == mcc) { + if ((mme_config.gummei.plmn_mnc[plmn_index] == mnc2) && + (mme_config.gummei.plmn_mnc_len[plmn_index] == 2)) { + return 2; + } else if ((mme_config.gummei.plmn_mnc[plmn_index] == mnc3) && + (mme_config.gummei.plmn_mnc_len[plmn_index] == 3)) { + return 3; + } + } + plmn_index += 1; + } + return 0; +} + + static void mme_config_init(mme_config_t *mme_config_p) { diff --git a/openair-cn/UTILS/mme_config.h b/openair-cn/UTILS/mme_config.h index ad7fdbafaf..d68f423432 100644 --- a/openair-cn/UTILS/mme_config.h +++ b/openair-cn/UTILS/mme_config.h @@ -169,6 +169,12 @@ typedef struct mme_config_s { extern mme_config_t mme_config; +int mme_config_find_mnc_length(const char mcc_digit1P, + const char mcc_digit2P, + const char mcc_digit3P, + const char mnc_digit1P, + const char mnc_digit2P, + const char mnc_digit3P); int config_parse_opt_line(int argc, char *argv[], mme_config_t *mme_config); #define config_read_lock(mMEcONFIG) pthread_rwlock_rdlock(&(mMEcONFIG)->rw_lock)