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
60c8ef27
Commit
60c8ef27
authored
Aug 16, 2016
by
Frédéric Leroy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor(conf2uedata): separate processing and writing of data
parent
37f67630
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
229 additions
and
206 deletions
+229
-206
openair3/NAS/TOOLS/conf2uedata.c
openair3/NAS/TOOLS/conf2uedata.c
+217
-200
openair3/NAS/TOOLS/conf2uedata.h
openair3/NAS/TOOLS/conf2uedata.h
+12
-6
No files found.
openair3/NAS/TOOLS/conf2uedata.c
View file @
60c8ef27
...
...
@@ -11,8 +11,6 @@
#include "display.h"
#include "fs.h"
const
char
*
output_dir
=
NULL
;
const
char
*
msin
=
NULL
;
const
char
*
usim_api_k
=
NULL
;
const
char
*
msisdn
=
NULL
;
...
...
@@ -39,6 +37,7 @@ network_record_t* user_network_record_list = NULL;
int
main
(
int
argc
,
char
**
argv
)
{
int
option
;
const
char
*
conf_file
=
NULL
;
const
char
*
output_dir
=
NULL
;
const
char
options
[]
=
"c:o:h"
;
while
((
option
=
getopt
(
argc
,
argv
,
options
))
!=
-
1
)
{
...
...
@@ -70,7 +69,7 @@ int main(int argc, char**argv) {
return
EXIT_FAILURE
;
}
if
(
parse_config_file
(
conf_file
)
==
EXIT_FAILURE
)
{
if
(
parse_config_file
(
output_dir
,
conf_file
)
==
EXIT_FAILURE
)
{
exit
(
EXIT_FAILURE
);
}
...
...
@@ -79,7 +78,7 @@ int main(int argc, char**argv) {
exit
(
EXIT_SUCCESS
);
}
int
parse_config_file
(
const
char
*
filename
)
{
int
parse_config_file
(
const
char
*
output_dir
,
const
char
*
conf_
filename
)
{
int
rc
=
EXIT_SUCCESS
;
int
ret
;
int
ue_nb
=
0
;
...
...
@@ -89,7 +88,7 @@ int parse_config_file(const char *filename) {
char
user
[
10
];
config_t
cfg
;
ret
=
get_config_from_file
(
filename
,
&
cfg
);
ret
=
get_config_from_file
(
conf_
filename
,
&
cfg
);
if
(
ret
==
EXIT_FAILURE
)
{
exit
(
1
);
}
...
...
@@ -110,6 +109,10 @@ int parse_config_file(const char *filename) {
fill_network_record_list
();
for
(
int
i
=
0
;
i
<
ue_nb
;
i
++
)
{
emm_nvdata_t
emm_data
;
user_nvdata_t
user_data
;
usim_data_t
usim_data
;
sprintf
(
user
,
"%s%d"
,
UE
,
i
);
ue_setting
=
config_setting_get_member
(
root_setting
,
user
);
...
...
@@ -118,11 +121,12 @@ int parse_config_file(const char *filename) {
return
EXIT_FAILURE
;
}
rc
=
parse_ue_user_param
(
ue_setting
,
i
);
rc
=
parse_ue_user_param
(
ue_setting
,
i
,
&
user_data
);
if
(
rc
!=
EXIT_SUCCESS
)
{
printf
(
"Problem in USER section for UE%d. EXITING...
\n
"
,
i
);
return
EXIT_FAILURE
;
}
write_user_data
(
output_dir
,
i
,
&
user_data
);
rc
=
parse_ue_sim_param
(
ue_setting
,
i
);
if
(
rc
!=
EXIT_SUCCESS
)
{
...
...
@@ -134,9 +138,12 @@ int parse_config_file(const char *filename) {
if
(
rc
!=
EXIT_SUCCESS
)
{
return
EXIT_FAILURE
;
}
gen_emm_data
(
i
);
gen_usim_data
(
i
);
}
gen_emm_data
(
i
,
&
emm_data
);
write_emm_data
(
output_dir
,
i
,
&
emm_data
);
gen_usim_data
(
&
usim_data
);
write_usim_data
(
output_dir
,
i
,
&
usim_data
);
}
config_destroy
(
&
cfg
);
return
(
EXIT_SUCCESS
);
}
...
...
@@ -161,142 +168,141 @@ int get_config_from_file(const char *filename, config_t *config) {
return
EXIT_SUCCESS
;
}
void
gen_usim_data
(
int
user_id
)
{
usim_data_t
usim_data
=
{
};
memset
(
&
usim_data
,
0
,
sizeof
(
usim_data_t
));
usim_data
.
imsi
.
length
=
8
;
usim_data
.
imsi
.
u
.
num
.
parity
=
get_msin_parity
(
msin
);
void
gen_usim_data
(
usim_data_t
*
usim_data
)
{
memset
(
usim_data
,
0
,
sizeof
(
usim_data_t
));
usim_data
->
imsi
.
length
=
8
;
usim_data
->
imsi
.
u
.
num
.
parity
=
get_msin_parity
(
msin
);
usim_data
.
imsi
.
u
.
num
.
digit1
=
user_plmn_list
[
hplmn_index
].
mcc
[
0
];
usim_data
.
imsi
.
u
.
num
.
digit2
=
user_plmn_list
[
hplmn_index
].
mcc
[
1
];
usim_data
.
imsi
.
u
.
num
.
digit3
=
user_plmn_list
[
hplmn_index
].
mcc
[
2
];
usim_data
->
imsi
.
u
.
num
.
digit1
=
user_plmn_list
[
hplmn_index
].
mcc
[
0
];
usim_data
->
imsi
.
u
.
num
.
digit2
=
user_plmn_list
[
hplmn_index
].
mcc
[
1
];
usim_data
->
imsi
.
u
.
num
.
digit3
=
user_plmn_list
[
hplmn_index
].
mcc
[
2
];
usim_data
.
imsi
.
u
.
num
.
digit4
=
user_plmn_list
[
hplmn_index
].
mnc
[
0
];
usim_data
.
imsi
.
u
.
num
.
digit5
=
user_plmn_list
[
hplmn_index
].
mnc
[
1
];
usim_data
->
imsi
.
u
.
num
.
digit4
=
user_plmn_list
[
hplmn_index
].
mnc
[
0
];
usim_data
->
imsi
.
u
.
num
.
digit5
=
user_plmn_list
[
hplmn_index
].
mnc
[
1
];
if
(
strlen
(
user_plmn_list
[
hplmn_index
].
mnc
)
==
2
)
{
usim_data
.
imsi
.
u
.
num
.
digit6
=
msin
[
0
];
usim_data
.
imsi
.
u
.
num
.
digit7
=
msin
[
1
];
usim_data
.
imsi
.
u
.
num
.
digit8
=
msin
[
2
];
usim_data
.
imsi
.
u
.
num
.
digit9
=
msin
[
3
];
usim_data
.
imsi
.
u
.
num
.
digit10
=
msin
[
4
];
usim_data
.
imsi
.
u
.
num
.
digit11
=
msin
[
5
];
usim_data
.
imsi
.
u
.
num
.
digit12
=
msin
[
6
];
usim_data
.
imsi
.
u
.
num
.
digit13
=
msin
[
7
];
usim_data
.
imsi
.
u
.
num
.
digit14
=
msin
[
8
];
usim_data
.
imsi
.
u
.
num
.
digit15
=
msin
[
9
];
usim_data
->
imsi
.
u
.
num
.
digit6
=
msin
[
0
];
usim_data
->
imsi
.
u
.
num
.
digit7
=
msin
[
1
];
usim_data
->
imsi
.
u
.
num
.
digit8
=
msin
[
2
];
usim_data
->
imsi
.
u
.
num
.
digit9
=
msin
[
3
];
usim_data
->
imsi
.
u
.
num
.
digit10
=
msin
[
4
];
usim_data
->
imsi
.
u
.
num
.
digit11
=
msin
[
5
];
usim_data
->
imsi
.
u
.
num
.
digit12
=
msin
[
6
];
usim_data
->
imsi
.
u
.
num
.
digit13
=
msin
[
7
];
usim_data
->
imsi
.
u
.
num
.
digit14
=
msin
[
8
];
usim_data
->
imsi
.
u
.
num
.
digit15
=
msin
[
9
];
}
else
{
usim_data
.
imsi
.
u
.
num
.
digit6
=
user_plmn_list
[
hplmn_index
].
mnc
[
2
];
usim_data
.
imsi
.
u
.
num
.
digit7
=
msin
[
0
];
usim_data
.
imsi
.
u
.
num
.
digit8
=
msin
[
1
];
usim_data
.
imsi
.
u
.
num
.
digit9
=
msin
[
2
];
usim_data
.
imsi
.
u
.
num
.
digit10
=
msin
[
3
];
usim_data
.
imsi
.
u
.
num
.
digit11
=
msin
[
4
];
usim_data
.
imsi
.
u
.
num
.
digit12
=
msin
[
5
];
usim_data
.
imsi
.
u
.
num
.
digit13
=
msin
[
6
];
usim_data
.
imsi
.
u
.
num
.
digit14
=
msin
[
7
];
usim_data
.
imsi
.
u
.
num
.
digit15
=
msin
[
8
];
usim_data
->
imsi
.
u
.
num
.
digit6
=
user_plmn_list
[
hplmn_index
].
mnc
[
2
];
usim_data
->
imsi
.
u
.
num
.
digit7
=
msin
[
0
];
usim_data
->
imsi
.
u
.
num
.
digit8
=
msin
[
1
];
usim_data
->
imsi
.
u
.
num
.
digit9
=
msin
[
2
];
usim_data
->
imsi
.
u
.
num
.
digit10
=
msin
[
3
];
usim_data
->
imsi
.
u
.
num
.
digit11
=
msin
[
4
];
usim_data
->
imsi
.
u
.
num
.
digit12
=
msin
[
5
];
usim_data
->
imsi
.
u
.
num
.
digit13
=
msin
[
6
];
usim_data
->
imsi
.
u
.
num
.
digit14
=
msin
[
7
];
usim_data
->
imsi
.
u
.
num
.
digit15
=
msin
[
8
];
}
/*
* Ciphering and Integrity Keys
*/
usim_data
.
keys
.
ksi
=
KSI
;
memset
(
&
usim_data
.
keys
.
ck
,
0
,
USIM_CK_SIZE
);
memset
(
&
usim_data
.
keys
.
ik
,
0
,
USIM_IK_SIZE
);
usim_data
->
keys
.
ksi
=
KSI
;
memset
(
&
usim_data
->
keys
.
ck
,
0
,
USIM_CK_SIZE
);
memset
(
&
usim_data
->
keys
.
ik
,
0
,
USIM_IK_SIZE
);
/*
* Higher Priority PLMN search period
*/
usim_data
.
hpplmn
=
0x00
;
/* Disable timer */
usim_data
->
hpplmn
=
0x00
;
/* Disable timer */
/*
* List of Forbidden PLMNs
*/
for
(
int
i
=
0
;
i
<
USIM_FPLMN_MAX
;
i
++
)
{
memset
(
&
usim_data
.
fplmn
[
i
],
0xff
,
sizeof
(
plmn_t
));
memset
(
&
usim_data
->
fplmn
[
i
],
0xff
,
sizeof
(
plmn_t
));
}
if
(
fplmn_nb
>
0
)
{
for
(
int
i
=
0
;
i
<
fplmn_nb
;
i
++
)
{
usim_data
.
fplmn
[
i
]
=
user_network_record_list
[
fplmn
[
i
]].
plmn
;
usim_data
->
fplmn
[
i
]
=
user_network_record_list
[
fplmn
[
i
]].
plmn
;
}
}
/*
* Location Information
*/
usim_data
.
loci
.
tmsi
=
DEFAULT_TMSI
;
usim_data
.
loci
.
lai
.
plmn
=
user_network_record_list
[
hplmn_index
].
plmn
;
usim_data
.
loci
.
lai
.
lac
=
DEFAULT_LAC
;
usim_data
.
loci
.
status
=
USIM_LOCI_NOT_UPDATED
;
usim_data
->
loci
.
tmsi
=
DEFAULT_TMSI
;
usim_data
->
loci
.
lai
.
plmn
=
user_network_record_list
[
hplmn_index
].
plmn
;
usim_data
->
loci
.
lai
.
lac
=
DEFAULT_LAC
;
usim_data
->
loci
.
status
=
USIM_LOCI_NOT_UPDATED
;
/*
* Packet Switched Location Information
*/
usim_data
.
psloci
.
p_tmsi
=
DEFAULT_P_TMSI
;
usim_data
.
psloci
.
signature
[
0
]
=
0x01
;
usim_data
.
psloci
.
signature
[
1
]
=
0x02
;
usim_data
.
psloci
.
signature
[
2
]
=
0x03
;
usim_data
.
psloci
.
rai
.
plmn
=
user_network_record_list
[
hplmn_index
].
plmn
;
usim_data
.
psloci
.
rai
.
lac
=
DEFAULT_LAC
;
usim_data
.
psloci
.
rai
.
rac
=
DEFAULT_RAC
;
usim_data
.
psloci
.
status
=
USIM_PSLOCI_NOT_UPDATED
;
usim_data
->
psloci
.
p_tmsi
=
DEFAULT_P_TMSI
;
usim_data
->
psloci
.
signature
[
0
]
=
0x01
;
usim_data
->
psloci
.
signature
[
1
]
=
0x02
;
usim_data
->
psloci
.
signature
[
2
]
=
0x03
;
usim_data
->
psloci
.
rai
.
plmn
=
user_network_record_list
[
hplmn_index
].
plmn
;
usim_data
->
psloci
.
rai
.
lac
=
DEFAULT_LAC
;
usim_data
->
psloci
.
rai
.
rac
=
DEFAULT_RAC
;
usim_data
->
psloci
.
status
=
USIM_PSLOCI_NOT_UPDATED
;
/*
* Administrative Data
*/
usim_data
.
ad
.
UE_Operation_Mode
=
USIM_NORMAL_MODE
;
usim_data
.
ad
.
Additional_Info
=
0xffff
;
usim_data
.
ad
.
MNC_Length
=
strlen
(
user_plmn_list
[
hplmn_index
].
mnc
);
usim_data
->
ad
.
UE_Operation_Mode
=
USIM_NORMAL_MODE
;
usim_data
->
ad
.
Additional_Info
=
0xffff
;
usim_data
->
ad
.
MNC_Length
=
strlen
(
user_plmn_list
[
hplmn_index
].
mnc
);
/*
* EPS NAS security context
*/
usim_data
.
securityctx
.
length
=
52
;
usim_data
.
securityctx
.
KSIasme
.
type
=
USIM_KSI_ASME_TAG
;
usim_data
.
securityctx
.
KSIasme
.
length
=
1
;
usim_data
.
securityctx
.
KSIasme
.
value
[
0
]
=
KSI_ASME
;
usim_data
.
securityctx
.
Kasme
.
type
=
USIM_K_ASME_TAG
;
usim_data
.
securityctx
.
Kasme
.
length
=
USIM_K_ASME_SIZE
;
memset
(
usim_data
.
securityctx
.
Kasme
.
value
,
0
,
usim_data
.
securityctx
.
Kasme
.
length
);
usim_data
.
securityctx
.
ulNAScount
.
type
=
USIM_UL_NAS_COUNT_TAG
;
usim_data
.
securityctx
.
ulNAScount
.
length
=
USIM_UL_NAS_COUNT_SIZE
;
memset
(
usim_data
.
securityctx
.
ulNAScount
.
value
,
0
,
usim_data
.
securityctx
.
ulNAScount
.
length
);
usim_data
.
securityctx
.
dlNAScount
.
type
=
USIM_DL_NAS_COUNT_TAG
;
usim_data
.
securityctx
.
dlNAScount
.
length
=
USIM_DL_NAS_COUNT_SIZE
;
memset
(
usim_data
.
securityctx
.
dlNAScount
.
value
,
0
,
usim_data
.
securityctx
.
dlNAScount
.
length
);
usim_data
.
securityctx
.
algorithmID
.
type
=
USIM_INT_ENC_ALGORITHMS_TAG
;
usim_data
.
securityctx
.
algorithmID
.
length
=
1
;
usim_data
.
securityctx
.
algorithmID
.
value
[
0
]
=
SECURITY_ALGORITHMS
;
usim_data
->
securityctx
.
length
=
52
;
usim_data
->
securityctx
.
KSIasme
.
type
=
USIM_KSI_ASME_TAG
;
usim_data
->
securityctx
.
KSIasme
.
length
=
1
;
usim_data
->
securityctx
.
KSIasme
.
value
[
0
]
=
KSI_ASME
;
usim_data
->
securityctx
.
Kasme
.
type
=
USIM_K_ASME_TAG
;
usim_data
->
securityctx
.
Kasme
.
length
=
USIM_K_ASME_SIZE
;
memset
(
usim_data
->
securityctx
.
Kasme
.
value
,
0
,
usim_data
->
securityctx
.
Kasme
.
length
);
usim_data
->
securityctx
.
ulNAScount
.
type
=
USIM_UL_NAS_COUNT_TAG
;
usim_data
->
securityctx
.
ulNAScount
.
length
=
USIM_UL_NAS_COUNT_SIZE
;
memset
(
usim_data
->
securityctx
.
ulNAScount
.
value
,
0
,
usim_data
->
securityctx
.
ulNAScount
.
length
);
usim_data
->
securityctx
.
dlNAScount
.
type
=
USIM_DL_NAS_COUNT_TAG
;
usim_data
->
securityctx
.
dlNAScount
.
length
=
USIM_DL_NAS_COUNT_SIZE
;
memset
(
usim_data
->
securityctx
.
dlNAScount
.
value
,
0
,
usim_data
->
securityctx
.
dlNAScount
.
length
);
usim_data
->
securityctx
.
algorithmID
.
type
=
USIM_INT_ENC_ALGORITHMS_TAG
;
usim_data
->
securityctx
.
algorithmID
.
length
=
1
;
usim_data
->
securityctx
.
algorithmID
.
value
[
0
]
=
SECURITY_ALGORITHMS
;
/*
* Subcriber's Number
*/
usim_data
.
msisdn
.
length
=
7
;
usim_data
.
msisdn
.
number
.
ext
=
1
;
usim_data
.
msisdn
.
number
.
ton
=
MSISDN_TON_UNKNOWKN
;
usim_data
.
msisdn
.
number
.
npi
=
MSISDN_NPI_ISDN_TELEPHONY
;
usim_data
.
msisdn
.
conf1_record_id
=
0xff
;
/* Not used */
usim_data
.
msisdn
.
ext1_record_id
=
0xff
;
/* Not used */
usim_data
->
msisdn
.
length
=
7
;
usim_data
->
msisdn
.
number
.
ext
=
1
;
usim_data
->
msisdn
.
number
.
ton
=
MSISDN_TON_UNKNOWKN
;
usim_data
->
msisdn
.
number
.
npi
=
MSISDN_NPI_ISDN_TELEPHONY
;
usim_data
->
msisdn
.
conf1_record_id
=
0xff
;
/* Not used */
usim_data
->
msisdn
.
ext1_record_id
=
0xff
;
/* Not used */
int
j
=
0
;
for
(
int
i
=
0
;
i
<
strlen
(
msisdn
);
i
+=
2
)
{
usim_data
.
msisdn
.
number
.
digit
[
j
].
msb
=
msisdn
[
i
];
usim_data
->
msisdn
.
number
.
digit
[
j
].
msb
=
msisdn
[
i
];
j
++
;
}
j
=
0
;
for
(
int
i
=
1
;
i
<
strlen
(
msisdn
);
i
+=
2
)
{
usim_data
.
msisdn
.
number
.
digit
[
j
].
lsb
=
msisdn
[
i
];
usim_data
->
msisdn
.
number
.
digit
[
j
].
lsb
=
msisdn
[
i
];
j
++
;
}
if
(
strlen
(
msisdn
)
%
2
==
0
)
{
for
(
int
i
=
strlen
(
msisdn
)
/
2
;
i
<
10
;
i
++
)
{
usim_data
.
msisdn
.
number
.
digit
[
i
].
msb
=
0xf
;
usim_data
.
msisdn
.
number
.
digit
[
i
].
lsb
=
0xf
;
usim_data
->
msisdn
.
number
.
digit
[
i
].
msb
=
0xf
;
usim_data
->
msisdn
.
number
.
digit
[
i
].
lsb
=
0xf
;
}
}
else
{
usim_data
.
msisdn
.
number
.
digit
[
strlen
(
msisdn
)
/
2
].
lsb
=
0xf
;
usim_data
->
msisdn
.
number
.
digit
[
strlen
(
msisdn
)
/
2
].
lsb
=
0xf
;
for
(
int
i
=
(
strlen
(
msisdn
)
/
2
)
+
1
;
i
<
10
;
i
++
)
{
usim_data
.
msisdn
.
number
.
digit
[
i
].
msb
=
0xf
;
usim_data
.
msisdn
.
number
.
digit
[
i
].
lsb
=
0xf
;
usim_data
->
msisdn
.
number
.
digit
[
i
].
msb
=
0xf
;
usim_data
->
msisdn
.
number
.
digit
[
i
].
lsb
=
0xf
;
}
}
/*
...
...
@@ -304,22 +310,22 @@ void gen_usim_data(int user_id) {
*/
for
(
int
i
=
0
;
i
<
oplmn_nb
;
i
++
)
{
network_record_t
record
=
user_network_record_list
[
oplmn
[
i
]];
usim_data
.
pnn
[
i
].
fullname
.
type
=
USIM_PNN_FULLNAME_TAG
;
usim_data
.
pnn
[
i
].
fullname
.
length
=
strlen
(
record
.
fullname
);
strncpy
((
char
*
)
usim_data
.
pnn
[
i
].
fullname
.
value
,
record
.
fullname
,
usim_data
.
pnn
[
i
].
fullname
.
length
);
usim_data
.
pnn
[
i
].
shortname
.
type
=
USIM_PNN_SHORTNAME_TAG
;
usim_data
.
pnn
[
i
].
shortname
.
length
=
strlen
(
record
.
shortname
);
strncpy
((
char
*
)
usim_data
.
pnn
[
i
].
shortname
.
value
,
record
.
shortname
,
usim_data
.
pnn
[
i
].
shortname
.
length
);
usim_data
.
opl
[
i
].
plmn
=
record
.
plmn
;
usim_data
.
opl
[
i
].
start
=
record
.
tac_start
;
usim_data
.
opl
[
i
].
end
=
record
.
tac_end
;
usim_data
.
opl
[
i
].
record_id
=
i
;
usim_data
->
pnn
[
i
].
fullname
.
type
=
USIM_PNN_FULLNAME_TAG
;
usim_data
->
pnn
[
i
].
fullname
.
length
=
strlen
(
record
.
fullname
);
strncpy
((
char
*
)
usim_data
->
pnn
[
i
].
fullname
.
value
,
record
.
fullname
,
usim_data
->
pnn
[
i
].
fullname
.
length
);
usim_data
->
pnn
[
i
].
shortname
.
type
=
USIM_PNN_SHORTNAME_TAG
;
usim_data
->
pnn
[
i
].
shortname
.
length
=
strlen
(
record
.
shortname
);
strncpy
((
char
*
)
usim_data
->
pnn
[
i
].
shortname
.
value
,
record
.
shortname
,
usim_data
->
pnn
[
i
].
shortname
.
length
);
usim_data
->
opl
[
i
].
plmn
=
record
.
plmn
;
usim_data
->
opl
[
i
].
start
=
record
.
tac_start
;
usim_data
->
opl
[
i
].
end
=
record
.
tac_end
;
usim_data
->
opl
[
i
].
record_id
=
i
;
}
if
(
oplmn_nb
<
USIM_OPL_MAX
)
{
for
(
int
i
=
oplmn_nb
;
i
<
USIM_OPL_MAX
;
i
++
)
{
memset
(
&
usim_data
.
opl
[
i
].
plmn
,
0xff
,
sizeof
(
plmn_t
));
memset
(
&
usim_data
->
opl
[
i
].
plmn
,
0xff
,
sizeof
(
plmn_t
));
}
}
...
...
@@ -327,155 +333,162 @@ void gen_usim_data(int user_id) {
* List of Equivalent HPLMNs
*/
for
(
int
i
=
0
;
i
<
ehplmn_nb
;
i
++
)
{
usim_data
.
ehplmn
[
i
]
=
user_network_record_list
[
ehplmn
[
i
]].
plmn
;
usim_data
->
ehplmn
[
i
]
=
user_network_record_list
[
ehplmn
[
i
]].
plmn
;
}
if
(
ehplmn_nb
<
USIM_EHPLMN_MAX
)
{
for
(
int
i
=
ehplmn_nb
;
i
<
USIM_EHPLMN_MAX
;
i
++
)
{
memset
(
&
usim_data
.
ehplmn
[
i
],
0xff
,
sizeof
(
plmn_t
));
memset
(
&
usim_data
->
ehplmn
[
i
],
0xff
,
sizeof
(
plmn_t
));
}
}
/*
* Home PLMN Selector with Access Technology
*/
usim_data
.
hplmn
.
plmn
=
user_network_record_list
[
hplmn_index
].
plmn
;
usim_data
.
hplmn
.
AcT
=
(
USIM_ACT_GSM
|
USIM_ACT_UTRAN
|
USIM_ACT_EUTRAN
);
usim_data
->
hplmn
.
plmn
=
user_network_record_list
[
hplmn_index
].
plmn
;
usim_data
->
hplmn
.
AcT
=
(
USIM_ACT_GSM
|
USIM_ACT_UTRAN
|
USIM_ACT_EUTRAN
);
/*
* List of user controlled PLMN selector with Access Technology
*/
for
(
int
i
=
0
;
i
<
USIM_PLMN_MAX
;
i
++
)
{
memset
(
&
usim_data
.
plmn
[
i
],
0xff
,
sizeof
(
plmn_t
));
memset
(
&
usim_data
->
plmn
[
i
],
0xff
,
sizeof
(
plmn_t
));
}
if
(
ucplmn_nb
>
0
)
{
for
(
int
i
=
0
;
i
<
ucplmn_nb
;
i
++
)
{
usim_data
.
plmn
[
i
].
plmn
=
user_network_record_list
[
ucplmn
[
i
]].
plmn
;
usim_data
->
plmn
[
i
].
plmn
=
user_network_record_list
[
ucplmn
[
i
]].
plmn
;
}
}
// List of operator controlled PLMN selector with Access Technology
for
(
int
i
=
0
;
i
<
USIM_OPLMN_MAX
;
i
++
)
{
memset
(
&
usim_data
.
oplmn
[
i
],
0xff
,
sizeof
(
plmn_t
));
memset
(
&
usim_data
->
oplmn
[
i
],
0xff
,
sizeof
(
plmn_t
));
}
if
(
ocplmn_nb
>
0
)
{
for
(
int
i
=
0
;
i
<
ocplmn_nb
;
i
++
)
{
usim_data
.
oplmn
[
i
].
plmn
=
user_network_record_list
[
ocplmn
[
i
]].
plmn
;
usim_data
.
oplmn
[
i
].
AcT
=
(
USIM_ACT_GSM
|
USIM_ACT_UTRAN
usim_data
->
oplmn
[
i
].
plmn
=
user_network_record_list
[
ocplmn
[
i
]].
plmn
;
usim_data
->
oplmn
[
i
].
AcT
=
(
USIM_ACT_GSM
|
USIM_ACT_UTRAN
|
USIM_ACT_EUTRAN
);
}
}
/*
* EPS Location Information
*/
usim_data
.
epsloci
.
guti
.
gummei
.
plmn
=
usim_data
->
epsloci
.
guti
.
gummei
.
plmn
=
user_network_record_list
[
hplmn_index
].
plmn
;
usim_data
.
epsloci
.
guti
.
gummei
.
MMEgid
=
DEFAULT_MME_ID
;
usim_data
.
epsloci
.
guti
.
gummei
.
MMEcode
=
DEFAULT_MME_CODE
;
usim_data
.
epsloci
.
guti
.
m_tmsi
=
DEFAULT_M_TMSI
;
usim_data
.
epsloci
.
tai
.
plmn
=
usim_data
.
epsloci
.
guti
.
gummei
.
plmn
;
usim_data
.
epsloci
.
tai
.
tac
=
DEFAULT_TAC
;
usim_data
.
epsloci
.
status
=
USIM_EPSLOCI_UPDATED
;
usim_data
->
epsloci
.
guti
.
gummei
.
MMEgid
=
DEFAULT_MME_ID
;
usim_data
->
epsloci
.
guti
.
gummei
.
MMEcode
=
DEFAULT_MME_CODE
;
usim_data
->
epsloci
.
guti
.
m_tmsi
=
DEFAULT_M_TMSI
;
usim_data
->
epsloci
.
tai
.
plmn
=
usim_data
->
epsloci
.
guti
.
gummei
.
plmn
;
usim_data
->
epsloci
.
tai
.
tac
=
DEFAULT_TAC
;
usim_data
->
epsloci
.
status
=
USIM_EPSLOCI_UPDATED
;
/*
* Non-Access Stratum configuration
*/
usim_data
.
nasconfig
.
NAS_SignallingPriority
.
type
=
usim_data
->
nasconfig
.
NAS_SignallingPriority
.
type
=
USIM_NAS_SIGNALLING_PRIORITY_TAG
;
usim_data
.
nasconfig
.
NAS_SignallingPriority
.
length
=
1
;
usim_data
.
nasconfig
.
NAS_SignallingPriority
.
value
[
0
]
=
0x00
;
usim_data
.
nasconfig
.
NMO_I_Behaviour
.
type
=
USIM_NMO_I_BEHAVIOUR_TAG
;
usim_data
.
nasconfig
.
NMO_I_Behaviour
.
length
=
1
;
usim_data
.
nasconfig
.
NMO_I_Behaviour
.
value
[
0
]
=
0x00
;
usim_data
.
nasconfig
.
AttachWithImsi
.
type
=
USIM_ATTACH_WITH_IMSI_TAG
;
usim_data
.
nasconfig
.
AttachWithImsi
.
length
=
1
;
usim_data
->
nasconfig
.
NAS_SignallingPriority
.
length
=
1
;
usim_data
->
nasconfig
.
NAS_SignallingPriority
.
value
[
0
]
=
0x00
;
usim_data
->
nasconfig
.
NMO_I_Behaviour
.
type
=
USIM_NMO_I_BEHAVIOUR_TAG
;
usim_data
->
nasconfig
.
NMO_I_Behaviour
.
length
=
1
;
usim_data
->
nasconfig
.
NMO_I_Behaviour
.
value
[
0
]
=
0x00
;
usim_data
->
nasconfig
.
AttachWithImsi
.
type
=
USIM_ATTACH_WITH_IMSI_TAG
;
usim_data
->
nasconfig
.
AttachWithImsi
.
length
=
1
;
#if defined(START_WITH_GUTI)
usim_data
.
nasconfig
.
AttachWithImsi
.
value
[
0
]
=
0x00
;
usim_data
->
nasconfig
.
AttachWithImsi
.
value
[
0
]
=
0x00
;
#else
usim_data
.
nasconfig
.
AttachWithImsi
.
value
[
0
]
=
0x01
;
usim_data
->
nasconfig
.
AttachWithImsi
.
value
[
0
]
=
0x01
;
#endif
usim_data
.
nasconfig
.
MinimumPeriodicSearchTimer
.
type
=
usim_data
->
nasconfig
.
MinimumPeriodicSearchTimer
.
type
=
USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG
;
usim_data
.
nasconfig
.
MinimumPeriodicSearchTimer
.
length
=
1
;
usim_data
.
nasconfig
.
MinimumPeriodicSearchTimer
.
value
[
0
]
=
0x00
;
usim_data
.
nasconfig
.
ExtendedAccessBarring
.
type
=
usim_data
->
nasconfig
.
MinimumPeriodicSearchTimer
.
length
=
1
;
usim_data
->
nasconfig
.
MinimumPeriodicSearchTimer
.
value
[
0
]
=
0x00
;
usim_data
->
nasconfig
.
ExtendedAccessBarring
.
type
=
USIM_EXTENDED_ACCESS_BARRING_TAG
;
usim_data
.
nasconfig
.
ExtendedAccessBarring
.
length
=
1
;
usim_data
.
nasconfig
.
ExtendedAccessBarring
.
value
[
0
]
=
0x00
;
usim_data
.
nasconfig
.
Timer_T3245_Behaviour
.
type
=
usim_data
->
nasconfig
.
ExtendedAccessBarring
.
length
=
1
;
usim_data
->
nasconfig
.
ExtendedAccessBarring
.
value
[
0
]
=
0x00
;
usim_data
->
nasconfig
.
Timer_T3245_Behaviour
.
type
=
USIM_TIMER_T3245_BEHAVIOUR_TAG
;
usim_data
.
nasconfig
.
Timer_T3245_Behaviour
.
length
=
1
;
usim_data
.
nasconfig
.
Timer_T3245_Behaviour
.
value
[
0
]
=
0x00
;
usim_data
->
nasconfig
.
Timer_T3245_Behaviour
.
length
=
1
;
usim_data
->
nasconfig
.
Timer_T3245_Behaviour
.
value
[
0
]
=
0x00
;
/* initialize the subscriber authentication security key */
hex_string_to_hex_value
(
usim_data
.
keys
.
usim_api_k
,
hex_string_to_hex_value
(
usim_data
->
keys
.
usim_api_k
,
usim_api_k
,
USIM_API_K_SIZE
);
hex_string_to_hex_value
(
usim_data
.
keys
.
opc
,
opc
,
hex_string_to_hex_value
(
usim_data
->
keys
.
opc
,
opc
,
OPC_SIZE
);
}
char
*
path
=
make_filename
(
output_dir
,
USIM_API_NVRAM_FILENAME
,
user_id
);
usim_api_write
(
path
,
&
usim_data
);
free
(
path
);
int
write_usim_data
(
const
char
*
directory
,
int
user_id
,
usim_data_t
*
usim_data
){
int
rc
;
char
*
filename
=
make_filename
(
directory
,
USIM_API_NVRAM_FILENAME
,
user_id
);
rc
=
usim_api_write
(
filename
,
usim_data
);
free
(
filename
);
return
rc
;
}
void
gen_emm_data
(
int
user_id
)
{
void
gen_emm_data
(
int
user_id
,
emm_nvdata_t
*
emm_data
)
{
hplmn_index
=
get_plmn_index
(
hplmn
);
emm_nvdata_t
emm_data
;
int
rc
;
memset
(
&
emm_data
,
0
,
sizeof
(
emm_nvdata_t
));
memset
(
emm_data
,
0
,
sizeof
(
emm_nvdata_t
));
int
hplmn_index
=
get_plmn_index
(
hplmn
);
emm_data
.
imsi
.
length
=
8
;
emm_data
.
imsi
.
u
.
num
.
parity
=
get_msin_parity
(
msin
);
emm_data
.
imsi
.
u
.
num
.
digit1
=
user_plmn_list
[
hplmn_index
].
mcc
[
0
];
emm_data
.
imsi
.
u
.
num
.
digit2
=
user_plmn_list
[
hplmn_index
].
mcc
[
1
];
emm_data
.
imsi
.
u
.
num
.
digit3
=
user_plmn_list
[
hplmn_index
].
mcc
[
2
];
emm_data
->
imsi
.
length
=
8
;
emm_data
->
imsi
.
u
.
num
.
parity
=
get_msin_parity
(
msin
);
emm_data
->
imsi
.
u
.
num
.
digit1
=
user_plmn_list
[
hplmn_index
].
mcc
[
0
];
emm_data
->
imsi
.
u
.
num
.
digit2
=
user_plmn_list
[
hplmn_index
].
mcc
[
1
];
emm_data
->
imsi
.
u
.
num
.
digit3
=
user_plmn_list
[
hplmn_index
].
mcc
[
2
];
emm_data
.
imsi
.
u
.
num
.
digit4
=
user_plmn_list
[
hplmn_index
].
mnc
[
0
];
emm_data
.
imsi
.
u
.
num
.
digit5
=
user_plmn_list
[
hplmn_index
].
mnc
[
1
];
emm_data
->
imsi
.
u
.
num
.
digit4
=
user_plmn_list
[
hplmn_index
].
mnc
[
0
];
emm_data
->
imsi
.
u
.
num
.
digit5
=
user_plmn_list
[
hplmn_index
].
mnc
[
1
];
if
(
strlen
(
user_plmn_list
[
hplmn_index
].
mnc
)
==
3
)
{
emm_data
.
rplmn
.
MNCdigit3
=
user_plmn_list
[
hplmn_index
].
mnc
[
2
];
emm_data
.
imsi
.
u
.
num
.
digit6
=
user_plmn_list
[
hplmn_index
].
mnc
[
2
];
emm_data
.
imsi
.
u
.
num
.
digit7
=
msin
[
0
];
emm_data
.
imsi
.
u
.
num
.
digit8
=
msin
[
1
];
emm_data
.
imsi
.
u
.
num
.
digit9
=
msin
[
2
];
emm_data
.
imsi
.
u
.
num
.
digit10
=
msin
[
3
];
emm_data
.
imsi
.
u
.
num
.
digit11
=
msin
[
4
];
emm_data
.
imsi
.
u
.
num
.
digit12
=
msin
[
5
];
emm_data
.
imsi
.
u
.
num
.
digit13
=
msin
[
6
];
emm_data
.
imsi
.
u
.
num
.
digit14
=
msin
[
7
];
emm_data
.
imsi
.
u
.
num
.
digit15
=
msin
[
8
];
emm_data
->
rplmn
.
MNCdigit3
=
user_plmn_list
[
hplmn_index
].
mnc
[
2
];
emm_data
->
imsi
.
u
.
num
.
digit6
=
user_plmn_list
[
hplmn_index
].
mnc
[
2
];
emm_data
->
imsi
.
u
.
num
.
digit7
=
msin
[
0
];
emm_data
->
imsi
.
u
.
num
.
digit8
=
msin
[
1
];
emm_data
->
imsi
.
u
.
num
.
digit9
=
msin
[
2
];
emm_data
->
imsi
.
u
.
num
.
digit10
=
msin
[
3
];
emm_data
->
imsi
.
u
.
num
.
digit11
=
msin
[
4
];
emm_data
->
imsi
.
u
.
num
.
digit12
=
msin
[
5
];
emm_data
->
imsi
.
u
.
num
.
digit13
=
msin
[
6
];
emm_data
->
imsi
.
u
.
num
.
digit14
=
msin
[
7
];
emm_data
->
imsi
.
u
.
num
.
digit15
=
msin
[
8
];
}
else
{
emm_data
.
rplmn
.
MNCdigit3
=
0xf
;
emm_data
->
rplmn
.
MNCdigit3
=
0xf
;
emm_data
.
imsi
.
u
.
num
.
digit6
=
msin
[
0
];
emm_data
.
imsi
.
u
.
num
.
digit7
=
msin
[
1
];
emm_data
.
imsi
.
u
.
num
.
digit8
=
msin
[
2
];
emm_data
.
imsi
.
u
.
num
.
digit9
=
msin
[
3
];
emm_data
.
imsi
.
u
.
num
.
digit10
=
msin
[
4
];
emm_data
.
imsi
.
u
.
num
.
digit11
=
msin
[
5
];
emm_data
.
imsi
.
u
.
num
.
digit12
=
msin
[
6
];
emm_data
.
imsi
.
u
.
num
.
digit13
=
msin
[
7
];
emm_data
.
imsi
.
u
.
num
.
digit14
=
msin
[
8
];
emm_data
.
imsi
.
u
.
num
.
digit15
=
msin
[
9
];
emm_data
->
imsi
.
u
.
num
.
digit6
=
msin
[
0
];
emm_data
->
imsi
.
u
.
num
.
digit7
=
msin
[
1
];
emm_data
->
imsi
.
u
.
num
.
digit8
=
msin
[
2
];
emm_data
->
imsi
.
u
.
num
.
digit9
=
msin
[
3
];
emm_data
->
imsi
.
u
.
num
.
digit10
=
msin
[
4
];
emm_data
->
imsi
.
u
.
num
.
digit11
=
msin
[
5
];
emm_data
->
imsi
.
u
.
num
.
digit12
=
msin
[
6
];
emm_data
->
imsi
.
u
.
num
.
digit13
=
msin
[
7
];
emm_data
->
imsi
.
u
.
num
.
digit14
=
msin
[
8
];
emm_data
->
imsi
.
u
.
num
.
digit15
=
msin
[
9
];
}
emm_data
.
rplmn
.
MCCdigit1
=
user_plmn_list
[
hplmn_index
].
mcc
[
0
];
emm_data
.
rplmn
.
MCCdigit2
=
user_plmn_list
[
hplmn_index
].
mcc
[
1
];
emm_data
.
rplmn
.
MCCdigit3
=
user_plmn_list
[
hplmn_index
].
mcc
[
2
];
emm_data
.
rplmn
.
MNCdigit1
=
user_plmn_list
[
hplmn_index
].
mnc
[
0
];
emm_data
.
rplmn
.
MNCdigit2
=
user_plmn_list
[
hplmn_index
].
mnc
[
1
];
emm_data
->
rplmn
.
MCCdigit1
=
user_plmn_list
[
hplmn_index
].
mcc
[
0
];
emm_data
->
rplmn
.
MCCdigit2
=
user_plmn_list
[
hplmn_index
].
mcc
[
1
];
emm_data
->
rplmn
.
MCCdigit3
=
user_plmn_list
[
hplmn_index
].
mcc
[
2
];
emm_data
->
rplmn
.
MNCdigit1
=
user_plmn_list
[
hplmn_index
].
mnc
[
0
];
emm_data
->
rplmn
.
MNCdigit2
=
user_plmn_list
[
hplmn_index
].
mnc
[
1
];
emm_data
.
eplmn
.
n_plmns
=
ehplmn_nb
;
emm_data
->
eplmn
.
n_plmns
=
ehplmn_nb
;
}
char
*
path
=
make_filename
(
output_dir
,
EMM_NVRAM_FILENAME
,
user_id
);
rc
=
memory_write
(
path
,
&
emm_data
,
sizeof
(
emm_nvdata_t
));
free
(
path
);
int
write_emm_data
(
const
char
*
directory
,
int
user_id
,
emm_nvdata_t
*
emm_data
)
{
int
rc
;
char
*
filename
=
make_filename
(
directory
,
EMM_NVRAM_FILENAME
,
user_id
);
rc
=
memory_write
(
filename
,
emm_data
,
sizeof
(
emm_nvdata_t
));
free
(
filename
);
if
(
rc
!=
RETURNok
)
{
perror
(
"ERROR
\t
: memory_write() failed"
);
exit
(
EXIT_FAILURE
);
}
return
(
EXIT_SUCCESS
);
}
int
parse_plmn_param
(
config_setting_t
*
plmn_setting
,
int
index
)
{
...
...
@@ -632,9 +645,8 @@ int parse_ue_sim_param(config_setting_t *ue_setting, int user_id) {
return
EXIT_SUCCESS
;
}
int
parse_ue_user_param
(
config_setting_t
*
ue_setting
,
int
user_id
)
{
int
parse_ue_user_param
(
config_setting_t
*
ue_setting
,
int
user_id
,
user_nvdata_t
*
user_data
)
{
config_setting_t
*
ue_param_setting
=
NULL
;
user_nvdata_t
user_data
;
const
char
*
imei
=
NULL
;
const
char
*
manufacturer
=
NULL
;
const
char
*
model
=
NULL
;
...
...
@@ -667,29 +679,34 @@ int parse_ue_user_param(config_setting_t *ue_setting, int user_id) {
printf
(
"Check USER PIN for UE%d FULLNAME. Exiting
\n
"
,
user_id
);
return
EXIT_FAILURE
;
}
memset
(
&
user_data
,
0
,
sizeof
(
user_nvdata_t
));
snprintf
(
user_data
.
IMEI
,
USER_IMEI_SIZE
+
1
,
"%s%d"
,
imei
,
_luhn
(
imei
));
memset
(
user_data
,
0
,
sizeof
(
user_nvdata_t
));
snprintf
(
user_data
->
IMEI
,
USER_IMEI_SIZE
+
1
,
"%s%d"
,
imei
,
_luhn
(
imei
));
/*
* Manufacturer identifier
*/
strncpy
(
user_data
.
manufacturer
,
manufacturer
,
USER_MANUFACTURER_SIZE
);
strncpy
(
user_data
->
manufacturer
,
manufacturer
,
USER_MANUFACTURER_SIZE
);
/*
* Model identifier
*/
strncpy
(
user_data
.
model
,
model
,
USER_MODEL_SIZE
);
strncpy
(
user_data
->
model
,
model
,
USER_MODEL_SIZE
);
/*
* SIM Personal Identification Number
*/
strncpy
(
user_data
.
PIN
,
pin
,
USER_PIN_SIZE
);
strncpy
(
user_data
->
PIN
,
pin
,
USER_PIN_SIZE
);
char
*
path
=
make_filename
(
output_dir
,
USER_NVRAM_FILENAME
,
user_id
);
rc
=
memory_write
(
path
,
&
user_data
,
sizeof
(
user_nvdata_t
));
free
(
path
);
return
EXIT_SUCCESS
;
}
void
write_user_data
(
const
char
*
directory
,
int
user_id
,
user_nvdata_t
*
data
)
{
int
rc
;
char
*
filename
=
make_filename
(
directory
,
USER_NVRAM_FILENAME
,
user_id
);
rc
=
memory_write
(
filename
,
data
,
sizeof
(
user_nvdata_t
));
free
(
filename
);
if
(
rc
!=
RETURNok
)
{
perror
(
"ERROR
\t
: memory_write() failed"
);
exit
(
EXIT_FAILURE
);
}
return
EXIT_SUCCESS
;
}
int
fill_ucplmn
(
config_setting_t
*
setting
,
int
user_id
)
{
...
...
openair3/NAS/TOOLS/conf2uedata.h
View file @
60c8ef27
...
...
@@ -2,7 +2,10 @@
#define _CONF2UEDATA_H
#include <libconfig.h>
#include "emmData.h"
#include "usim_api.h"
#include "userDef.h"
#define USER "USER"
#define UE "UE"
...
...
@@ -70,8 +73,6 @@ typedef struct {
const
char
*
mcc
;
}
plmn_conf_param_t
;
extern
const
char
*
output_dir
;
extern
const
char
*
msin
;
extern
const
char
*
usim_api_k
;
extern
const
char
*
msisdn
;
...
...
@@ -96,16 +97,21 @@ extern plmn_conf_param_t* user_plmn_list;
extern
network_record_t
*
user_network_record_list
;
int
get_config_from_file
(
const
char
*
filename
,
config_t
*
config
);
int
parse_config_file
(
const
char
*
filename
);
int
parse_config_file
(
const
char
*
output_dir
,
const
char
*
filename
);
void
_display_usage
(
void
);
void
gen_emm_data
(
int
user_id
)
;
void
gen_usim_data
(
int
user_id
);
void
gen_emm_data
(
int
user_id
,
emm_nvdata_t
*
emm_data
);
void
fill_network_record_list
(
void
);
int
parse_ue_user_param
(
config_setting_t
*
ue_setting
,
int
user_id
,
user_nvdata_t
*
user_data
);
void
write_user_data
(
const
char
*
directory
,
int
user_id
,
user_nvdata_t
*
data
);
int
write_emm_data
(
const
char
*
directory
,
int
user_id
,
emm_nvdata_t
*
emm_data
);
int
write_usim_data
(
const
char
*
directory
,
int
user_id
,
usim_data_t
*
usim_data
);
void
gen_usim_data
(
usim_data_t
*
usim_data
);
int
_luhn
(
const
char
*
cc
);
int
parse_ue_user_param
(
config_setting_t
*
ue_setting
,
int
user_id
);
int
parse_ue_sim_param
(
config_setting_t
*
ue_setting
,
int
user_id
);
int
parse_plmn_param
(
config_setting_t
*
plmn_setting
,
int
index
);
int
parse_plmns
(
config_setting_t
*
all_plmn_setting
);
...
...
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