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:
@@ -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
@@ -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
@@ -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})
|
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Executable
+36
@@ -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})
|
||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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 ) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user