From 576bbd252c1c2dbd147bca4d19a4003ae68f31a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Leroy?= <frederic.leroy@b-com.com> Date: Wed, 13 Jul 2016 10:29:13 +0200 Subject: [PATCH] UE/EMM: move _usim_data to nas_user_t --- openair3/NAS/UE/EMM/emm_main.c | 122 +++++++++++++++------------------ openair3/NAS/UE/EMM/emm_main.h | 2 +- openair3/NAS/UE/nas_proc.c | 4 +- openair3/NAS/UE/nas_proc.h | 2 +- openair3/NAS/UE/nas_user.c | 2 +- openair3/NAS/UE/user_defs.h | 2 + 6 files changed, 64 insertions(+), 70 deletions(-) diff --git a/openair3/NAS/UE/EMM/emm_main.c b/openair3/NAS/UE/EMM/emm_main.c index a1d4260923..b9ffcf4493 100644 --- a/openair3/NAS/UE/EMM/emm_main.c +++ b/openair3/NAS/UE/EMM/emm_main.c @@ -68,11 +68,6 @@ static const char *_emm_main_get_plmn(emm_plmn_list_t *emm_plmn_list, const plmn static int _emm_main_get_plmn_index(emm_plmn_list_t *emm_plmn_list, const char *plmn, int format); -/* - * USIM application data - */ -static usim_data_t _usim_data; - /* * Callback executed whenever a change in the network has to be notified * to the user application @@ -93,7 +88,6 @@ static int _emm_main_callback(emm_data_t *emm_data, int); ** Inputs: cb: The user notification callback ** ** imei: The IMEI read from the UE's non-volatile ** ** memory ** - ** Others: _usim_data ** ** ** ** Outputs: None ** ** Return: None ** @@ -165,8 +159,7 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c /* * Get USIM application data */ - _usim_data.usimtestmode = usim_test; - if ( usim_api_read(&_usim_data) != RETURNok ) { + if ( usim_api_read(&user->usim_data) != RETURNok ) { /* The USIM application may not be present or not valid */ LOG_TRACE(WARNING, "EMM-MAIN - Failed to read USIM application data"); } else { @@ -177,54 +170,54 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c user->emm_data->usim_is_valid = TRUE; /* Get the Home PLMN derived from the IMSI */ - user->emm_data->hplmn.MCCdigit1 = _usim_data.imsi.u.num.digit1; - user->emm_data->hplmn.MCCdigit2 = _usim_data.imsi.u.num.digit2; - user->emm_data->hplmn.MCCdigit3 = _usim_data.imsi.u.num.digit3; - user->emm_data->hplmn.MNCdigit1 = _usim_data.imsi.u.num.digit4; - user->emm_data->hplmn.MNCdigit2 = _usim_data.imsi.u.num.digit5; - user->emm_data->hplmn.MNCdigit3 = _usim_data.imsi.u.num.digit6; + user->emm_data->hplmn.MCCdigit1 = user->usim_data.imsi.u.num.digit1; + user->emm_data->hplmn.MCCdigit2 = user->usim_data.imsi.u.num.digit2; + user->emm_data->hplmn.MCCdigit3 = user->usim_data.imsi.u.num.digit3; + user->emm_data->hplmn.MNCdigit1 = user->usim_data.imsi.u.num.digit4; + user->emm_data->hplmn.MNCdigit2 = user->usim_data.imsi.u.num.digit5; + user->emm_data->hplmn.MNCdigit3 = user->usim_data.imsi.u.num.digit6; /* Get the list of forbidden PLMNs */ for (i=0; (i < EMM_DATA_FPLMN_MAX) && (i < USIM_FPLMN_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.fplmn[i]) ) { - user->emm_data->fplmn.plmn[i] = _usim_data.fplmn[i]; + if ( PLMN_IS_VALID(user->usim_data.fplmn[i]) ) { + user->emm_data->fplmn.plmn[i] = user->usim_data.fplmn[i]; user->emm_data->fplmn.n_plmns += 1; } } /* Get the list of Equivalent HPLMNs */ for (i=0; (i < EMM_DATA_EHPLMN_MAX) && (i < USIM_EHPLMN_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.ehplmn[i]) ) { - user->emm_data->ehplmn.plmn[i] = _usim_data.ehplmn[i]; + if ( PLMN_IS_VALID(user->usim_data.ehplmn[i]) ) { + user->emm_data->ehplmn.plmn[i] = user->usim_data.ehplmn[i]; user->emm_data->ehplmn.n_plmns += 1; } } /* Get the list of User controlled PLMN Selector */ for (i=0; (i < EMM_DATA_PLMN_MAX) && (i < USIM_PLMN_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.plmn[i].plmn) ) { - user->emm_data->plmn.plmn[i] = _usim_data.plmn[i].plmn; - user->emm_data->userAcT[i] = _usim_data.plmn[i].AcT; + if ( PLMN_IS_VALID(user->usim_data.plmn[i].plmn) ) { + user->emm_data->plmn.plmn[i] = user->usim_data.plmn[i].plmn; + user->emm_data->userAcT[i] = user->usim_data.plmn[i].AcT; user->emm_data->plmn.n_plmns += 1; } } /* Get the list of Operator controlled PLMN Selector */ for (i=0; (i < EMM_DATA_OPLMN_MAX) && (i < USIM_OPLMN_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.oplmn[i].plmn) ) { - user->emm_data->oplmn.plmn[i] = _usim_data.oplmn[i].plmn; - user->emm_data->operAcT[i] = _usim_data.oplmn[i].AcT; + if ( PLMN_IS_VALID(user->usim_data.oplmn[i].plmn) ) { + user->emm_data->oplmn.plmn[i] = user->usim_data.oplmn[i].plmn; + user->emm_data->operAcT[i] = user->usim_data.oplmn[i].AcT; user->emm_data->oplmn.n_plmns += 1; } } /* Get the list of Operator network name records */ for (i=0; (i < EMM_DATA_OPNN_MAX) && (i < USIM_OPL_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.opl[i].plmn) ) { - int pnn_id = _usim_data.opl[i].record_id; - user->emm_data->opnn[i].plmn = &_usim_data.opl[i].plmn; - user->emm_data->opnn[i].fullname = (char *)_usim_data.pnn[pnn_id].fullname.value; - user->emm_data->opnn[i].shortname = (char *)_usim_data.pnn[pnn_id].shortname.value; + if ( PLMN_IS_VALID(user->usim_data.opl[i].plmn) ) { + int pnn_id = user->usim_data.opl[i].record_id; + user->emm_data->opnn[i].plmn = &user->usim_data.opl[i].plmn; + user->emm_data->opnn[i].fullname = (char *)user->usim_data.pnn[pnn_id].fullname.value; + user->emm_data->opnn[i].shortname = (char *)user->usim_data.pnn[pnn_id].shortname.value; user->emm_data->n_opnns += 1; } } @@ -232,27 +225,27 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c /* TODO: Get the Higher Priority PLMN search period parameter */ /* Get the EPS location information */ - if (PLMN_IS_VALID(_usim_data.epsloci.guti.gummei.plmn)) { - user->emm_data->guti = &_usim_data.epsloci.guti; + if (PLMN_IS_VALID(user->usim_data.epsloci.guti.gummei.plmn)) { + user->emm_data->guti = &user->usim_data.epsloci.guti; } - if (TAI_IS_VALID(_usim_data.epsloci.tai)) { - user->emm_data->tai = &_usim_data.epsloci.tai; + if (TAI_IS_VALID(user->usim_data.epsloci.tai)) { + user->emm_data->tai = &user->usim_data.epsloci.tai; } - user->emm_data->status = _usim_data.epsloci.status; + user->emm_data->status = user->usim_data.epsloci.status; /* Get NAS configuration parameters */ user->emm_data->NAS_SignallingPriority = - _usim_data.nasconfig.NAS_SignallingPriority.value[0]; - user->emm_data->NMO_I_Behaviour = _usim_data.nasconfig.NMO_I_Behaviour.value[0]; - user->emm_data->AttachWithImsi = _usim_data.nasconfig.AttachWithImsi.value[0]; + user->usim_data.nasconfig.NAS_SignallingPriority.value[0]; + user->emm_data->NMO_I_Behaviour = user->usim_data.nasconfig.NMO_I_Behaviour.value[0]; + user->emm_data->AttachWithImsi = user->usim_data.nasconfig.AttachWithImsi.value[0]; user->emm_data->MinimumPeriodicSearchTimer = - _usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0]; + user->usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0]; user->emm_data->ExtendedAccessBarring = - _usim_data.nasconfig.ExtendedAccessBarring.value[0]; + user->usim_data.nasconfig.ExtendedAccessBarring.value[0]; user->emm_data->Timer_T3245_Behaviour = - _usim_data.nasconfig.Timer_T3245_Behaviour.value[0]; + user->usim_data.nasconfig.Timer_T3245_Behaviour.value[0]; /* * Get EPS NAS security context @@ -265,7 +258,7 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c memset(user->emm_data->security, 0, sizeof(emm_security_context_t)); /* Type of security context */ - if (_usim_data.securityctx.KSIasme.value[0] != + if (user->usim_data.securityctx.KSIasme.value[0] != USIM_KSI_NOT_AVAILABLE) { user->emm_data->security->type = EMM_KSI_NATIVE; } else { @@ -273,39 +266,39 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c } /* EPS key set identifier */ - user->emm_data->security->eksi = _usim_data.securityctx.KSIasme.value[0]; + user->emm_data->security->eksi = user->usim_data.securityctx.KSIasme.value[0]; /* ASME security key */ user->emm_data->security->kasme.length = - _usim_data.securityctx.Kasme.length; + user->usim_data.securityctx.Kasme.length; user->emm_data->security->kasme.value = (uint8_t *)malloc(user->emm_data->security->kasme.length); if (user->emm_data->security->kasme.value) { memcpy(user->emm_data->security->kasme.value, - _usim_data.securityctx.Kasme.value, + user->usim_data.securityctx.Kasme.value, user->emm_data->security->kasme.length); } /* Downlink count parameter */ - if (_usim_data.securityctx.dlNAScount.length <= sizeof(uint32_t)) { + if (user->usim_data.securityctx.dlNAScount.length <= sizeof(uint32_t)) { memcpy(&user->emm_data->security->dl_count, - _usim_data.securityctx.dlNAScount.value, - _usim_data.securityctx.dlNAScount.length); + user->usim_data.securityctx.dlNAScount.value, + user->usim_data.securityctx.dlNAScount.length); } /* Uplink count parameter */ - if (_usim_data.securityctx.ulNAScount.length <= sizeof(uint32_t)) { + if (user->usim_data.securityctx.ulNAScount.length <= sizeof(uint32_t)) { memcpy(&user->emm_data->security->ul_count, - _usim_data.securityctx.ulNAScount.value, - _usim_data.securityctx.ulNAScount.length); + user->usim_data.securityctx.ulNAScount.value, + user->usim_data.securityctx.ulNAScount.length); } /* Ciphering algorithm */ user->emm_data->security->capability.eps_encryption = - ((_usim_data.securityctx.algorithmID.value[0] >> 4) & 0xf); + ((user->usim_data.securityctx.algorithmID.value[0] >> 4) & 0xf); /* Identity protection algorithm */ user->emm_data->security->capability.eps_integrity = - (_usim_data.securityctx.algorithmID.value[0] & 0xf); + (user->usim_data.securityctx.algorithmID.value[0] & 0xf); /* NAS integrity and cyphering keys are not available */ } else { LOG_TRACE(WARNING, @@ -331,9 +324,9 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c } else { /* Check the IMSI */ LOG_TRACE(INFO, "EMM-MAIN - EMM data successfully read"); - user->emm_data->imsi = &_usim_data.imsi; + user->emm_data->imsi = &user->usim_data.imsi; int imsi_ok = _emm_main_imsi_cmp(&user->emm_data->nvdata.imsi, - &_usim_data.imsi); + &user->usim_data.imsi); if (!imsi_ok) { LOG_TRACE(WARNING, "EMM-MAIN - IMSI checking failed nvram: " @@ -347,14 +340,14 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c user->emm_data->nvdata.imsi.u.value[5], user->emm_data->nvdata.imsi.u.value[6], user->emm_data->nvdata.imsi.u.value[7], - _usim_data.imsi.u.value[0], - _usim_data.imsi.u.value[1], - _usim_data.imsi.u.value[2], - _usim_data.imsi.u.value[3], - _usim_data.imsi.u.value[4], - _usim_data.imsi.u.value[5], - _usim_data.imsi.u.value[6], - _usim_data.imsi.u.value[7]); + user->usim_data.imsi.u.value[0], + user->usim_data.imsi.u.value[1], + user->usim_data.imsi.u.value[2], + user->usim_data.imsi.u.value[3], + user->usim_data.imsi.u.value[4], + user->usim_data.imsi.u.value[5], + user->usim_data.imsi.u.value[6], + user->usim_data.imsi.u.value[7]); memset(&user->emm_data->nvdata.rplmn, 0xFF, sizeof(plmn_t)); user->emm_data->nvdata.eplmn.n_plmns = 0; } @@ -504,17 +497,16 @@ const imsi_t *emm_main_get_imsi(emm_data_t *emm_data) ** Description: Get the Mobile Subscriber Dialing Number from the USIM ** ** ** ** Inputs: None ** - ** Others: _usim_data ** ** ** ** Outputs: None ** ** Return: Pointer to the subscriber dialing number ** ** Others: None ** ** ** ***************************************************************************/ -const msisdn_t *emm_main_get_msisdn(void) +const msisdn_t *emm_main_get_msisdn(nas_user_t *user) { LOG_FUNC_IN; - LOG_FUNC_RETURN (&_usim_data.msisdn.number); + LOG_FUNC_RETURN (&user->usim_data.msisdn.number); } /**************************************************************************** diff --git a/openair3/NAS/UE/EMM/emm_main.h b/openair3/NAS/UE/EMM/emm_main.h index 90b5be0b8c..fe574f6d3d 100644 --- a/openair3/NAS/UE/EMM/emm_main.h +++ b/openair3/NAS/UE/EMM/emm_main.h @@ -77,7 +77,7 @@ void emm_main_cleanup(emm_data_t *emm_data); const imsi_t *emm_main_get_imsi(emm_data_t *emm_data); /* User's getter of the subscriber dialing number */ -const msisdn_t *emm_main_get_msisdn(void); +const msisdn_t *emm_main_get_msisdn(nas_user_t *user); /* User's getter/setter for network selection */ int emm_main_set_plmn_selection_mode(nas_user_t *user, int mode, int format, diff --git a/openair3/NAS/UE/nas_proc.c b/openair3/NAS/UE/nas_proc.c index f707c983d2..c00b5677fb 100644 --- a/openair3/NAS/UE/nas_proc.c +++ b/openair3/NAS/UE/nas_proc.c @@ -299,11 +299,11 @@ int nas_proc_get_imsi(emm_data_t *emm_data, char *imsi_str) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_msisdn(char *msisdn_str, int *ton_npi) +int nas_proc_get_msisdn(nas_user_t *user, char *msisdn_str, int *ton_npi) { LOG_FUNC_IN; - const msisdn_t *msisdn = emm_main_get_msisdn(); + const msisdn_t *msisdn = emm_main_get_msisdn(user); if (msisdn != NULL) { union { diff --git a/openair3/NAS/UE/nas_proc.h b/openair3/NAS/UE/nas_proc.h index 672488aee6..bf8dec9e58 100644 --- a/openair3/NAS/UE/nas_proc.h +++ b/openair3/NAS/UE/nas_proc.h @@ -77,7 +77,7 @@ int nas_proc_disable_s1_mode(nas_user_t *user); int nas_proc_get_eps(nas_user_t *user, int *stat); int nas_proc_get_imsi(emm_data_t *emm_data, char *imsi_str); -int nas_proc_get_msisdn(char *msisdn_str, int *ton_npi); +int nas_proc_get_msisdn(nas_user_t *user, char *msisdn_str, int *ton_npi); int nas_proc_get_signal_quality(nas_user_t *user, int *rsrq, int *rsrp); diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c index 63aae7e8c2..af38c72ee5 100644 --- a/openair3/NAS/UE/nas_user.c +++ b/openair3/NAS/UE/nas_user.c @@ -2587,7 +2587,7 @@ static int _nas_user_proc_cnum(nas_user_t *user, const at_command_t *data) } /* Get the International Mobile Subscriber Identity (IMSI) */ - ret_code = nas_proc_get_msisdn(cnum->number, &cnum->type); + ret_code = nas_proc_get_msisdn(user, cnum->number, &cnum->type); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get MS dialing number"); diff --git a/openair3/NAS/UE/user_defs.h b/openair3/NAS/UE/user_defs.h index 7a2851ae5e..f3dcbeaab0 100644 --- a/openair3/NAS/UE/user_defs.h +++ b/openair3/NAS/UE/user_defs.h @@ -51,6 +51,7 @@ Description NAS type definition to manage a user equipment #include "EMM/emm_fsm_defs.h" #include "EMM/emmData.h" #include "EMM/IdleMode_defs.h" +#include "API/USIM/usim_api.h" typedef struct { int fd; @@ -61,6 +62,7 @@ typedef struct { emm_fsm_state_t emm_fsm_status; // Current EPS Mobility Management status emm_data_t *emm_data; // EPS mobility management data emm_plmn_list_t *emm_plmn_list; // list of PLMN identities + usim_data_t usim_data; // USIM application data } nas_user_t; #endif -- 2.26.2