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/log/
cmake_targets/*/build/ cmake_targets/*/build/
cmake_targets/ran_build/ cmake_targets/ran_build/
cmake_targets/nas_sim_tools/build/
log/ log/
lte_build_oai/ lte_build_oai/
+1 -1
View File
@@ -172,7 +172,7 @@ else ()
endif() endif()
# add autotools definitions that were maybe used! # 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 # we need -rdynamic to incorporate all symbols in shared objects, see man page
set(commonOpts "-pipe -fPIC -Wall -fno-strict-aliasing -rdynamic") 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 set_openair_env
# Variables for UE data generation # 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 conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
HW="" HW=""
@@ -93,8 +92,6 @@ Options:
Makes the NR UE softmodem Makes the NR UE softmodem
--UE-conf-nvram [configuration file] --UE-conf-nvram [configuration file]
Specify conf_nvram_path (default \"$conf_nvram_path\") Specify conf_nvram_path (default \"$conf_nvram_path\")
--UE-gen-nvram [output path]
Specify gen_nvram_path (default \"$gen_nvram_path\")
-w | --hardware -w | --hardware
USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, AERIAL, None (Default) USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, AERIAL, None (Default)
Adds this RF board support (in external packages installation and in compilation) Adds this RF board support (in external packages installation and in compilation)
@@ -244,7 +241,7 @@ function main() {
shift;; shift;;
--UE) --UE)
UE=1 UE=1
TARGET_LIST="$TARGET_LIST lte-uesoftmodem" TARGET_LIST="$TARGET_LIST lte-uesoftmodem conf2uedata usim nvram"
echo_info "Will compile UE" echo_info "Will compile UE"
shift;; shift;;
--nrUE) --nrUE)
@@ -259,9 +256,6 @@ function main() {
--UE-conf-nvram) --UE-conf-nvram)
conf_nvram_path=$(readlink -f "$2") conf_nvram_path=$(readlink -f "$2")
shift 2;; shift 2;;
--UE-gen-nvram)
gen_nvram_path=$(readlink -f "$2")
shift 2;;
-w | --hardware) -w | --hardware)
case "$2" in case "$2" in
"USRP" | "BLADERF" | "LMSSDR" | "IRIS") "USRP" | "BLADERF" | "LMSSDR" | "IRIS")
@@ -513,18 +507,7 @@ function main() {
fi fi
if [ "$UE" = 1 ] ; then if [ "$UE" = 1 ] ; then
echo_info "Generate LTE USIM default sim content UE specific part"
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}"
# generate USIM data # generate USIM data
if [ -f conf2uedata ]; then if [ -f conf2uedata ]; then
install_nas_tools $conf_nvram_path $DIR/$BUILD_DIR/build "$DIR/$BUILD_DIR/build/conf2uedata.txt" 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 dir=$OPENAIR_DIR/cmake_targets
rm -rf $dir/ran_build $dir/ran_build_noLOG rm -rf $dir/ran_build $dir/ran_build_noLOG
rm -rf $dir/lte-simulators/build 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/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build 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 WORKDIR /opt/oai-lte-ue/bin
COPY --from=lte-ue-build \ COPY --from=lte-ue-build \
/oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \ /oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \
/oai-ran/cmake_targets/nas_sim_tools/build/conf2uedata \ /oai-ran/cmake_targets/ran_build/build/conf2uedata \
/oai-ran/cmake_targets/nas_sim_tools/build/nvram \ /oai-ran/cmake_targets/ran_build/build/nvram \
/oai-ran/cmake_targets/nas_sim_tools/build/usim \ /oai-ran/cmake_targets/ran_build/build/usim \
./ ./
COPY ./docker/scripts/lte_ue_entrypoint.sh ./entrypoint.sh 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 WORKDIR /opt/oai-lte-ue/bin
COPY --from=lte-ue-build \ COPY --from=lte-ue-build \
/oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \ /oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \
/oai-ran/cmake_targets/nas_sim_tools/build/conf2uedata \ /oai-ran/cmake_targets/ran_build/build/conf2uedata \
/oai-ran/cmake_targets/nas_sim_tools/build/nvram \ /oai-ran/cmake_targets/ran_build/build/nvram \
/oai-ran/cmake_targets/nas_sim_tools/build/usim \ /oai-ran/cmake_targets/ran_build/build/usim \
./ ./
COPY ./docker/scripts/lte_ue_entrypoint.sh ./entrypoint.sh 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 WORKDIR /opt/oai-lte-ue/bin
COPY --from=lte-ue-build \ COPY --from=lte-ue-build \
/oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \ /oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \
/oai-ran/cmake_targets/nas_sim_tools/build/conf2uedata \ /oai-ran/cmake_targets/ran_build/build/conf2uedata \
/oai-ran/cmake_targets/nas_sim_tools/build/nvram \ /oai-ran/cmake_targets/ran_build/build/nvram \
/oai-ran/cmake_targets/nas_sim_tools/build/usim \ /oai-ran/cmake_targets/ran_build/build/usim \
./ ./
COPY ./docker/scripts/lte_ue_entrypoint.sh ./entrypoint.sh COPY ./docker/scripts/lte_ue_entrypoint.sh ./entrypoint.sh
-2
View File
@@ -46,8 +46,6 @@
#include <openair2/RRC/LTE/rrc_proto.h> #include <openair2/RRC/LTE/rrc_proto.h>
#include "executables/softmodem-common.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 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", LOG_D(MAC, "[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n",
module_idP, frameP, eNB_index); module_idP, frameP, eNB_index);
+6 -2
View File
@@ -2892,9 +2892,13 @@ int decode_BCCH_DLSCH_Message(
if ((ctxt_pP->frame % 2) == 0) { if ((ctxt_pP->frame % 2) == 0) {
// even frame // even frame
if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&1) == 0) { 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]; LTE_SystemInformationBlockType1_t *sib1 = UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index];
memcpy( (void *)sib1, memcpy( sib1,
(void *)&bcch_message->message.choice.c1.choice.systemInformationBlockType1, &bcch_message->message.choice.c1.choice.systemInformationBlockType1,
sizeof(LTE_SystemInformationBlockType1_t) ); sizeof(LTE_SystemInformationBlockType1_t) );
LOG_D( RRC, "[UE %"PRIu8"] Decoding First SIB1\n", ctxt_pP->module_id ); LOG_D( RRC, "[UE %"PRIu8"] Decoding First SIB1\n", ctxt_pP->module_id );
decode_SIB1( ctxt_pP, eNB_index, rsrq, rsrp ); decode_SIB1( ctxt_pP, eNB_index, rsrq, rsrp );
+1
View File
@@ -1,3 +1,4 @@
add_subdirectory(COMMON) add_subdirectory(COMMON)
add_subdirectory(NR_UE) add_subdirectory(NR_UE)
add_subdirectory(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__) #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#ifdef LOG_E #ifdef LOG_E
# define LOG_TRACE(s, x, args...) \ # define LOG_TRACE(s, x, args...) \
do { \ do { \
switch (s) { \ switch (s) { \
@@ -111,9 +112,6 @@ do { \
# define LOG_FUNC_IN LOG_ENTER(NAS) # define LOG_FUNC_IN LOG_ENTER(NAS)
# define LOG_FUNC_OUT LOG_END(NAS) # define LOG_FUNC_OUT LOG_END(NAS)
# define LOG_FUNC_RETURN(rETURNcODE) LOG_RETURN(NAS,rETURNcODE) # define LOG_FUNC_RETURN(rETURNcODE) LOG_RETURN(NAS,rETURNcODE)
extern int nas_log_func_indent;
#else #else
# define LOG_TRACE(s, x, args...) # define LOG_TRACE(s, x, args...)
# define LOG_DUMP(dATA, lEN) LOG_DUMPMSG(NAS, LOG_DUMP_CHAR,dATA, lEN, " Dump %d:\n", lEN) # 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 <string.h> // memset, strncpy
#include <getopt.h> #include <getopt.h>
#include "log.h"
#include "conf2uedata.h" #include "conf2uedata.h"
#include "display.h" #include "display.h"
#include "conf_parser.h" #include "conf_parser.h"
@@ -42,6 +43,7 @@ int main(int argc, char**argv) {
exit(1); exit(1);
} }
logInit();
if ( parse_config_file(output_dir, conf_file, OUTPUT_ALL) == false ) { if ( parse_config_file(output_dir, conf_file, OUTPUT_ALL) == false ) {
exit(1); exit(1);
} }
+257 -274
View File
@@ -8,301 +8,284 @@
#include "conf_usim.h" #include "conf_usim.h"
bool parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u) { bool parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u) {
int rc = true; int rc = true;
config_setting_t *ue_param_setting = NULL; config_setting_t *ue_param_setting = NULL;
ue_param_setting = config_setting_get_member(ue_setting, SIM); ue_param_setting = config_setting_get_member(ue_setting, SIM);
if (ue_param_setting == NULL) { if (ue_param_setting == NULL) {
printf("Check SIM section for UE%d. EXITING...\n", user_id); printf("Check SIM section for UE%d. EXITING...\n", user_id);
return false; return false;
} }
rc = config_setting_lookup_string(ue_param_setting, MSIN, &u->msin); rc = config_setting_lookup_string(ue_param_setting, MSIN, &u->msin);
if (rc != 1 || strlen(u->msin) > 10 || strlen(u->msin) < 9) { if (rc != 1 || strlen(u->msin) > 10 || strlen(u->msin) < 9) {
printf("Check SIM MSIN section for UE%d. Exiting\n", user_id); printf("Check SIM MSIN section for UE%d. Exiting\n", user_id);
return false; return false;
} }
rc = config_setting_lookup_string(ue_param_setting, USIM_API_K, rc = config_setting_lookup_string(ue_param_setting, USIM_API_K, &u->usim_api_k);
&u->usim_api_k); if (rc != 1) {
if (rc != 1) { printf("Check SIM USIM_API_K section for UE%d. Exiting\n", user_id);
printf("Check SIM USIM_API_K section for UE%d. Exiting\n", user_id); return false;
return false; }
} rc = config_setting_lookup_string(ue_param_setting, OPC, &u->opc);
rc = config_setting_lookup_string(ue_param_setting, OPC, &u->opc); if (rc != 1) {
if (rc != 1) { printf("Check SIM OPC section for UE%d. Exiting\n", user_id);
printf("Check SIM OPC section for UE%d. Exiting\n", user_id); return false;
return false; }
} rc = config_setting_lookup_string(ue_param_setting, MSISDN, &u->msisdn);
rc = config_setting_lookup_string(ue_param_setting, MSISDN, &u->msisdn); if (rc != 1) {
if (rc != 1) { printf("Check SIM MSISDN section for UE%d. Exiting\n", user_id);
printf("Check SIM MSISDN section for UE%d. Exiting\n", user_id); return false;
return false; }
} return true;
return true;
} }
void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data, void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
const user_plmns_t *user_plmns, const networks_t networks) { const user_plmns_t *user_plmns, const networks_t networks) {
int hplmn_index = get_plmn_index(u->hplmn, networks); int hplmn_index = get_plmn_index(u->hplmn, networks);
const plmn_conf_param_t *conf = &networks.items[hplmn_index].conf; const plmn_conf_param_t *conf = &networks.items[hplmn_index].conf;
memset(usim_data, 0, sizeof(usim_data_t)); memset(usim_data, 0, sizeof(usim_data_t));
usim_data->imsi.length = 8; usim_data->imsi.length = 8;
usim_data->imsi.u.num.parity = get_msin_parity(u->msin, usim_data->imsi.u.num.parity = get_msin_parity(u->msin, conf->mcc, conf->mnc);
conf->mcc,
conf->mnc);
usim_data->imsi.u.num.digit1 = conf->mcc[0]; usim_data->imsi.u.num.digit1 = conf->mcc[0];
usim_data->imsi.u.num.digit2 = conf->mcc[1]; usim_data->imsi.u.num.digit2 = conf->mcc[1];
usim_data->imsi.u.num.digit3 = conf->mcc[2]; usim_data->imsi.u.num.digit3 = conf->mcc[2];
usim_data->imsi.u.num.digit4 = conf->mnc[0]; usim_data->imsi.u.num.digit4 = conf->mnc[0];
usim_data->imsi.u.num.digit5 = conf->mnc[1]; usim_data->imsi.u.num.digit5 = conf->mnc[1];
if (strlen(conf->mnc) == 2) { if (strlen(conf->mnc) == 2) {
usim_data->imsi.u.num.digit6 = u->msin[0]; usim_data->imsi.u.num.digit6 = u->msin[0];
usim_data->imsi.u.num.digit7 = u->msin[1]; usim_data->imsi.u.num.digit7 = u->msin[1];
usim_data->imsi.u.num.digit8 = u->msin[2]; usim_data->imsi.u.num.digit8 = u->msin[2];
usim_data->imsi.u.num.digit9 = u->msin[3]; usim_data->imsi.u.num.digit9 = u->msin[3];
usim_data->imsi.u.num.digit10 = u->msin[4]; usim_data->imsi.u.num.digit10 = u->msin[4];
usim_data->imsi.u.num.digit11 = u->msin[5]; usim_data->imsi.u.num.digit11 = u->msin[5];
usim_data->imsi.u.num.digit12 = u->msin[6]; usim_data->imsi.u.num.digit12 = u->msin[6];
usim_data->imsi.u.num.digit13 = u->msin[7]; usim_data->imsi.u.num.digit13 = u->msin[7];
usim_data->imsi.u.num.digit14 = u->msin[8]; usim_data->imsi.u.num.digit14 = u->msin[8];
usim_data->imsi.u.num.digit15 = u->msin[9]; usim_data->imsi.u.num.digit15 = u->msin[9];
} else { } else {
usim_data->imsi.u.num.digit6 = conf->mnc[2]; usim_data->imsi.u.num.digit6 = conf->mnc[2];
usim_data->imsi.u.num.digit7 = u->msin[0]; usim_data->imsi.u.num.digit7 = u->msin[0];
usim_data->imsi.u.num.digit8 = u->msin[1]; usim_data->imsi.u.num.digit8 = u->msin[1];
usim_data->imsi.u.num.digit9 = u->msin[2]; usim_data->imsi.u.num.digit9 = u->msin[2];
usim_data->imsi.u.num.digit10 = u->msin[3]; usim_data->imsi.u.num.digit10 = u->msin[3];
usim_data->imsi.u.num.digit11 = u->msin[4]; usim_data->imsi.u.num.digit11 = u->msin[4];
usim_data->imsi.u.num.digit12 = u->msin[5]; usim_data->imsi.u.num.digit12 = u->msin[5];
usim_data->imsi.u.num.digit13 = u->msin[6]; usim_data->imsi.u.num.digit13 = u->msin[6];
usim_data->imsi.u.num.digit14 = u->msin[7]; usim_data->imsi.u.num.digit14 = u->msin[7];
usim_data->imsi.u.num.digit15 = u->msin[8]; usim_data->imsi.u.num.digit15 = u->msin[8];
} }
/* /*
* Ciphering and Integrity Keys * Ciphering and Integrity Keys
*/ */
usim_data->keys.ksi = KSI; usim_data->keys.ksi = KSI;
memset(&usim_data->keys.ck, 0, USIM_CK_SIZE); memset(&usim_data->keys.ck, 0, USIM_CK_SIZE);
memset(&usim_data->keys.ik, 0, USIM_IK_SIZE); memset(&usim_data->keys.ik, 0, USIM_IK_SIZE);
/* /*
* Higher Priority PLMN search period * Higher Priority PLMN search period
*/ */
usim_data->hpplmn = 0x00; /* Disable timer */ usim_data->hpplmn = 0x00; /* Disable timer */
/* /*
* List of Forbidden PLMNs * List of Forbidden PLMNs
*/ */
for (int i = 0; i < USIM_FPLMN_MAX; i++) { 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 (user_plmns->forbiddens.size > 0) { if (user_plmns->forbiddens.size > 0) {
for (int i = 0; i < user_plmns->forbiddens.size; i++) { for (int i = 0; i < user_plmns->forbiddens.size; i++) {
usim_data->fplmn[i] = networks.items[user_plmns->forbiddens.items[i]].plmn; usim_data->fplmn[i] = networks.items[user_plmns->forbiddens.items[i]].plmn;
} }
} }
/* /*
* Location Information * Location Information
*/ */
usim_data->loci.tmsi = DEFAULT_TMSI; usim_data->loci.tmsi = DEFAULT_TMSI;
usim_data->loci.lai.plmn = networks.items[hplmn_index].plmn; usim_data->loci.lai.plmn = networks.items[hplmn_index].plmn;
usim_data->loci.lai.lac = DEFAULT_LAC; usim_data->loci.lai.lac = DEFAULT_LAC;
usim_data->loci.status = USIM_LOCI_NOT_UPDATED; usim_data->loci.status = USIM_LOCI_NOT_UPDATED;
/* /*
* Packet Switched Location Information * Packet Switched Location Information
*/ */
usim_data->psloci.p_tmsi = DEFAULT_P_TMSI; usim_data->psloci.p_tmsi = DEFAULT_P_TMSI;
usim_data->psloci.signature[0] = 0x01; usim_data->psloci.signature[0] = 0x01;
usim_data->psloci.signature[1] = 0x02; usim_data->psloci.signature[1] = 0x02;
usim_data->psloci.signature[2] = 0x03; usim_data->psloci.signature[2] = 0x03;
usim_data->psloci.rai.plmn = networks.items[hplmn_index].plmn; usim_data->psloci.rai.plmn = networks.items[hplmn_index].plmn;
usim_data->psloci.rai.lac = DEFAULT_LAC; usim_data->psloci.rai.lac = DEFAULT_LAC;
usim_data->psloci.rai.rac = DEFAULT_RAC; usim_data->psloci.rai.rac = DEFAULT_RAC;
usim_data->psloci.status = USIM_PSLOCI_NOT_UPDATED; usim_data->psloci.status = USIM_PSLOCI_NOT_UPDATED;
/* /*
* Administrative Data * Administrative Data
*/ */
usim_data->ad.UE_Operation_Mode = USIM_NORMAL_MODE; usim_data->ad.UE_Operation_Mode = USIM_NORMAL_MODE;
usim_data->ad.Additional_Info = 0xffff; usim_data->ad.Additional_Info = 0xffff;
usim_data->ad.MNC_Length = strlen(conf->mnc); usim_data->ad.MNC_Length = strlen(conf->mnc);
/* /*
* EPS NAS security context * EPS NAS security context
*/ */
usim_data->securityctx.length = 52; usim_data->securityctx.length = 52;
usim_data->securityctx.KSIasme.type = USIM_KSI_ASME_TAG; usim_data->securityctx.KSIasme.type = USIM_KSI_ASME_TAG;
usim_data->securityctx.KSIasme.length = 1; usim_data->securityctx.KSIasme.length = 1;
usim_data->securityctx.KSIasme.value[0] = KSI_ASME; usim_data->securityctx.KSIasme.value[0] = KSI_ASME;
usim_data->securityctx.Kasme.type = USIM_K_ASME_TAG; usim_data->securityctx.Kasme.type = USIM_K_ASME_TAG;
usim_data->securityctx.Kasme.length = USIM_K_ASME_SIZE; usim_data->securityctx.Kasme.length = USIM_K_ASME_SIZE;
memset(usim_data->securityctx.Kasme.value, 0, memset(usim_data->securityctx.Kasme.value, 0, usim_data->securityctx.Kasme.length);
usim_data->securityctx.Kasme.length); usim_data->securityctx.ulNAScount.type = USIM_UL_NAS_COUNT_TAG;
usim_data->securityctx.ulNAScount.type = USIM_UL_NAS_COUNT_TAG; usim_data->securityctx.ulNAScount.length = USIM_UL_NAS_COUNT_SIZE;
usim_data->securityctx.ulNAScount.length = USIM_UL_NAS_COUNT_SIZE; memset(usim_data->securityctx.ulNAScount.value, 0, usim_data->securityctx.ulNAScount.length);
memset(usim_data->securityctx.ulNAScount.value, 0, usim_data->securityctx.dlNAScount.type = USIM_DL_NAS_COUNT_TAG;
usim_data->securityctx.ulNAScount.length); usim_data->securityctx.dlNAScount.length = USIM_DL_NAS_COUNT_SIZE;
usim_data->securityctx.dlNAScount.type = USIM_DL_NAS_COUNT_TAG; memset(usim_data->securityctx.dlNAScount.value, 0, usim_data->securityctx.dlNAScount.length);
usim_data->securityctx.dlNAScount.length = USIM_DL_NAS_COUNT_SIZE; usim_data->securityctx.algorithmID.type = USIM_INT_ENC_ALGORITHMS_TAG;
memset(usim_data->securityctx.dlNAScount.value, 0, usim_data->securityctx.algorithmID.length = 1;
usim_data->securityctx.dlNAScount.length); usim_data->securityctx.algorithmID.value[0] = SECURITY_ALGORITHMS;
usim_data->securityctx.algorithmID.type = USIM_INT_ENC_ALGORITHMS_TAG; /*
usim_data->securityctx.algorithmID.length = 1; * Subcriber's Number
usim_data->securityctx.algorithmID.value[0] = SECURITY_ALGORITHMS; */
/* usim_data->msisdn.length = 7;
* Subcriber's Number usim_data->msisdn.number.ext = 1;
*/ usim_data->msisdn.number.ton = MSISDN_TON_UNKNOWKN;
usim_data->msisdn.length = 7; usim_data->msisdn.number.npi = MSISDN_NPI_ISDN_TELEPHONY;
usim_data->msisdn.number.ext = 1; usim_data->msisdn.conf1_record_id = 0xff; /* Not used */
usim_data->msisdn.number.ton = MSISDN_TON_UNKNOWKN; usim_data->msisdn.ext1_record_id = 0xff; /* Not used */
usim_data->msisdn.number.npi = MSISDN_NPI_ISDN_TELEPHONY; int j = 0;
usim_data->msisdn.conf1_record_id = 0xff; /* Not used */ for (int i = 0; i < strlen(u->msisdn); i += 2) {
usim_data->msisdn.ext1_record_id = 0xff; /* Not used */ usim_data->msisdn.number.digit[j].msb = u->msisdn[i];
int j = 0; j++;
for (int i = 0; i < strlen(u->msisdn); i += 2) { }
usim_data->msisdn.number.digit[j].msb = u->msisdn[i]; j = 0;
j++; for (int i = 1; i < strlen(u->msisdn); i += 2) {
} usim_data->msisdn.number.digit[j].lsb = u->msisdn[i];
j = 0; j++;
for (int i = 1; i < strlen(u->msisdn); i += 2) { }
usim_data->msisdn.number.digit[j].lsb = u->msisdn[i]; if (strlen(u->msisdn) % 2 == 0) {
j++; 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) { * List of Equivalent HPLMNs
for (int i = strlen(u->msisdn) / 2; i < 10; i++) { */
usim_data->msisdn.number.digit[i].msb = 0xf; for (int i = 0; i < user_plmns->equivalents_home.size; i++) {
usim_data->msisdn.number.digit[i].lsb = 0xf; usim_data->ehplmn[i] = networks.items[user_plmns->equivalents_home.items[i]].plmn;
} }
} else { if (user_plmns->equivalents_home.size < USIM_EHPLMN_MAX) {
usim_data->msisdn.number.digit[strlen(u->msisdn) / 2].lsb = 0xf; for (int i = user_plmns->equivalents_home.size; i < USIM_EHPLMN_MAX; i++) {
for (int i = (strlen(u->msisdn) / 2) + 1; i < 10; i++) { memset(&usim_data->ehplmn[i], 0xff, sizeof(plmn_t));
usim_data->msisdn.number.digit[i].msb = 0xf; }
usim_data->msisdn.number.digit[i].lsb = 0xf; }
} /*
} * Home PLMN Selector with Access Technology
/* */
* PLMN Network Name and Operator PLMN List usim_data->hplmn.plmn = networks.items[hplmn_index].plmn;
*/ usim_data->hplmn.AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
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 * List of user controlled PLMN selector with Access Technology
*/ */
for (int i = 0; i < user_plmns->equivalents_home.size; i++) { for (int i = 0; i < USIM_PLMN_MAX; i++) {
usim_data->ehplmn[i] = networks.items[user_plmns->equivalents_home.items[i]].plmn; memset(&usim_data->plmn[i], 0xff, sizeof(plmn_t));
} }
if (user_plmns->equivalents_home.size < USIM_EHPLMN_MAX) { if (user_plmns->users_controlled.size > 0) {
for (int i = user_plmns->equivalents_home.size; i < USIM_EHPLMN_MAX; i++) { for (int i = 0; i < user_plmns->users_controlled.size; i++) {
memset(&usim_data->ehplmn[i], 0xff, sizeof(plmn_t)); usim_data->plmn[i].plmn = networks.items[user_plmns->users_controlled.items[i]].plmn;
} }
} }
/*
* 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 operator controlled PLMN selector with Access Technology
* 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 for (int i = 0; i < USIM_OPLMN_MAX; i++) {
memset(&usim_data->oplmn[i], 0xff, sizeof(plmn_t));
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++) {
if (user_plmns->operators_controlled.size > 0) { usim_data->oplmn[i].plmn = networks.items[user_plmns->operators_controlled.items[i]].plmn;
for (int i = 0; i < user_plmns->operators_controlled.size; i++) { usim_data->oplmn[i].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
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;
* EPS Location Information usim_data->epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID;
*/ usim_data->epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE;
usim_data->epsloci.guti.gummei.plmn = usim_data->epsloci.guti.m_tmsi = DEFAULT_M_TMSI;
networks.items[hplmn_index].plmn; usim_data->epsloci.tai.plmn = usim_data->epsloci.guti.gummei.plmn;
usim_data->epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID; usim_data->epsloci.tai.tac = DEFAULT_TAC;
usim_data->epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE; usim_data->epsloci.status = USIM_EPSLOCI_UPDATED;
usim_data->epsloci.guti.m_tmsi = DEFAULT_M_TMSI; /*
usim_data->epsloci.tai.plmn = usim_data->epsloci.guti.gummei.plmn; * Non-Access Stratum configuration
usim_data->epsloci.tai.tac = DEFAULT_TAC; */
usim_data->epsloci.status = USIM_EPSLOCI_UPDATED; usim_data->nasconfig.NAS_SignallingPriority.type = USIM_NAS_SIGNALLING_PRIORITY_TAG;
/* usim_data->nasconfig.NAS_SignallingPriority.length = 1;
* Non-Access Stratum configuration usim_data->nasconfig.NAS_SignallingPriority.value[0] = 0x00;
*/ usim_data->nasconfig.NMO_I_Behaviour.type = USIM_NMO_I_BEHAVIOUR_TAG;
usim_data->nasconfig.NAS_SignallingPriority.type = usim_data->nasconfig.NMO_I_Behaviour.length = 1;
USIM_NAS_SIGNALLING_PRIORITY_TAG; usim_data->nasconfig.NMO_I_Behaviour.value[0] = 0x00;
usim_data->nasconfig.NAS_SignallingPriority.length = 1; usim_data->nasconfig.AttachWithImsi.type = USIM_ATTACH_WITH_IMSI_TAG;
usim_data->nasconfig.NAS_SignallingPriority.value[0] = 0x00; usim_data->nasconfig.AttachWithImsi.length = 1;
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) #if defined(START_WITH_GUTI)
usim_data->nasconfig.AttachWithImsi.value[0] = 0x00; usim_data->nasconfig.AttachWithImsi.value[0] = 0x00;
#else #else
usim_data->nasconfig.AttachWithImsi.value[0] = 0x01; usim_data->nasconfig.AttachWithImsi.value[0] = 0x01;
#endif #endif
usim_data->nasconfig.MinimumPeriodicSearchTimer.type = usim_data->nasconfig.MinimumPeriodicSearchTimer.type = USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG;
USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG; usim_data->nasconfig.MinimumPeriodicSearchTimer.length = 1;
usim_data->nasconfig.MinimumPeriodicSearchTimer.length = 1; usim_data->nasconfig.MinimumPeriodicSearchTimer.value[0] = 0x00;
usim_data->nasconfig.MinimumPeriodicSearchTimer.value[0] = 0x00; usim_data->nasconfig.ExtendedAccessBarring.type = USIM_EXTENDED_ACCESS_BARRING_TAG;
usim_data->nasconfig.ExtendedAccessBarring.type = usim_data->nasconfig.ExtendedAccessBarring.length = 1;
USIM_EXTENDED_ACCESS_BARRING_TAG; usim_data->nasconfig.ExtendedAccessBarring.value[0] = 0x00;
usim_data->nasconfig.ExtendedAccessBarring.length = 1; usim_data->nasconfig.Timer_T3245_Behaviour.type = USIM_TIMER_T3245_BEHAVIOUR_TAG;
usim_data->nasconfig.ExtendedAccessBarring.value[0] = 0x00; usim_data->nasconfig.Timer_T3245_Behaviour.length = 1;
usim_data->nasconfig.Timer_T3245_Behaviour.type = usim_data->nasconfig.Timer_T3245_Behaviour.value[0] = 0x00;
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 */ /* initialize the subscriber authentication security key */
if (hex_string_to_hex_value(usim_data->keys.usim_api_k, if (hex_string_to_hex_value(usim_data->keys.usim_api_k, u->usim_api_k, USIM_API_K_SIZE) == -1
u->usim_api_k, USIM_API_K_SIZE) == -1 || || hex_string_to_hex_value(usim_data->keys.opc, u->opc, OPC_SIZE) == -1) {
hex_string_to_hex_value(usim_data->keys.opc, fprintf(stderr, "fix your configuration file\n");
u->opc, OPC_SIZE) == -1) { exit(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){ bool write_usim_data(const char *directory, int user_id, usim_data_t *usim_data){
int rc; int rc;
char *filename = make_filename(directory, USIM_API_NVRAM_FILENAME, user_id); char *filename = make_filename(directory, USIM_API_NVRAM_FILENAME, user_id);
rc = usim_api_write(filename, usim_data); rc = usim_api_write(filename, usim_data);
free(filename); free(filename);
return rc; return rc;
} }
+2
View File
@@ -42,6 +42,7 @@ Description Implements the utility used to generate data stored in the
#include <stdbool.h> #include <stdbool.h>
#include <getopt.h> #include <getopt.h>
#include "log.h"
#include "conf_parser.h" #include "conf_parser.h"
#include "display.h" #include "display.h"
@@ -104,6 +105,7 @@ int main (int argc, char * const argv[])
_display_usage(argv[0]); _display_usage(argv[0]);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
logInit();
/* compute default data directory if no output_dir is given */ /* compute default data directory if no output_dir is given */
if ( output_dir == NULL ) { 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 <stdbool.h>
#include <getopt.h> #include <getopt.h>
#include "log.h"
#include "conf_parser.h" #include "conf_parser.h"
#include "display.h" #include "display.h"
@@ -105,6 +106,7 @@ int main (int argc, char * const argv[])
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
logInit();
/* compute default data directory if no output_dir is given */ /* compute default data directory if no output_dir is given */
if ( output_dir == NULL ) { if ( output_dir == NULL ) {
output_dir = getenv(OUTPUT_DIR_ENV); output_dir = getenv(OUTPUT_DIR_ENV);