Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG UE
Commits
20cb51cb
Commit
20cb51cb
authored
Jul 12, 2016
by
Frédéric Leroy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
UE/EMM: move _emm_data to nas_user_t
parent
97fdf8bb
Changes
22
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
452 additions
and
501 deletions
+452
-501
openair3/NAS/UE/EMM/Attach.c
openair3/NAS/UE/EMM/Attach.c
+75
-75
openair3/NAS/UE/EMM/Authentication.c
openair3/NAS/UE/EMM/Authentication.c
+27
-27
openair3/NAS/UE/EMM/Detach.c
openair3/NAS/UE/EMM/Detach.c
+5
-5
openair3/NAS/UE/EMM/EmmStatusHdl.c
openair3/NAS/UE/EMM/EmmStatusHdl.c
+2
-2
openair3/NAS/UE/EMM/Identification.c
openair3/NAS/UE/EMM/Identification.c
+8
-8
openair3/NAS/UE/EMM/IdleMode.c
openair3/NAS/UE/EMM/IdleMode.c
+80
-81
openair3/NAS/UE/EMM/IdleMode.h
openair3/NAS/UE/EMM/IdleMode.h
+2
-2
openair3/NAS/UE/EMM/LowerLayer.c
openair3/NAS/UE/EMM/LowerLayer.c
+4
-4
openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
+1
-2
openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
+2
-2
openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c
openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c
+2
-2
openair3/NAS/UE/EMM/SAP/emm_as.c
openair3/NAS/UE/EMM/SAP/emm_as.c
+19
-19
openair3/NAS/UE/EMM/SAP/emm_esm.c
openair3/NAS/UE/EMM/SAP/emm_esm.c
+1
-1
openair3/NAS/UE/EMM/SecurityModeControl.c
openair3/NAS/UE/EMM/SecurityModeControl.c
+38
-37
openair3/NAS/UE/EMM/emmData.h
openair3/NAS/UE/EMM/emmData.h
+0
-7
openair3/NAS/UE/EMM/emm_main.c
openair3/NAS/UE/EMM/emm_main.c
+147
-190
openair3/NAS/UE/EMM/emm_main.h
openair3/NAS/UE/EMM/emm_main.h
+13
-13
openair3/NAS/UE/EMM/emm_proc.h
openair3/NAS/UE/EMM/emm_proc.h
+4
-4
openair3/NAS/UE/nas_proc.c
openair3/NAS/UE/nas_proc.c
+17
-17
openair3/NAS/UE/nas_proc.h
openair3/NAS/UE/nas_proc.h
+1
-1
openair3/NAS/UE/nas_user.c
openair3/NAS/UE/nas_user.c
+1
-1
openair3/NAS/UE/user_defs.h
openair3/NAS/UE/user_defs.h
+3
-1
No files found.
openair3/NAS/UE/EMM/Attach.c
View file @
20cb51cb
...
...
@@ -133,7 +133,7 @@ static struct {
** INITIATED. **
** **
** Inputs: type: Type of the requested attach **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
...
...
@@ -154,7 +154,7 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type)
/* Update the emergency bearer service indicator */
if
(
type
==
EMM_ATTACH_TYPE_EMERGENCY
)
{
_emm_data
.
is_emergency
=
TRUE
;
user
->
emm_data
->
is_emergency
=
TRUE
;
}
/* Setup initial NAS information message to transfer */
...
...
@@ -163,7 +163,7 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type)
emm_as
->
type
=
type
;
/* Set the RRC connection establishment cause */
if
(
_emm_data
.
is_emergency
)
{
if
(
user
->
emm_data
->
is_emergency
)
{
emm_as
->
RRCcause
=
NET_ESTABLISH_CAUSE_EMERGENCY
;
emm_as
->
RRCtype
=
NET_ESTABLISH_TYPE_EMERGENCY_CALLS
;
}
else
{
...
...
@@ -172,7 +172,7 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type)
}
/* Set the PLMN identifier of the selected PLMN */
emm_as
->
plmnID
=
&
_emm_data
.
splmn
;
emm_as
->
plmnID
=
&
user
->
emm_data
->
splmn
;
/*
* Process the EPS mobile identity
*/
...
...
@@ -182,55 +182,55 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type)
emm_as
->
UEid
.
imei
=
NULL
;
/* Check whether the UE is configured for "AttachWithIMSI" */
if
(
_emm_data
.
AttachWithImsi
)
{
if
(
user
->
emm_data
->
AttachWithImsi
)
{
/* Check whether the selected PLMN is neither the registered PLMN
* nor in the list of equivalent PLMNs */
if
(
(
!
_emm_data
.
is_rplmn
)
&&
(
!
_emm_data
.
is_eplmn
)
)
{
if
(
(
!
user
->
emm_data
->
is_rplmn
)
&&
(
!
user
->
emm_data
->
is_eplmn
)
)
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Initiate EPS attach with IMSI"
);
/* Include the IMSI */
emm_as
->
UEid
.
imsi
=
_emm_data
.
imsi
;
emm_as
->
UEid
.
imsi
=
user
->
emm_data
->
imsi
;
}
else
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Initiate EPS attach with NO IMSI, is registered PLMN %d, is equivalent PLMN %d"
,
_emm_data
.
is_rplmn
,
_emm_data
.
is_eplmn
);
user
->
emm_data
->
is_rplmn
,
user
->
emm_data
->
is_eplmn
);
}
}
else
if
(
_emm_data
.
guti
)
{
}
else
if
(
user
->
emm_data
->
guti
)
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Initiate EPS attach with GUTI"
);
/* Include a valid GUTI and the last visited registered TAI */
emm_as
->
UEid
.
guti
=
_emm_data
.
guti
;
emm_as
->
UEid
.
tai
=
_emm_data
.
tai
;
}
else
if
(
!
_emm_data
.
is_emergency
)
{
emm_as
->
UEid
.
guti
=
user
->
emm_data
->
guti
;
emm_as
->
UEid
.
tai
=
user
->
emm_data
->
tai
;
}
else
if
(
!
user
->
emm_data
->
is_emergency
)
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Initiate EPS attach with IMSI cause is no emergency and no GUTI"
);
/* Include the IMSI if no valid GUTI is available */
emm_as
->
UEid
.
imsi
=
_emm_data
.
imsi
;
emm_as
->
UEid
.
imsi
=
user
->
emm_data
->
imsi
;
}
else
{
/* The UE is attaching for emergency bearer services and
* does not hold a valid GUTI */
if
(
_emm_data
.
imsi
)
{
if
(
user
->
emm_data
->
imsi
)
{
/* Include the IMSI if valid (USIM is present) */
LOG_TRACE
(
INFO
,
"EMM-PROC - Initiate EPS attach with IMSI cause is emergency and no GUTI"
);
emm_as
->
UEid
.
imsi
=
_emm_data
.
imsi
;
emm_as
->
UEid
.
imsi
=
user
->
emm_data
->
imsi
;
}
else
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Initiate EPS attach with IMSI cause is emergency and no GUTI and no IMSI"
);
/* Include the IMEI if the IMSI is not valid */
emm_as
->
UEid
.
imei
=
_emm_data
.
imei
;
emm_as
->
UEid
.
imei
=
user
->
emm_data
->
imei
;
}
}
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_as
->
sctx
,
_emm_data
.
security
,
FALSE
,
FALSE
);
emm_as_set_security_data
(
&
emm_as
->
sctx
,
user
->
emm_data
->
security
,
FALSE
,
FALSE
);
emm_as
->
ksi
=
EMM_AS_NO_KEY_AVAILABLE
;
if
(
_emm_data
.
security
)
{
if
(
_emm_data
.
security
->
type
!=
EMM_KSI_NOT_AVAILABLE
)
{
emm_as
->
ksi
=
_emm_data
.
security
->
eksi
;
if
(
user
->
emm_data
->
security
)
{
if
(
user
->
emm_data
->
security
->
type
!=
EMM_KSI_NOT_AVAILABLE
)
{
emm_as
->
ksi
=
user
->
emm_data
->
security
->
eksi
;
}
LOG_TRACE
(
INFO
,
"EMM-PROC - eps_encryption 0x%X"
,
_emm_data
.
security
->
capability
.
eps_encryption
);
LOG_TRACE
(
INFO
,
"EMM-PROC - eps_integrity 0x%X"
,
_emm_data
.
security
->
capability
.
eps_integrity
);
emm_as
->
encryption
=
_emm_data
.
security
->
capability
.
eps_encryption
;
emm_as
->
integrity
=
_emm_data
.
security
->
capability
.
eps_integrity
;
LOG_TRACE
(
INFO
,
"EMM-PROC - eps_encryption 0x%X"
,
user
->
emm_data
->
security
->
capability
.
eps_encryption
);
LOG_TRACE
(
INFO
,
"EMM-PROC - eps_integrity 0x%X"
,
user
->
emm_data
->
security
->
capability
.
eps_integrity
);
emm_as
->
encryption
=
user
->
emm_data
->
security
->
capability
.
eps_encryption
;
emm_as
->
integrity
=
user
->
emm_data
->
security
->
capability
.
eps_integrity
;
}
/*
...
...
@@ -244,7 +244,7 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type)
/* TODO: PDN type should be set according to the IP capability of the UE */
esm_sap
.
data
.
pdn_connect
.
pdn_type
=
NET_PDN_TYPE_IPV4
;
esm_sap
.
data
.
pdn_connect
.
apn
=
NULL
;
esm_sap
.
data
.
pdn_connect
.
is_emergency
=
_emm_data
.
is_emergency
;
esm_sap
.
data
.
pdn_connect
.
is_emergency
=
user
->
emm_data
->
is_emergency
;
rc
=
esm_sap_send
(
user
,
&
esm_sap
);
if
(
rc
!=
RETURNerror
)
{
...
...
@@ -342,7 +342,7 @@ int emm_proc_attach_request(void *args)
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data,
T3412, T3402, T3423 **
** Others:
user->emm_data->
T3412, T3402, T3423 **
** **
***************************************************************************/
int
emm_proc_attach_accept
(
nas_user_t
*
user
,
long
t3412
,
long
t3402
,
long
t3423
,
...
...
@@ -365,10 +365,10 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
T3410
.
id
=
nas_timer_stop
(
T3410
.
id
);
/* Delete old TAI list and store the received TAI list */
_emm_data
.
ltai
.
n_tais
=
n_tais
;
user
->
emm_data
->
ltai
.
n_tais
=
n_tais
;
for
(
i
=
0
;
(
i
<
n_tais
)
&&
(
i
<
EMM_DATA_TAI_MAX
);
i
++
)
{
_emm_data
.
ltai
.
tai
[
i
]
=
tai
[
i
];
user
->
emm_data
->
ltai
.
tai
[
i
]
=
tai
[
i
];
}
/* Update periodic tracking area update timer value */
...
...
@@ -386,22 +386,22 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
/* Delete old GUTI and store the new assigned GUTI if provided */
if
(
guti
)
{
*
_emm_data
.
guti
=
*
guti
;
*
user
->
emm_data
->
guti
=
*
guti
;
}
/* Update the stored list of equivalent PLMNs */
_emm_data
.
nvdata
.
eplmn
.
n_plmns
=
0
;
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
=
0
;
if
(
n_eplmns
>
0
)
{
for
(
i
=
0
;
(
i
<
n_eplmns
)
&&
(
i
<
EMM_DATA_EPLMN_MAX
);
i
++
)
{
int
is_forbidden
=
FALSE
;
if
(
!
_emm_data
.
is_emergency
)
{
if
(
!
user
->
emm_data
->
is_emergency
)
{
/* If the attach procedure is not for emergency bearer
* services, the UE shall remove from the list any PLMN
* code that is already in the list of forbidden PLMNs */
for
(
j
=
0
;
j
<
_emm_data
.
fplmn
.
n_plmns
;
j
++
)
{
if
(
PLMNS_ARE_EQUAL
(
eplmn
[
i
],
_emm_data
.
fplmn
.
plmn
[
j
]))
{
for
(
j
=
0
;
j
<
user
->
emm_data
->
fplmn
.
n_plmns
;
j
++
)
{
if
(
PLMNS_ARE_EQUAL
(
eplmn
[
i
],
user
->
emm_data
->
fplmn
.
plmn
[
j
]))
{
is_forbidden
=
TRUE
;
break
;
}
...
...
@@ -409,15 +409,15 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
}
if
(
!
is_forbidden
)
{
_emm_data
.
nvdata
.
eplmn
.
plmn
[
_emm_data
.
nvdata
.
eplmn
.
n_plmns
++
]
=
user
->
emm_data
->
nvdata
.
eplmn
.
plmn
[
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
++
]
=
eplmn
[
i
];
}
}
/* Add the PLMN code of the registered PLMN that sent the list */
if
(
_emm_data
.
nvdata
.
eplmn
.
n_plmns
<
EMM_DATA_EPLMN_MAX
)
{
_emm_data
.
nvdata
.
eplmn
.
plmn
[
_emm_data
.
nvdata
.
eplmn
.
n_plmns
++
]
=
_emm_data
.
splmn
;
if
(
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
<
EMM_DATA_EPLMN_MAX
)
{
user
->
emm_data
->
nvdata
.
eplmn
.
plmn
[
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
++
]
=
user
->
emm_data
->
splmn
;
}
}
...
...
@@ -448,11 +448,11 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
* be sent to the network
*/
emm_sap
.
primitive
=
EMMAS_DATA_REQ
;
emm_sap
.
u
.
emm_as
.
u
.
data
.
guti
=
_emm_data
.
guti
;
emm_sap
.
u
.
emm_as
.
u
.
data
.
guti
=
user
->
emm_data
->
guti
;
emm_sap
.
u
.
emm_as
.
u
.
data
.
ueid
=
0
;
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_sap
.
u
.
emm_as
.
u
.
data
.
sctx
,
_emm_data
.
security
,
FALSE
,
TRUE
);
user
->
emm_data
->
security
,
FALSE
,
TRUE
);
/* Get the activate default EPS bearer context accept message
* to be transfered within the ESM container of the attach
* complete message */
...
...
@@ -497,7 +497,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data,
_emm_attach_data, T3410 **
** Others:
user->emm_data->
_emm_attach_data, T3410 **
** **
***************************************************************************/
int
emm_proc_attach_reject
(
nas_user_t
*
user
,
int
emm_cause
,
const
OctetString
*
esm_msg_pP
)
...
...
@@ -528,15 +528,15 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e
case
EMM_CAUSE_ROAMING_NOT_ALLOWED
:
case
EMM_CAUSE_NO_SUITABLE_CELLS
:
/* Set the EPS update status to EU3 ROAMING NOT ALLOWED */
_emm_data
.
status
=
EU3_ROAMING_NOT_ALLOWED
;
user
->
emm_data
->
status
=
EU3_ROAMING_NOT_ALLOWED
;
/* Delete the GUTI */
_emm_data
.
guti
=
NULL
;
user
->
emm_data
->
guti
=
NULL
;
/* Delete the last visited registered TAI */
_emm_data
.
tai
=
NULL
;
user
->
emm_data
->
tai
=
NULL
;
/* Delete the eKSI */
if
(
_emm_data
.
security
)
{
_emm_data
.
security
->
type
=
EMM_KSI_NOT_AVAILABLE
;
if
(
user
->
emm_data
->
security
)
{
user
->
emm_data
->
security
->
type
=
EMM_KSI_NOT_AVAILABLE
;
}
break
;
...
...
@@ -552,16 +552,16 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e
case
EMM_CAUSE_EPS_NOT_ALLOWED
:
case
EMM_CAUSE_BOTH_NOT_ALLOWED
:
/* Consider the USIM as invalid for EPS services */
_emm_data
.
usim_is_valid
=
FALSE
;
user
->
emm_data
->
usim_is_valid
=
FALSE
;
/* Delete the list of equivalent PLMNs */
_emm_data
.
nvdata
.
eplmn
.
n_plmns
=
0
;
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
=
0
;
break
;
case
EMM_CAUSE_PLMN_NOT_ALLOWED
:
case
EMM_CAUSE_NOT_AUTHORIZED_IN_PLMN
:
case
EMM_CAUSE_ROAMING_NOT_ALLOWED
:
/* Delete the list of equivalent PLMNs */
_emm_data
.
nvdata
.
eplmn
.
n_plmns
=
0
;
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
=
0
;
/* Reset the attach attempt counter */
_emm_attach_data
.
attempt_count
=
0
;
break
;
...
...
@@ -576,7 +576,7 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e
case
EMM_CAUSE_ESM_FAILURE
:
/* 3GPP TS 24.301, section 5.5.1.2.6, case d */
if
(
_emm_data
.
NAS_SignallingPriority
!=
1
)
{
if
(
user
->
emm_data
->
NAS_SignallingPriority
!=
1
)
{
/* The UE is not configured for NAS signalling low priority;
* set the attach attempt counter to 5 */
_emm_attach_data
.
attempt_count
=
EMM_ATTACH_COUNTER_MAX
;
...
...
@@ -603,25 +603,25 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e
case
EMM_CAUSE_PLMN_NOT_ALLOWED
:
case
EMM_CAUSE_NOT_AUTHORIZED_IN_PLMN
:
/* Store the PLMN identity in the "forbidden PLMN list" */
_emm_data
.
fplmn
.
plmn
[
_emm_data
.
fplmn
.
n_plmns
++
]
=
_emm_data
.
splmn
;
user
->
emm_data
->
fplmn
.
plmn
[
user
->
emm_data
->
fplmn
.
n_plmns
++
]
=
user
->
emm_data
->
splmn
;
break
;
case
EMM_CAUSE_TA_NOT_ALLOWED
:
/* Store the current TAI in the list of "forbidden tracking
* areas for regional provision of service" */
_emm_data
.
ftai
.
tai
[
_emm_data
.
ftai
.
n_tais
++
]
=
*
_emm_data
.
tai
;
user
->
emm_data
->
ftai
.
tai
[
user
->
emm_data
->
ftai
.
n_tais
++
]
=
*
user
->
emm_data
->
tai
;
break
;
case
EMM_CAUSE_ROAMING_NOT_ALLOWED
:
/* Store the current TAI in the list of "forbidden tracking
* areas for roaming" */
_emm_data
.
ftai_roaming
.
tai
[
_emm_data
.
ftai_roaming
.
n_tais
++
]
=
*
_emm_data
.
tai
;
user
->
emm_data
->
ftai_roaming
.
tai
[
user
->
emm_data
->
ftai_roaming
.
n_tais
++
]
=
*
user
->
emm_data
->
tai
;
break
;
case
EMM_CAUSE_EPS_NOT_ALLOWED_IN_PLMN
:
/* Store the PLMN identity in the "forbidden PLMNs for GPRS
* service" list */
_emm_data
.
fplmn_gprs
.
plmn
[
_emm_data
.
fplmn_gprs
.
n_plmns
++
]
=
_emm_data
.
splmn
;
user
->
emm_data
->
fplmn_gprs
.
plmn
[
user
->
emm_data
->
fplmn_gprs
.
n_plmns
++
]
=
user
->
emm_data
->
splmn
;
break
;
default
:
...
...
@@ -662,7 +662,7 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e
break
;
case
EMM_CAUSE_IMEI_NOT_ACCEPTED
:
if
(
_emm_data
.
is_emergency
)
{
if
(
user
->
emm_data
->
is_emergency
)
{
/*
* Notify EMM that the UE failed to register to the network
* for emergency bearer services because "IMEI not accepted"
...
...
@@ -714,7 +714,7 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data,
_emm_attach_data **
** Others:
user->emm_data->
_emm_attach_data **
** **
***************************************************************************/
int
emm_proc_attach_complete
(
void
*
args
)
...
...
@@ -736,8 +736,8 @@ int emm_proc_attach_complete(void *args)
/* TODO: Reset the tracking area updating attempt counter */
/* Set the EPS update status to EU1 UPDATED */
_emm_data
.
status
=
EU1_UPDATED
;
_emm_data
.
is_attached
=
TRUE
;
user
->
emm_data
->
status
=
EU1_UPDATED
;
user
->
emm_data
->
is_attached
=
TRUE
;
/*
* Notify EMM that network attach complete message has been delivered
...
...
@@ -897,7 +897,7 @@ int emm_proc_attach_restart(nas_user_t *user)
* Notify EMM that the attach procedure has to be restarted
*/
emm_sap
.
primitive
=
EMMREG_ATTACH_INIT
;
emm_sap
.
u
.
emm_reg
.
u
.
attach
.
is_emergency
=
_emm_data
.
is_emergency
;
emm_sap
.
u
.
emm_reg
.
u
.
attach
.
is_emergency
=
user
->
emm_data
->
is_emergency
;
rc
=
emm_sap_send
(
user
,
&
emm_sap
);
LOG_FUNC_RETURN
(
rc
);
...
...
@@ -914,17 +914,17 @@ int emm_proc_attach_restart(nas_user_t *user)
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
***************************************************************************/
int
emm_proc_attach_set_emergency
(
void
)
int
emm_proc_attach_set_emergency
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_TRACE
(
WARNING
,
"EMM-PROC - UE is now attached to the network for "
"emergency bearer services only"
);
_emm_data
.
is_emergency
=
TRUE
;
emm_data
->
is_emergency
=
TRUE
;
LOG_FUNC_RETURN
(
RETURNok
);
}
...
...
@@ -941,7 +941,7 @@ int emm_proc_attach_set_emergency(void)
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
***************************************************************************/
int
emm_proc_attach_set_detach
(
void
*
nas_user
)
...
...
@@ -955,7 +955,7 @@ int emm_proc_attach_set_detach(void *nas_user)
"EMM-PROC - UE is now locally detached from the network"
);
/* Reset the network attachment indicator */
_emm_data
.
is_attached
=
FALSE
;
user
->
emm_data
->
is_attached
=
FALSE
;
/*
* Notify that the UE is locally detached from the network
*/
...
...
@@ -1016,7 +1016,7 @@ void *_emm_attach_t3410_handler(void *args)
if
(
rc
!=
RETURNerror
)
{
/* Locally release the NAS signalling connection */
_emm_data
.
ecm_status
=
ECM_IDLE
;
user
->
emm_data
->
ecm_status
=
ECM_IDLE
;
}
LOG_FUNC_RETURN
(
NULL
);
...
...
@@ -1056,7 +1056,7 @@ static void *_emm_attach_t3411_handler(void *args)
* restarted
*/
emm_sap
.
primitive
=
EMMREG_ATTACH_INIT
;
emm_sap
.
u
.
emm_reg
.
u
.
attach
.
is_emergency
=
_emm_data
.
is_emergency
;
emm_sap
.
u
.
emm_reg
.
u
.
attach
.
is_emergency
=
user
->
emm_data
->
is_emergency
;
(
void
)
emm_sap_send
(
user
,
&
emm_sap
);
...
...
@@ -1103,7 +1103,7 @@ static void *_emm_attach_t3402_handler(void *args)
* restarted
*/
emm_sap
.
primitive
=
EMMREG_ATTACH_INIT
;
emm_sap
.
u
.
emm_reg
.
u
.
attach
.
is_emergency
=
_emm_data
.
is_emergency
;
emm_sap
.
u
.
emm_reg
.
u
.
attach
.
is_emergency
=
user
->
emm_data
->
is_emergency
;
(
void
)
emm_sap_send
(
user
,
&
emm_sap
);
...
...
@@ -1133,7 +1133,7 @@ static void *_emm_attach_t3402_handler(void *args)
** **
** Outputs: emm_sap: EMM service access point **
** Return: None **
** Others:
_emm_data,
_emm_attach_data, T3402, T3410, **
** Others:
user->emm_data->
_emm_attach_data, T3402, T3410, **
** T3411 **
** **
***************************************************************************/
...
...
@@ -1165,21 +1165,21 @@ static void _emm_attach_abnormal_cases_bcd(nas_user_t *user, emm_sap_t *emm_sap)
emm_sap
->
primitive
=
EMMREG_ATTACH_FAILED
;
}
else
{
/* Delete the GUTI */
_emm_data
.
guti
=
NULL
;
user
->
emm_data
->
guti
=
NULL
;
/* Delete the TAI list */
_emm_data
.
ltai
.
n_tais
=
0
;
user
->
emm_data
->
ltai
.
n_tais
=
0
;
/* Delete the last visited registered TAI */
_emm_data
.
tai
=
NULL
;
user
->
emm_data
->
tai
=
NULL
;
/* Delete the list of equivalent PLMNs */
_emm_data
.
nvdata
.
eplmn
.
n_plmns
=
0
;
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
=
0
;
/* Delete the eKSI */
if
(
_emm_data
.
security
)
{
_emm_data
.
security
->
type
=
EMM_KSI_NOT_AVAILABLE
;
if
(
user
->
emm_data
->
security
)
{
user
->
emm_data
->
security
->
type
=
EMM_KSI_NOT_AVAILABLE
;
}
/* Set the EPS update status to EU2 NOT UPDATED */
_emm_data
.
status
=
EU2_NOT_UPDATED
;
user
->
emm_data
->
status
=
EU2_NOT_UPDATED
;
/* Start T3402 timer */
T3402
.
id
=
nas_timer_start
(
T3402
.
sec
,
_emm_attach_t3402_handler
,
user
);
...
...
openair3/NAS/UE/EMM/Authentication.c
View file @
20cb51cb
...
...
@@ -163,11 +163,11 @@ static int _authentication_kasme(const OctetString *autn,
** ksi: The NAS ket sey identifier **
** rand: Authentication parameter RAND **
** autn: Authentication parameter AUTN **
** Others:
_emm_data,
_authentication_data **
** Others:
user->emm_data->
_authentication_data **
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data,
_authentication_data, T3416, **
** Others:
user->emm_data->
_authentication_data, T3416, **
** T3418, T3420 **
** **
***************************************************************************/
...
...
@@ -185,7 +185,7 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi,
* The UE shall proceed with an EPS authentication challenge only if a
* USIM is present
*/
if
(
!
_emm_data
.
usim_is_valid
)
{
if
(
!
user
->
emm_data
->
usim_is_valid
)
{
LOG_TRACE
(
WARNING
,
"EMM-PROC - USIM is not present or not valid"
);
LOG_FUNC_RETURN
(
RETURNerror
);
}
...
...
@@ -327,14 +327,14 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi,
*/
emm_sap_t
emm_sap
;
emm_sap
.
primitive
=
EMMAS_SECURITY_RES
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
guti
=
_emm_data
.
guti
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
guti
=
user
->
emm_data
->
guti
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
ueid
=
0
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
msgType
=
EMM_AS_MSG_TYPE_AUTH
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
emm_cause
=
EMM_CAUSE_SUCCESS
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
res
=
&
res
;
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_sap
.
u
.
emm_as
.
u
.
security
.
sctx
,
_emm_data
.
security
,
FALSE
,
TRUE
);
user
->
emm_data
->
security
,
FALSE
,
TRUE
);
rc
=
emm_sap_send
(
user
,
&
emm_sap
);
if
(
rc
!=
RETURNerror
)
{
...
...
@@ -344,29 +344,29 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi,
_authentication_data
.
sync_count
=
0
;
/* Create non-current EPS security context */
if
(
_emm_data
.
non_current
==
NULL
)
{
_emm_data
.
non_current
=
if
(
user
->
emm_data
->
non_current
==
NULL
)
{
user
->
emm_data
->
non_current
=
(
emm_security_context_t
*
)
malloc
(
sizeof
(
emm_security_context_t
));
}
if
(
_emm_data
.
non_current
)
{
memset
(
_emm_data
.
non_current
,
0
,
sizeof
(
emm_security_context_t
));
if
(
user
->
emm_data
->
non_current
)
{
memset
(
user
->
emm_data
->
non_current
,
0
,
sizeof
(
emm_security_context_t
));
/* Set the security context type */
if
(
native_ksi
)
{
_emm_data
.
non_current
->
type
=
EMM_KSI_NATIVE
;
user
->
emm_data
->
non_current
->
type
=
EMM_KSI_NATIVE
;
}
else
{
_emm_data
.
non_current
->
type
=
EMM_KSI_MAPPED
;
user
->
emm_data
->
non_current
->
type
=
EMM_KSI_MAPPED
;
}
/* Set the EPS key set identifier */
_emm_data
.
non_current
->
eksi
=
ksi
;
user
->
emm_data
->
non_current
->
eksi
=
ksi
;
/* Derive the Kasme from the authentication challenge using
* the PLMN identity of the selected PLMN */
_emm_data
.
non_current
->
kasme
.
length
=
AUTH_KASME_SIZE
;
_emm_data
.
non_current
->
kasme
.
value
=
malloc
(
32
);
_authentication_kasme
(
autn
,
&
ck
,
&
ik
,
&
_emm_data
.
splmn
,
&
_emm_data
.
non_current
->
kasme
);
user
->
emm_data
->
non_current
->
kasme
.
length
=
AUTH_KASME_SIZE
;
user
->
emm_data
->
non_current
->
kasme
.
value
=
malloc
(
32
);
_authentication_kasme
(
autn
,
&
ck
,
&
ik
,
&
user
->
emm_data
->
splmn
,
&
user
->
emm_data
->
non_current
->
kasme
);
/* NAS integrity and cyphering keys are not yet available */
}
}
...
...
@@ -392,7 +392,7 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi,
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data,
_authentication_data, T3410, **
** Others:
user->emm_data->
_authentication_data, T3410, **
** T3417, T3430 **
** **
***************************************************************************/
...
...
@@ -409,21 +409,21 @@ int emm_proc_authentication_reject(nas_user_t *user)
(
void
)
emm_proc_authentication_delete
();
/* Set the EPS update status to EU3 ROAMING NOT ALLOWED */
_emm_data
.
status
=
EU3_ROAMING_NOT_ALLOWED
;
user
->
emm_data
->
status
=
EU3_ROAMING_NOT_ALLOWED
;
/* Delete the stored GUTI */
_emm_data
.
guti
=
NULL
;
user
->
emm_data
->
guti
=
NULL
;
/* Delete the TAI list */
_emm_data
.
ltai
.
n_tais
=
0
;
user
->
emm_data
->
ltai
.
n_tais
=
0
;
/* Delete the last visited registered TAI */
_emm_data
.
tai
=
NULL
;
user
->
emm_data
->
tai
=
NULL
;
/* Delete the eKSI */
if
(
_emm_data
.
security
)
{
_emm_data
.
security
->
type
=
EMM_KSI_NOT_AVAILABLE
;
if
(
user
->
emm_data
->
security
)
{
user
->
emm_data
->
security
->
type
=
EMM_KSI_NOT_AVAILABLE
;
}
/* Consider the USIM invalid */
_emm_data
.
usim_is_valid
=
FALSE
;
user
->
emm_data
->
usim_is_valid
=
FALSE
;
/* Stop timer T3410 */
if
(
T3410
.
id
!=
NAS_TIMER_INACTIVE_ID
)
{
...
...
@@ -664,14 +664,14 @@ static int _authentication_abnormal_cases_cde(nas_user_t *user, int emm_cause,
*/
emm_sap_t
emm_sap
;
emm_sap
.
primitive
=
EMMAS_SECURITY_RES
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
guti
=
_emm_data
.
guti
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
guti
=
user
->
emm_data
->
guti
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
ueid
=
0
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
msgType
=
EMM_AS_MSG_TYPE_AUTH
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
emm_cause
=
emm_cause
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
auts
=
auts
;
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_sap
.
u
.
emm_as
.
u
.
security
.
sctx
,
_emm_data
.
security
,
FALSE
,
TRUE
);
user
->
emm_data
->
security
,
FALSE
,
TRUE
);
rc
=
emm_sap_send
(
user
,
&
emm_sap
);
if
(
rc
!=
RETURNerror
)
{
...
...
@@ -787,7 +787,7 @@ static int _authentication_abnormal_case_f(nas_user_t *user)
*/
emm_sap_t
emm_sap
;
emm_sap
.
primitive
=
EMMAS_RELEASE_REQ
;
emm_sap
.
u
.
emm_as
.
u
.
release
.
guti
=
_emm_data
.
guti
;
emm_sap
.
u
.
emm_as
.
u
.
release
.
guti
=
user
->
emm_data
->
guti
;
emm_sap
.
u
.
emm_as
.
u
.
release
.
cause
=
EMM_AS_CAUSE_AUTHENTICATION
;
rc
=
emm_sap_send
(
user
,
&
emm_sap
);
...
...
openair3/NAS/UE/EMM/Detach.c
View file @
20cb51cb
...
...
@@ -124,7 +124,7 @@ static struct {
** Inputs: type: Type of the requested detach **
** switch_off: Indicates whether the detach is required **
** because the UE is switched off or not **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
...
...
@@ -167,10 +167,10 @@ int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_of
/* Set the switch-off indicator */
emm_as
->
switch_off
=
switch_off
;
/* Set the EPS mobile identity */
emm_as
->
guti
=
_emm_data
.
guti
;
emm_as
->
guti
=
user
->
emm_data
->
guti
;
emm_as
->
ueid
=
0
;
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_as
->
sctx
,
_emm_data
.
security
,
FALSE
,
TRUE
);
emm_as_set_security_data
(
&
emm_as
->
sctx
,
user
->
emm_data
->
security
,
FALSE
,
TRUE
);
/*
* Notify EMM-AS SAP that Detach Request message has to
...
...
@@ -413,10 +413,10 @@ void *_emm_detach_t3421_handler(void *args)
/* Set the switch-off indicator */
emm_as
->
switch_off
=
_emm_detach_data
.
switch_off
;
/* Set the EPS mobile identity */
emm_as
->
guti
=
_emm_data
.
guti
;
emm_as
->
guti
=
user
->
emm_data
->
guti
;
emm_as
->
ueid
=
0
;
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_as
->
sctx
,
_emm_data
.
security
,
emm_as_set_security_data
(
&
emm_as
->
sctx
,
user
->
emm_data
->
security
,
FALSE
,
TRUE
);
/*
...
...
openair3/NAS/UE/EMM/EmmStatusHdl.c
View file @
20cb51cb
...
...
@@ -134,8 +134,8 @@ int emm_proc_status(nas_user_t *user, unsigned int ueid, int emm_cause)
emm_sap
.
u
.
emm_as
.
u
.
status
.
emm_cause
=
emm_cause
;
emm_sap
.
u
.
emm_as
.
u
.
status
.
ueid
=
ueid
;
emm_sap
.
u
.
emm_as
.
u
.
status
.
guti
=
_emm_data
.
guti
;
sctx
=
_emm_data
.
security
;
emm_sap
.
u
.
emm_as
.
u
.
status
.
guti
=
user
->
emm_data
->
guti
;
sctx
=
user
->
emm_data
->
security
;
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_sap
.
u
.
emm_as
.
u
.
status
.
sctx
,
sctx
,
FALSE
,
TRUE
);
...
...
openair3/NAS/UE/EMM/Identification.c
View file @
20cb51cb
...
...
@@ -130,8 +130,8 @@ int emm_proc_identification_request(nas_user_t *user, emm_proc_identity_type_t t
imsi_t
modified_imsi
;
/* International Mobile Subscriber Identity is requested */
if
(
_emm_data
.
imsi
)
{
memcpy
(
&
modified_imsi
,
_emm_data
.
imsi
,
sizeof
(
modified_imsi
));
if
(
user
->
emm_data
->
imsi
)
{
memcpy
(
&
modified_imsi
,
user
->
emm_data
->
imsi
,
sizeof
(
modified_imsi
));
/* LW: Eventually replace the 0xF value set in MNC digit 3 by a 0 to avoid IMSI to be truncated before reaching HSS */
if
(
modified_imsi
.
u
.
num
.
digit6
==
0xF
)
{
...
...
@@ -167,9 +167,9 @@ int emm_proc_identification_request(nas_user_t *user, emm_proc_identity_type_t t
case
EMM_IDENT_TYPE_IMEI
:
/* International Mobile Equipment Identity is requested */
if
(
_emm_data
.
imei
)
{
if
(
user
->
emm_data
->
imei
)
{
emm_sap
.
u
.
emm_as
.
u
.
security
.
identType
=
EMM_IDENT_TYPE_IMEI
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
imei
=
_emm_data
.
imei
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
imei
=
user
->
emm_data
->
imei
;
}
break
;
...
...
@@ -177,9 +177,9 @@ int emm_proc_identification_request(nas_user_t *user, emm_proc_identity_type_t t
case
EMM_IDENT_TYPE_TMSI
:
/* Temporary Mobile Subscriber Identity is requested */
if
(
_emm_data
.
guti
)
{
if
(
user
->
emm_data
->
guti
)
{
emm_sap
.
u
.
emm_as
.
u
.
security
.
identType
=
EMM_IDENT_TYPE_TMSI
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
tmsi
=
_emm_data
.
guti
->
m_tmsi
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
tmsi
=
user
->
emm_data
->
guti
->
m_tmsi
;
}
break
;
...
...
@@ -194,12 +194,12 @@ int emm_proc_identification_request(nas_user_t *user, emm_proc_identity_type_t t
* to the MME
*/
emm_sap
.
primitive
=
EMMAS_SECURITY_RES
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
guti
=
_emm_data
.
guti
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
guti
=
user
->
emm_data
->
guti
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
ueid
=
0
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
msgType
=
EMM_AS_MSG_TYPE_IDENT
;
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_sap
.
u
.
emm_as
.
u
.
security
.
sctx
,
_emm_data
.
security
,
FALSE
,
TRUE
);
user
->
emm_data
->
security
,
FALSE
,
TRUE
);
rc
=
emm_sap_send
(
user
,
&
emm_sap
);
LOG_FUNC_RETURN
(
rc
);
...
...
openair3/NAS/UE/EMM/IdleMode.c
View file @
20cb51cb
...
...
@@ -269,10 +269,9 @@ int IdleMode_get_splmn_index(void)
** **
** Outputs: None **
** Return: The size of the list in bytes **
** Others: _emm_data.plist **
** **
***************************************************************************/
int
IdleMode_update_plmn_list
(
int
i
)
int
IdleMode_update_plmn_list
(
emm_data_t
*
emm_data
,
int
i
)
{
int
offset
=
0
;
int
n
=
1
;
...
...
@@ -281,22 +280,22 @@ int IdleMode_update_plmn_list(int i)
struct
plmn_param_t
*
plmn
=
&
(
_emm_plmn_list
.
param
[
i
++
]);
if
(
n
++
>
1
)
{
offset
+=
snprintf
(
_emm_data
.
plist
.
buffer
+
offset
,
offset
+=
snprintf
(
emm_data
->
plist
.
buffer
+
offset
,
EMM_DATA_BUFFER_SIZE
-
offset
,
","
);
}
offset
+=
snprintf
(
_emm_data
.
plist
.
buffer
+
offset
,
offset
+=
snprintf
(
emm_data
->
plist
.
buffer
+
offset
,
EMM_DATA_BUFFER_SIZE
-
offset
,
"(%d,%s,%s,%s"
,
plmn
->
stat
,
plmn
->
fullname
,
plmn
->
shortname
,
plmn
->
num
);
if
(
plmn
->
rat
!=
NET_ACCESS_UNAVAILABLE
)
{
offset
+=
snprintf
(
_emm_data
.
plist
.
buffer
+
offset
,
offset
+=
snprintf
(
emm_data
->
plist
.
buffer
+
offset
,
EMM_DATA_BUFFER_SIZE
-
offset
,
",%d"
,
plmn
->
rat
);
}
offset
+=
snprintf
(
_emm_data
.
plist
.
buffer
+
offset
,
offset
+=
snprintf
(
emm_data
->
plist
.
buffer
+
offset
,
EMM_DATA_BUFFER_SIZE
-
offset
,
")"
);
}
...
...
@@ -503,7 +502,7 @@ int IdleMode_get_plmn_id_index(const char *plmn)
** to PLMN selection procedure. **
** **
** Inputs: None **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
...
...
@@ -518,21 +517,21 @@ int emm_proc_initialize(nas_user_t *user)
int
rc
;
int
i
;
if
(
!
_emm_data
.
usim_is_valid
)
{
if
(
!
user
->
emm_data
->
usim_is_valid
)
{
/* The USIM application is not present or not valid */
LOG_TRACE
(
WARNING
,
"EMM-IDLE - USIM is not valid"
);
emm_sap
.
primitive
=
EMMREG_NO_IMSI
;
}
else
{
/* The highest priority is given to either the "equivalent PLMNs"
* if available, or the last registered PLMN */
if
(
_emm_data
.
nvdata
.
eplmn
.
n_plmns
>
0
)
{
for
(
i
=
0
;
i
<
_emm_data
.
nvdata
.
eplmn
.
n_plmns
;
i
++
)
{
if
(
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
>
0
)
{
for
(
i
=
0
;
i
<
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
;
i
++
)
{
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
++
]
=
&
_emm_data
.
nvdata
.
eplmn
.
plmn
[
i
];
&
user
->
emm_data
->
nvdata
.
eplmn
.
plmn
[
i
];
}
}
else
if
(
PLMN_IS_VALID
(
_emm_data
.
nvdata
.
rplmn
)
)
{
}
else
if
(
PLMN_IS_VALID
(
user
->
emm_data
->
nvdata
.
rplmn
)
)
{
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
++
]
=
&
_emm_data
.
nvdata
.
rplmn
;
&
user
->
emm_data
->
nvdata
.
rplmn
;
}
/* Update the index of the HPLMN or EHPLM of highest priority.
...
...
@@ -544,25 +543,25 @@ int emm_proc_initialize(nas_user_t *user)
/* Add the highest priority PLMN in the list of "equivalent HPLMNs"
if present and not empty, or the HPLMN derived from the IMSI */
if
(
_emm_data
.
ehplmn
.
n_plmns
>
0
)
{
if
(
user
->
emm_data
->
ehplmn
.
n_plmns
>
0
)
{
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
++
]
=
&
_emm_data
.
ehplmn
.
plmn
[
0
];
&
user
->
emm_data
->
ehplmn
.
plmn
[
0
];
}
else
{
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
++
]
=
&
_emm_data
.
hplmn
;
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
++
]
=
&
user
->
emm_data
->
hplmn
;
}
/* Each PLMN/access technology combination in the "User
* Controlled PLMN Selector with Access Technology" */
for
(
i
=
0
;
i
<
_emm_data
.
plmn
.
n_plmns
;
i
++
)
{
for
(
i
=
0
;
i
<
user
->
emm_data
->
plmn
.
n_plmns
;
i
++
)
{
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
++
]
=
&
_emm_data
.
plmn
.
plmn
[
i
];
&
user
->
emm_data
->
plmn
.
plmn
[
i
];
}
/* Each PLMN/access technology combination in the "Operator
* Controlled PLMN Selector with Access Technology" */
for
(
i
=
0
;
i
<
_emm_data
.
oplmn
.
n_plmns
;
i
++
)
{
for
(
i
=
0
;
i
<
user
->
emm_data
->
oplmn
.
n_plmns
;
i
++
)
{
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
++
]
=
&
_emm_data
.
oplmn
.
plmn
[
i
];
&
user
->
emm_data
->
oplmn
.
plmn
[
i
];
}
/* Other PLMN/access technology combinations with received
...
...
@@ -582,9 +581,9 @@ int emm_proc_initialize(nas_user_t *user)
plmn
->
fullname
[
0
]
=
'\0'
;
plmn
->
shortname
[
0
]
=
'\0'
;
}
else
{
strncpy
(
plmn
->
fullname
,
_emm_data
.
opnn
[
id
].
fullname
,
strncpy
(
plmn
->
fullname
,
user
->
emm_data
->
opnn
[
id
].
fullname
,
NET_FORMAT_LONG_SIZE
);
strncpy
(
plmn
->
shortname
,
_emm_data
.
opnn
[
id
].
shortname
,
strncpy
(
plmn
->
shortname
,
user
->
emm_data
->
opnn
[
id
].
shortname
,
NET_FORMAT_SHORT_SIZE
);
}
...
...
@@ -627,7 +626,7 @@ int emm_proc_initialize(nas_user_t *user)
** mode. **
** **
** Inputs: None **
** Others: _emm_plmn_list,
_emm_data
**
** Others: _emm_plmn_list,
user->emm_data->
**
** **
** Outputs: None **
** Return: None **
...
...
@@ -640,7 +639,7 @@ int emm_proc_plmn_selection(nas_user_t *user, int index)
int
rc
=
RETURNok
;
if
(
_emm_data
.
plmn_mode
!=
EMM_DATA_PLMN_AUTO
)
{
if
(
user
->
emm_data
->
plmn_mode
!=
EMM_DATA_PLMN_AUTO
)
{
/*
* Manual or manual/automatic mode of operation
* --------------------------------------------
...
...
@@ -649,13 +648,13 @@ int emm_proc_plmn_selection(nas_user_t *user, int index)
/*
* Selection of the last registered or equivalent PLMNs failed
*/
if
(
_emm_data
.
plmn_index
<
0
)
{
if
(
user
->
emm_data
->
plmn_index
<
0
)
{
/*
* The user did not select any PLMN yet; display the ordered
* list of available PLMNs to the user
*/
index
=
-
1
;
rc
=
emm_proc_network_notify
(
_emm_plmn_list
.
hplmn
);
rc
=
emm_proc_network_notify
(
user
->
emm_data
,
_emm_plmn_list
.
hplmn
);
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
WARNING
,
"EMM-IDLE - Failed to notify "
...
...
@@ -665,7 +664,7 @@ int emm_proc_plmn_selection(nas_user_t *user, int index)
/*
* Try to register to the PLMN manually selected by the user
*/
index
=
_emm_data
.
plmn_index
;
index
=
user
->
emm_data
->
plmn_index
;
}
}
}
...
...
@@ -714,11 +713,11 @@ int emm_proc_plmn_selection(nas_user_t *user, int index)
** ci: The identifier of the cell **
** rat: The radio access technology supported by **
** the cell **
** Others: _emm_plmn_list,
_emm_data
**
** Others: _emm_plmn_list,
user->emm_data->
**
** **
** Outputs: None **
** Return: None **
** Others: _emm_plmn_list,
_emm_data
**
** Others: _emm_plmn_list,
user->emm_data->
**
** **
***************************************************************************/
int
emm_proc_plmn_selection_end
(
nas_user_t
*
user
,
int
found
,
tac_t
tac
,
ci_t
ci
,
AcT_t
rat
)
...
...
@@ -732,15 +731,15 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
LOG_TRACE
(
INFO
,
"EMM-IDLE - %s cell found for PLMN %d in %s mode"
,
(
found
)
?
"One"
:
"No"
,
index
,
(
_emm_data
.
plmn_mode
==
EMM_DATA_PLMN_AUTO
)
?
"Automatic"
:
(
_emm_data
.
plmn_mode
==
EMM_DATA_PLMN_MANUAL
)
?
"Manual"
:
(
user
->
emm_data
->
plmn_mode
==
EMM_DATA_PLMN_AUTO
)
?
"Automatic"
:
(
user
->
emm_data
->
plmn_mode
==
EMM_DATA_PLMN_MANUAL
)
?
"Manual"
:
"Automatic/manual"
);
if
(
found
)
{
int
is_forbidden
=
FALSE
;
/* Select the PLMN of which a suitable cell has been found */
_emm_data
.
splmn
=
*
_emm_plmn_list
.
plmn
[
index
];
user
->
emm_data
->
splmn
=
*
_emm_plmn_list
.
plmn
[
index
];
/* Update the selected PLMN's parameters */
_emm_plmn_list
.
param
[
index
].
tac
=
tac
;
...
...
@@ -748,13 +747,13 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
_emm_plmn_list
.
param
[
index
].
rat
=
rat
;
/* Update the location data and notify EMM that data have changed */
rc
=
emm_proc_location_notify
(
tac
,
ci
,
rat
);
rc
=
emm_proc_location_notify
(
user
->
emm_data
,
tac
,
ci
,
rat
);
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
WARNING
,
"EMM-IDLE - Failed to notify location update"
);
}
if
(
_emm_data
.
plmn_mode
==
EMM_DATA_PLMN_AUTO
)
{
if
(
user
->
emm_data
->
plmn_mode
==
EMM_DATA_PLMN_AUTO
)
{
/*
* Automatic mode of operation
* ---------------------------
...
...
@@ -762,17 +761,17 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
int
i
;
/* Check if the selected PLMN is in the forbidden list */
for
(
i
=
0
;
i
<
_emm_data
.
fplmn
.
n_plmns
;
i
++
)
{
if
(
PLMNS_ARE_EQUAL
(
_emm_data
.
splmn
,
_emm_data
.
fplmn
.
plmn
[
i
]))
{
for
(
i
=
0
;
i
<
user
->
emm_data
->
fplmn
.
n_plmns
;
i
++
)
{
if
(
PLMNS_ARE_EQUAL
(
user
->
emm_data
->
splmn
,
user
->
emm_data
->
fplmn
.
plmn
[
i
]))
{
is_forbidden
=
TRUE
;
break
;
}
}
if
(
!
is_forbidden
)
{
for
(
i
=
0
;
i
<
_emm_data
.
fplmn_gprs
.
n_plmns
;
i
++
)
{
if
(
PLMNS_ARE_EQUAL
(
_emm_data
.
splmn
,
_emm_data
.
fplmn_gprs
.
plmn
[
i
]))
{
for
(
i
=
0
;
i
<
user
->
emm_data
->
fplmn_gprs
.
n_plmns
;
i
++
)
{
if
(
PLMNS_ARE_EQUAL
(
user
->
emm_data
->
splmn
,
user
->
emm_data
->
fplmn_gprs
.
plmn
[
i
]))
{
is_forbidden
=
TRUE
;
break
;
}
...
...
@@ -782,12 +781,12 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
/* Check if the selected PLMN belongs to a forbidden
* tracking area */
tai_t
tai
;
tai
.
plmn
=
_emm_data
.
splmn
;
tai
.
plmn
=
user
->
emm_data
->
splmn
;
tai
.
tac
=
tac
;
if
(
!
is_forbidden
)
{
for
(
i
=
0
;
i
<
_emm_data
.
ftai
.
n_tais
;
i
++
)
{
if
(
TAIS_ARE_EQUAL
(
tai
,
_emm_data
.
ftai
.
tai
[
i
]))
{
for
(
i
=
0
;
i
<
user
->
emm_data
->
ftai
.
n_tais
;
i
++
)
{
if
(
TAIS_ARE_EQUAL
(
tai
,
user
->
emm_data
->
ftai
.
tai
[
i
]))
{
is_forbidden
=
TRUE
;
break
;
}
...
...
@@ -795,8 +794,8 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
}
if
(
!
is_forbidden
)
{
for
(
i
=
0
;
i
<
_emm_data
.
ftai_roaming
.
n_tais
;
i
++
)
{
if
(
TAIS_ARE_EQUAL
(
tai
,
_emm_data
.
ftai_roaming
.
tai
[
i
]))
{
for
(
i
=
0
;
i
<
user
->
emm_data
->
ftai_roaming
.
n_tais
;
i
++
)
{
if
(
TAIS_ARE_EQUAL
(
tai
,
user
->
emm_data
->
ftai_roaming
.
tai
[
i
]))
{
is_forbidden
=
TRUE
;
break
;
}
...
...
@@ -825,10 +824,10 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
}
/* Duplicate the new selected PLMN at the end of the ordered list */
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
]
=
&
_emm_data
.
splmn
;
_emm_plmn_list
.
plmn
[
_emm_plmn_list
.
n_plmns
]
=
&
user
->
emm_data
->
splmn
;
}
else
if
(
_emm_data
.
plmn_mode
==
EMM_DATA_PLMN_AUTO
)
{
else
if
(
user
->
emm_data
->
plmn_mode
==
EMM_DATA_PLMN_AUTO
)
{
/*
* Automatic mode of operation
* ---------------------------
...
...
@@ -844,7 +843,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
}
}
else
if
(
_emm_data
.
plmn_index
<
0
)
{
else
if
(
user
->
emm_data
->
plmn_index
<
0
)
{
/*
* Manual or manual/automatic mode of operation
* --------------------------------------------
...
...
@@ -855,7 +854,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
select_next_plmn
=
TRUE
;
}
else
if
(
_emm_data
.
plmn_mode
==
EMM_DATA_PLMN_MANUAL
)
{
else
if
(
user
->
emm_data
->
plmn_mode
==
EMM_DATA_PLMN_MANUAL
)
{
/*
* Manual mode of operation
* ------------------------
...
...
@@ -871,7 +870,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
* Attempt to find a suitable cell of the PLMN selected by the user
* failed; Try to automatically select another PLMN
*/
_emm_data
.
plmn_mode
=
EMM_DATA_PLMN_AUTO
;
user
->
emm_data
->
plmn_mode
=
EMM_DATA_PLMN_AUTO
;
index
=
_emm_plmn_list
.
hplmn
;
select_next_plmn
=
TRUE
;
}
...
...
@@ -938,11 +937,11 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
if
(
_emm_plmn_list
.
splmn
==
_emm_plmn_list
.
rplmn
)
{
/* The selected PLMN is the registered PLMN */
LOG_TRACE
(
INFO
,
"EMM-IDLE - The selected PLMN is the registered PLMN"
);
_emm_data
.
is_rplmn
=
TRUE
;
user
->
emm_data
->
is_rplmn
=
TRUE
;
}
else
if
(
_emm_plmn_list
.
splmn
<
_emm_plmn_list
.
hplmn
)
{
/* The selected PLMN is in the list of equivalent PLMNs */
LOG_TRACE
(
INFO
,
"EMM-IDLE - The selected PLMN is in the list of equivalent PLMNs"
);
_emm_data
.
is_eplmn
=
TRUE
;
user
->
emm_data
->
is_eplmn
=
TRUE
;
}
/*
...
...
@@ -976,20 +975,20 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
***************************************************************************/
int
emm_proc_registration_notify
(
Stat_t
status
)
int
emm_proc_registration_notify
(
emm_data_t
*
emm_data
,
Stat_t
status
)
{
LOG_FUNC_IN
;
int
rc
=
RETURNok
;
/* Update the network registration status */
if
(
_emm_data
.
stat
!=
status
)
{
_emm_data
.
stat
=
status
;
if
(
emm_data
->
stat
!=
status
)
{
emm_data
->
stat
=
status
;
/* Notify EMM that data has changed */
rc
=
(
*
_emm_indication_notify
)(
1
);
rc
=
(
*
_emm_indication_notify
)(
emm_data
,
1
);
}
LOG_FUNC_RETURN
(
rc
);
...
...
@@ -1010,24 +1009,24 @@ int emm_proc_registration_notify(Stat_t status)
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
***************************************************************************/
int
emm_proc_location_notify
(
tac_t
tac
,
ci_t
ci
,
AcT_t
rat
)
int
emm_proc_location_notify
(
emm_data_t
*
emm_data
,
tac_t
tac
,
ci_t
ci
,
AcT_t
rat
)
{
LOG_FUNC_IN
;
int
rc
=
RETURNok
;
/* Update the location information */
if
(
(
_emm_data
.
tac
!=
tac
)
||
(
_emm_data
.
ci
!=
ci
)
||
(
_emm_data
.
rat
!=
rat
)
)
{
_emm_data
.
tac
=
tac
;
_emm_data
.
ci
=
ci
;
_emm_data
.
rat
=
rat
;
if
(
(
emm_data
->
tac
!=
tac
)
||
(
emm_data
->
ci
!=
ci
)
||
(
emm_data
->
rat
!=
rat
)
)
{
emm_data
->
tac
=
tac
;
emm_data
->
ci
=
ci
;
emm_data
->
rat
=
rat
;
/* Notify EMM that data has changed */
rc
=
(
*
_emm_indication_notify
)(
0
);
rc
=
(
*
_emm_indication_notify
)(
emm_data
,
0
);
}
LOG_FUNC_RETURN
(
rc
);
...
...
@@ -1047,17 +1046,17 @@ int emm_proc_location_notify(tac_t tac, ci_t ci, AcT_t rat)
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
***************************************************************************/
int
emm_proc_network_notify
(
int
index
)
int
emm_proc_network_notify
(
emm_data_t
*
emm_data
,
int
index
)
{
LOG_FUNC_IN
;
/* Update the list of operators present in the network */
int
size
=
IdleMode_update_plmn_list
(
index
);
int
size
=
IdleMode_update_plmn_list
(
emm_data
,
index
);
/* Notify EMM that data has changed */
int
rc
=
(
*
_emm_indication_notify
)(
size
);
int
rc
=
(
*
_emm_indication_notify
)(
emm_data
,
size
);
LOG_FUNC_RETURN
(
rc
);
}
...
...
@@ -1126,7 +1125,7 @@ static int _IdleMode_plmn_str(char *plmn_str, const plmn_t *plmn)
** tor network name records **
** **
** Inputs: plmn: The PLMN identifier **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: The index of the PLMN if found in the list **
...
...
@@ -1139,28 +1138,28 @@ static int _IldlMode_get_opnn_id(nas_user_t *user, const plmn_t *plmn)
{
int
i
;
for
(
i
=
0
;
i
<
_emm_data
.
n_opnns
;
i
++
)
{
if
(
plmn
->
MCCdigit1
!=
_emm_data
.
opnn
[
i
].
plmn
->
MCCdigit1
)
{
for
(
i
=
0
;
i
<
user
->
emm_data
->
n_opnns
;
i
++
)
{
if
(
plmn
->
MCCdigit1
!=
user
->
emm_data
->
opnn
[
i
].
plmn
->
MCCdigit1
)
{
continue
;
}
if
(
plmn
->
MCCdigit2
!=
_emm_data
.
opnn
[
i
].
plmn
->
MCCdigit2
)
{
if
(
plmn
->
MCCdigit2
!=
user
->
emm_data
->
opnn
[
i
].
plmn
->
MCCdigit2
)
{
continue
;
}
if
(
plmn
->
MCCdigit3
!=
_emm_data
.
opnn
[
i
].
plmn
->
MCCdigit3
)
{
if
(
plmn
->
MCCdigit3
!=
user
->
emm_data
->
opnn
[
i
].
plmn
->
MCCdigit3
)
{
continue
;
}
if
(
plmn
->
MNCdigit1
!=
_emm_data
.
opnn
[
i
].
plmn
->
MNCdigit1
)
{
if
(
plmn
->
MNCdigit1
!=
user
->
emm_data
->
opnn
[
i
].
plmn
->
MNCdigit1
)
{
continue
;
}
if
(
plmn
->
MNCdigit2
!=
_emm_data
.
opnn
[
i
].
plmn
->
MNCdigit2
)
{
if
(
plmn
->
MNCdigit2
!=
user
->
emm_data
->
opnn
[
i
].
plmn
->
MNCdigit2
)
{
continue
;
}
if
(
plmn
->
MNCdigit3
!=
_emm_data
.
opnn
[
i
].
plmn
->
MNCdigit3
)
{
if
(
plmn
->
MNCdigit3
!=
user
->
emm_data
->
opnn
[
i
].
plmn
->
MNCdigit3
)
{
continue
;
}
...
...
@@ -1195,8 +1194,8 @@ static int _IdleMode_get_suitable_cell(nas_user_t *user, int index)
LOG_TRACE
(
INFO
,
"EMM-IDLE - Trying to search a suitable cell "
"of PLMN %d in %s mode"
,
index
,
(
_emm_data
.
plmn_mode
==
EMM_DATA_PLMN_AUTO
)
?
"Automatic"
:
(
_emm_data
.
plmn_mode
==
EMM_DATA_PLMN_MANUAL
)
?
"Manual"
:
(
user
->
emm_data
->
plmn_mode
==
EMM_DATA_PLMN_AUTO
)
?
"Automatic"
:
(
user
->
emm_data
->
plmn_mode
==
EMM_DATA_PLMN_MANUAL
)
?
"Manual"
:
"Automatic/manual"
);
/*
* Notify EMM-AS SAP that cell information related to the given
...
...
@@ -1206,8 +1205,8 @@ static int _IdleMode_get_suitable_cell(nas_user_t *user, int index)
emm_sap
.
u
.
emm_as
.
u
.
cell_info
.
plmnIDs
.
n_plmns
=
1
;
emm_sap
.
u
.
emm_as
.
u
.
cell_info
.
plmnIDs
.
plmn
[
0
]
=
*
plmn
;
if
(
_emm_data
.
plmn_rat
!=
NET_ACCESS_UNAVAILABLE
)
{
emm_sap
.
u
.
emm_as
.
u
.
cell_info
.
rat
=
(
1
<<
_emm_data
.
plmn_rat
);
if
(
user
->
emm_data
->
plmn_rat
!=
NET_ACCESS_UNAVAILABLE
)
{
emm_sap
.
u
.
emm_as
.
u
.
cell_info
.
rat
=
(
1
<<
user
->
emm_data
->
plmn_rat
);
}
else
{
emm_sap
.
u
.
emm_as
.
u
.
cell_info
.
rat
=
NET_ACCESS_UNAVAILABLE
;
}
...
...
openair3/NAS/UE/EMM/IdleMode.h
View file @
20cb51cb
...
...
@@ -51,7 +51,7 @@ Description Defines the functions used to get information from the list
/************************ G L O B A L T Y P E S ************************/
/****************************************************************************/
typedef
int
(
*
IdleMode_callback_t
)
(
int
);
typedef
int
(
*
IdleMode_callback_t
)
(
emm_data_t
*
emm_data
,
int
);
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
...
...
@@ -68,7 +68,7 @@ int IdleMode_get_hplmn_index(void);
int
IdleMode_get_rplmn_index
(
void
);
int
IdleMode_get_splmn_index
(
void
);
int
IdleMode_update_plmn_list
(
int
index
);
int
IdleMode_update_plmn_list
(
emm_data_t
*
emm_data
,
int
i
);
const
char
*
IdleMode_get_plmn_fullname
(
const
plmn_t
*
plmn
,
int
index
,
size_t
*
len
);
...
...
openair3/NAS/UE/EMM/LowerLayer.c
View file @
20cb51cb
...
...
@@ -160,7 +160,7 @@ int lowerlayer_establish(nas_user_t *user)
LOG_FUNC_IN
;
/* Update the EPS Connection Management status */
_emm_data
.
ecm_status
=
ECM_CONNECTED
;
user
->
emm_data
->
ecm_status
=
ECM_CONNECTED
;
LOG_FUNC_RETURN
(
RETURNok
);
}
...
...
@@ -188,7 +188,7 @@ int lowerlayer_release(nas_user_t *user, int cause)
int
rc
;
/* Update the EPS Connection Management status */
_emm_data
.
ecm_status
=
ECM_IDLE
;
user
->
emm_data
->
ecm_status
=
ECM_IDLE
;
emm_sap
.
primitive
=
EMMREG_LOWERLAYER_RELEASE
;
emm_sap
.
u
.
emm_reg
.
ueid
=
0
;
...
...
@@ -257,9 +257,9 @@ int lowerlayer_data_req(nas_user_t *user, unsigned int ueid, const OctetString *
//struct emm_data_context_s *ctx = NULL;
emm_sap
.
primitive
=
EMMAS_DATA_REQ
;
emm_sap
.
u
.
emm_as
.
u
.
data
.
guti
=
_emm_data
.
guti
;
emm_sap
.
u
.
emm_as
.
u
.
data
.
guti
=
user
->
emm_data
->
guti
;
emm_sap
.
u
.
emm_as
.
u
.
data
.
ueid
=
0
;
sctx
=
_emm_data
.
security
;
sctx
=
user
->
emm_data
->
security
;
emm_sap
.
u
.
emm_as
.
u
.
data
.
NASinfo
=
0
;
emm_sap
.
u
.
emm_as
.
u
.
data
.
NASmsg
.
length
=
data
->
length
;
...
...
openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
View file @
20cb51cb
...
...
@@ -108,8 +108,7 @@ int EmmDeregisteredNoCellAvailable(nas_user_t *user, const emm_reg_t *evt)
* Notify EMM that the MT is currently searching an operator
* to register to
*/
// FIXME REVIEW
rc
=
emm_proc_registration_notify
(
NET_REG_STATE_ON
);
rc
=
emm_proc_registration_notify
(
user
->
emm_data
,
NET_REG_STATE_ON
);
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
WARNING
,
"EMM-FSM - "
...
...
openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
View file @
20cb51cb
...
...
@@ -95,7 +95,7 @@ int EmmDeregisteredPlmnSearch(nas_user_t *user, const emm_reg_t *evt)
/*
* No suitable cell of the selected PLMN has been found to camp on
*/
rc
=
emm_proc_registration_notify
(
NET_REG_STATE_DENIED
);
rc
=
emm_proc_registration_notify
(
user
->
emm_data
,
NET_REG_STATE_DENIED
);
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
WARNING
,
"EMM-FSM - "
...
...
@@ -112,7 +112,7 @@ int EmmDeregisteredPlmnSearch(nas_user_t *user, const emm_reg_t *evt)
* may be selected either automatically or manually.
* Or the user manually re-selected a PLMN to register to.
*/
rc
=
emm_proc_registration_notify
(
NET_REG_STATE_ON
);
rc
=
emm_proc_registration_notify
(
user
->
emm_data
,
NET_REG_STATE_ON
);
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
WARNING
,
"EMM-FSM - "
...
...
openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c
View file @
20cb51cb
...
...
@@ -140,7 +140,7 @@ int EmmRegisteredInitiated(nas_user_t *user, const emm_reg_t *evt)
/*
* Notify EMM that the MT is registered
*/
rc
=
emm_proc_registration_notify
(
NET_REG_STATE_HN
);
rc
=
emm_proc_registration_notify
(
user
->
emm_data
,
NET_REG_STATE_HN
);
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
WARNING
,
"EMM-FSM - "
...
...
@@ -167,7 +167,7 @@ int EmmRegisteredInitiated(nas_user_t *user, const emm_reg_t *evt)
/*
* Notify EMM that the MT's registration is denied
*/
rc
=
emm_proc_registration_notify
(
NET_REG_STATE_DENIED
);
rc
=
emm_proc_registration_notify
(
user
->
emm_data
,
NET_REG_STATE_DENIED
);
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
WARNING
,
"EMM-FSM - "
...
...
openair3/NAS/UE/EMM/SAP/emm_as.c
View file @
20cb51cb
...
...
@@ -135,16 +135,16 @@ static int _emm_as_encrypt(
static
int
_emm_as_send
(
const
nas_user_t
*
user
,
const
emm_as_t
*
msg
);
static
int
_emm_as_security_res
(
const
emm_as_security_t
*
,
static
int
_emm_as_security_res
(
const
emm_
data_t
*
emm_data
,
const
emm_
as_security_t
*
,
ul_info_transfer_req_t
*
);
static
int
_emm_as_establish_req
(
const
emm_as_establish_t
*
,
static
int
_emm_as_establish_req
(
const
emm_
data_t
*
emm_data
,
const
emm_
as_establish_t
*
,
nas_establish_req_t
*
);
static
int
_emm_as_cell_info_req
(
const
emm_as_cell_info_t
*
,
cell_info_req_t
*
);
static
int
_emm_as_data_req
(
const
emm_as_data_t
*
msg
,
ul_info_transfer_req_t
*
);
static
int
_emm_as_status_ind
(
const
emm_as_status_t
*
,
ul_info_transfer_req_t
*
);
static
int
_emm_as_data_req
(
const
emm_
data_t
*
emm_data
,
const
emm_
as_data_t
*
msg
,
ul_info_transfer_req_t
*
);
static
int
_emm_as_status_ind
(
const
emm_
data_t
*
emm_data
,
const
emm_
as_status_t
*
,
ul_info_transfer_req_t
*
);
static
int
_emm_as_release_req
(
const
emm_as_release_t
*
,
nas_release_req_t
*
);
/****************************************************************************/
...
...
@@ -321,7 +321,7 @@ static int _emm_as_recv(nas_user_t *user, unsigned int ueid, const char *msg, in
emm_security_context_t
*
security
=
NULL
;
/* Current EPS NAS security context */
security
=
_emm_data
.
security
;
security
=
user
->
emm_data
->
security
;
/* Decode the received message */
decoder_rc
=
nas_message_decode
(
msg
,
&
nas_msg
,
len
,
security
);
...
...
@@ -428,7 +428,7 @@ static int _emm_as_data_ind(nas_user_t *user, const emm_as_data_t *msg, int *emm
memset
(
&
header
,
0
,
sizeof
(
header
));
/* Decrypt the received security protected message */
security
=
_emm_data
.
security
;
security
=
user
->
emm_data
->
security
;
int
bytes
=
nas_message_decrypt
((
char
*
)(
msg
->
NASmsg
.
value
),
plain_msg
,
&
header
,
...
...
@@ -509,7 +509,7 @@ static int _emm_as_establish_cnf(nas_user_t *user, const emm_as_establish_t *msg
decoder_rc
=
nas_message_decode
((
char
*
)(
msg
->
NASmsg
.
value
),
&
nas_msg
,
msg
->
NASmsg
.
length
,
_emm_data
.
security
);
user
->
emm_data
->
security
);
if
(
decoder_rc
<
0
)
{
LOG_TRACE
(
WARNING
,
"EMMAS-SAP - Failed to decode initial NAS message"
...
...
@@ -937,13 +937,13 @@ static int _emm_as_send(const nas_user_t *user, const emm_as_t *msg)
switch
(
msg
->
primitive
)
{
case
_EMMAS_DATA_REQ
:
as_msg
.
msgID
=
_emm_as_data_req
(
as_msg
.
msgID
=
_emm_as_data_req
(
user
->
emm_data
,
&
msg
->
u
.
data
,
&
as_msg
.
msg
.
ul_info_transfer_req
);
break
;
case
_EMMAS_STATUS_IND
:
as_msg
.
msgID
=
_emm_as_status_ind
(
as_msg
.
msgID
=
_emm_as_status_ind
(
user
->
emm_data
,
&
msg
->
u
.
status
,
&
as_msg
.
msg
.
ul_info_transfer_req
);
break
;
...
...
@@ -956,13 +956,13 @@ static int _emm_as_send(const nas_user_t *user, const emm_as_t *msg)
case
_EMMAS_SECURITY_RES
:
as_msg
.
msgID
=
_emm_as_security_res
(
as_msg
.
msgID
=
_emm_as_security_res
(
user
->
emm_data
,
&
msg
->
u
.
security
,
&
as_msg
.
msg
.
ul_info_transfer_req
);
break
;
case
_EMMAS_ESTABLISH_REQ
:
as_msg
.
msgID
=
_emm_as_establish_req
(
as_msg
.
msgID
=
_emm_as_establish_req
(
user
->
emm_data
,
&
msg
->
u
.
establish
,
&
as_msg
.
msg
.
nas_establish_req
);
break
;
...
...
@@ -1065,7 +1065,7 @@ static int _emm_as_send(const nas_user_t *user, const emm_as_t *msg)
** Others: None **
** **
***************************************************************************/
static
int
_emm_as_data_req
(
const
emm_as_data_t
*
msg
,
static
int
_emm_as_data_req
(
const
emm_
data_t
*
emm_data
,
const
emm_
as_data_t
*
msg
,
ul_info_transfer_req_t
*
as_msg
)
{
LOG_FUNC_IN
;
...
...
@@ -1112,7 +1112,7 @@ static int _emm_as_data_req(const emm_as_data_t *msg,
int
bytes
;
emm_security_context_t
*
emm_security_context
=
NULL
;
emm_security_context
=
_emm_data
.
security
;
emm_security_context
=
emm_data
->
security
;
if
(
emm_security_context
)
{
...
...
@@ -1161,7 +1161,7 @@ static int _emm_as_data_req(const emm_as_data_t *msg,
** Others: None **
** **
***************************************************************************/
static
int
_emm_as_status_ind
(
const
emm_as_status_t
*
msg
,
static
int
_emm_as_status_ind
(
const
emm_
data_t
*
emm_data
,
const
emm_
as_status_t
*
msg
,
ul_info_transfer_req_t
*
as_msg
)
{
LOG_FUNC_IN
;
...
...
@@ -1193,7 +1193,7 @@ static int _emm_as_status_ind(const emm_as_status_t *msg,
if
(
size
>
0
)
{
emm_security_context_t
*
emm_security_context
=
NULL
;
emm_security_context
=
_emm_data
.
security
;
emm_security_context
=
emm_data
->
security
;
if
(
emm_security_context
)
{
...
...
@@ -1275,7 +1275,7 @@ static int _emm_as_release_req(const emm_as_release_t *msg,
** Others: None **
** **
***************************************************************************/
static
int
_emm_as_security_res
(
const
emm_as_security_t
*
msg
,
static
int
_emm_as_security_res
(
const
emm_
data_t
*
emm_data
,
const
emm_
as_security_t
*
msg
,
ul_info_transfer_req_t
*
as_msg
)
{
LOG_FUNC_IN
;
...
...
@@ -1340,7 +1340,7 @@ static int _emm_as_security_res(const emm_as_security_t *msg,
int
bytes
=
_emm_as_encode
(
&
as_msg
->
nasMsg
,
&
nas_msg
,
size
,
_emm_data
.
security
);
emm_data
->
security
);
if
(
bytes
>
0
)
{
LOG_FUNC_RETURN
(
AS_UL_INFO_TRANSFER_REQ
);
...
...
@@ -1369,7 +1369,7 @@ static int _emm_as_security_res(const emm_as_security_t *msg,
** Others: None **
** **
***************************************************************************/
static
int
_emm_as_establish_req
(
const
emm_as_establish_t
*
msg
,
static
int
_emm_as_establish_req
(
const
emm_
data_t
*
emm_data
,
const
emm_
as_establish_t
*
msg
,
nas_establish_req_t
*
as_msg
)
{
LOG_FUNC_IN
;
...
...
@@ -1433,7 +1433,7 @@ static int _emm_as_establish_req(const emm_as_establish_t *msg,
&
as_msg
->
initialNasMsg
,
&
nas_msg
,
size
,
_emm_data
.
security
);
emm_data
->
security
);
if
(
bytes
>
0
)
{
LOG_FUNC_RETURN
(
AS_NAS_ESTABLISH_REQ
);
...
...
openair3/NAS/UE/EMM/SAP/emm_esm.c
View file @
20cb51cb
...
...
@@ -134,7 +134,7 @@ int emm_esm_send(nas_user_t *user, const emm_esm_t *msg)
if
(
msg
->
u
.
establish
.
is_emergency
)
{
/* Consider the UE attached for emergency bearer services
* only */
rc
=
emm_proc_attach_set_emergency
();
rc
=
emm_proc_attach_set_emergency
(
user
->
emm_data
);
}
}
else
{
/* Consider the UE locally detached from the network */
...
...
openair3/NAS/UE/EMM/SecurityModeControl.c
View file @
20cb51cb
...
...
@@ -163,8 +163,8 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
/*
* Check the replayed UE security capabilities
*/
uint8_t
eea
=
(
0x80
>>
_emm_data
.
security
->
capability
.
eps_encryption
);
uint8_t
eia
=
(
0x80
>>
_emm_data
.
security
->
capability
.
eps_integrity
);
uint8_t
eea
=
(
0x80
>>
user
->
emm_data
->
security
->
capability
.
eps_encryption
);
uint8_t
eia
=
(
0x80
>>
user
->
emm_data
->
security
->
capability
.
eps_integrity
);
if
(
(
reea
!=
eea
)
||
(
reia
!=
eia
)
)
{
LOG_TRACE
(
WARNING
,
"EMM-PROC - Replayed UE security capabilities "
...
...
@@ -180,7 +180,7 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
/*
* Check the non-current EPS security context
*/
else
if
(
_emm_data
.
non_current
==
NULL
)
{
else
if
(
user
->
emm_data
->
non_current
==
NULL
)
{
LOG_TRACE
(
WARNING
,
"EMM-PROC - Non-current EPS security context "
"is not valid"
);
emm_cause
=
EMM_CAUSE_SECURITY_MODE_REJECTED
;
...
...
@@ -191,37 +191,37 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
else
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Update the non-current EPS security context seea=%u seia=%u"
,
seea
,
seia
);
/* Update selected cyphering and integrity algorithms */
//LG COMENTED
_emm_data.
non_current->capability.encryption = seea;
//LG COMENTED
_emm_data.
non_current->capability.integrity = seia;
//LG COMENTED
user->emm_data->
non_current->capability.encryption = seea;
//LG COMENTED
user->emm_data->
non_current->capability.integrity = seia;
_emm_data
.
non_current
->
selected_algorithms
.
encryption
=
seea
;
_emm_data
.
non_current
->
selected_algorithms
.
integrity
=
seia
;
user
->
emm_data
->
non_current
->
selected_algorithms
.
encryption
=
seea
;
user
->
emm_data
->
non_current
->
selected_algorithms
.
integrity
=
seia
;
/* Derive the NAS cyphering key */
if
(
_emm_data
.
non_current
->
knas_enc
.
value
==
NULL
)
{
_emm_data
.
non_current
->
knas_enc
.
value
=
if
(
user
->
emm_data
->
non_current
->
knas_enc
.
value
==
NULL
)
{
user
->
emm_data
->
non_current
->
knas_enc
.
value
=
(
uint8_t
*
)
calloc
(
1
,
AUTH_KNAS_ENC_SIZE
);
_emm_data
.
non_current
->
knas_enc
.
length
=
AUTH_KNAS_ENC_SIZE
;
user
->
emm_data
->
non_current
->
knas_enc
.
length
=
AUTH_KNAS_ENC_SIZE
;
}
if
(
_emm_data
.
non_current
->
knas_enc
.
value
!=
NULL
)
{
if
(
user
->
emm_data
->
non_current
->
knas_enc
.
value
!=
NULL
)
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Update the non-current EPS security context knas_enc"
);
rc
=
_security_knas_enc
(
&
_emm_data
.
non_current
->
kasme
,
&
_emm_data
.
non_current
->
knas_enc
,
seea
);
rc
=
_security_knas_enc
(
&
user
->
emm_data
->
non_current
->
kasme
,
&
user
->
emm_data
->
non_current
->
knas_enc
,
seea
);
}
/* Derive the NAS integrity key */
if
(
_emm_data
.
non_current
->
knas_int
.
value
==
NULL
)
{
_emm_data
.
non_current
->
knas_int
.
value
=
if
(
user
->
emm_data
->
non_current
->
knas_int
.
value
==
NULL
)
{
user
->
emm_data
->
non_current
->
knas_int
.
value
=
(
uint8_t
*
)
calloc
(
1
,
AUTH_KNAS_INT_SIZE
);
_emm_data
.
non_current
->
knas_int
.
length
=
AUTH_KNAS_INT_SIZE
;
user
->
emm_data
->
non_current
->
knas_int
.
length
=
AUTH_KNAS_INT_SIZE
;
}
if
(
_emm_data
.
non_current
->
knas_int
.
value
!=
NULL
)
{
if
(
user
->
emm_data
->
non_current
->
knas_int
.
value
!=
NULL
)
{
if
(
rc
!=
RETURNerror
)
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Update the non-current EPS security context knas_int"
);
rc
=
_security_knas_int
(
&
_emm_data
.
non_current
->
kasme
,
&
_emm_data
.
non_current
->
knas_int
,
seia
);
rc
=
_security_knas_int
(
&
user
->
emm_data
->
non_current
->
kasme
,
&
user
->
emm_data
->
non_current
->
knas_int
,
seia
);
}
}
...
...
@@ -234,10 +234,10 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
if
(
_security_data
.
kenb
.
value
!=
NULL
)
{
if
(
rc
!=
RETURNerror
)
{
LOG_TRACE
(
INFO
,
"EMM-PROC - Update the non-current EPS security context kenb"
);
// LG COMMENT rc = _security_kenb(&
_emm_data.
security->kasme,
rc
=
_security_kenb
(
&
_emm_data
.
non_current
->
kasme
,
// LG COMMENT rc = _security_kenb(&
user->emm_data->
security->kasme,
rc
=
_security_kenb
(
&
user
->
emm_data
->
non_current
->
kasme
,
&
_security_data
.
kenb
,
*
(
uint32_t
*
)(
&
_emm_data
.
non_current
->
ul_count
));
*
(
uint32_t
*
)(
&
user
->
emm_data
->
non_current
->
ul_count
));
}
}
...
...
@@ -248,13 +248,13 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
LOG_TRACE
(
INFO
,
"EMM-PROC - NAS security mode command accepted by the UE"
);
/* Update the current EPS security context */
if
(
native_ksi
&&
(
_emm_data
.
security
->
type
!=
EMM_KSI_NATIVE
)
)
{
if
(
native_ksi
&&
(
user
->
emm_data
->
security
->
type
!=
EMM_KSI_NATIVE
)
)
{
/* The type of security context flag included in the SECURITY
* MODE COMMAND message is set to "native security context" and
* the UE has a mapped EPS security context as the current EPS
* security context */
if
(
(
_emm_data
.
non_current
->
type
==
EMM_KSI_NATIVE
)
&&
(
_emm_data
.
non_current
->
eksi
==
ksi
)
)
{
if
(
(
user
->
emm_data
->
non_current
->
type
==
EMM_KSI_NATIVE
)
&&
(
user
->
emm_data
->
non_current
->
eksi
==
ksi
)
)
{
/* The KSI matches the non-current native EPS security
* context; the UE shall take the non-current native EPS
* security context into use which then becomes the
...
...
@@ -263,36 +263,37 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
LOG_TRACE
(
INFO
,
"EMM-PROC - Update Current security context"
);
/* Release non-current security context */
_security_release
(
_emm_data
.
security
);
_emm_data
.
security
=
_emm_data
.
non_current
;
_security_release
(
user
->
emm_data
->
security
);
user
->
emm_data
->
security
=
user
->
emm_data
->
non_current
;
/* Reset the uplink NAS COUNT counter */
_emm_data
.
security
->
ul_count
.
overflow
=
0
;
_emm_data
.
security
->
ul_count
.
seq_num
=
0
;
user
->
emm_data
->
security
->
ul_count
.
overflow
=
0
;
user
->
emm_data
->
security
->
ul_count
.
seq_num
=
0
;
/* Set new security context indicator */
security_context_is_new
=
TRUE
;
}
}
if
(
!
native_ksi
&&
(
_emm_data
.
security
->
type
!=
EMM_KSI_NATIVE
)
)
{
if
(
!
native_ksi
&&
(
user
->
emm_data
->
security
->
type
!=
EMM_KSI_NATIVE
)
)
{
/* The type of security context flag included in the SECURITY
* MODE COMMAND message is set to "mapped security context" and
* the UE has a mapped EPS security context as the current EPS
* security context */
if
(
ksi
!=
_emm_data
.
security
->
eksi
)
{
if
(
ksi
!=
user
->
emm_data
->
security
->
eksi
)
{
/* The KSI does not match the current EPS security context;
* the UE shall reset the uplink NAS COUNT counter */
LOG_TRACE
(
INFO
,
"EMM-PROC - Reset uplink NAS COUNT counter"
);
_emm_data
.
security
->
ul_count
.
overflow
=
0
;
_emm_data
.
security
->
ul_count
.
seq_num
=
0
;
user
->
emm_data
->
security
->
ul_count
.
overflow
=
0
;
user
->
emm_data
->
security
->
ul_count
.
seq_num
=
0
;
}
}
_emm_data
.
security
->
selected_algorithms
.
encryption
=
seea
;
_emm_data
.
security
->
selected_algorithms
.
integrity
=
seia
;
user
->
emm_data
->
security
->
selected_algorithms
.
encryption
=
seea
;
user
->
emm_data
->
security
->
selected_algorithms
.
integrity
=
seia
;
#if defined(NAS_BUILT_IN_UE)
nas_itti_kenb_refresh_req
(
_security_data
.
kenb
.
value
);
#endif
}
/*
* NAS security mode command not accepted by the UE
...
...
@@ -326,14 +327,14 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
*/
emm_sap_t
emm_sap
;
emm_sap
.
primitive
=
EMMAS_SECURITY_RES
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
guti
=
_emm_data
.
guti
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
guti
=
user
->
emm_data
->
guti
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
ueid
=
0
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
msgType
=
EMM_AS_MSG_TYPE_SMC
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
imeisv_request
=
imeisv_request
;
emm_sap
.
u
.
emm_as
.
u
.
security
.
emm_cause
=
emm_cause
;
/* Setup EPS NAS security data */
emm_as_set_security_data
(
&
emm_sap
.
u
.
emm_as
.
u
.
security
.
sctx
,
_emm_data
.
security
,
security_context_is_new
,
TRUE
);
user
->
emm_data
->
security
,
security_context_is_new
,
TRUE
);
rc
=
emm_sap_send
(
user
,
&
emm_sap
);
LOG_FUNC_RETURN
(
rc
);
...
...
openair3/NAS/UE/EMM/emmData.h
View file @
20cb51cb
...
...
@@ -333,13 +333,6 @@ typedef struct emm_data_s {
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/*
* --------------------------------------------------------------------------
* EPS mobility management data (used within EMM only)
* --------------------------------------------------------------------------
*/
emm_data_t
_emm_data
;
/*
* --------------------------------------------------------------------------
* EPS mobility management timers – UE side
...
...
openair3/NAS/UE/EMM/emm_main.c
View file @
20cb51cb
...
...
@@ -78,7 +78,7 @@ static usim_data_t _usim_data;
* to the user application
*/
static
emm_indication_callback_t
_emm_main_user_callback
;
static
int
_emm_main_callback
(
int
);
static
int
_emm_main_callback
(
emm_data_t
*
emm_data
,
int
);
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
...
...
@@ -97,66 +97,70 @@ static int _emm_main_callback(int);
** **
** Outputs: None **
** Return: None **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
***************************************************************************/
void
emm_main_initialize
(
nas_user_t
*
user
,
emm_indication_callback_t
cb
,
const
char
*
imei
)
{
LOG_FUNC_IN
;
user
->
emm_data
=
calloc
(
1
,
sizeof
(
emm_data_t
));
if
(
user
->
emm_data
==
NULL
)
{
LOG_TRACE
(
ERROR
,
"EMM-MAIN - Failed to get allocate emm_data"
);
// FIXME stop here
}
/* USIM validity indicator */
_emm_data
.
usim_is_valid
=
FALSE
;
user
->
emm_data
->
usim_is_valid
=
FALSE
;
/* The IMEI read from the UE's non-volatile memory */
_emm_data
.
imei
=
(
imei_t
*
)
malloc
(
sizeof
(
imei_t
));
_emm_data
.
imei
->
length
=
_emm_main_get_imei
(
_emm_data
.
imei
,
imei
);
user
->
emm_data
->
imei
=
(
imei_t
*
)
malloc
(
sizeof
(
imei_t
));
user
->
emm_data
->
imei
->
length
=
_emm_main_get_imei
(
user
->
emm_data
->
imei
,
imei
);
/* The IMSI, valid only if USIM is present */
_emm_data
.
imsi
=
NULL
;
user
->
emm_data
->
imsi
=
NULL
;
/* EPS location information */
_emm_data
.
guti
=
NULL
;
_emm_data
.
tai
=
NULL
;
_emm_data
.
ltai
.
n_tais
=
0
;
user
->
emm_data
->
guti
=
NULL
;
user
->
emm_data
->
tai
=
NULL
;
user
->
emm_data
->
ltai
.
n_tais
=
0
;
/* EPS Connection Management status */
_emm_data
.
ecm_status
=
ECM_IDLE
;
user
->
emm_data
->
ecm_status
=
ECM_IDLE
;
/* Network selection mode of operation */
_emm_data
.
plmn_mode
=
EMM_DATA_PLMN_AUTO
;
user
->
emm_data
->
plmn_mode
=
EMM_DATA_PLMN_AUTO
;
/* Index of the PLMN manually selected by the user */
_emm_data
.
plmn_index
=
-
1
;
user
->
emm_data
->
plmn_index
=
-
1
;
/* Selected Radio Access Technology */
_emm_data
.
plmn_rat
=
NET_ACCESS_UNAVAILABLE
;
user
->
emm_data
->
plmn_rat
=
NET_ACCESS_UNAVAILABLE
;
/* Selected PLMN */
memset
(
&
_emm_data
.
splmn
,
0xFF
,
sizeof
(
plmn_t
));
_emm_data
.
is_rplmn
=
FALSE
;
_emm_data
.
is_eplmn
=
FALSE
;
memset
(
&
user
->
emm_data
->
splmn
,
0xFF
,
sizeof
(
plmn_t
));
user
->
emm_data
->
is_rplmn
=
FALSE
;
user
->
emm_data
->
is_eplmn
=
FALSE
;
/* Radio Access Technology of the serving cell */
_emm_data
.
rat
=
NET_ACCESS_UNAVAILABLE
;
user
->
emm_data
->
rat
=
NET_ACCESS_UNAVAILABLE
;
/* Network registration status */
_emm_data
.
stat
=
NET_REG_STATE_OFF
;
_emm_data
.
is_attached
=
FALSE
;
_emm_data
.
is_emergency
=
FALSE
;
user
->
emm_data
->
stat
=
NET_REG_STATE_OFF
;
user
->
emm_data
->
is_attached
=
FALSE
;
user
->
emm_data
->
is_emergency
=
FALSE
;
/* Location/Tracking area code */
_emm_data
.
tac
=
0
;
// two byte in hexadecimal format
user
->
emm_data
->
tac
=
0
;
// two byte in hexadecimal format
/* Identifier of the serving cell */
_emm_data
.
ci
=
0
;
// four byte in hexadecimal format
user
->
emm_data
->
ci
=
0
;
// four byte in hexadecimal format
/* List of operators present in the network */
memset
(
_emm_data
.
plist
.
buffer
,
0
,
EMM_DATA_BUFFER_SIZE
+
1
);
memset
(
user
->
emm_data
->
plist
.
buffer
,
0
,
EMM_DATA_BUFFER_SIZE
+
1
);
/* Home PLMN */
memset
(
&
_emm_data
.
hplmn
,
0xFF
,
sizeof
(
plmn_t
));
memset
(
&
user
->
emm_data
->
hplmn
,
0xFF
,
sizeof
(
plmn_t
));
/* List of Forbidden PLMNs */
_emm_data
.
fplmn
.
n_plmns
=
0
;
user
->
emm_data
->
fplmn
.
n_plmns
=
0
;
/* List of Forbidden PLMNs for GPRS service */
_emm_data
.
fplmn_gprs
.
n_plmns
=
0
;
user
->
emm_data
->
fplmn_gprs
.
n_plmns
=
0
;
/* List of Equivalent HPLMNs */
_emm_data
.
ehplmn
.
n_plmns
=
0
;
user
->
emm_data
->
ehplmn
.
n_plmns
=
0
;
/* List of user controlled PLMNs */
_emm_data
.
plmn
.
n_plmns
=
0
;
user
->
emm_data
->
plmn
.
n_plmns
=
0
;
/* List of operator controlled PLMNs */
_emm_data
.
oplmn
.
n_plmns
=
0
;
user
->
emm_data
->
oplmn
.
n_plmns
=
0
;
/* List of operator network name records */
_emm_data
.
n_opnns
=
0
;
user
->
emm_data
->
n_opnns
=
0
;
/* List of Forbidden Tracking Areas */
_emm_data
.
ftai
.
n_tais
=
0
;
user
->
emm_data
->
ftai
.
n_tais
=
0
;
/* List of Forbidden Tracking Areas for roaming */
_emm_data
.
ftai_roaming
.
n_tais
=
0
;
user
->
emm_data
->
ftai_roaming
.
n_tais
=
0
;
/*
* Get USIM application data
...
...
@@ -170,47 +174,47 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
/* The USIM application is present and valid */
LOG_TRACE
(
INFO
,
"EMM-MAIN - USIM application data successfully read"
);
_emm_data
.
usim_is_valid
=
TRUE
;
user
->
emm_data
->
usim_is_valid
=
TRUE
;
/* Get the Home PLMN derived from the IMSI */
_emm_data
.
hplmn
.
MCCdigit1
=
_usim_data
.
imsi
.
u
.
num
.
digit1
;
_emm_data
.
hplmn
.
MCCdigit2
=
_usim_data
.
imsi
.
u
.
num
.
digit2
;
_emm_data
.
hplmn
.
MCCdigit3
=
_usim_data
.
imsi
.
u
.
num
.
digit3
;
_emm_data
.
hplmn
.
MNCdigit1
=
_usim_data
.
imsi
.
u
.
num
.
digit4
;
_emm_data
.
hplmn
.
MNCdigit2
=
_usim_data
.
imsi
.
u
.
num
.
digit5
;
_emm_data
.
hplmn
.
MNCdigit3
=
_usim_data
.
imsi
.
u
.
num
.
digit6
;
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
;
/* 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
])
)
{
_emm_data
.
fplmn
.
plmn
[
i
]
=
_usim_data
.
fplmn
[
i
];
_emm_data
.
fplmn
.
n_plmns
+=
1
;
user
->
emm_data
->
fplmn
.
plmn
[
i
]
=
_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
])
)
{
_emm_data
.
ehplmn
.
plmn
[
i
]
=
_usim_data
.
ehplmn
[
i
];
_emm_data
.
ehplmn
.
n_plmns
+=
1
;
user
->
emm_data
->
ehplmn
.
plmn
[
i
]
=
_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
)
)
{
_emm_data
.
plmn
.
plmn
[
i
]
=
_usim_data
.
plmn
[
i
].
plmn
;
_emm_data
.
userAcT
[
i
]
=
_usim_data
.
plmn
[
i
].
AcT
;
_emm_data
.
plmn
.
n_plmns
+=
1
;
user
->
emm_data
->
plmn
.
plmn
[
i
]
=
_usim_data
.
plmn
[
i
].
plmn
;
user
->
emm_data
->
userAcT
[
i
]
=
_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
)
)
{
_emm_data
.
oplmn
.
plmn
[
i
]
=
_usim_data
.
oplmn
[
i
].
plmn
;
_emm_data
.
operAcT
[
i
]
=
_usim_data
.
oplmn
[
i
].
AcT
;
_emm_data
.
oplmn
.
n_plmns
+=
1
;
user
->
emm_data
->
oplmn
.
plmn
[
i
]
=
_usim_data
.
oplmn
[
i
].
plmn
;
user
->
emm_data
->
operAcT
[
i
]
=
_usim_data
.
oplmn
[
i
].
AcT
;
user
->
emm_data
->
oplmn
.
n_plmns
+=
1
;
}
}
...
...
@@ -218,10 +222,10 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
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
;
_emm_data
.
opnn
[
i
].
plmn
=
&
_usim_data
.
opl
[
i
].
plmn
;
_emm_data
.
opnn
[
i
].
fullname
=
(
char
*
)
_usim_data
.
pnn
[
pnn_id
].
fullname
.
value
;
_emm_data
.
opnn
[
i
].
shortname
=
(
char
*
)
_usim_data
.
pnn
[
pnn_id
].
shortname
.
value
;
_emm_data
.
n_opnns
+=
1
;
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
;
user
->
emm_data
->
n_opnns
+=
1
;
}
}
...
...
@@ -229,78 +233,78 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
/* Get the EPS location information */
if
(
PLMN_IS_VALID
(
_usim_data
.
epsloci
.
guti
.
gummei
.
plmn
))
{
_emm_data
.
guti
=
&
_usim_data
.
epsloci
.
guti
;
user
->
emm_data
->
guti
=
&
_usim_data
.
epsloci
.
guti
;
}
if
(
TAI_IS_VALID
(
_usim_data
.
epsloci
.
tai
))
{
_emm_data
.
tai
=
&
_usim_data
.
epsloci
.
tai
;
user
->
emm_data
->
tai
=
&
_usim_data
.
epsloci
.
tai
;
}
_emm_data
.
status
=
_usim_data
.
epsloci
.
status
;
user
->
emm_data
->
status
=
_usim_data
.
epsloci
.
status
;
/* Get NAS configuration parameters */
_emm_data
.
NAS_SignallingPriority
=
user
->
emm_data
->
NAS_SignallingPriority
=
_usim_data
.
nasconfig
.
NAS_SignallingPriority
.
value
[
0
];
_emm_data
.
NMO_I_Behaviour
=
_usim_data
.
nasconfig
.
NMO_I_Behaviour
.
value
[
0
];
_emm_data
.
AttachWithImsi
=
_usim_data
.
nasconfig
.
AttachWithImsi
.
value
[
0
];
_emm_data
.
MinimumPeriodicSearchTimer
=
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
->
emm_data
->
MinimumPeriodicSearchTimer
=
_usim_data
.
nasconfig
.
MinimumPeriodicSearchTimer
.
value
[
0
];
_emm_data
.
ExtendedAccessBarring
=
user
->
emm_data
->
ExtendedAccessBarring
=
_usim_data
.
nasconfig
.
ExtendedAccessBarring
.
value
[
0
];
_emm_data
.
Timer_T3245_Behaviour
=
user
->
emm_data
->
Timer_T3245_Behaviour
=
_usim_data
.
nasconfig
.
Timer_T3245_Behaviour
.
value
[
0
];
/*
* Get EPS NAS security context
*/
/* Create NAS security context */
_emm_data
.
security
=
user
->
emm_data
->
security
=
(
emm_security_context_t
*
)
malloc
(
sizeof
(
emm_security_context_t
));
if
(
_emm_data
.
security
!=
NULL
)
{
memset
(
_emm_data
.
security
,
0
,
sizeof
(
emm_security_context_t
));
if
(
user
->
emm_data
->
security
!=
NULL
)
{
memset
(
user
->
emm_data
->
security
,
0
,
sizeof
(
emm_security_context_t
));
/* Type of security context */
if
(
_usim_data
.
securityctx
.
KSIasme
.
value
[
0
]
!=
USIM_KSI_NOT_AVAILABLE
)
{
_emm_data
.
security
->
type
=
EMM_KSI_NATIVE
;
user
->
emm_data
->
security
->
type
=
EMM_KSI_NATIVE
;
}
else
{
_emm_data
.
security
->
type
=
EMM_KSI_NOT_AVAILABLE
;
user
->
emm_data
->
security
->
type
=
EMM_KSI_NOT_AVAILABLE
;
}
/* EPS key set identifier */
_emm_data
.
security
->
eksi
=
_usim_data
.
securityctx
.
KSIasme
.
value
[
0
];
user
->
emm_data
->
security
->
eksi
=
_usim_data
.
securityctx
.
KSIasme
.
value
[
0
];
/* ASME security key */
_emm_data
.
security
->
kasme
.
length
=
user
->
emm_data
->
security
->
kasme
.
length
=
_usim_data
.
securityctx
.
Kasme
.
length
;
_emm_data
.
security
->
kasme
.
value
=
(
uint8_t
*
)
malloc
(
_emm_data
.
security
->
kasme
.
length
);
user
->
emm_data
->
security
->
kasme
.
value
=
(
uint8_t
*
)
malloc
(
user
->
emm_data
->
security
->
kasme
.
length
);
if
(
_emm_data
.
security
->
kasme
.
value
)
{
memcpy
(
_emm_data
.
security
->
kasme
.
value
,
if
(
user
->
emm_data
->
security
->
kasme
.
value
)
{
memcpy
(
user
->
emm_data
->
security
->
kasme
.
value
,
_usim_data
.
securityctx
.
Kasme
.
value
,
_emm_data
.
security
->
kasme
.
length
);
user
->
emm_data
->
security
->
kasme
.
length
);
}
/* Downlink count parameter */
if
(
_usim_data
.
securityctx
.
dlNAScount
.
length
<=
sizeof
(
uint32_t
))
{
memcpy
(
&
_emm_data
.
security
->
dl_count
,
memcpy
(
&
user
->
emm_data
->
security
->
dl_count
,
_usim_data
.
securityctx
.
dlNAScount
.
value
,
_usim_data
.
securityctx
.
dlNAScount
.
length
);
}
/* Uplink count parameter */
if
(
_usim_data
.
securityctx
.
ulNAScount
.
length
<=
sizeof
(
uint32_t
))
{
memcpy
(
&
_emm_data
.
security
->
ul_count
,
memcpy
(
&
user
->
emm_data
->
security
->
ul_count
,
_usim_data
.
securityctx
.
ulNAScount
.
value
,
_usim_data
.
securityctx
.
ulNAScount
.
length
);
}
/* Ciphering algorithm */
_emm_data
.
security
->
capability
.
eps_encryption
=
user
->
emm_data
->
security
->
capability
.
eps_encryption
=
((
_usim_data
.
securityctx
.
algorithmID
.
value
[
0
]
>>
4
)
&
0xf
);
/* Identity protection algorithm */
_emm_data
.
security
->
capability
.
eps_integrity
=
user
->
emm_data
->
security
->
capability
.
eps_integrity
=
(
_usim_data
.
securityctx
.
algorithmID
.
value
[
0
]
&
0xf
);
/* NAS integrity and cyphering keys are not available */
}
else
{
...
...
@@ -311,8 +315,8 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
/*
* Get EMM data from the UE's non-volatile memory
*/
memset
(
&
_emm_data
.
nvdata
.
rplmn
,
0xFF
,
sizeof
(
plmn_t
));
_emm_data
.
nvdata
.
eplmn
.
n_plmns
=
0
;
memset
(
&
user
->
emm_data
->
nvdata
.
rplmn
,
0xFF
,
sizeof
(
plmn_t
));
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
=
0
;
/* Get EMM data pathname */
char
*
path
=
memory_get_path
(
EMM_NVRAM_DIRNAME
,
EMM_NVRAM_FILENAME
);
...
...
@@ -320,29 +324,29 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
LOG_TRACE
(
ERROR
,
"EMM-MAIN - Failed to get EMM data pathname"
);
}
else
{
/* Get EMM data stored in the non-volatile memory device */
int
rc
=
memory_read
(
path
,
&
_emm_data
.
nvdata
,
sizeof
(
emm_nvdata_t
));
int
rc
=
memory_read
(
path
,
&
user
->
emm_data
->
nvdata
,
sizeof
(
emm_nvdata_t
));
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
ERROR
,
"EMM-MAIN - Failed to read %s"
,
path
);
}
else
{
/* Check the IMSI */
LOG_TRACE
(
INFO
,
"EMM-MAIN - EMM data successfully read"
);
_emm_data
.
imsi
=
&
_usim_data
.
imsi
;
int
imsi_ok
=
_emm_main_imsi_cmp
(
&
_emm_data
.
nvdata
.
imsi
,
user
->
emm_data
->
imsi
=
&
_usim_data
.
imsi
;
int
imsi_ok
=
_emm_main_imsi_cmp
(
&
user
->
emm_data
->
nvdata
.
imsi
,
&
_usim_data
.
imsi
);
if
(
!
imsi_ok
)
{
LOG_TRACE
(
WARNING
,
"EMM-MAIN - IMSI checking failed nvram: "
"%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x, "
"usim: %02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x"
,
_emm_data
.
nvdata
.
imsi
.
u
.
value
[
0
],
_emm_data
.
nvdata
.
imsi
.
u
.
value
[
1
],
_emm_data
.
nvdata
.
imsi
.
u
.
value
[
2
],
_emm_data
.
nvdata
.
imsi
.
u
.
value
[
3
],
_emm_data
.
nvdata
.
imsi
.
u
.
value
[
4
],
_emm_data
.
nvdata
.
imsi
.
u
.
value
[
5
],
_emm_data
.
nvdata
.
imsi
.
u
.
value
[
6
],
_emm_data
.
nvdata
.
imsi
.
u
.
value
[
7
],
user
->
emm_data
->
nvdata
.
imsi
.
u
.
value
[
0
],
user
->
emm_data
->
nvdata
.
imsi
.
u
.
value
[
1
],
user
->
emm_data
->
nvdata
.
imsi
.
u
.
value
[
2
],
user
->
emm_data
->
nvdata
.
imsi
.
u
.
value
[
3
],
user
->
emm_data
->
nvdata
.
imsi
.
u
.
value
[
4
],
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
],
...
...
@@ -351,8 +355,8 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
_usim_data
.
imsi
.
u
.
value
[
5
],
_usim_data
.
imsi
.
u
.
value
[
6
],
_usim_data
.
imsi
.
u
.
value
[
7
]);
memset
(
&
_emm_data
.
nvdata
.
rplmn
,
0xFF
,
sizeof
(
plmn_t
));
_emm_data
.
nvdata
.
eplmn
.
n_plmns
=
0
;
memset
(
&
user
->
emm_data
->
nvdata
.
rplmn
,
0xFF
,
sizeof
(
plmn_t
));
user
->
emm_data
->
nvdata
.
eplmn
.
n_plmns
=
0
;
}
}
...
...
@@ -392,6 +396,7 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
/*
* Initialize EMM internal data used for UE in idle mode
*/
// FIXME REVIEW
IdleMode_initialize
(
user
,
&
_emm_main_callback
);
LOG_FUNC_OUT
;
...
...
@@ -412,56 +417,14 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
** Others: None **
** **
***************************************************************************/
void
emm_main_cleanup
(
void
)
void
emm_main_cleanup
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
if
(
_emm_data
.
usim_is_valid
)
{
if
(
emm_data
->
usim_is_valid
)
{
/*
* TODO: Update USIM application data
*/
#if 0
int i;
/* Update the list of Forbidden PLMNs */
for (i=0; (i < _emm_data.fplmn.n_plmns) && (i < USIM_FPLMN_MAX); i++) {
_usim_data.fplmn[i] = _emm_data.fplmn.plmn[i];
}
/* Update the list of Equivalent HPLMNs */
for (i=0; (i < _emm_data.ehplmn.n_plmns) && (i < USIM_EHPLMN_MAX); i++) {
_usim_data.ehplmn[i] = _emm_data.ehplmn.plmn[i];
}
/* Update the GUTI */
if (_emm_data.guti) {
_usim_data.epsloci.guti = *(_emm_data.guti);
}
/* Update the last visited registered TAI */
if (_emm_data.tai) {
_usim_data.epsloci.tai = *(_emm_data.tai);
}
/* Update the EPS location information */
_usim_data.epsloci.status = _emm_data.status;
if (_emm_data.security && (_emm_data.security->type == EMM_KSI_NATIVE)) {
/* TODO: Update the EPS security context parameters from the full
* native EPS security context */
}
/*
* Store USIM application data
* - List of forbidden PLMNs
*/
if ( usim_api_write(&_usim_data) != RETURNok ) {
/* The USIM application may not be present or not valid */
LOG_TRACE(WARNING, "EMM-MAIN - "
"Failed to write USIM application data");
}
#endif
}
/*
...
...
@@ -474,7 +437,7 @@ void emm_main_cleanup(void)
if
(
path
==
NULL
)
{
LOG_TRACE
(
ERROR
,
"EMM-MAIN - Failed to get EMM data pathname"
);
}
else
{
int
rc
=
memory_write
(
path
,
&
_emm_data
.
nvdata
,
sizeof
(
emm_nvdata_t
));
int
rc
=
memory_write
(
path
,
&
emm_data
->
nvdata
,
sizeof
(
emm_nvdata_t
));
if
(
rc
!=
RETURNok
)
{
LOG_TRACE
(
ERROR
,
"EMM-MAIN - Failed to write %s"
,
path
);
...
...
@@ -482,13 +445,13 @@ void emm_main_cleanup(void)
}
/* Release dynamically allocated memory */
if
(
_emm_data
.
imei
)
{
free
(
_emm_data
.
imei
);
_emm_data
.
imei
=
NULL
;
if
(
emm_data
->
imei
)
{
free
(
emm_data
->
imei
);
emm_data
->
imei
=
NULL
;
}
if
(
_emm_data
.
security
)
{
emm_security_context_t
*
security
=
_emm_data
.
security
;
if
(
emm_data
->
security
)
{
emm_security_context_t
*
security
=
emm_data
->
security
;
if
(
security
->
kasme
.
value
)
{
free
(
security
->
kasme
.
value
);
...
...
@@ -508,8 +471,8 @@ void emm_main_cleanup(void)
security
->
knas_int
.
length
=
0
;
}
free
(
_emm_data
.
security
);
_emm_data
.
security
=
NULL
;
free
(
emm_data
->
security
);
emm_data
->
security
=
NULL
;
}
LOG_FUNC_OUT
;
}
...
...
@@ -521,17 +484,17 @@ void emm_main_cleanup(void)
** Description: Get the International Mobile Subscriber Identity number **
** **
** Inputs: None **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: Pointer to the IMSI **
** Others: None **
** **
***************************************************************************/
const
imsi_t
*
emm_main_get_imsi
(
void
)
const
imsi_t
*
emm_main_get_imsi
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_FUNC_RETURN
(
&
_emm_data
.
nvdata
.
imsi
);
LOG_FUNC_RETURN
(
&
emm_data
->
nvdata
.
imsi
);
}
/****************************************************************************
...
...
@@ -572,10 +535,10 @@ const msisdn_t *emm_main_get_msisdn(void)
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
***************************************************************************/
int
emm_main_set_plmn_selection_mode
(
int
mode
,
int
format
,
int
emm_main_set_plmn_selection_mode
(
emm_data_t
*
emm_data
,
int
mode
,
int
format
,
const
network_plmn_t
*
plmn
,
int
rat
)
{
LOG_FUNC_IN
;
...
...
@@ -585,7 +548,7 @@ int emm_main_set_plmn_selection_mode(int mode, int format,
LOG_TRACE
(
INFO
,
"EMM-MAIN - PLMN selection: mode=%d, format=%d, plmn=%s, "
"rat=%d"
,
mode
,
format
,
(
const
char
*
)
&
plmn
->
id
,
rat
);
_emm_data
.
plmn_mode
=
mode
;
emm_data
->
plmn_mode
=
mode
;
if
(
mode
!=
EMM_DATA_PLMN_AUTO
)
{
/* Get the index of the PLMN in the list of available PLMNs */
...
...
@@ -596,8 +559,8 @@ int emm_main_set_plmn_selection_mode(int mode, int format,
(
const
char
*
)
&
plmn
->
id
);
}
else
{
/* Update the manually selected network selection data */
_emm_data
.
plmn_index
=
index
;
_emm_data
.
plmn_rat
=
rat
;
emm_data
->
plmn_index
=
index
;
emm_data
->
plmn_rat
=
rat
;
}
}
else
{
/*
...
...
@@ -619,17 +582,17 @@ int emm_main_set_plmn_selection_mode(int mode, int format,
** operation **
** **
** Inputs: None **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: The value of the network selection mode **
** Others: None **
** **
***************************************************************************/
int
emm_main_get_plmn_selection_mode
(
void
)
int
emm_main_get_plmn_selection_mode
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_FUNC_RETURN
(
_emm_data
.
plmn_mode
);
LOG_FUNC_RETURN
(
emm_data
->
plmn_mode
);
}
/****************************************************************************
...
...
@@ -639,19 +602,19 @@ int emm_main_get_plmn_selection_mode(void)
** Description: Get the list of available PLMNs **
** **
** Inputs: None **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: plist: Pointer to the list of available PLMNs **
** Return: The size of the list in bytes **
** Others: None **
** **
***************************************************************************/
int
emm_main_get_plmn_list
(
const
char
**
plist
)
int
emm_main_get_plmn_list
(
emm_data_t
*
emm_data
,
const
char
**
plist
)
{
LOG_FUNC_IN
;
int
size
=
IdleMode_update_plmn_list
(
0
);
*
plist
=
_emm_data
.
plist
.
buffer
;
int
size
=
IdleMode_update_plmn_list
(
emm_data
,
0
);
*
plist
=
emm_data
->
plist
.
buffer
;
LOG_FUNC_RETURN
(
size
);
}
...
...
@@ -664,7 +627,6 @@ int emm_main_get_plmn_list(const char **plist)
** **
** Inputs: format: The requested format of the string repre- **
** sentation of the PLMN identifier **
** Others: _emm_data **
** **
** Outputs: plmn: The selected PLMN identifier coded in the **
** requested format **
...
...
@@ -673,7 +635,7 @@ int emm_main_get_plmn_list(const char **plist)
** Others: None **
** **
***************************************************************************/
const
char
*
emm_main_get_selected_plmn
(
network_plmn_t
*
plmn
,
int
format
)
const
char
*
emm_main_get_selected_plmn
(
emm_data_t
*
emm_data
,
network_plmn_t
*
plmn
,
int
format
)
{
LOG_FUNC_IN
;
...
...
@@ -684,7 +646,7 @@ const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format)
int
index
=
IdleMode_get_splmn_index
();
if
(
!
(
index
<
0
)
)
{
const
char
*
name
=
_emm_main_get_plmn
(
&
_emm_data
.
splmn
,
index
,
const
char
*
name
=
_emm_main_get_plmn
(
&
emm_data
->
splmn
,
index
,
format
,
&
size
);
if
(
size
>
0
)
{
...
...
@@ -703,7 +665,6 @@ const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format)
** **
** Inputs: format: The requested format of the string repre- **
** sentation of the PLMN identifier **
** Others: _emm_data **
** **
** Outputs: plmn: The registered PLMN identifier coded in **
** the requested format **
...
...
@@ -712,7 +673,7 @@ const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format)
** Others: None **
** **
***************************************************************************/
const
char
*
emm_main_get_registered_plmn
(
network_plmn_t
*
plmn
,
int
format
)
const
char
*
emm_main_get_registered_plmn
(
emm_data_t
*
emm_data
,
network_plmn_t
*
plmn
,
int
format
)
{
LOG_FUNC_IN
;
...
...
@@ -724,7 +685,7 @@ const char *emm_main_get_registered_plmn(network_plmn_t *plmn, int format)
int
index
=
IdleMode_get_rplmn_index
();
if
(
!
(
index
<
0
)
)
{
const
char
*
name
=
_emm_main_get_plmn
(
&
_emm_data
.
nvdata
.
rplmn
,
const
char
*
name
=
_emm_main_get_plmn
(
&
emm_data
->
nvdata
.
rplmn
,
index
,
format
,
&
size
);
if
(
size
>
0
)
{
...
...
@@ -744,17 +705,16 @@ const char *emm_main_get_registered_plmn(network_plmn_t *plmn, int format)
** registration of the UE **
** **
** Inputs: None **
** Others: _emm_data **
** **
** Outputs: None **
** Return: The current network registration status **
** Others: None **
** **
***************************************************************************/
Stat_t
emm_main_get_plmn_status
(
void
)
Stat_t
emm_main_get_plmn_status
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_FUNC_RETURN
(
_emm_data
.
stat
);
LOG_FUNC_RETURN
(
emm_data
->
stat
);
}
/****************************************************************************
...
...
@@ -765,17 +725,16 @@ Stat_t emm_main_get_plmn_status(void)
** belongs to **
** **
** Inputs: None **
** Others: _emm_data **
** **
** Outputs: None **
** Return: The Location/Tracking area code **
** Others: None **
** **
***************************************************************************/
tac_t
emm_main_get_plmn_tac
(
void
)
tac_t
emm_main_get_plmn_tac
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_FUNC_RETURN
(
_emm_data
.
tac
);
LOG_FUNC_RETURN
(
emm_data
->
tac
);
}
/****************************************************************************
...
...
@@ -785,17 +744,16 @@ tac_t emm_main_get_plmn_tac(void)
** Description: Get the identifier of the serving cell **
** **
** Inputs: None **
** Others: _emm_data **
** **
** Outputs: None **
** Return: The serving cell identifier **
** Others: None **
** **
***************************************************************************/
ci_t
emm_main_get_plmn_ci
(
void
)
ci_t
emm_main_get_plmn_ci
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_FUNC_RETURN
(
_emm_data
.
ci
);
LOG_FUNC_RETURN
(
emm_data
->
ci
);
}
/****************************************************************************
...
...
@@ -806,7 +764,6 @@ ci_t emm_main_get_plmn_ci(void)
** ving cell **
** **
** Inputs: None **
** Others: _emm_data **
** **
** Outputs: None **
** Return: The value of the Radio Access Technology **
...
...
@@ -814,10 +771,10 @@ ci_t emm_main_get_plmn_ci(void)
** Others: None **
** **
***************************************************************************/
AcT_t
emm_main_get_plmn_rat
(
void
)
AcT_t
emm_main_get_plmn_rat
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_FUNC_RETURN
(
_emm_data
.
rat
);
LOG_FUNC_RETURN
(
emm_data
->
rat
);
}
/****************************************************************************
...
...
@@ -828,7 +785,7 @@ AcT_t emm_main_get_plmn_rat(void)
** network for EPS services or emergency service only **
** **
** Inputs: None **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: TRUE if the UE is currently attached to **
...
...
@@ -836,10 +793,10 @@ AcT_t emm_main_get_plmn_rat(void)
** Others: None **
** **
***************************************************************************/
int
emm_main_is_attached
(
void
)
int
emm_main_is_attached
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_FUNC_RETURN
(
_emm_data
.
is_attached
);
LOG_FUNC_RETURN
(
emm_data
->
is_attached
);
}
/****************************************************************************
...
...
@@ -850,7 +807,7 @@ int emm_main_is_attached(void)
** network for emergency bearer services **
** **
** Inputs: None **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: TRUE if the UE is currently attached or is **
...
...
@@ -859,10 +816,10 @@ int emm_main_is_attached(void)
** Others: None **
** **
***************************************************************************/
int
emm_main_is_emergency
(
void
)
int
emm_main_is_emergency
(
emm_data_t
*
emm_data
)
{
LOG_FUNC_IN
;
LOG_FUNC_RETURN
(
_emm_data
.
is_attached
&&
_emm_data
.
is_emergency
);
LOG_FUNC_RETURN
(
emm_data
->
is_attached
&&
emm_data
->
is_emergency
);
}
/****************************************************************************/
...
...
@@ -881,21 +838,21 @@ int emm_main_is_emergency(void)
** present in the network. The list has to be **
** displayed to the user application when **
** size > 0. **
** Others:
_emm_data
**
** Others:
user->emm_data->
**
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others: None **
** **
***************************************************************************/
static
int
_emm_main_callback
(
int
size
)
static
int
_emm_main_callback
(
emm_data_t
*
emm_data
,
int
size
)
{
LOG_FUNC_IN
;
/* Forward the notification to the user API */
int
rc
=
(
*
_emm_main_user_callback
)(
_emm_data
.
stat
,
_emm_data
.
tac
,
_emm_data
.
ci
,
_emm_data
.
rat
,
_emm_data
.
plist
.
buffer
,
size
);
int
rc
=
(
*
_emm_main_user_callback
)(
emm_data
->
stat
,
emm_data
->
tac
,
emm_data
->
ci
,
emm_data
->
rat
,
emm_data
->
plist
.
buffer
,
size
);
LOG_FUNC_RETURN
(
rc
);
}
...
...
openair3/NAS/UE/EMM/emm_main.h
View file @
20cb51cb
...
...
@@ -70,32 +70,32 @@ typedef int (*emm_indication_callback_t) (Stat_t, tac_t, ci_t, AcT_t,
void
emm_main_initialize
(
nas_user_t
*
user
,
emm_indication_callback_t
cb
,
const
char
*
imei
);
void
emm_main_cleanup
(
void
);
void
emm_main_cleanup
(
emm_data_t
*
emm_data
);
/* User's getter of UE's identity */
const
imsi_t
*
emm_main_get_imsi
(
void
);
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
);
/* User's getter/setter for network selection */
int
emm_main_set_plmn_selection_mode
(
int
mode
,
int
format
,
int
emm_main_set_plmn_selection_mode
(
emm_data_t
*
emm_data
,
int
mode
,
int
format
,
const
network_plmn_t
*
plmn
,
int
rat
);
int
emm_main_get_plmn_selection_mode
(
void
);
int
emm_main_get_plmn_list
(
const
char
**
plist
);
const
char
*
emm_main_get_selected_plmn
(
network_plmn_t
*
plmn
,
int
format
);
int
emm_main_get_plmn_selection_mode
(
emm_data_t
*
emm_data
);
int
emm_main_get_plmn_list
(
emm_data_t
*
emm_data
,
const
char
**
plist
);
const
char
*
emm_main_get_selected_plmn
(
emm_data_t
*
emm_data
,
network_plmn_t
*
plmn
,
int
format
);
/* User's getter for network registration */
Stat_t
emm_main_get_plmn_status
(
void
);
tac_t
emm_main_get_plmn_tac
(
void
);
ci_t
emm_main_get_plmn_ci
(
void
);
AcT_t
emm_main_get_plmn_rat
(
void
);
const
char
*
emm_main_get_registered_plmn
(
network_plmn_t
*
plmn
,
int
format
);
Stat_t
emm_main_get_plmn_status
(
emm_data_t
*
emm_data
);
tac_t
emm_main_get_plmn_tac
(
emm_data_t
*
emm_data
);
ci_t
emm_main_get_plmn_ci
(
emm_data_t
*
emm_data
);
AcT_t
emm_main_get_plmn_rat
(
emm_data_t
*
emm_data
);
const
char
*
emm_main_get_registered_plmn
(
emm_data_t
*
emm_data
,
network_plmn_t
*
plmn
,
int
format
);
/* User's getter for network attachment */
int
emm_main_is_attached
(
void
);
int
emm_main_is_emergency
(
void
);
int
emm_main_is_attached
(
emm_data_t
*
emm_data
);
int
emm_main_is_emergency
(
emm_data_t
*
emm_data
);
#endif
/* __EMM_MAIN_H__*/
openair3/NAS/UE/EMM/emm_proc.h
View file @
20cb51cb
...
...
@@ -133,7 +133,7 @@ int emm_proc_attach_failure(int is_initial, void *args);
int
emm_proc_attach_release
(
void
*
args
);
int
emm_proc_attach_restart
(
nas_user_t
*
user
);
int
emm_proc_attach_set_emergency
(
void
);
int
emm_proc_attach_set_emergency
(
emm_data_t
*
emm_data
);
// FIXME check prototype
int
emm_proc_attach_set_detach
(
void
*
user
);
...
...
@@ -183,8 +183,8 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi, in
* Network indication handlers
*---------------------------------------------------------------------------
*/
int
emm_proc_registration_notify
(
Stat_t
status
);
int
emm_proc_location_notify
(
tac_t
tac
,
ci_t
ci
,
AcT_t
rat
);
int
emm_proc_network_notify
(
int
index
);
int
emm_proc_registration_notify
(
emm_data_t
*
emm_data
,
Stat_t
status
);
int
emm_proc_location_notify
(
emm_data_t
*
emm_data
,
tac_t
tac
,
ci_t
ci
,
AcT_t
rat
);
int
emm_proc_network_notify
(
emm_data_t
*
emm_data
,
int
index
);
#endif
/* __EMM_PROC_H__*/
openair3/NAS/UE/nas_proc.c
View file @
20cb51cb
...
...
@@ -134,7 +134,7 @@ void nas_proc_cleanup(nas_user_t *user)
/* Perform the EPS Mobility Manager's clean up procedure */
emm_main_cleanup
();
emm_main_cleanup
(
user
->
emm_data
);
/* Perform the EPS Session Manager's clean up procedure */
esm_main_cleanup
(
user
->
esm_data
);
...
...
@@ -251,11 +251,11 @@ int nas_proc_get_eps(nas_user_t *user, int *stat)
** Others: None **
** **
***************************************************************************/
int
nas_proc_get_imsi
(
char
*
imsi_str
)
int
nas_proc_get_imsi
(
emm_data_t
*
emm_data
,
char
*
imsi_str
)
{
LOG_FUNC_IN
;
const
imsi_t
*
imsi
=
emm_main_get_imsi
();
const
imsi_t
*
imsi
=
emm_main_get_imsi
(
emm_data
);
if
(
imsi
!=
NULL
)
{
int
offset
=
0
;
...
...
@@ -386,7 +386,7 @@ int nas_proc_register(nas_user_t *user, int mode, int format, const network_plmn
/*
* Set the PLMN selection mode of operation
*/
int
index
=
emm_main_set_plmn_selection_mode
(
mode
,
format
,
oper
,
AcT
);
int
index
=
emm_main_set_plmn_selection_mode
(
user
->
emm_data
,
mode
,
format
,
oper
,
AcT
);
if
(
!
(
index
<
0
)
)
{
/*
...
...
@@ -452,16 +452,16 @@ int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format
LOG_FUNC_IN
;
/* Get the PLMN selection mode of operation */
*
mode
=
emm_main_get_plmn_selection_mode
();
*
mode
=
emm_main_get_plmn_selection_mode
(
user
->
emm_data
);
/* Get the currently selected operator */
const
char
*
oper_name
=
emm_main_get_selected_plmn
(
oper
,
format
);
const
char
*
oper_name
=
emm_main_get_selected_plmn
(
user
->
emm_data
,
oper
,
format
);
if
(
oper_name
!=
NULL
)
{
/* An operator is currently selected */
*
selected
=
TRUE
;
/* Get the supported Radio Access Technology */
*
AcT
=
emm_main_get_plmn_rat
();
*
AcT
=
emm_main_get_plmn_rat
(
user
->
emm_data
);
}
else
{
/* No any operator is selected */
*
selected
=
FALSE
;
...
...
@@ -489,7 +489,7 @@ int nas_proc_get_oper_list(nas_user_t *user, const char **oper_list)
{
LOG_FUNC_IN
;
int
size
=
emm_main_get_plmn_list
(
oper_list
);
int
size
=
emm_main_get_plmn_list
(
user
->
emm_data
,
oper_list
);
LOG_FUNC_RETURN
(
size
);
}
...
...
@@ -514,7 +514,7 @@ int nas_proc_get_reg_status(nas_user_t *user, int *stat)
{
LOG_FUNC_IN
;
*
stat
=
emm_main_get_plmn_status
();
*
stat
=
emm_main_get_plmn_status
(
user
->
emm_data
);
LOG_FUNC_RETURN
(
RETURNok
);
}
...
...
@@ -542,9 +542,9 @@ int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT)
{
LOG_FUNC_IN
;
sprintf
(
tac
,
"%.4x"
,
emm_main_get_plmn_tac
());
// two byte
sprintf
(
ci
,
"%.8x"
,
emm_main_get_plmn_ci
());
// four byte
*
AcT
=
emm_main_get_plmn_rat
();
// E-UTRAN
sprintf
(
tac
,
"%.4x"
,
emm_main_get_plmn_tac
(
user
->
emm_data
));
// two byte
sprintf
(
ci
,
"%.8x"
,
emm_main_get_plmn_ci
(
user
->
emm_data
));
// four byte
*
AcT
=
emm_main_get_plmn_rat
(
user
->
emm_data
);
// E-UTRAN
LOG_FUNC_RETURN
(
RETURNok
);
}
...
...
@@ -570,7 +570,7 @@ int nas_proc_detach(nas_user_t *user, int switch_off)
emm_sap_t
emm_sap
;
int
rc
=
RETURNok
;
if
(
emm_main_is_attached
()
)
{
if
(
emm_main_is_attached
(
user
->
emm_data
)
)
{
/* Initiate an Detach procedure */
emm_sap
.
primitive
=
EMMREG_DETACH_INIT
;
emm_sap
.
u
.
emm_reg
.
u
.
detach
.
switch_off
=
switch_off
;
...
...
@@ -601,7 +601,7 @@ int nas_proc_attach(nas_user_t *user)
emm_sap_t
emm_sap
;
int
rc
=
RETURNok
;
if
(
!
emm_main_is_attached
()
)
{
if
(
!
emm_main_is_attached
(
user
->
emm_data
)
)
{
/* Initiate an Attach procedure */
emm_sap
.
primitive
=
EMMREG_ATTACH_INIT
;
emm_sap
.
u
.
emm_reg
.
u
.
attach
.
is_emergency
=
FALSE
;
...
...
@@ -630,7 +630,7 @@ int nas_proc_get_attach_status(nas_user_t *user)
{
LOG_FUNC_IN
;
int
is_attached
=
emm_main_is_attached
();
int
is_attached
=
emm_main_is_attached
(
user
->
emm_data
);
LOG_FUNC_RETURN
(
is_attached
);
}
...
...
@@ -950,14 +950,14 @@ int nas_proc_activate_pdn(nas_user_t *user, int cid)
int
rc
=
RETURNok
;
if
(
!
emm_main_is_attached
()
)
{
if
(
!
emm_main_is_attached
(
user
->
emm_data
)
)
{
/*
* If the UE is not attached to the network, perform EPS attach
* procedure prior to attempt to request any PDN connectivity
*/
LOG_TRACE
(
WARNING
,
"NAS-PROC - UE is not attached to the network"
);
rc
=
nas_proc_attach
(
user
);
}
else
if
(
emm_main_is_emergency
())
{
}
else
if
(
emm_main_is_emergency
(
user
->
emm_data
))
{
/* The UE is attached for emergency bearer services; It shall not
* request a PDN connection to any other PDN */
LOG_TRACE
(
WARNING
,
"NAS-PROC - Attached for emergency bearer services"
);
...
...
openair3/NAS/UE/nas_proc.h
View file @
20cb51cb
...
...
@@ -76,7 +76,7 @@ int nas_proc_enable_s1_mode(nas_user_t *user);
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
(
char
*
imsi_str
);
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_signal_quality
(
nas_user_t
*
user
,
int
*
rsrq
,
int
*
rsrp
);
...
...
openair3/NAS/UE/nas_user.c
View file @
20cb51cb
...
...
@@ -652,7 +652,7 @@ static int _nas_user_proc_cimi(nas_user_t *user, const at_command_t *data)
}
/* Get the International Mobile Subscriber Identity (IMSI) */
ret_code
=
nas_proc_get_imsi
(
cimi
->
IMSI
);
ret_code
=
nas_proc_get_imsi
(
user
->
emm_data
,
cimi
->
IMSI
);
if
(
ret_code
!=
RETURNok
)
{
LOG_TRACE
(
ERROR
,
"USR-MAIN - Failed to get IMSI number"
);
...
...
openair3/NAS/UE/user_defs.h
View file @
20cb51cb
...
...
@@ -49,14 +49,16 @@ Description NAS type definition to manage a user equipment
#include "esmData.h"
#include "esm_pt_defs.h"
#include "EMM/emm_fsm_defs.h"
#include "EMM/emmData.h"
typedef
struct
{
int
fd
;
proc_data_t
proc
;
esm_data_t
*
esm_data
;
// ESM internal data (used within ESM only)
esm_pt_data_t
*
esm_pt_data
;
emm_fsm_state_t
emm_fsm_status
;
// Current EPS Mobility Management status
esm_ebr_data_t
*
esm_ebr_data
;
// EPS bearer contexts
emm_fsm_state_t
emm_fsm_status
;
// Current EPS Mobility Management status
emm_data_t
*
emm_data
;
// EPS mobility management data
}
nas_user_t
;
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment