Merge remote-tracking branch 'origin/lte-sim-tools' into integration_2025_w31 (!3530)

remove specific directory for LTE SIM management tools

This is very old code has never been integrated with the "main" OAI
cmake infrastructure and more recent libraries.

This MR integrates the three binaries for LTE virtual sim management in
the regular build process and log system
This commit is contained in:
Robert Schmidt
2025-07-31 09:50:11 +02:00
17 changed files with 319 additions and 391 deletions
-1
View File
@@ -5,7 +5,6 @@
cmake_targets/log/
cmake_targets/*/build/
cmake_targets/ran_build/
cmake_targets/nas_sim_tools/build/
log/
lte_build_oai/
+1 -1
View File
@@ -172,7 +172,7 @@ else ()
endif()
# add autotools definitions that were maybe used!
add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
add_definitions(-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP)
# we need -rdynamic to incorporate all symbols in shared objects, see man page
set(commonOpts "-pipe -fPIC -Wall -fno-strict-aliasing -rdynamic")
+2 -19
View File
@@ -34,7 +34,6 @@ source "$THIS_SCRIPT_PATH"/tools/build_helper
set_openair_env
# Variables for UE data generation
gen_nvram_path=$OPENAIR_DIR/cmake_targets/ran_build/build
conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
HW=""
@@ -93,8 +92,6 @@ Options:
Makes the NR UE softmodem
--UE-conf-nvram [configuration file]
Specify conf_nvram_path (default \"$conf_nvram_path\")
--UE-gen-nvram [output path]
Specify gen_nvram_path (default \"$gen_nvram_path\")
-w | --hardware
USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, AERIAL, None (Default)
Adds this RF board support (in external packages installation and in compilation)
@@ -244,7 +241,7 @@ function main() {
shift;;
--UE)
UE=1
TARGET_LIST="$TARGET_LIST lte-uesoftmodem"
TARGET_LIST="$TARGET_LIST lte-uesoftmodem conf2uedata usim nvram"
echo_info "Will compile UE"
shift;;
--nrUE)
@@ -259,9 +256,6 @@ function main() {
--UE-conf-nvram)
conf_nvram_path=$(readlink -f "$2")
shift 2;;
--UE-gen-nvram)
gen_nvram_path=$(readlink -f "$2")
shift 2;;
-w | --hardware)
case "$2" in
"USRP" | "BLADERF" | "LMSSDR" | "IRIS")
@@ -513,18 +507,7 @@ function main() {
fi
if [ "$UE" = 1 ] ; then
echo_info "Compiling UE specific part"
[ "$CLEAN" = "1" ] && rm -rf $DIR/nas_sim_tools/build
mkdir -p $DIR/nas_sim_tools/build
cd $DIR/nas_sim_tools/build
${CMAKE_CMD% *} ..
compilations nas_sim_tools usim.txt "usim" "${BUILD_TOOL_OPT}"
compilations nas_sim_tools nvram.txt "nvram" "${BUILD_TOOL_OPT}"
compilations nas_sim_tools conf2uedata.txt "conf2uedata" "${BUILD_TOOL_OPT}"
echo_info "Generate LTE USIM default sim content UE specific part"
# generate USIM data
if [ -f conf2uedata ]; then
install_nas_tools $conf_nvram_path $DIR/$BUILD_DIR/build "$DIR/$BUILD_DIR/build/conf2uedata.txt"
@@ -1,79 +0,0 @@
cmake_minimum_required(VERSION 3.5)
project(NAS_SIM_TOOLS)
include(FindPkgConfig)
pkg_search_module(CONFIG libconfig REQUIRED)
include_directories(${CONFIG_INCLUDE_DIRS})
add_definitions(-std=gnu99)
include("../macros.cmake")
ENABLE_LANGUAGE(C)
set(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -Werror -Wall -Wstrict-prototypes -g")
set(OPENAIR_DIR $ENV{OPENAIR_DIR})
set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3)
include_directories (${OPENAIR_DIR}/openair2/COMMON)
include_directories (${OPENAIR_DIR})
set(CONF2UEDATA_LIB_SRC
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_emm.c
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_user_data.c
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_usim.c
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_network.c
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_user_plmn.c
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_parser.c
${OPENAIR_DIR}/openair3/NAS/TOOLS/fs.c
${OPENAIR_DIR}/openair3/NAS/TOOLS/display.c
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.c
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/aka_functions.c
${OPENAIR_DIR}/common/utils/mem/memory.c
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/OctetString.c
${OPENAIR_DIR}/common/utils/utils.c
)
include_directories(
${OPENAIR_DIR}/common/utils
${OPENAIR_DIR}/openair3/NAS/UE
${OPENAIR_DIR}/openair3/NAS/COMMON
${OPENAIR_DIR}/openair3/NAS/UE/API/USER
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM
${OPENAIR_DIR}/openair3/NAS/UE/EMM/
${OPENAIR_DIR}/openair3/NAS/UE/ESM/
${OPENAIR_DIR}/openair3/NAS/COMMON/IES/
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL
)
# conf2uedata binary
set(conf2uedata_SRC
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf2uedata.c
${CONF2UEDATA_LIB_SRC}
)
add_executable(conf2uedata ${conf2uedata_SRC} )
target_link_libraries(conf2uedata ${CONFIG_LIBRARIES})
# usim binary
set(usim_SRC
${OPENAIR_DIR}/openair3/NAS/TOOLS/usim.c
${CONF2UEDATA_LIB_SRC}
)
add_executable(usim ${usim_SRC} )
target_link_libraries(usim ${CONFIG_LIBRARIES})
# nvram binary
set(nvram_SRC
${OPENAIR_DIR}/openair3/NAS/TOOLS/nvram.c
${CONF2UEDATA_LIB_SRC}
)
add_executable(nvram ${nvram_SRC})
target_link_libraries(nvram ${CONFIG_LIBRARIES})
-1
View File
@@ -177,7 +177,6 @@ clean_all_files() {
dir=$OPENAIR_DIR/cmake_targets
rm -rf $dir/ran_build $dir/ran_build_noLOG
rm -rf $dir/lte-simulators/build
rm -rf $dir/nas_sim_tools/build
rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build
}
+3 -3
View File
@@ -55,9 +55,9 @@ RUN dnf update -y && \
WORKDIR /opt/oai-lte-ue/bin
COPY --from=lte-ue-build \
/oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \
/oai-ran/cmake_targets/nas_sim_tools/build/conf2uedata \
/oai-ran/cmake_targets/nas_sim_tools/build/nvram \
/oai-ran/cmake_targets/nas_sim_tools/build/usim \
/oai-ran/cmake_targets/ran_build/build/conf2uedata \
/oai-ran/cmake_targets/ran_build/build/nvram \
/oai-ran/cmake_targets/ran_build/build/usim \
./
COPY ./docker/scripts/lte_ue_entrypoint.sh ./entrypoint.sh
+3 -3
View File
@@ -56,9 +56,9 @@ RUN dnf update -y && \
WORKDIR /opt/oai-lte-ue/bin
COPY --from=lte-ue-build \
/oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \
/oai-ran/cmake_targets/nas_sim_tools/build/conf2uedata \
/oai-ran/cmake_targets/nas_sim_tools/build/nvram \
/oai-ran/cmake_targets/nas_sim_tools/build/usim \
/oai-ran/cmake_targets/ran_build/build/conf2uedata \
/oai-ran/cmake_targets/ran_build/build/nvram \
/oai-ran/cmake_targets/ran_build/build/usim \
./
COPY ./docker/scripts/lte_ue_entrypoint.sh ./entrypoint.sh
+3 -3
View File
@@ -89,9 +89,9 @@ COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libasan.so.8.0.0 /usr/lib/x86
WORKDIR /opt/oai-lte-ue/bin
COPY --from=lte-ue-build \
/oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \
/oai-ran/cmake_targets/nas_sim_tools/build/conf2uedata \
/oai-ran/cmake_targets/nas_sim_tools/build/nvram \
/oai-ran/cmake_targets/nas_sim_tools/build/usim \
/oai-ran/cmake_targets/ran_build/build/conf2uedata \
/oai-ran/cmake_targets/ran_build/build/nvram \
/oai-ran/cmake_targets/ran_build/build/usim \
./
COPY ./docker/scripts/lte_ue_entrypoint.sh ./entrypoint.sh
-2
View File
@@ -46,8 +46,6 @@
#include <openair2/RRC/LTE/rrc_proto.h>
#include "executables/softmodem-common.h"
extern void openair_rrc_top_init_ue( int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active);
void dl_phy_sync_success(module_id_t module_idP, frame_t frameP, unsigned char eNB_index, uint8_t first_sync) { //init as MR
LOG_D(MAC, "[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n",
module_idP, frameP, eNB_index);
+6 -2
View File
@@ -2892,9 +2892,13 @@ int decode_BCCH_DLSCH_Message(
if ((ctxt_pP->frame % 2) == 0) {
// even frame
if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&1) == 0) {
if (!UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]) {
LOG_E(PHY,"UE_rrc_inst[%d].sib1[%d] is null, allocating\n", ctxt_pP->module_id, eNB_index);
openair_rrc_ue_init(ctxt_pP->module_id, eNB_index);
}
LTE_SystemInformationBlockType1_t *sib1 = UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index];
memcpy( (void *)sib1,
(void *)&bcch_message->message.choice.c1.choice.systemInformationBlockType1,
memcpy( sib1,
&bcch_message->message.choice.c1.choice.systemInformationBlockType1,
sizeof(LTE_SystemInformationBlockType1_t) );
LOG_D( RRC, "[UE %"PRIu8"] Decoding First SIB1\n", ctxt_pP->module_id );
decode_SIB1( ctxt_pP, eNB_index, rsrq, rsrp );
+1
View File
@@ -1,3 +1,4 @@
add_subdirectory(COMMON)
add_subdirectory(NR_UE)
add_subdirectory(UE)
add_subdirectory(TOOLS)
+1 -3
View File
@@ -97,6 +97,7 @@ typedef enum {
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#ifdef LOG_E
# define LOG_TRACE(s, x, args...) \
do { \
switch (s) { \
@@ -111,9 +112,6 @@ do { \
# define LOG_FUNC_IN LOG_ENTER(NAS)
# define LOG_FUNC_OUT LOG_END(NAS)
# define LOG_FUNC_RETURN(rETURNcODE) LOG_RETURN(NAS,rETURNcODE)
extern int nas_log_func_indent;
#else
# define LOG_TRACE(s, x, args...)
# define LOG_DUMP(dATA, lEN) LOG_DUMPMSG(NAS, LOG_DUMP_CHAR,dATA, lEN, " Dump %d:\n", lEN)
+36
View File
@@ -0,0 +1,36 @@
add_library(conf2uedata_lib OBJECT
conf_emm.c
conf_user_data.c
conf_usim.c
conf_network.c
conf_user_plmn.c
conf_parser.c
fs.c
display.c
../UE/API/USIM/usim_api.c
../UE/API/USIM/aka_functions.c
../COMMON/UTIL/OctetString.c
${OPENAIR_DIR}/common/utils/mem/memory.c
${OPENAIR_DIR}/common/utils/utils.c
)
add_executable(conf2uedata conf2uedata.c)
target_link_libraries(conf2uedata PRIVATE conf2uedata_lib)
set_target_properties(conf2uedata PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
target_link_libraries(conf2uedata PRIVATE LOG minimal_lib ${libconfig_LIBRARIES})
add_executable(usim usim.c)
target_link_libraries(usim PRIVATE conf2uedata_lib)
set_target_properties(usim PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
target_link_libraries(usim PRIVATE LOG minimal_lib ${libconfig_LIBRARIES})
add_executable(nvram nvram.c)
target_link_libraries(nvram PRIVATE conf2uedata_lib)
set_target_properties(nvram PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
target_link_libraries(nvram PRIVATE LOG minimal_lib ${libconfig_LIBRARIES})
if (${T_TRACER})
add_dependencies(conf2uedata generate_T)
add_dependencies(usim generate_T)
add_dependencies(nvram generate_T)
endif (${T_TRACER})
+2
View File
@@ -3,6 +3,7 @@
#include <string.h> // memset, strncpy
#include <getopt.h>
#include "log.h"
#include "conf2uedata.h"
#include "display.h"
#include "conf_parser.h"
@@ -42,6 +43,7 @@ int main(int argc, char**argv) {
exit(1);
}
logInit();
if ( parse_config_file(output_dir, conf_file, OUTPUT_ALL) == false ) {
exit(1);
}
+257 -274
View File
@@ -8,301 +8,284 @@
#include "conf_usim.h"
bool parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u) {
int rc = true;
config_setting_t *ue_param_setting = NULL;
ue_param_setting = config_setting_get_member(ue_setting, SIM);
if (ue_param_setting == NULL) {
printf("Check SIM section for UE%d. EXITING...\n", user_id);
return false;
}
rc = config_setting_lookup_string(ue_param_setting, MSIN, &u->msin);
if (rc != 1 || strlen(u->msin) > 10 || strlen(u->msin) < 9) {
printf("Check SIM MSIN section for UE%d. Exiting\n", user_id);
return false;
}
rc = config_setting_lookup_string(ue_param_setting, USIM_API_K,
&u->usim_api_k);
if (rc != 1) {
printf("Check SIM USIM_API_K section for UE%d. Exiting\n", user_id);
return false;
}
rc = config_setting_lookup_string(ue_param_setting, OPC, &u->opc);
if (rc != 1) {
printf("Check SIM OPC section for UE%d. Exiting\n", user_id);
return false;
}
rc = config_setting_lookup_string(ue_param_setting, MSISDN, &u->msisdn);
if (rc != 1) {
printf("Check SIM MSISDN section for UE%d. Exiting\n", user_id);
return false;
}
return true;
int rc = true;
config_setting_t *ue_param_setting = NULL;
ue_param_setting = config_setting_get_member(ue_setting, SIM);
if (ue_param_setting == NULL) {
printf("Check SIM section for UE%d. EXITING...\n", user_id);
return false;
}
rc = config_setting_lookup_string(ue_param_setting, MSIN, &u->msin);
if (rc != 1 || strlen(u->msin) > 10 || strlen(u->msin) < 9) {
printf("Check SIM MSIN section for UE%d. Exiting\n", user_id);
return false;
}
rc = config_setting_lookup_string(ue_param_setting, USIM_API_K, &u->usim_api_k);
if (rc != 1) {
printf("Check SIM USIM_API_K section for UE%d. Exiting\n", user_id);
return false;
}
rc = config_setting_lookup_string(ue_param_setting, OPC, &u->opc);
if (rc != 1) {
printf("Check SIM OPC section for UE%d. Exiting\n", user_id);
return false;
}
rc = config_setting_lookup_string(ue_param_setting, MSISDN, &u->msisdn);
if (rc != 1) {
printf("Check SIM MSISDN section for UE%d. Exiting\n", user_id);
return false;
}
return true;
}
void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
const user_plmns_t *user_plmns, const networks_t networks) {
int hplmn_index = get_plmn_index(u->hplmn, networks);
const plmn_conf_param_t *conf = &networks.items[hplmn_index].conf;
memset(usim_data, 0, sizeof(usim_data_t));
usim_data->imsi.length = 8;
usim_data->imsi.u.num.parity = get_msin_parity(u->msin,
conf->mcc,
conf->mnc);
int hplmn_index = get_plmn_index(u->hplmn, networks);
const plmn_conf_param_t *conf = &networks.items[hplmn_index].conf;
memset(usim_data, 0, sizeof(usim_data_t));
usim_data->imsi.length = 8;
usim_data->imsi.u.num.parity = get_msin_parity(u->msin, conf->mcc, conf->mnc);
usim_data->imsi.u.num.digit1 = conf->mcc[0];
usim_data->imsi.u.num.digit2 = conf->mcc[1];
usim_data->imsi.u.num.digit3 = conf->mcc[2];
usim_data->imsi.u.num.digit1 = conf->mcc[0];
usim_data->imsi.u.num.digit2 = conf->mcc[1];
usim_data->imsi.u.num.digit3 = conf->mcc[2];
usim_data->imsi.u.num.digit4 = conf->mnc[0];
usim_data->imsi.u.num.digit5 = conf->mnc[1];
usim_data->imsi.u.num.digit4 = conf->mnc[0];
usim_data->imsi.u.num.digit5 = conf->mnc[1];
if (strlen(conf->mnc) == 2) {
usim_data->imsi.u.num.digit6 = u->msin[0];
usim_data->imsi.u.num.digit7 = u->msin[1];
usim_data->imsi.u.num.digit8 = u->msin[2];
usim_data->imsi.u.num.digit9 = u->msin[3];
usim_data->imsi.u.num.digit10 = u->msin[4];
usim_data->imsi.u.num.digit11 = u->msin[5];
usim_data->imsi.u.num.digit12 = u->msin[6];
usim_data->imsi.u.num.digit13 = u->msin[7];
usim_data->imsi.u.num.digit14 = u->msin[8];
usim_data->imsi.u.num.digit15 = u->msin[9];
} else {
usim_data->imsi.u.num.digit6 = conf->mnc[2];
usim_data->imsi.u.num.digit7 = u->msin[0];
usim_data->imsi.u.num.digit8 = u->msin[1];
usim_data->imsi.u.num.digit9 = u->msin[2];
usim_data->imsi.u.num.digit10 = u->msin[3];
usim_data->imsi.u.num.digit11 = u->msin[4];
usim_data->imsi.u.num.digit12 = u->msin[5];
usim_data->imsi.u.num.digit13 = u->msin[6];
usim_data->imsi.u.num.digit14 = u->msin[7];
usim_data->imsi.u.num.digit15 = u->msin[8];
}
if (strlen(conf->mnc) == 2) {
usim_data->imsi.u.num.digit6 = u->msin[0];
usim_data->imsi.u.num.digit7 = u->msin[1];
usim_data->imsi.u.num.digit8 = u->msin[2];
usim_data->imsi.u.num.digit9 = u->msin[3];
usim_data->imsi.u.num.digit10 = u->msin[4];
usim_data->imsi.u.num.digit11 = u->msin[5];
usim_data->imsi.u.num.digit12 = u->msin[6];
usim_data->imsi.u.num.digit13 = u->msin[7];
usim_data->imsi.u.num.digit14 = u->msin[8];
usim_data->imsi.u.num.digit15 = u->msin[9];
} else {
usim_data->imsi.u.num.digit6 = conf->mnc[2];
usim_data->imsi.u.num.digit7 = u->msin[0];
usim_data->imsi.u.num.digit8 = u->msin[1];
usim_data->imsi.u.num.digit9 = u->msin[2];
usim_data->imsi.u.num.digit10 = u->msin[3];
usim_data->imsi.u.num.digit11 = u->msin[4];
usim_data->imsi.u.num.digit12 = u->msin[5];
usim_data->imsi.u.num.digit13 = u->msin[6];
usim_data->imsi.u.num.digit14 = u->msin[7];
usim_data->imsi.u.num.digit15 = u->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);
/*
* Higher Priority PLMN search period
*/
usim_data->hpplmn = 0x00; /* Disable timer */
/*
* 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);
/*
* Higher Priority PLMN search period
*/
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));
}
if (user_plmns->forbiddens.size > 0) {
for (int i = 0; i < user_plmns->forbiddens.size; i++) {
usim_data->fplmn[i] = networks.items[user_plmns->forbiddens.items[i]].plmn;
}
}
/*
* List of Forbidden PLMNs
*/
for (int i = 0; i < USIM_FPLMN_MAX; i++) {
memset(&usim_data->fplmn[i], 0xff, sizeof(plmn_t));
}
if (user_plmns->forbiddens.size > 0) {
for (int i = 0; i < user_plmns->forbiddens.size; i++) {
usim_data->fplmn[i] = networks.items[user_plmns->forbiddens.items[i]].plmn;
}
}
/*
* Location Information
*/
usim_data->loci.tmsi = DEFAULT_TMSI;
usim_data->loci.lai.plmn = networks.items[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 = networks.items[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(conf->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;
/*
* 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 */
int j = 0;
for (int i = 0; i < strlen(u->msisdn); i += 2) {
usim_data->msisdn.number.digit[j].msb = u->msisdn[i];
j++;
}
j = 0;
for (int i = 1; i < strlen(u->msisdn); i += 2) {
usim_data->msisdn.number.digit[j].lsb = u->msisdn[i];
j++;
/*
* Location Information
*/
usim_data->loci.tmsi = DEFAULT_TMSI;
usim_data->loci.lai.plmn = networks.items[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 = networks.items[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(conf->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;
/*
* 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 */
int j = 0;
for (int i = 0; i < strlen(u->msisdn); i += 2) {
usim_data->msisdn.number.digit[j].msb = u->msisdn[i];
j++;
}
j = 0;
for (int i = 1; i < strlen(u->msisdn); i += 2) {
usim_data->msisdn.number.digit[j].lsb = u->msisdn[i];
j++;
}
if (strlen(u->msisdn) % 2 == 0) {
for (int i = strlen(u->msisdn) / 2; i < 10; i++) {
usim_data->msisdn.number.digit[i].msb = 0xf;
usim_data->msisdn.number.digit[i].lsb = 0xf;
}
} else {
usim_data->msisdn.number.digit[strlen(u->msisdn) / 2].lsb = 0xf;
for (int i = (strlen(u->msisdn) / 2) + 1; i < 10; i++) {
usim_data->msisdn.number.digit[i].msb = 0xf;
usim_data->msisdn.number.digit[i].lsb = 0xf;
}
}
/*
* PLMN Network Name and Operator PLMN List
*/
for (int i = 0; i < user_plmns->operators.size; i++) {
network_record_t record = networks.items[user_plmns->operators.items[i]].record;
usim_pnn_t *pnn = usim_data->pnn + i;
pnn->fullname.type = USIM_PNN_FULLNAME_TAG;
pnn->fullname.length = min(sizeof(pnn->fullname.value) - 1, strlen(record.fullname));
memcpy(pnn->fullname.value, record.fullname + 1, pnn->fullname.length);
pnn->fullname.value[pnn->fullname.length] = 0;
pnn->shortname.type = USIM_PNN_SHORTNAME_TAG;
pnn->shortname.length = min(sizeof(pnn->shortname.value) - 1, strlen(record.shortname));
memcpy(pnn->shortname.value, record.shortname + 1, pnn->shortname.length);
pnn->shortname.value[pnn->shortname.length] = 0;
usim_data->opl[i] = (usim_opl_t){record.plmn, record.tac_start, record.tac_end, i};
}
if (user_plmns->operators.size < USIM_OPL_MAX) {
for (int i = user_plmns->operators.size; i < USIM_OPL_MAX; i++) {
memset(&usim_data->opl[i].plmn, 0xff, sizeof(plmn_t));
}
}
}
if (strlen(u->msisdn) % 2 == 0) {
for (int i = strlen(u->msisdn) / 2; i < 10; i++) {
usim_data->msisdn.number.digit[i].msb = 0xf;
usim_data->msisdn.number.digit[i].lsb = 0xf;
}
} else {
usim_data->msisdn.number.digit[strlen(u->msisdn) / 2].lsb = 0xf;
for (int i = (strlen(u->msisdn) / 2) + 1; i < 10; i++) {
usim_data->msisdn.number.digit[i].msb = 0xf;
usim_data->msisdn.number.digit[i].lsb = 0xf;
}
}
/*
* PLMN Network Name and Operator PLMN List
*/
for (int i = 0; i < user_plmns->operators.size; i++) {
network_record_t record = networks.items[user_plmns->operators.items[i]].record;
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 (user_plmns->operators.size < USIM_OPL_MAX) {
for (int i = user_plmns->operators.size; i < USIM_OPL_MAX; i++) {
memset(&usim_data->opl[i].plmn, 0xff, sizeof(plmn_t));
}
}
/*
* List of Equivalent HPLMNs
*/
for (int i = 0; i < user_plmns->equivalents_home.size; i++) {
usim_data->ehplmn[i] = networks.items[user_plmns->equivalents_home.items[i]].plmn;
}
if (user_plmns->equivalents_home.size < USIM_EHPLMN_MAX) {
for (int i = user_plmns->equivalents_home.size; i < USIM_EHPLMN_MAX; i++) {
memset(&usim_data->ehplmn[i], 0xff, sizeof(plmn_t));
}
}
/*
* Home PLMN Selector with Access Technology
*/
usim_data->hplmn.plmn = networks.items[hplmn_index].plmn;
usim_data->hplmn.AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
/*
* List of Equivalent HPLMNs
*/
for (int i = 0; i < user_plmns->equivalents_home.size; i++) {
usim_data->ehplmn[i] = networks.items[user_plmns->equivalents_home.items[i]].plmn;
}
if (user_plmns->equivalents_home.size < USIM_EHPLMN_MAX) {
for (int i = user_plmns->equivalents_home.size; i < USIM_EHPLMN_MAX; i++) {
memset(&usim_data->ehplmn[i], 0xff, sizeof(plmn_t));
}
}
/*
* Home PLMN Selector with Access Technology
*/
usim_data->hplmn.plmn = networks.items[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));
}
if (user_plmns->users_controlled.size > 0) {
for (int i = 0; i < user_plmns->users_controlled.size; i++) {
usim_data->plmn[i].plmn = networks.items[user_plmns->users_controlled.items[i]].plmn;
}
}
/*
* 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));
}
if (user_plmns->users_controlled.size > 0) {
for (int i = 0; i < user_plmns->users_controlled.size; i++) {
usim_data->plmn[i].plmn = networks.items[user_plmns->users_controlled.items[i]].plmn;
}
}
// List of operator controlled PLMN selector with Access Technology
// 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));
}
if (user_plmns->operators_controlled.size > 0) {
for (int i = 0; i < user_plmns->operators_controlled.size; i++) {
usim_data->oplmn[i].plmn = networks.items[user_plmns->operators_controlled.items[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 =
networks.items[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;
/*
* Non-Access Stratum configuration
*/
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;
for (int i = 0; i < USIM_OPLMN_MAX; i++) {
memset(&usim_data->oplmn[i], 0xff, sizeof(plmn_t));
}
if (user_plmns->operators_controlled.size > 0) {
for (int i = 0; i < user_plmns->operators_controlled.size; i++) {
usim_data->oplmn[i].plmn = networks.items[user_plmns->operators_controlled.items[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 = networks.items[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;
/*
* Non-Access Stratum configuration
*/
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;
#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_MINIMUM_PERIODIC_SEARCH_TIMER_TAG;
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_TIMER_T3245_BEHAVIOUR_TAG;
usim_data->nasconfig.Timer_T3245_Behaviour.length = 1;
usim_data->nasconfig.Timer_T3245_Behaviour.value[0] = 0x00;
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_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_TIMER_T3245_BEHAVIOUR_TAG;
usim_data->nasconfig.Timer_T3245_Behaviour.length = 1;
usim_data->nasconfig.Timer_T3245_Behaviour.value[0] = 0x00;
/* initialize the subscriber authentication security key */
if (hex_string_to_hex_value(usim_data->keys.usim_api_k,
u->usim_api_k, USIM_API_K_SIZE) == -1 ||
hex_string_to_hex_value(usim_data->keys.opc,
u->opc, OPC_SIZE) == -1) {
fprintf(stderr, "fix your configuration file\n");
exit(1);
}
/* initialize the subscriber authentication security key */
if (hex_string_to_hex_value(usim_data->keys.usim_api_k, u->usim_api_k, USIM_API_K_SIZE) == -1
|| hex_string_to_hex_value(usim_data->keys.opc, u->opc, OPC_SIZE) == -1) {
fprintf(stderr, "fix your configuration file\n");
exit(1);
}
}
bool 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;
int rc;
char *filename = make_filename(directory, USIM_API_NVRAM_FILENAME, user_id);
rc = usim_api_write(filename, usim_data);
free(filename);
return rc;
}
+2
View File
@@ -42,6 +42,7 @@ Description Implements the utility used to generate data stored in the
#include <stdbool.h>
#include <getopt.h>
#include "log.h"
#include "conf_parser.h"
#include "display.h"
@@ -104,6 +105,7 @@ int main (int argc, char * const argv[])
_display_usage(argv[0]);
exit(EXIT_SUCCESS);
}
logInit();
/* compute default data directory if no output_dir is given */
if ( output_dir == NULL ) {
+2
View File
@@ -42,6 +42,7 @@ Description Implements the utility used to generate data stored in the
#include <stdbool.h>
#include <getopt.h>
#include "log.h"
#include "conf_parser.h"
#include "display.h"
@@ -105,6 +106,7 @@ int main (int argc, char * const argv[])
exit(EXIT_SUCCESS);
}
logInit();
/* compute default data directory if no output_dir is given */
if ( output_dir == NULL ) {
output_dir = getenv(OUTPUT_DIR_ENV);