Merge remote-tracking branch 'origin/develop_integration_2018_w10' into develop
Summary of changes:
- bug fix in the FlexRAN API (correct a check)
- bug fix for sending the right RNTI in a FlexRAN message
- fixes small bug in ulsim which kills one RX antenna in channel simulation.
Another simple but bad bug in ulsch_demodulation.c (bad access of avgU
array). This probably resulted in a performance degradation for non-ideal
channels, even for 1 antenna. The avgU was read in position 1 instead of
0 for 1-antenna and in positions 1 and 2 instead of 0 and 1 for 2-antennas.
- work from Nokia:
1) shared library loader, with integration for oai devices, encoder and telnet server
2) telnet server (use build-oai --build-telnetsrv option and --telnetsrv softmodem option)
3) UE/eNB in different executables (lte-uesoftmodem and lte-softmodem + noS1 variants)
4) config module fixes and extensions
5) very preliminary NB-IoT integration preparation, using shared lib loader ( use make NB-IoT to build, after building the eNB softmodem)
6) Rename NB-IoT configuration sources from nbiot_ to NB-IoT_ to be consistent with other NB-IoT developments.
- various bugs fixed:
- try to avoid "buffer full" problem when pushing DL traffic
- add a stop_rf function in the RU
- cleanup - remove unnecessary calls to get_cpu_freq_GHz
(was disrupting realtime at startup, generating lots of UU and LL)
- cleanup MAC PDU generation
Compilation with Rel10 is not functional anymore.
Compilation of unitary simulator is not functional anymore.
This commit is contained in:
+113
-18
@@ -314,7 +314,8 @@ file(GLOB rrc_h ${RRC_FULL_DIR}/*.h)
|
||||
set(rrc_h ${rrc_h} ${RRC_FULL_DIR}/asn1_constants.h)
|
||||
set_source_files_properties(${rrc_source} PROPERTIES COMPILE_FLAGS -w) # suppress warnings from generated code
|
||||
add_library(RRC_LIB ${rrc_h} ${rrc_source}
|
||||
${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1_msg.c)
|
||||
${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1_msg.c
|
||||
${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1_msg_NB_IoT.c)
|
||||
include_directories ("${RRC_FULL_DIR}")
|
||||
|
||||
# add the command to generate the source code
|
||||
@@ -1042,6 +1043,19 @@ include_directories(${NFAPI_USER_DIR})
|
||||
|
||||
# Layer 1
|
||||
#############################
|
||||
set(PHY_TURBOSRC
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder.c
|
||||
)
|
||||
set(PHY_TURBOIF
|
||||
${OPENAIR1_DIR}/PHY/CODING/coding_load.c
|
||||
)
|
||||
|
||||
add_library(coding MODULE ${PHY_TURBOSRC} )
|
||||
set(PHY_SRC
|
||||
# depend on code generation from asn1c
|
||||
${RRC_FULL_DIR}/asn1_constants.h
|
||||
@@ -1109,11 +1123,8 @@ set(PHY_SRC
|
||||
${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/crc_byte.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
|
||||
${PHY_TURBOIF}
|
||||
${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/viterbi.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
|
||||
@@ -1206,9 +1217,7 @@ set(PHY_SRC_UE
|
||||
${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/crc_byte.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
|
||||
${PHY_TURBOIF}
|
||||
${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/viterbi.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
|
||||
@@ -1373,6 +1382,7 @@ set (MAC_SRC_UE
|
||||
set (ENB_APP_SRC
|
||||
${OPENAIR2_DIR}/ENB_APP/enb_app.c
|
||||
${OPENAIR2_DIR}/ENB_APP/enb_config.c
|
||||
${OPENAIR2_DIR}/ENB_APP/RRC_config_tools.c
|
||||
)
|
||||
|
||||
add_library(L2
|
||||
@@ -1708,6 +1718,17 @@ if(NAS_UE)
|
||||
endif()
|
||||
|
||||
|
||||
# nbiot
|
||||
add_definitions("-DNUMBER_OF_UE_MAX_NB_IoT=16")
|
||||
set (NBIOT_SOURCES
|
||||
${OPENAIR2_DIR}/ENB_APP/NB_IoT_config.c
|
||||
)
|
||||
add_library(NB_IoT MODULE ${NBIOT_SOURCES} )
|
||||
|
||||
# shared library loader
|
||||
set (SHLIB_LOADER_SOURCES
|
||||
${OPENAIR_DIR}/common/utils/load_module_shlib.c
|
||||
)
|
||||
|
||||
# Make lfds as a own source code (even if it is a outside library)
|
||||
# For better intergration with compilation flags & structure of cmake
|
||||
@@ -1780,6 +1801,7 @@ include_directories("${NFAPI_DIR}/nfapi/inc")
|
||||
include_directories("${NFAPI_DIR}/sim_common/inc")
|
||||
include_directories("${NFAPI_DIR}/pnf_sim/inc")
|
||||
|
||||
|
||||
# System packages that are required
|
||||
# We use either the cmake buildin, in ubuntu are in: /usr/share/cmake*/Modules/
|
||||
# or cmake provide a generic interface to pkg-config that widely used
|
||||
@@ -1935,14 +1957,13 @@ add_executable(lte-softmodem
|
||||
${s1ap_h}
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
|
||||
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
|
||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||
${OPENAIR_TARGETS}/SIMU/USER/init_lte.c
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||
@@ -1958,9 +1979,9 @@ add_executable(lte-softmodem
|
||||
|
||||
target_link_libraries (lte-softmodem
|
||||
-Wl,--start-group
|
||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB
|
||||
NFAPI_USER_LIB
|
||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2
|
||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
|
||||
@@ -1975,14 +1996,13 @@ add_executable(lte-softmodem-nos1
|
||||
${s1ap_h}
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
|
||||
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
|
||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||
${OPENAIR_TARGETS}/SIMU/USER/init_lte.c
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||
@@ -1996,9 +2016,9 @@ add_executable(lte-softmodem-nos1
|
||||
)
|
||||
target_link_libraries (lte-softmodem-nos1
|
||||
-Wl,--start-group
|
||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB
|
||||
NFAPI_USER_LIB
|
||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB}
|
||||
${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||
-Wl,--end-group z dl )
|
||||
|
||||
target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES})
|
||||
@@ -2006,6 +2026,76 @@ target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt
|
||||
target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem-nos1 ${T_LIB})
|
||||
|
||||
# lte-uesoftmodem is UE implementation
|
||||
#######################################
|
||||
|
||||
add_executable(lte-uesoftmodem
|
||||
${rrc_h}
|
||||
${s1ap_h}
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||
${OPENAIR_TARGETS}/SIMU/USER/init_lte.c
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||
${OPENAIR_DIR}/common/utils/utils.c
|
||||
${OPENAIR_DIR}/common/utils/system.c
|
||||
${XFORMS_SOURCE}
|
||||
${XFORMS_SOURCE_SOFTMODEM}
|
||||
${T_SOURCE}
|
||||
${CONFIG_SOURCES}
|
||||
${SHLIB_LOADER_SOURCES}
|
||||
)
|
||||
|
||||
target_link_libraries (lte-uesoftmodem
|
||||
-Wl,--start-group
|
||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_UE_LIB PHY_UE LFDS L2_UE
|
||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
target_link_libraries (lte-uesoftmodem ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries (lte-uesoftmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
target_link_libraries (lte-uesoftmodem ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (lte-uesoftmodem ${T_LIB})
|
||||
|
||||
# lte-softmodem-nos1 is both eNB and UE implementation
|
||||
###################################################
|
||||
add_executable(lte-uesoftmodem-nos1
|
||||
${rrc_h}
|
||||
${s1ap_h}
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||
${OPENAIR_TARGETS}/SIMU/USER/init_lte.c
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||
${OPENAIR_DIR}/common/utils/system.c
|
||||
${XFORMS_SOURCE}
|
||||
${XFORMS_SOURCE_SOFTMODEM}
|
||||
${T_SOURCE}
|
||||
${CONFIG_SOURCES}
|
||||
${SHLIB_LOADER_SOURCES}
|
||||
)
|
||||
target_link_libraries (lte-uesoftmodem-nos1
|
||||
-Wl,--start-group
|
||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_UE_LIB PHY_UE LFDS L2_UE ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB}
|
||||
${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7
|
||||
-Wl,--end-group z dl )
|
||||
|
||||
target_link_libraries (lte-uesoftmodem-nos1 ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries (lte-uesoftmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
target_link_libraries (lte-uesoftmodem-nos1 ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (lte-uesoftmodem-nos1 ${T_LIB})
|
||||
|
||||
# USIM process
|
||||
#################
|
||||
#add_executable(usim
|
||||
@@ -2398,3 +2488,8 @@ ADD_CUSTOM_TARGET(oarf
|
||||
DEPENDS ${OCT_FILES}
|
||||
)
|
||||
|
||||
include (${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_CMakeLists.txt)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+24
-14
@@ -359,7 +359,11 @@ function main() {
|
||||
|
||||
CMAKE_CMD="$CMAKE_CMD .."
|
||||
echo_info "CMAKE_CMD=$CMAKE_CMD"
|
||||
|
||||
if [ "$eNB" = "1" ] && [ "$UE" = "1" ]; then
|
||||
echo_error "Cannot build UE and eNB on one build_oai execution"
|
||||
echo_error "use 2 build_oai invocations"
|
||||
exit
|
||||
fi
|
||||
#########################################################
|
||||
# check validity of HW and TP parameters for eNB
|
||||
#########################################################
|
||||
@@ -488,10 +492,20 @@ function main() {
|
||||
DIR=$OPENAIR_DIR/cmake_targets
|
||||
if [ "$NOS1" = "1" ] ; then
|
||||
lte_build_dir=lte_noS1_build_oai
|
||||
lte_exec=lte-softmodem-nos1
|
||||
if [ "$eNB" = "1" ] ; then
|
||||
lte_exec=lte-softmodem-nos1
|
||||
fi
|
||||
if [ "$UE" = "1" ] ; then
|
||||
lte_exec=lte-uesoftmodem-nos1
|
||||
fi
|
||||
else
|
||||
lte_build_dir=lte_build_oai
|
||||
lte_exec=lte-softmodem
|
||||
if [ "$eNB" = "1" ] ; then
|
||||
lte_exec=lte-softmodem
|
||||
fi
|
||||
if [ "$UE" = "1" ] ; then
|
||||
lte_exec=lte-uesoftmodem
|
||||
fi
|
||||
fi
|
||||
|
||||
# configuration module libraries, one currently available, using libconfig
|
||||
@@ -544,6 +558,9 @@ function main() {
|
||||
compilations \
|
||||
$lte_build_dir $config_libconfig_shlib \
|
||||
lib$config_libconfig_shlib.so $dbin/lib$config_libconfig_shlib.so
|
||||
compilations \
|
||||
$lte_build_dir coding \
|
||||
libcoding.so $dbin/libcoding.so
|
||||
|
||||
if [ "$NOS1" = "1" ] ; then
|
||||
compilations \
|
||||
@@ -766,17 +783,10 @@ function main() {
|
||||
# Telnet server compilation
|
||||
#####################
|
||||
if [ "$BUILD_TELNETSRV" = "1" ] ; then
|
||||
|
||||
telnetsrv_build_dir=telnetsrv
|
||||
mkdir -p $DIR/$telnetsrv_build_dir/build
|
||||
cd $DIR/$telnetsrv_build_dir/build
|
||||
echo_info "Compiling telnet server library ..."
|
||||
|
||||
[ "$CLEAN" = "1" ] && rm -rf $DIR/$telnetsrv_build_dir
|
||||
cmake_file=$OPENAIR_DIR/common/utils/$telnetsrv_build_dir/CMakeLists.txt
|
||||
cd $DIR/$telnetsrv_build_dir/build
|
||||
eval "$CMAKE_CMD $OPENAIR_DIR/common/utils/$telnetsrv_build_dir/"
|
||||
make
|
||||
build_dir=$lte_build_dir
|
||||
compilations \
|
||||
$build_dir telnetsrv \
|
||||
libtelnetsrv.so $dbin/libtelnetsrv.so
|
||||
|
||||
fi
|
||||
# build RF device and transport protocol libraries
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
RRC_Rel14=(
|
||||
"SystemInformation-r8-IEs.h" 4df485c5ddf2540eca271876cdc512caa19b0890 "fix_asn1.data/RRC.rel14/SystemInformation-r8-IEs.h.diff"
|
||||
"SystemInformation-NB-r13-IEs.h" 6d91332d5c39205819b06e5e36efe62ff8e5b33b "fix_asn1.data/RRC.rel14/SystemInformation-NB-r13-IEs.h.diff"
|
||||
)
|
||||
|
||||
RRC_Rel10=(
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
48a49,70
|
||||
> struct SystemInformation_NB_r13_IEs__sib_TypeAndInfo_r13__Member {
|
||||
> SystemInformation_NB_r13_IEs__sib_TypeAndInfo_r13__Member_PR present;
|
||||
> union SystemInformation_NB_r13_IEs__sib_TypeAndInfo_r13__Member_u {
|
||||
> SystemInformationBlockType2_NB_r13_t sib2_r13;
|
||||
> SystemInformationBlockType3_NB_r13_t sib3_r13;
|
||||
> SystemInformationBlockType4_NB_r13_t sib4_r13;
|
||||
> SystemInformationBlockType5_NB_r13_t sib5_r13;
|
||||
> SystemInformationBlockType14_NB_r13_t sib14_r13;
|
||||
> SystemInformationBlockType16_NB_r13_t sib16_r13;
|
||||
> /*
|
||||
> * This type is extensible,
|
||||
> * possible extensions are below.
|
||||
> */
|
||||
> SystemInformationBlockType15_NB_r14_t sib15_v1430;
|
||||
> SystemInformationBlockType20_NB_r14_t sib20_v1430;
|
||||
> SystemInformationBlockType22_NB_r14_t sib22_v1430;
|
||||
> } choice;
|
||||
>
|
||||
> /* Context for parsing across buffer boundaries */
|
||||
> asn_struct_ctx_t _asn_ctx;
|
||||
> };
|
||||
>
|
||||
52,72c74
|
||||
< A_SEQUENCE_OF(struct SystemInformation_NB_r13_IEs__sib_TypeAndInfo_r13__Member {
|
||||
< SystemInformation_NB_r13_IEs__sib_TypeAndInfo_r13__Member_PR present;
|
||||
< union SystemInformation_NB_r13_IEs__sib_TypeAndInfo_r13__Member_u {
|
||||
< SystemInformationBlockType2_NB_r13_t sib2_r13;
|
||||
< SystemInformationBlockType3_NB_r13_t sib3_r13;
|
||||
< SystemInformationBlockType4_NB_r13_t sib4_r13;
|
||||
< SystemInformationBlockType5_NB_r13_t sib5_r13;
|
||||
< SystemInformationBlockType14_NB_r13_t sib14_r13;
|
||||
< SystemInformationBlockType16_NB_r13_t sib16_r13;
|
||||
< /*
|
||||
< * This type is extensible,
|
||||
< * possible extensions are below.
|
||||
< */
|
||||
< SystemInformationBlockType15_NB_r14_t sib15_v1430;
|
||||
< SystemInformationBlockType20_NB_r14_t sib20_v1430;
|
||||
< SystemInformationBlockType22_NB_r14_t sib22_v1430;
|
||||
< } choice;
|
||||
<
|
||||
< /* Context for parsing across buffer boundaries */
|
||||
< asn_struct_ctx_t _asn_ctx;
|
||||
< } ) list;
|
||||
---
|
||||
> A_SEQUENCE_OF(struct SystemInformation_NB_r13_IEs__sib_TypeAndInfo_r13__Member) list;
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -197,25 +197,40 @@ int i;
|
||||
return cfgptr;
|
||||
}
|
||||
|
||||
void end_configmodule()
|
||||
|
||||
/* free memory allocated when reading parameters */
|
||||
/* config module could be initialized again after this call */
|
||||
void end_configmodule(void)
|
||||
{
|
||||
if (cfgptr != NULL) {
|
||||
if (cfgptr->end != NULL) {
|
||||
printf ("[CONFIG] calling config module end function...\n");
|
||||
cfgptr->end();
|
||||
}
|
||||
|
||||
printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs);
|
||||
for(int i=0; i<cfgptr->numptrs ; i++) {
|
||||
if (cfgptr->ptrs[i] != NULL) {
|
||||
free(cfgptr->ptrs[i]);
|
||||
cfgptr->ptrs[i]=NULL;
|
||||
}
|
||||
}
|
||||
cfgptr->numptrs=0;
|
||||
}
|
||||
}
|
||||
|
||||
/* free all memory used by config module */
|
||||
/* should be called only at program exit */
|
||||
void free_configmodule(void)
|
||||
{
|
||||
if (cfgptr != NULL) {
|
||||
end_configmodule();
|
||||
if( cfgptr->cfgmode != NULL) free(cfgptr->cfgmode);
|
||||
printf ("[CONFIG] free %u config parameter pointers\n",cfgptr->num_cfgP);
|
||||
for (int i=0; i<cfgptr->num_cfgP; i++) {
|
||||
if ( cfgptr->cfgP[i] != NULL) free(cfgptr->cfgP[i]);
|
||||
}
|
||||
printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs);
|
||||
for(int i=0; i<cfgptr->numptrs ; i++) {
|
||||
if (cfgptr->ptrs[i] != NULL) {
|
||||
free(cfgptr->ptrs[i]);
|
||||
}
|
||||
cfgptr->ptrs[i]=NULL;
|
||||
}
|
||||
|
||||
|
||||
free(cfgptr);
|
||||
cfgptr=NULL;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -40,15 +40,18 @@
|
||||
#define CONFIG_MAX_OOPT_PARAMS 10 // maximum number of parameters in the -O option (-O <cfgmode>:P1:P2...
|
||||
#define CONFIG_MAX_ALLOCATEDPTRS 1024 // maximum number of parameters that can be dynamicaly allocated in the config module
|
||||
|
||||
/* default values for configuration module parameters */
|
||||
#define DEFAULT_CFGMODE "libconfig" // use libconfig file
|
||||
#define DEFAULT_CFGFILENAME "oai.conf" // default config file
|
||||
|
||||
/* rtflags bit position definitions */
|
||||
#define CONFIG_PRINTPARAMS 1 // print parameters values while processing
|
||||
#define CONFIG_DEBUGPTR 2 // print memory allocation/free debug messages
|
||||
#define CONFIG_DEBUGCMDLINE 4 // print command line processing messages
|
||||
#define CONFIG_HELP 8 // print help message
|
||||
#define CONFIG_ABORT 16 // config failed,abort execution
|
||||
#define CONFIG_NOOOPT 32 // no -O option found when parsing command line
|
||||
|
||||
|
||||
#define CONFIG_PRINTPARAMS 1 // print parameters values while processing
|
||||
#define CONFIG_DEBUGPTR 1<<1 // print memory allocation/free debug messages
|
||||
#define CONFIG_DEBUGCMDLINE 1<<2 // print command line processing messages
|
||||
#define CONFIG_NOABORTONCHKF 1<<3 // disable abort execution when parameter checking function fails
|
||||
#define CONFIG_HELP 1<<20 // print help message
|
||||
#define CONFIG_ABORT 1<<21 // config failed,abort execution
|
||||
#define CONFIG_NOOOPT 1<<22 // no -O option found when parsing command line
|
||||
typedef int(*configmodule_initfunc_t)(char *cfgP[],int numP);
|
||||
typedef int(*configmodule_getfunc_t)(paramdef_t *,int numparams, char *prefix);
|
||||
typedef int(*configmodule_getlistfunc_t)(paramlist_def_t *, paramdef_t *,int numparams, char *prefix);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -55,16 +55,61 @@
|
||||
#define PARAMFLAG_PARAMSET (1 << 16) // parameter has been explicitely set in get functions
|
||||
#define PARAMFLAG_PARAMSETDEF (1 << 17) // parameter has been set to default value in get functions
|
||||
|
||||
|
||||
/* checkedparam_t is possibly used in paramdef_t for specific parameter value validation */
|
||||
#define CONFIG_MAX_NUMCHECKVAL 20
|
||||
typedef struct paramdef paramdef_t;
|
||||
typedef union checkedparam {
|
||||
struct {
|
||||
int (*f1)(paramdef_t *param); /* check an integer against a list of authorized values */
|
||||
int okintval[CONFIG_MAX_NUMCHECKVAL]; /* integer array, store possible values */
|
||||
int num_okintval; /* number of valid values in the checkingval array */
|
||||
} s1;
|
||||
struct {
|
||||
int (*f1a)(paramdef_t *param); /* check an integer against a list of authorized values and set param value */
|
||||
/* to the corresponding item in setintval array (mainly for RRC params) */
|
||||
int okintval[CONFIG_MAX_NUMCHECKVAL]; /* integer array, store possible values in config file */
|
||||
int setintval[CONFIG_MAX_NUMCHECKVAL]; /* integer array, values set in the paramdef structure */
|
||||
int num_okintval; /* number of valid values in the checkingval array */
|
||||
} s1a;
|
||||
struct {
|
||||
int (*f2)(paramdef_t *param); /* check an integer against an authorized range, defined by its min and max value */
|
||||
int okintrange[CONFIG_MAX_NUMCHECKVAL]; /* integer array, store min and max values */
|
||||
|
||||
} s2;
|
||||
struct {
|
||||
int (*f3)(paramdef_t *param); /* check a string against a list of authorized values */
|
||||
char *okstrval[CONFIG_MAX_NUMCHECKVAL]; /* string array, store possible values */
|
||||
int num_okstrval; /* number of valid values in the checkingval array */
|
||||
} s3;
|
||||
struct {
|
||||
int (*f3a)(paramdef_t *param); /* check a string against a list of authorized values and set param value */
|
||||
/* to the corresponding item in setintval array (mainly for RRC params) */
|
||||
char *okstrval[CONFIG_MAX_NUMCHECKVAL]; /* string array, store possible values */
|
||||
int setintval[CONFIG_MAX_NUMCHECKVAL]; /* integer array, values set in the paramdef structure */
|
||||
int num_okstrval; /* number of valid values in the checkingval array */
|
||||
} s3a;
|
||||
struct {
|
||||
int (*f4)(paramdef_t *param); /* generic check function, no arguments but the param description */
|
||||
|
||||
} s4;
|
||||
struct {
|
||||
void (*checkfunc)(void) ;
|
||||
} s5;
|
||||
} checkedparam_t;
|
||||
|
||||
/* paramdef is used to describe a parameter, array of paramdef_t strustures is used as the main parameter in */
|
||||
/* config apis used to retrieve parameters values */
|
||||
typedef struct paramdef
|
||||
{
|
||||
char optname[MAX_OPTNAME_SIZE]; /* parameter name, can be used as long command line option */
|
||||
char *helpstr; /* help string */
|
||||
unsigned int paramflags; /* value is a "ored" combination of above PARAMFLAG_XXXX values */
|
||||
union { /* pointer to the parameter value, completed by the config module */
|
||||
char optname[MAX_OPTNAME_SIZE]; /* parameter name, can be used as long command line option */
|
||||
char *helpstr; /* help string */
|
||||
unsigned int paramflags; /* value is a "ored" combination of above PARAMFLAG_XXXX values */
|
||||
union { /* pointer to the parameter value, completed by the config module */
|
||||
char **strptr;
|
||||
char **strlistptr;
|
||||
uint8_t *u8ptr;
|
||||
char *i8ptr;
|
||||
int8_t *i8ptr;
|
||||
uint16_t *u16ptr;
|
||||
int16_t *i16ptr;
|
||||
uint32_t *uptr;
|
||||
@@ -72,18 +117,21 @@ typedef struct paramdef
|
||||
uint64_t *u64ptr;
|
||||
int64_t *i64ptr;
|
||||
double *dblptr;
|
||||
void *voidptr;
|
||||
} ;
|
||||
union { /* default parameter value, to be used when PARAMFLAG_MANDATORY is not specified */
|
||||
char *defstrval;
|
||||
char **defstrlistval;
|
||||
uint32_t defuintval;
|
||||
int defintval;
|
||||
uint64_t defint64val;
|
||||
int *defintarrayval;
|
||||
double defdblval;
|
||||
char *defstrval;
|
||||
char **defstrlistval;
|
||||
uint32_t defuintval;
|
||||
int defintval;
|
||||
uint64_t defint64val;
|
||||
int *defintarrayval;
|
||||
double defdblval;
|
||||
} ;
|
||||
char type; /* parameter value type, as listed below as TYPE_XXXX macro */
|
||||
int numelt; /* number of elements in a list or array parameters or max size of string value */
|
||||
checkedparam_t *chkPptr; /* possible pointer to the structure containing the info used to check parameter values */
|
||||
int *processedvalue; /* used to store integer values computed from string original value */
|
||||
} paramdef_t;
|
||||
|
||||
#define TYPE_INT TYPE_INT32
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <errno.h>
|
||||
#include <dlfcn.h>
|
||||
#include "config_userapi.h"
|
||||
extern void exit_fun(const char* s); // lte-softmodem clean exit function
|
||||
|
||||
|
||||
configmodule_interface_t *config_get_if(void)
|
||||
@@ -59,7 +60,7 @@ char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length)
|
||||
*ptr = malloc(length);
|
||||
if ( *ptr != NULL) {
|
||||
memset(*ptr,0,length);
|
||||
if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) != 0) {
|
||||
if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
|
||||
config_get_if()->ptrs[config_get_if()->numptrs] = *ptr;
|
||||
config_get_if()->numptrs++;
|
||||
}
|
||||
@@ -111,7 +112,29 @@ int tmpval=val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
void config_assign_processedint(paramdef_t *cfgoption, int val) {
|
||||
cfgoption->processedvalue = malloc(sizeof(int));
|
||||
if ( cfgoption->processedvalue != NULL) {
|
||||
*(cfgoption->processedvalue) = val;
|
||||
} else {
|
||||
fprintf (stderr,"[CONFIG] %s %d malloc error\n",__FILE__, __LINE__);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
int config_get_processedint(paramdef_t *cfgoption) {
|
||||
int ret;
|
||||
if ( cfgoption->processedvalue != NULL) {
|
||||
ret=*(cfgoption->processedvalue);
|
||||
free( cfgoption->processedvalue);
|
||||
cfgoption->processedvalue=NULL;
|
||||
printf_params("[CONFIG] %s: set from %s to %i\n",cfgoption->optname, *(cfgoption->strptr), ret);
|
||||
} else {
|
||||
fprintf (stderr,"[CONFIG] %s %d %s has no processed integer availablle\n",__FILE__, __LINE__, cfgoption->optname);
|
||||
ret=0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
void config_printhelp(paramdef_t *params,int numparams)
|
||||
{
|
||||
for (int i=0 ; i<numparams ; i++) {
|
||||
@@ -124,11 +147,31 @@ void config_printhelp(paramdef_t *params,int numparams)
|
||||
}
|
||||
}
|
||||
|
||||
int config_execcheck(paramdef_t *params,int numparams, char *prefix)
|
||||
{
|
||||
int st=0;
|
||||
|
||||
for (int i=0 ; i<numparams ; i++) {
|
||||
if ( params[i].chkPptr == NULL) {
|
||||
continue;
|
||||
}
|
||||
if (params[i].chkPptr->s4.f4 != NULL) {
|
||||
st += params[i].chkPptr->s4.f4(&(params[i]));
|
||||
}
|
||||
}
|
||||
if (st != 0) {
|
||||
fprintf(stderr,"[CONFIG] config_execcheck: %i parameters with wrong value\n", -st);
|
||||
if ( CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF) == 0) {
|
||||
exit_fun("exit because configuration failed\n");
|
||||
}
|
||||
}
|
||||
return st;
|
||||
}
|
||||
|
||||
int config_get(paramdef_t *params,int numparams, char *prefix)
|
||||
{
|
||||
int ret= -1;
|
||||
|
||||
printf("numparams:%d prefix:%s\n", numparams, prefix);
|
||||
if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
|
||||
fprintf(stderr,"[CONFIG] config_get skipped, config module not properly initialized\n");
|
||||
return ret;
|
||||
@@ -138,6 +181,7 @@ configmodule_interface_t *cfgif = config_get_if();
|
||||
ret = config_get_if()->get(params, numparams,prefix);
|
||||
if (ret >= 0) {
|
||||
config_process_cmdline(params,numparams,prefix);
|
||||
config_execcheck(params,numparams,prefix);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -153,6 +197,89 @@ int config_isparamset(paramdef_t *params,int paramidx)
|
||||
}
|
||||
}
|
||||
|
||||
int config_getparamval_fromparamdefidx(paramdef_t *cfgoptions,int paramidx) {
|
||||
void print_intvalueerror(paramdef_t *param, char *fname, int *okval, int numokval) {
|
||||
fprintf(stderr,"[CONFIG] %s: %s: %i invalid value, authorized values:\n ",
|
||||
fname,param->optname, (int)*(param->uptr));
|
||||
for ( int i=0; i<numokval ; i++) {
|
||||
fprintf(stderr, " %i",okval[i]);
|
||||
}
|
||||
fprintf(stderr, " \n");
|
||||
}
|
||||
|
||||
int config_check_intval(paramdef_t *param)
|
||||
{
|
||||
if ( param == NULL ){
|
||||
fprintf(stderr,"[CONFIG] config_check_intval: NULL param argument\n");
|
||||
return -1;
|
||||
}
|
||||
for ( int i=0; i<param->chkPptr->s1.num_okintval ; i++) {
|
||||
if( *(param->uptr) == param->chkPptr->s1.okintval[i] ) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
print_intvalueerror(param,"config_check_intval", param->chkPptr->s1.okintval,param->chkPptr->s1.num_okintval);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int config_check_modify_integer(paramdef_t *param)
|
||||
{
|
||||
|
||||
for (int i=0; i < param->chkPptr->s1a.num_okintval ; i++) {
|
||||
if (*(param->uptr) == param->chkPptr->s1a.okintval[i] ) {
|
||||
printf_params("[CONFIG] %s: read value %i, set to %i\n",param->optname,*(param->uptr),param->chkPptr->s1a.setintval [i]);
|
||||
*(param->uptr) = param->chkPptr->s1a.setintval [i];
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
print_intvalueerror(param,"config_check_modify_integer", param->chkPptr->s1a.okintval,param->chkPptr->s1a.num_okintval);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int config_check_intrange(paramdef_t *param)
|
||||
{
|
||||
if( *(param->iptr) >= param->chkPptr->s2.okintrange[0] && *(param->iptr) <= param->chkPptr->s2.okintrange[1] ) {
|
||||
return 0;
|
||||
}
|
||||
fprintf(stderr,"[CONFIG] config_check_intrange: %s: %i invalid value, authorized range: %i %i\n",
|
||||
param->optname, (int)*(param->uptr), param->chkPptr->s2.okintrange[0], param->chkPptr->s2.okintrange[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
void print_strvalueerror(paramdef_t *param, char *fname, char **okval, int numokval) {
|
||||
fprintf(stderr,"[CONFIG] %s: %s: %s invalid value, authorized values:\n ",
|
||||
fname,param->optname, *(param->strptr));
|
||||
for ( int i=0; i<numokval ; i++) {
|
||||
fprintf(stderr, " %s",okval[i]);
|
||||
}
|
||||
fprintf(stderr, " \n");
|
||||
}
|
||||
|
||||
int config_check_strval(paramdef_t *param)
|
||||
{
|
||||
if ( param == NULL ){
|
||||
fprintf(stderr,"[CONFIG] config_check_strval: NULL param argument\n");
|
||||
return -1;
|
||||
}
|
||||
for ( int i=0; i<param->chkPptr->s3.num_okstrval ; i++) {
|
||||
if( strcasecmp(*(param->strptr),param->chkPptr->s3.okstrval[i] ) == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
print_strvalueerror(param, "config_check_strval", param->chkPptr->s3.okstrval, param->chkPptr->s3.num_okstrval);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int config_checkstr_assign_integer(paramdef_t *param)
|
||||
{
|
||||
|
||||
|
||||
for (int i=0; i < param->chkPptr->s3a.num_okstrval ; i++) {
|
||||
if (strcasecmp(*(param->strptr),param->chkPptr->s3a.okstrval[i] ) == 0) {
|
||||
config_assign_processedint(param, param->chkPptr->s3a.setintval[i]);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
print_strvalueerror(param, "config_check_strval", param->chkPptr->s3a.okstrval, param->chkPptr->s3a.num_okstrval);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -38,24 +38,34 @@
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#define DEFAULT_CFGFILENAME "oaisoftmodem.conf"
|
||||
#define DEFAULT_CFGMODE "libconfig"
|
||||
|
||||
#define CONFIG_GETSOURCE ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgmode )
|
||||
#define CONFIG_GETNUMP ( (config_get_if()==NULL) ? 0 : config_get_if()->num_cfgP )
|
||||
#define CONFIG_GETP(P) ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgP[P] )
|
||||
#define CONFIG_ISFLAGSET(P) ( (config_get_if()==NULL) ? 0 : !!(config_get_if()->rtflags & P))
|
||||
|
||||
#define CONFIG_ISPARAMFLAGSET(P,F) ( !!(P.paramflags & F))
|
||||
/* utility functions, to be used by configuration module and/or configuration libraries */
|
||||
extern configmodule_interface_t *config_get_if(void);
|
||||
extern char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) ;
|
||||
extern void config_printhelp(paramdef_t *,int numparams);
|
||||
extern int config_process_cmdline(paramdef_t *params,int numparams, char *prefix);
|
||||
extern int config_get(paramdef_t *params,int numparams, char *prefix);
|
||||
extern int config_isparamset(paramdef_t *params,int paramidx);
|
||||
extern void config_assign_processedint(paramdef_t *cfgoption, int val);
|
||||
extern void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val);
|
||||
extern int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix);
|
||||
extern int config_getparamval_fromparamdefidx(paramdef_t *cfgoptions,int paramidx);
|
||||
|
||||
/* apis to get parameters, to be used by oai modules, at configuration time */
|
||||
extern int config_get(paramdef_t *params,int numparams, char *prefix);
|
||||
#define config_getlist config_get_if()->getlist
|
||||
|
||||
/* apis to retrieve parameters info after calling get or getlist functions */
|
||||
extern int config_isparamset(paramdef_t *params,int paramidx);
|
||||
extern int config_get_processedint(paramdef_t *cfgoption);
|
||||
|
||||
/* functions to be used in parameters definition, to check parameters values */
|
||||
extern int config_check_intval(paramdef_t *param);
|
||||
extern int config_check_modify_integer(paramdef_t *param);
|
||||
extern int config_check_intrange(paramdef_t *param);
|
||||
extern int config_check_strval(paramdef_t *param);
|
||||
extern int config_checkstr_assign_integer(paramdef_t *param);
|
||||
|
||||
#define CONFIG_GETCONFFILE (config_get_if()->cfgP[0])
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -1,3 +1,33 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
/*! \file common/config/libconfig/config_libconfig.c
|
||||
* \brief: implementation libconfig configuration library
|
||||
* \author Francois TABURET
|
||||
* \date 2017
|
||||
* \version 0.1
|
||||
* \company NOKIA BellLabs France
|
||||
* \email: francois.taburet@nokia-bell-labs.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#include <libconfig.h>
|
||||
|
||||
@@ -21,21 +51,23 @@ int read_strlist(paramdef_t *cfgoptions,config_setting_t *setting, char *cfgpath
|
||||
{
|
||||
const char *str;
|
||||
int st;
|
||||
int numelt;
|
||||
|
||||
cfgoptions->numelt=config_setting_length(setting);
|
||||
cfgoptions->strlistptr=malloc(sizeof(char *) * (cfgoptions->numelt));
|
||||
numelt=config_setting_length(setting);
|
||||
config_check_valptr(cfgoptions,(char **)&(cfgoptions->strlistptr), sizeof(char *) * numelt);
|
||||
st=0;
|
||||
for (int i=0; i< cfgoptions->numelt && cfgoptions->strlistptr != NULL; i++) {
|
||||
for (int i=0; i< numelt ; i++) {
|
||||
str=config_setting_get_string_elem(setting,i);
|
||||
if (str==NULL) {
|
||||
printf("[LIBCONFIG] %s%i not found in config file\n", cfgoptions->optname,i);
|
||||
} else {
|
||||
cfgoptions->strlistptr[i]=malloc(strlen(str)+1);
|
||||
config_check_valptr(cfgoptions,&(cfgoptions->strlistptr[i]),strlen(str)+1);
|
||||
sprintf(cfgoptions->strlistptr[i],"%s",str);
|
||||
st++;
|
||||
printf_params("[LIBCONFIG] %s%i: %s\n", cfgpath,i,cfgoptions->strlistptr[i]);
|
||||
}
|
||||
}
|
||||
cfgoptions->numelt=numelt;
|
||||
return st;
|
||||
}
|
||||
|
||||
@@ -108,10 +140,10 @@ int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
|
||||
config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *));
|
||||
config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(str)+1);
|
||||
sprintf( *(cfgoptions[i].strptr) , "%s", str);
|
||||
printf_params("[LIBCONFIG] %s: %s\n", cfgpath,*(cfgoptions[i].strptr) );
|
||||
printf_params("[LIBCONFIG] %s: \"%s\"\n", cfgpath,*(cfgoptions[i].strptr) );
|
||||
} else {
|
||||
sprintf( (char *)(cfgoptions[i].strptr) , "%s", str);
|
||||
printf_params("[LIBCONFIG] %s: %s\n", cfgpath,(char *)cfgoptions[i].strptr );
|
||||
printf_params("[LIBCONFIG] %s: \"%s\"\n", cfgpath,(char *)cfgoptions[i].strptr );
|
||||
}
|
||||
} else {
|
||||
if( cfgoptions[i].defstrval != NULL) {
|
||||
@@ -121,10 +153,10 @@ int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
|
||||
config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *));
|
||||
config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(cfgoptions[i].defstrval)+1);
|
||||
sprintf(*(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval);
|
||||
printf_params("[LIBCONFIG] %s set to default value %s\n", cfgpath, *(cfgoptions[i].strptr));
|
||||
printf_params("[LIBCONFIG] %s set to default value \"%s\"\n", cfgpath, *(cfgoptions[i].strptr));
|
||||
} else {
|
||||
sprintf((char *)(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval);
|
||||
printf_params("[LIBCONFIG] %s set to default value %s\n", cfgpath, (char *)cfgoptions[i].strptr);
|
||||
sprintf((char *)*(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval);
|
||||
printf_params("[LIBCONFIG] %s set to default value \"%s\"\n", cfgpath, (char *)*(cfgoptions[i].strptr));
|
||||
}
|
||||
} else {
|
||||
notfound=1;
|
||||
@@ -374,6 +406,7 @@ void config_libconfig_end(void )
|
||||
config_destroy(&(libconfig_privdata.cfg));
|
||||
if ( libconfig_privdata.configfile != NULL ) {
|
||||
free(libconfig_privdata.configfile);
|
||||
libconfig_privdata.configfile=NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
+16
-2
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -48,6 +48,8 @@
|
||||
#include "NwGtpv1uPrivate.h"
|
||||
#include "gtpv1u_eNB_defs.h"
|
||||
|
||||
#include "PHY/defs_L1_NB_IoT.h"
|
||||
#include "RRC/LITE/defs_NB_IoT.h"
|
||||
typedef struct {
|
||||
/// RAN context config file name
|
||||
char *config_file_name;
|
||||
@@ -55,12 +57,18 @@ typedef struct {
|
||||
int nb_inst;
|
||||
/// Number of Component Carriers per instance in this node
|
||||
int *nb_CC;
|
||||
/// Number of NB_IoT instances in this node
|
||||
int nb_nb_iot_rrc_inst;
|
||||
/// Number of MACRLC instances in this node
|
||||
int nb_macrlc_inst;
|
||||
/// Number of NB_IoT MACRLC instances in this node
|
||||
int nb_nb_iot_macrlc_inst;
|
||||
/// Number of component carriers per instance in this node
|
||||
int *nb_mac_CC;
|
||||
/// Number of L1 instances in this node
|
||||
int nb_L1_inst;
|
||||
/// Number of NB_IoT L1 instances in this node
|
||||
int nb_nb_iot_L1_inst;
|
||||
/// Number of Component Carriers per instance in this node
|
||||
int *nb_L1_CC;
|
||||
/// Number of RU instances in this node
|
||||
@@ -69,10 +77,16 @@ typedef struct {
|
||||
flexran_agent_info_t **flexran;
|
||||
/// eNB context variables
|
||||
struct PHY_VARS_eNB_s ***eNB;
|
||||
/// NB_IoT L1 context variables
|
||||
struct PHY_VARS_eNB_NB_IoT_s **L1_NB_IoT;
|
||||
/// RRC context variables
|
||||
struct eNB_RRC_INST_s **rrc;
|
||||
/// RRC context variables
|
||||
/// NB_IoT RRC context variables
|
||||
//struct eNB_RRC_INST_NB_IoT_s **nb_iot_rrc;
|
||||
/// MAC context variables
|
||||
struct eNB_MAC_INST_s **mac;
|
||||
/// NB_IoT MAC context variables
|
||||
struct eNB_MAC_INST_NB_IoT_s **nb_iot_mac;
|
||||
/// GTPu descriptor
|
||||
gtpv1u_data_t *gtpv1u_data_g;
|
||||
/// RU descriptors. These describe what each radio unit is supposed to do and contain the necessary functions for fronthaul interfaces
|
||||
|
||||
@@ -391,6 +391,103 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* same as itti_send_msg_to_task but returns -1 in case of failure instead of crashing */
|
||||
/* TODO: this is a hack - the whole logic needs a proper rework. */
|
||||
/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
|
||||
int itti_try_send_msg_to_task(task_id_t destination_task_id, instance_t instance, MessageDef *message)
|
||||
{
|
||||
thread_id_t destination_thread_id;
|
||||
task_id_t origin_task_id;
|
||||
message_list_t *new;
|
||||
uint32_t priority;
|
||||
message_number_t message_number;
|
||||
uint32_t message_id;
|
||||
|
||||
AssertFatal (message != NULL, "Message is NULL!\n");
|
||||
AssertFatal (destination_task_id < itti_desc.task_max, "Destination task id (%d) is out of range (%d)\n", destination_task_id, itti_desc.task_max);
|
||||
|
||||
destination_thread_id = TASK_GET_THREAD_ID(destination_task_id);
|
||||
message->ittiMsgHeader.destinationTaskId = destination_task_id;
|
||||
message->ittiMsgHeader.instance = instance;
|
||||
message->ittiMsgHeader.lte_time.frame = itti_desc.lte_time.frame;
|
||||
message->ittiMsgHeader.lte_time.slot = itti_desc.lte_time.slot;
|
||||
message_id = message->ittiMsgHeader.messageId;
|
||||
AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
|
||||
|
||||
origin_task_id = ITTI_MSG_ORIGIN_ID(message);
|
||||
|
||||
priority = itti_get_message_priority (message_id);
|
||||
|
||||
/* Increment the global message number */
|
||||
message_number = itti_increment_message_number ();
|
||||
|
||||
itti_dump_queue_message (origin_task_id, message_number, message, itti_desc.messages_info[message_id].name,
|
||||
sizeof(MessageHeader) + message->ittiMsgHeader.ittiMsgSize);
|
||||
|
||||
if (destination_task_id != TASK_UNKNOWN) {
|
||||
|
||||
if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED) {
|
||||
ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), ended destination task!\n",
|
||||
itti_desc.messages_info[message_id].name,
|
||||
message_number,
|
||||
priority,
|
||||
itti_get_task_name(origin_task_id),
|
||||
destination_task_id,
|
||||
itti_get_task_name(destination_task_id));
|
||||
} else {
|
||||
/* We cannot send a message if the task is not running */
|
||||
AssertFatal (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_READY,
|
||||
"Task %s Cannot send message %s (%d) to thread %d, it is not in ready state (%d)!\n",
|
||||
itti_get_task_name(origin_task_id),
|
||||
itti_desc.messages_info[message_id].name,
|
||||
message_id,
|
||||
destination_thread_id,
|
||||
itti_desc.threads[destination_thread_id].task_state);
|
||||
|
||||
/* Allocate new list element */
|
||||
new = (message_list_t *) itti_malloc (origin_task_id, destination_task_id, sizeof(struct message_list_s));
|
||||
|
||||
/* Fill in members */
|
||||
new->msg = message;
|
||||
new->message_number = message_number;
|
||||
new->message_priority = priority;
|
||||
|
||||
/* Enqueue message in destination task queue */
|
||||
if (lfds611_queue_enqueue(itti_desc.tasks[destination_task_id].message_queue, new) == 0) {
|
||||
itti_free(origin_task_id, new);
|
||||
return -1;
|
||||
}
|
||||
|
||||
{
|
||||
/* Only use event fd for tasks, subtasks will pool the queue */
|
||||
if (TASK_GET_PARENT_TASK_ID(destination_task_id) == TASK_UNKNOWN) {
|
||||
ssize_t write_ret;
|
||||
eventfd_t sem_counter = 1;
|
||||
|
||||
/* Call to write for an event fd must be of 8 bytes */
|
||||
write_ret = write (itti_desc.threads[destination_thread_id].task_event_fd, &sem_counter, sizeof(sem_counter));
|
||||
AssertFatal (write_ret == sizeof(sem_counter), "Write to task message FD (%d) failed (%d/%d)\n",
|
||||
destination_thread_id, (int) write_ret, (int) sizeof(sem_counter));
|
||||
}
|
||||
}
|
||||
|
||||
ITTI_DEBUG(ITTI_DEBUG_SEND, " Message %s, number %lu with priority %d successfully sent from %s to queue (%u:%s)\n",
|
||||
itti_desc.messages_info[message_id].name,
|
||||
message_number,
|
||||
priority,
|
||||
itti_get_task_name(origin_task_id),
|
||||
destination_task_id,
|
||||
itti_get_task_name(destination_task_id));
|
||||
}
|
||||
} else {
|
||||
/* This is a debug message to TASK_UNKNOWN, we can release safely release it */
|
||||
int result = itti_free(origin_task_id, message);
|
||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void itti_subscribe_event_fd(task_id_t task_id, int fd)
|
||||
{
|
||||
thread_id_t thread_id;
|
||||
|
||||
@@ -108,6 +108,18 @@ int itti_send_broadcast_message(MessageDef *message_p);
|
||||
**/
|
||||
int itti_send_msg_to_task(task_id_t task_id, instance_t instance, MessageDef *message);
|
||||
|
||||
/* TODO: this is a hack. Almost no caller of itti_send_msg_to_task checks
|
||||
* the return value so it has been changed to crash the program in case
|
||||
* of failure instead of returning -1 as the documentation above says.
|
||||
* The RLC UM code may receive too much data when doing UDP at a higher
|
||||
* throughput than the link allows and so for this specific case we need
|
||||
* a version that actually returns -1 on failure.
|
||||
*
|
||||
* This needs to be cleaned at some point.
|
||||
*/
|
||||
/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
|
||||
int itti_try_send_msg_to_task(task_id_t task_id, instance_t instance, MessageDef *message);
|
||||
|
||||
/** \brief Add a new fd to monitor.
|
||||
* NOTE: it is up to the user to read data associated with the fd
|
||||
* \param task_id Task ID of the receiving task
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <dlfcn.h>
|
||||
#include "openair1/PHY/defs.h"
|
||||
@@ -44,68 +45,162 @@
|
||||
void loader_init(void) {
|
||||
paramdef_t LoaderParams[] = LOADER_PARAMS_DESC;
|
||||
|
||||
|
||||
loader_data.mainexec_buildversion = PACKAGE_VERSION;
|
||||
int ret = config_get( LoaderParams,sizeof(LoaderParams)/sizeof(paramdef_t),LOADER_CONFIG_PREFIX);
|
||||
if (ret <0) {
|
||||
fprintf(stderr,"[LOADER] configuration couldn't be performed");
|
||||
printf("[LOADER] configuration couldn't be performed via config module, parameters set to default values\n");
|
||||
if (loader_data.shlibpath == NULL) {
|
||||
loader_data.shlibpath=DEFAULT_PATH;
|
||||
}
|
||||
return;
|
||||
}
|
||||
loader_data.maxshlibs = DEFAULT_MAXSHLIBS;
|
||||
}
|
||||
loader_data.shlibs = malloc(loader_data.maxshlibs * sizeof(loader_shlibdesc_t));
|
||||
if(loader_data.shlibs == NULL) {
|
||||
fprintf(stderr,"[LOADER] %s %d memory allocation error %s\n",__FILE__, __LINE__,strerror(errno));
|
||||
exit_fun("[LOADER] unrecoverable error");
|
||||
}
|
||||
memset(loader_data.shlibs,0,loader_data.maxshlibs * sizeof(loader_shlibdesc_t));
|
||||
}
|
||||
|
||||
/* build the full shared lib name from the module name */
|
||||
char *loader_format_shlibpath(char *modname)
|
||||
{
|
||||
|
||||
char *tmpstr;
|
||||
char *shlibpath =NULL;
|
||||
char *shlibversion=NULL;
|
||||
char *cfgprefix;
|
||||
paramdef_t LoaderParams[] ={{"shlibpath", NULL, 0, strptr:&shlibpath, defstrval:NULL, TYPE_STRING, 0},
|
||||
{"shlibversion", NULL, 0, strptr:&shlibversion, defstrval:"", TYPE_STRING, 0}};
|
||||
|
||||
int ret;
|
||||
|
||||
|
||||
|
||||
|
||||
/* looks for specific path for this module in the config file */
|
||||
/* specific value for a module path and version is located in a modname subsection of the loader section */
|
||||
/* shared lib name is formatted as lib<module name><module version>.so */
|
||||
cfgprefix = malloc(sizeof(LOADER_CONFIG_PREFIX)+strlen(modname)+16);
|
||||
if (cfgprefix == NULL) {
|
||||
fprintf(stderr,"[LOADER] %s %d malloc error loading module %s, %s\n",__FILE__, __LINE__, modname, strerror(errno));
|
||||
exit_fun("[LOADER] unrecoverable error");
|
||||
} else {
|
||||
sprintf(cfgprefix,LOADER_CONFIG_PREFIX ".%s",modname);
|
||||
int ret = config_get( LoaderParams,sizeof(LoaderParams)/sizeof(paramdef_t),cfgprefix);
|
||||
if (ret <0) {
|
||||
fprintf(stderr,"[LOADER] %s %d couldn't retrieve config from section %s\n",__FILE__, __LINE__,cfgprefix);
|
||||
}
|
||||
}
|
||||
/* no specific path, use loader default shared lib path */
|
||||
if (shlibpath == NULL) {
|
||||
shlibpath = loader_data.shlibpath ;
|
||||
}
|
||||
/* no specific shared lib version */
|
||||
if (shlibversion == NULL) {
|
||||
shlibversion = "" ;
|
||||
}
|
||||
/* alloc memory for full module shared lib file name */
|
||||
tmpstr = malloc(strlen(shlibpath)+strlen(modname)+strlen(shlibversion)+16);
|
||||
if (tmpstr == NULL) {
|
||||
fprintf(stderr,"[LOADER] %s %d malloc error loading module %s, %s\n",__FILE__, __LINE__, modname, strerror(errno));
|
||||
exit_fun("[LOADER] unrecoverable error");
|
||||
}
|
||||
if(shlibpath[0] != 0) {
|
||||
ret=sprintf(tmpstr,"%s/",shlibpath);
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
sprintf(tmpstr+ret,"lib%s%s.so",modname,shlibversion);
|
||||
|
||||
|
||||
return tmpstr;
|
||||
}
|
||||
|
||||
int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf)
|
||||
{
|
||||
void *lib_handle;
|
||||
initfunc_t fpi;
|
||||
char *tmpstr;
|
||||
checkverfunc_t fpc;
|
||||
getfarrayfunc_t fpg;
|
||||
char *shlib_path;
|
||||
char *afname=NULL;
|
||||
int ret=0;
|
||||
|
||||
if (loader_data.shlibpath == NULL) {
|
||||
loader_init();
|
||||
}
|
||||
tmpstr = malloc(strlen(loader_data.shlibpath)+strlen(modname)+16);
|
||||
if (tmpstr == NULL) {
|
||||
fprintf(stderr,"[LOADER] %s %d malloc error loading module %s, %s\n",__FILE__, __LINE__, modname, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(loader_data.shlibpath[0] != 0) {
|
||||
ret=sprintf(tmpstr,"%s/",loader_data.shlibpath);
|
||||
}
|
||||
if(strstr(modname,".so") == NULL) {
|
||||
sprintf(tmpstr+ret,"lib%s.so",modname);
|
||||
} else {
|
||||
sprintf(tmpstr+ret,"%s",modname);
|
||||
}
|
||||
shlib_path = loader_format_shlibpath(modname);
|
||||
|
||||
ret = 0;
|
||||
lib_handle = dlopen(tmpstr, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
|
||||
lib_handle = dlopen(shlib_path, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
|
||||
if (!lib_handle) {
|
||||
fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", tmpstr,dlerror());
|
||||
fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", shlib_path,dlerror());
|
||||
ret = -1;
|
||||
} else {
|
||||
printf("[LOADER] library %s uccessfully loaded loaded\n", tmpstr);
|
||||
sprintf(tmpstr,"%s_autoinit",modname);
|
||||
fpi = dlsym(lib_handle,tmpstr);
|
||||
printf("[LOADER] library %s successfully loaded\n", shlib_path);
|
||||
afname=malloc(strlen(modname)+15);
|
||||
sprintf(afname,"%s_checkbuildver",modname);
|
||||
fpc = dlsym(lib_handle,afname);
|
||||
if (fpc != NULL ){
|
||||
int chkver_ret = fpc(loader_data.mainexec_buildversion, &(loader_data.shlibs[loader_data.numshlibs].shlib_buildversion));
|
||||
if (chkver_ret < 0) {
|
||||
fprintf(stderr,"[LOADER] %s %d lib %s, version mismatch",__FILE__, __LINE__, modname);
|
||||
exit_fun("[LOADER] unrecoverable error");
|
||||
}
|
||||
}
|
||||
sprintf(afname,"%s_autoinit",modname);
|
||||
fpi = dlsym(lib_handle,afname);
|
||||
|
||||
if (fpi != NULL )
|
||||
{
|
||||
if (fpi != NULL ) {
|
||||
fpi();
|
||||
}
|
||||
}
|
||||
|
||||
if (farray != NULL) {
|
||||
loader_data.shlibs[loader_data.numshlibs].funcarray=malloc(numf*sizeof(loader_shlibfunc_t));
|
||||
loader_data.shlibs[loader_data.numshlibs].numfunc=0;
|
||||
for (int i=0; i<numf; i++) {
|
||||
farray[i].fptr = dlsym(lib_handle,farray[i].fname);
|
||||
if (farray[i].fptr == NULL ) {
|
||||
fprintf(stderr,"[LOADER] %s %d %s function not found %s\n",__FILE__, __LINE__, dlerror(),farray[i].fname);
|
||||
ret= -1;
|
||||
}
|
||||
ret= -1;
|
||||
} else { /* farray[i].fptr == NULL */
|
||||
loader_data.shlibs[loader_data.numshlibs].funcarray[i].fname=strdup(farray[i].fname);
|
||||
loader_data.shlibs[loader_data.numshlibs].funcarray[i].fptr = farray[i].fptr;
|
||||
loader_data.shlibs[loader_data.numshlibs].numfunc++;
|
||||
}/* farray[i].fptr != NULL */
|
||||
} /* for int i... */
|
||||
} /* farray ! NULL */
|
||||
}
|
||||
} else { /* farray ! NULL */
|
||||
sprintf(afname,"%s_getfarray",modname);
|
||||
fpg = dlsym(lib_handle,afname);
|
||||
if (fpg != NULL ) {
|
||||
loader_data.shlibs[loader_data.numshlibs].numfunc = fpg(&(loader_data.shlibs[loader_data.numshlibs].funcarray));
|
||||
}
|
||||
} /* farray ! NULL */
|
||||
loader_data.shlibs[loader_data.numshlibs].name=strdup(modname);
|
||||
loader_data.shlibs[loader_data.numshlibs].thisshlib_path=strdup(shlib_path);
|
||||
|
||||
(loader_data.numshlibs)++;
|
||||
} /* lib_handle != NULL */
|
||||
|
||||
if (tmpstr != NULL) free(tmpstr);
|
||||
if ( shlib_path!= NULL) free(shlib_path);
|
||||
if ( afname!= NULL) free(afname);
|
||||
if (lib_handle != NULL) dlclose(lib_handle);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void * get_shlibmodule_fptr(char *modname, char *fname)
|
||||
{
|
||||
for (int i=0; i<loader_data.numshlibs && loader_data.shlibs[i].name != NULL; i++) {
|
||||
if ( strcmp(loader_data.shlibs[i].name, modname) == 0) {
|
||||
for (int j =0; j<loader_data.shlibs[i].numfunc ; j++) {
|
||||
if (strcmp(loader_data.shlibs[i].funcarray[j].fname, fname) == 0) {
|
||||
return loader_data.shlibs[i].funcarray[j].fptr;
|
||||
}
|
||||
} /* for j loop on module functions*/
|
||||
}
|
||||
} /* for i loop on modules */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -33,33 +33,60 @@
|
||||
#define LOAD_SHLIB_H
|
||||
|
||||
|
||||
typedef int(*initfunc_t)(void);
|
||||
|
||||
typedef struct {
|
||||
char *shlibpath;
|
||||
}loader_data_t;
|
||||
|
||||
typedef struct {
|
||||
char *fname;
|
||||
int (*fptr)(void);
|
||||
}loader_shlibfunc_t;
|
||||
|
||||
typedef struct {
|
||||
char *name;
|
||||
char *shlib_version; //
|
||||
char *shlib_buildversion;
|
||||
char *thisshlib_path;
|
||||
uint32_t numfunc;
|
||||
loader_shlibfunc_t *funcarray;
|
||||
}loader_shlibdesc_t;
|
||||
|
||||
typedef struct {
|
||||
char *mainexec_buildversion;
|
||||
char *shlibpath;
|
||||
uint32_t maxshlibs;
|
||||
uint32_t numshlibs;
|
||||
loader_shlibdesc_t *shlibs;
|
||||
}loader_data_t;
|
||||
|
||||
/* function type of functions which may be implemented by a module */
|
||||
/* 1: init function, called when loading, if found in the shared lib */
|
||||
typedef int(*initfunc_t)(void);
|
||||
/* 2: version checking function, called when loading, if it returns -1, trigger main exec abort */
|
||||
typedef int(*checkverfunc_t)(char * mainexec_version, char ** shlib_version);
|
||||
/* 3: get function array function, called when loading when a module doesn't provide */
|
||||
/* the function array when calling load_module_shlib (farray param NULL) */
|
||||
typedef int(*getfarrayfunc_t)(loader_shlibfunc_t **funcarray);
|
||||
|
||||
#ifdef LOAD_MODULE_SHLIB_MAIN
|
||||
#define LOADER_CONFIG_PREFIX "loader"
|
||||
#define DEFAULT_PATH ""
|
||||
#define DEFAULT_PATH ""
|
||||
#define DEFAULT_MAXSHLIBS 10
|
||||
loader_data_t loader_data;
|
||||
|
||||
/*--------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* LOADER parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*--------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* LOADER parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define LOADER_PARAMS_DESC { \
|
||||
{"shlibpath", NULL, 0, strptr:(char **)&(loader_data.shlibpath), defstrval:DEFAULT_PATH, TYPE_STRING, 0} \
|
||||
{"shlibpath", NULL, PARAMFLAG_NOFREE, strptr:(char **)&(loader_data.shlibpath), defstrval:DEFAULT_PATH, TYPE_STRING, 0}, \
|
||||
{"maxshlibs", NULL, 0, uptr:&(loader_data.maxshlibs), defintval:DEFAULT_MAXSHLIBS, TYPE_UINT32, 0}, \
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------*/
|
||||
#else
|
||||
#else /* LOAD_MODULE_SHLIB_MAIN */
|
||||
extern int load_module_shlib(char *modname, loader_shlibfunc_t *farray, int numf);
|
||||
#endif
|
||||
extern void * get_shlibmodule_fptr(char *modname, char *fname);
|
||||
extern loader_data_t loader_data;
|
||||
#endif /* LOAD_MODULE_SHLIB_MAIN */
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
|
||||
IF(DEFINED ENV{OPENAIR_DIR})
|
||||
message("...using oai source files in $ENV{OPENAIR_DIR}")
|
||||
ELSE()
|
||||
message("OPENAIR_DIR is not defined. You must run \"source oaienv\" from the oai root dir")
|
||||
# exit early
|
||||
return()
|
||||
ENDIF()
|
||||
|
||||
|
||||
|
||||
set(OPENAIR_DIR $ENV{OPENAIR_DIR})
|
||||
set(APPROOT ${OPENAIR_DIR}/common/utils/telnetsrv )
|
||||
set(OPENAIR_BUILD_DIR $ENV{OPENAIR_DIR}/cmake_targets)
|
||||
set(OPENAIR1_DIR $ENV{OPENAIR1_DIR})
|
||||
set(OPENAIR2_DIR $ENV{OPENAIR2_DIR})
|
||||
set(OPENAIR3_DIR $ENV{OPENAIR3_DIR})
|
||||
set(OPENAIR_PHY_DIR $ENV{OPENAIR1_DIR}/PHY)
|
||||
set(OPENAIR_TARGET_DIR $ENV{OPENAIR_DIR}/targets)
|
||||
set(OPENAIR_COMMONUTILS_DIR $ENV{OPENAIR_DIR}/common/utils)
|
||||
set(OPENAIR2_COMMON_DIR $ENV{OPENAIR_DIR}/openair2/COMMON)
|
||||
set(OPENAIR_ASN1INC ${OPENAIR_BUILD_DIR}/lte_build_oai/build/CMakeFiles/Rel14)
|
||||
set(OPENAIR_NFAPIINC $ENV{NFAPI_DIR} )
|
||||
|
||||
set(CMAKE_INSTALL_PREFIX $ENV{OPENAIR_TARGETS})
|
||||
|
||||
add_definitions (-DRel14 -DCMAKER -DENABLE_ITTI -DENABLE_NAS_UE_LOGGING -DENABLE_SECURITY -DENABLE_USE_CPU_EXECUTION_TIME -DENABLE_USE_MME -DENABLE_VCD -DENB_AGENT -DENB_MODE -DETHERNET=1 -DEXMIMO_IOT -DJUMBO_FRAME -DLINK_ENB_PDCP_TO_GTPV1U -DLOG_NO_THREAD -DMAC_CONTEXT -DMAX_NUM_CCs=1 -DNAS_BUILT_IN_UE -DNAS_UE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DNO_RRM -DNone=1 -DOAI_NW_DRIVER_USE_NETLINK -DOPENAIR2 -DOPENAIR_LTE -DPHYSIM -DPHY_CONTEXT -DRel10=1 -DS1AP_VERSION=R10 -DTRACE_RLC_MUTEX -DX2AP_VERSION=R11 -DXFORMS -mavx2 -msse4.1 -mssse3)
|
||||
add_compile_options( -fPIC -march=native -Ofast)
|
||||
|
||||
include_directories( ./ ${OPENAIR_COMMON_DIR} ${OPENAIR_DIR} ${OPENAIR1_DIR} ${OPENAIR2_DIR} ${OPENAIR2_COMMON_DIR} ${OPENAIR2_DIR}/UTIL/LOG
|
||||
${OPENAIR_COMMONUTILS_DIR}/msc ${OPENAIR_COMMONUTILS_DIR}/itti ${OPENAIR_COMMONUTILS_DIR}/hashtable ${OPENAIR_COMMONUTILS_DIR} ${OPENAIR_ASN1INC}
|
||||
${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0 ${OPENAIR_COMMONUTILS_DIR}/msc ${OPENAIR_COMMONUTILS_DIR}/itti ${OPENAIR_COMMONUTILS_DIR}/hashtable ${OPENAIR_COMMONUTILS_DIR} ${OPENAIR_ASN1INC}
|
||||
${OPENAIR2_DIR}/LAYER2/RLC ${OPENAIR2_DIR}/UTIL/LISTS ${OPENAIR2_DIR}/UTIL/MEM ${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0
|
||||
${OPENAIR2_DIR}/LAYER2/RLC/TM_v9.3.0 ${OPENAIR2_DIR}/RRC/LITE ${OPENAIR_TARGET_DIR}/COMMON ${OPENAIR_TARGET_DIR}/ARCH/COMMON
|
||||
${OPENAIR3_DIR}/NAS/COMMON/API/NETWORK ${OPENAIR3_DIR}/NAS/COMMON/EMM/MSG/ ${OPENAIR3_DIR}/NAS/COMMON/IES/ ${OPENAIR3_DIR}/NAS/COMMON/UTIL
|
||||
${OPENAIR3_DIR}/NAS/COMMON/ESM/MSG/ ${OPENAIR3_DIR}/GTPV1-U ${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/shared ${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/include
|
||||
${OPENAIR3_DIR}/UTILS ${OPENAIR_NFAPIINC})
|
||||
|
||||
set(TELNETSRV_SOURCE
|
||||
${APPROOT}/telnetsrv.c
|
||||
${APPROOT}/telnetsrv_phycmd.c
|
||||
${APPROOT}/telnetsrv_proccmd.c
|
||||
)
|
||||
|
||||
#set(TELNETSRV_ETHDEVCMD_SOURCE
|
||||
# ${APPROOT}/telnetsrv/telnetsrv_ethdevcmd.c
|
||||
# )
|
||||
|
||||
|
||||
|
||||
add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} )
|
||||
#add_library(telnetsrv_ethdevcmd MODULE ${TELNETSRV_ETHDEVCMD_SOURCE} )
|
||||
|
||||
|
||||
install(TARGETS telnetsrv DESTINATION bin)
|
||||
|
||||
if (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build")
|
||||
install(TARGETS telnetsrv DESTINATION ${OPENAIR_BUILD_DIR}/lte_build_oai/build)
|
||||
endif (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build")
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -43,7 +43,7 @@
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <pthread.h>
|
||||
#include <telnetsrv.h>
|
||||
#include "telnetsrv.h"
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
@@ -51,20 +51,27 @@
|
||||
#include <dlfcn.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include <readline/history.h>
|
||||
|
||||
|
||||
#include "telnetsrv_phycmd.h"
|
||||
#include "telnetsrv_proccmd.h"
|
||||
static char* telnet_defstatmod[] = {"softmodem","phy"};
|
||||
static char* telnet_defstatmod[] = {"softmodem","phy","loader"};
|
||||
static telnetsrv_params_t telnetparams;
|
||||
#define TELNETSRV_LISTENADDR 0
|
||||
#define TELNETSRV_LISTENPORT 1
|
||||
#define TELNETSRV_PRIORITY 2
|
||||
#define TELNETSRV_DEBUG 3
|
||||
#define TELNETSRV_STATICMOD 7
|
||||
#define TELNETSRV_SHRMOD 8
|
||||
#define TELNETSRV_LOOPC 4
|
||||
#define TELNETSRV_LOOPD 5
|
||||
#define TELNETSRV_HISFILE 6
|
||||
#define TELNETSRV_HISSIZE 7
|
||||
#define TELNETSRV_PHYBSIZE 8
|
||||
#define TELNETSRV_STATICMOD 9
|
||||
#define TELNETSRV_SHRMOD 10
|
||||
|
||||
paramdef_t telnetoptions[] = {
|
||||
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* configuration parameters for telnet utility */
|
||||
@@ -72,19 +79,22 @@ paramdef_t telnetoptions[] = {
|
||||
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
{"listenaddr", "<listen ip address>", 0, uptr:&telnetparams.listenaddr, defstrval:"0.0.0.0", TYPE_IPV4ADDR, 0 },
|
||||
{"listenport", "<local port>", 0, uptr:&(telnetparams.listenport), defuintval:9090, TYPE_UINT, 0 },
|
||||
{"priority", "<scheduling policy (0-99)", 0, uptr:&telnetparams.priority, defuintval:0, TYPE_INT, 0 },
|
||||
{"priority", "<scheduling policy (0-99)", 0, iptr:&telnetparams.priority, defuintval:0, TYPE_INT, 0 },
|
||||
{"debug", "<debug level>", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0 },
|
||||
{"loopcount", "<loop command iterations>", 0, uptr:&(telnetparams.loopcount), defuintval:10, TYPE_UINT, 0 },
|
||||
{"loopdelay", "<loop command delay (ms)>", 0, uptr:&(telnetparams.loopdelay), defuintval:5000, TYPE_UINT, 0 },
|
||||
{"histfile", "<history file name>", PARAMFLAG_NOFREE, strptr:&(telnetparams.histfile), defstrval:"oaitelnet.history", TYPE_STRING, 0 },
|
||||
{"histsize", "<history sizes>", 0, iptr:&(telnetparams.histsize), defuintval:50, TYPE_INT, 0 },
|
||||
{"phypbsize", "<phy dump buff size (bytes)>",0, uptr:&(telnetparams.phyprntbuff_size),defuintval:65000, TYPE_UINT, 0 },
|
||||
{"staticmod", "<static modules selection>", 0, NULL, defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,1},
|
||||
{"shrmod", "<static modules selection>", 0, NULL, NULL,TYPE_STRINGLIST,0 },
|
||||
{"staticmod", "<static modules selection>", 0, strlistptr:NULL, defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,(sizeof(telnet_defstatmod)/sizeof(char *))},
|
||||
{"shrmod", "<dynamic modules selection>", 0, strlistptr:NULL, defstrlistval:NULL,TYPE_STRINGLIST,0 }
|
||||
};
|
||||
|
||||
int get_phybsize() {return telnetparams.phyprntbuff_size; };
|
||||
int get_phybsize(void) {return telnetparams.phyprntbuff_size; };
|
||||
int add_telnetcmd(char *modulename,telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd );
|
||||
int setoutput(char *buff, int debug, telnet_printfunc_t prnt);
|
||||
int setparam(char *buff, int debug, telnet_printfunc_t prnt);
|
||||
int history_cmd(char *buff, int debug, telnet_printfunc_t prnt);
|
||||
|
||||
telnetshell_vardef_t telnet_vardef[] = {
|
||||
{"debug",TELNET_VARTYPE_INT32,&telnetparams.telnetdbg},
|
||||
@@ -92,12 +102,15 @@ telnetshell_vardef_t telnet_vardef[] = {
|
||||
{"loopc",TELNET_VARTYPE_INT32,&telnetparams.loopcount},
|
||||
{"loopd",TELNET_VARTYPE_INT32,&telnetparams.loopdelay},
|
||||
{"phypb",TELNET_VARTYPE_INT32,&telnetparams.phyprntbuff_size},
|
||||
{"hsize",TELNET_VARTYPE_INT32,&telnetparams.histsize},
|
||||
{"hfile",TELNET_VARTYPE_STRING,&telnetparams.histfile},
|
||||
{"",0,NULL}
|
||||
};
|
||||
|
||||
telnetshell_cmddef_t telnet_cmdarray[] = {
|
||||
{"redirlog","[here,file,off]",setoutput},
|
||||
{"param","[prio]",setparam},
|
||||
{"history","[list,reset]",history_cmd},
|
||||
{"","",NULL},
|
||||
};
|
||||
|
||||
@@ -131,41 +144,54 @@ char strpolicy[10];
|
||||
|
||||
|
||||
//sched_get_priority_max(SCHED_FIFO)
|
||||
if (priority < NICE_MIN)
|
||||
{
|
||||
if (priority < NICE_MIN) {
|
||||
policy=SCHED_FIFO;
|
||||
sprintf(strpolicy,"%s","fifo");
|
||||
schedp.sched_priority= NICE_MIN - priority ;
|
||||
schedp.sched_priority= NICE_MIN - priority ;
|
||||
if ( (schedp.sched_priority < sched_get_priority_min(SCHED_FIFO)) ||
|
||||
(schedp.sched_priority > sched_get_priority_max(SCHED_FIFO)) ) {
|
||||
client_printf("Error: %i invalid prio, should be %i to %i, \n",
|
||||
priority, NICE_MIN -sched_get_priority_min(SCHED_FIFO),
|
||||
NICE_MIN - sched_get_priority_max(SCHED_FIFO) );
|
||||
}
|
||||
else if (priority > NICE_MAX)
|
||||
{
|
||||
} else if (priority > NICE_MAX) {
|
||||
policy=SCHED_IDLE;
|
||||
sprintf(strpolicy,"%s","idle");
|
||||
schedp.sched_priority=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
policy=SCHED_OTHER;
|
||||
sprintf(strpolicy,"%s","other");
|
||||
schedp.sched_priority=0;
|
||||
}
|
||||
if( tid != 0)
|
||||
{
|
||||
}
|
||||
|
||||
if( tid != 0) {
|
||||
rt = pthread_setschedparam(tid, policy, &schedp);
|
||||
}
|
||||
else if(pid > 0)
|
||||
{
|
||||
} else if(pid > 0) {
|
||||
rt = sched_setscheduler( pid, policy,&schedp);
|
||||
}
|
||||
if (rt != 0)
|
||||
{
|
||||
} else {
|
||||
rt= -1;
|
||||
client_printf("Error: no pid or tid specified\n");
|
||||
}
|
||||
|
||||
if (rt != 0) {
|
||||
client_printf("Error %i: %s modifying sched param to %s:%i, \n",
|
||||
errno,strerror(errno),strpolicy,schedp.sched_priority);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
client_printf("policy set to %s, priority %i\n",strpolicy,schedp.sched_priority);
|
||||
if ( policy==SCHED_OTHER) {
|
||||
rt = getpriority(PRIO_PROCESS,tid);
|
||||
if (rt != -1) {
|
||||
rt = setpriority(PRIO_PROCESS,tid,priority);
|
||||
if (rt < 0) {
|
||||
client_printf("Error %i: %s trying to set nice value of thread %u to %i\n",
|
||||
errno,strerror(errno),tid,priority);
|
||||
}
|
||||
} else {
|
||||
client_printf("Error %i: %s trying to get nice value of thread %u \n",
|
||||
errno,strerror(errno),tid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -198,14 +224,13 @@ int rt;
|
||||
|
||||
CPU_ZERO(&cpuset);
|
||||
CPU_SET(coreid, &cpuset);
|
||||
if (tid > 0)
|
||||
{
|
||||
if (tid > 0) {
|
||||
rt = pthread_setaffinity_np((pthread_t)tid, sizeof(cpu_set_t), &cpuset);
|
||||
}
|
||||
else if (pid > 0)
|
||||
{
|
||||
} else if (pid > 0){
|
||||
rt = sched_setaffinity((pid_t)pid, sizeof(cpu_set_t), &cpuset);
|
||||
}
|
||||
} else {
|
||||
rt= -1;
|
||||
}
|
||||
if (rt != 0)
|
||||
{
|
||||
client_printf("Error %i: %s calling , xxx_setaffinity...\n",errno,strerror(errno));
|
||||
@@ -284,7 +309,6 @@ memset(cmds,0,sizeof(cmds));
|
||||
sscanf(buff,"%9s %9s %9s %9s %9s", cmds[0],cmds[1],cmds[2],cmds[3],cmds[4] );
|
||||
if (strncasecmp(cmds[0],"prio",4) == 0)
|
||||
{
|
||||
pthread_attr_t attr;
|
||||
int prio;
|
||||
prio=(int)strtol(cmds[1],NULL,0);
|
||||
if (errno == ERANGE)
|
||||
@@ -305,6 +329,35 @@ if (strncasecmp(cmds[0],"aff",3) == 0)
|
||||
|
||||
return CMDSTATUS_NOTFOUND;
|
||||
} /* setparam */
|
||||
|
||||
int history_cmd(char *buff, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
char cmds[TELNET_MAX_MSGLENGTH/TELNET_CMD_MAXSIZE][TELNET_CMD_MAXSIZE];
|
||||
|
||||
|
||||
memset(cmds,0,sizeof(cmds));
|
||||
sscanf(buff,"%9s %9s %9s %9s %9s", cmds[0],cmds[1],cmds[2],cmds[3],cmds[4] );
|
||||
if (cmds[0] == NULL)
|
||||
return CMDSTATUS_VARNOTFOUND;
|
||||
if (strncasecmp(cmds[0],"list",4) == 0)
|
||||
{
|
||||
HIST_ENTRY **hist = history_list();
|
||||
if (hist) {
|
||||
for (int i = 0; hist[i]; i++) {
|
||||
prnt ("%d: %s\n", i + history_base, hist[i]->line);
|
||||
}
|
||||
}
|
||||
return CMDSTATUS_FOUND;
|
||||
}
|
||||
if (strncasecmp(cmds[0],"reset",5) == 0)
|
||||
{
|
||||
clear_history();
|
||||
write_history(telnetparams.histfile);
|
||||
return CMDSTATUS_FOUND;
|
||||
}
|
||||
|
||||
return CMDSTATUS_NOTFOUND;
|
||||
} /* history_cmd */
|
||||
/*-------------------------------------------------------------------------------------------------------*/
|
||||
/*
|
||||
generic commands available for all modules loaded by the server
|
||||
@@ -314,11 +367,11 @@ int setgetvar(int moduleindex,char getorset,char *params)
|
||||
{
|
||||
int n,i;
|
||||
char varname[TELNET_CMD_MAXSIZE];
|
||||
char varval[TELNET_CMD_MAXSIZE];
|
||||
char *varval=NULL;
|
||||
|
||||
memset(varname,0,sizeof(varname));
|
||||
memset(varval,0,sizeof(varval));
|
||||
n = sscanf(params,"%s %s",varname,varval);
|
||||
|
||||
n = sscanf(params,"%s %ms",varname,&varval);
|
||||
for ( i=0 ; telnetparams.CmdParsers[moduleindex].var[i].varvalptr != NULL ; i++)
|
||||
{
|
||||
if ( strncasecmp(telnetparams.CmdParsers[moduleindex].var[i].varname,varname,strlen(telnetparams.CmdParsers[moduleindex].var[i].varname)) == 0)
|
||||
@@ -330,7 +383,10 @@ char varval[TELNET_CMD_MAXSIZE];
|
||||
switch(telnetparams.CmdParsers[moduleindex].var[i].vartype)
|
||||
{
|
||||
case TELNET_VARTYPE_INT32:
|
||||
client_printf("%i\n",*(int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
|
||||
client_printf("%i\n",*(int32_t *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
|
||||
break;
|
||||
case TELNET_VARTYPE_INT64:
|
||||
client_printf("%lli\n",*(int64_t *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
|
||||
break;
|
||||
case TELNET_VARTYPE_INT16:
|
||||
client_printf("%hi\n",*(short *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
|
||||
@@ -338,8 +394,8 @@ char varval[TELNET_CMD_MAXSIZE];
|
||||
case TELNET_VARTYPE_DOUBLE:
|
||||
client_printf("%g\n",*(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
|
||||
break;
|
||||
case TELNET_VARTYPE_PTR:
|
||||
client_printf("0x%08x\n",*((unsigned int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr)));
|
||||
case TELNET_VARTYPE_STRING:
|
||||
client_printf("\"%s\"\n",*(char **)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
|
||||
break;
|
||||
default:
|
||||
client_printf("unknown type\n");
|
||||
@@ -364,6 +420,10 @@ char varval[TELNET_CMD_MAXSIZE];
|
||||
case TELNET_VARTYPE_DOUBLE:
|
||||
*(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr) = strtod(varval,NULL);
|
||||
client_printf("%g\n",*(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
|
||||
break;
|
||||
case TELNET_VARTYPE_STRING:
|
||||
sprintf(*(char **)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr),"%s", varval);
|
||||
client_printf("\"%s\"\n",*(char **)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
|
||||
break;
|
||||
default:
|
||||
client_printf("unknown type\n");
|
||||
@@ -372,6 +432,9 @@ char varval[TELNET_CMD_MAXSIZE];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (n>1 && varval != NULL) {
|
||||
free(varval);
|
||||
}
|
||||
return CMDSTATUS_VARNOTFOUND;
|
||||
}
|
||||
/*----------------------------------------------------------------------------------------------------*/
|
||||
@@ -515,13 +578,14 @@ if(listen(sock, 1) == -1)
|
||||
fprintf(stderr,"[TELNETSRV] Error %s on listen call\n",strerror(errno));
|
||||
|
||||
|
||||
using_history();
|
||||
|
||||
printf("\nInitializing telnet server...\n");
|
||||
while( (telnetparams.new_socket = accept(sock, &cli_addr, &cli_len)) )
|
||||
{
|
||||
printf("[TELNETSRV] Telnet client connected....\n");
|
||||
|
||||
|
||||
read_history(telnetparams.histfile);
|
||||
stifle_history(telnetparams.histsize);
|
||||
if(telnetparams.new_socket < 0)
|
||||
fprintf(stderr,"[TELNETSRV] Error %s on accept call\n",strerror(errno));
|
||||
|
||||
@@ -548,31 +612,43 @@ while( (telnetparams.new_socket = accept(sock, &cli_addr, &cli_len)) )
|
||||
break;
|
||||
}
|
||||
if (telnetparams.telnetdbg > 0)
|
||||
printf("[TELNETSRV] Command received: readc %i filled %i %s\n", readc, filled ,buf);
|
||||
if (strlen(buf) >= 2 )
|
||||
printf("[TELNETSRV] Command received: readc %i filled %i \"%s\"\n", readc, filled ,buf);
|
||||
if (buf[0] == '!') {
|
||||
if (buf[1] == '!') {
|
||||
sprintf(buf,"%s","telnet history list");
|
||||
} else {
|
||||
HIST_ENTRY *hisentry = history_get(strtol(buf+1,NULL,0));
|
||||
if (hisentry) {
|
||||
char msg[TELNET_MAX_MSGLENGTH + sizeof(TELNET_PROMPT) +10];
|
||||
sprintf(buf,"%s",hisentry->line);
|
||||
sprintf(msg,"%s %s\n",TELNET_PROMPT, hisentry->line);
|
||||
send(telnetparams.new_socket, msg, strlen(msg), MSG_NOSIGNAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (strlen(buf) > 2 )
|
||||
{
|
||||
status=process_command(buf);
|
||||
}
|
||||
else
|
||||
status=CMDSTATUS_NOCMD;
|
||||
|
||||
if (status != CMDSTATUS_EXIT)
|
||||
{
|
||||
if (status == CMDSTATUS_NOTFOUND)
|
||||
{
|
||||
if (status != CMDSTATUS_EXIT) {
|
||||
if (status == CMDSTATUS_NOTFOUND) {
|
||||
char msg[TELNET_MAX_MSGLENGTH + 50];
|
||||
sprintf(msg,"Error: \n %s\n is not a softmodem command\n",buf);
|
||||
send(telnetparams.new_socket, msg, strlen(msg), MSG_NOSIGNAL);
|
||||
}
|
||||
} else if (status == CMDSTATUS_FOUND) {
|
||||
add_history(buf);
|
||||
}
|
||||
send(telnetparams.new_socket, TELNET_PROMPT, sizeof(TELNET_PROMPT), MSG_NOSIGNAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
printf ("[TELNETSRV] Closing telnet connection...\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
write_history(telnetparams.histfile);
|
||||
clear_history();
|
||||
close(telnetparams.new_socket);
|
||||
printf ("[TELNETSRV] Telnet server waitting for connection...\n");
|
||||
}
|
||||
@@ -588,7 +664,7 @@ return;
|
||||
*/
|
||||
void exec_moduleinit(char *modname)
|
||||
{
|
||||
void (*fptr)();
|
||||
void (*fptr)(void);
|
||||
char initfunc[TELNET_CMD_MAXSIZE+9];
|
||||
|
||||
if (strlen(modname) > TELNET_CMD_MAXSIZE)
|
||||
@@ -609,23 +685,26 @@ char initfunc[TELNET_CMD_MAXSIZE+9];
|
||||
}
|
||||
}
|
||||
|
||||
int add_embeddedmodules()
|
||||
int add_embeddedmodules(void)
|
||||
{
|
||||
|
||||
int ret=0;
|
||||
|
||||
|
||||
|
||||
for(int i=0; i<telnetoptions[TELNETSRV_STATICMOD].numelt;i++)
|
||||
{
|
||||
ret++;
|
||||
exec_moduleinit(telnetoptions[TELNETSRV_STATICMOD].strlistptr[i]);
|
||||
}
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
int add_sharedmodules()
|
||||
int add_sharedmodules(void)
|
||||
{
|
||||
char initfunc[TELNET_CMD_MAXSIZE+9];
|
||||
void (*fptr)();
|
||||
|
||||
void (*fptr)(void);
|
||||
int ret=0;
|
||||
|
||||
for(int i=0; i<telnetoptions[TELNETSRV_SHRMOD].numelt;i++)
|
||||
{
|
||||
@@ -634,22 +713,23 @@ void (*fptr)();
|
||||
if ( fptr != NULL)
|
||||
{
|
||||
fptr();
|
||||
ret++;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"[TELNETSRV] couldn't find %s for module %s \n",initfunc,telnetoptions[TELNETSRV_STATICMOD].strlistptr[i]);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int init_telnetsrv(char *cfgfile)
|
||||
int telnetsrv_autoinit(void)
|
||||
{
|
||||
void *lib_handle;
|
||||
char** moduleslist;
|
||||
|
||||
|
||||
memset(&telnetparams,0,sizeof(telnetparams));
|
||||
|
||||
config_get( telnetoptions,sizeof(telnetoptions)/sizeof(paramdef_t),NULL);
|
||||
config_get( telnetoptions,sizeof(telnetoptions)/sizeof(paramdef_t),"telnetsrv");
|
||||
|
||||
|
||||
if(pthread_create(&telnetparams.telnet_pthread,NULL, (void *(*)(void *))run_telnetsrv, NULL) != 0)
|
||||
@@ -691,6 +771,26 @@ int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmdde
|
||||
}
|
||||
|
||||
|
||||
/* function which will be called by the shared lib loader, to check shared lib version
|
||||
against main exec version. version mismatch no considered as fatal (interfaces not supposed to change)
|
||||
*/
|
||||
int telnetsrv_checkbuildver(char * mainexec_buildversion, char ** shlib_buildversion)
|
||||
{
|
||||
#ifndef PACKAGE_VERSION
|
||||
#define PACKAGE_VERSION "standalone built: " __DATE__ __TIME__
|
||||
#endif
|
||||
*shlib_buildversion = PACKAGE_VERSION;
|
||||
if (strcmp(mainexec_buildversion, *shlib_buildversion) != 0) {
|
||||
fprintf(stderr,"[TELNETSRV] shared lib version %s, doesn't match main version %s, compatibility should be checked\n",
|
||||
mainexec_buildversion,*shlib_buildversion);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int telnetsrv_getfarray(loader_shlibfunc_t **farray)
|
||||
{
|
||||
*farray=malloc(sizeof(loader_shlibfunc_t));
|
||||
(*farray)[0].fname=TELNET_ADDCMD_FNAME;
|
||||
(*farray)[0].fptr=(int (*)(void) )add_telnetcmd;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -18,7 +18,6 @@
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file common/utils/telnetsrv/telnetsrv.h
|
||||
* \brief: include file for telnet server implementation
|
||||
* \author Francois TABURET
|
||||
@@ -38,7 +37,7 @@
|
||||
#define TELNET_MAX_MSGLENGTH 2048
|
||||
#define TELNET_PROMPT "softmodem> "
|
||||
#define TELNET_MAXCMD 20
|
||||
#define TELNET_CMD_MAXSIZE 10
|
||||
#define TELNET_CMD_MAXSIZE 20
|
||||
#define TELNET_HELPSTR_SIZE 80
|
||||
|
||||
/* status return by the command parser after it analysed user input */
|
||||
@@ -70,7 +69,7 @@ typedef struct cmddef {
|
||||
#define TELNET_VARTYPE_INT64 3
|
||||
#define TELNET_VARTYPE_STRING 4
|
||||
#define TELNET_VARTYPE_DOUBLE 5
|
||||
#define TELNET_VARTYPE_PTR 6
|
||||
//#define TELNET_VARTYPE_PTR 6
|
||||
typedef struct variabledef {
|
||||
char varname[TELNET_CMD_MAXSIZE];
|
||||
char vartype;
|
||||
@@ -96,6 +95,8 @@ typedef struct {
|
||||
pthread_t telnet_pthread; // thread id of the telnet server
|
||||
int telnetdbg; // debug level of the server
|
||||
int priority; // server running priority
|
||||
char *histfile; // command history
|
||||
int histsize; // command history length
|
||||
int new_socket; // socket of the client connection
|
||||
int logfilefd; // file id of the log file when log output is redirected to a file
|
||||
int saved_stdout; // file id of the previous stdout, used to be able to restore original stdout
|
||||
@@ -130,10 +131,12 @@ VT escape sequence definition, for smarter display....
|
||||
#define STDFMT "\x1b[0m"
|
||||
|
||||
/*---------------------------------------------------------------------------------------------*/
|
||||
#define TELNET_ADDCMD_FNAME "add_telnetcmd"
|
||||
typedef int(*add_telnetcmd_func_t)(char *, telnetshell_vardef_t *, telnetshell_cmddef_t *);
|
||||
#ifdef TELNETSERVERCODE
|
||||
int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd);
|
||||
void set_sched(pthread_t tid, int pid,int priority);
|
||||
void set_affinity(pthread_t tid, int pid, int coreid);
|
||||
extern int get_phybsize();
|
||||
extern int get_phybsize(void);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
|
||||
|
||||
set(TELNETROOT ${OPENAIR_DIR}/common/utils/telnetsrv )
|
||||
|
||||
|
||||
|
||||
set(TELNETSRV_SOURCE
|
||||
${TELNETROOT}/telnetsrv.c
|
||||
${TELNETROOT}/telnetsrv_phycmd.c
|
||||
${TELNETROOT}/telnetsrv_proccmd.c
|
||||
${TELNETROOT}/telnetsrv_loader.c
|
||||
)
|
||||
|
||||
#set(TELNETSRV_ETHDEVCMD_SOURCE
|
||||
# ${APPROOT}/telnetsrv/telnetsrv_ethdevcmd.c
|
||||
# )
|
||||
|
||||
|
||||
|
||||
add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} )
|
||||
#add_library(telnetsrv_ethdevcmd MODULE ${TELNETSRV_ETHDEVCMD_SOURCE} )
|
||||
target_link_libraries(telnetsrv PRIVATE history)
|
||||
|
||||
install(TARGETS telnetsrv DESTINATION bin)
|
||||
|
||||
if (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build")
|
||||
install(TARGETS telnetsrv DESTINATION ${OPENAIR_BUILD_DIR}/lte_build_oai/build)
|
||||
endif (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build")
|
||||
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file common/utils/telnetsrv/telnetsrv_loader.c
|
||||
* \brief: implementation of telnet commands related to softmodem linux process
|
||||
* \author Francois TABURET
|
||||
* \date 2018
|
||||
* \version 0.1
|
||||
* \company NOKIA BellLabs France
|
||||
* \email: francois.taburet@nokia-bell-labs.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
|
||||
#define TELNETSERVERCODE
|
||||
#include "telnetsrv.h"
|
||||
#define TELNETSRV_LOADER_MAIN
|
||||
#include "telnetsrv_loader.h"
|
||||
|
||||
|
||||
int loader_show_cmd(char *buff, int debug, telnet_printfunc_t prnt);
|
||||
telnetshell_cmddef_t loader_cmdarray[] = {
|
||||
{"show","[params,modules]",loader_show_cmd},
|
||||
{"","",NULL},
|
||||
};
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------------------*/
|
||||
int loader_show_cmd(char *buff, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (debug > 0)
|
||||
prnt( "loader_show_cmd received %s\n",buff);
|
||||
|
||||
if (strcasestr(buff,"params") != NULL) {
|
||||
prnt( "loader parameters:\n");
|
||||
prnt( " Main executable build version: \"%s\"\n", loader_data.mainexec_buildversion);
|
||||
prnt( " Default shared lib path: \"%s\"\n", loader_data.shlibpath);
|
||||
prnt( " Max number of shared lib : %i\n", loader_data.maxshlibs);
|
||||
}
|
||||
else if (strcasestr(buff,"modules") != NULL) {
|
||||
prnt( "%i shared lib have been dynamicaly loaded by the oai loader\n", loader_data.numshlibs);
|
||||
for (int i=0 ; i<loader_data.numshlibs ; i++) {
|
||||
prnt( " Module %i: %s\n", i,loader_data.shlibs[i].name);
|
||||
prnt( " Shared library build version: \"%s\"\n",((loader_data.shlibs[i].shlib_buildversion == NULL )?"":loader_data.shlibs[i].shlib_buildversion));
|
||||
prnt( " Shared library path: \"%s\"\n", loader_data.shlibs[i].thisshlib_path);
|
||||
prnt( " %i function pointers registered:\n", loader_data.shlibs[i].numfunc);
|
||||
for(int j=0 ; j<loader_data.shlibs[i].numfunc;j++) {
|
||||
prnt( " function %i %s at %p\n",j,
|
||||
loader_data.shlibs[i].funcarray[j].fname, loader_data.shlibs[i].funcarray[j].fptr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
prnt("%s: wrong loader command...\n",buff);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void add_loader_cmds(void)
|
||||
{
|
||||
|
||||
add_telnetcmd("loader", loader_globalvardef, loader_cmdarray);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file common/utils/telnetsrv_proccmd.h
|
||||
* \brief: Include file defining telnet commands related to softmodem linux process
|
||||
* \author Francois TABURET
|
||||
* \date 2018
|
||||
* \version 0.1
|
||||
* \company NOKIA BellLabs France
|
||||
* \email: francois.taburet@nokia-bell-labs.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#ifdef TELNETSRV_LOADER_MAIN
|
||||
|
||||
#include "UTIL/LOG/log.h"
|
||||
|
||||
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
|
||||
|
||||
telnetshell_vardef_t loader_globalvardef[] = {
|
||||
{"mainversion",TELNET_VARTYPE_STRING,&(loader_data.mainexec_buildversion)},
|
||||
{"defpath",TELNET_VARTYPE_STRING,&(loader_data.shlibpath)},
|
||||
{"maxshlibs",TELNET_VARTYPE_INT32,&(loader_data.maxshlibs)},
|
||||
{"numshlibs",TELNET_VARTYPE_INT32,&(loader_data.numshlibs)},
|
||||
{"",0,NULL}
|
||||
};
|
||||
telnetshell_vardef_t *loader_modulesvardef;
|
||||
|
||||
extern void add_loader_cmds(void);
|
||||
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------------------*/
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -41,7 +41,7 @@
|
||||
char *prnbuff;
|
||||
extern int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length);
|
||||
|
||||
void init_phytelnet()
|
||||
void init_phytelnet(void)
|
||||
{
|
||||
prnbuff=malloc(get_phybsize() );
|
||||
if (prnbuff == NULL)
|
||||
@@ -134,7 +134,7 @@ telnetshell_cmddef_t phy_cmdarray[] = {
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------------------*/
|
||||
void add_phy_cmds()
|
||||
void add_phy_cmds(void)
|
||||
{
|
||||
|
||||
init_phytelnet();
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -42,8 +42,6 @@
|
||||
#define TELNETVAR_PHYCC1 1
|
||||
|
||||
telnetshell_vardef_t phy_vardef[] = {
|
||||
{"phycc1",TELNET_VARTYPE_PTR,NULL},
|
||||
{"phycc2",TELNET_VARTYPE_PTR,NULL},
|
||||
//{"iqmax",TELNET_VARTYPE_INT16,NULL},
|
||||
//{"iqmin",TELNET_VARTYPE_INT16,NULL},
|
||||
//{"loglvl",TELNET_VARTYPE_INT32,NULL},
|
||||
@@ -57,7 +55,7 @@ telnetshell_vardef_t phy_vardef[] = {
|
||||
|
||||
#else
|
||||
|
||||
extern void add_phy_cmds();
|
||||
extern void add_phy_cmds(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -54,6 +54,8 @@
|
||||
#define TELNETSRV_PROCCMD_MAIN
|
||||
#include "log.h"
|
||||
#include "log_extern.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "openair1/PHY/extern.h"
|
||||
#include "telnetsrv_proccmd.h"
|
||||
|
||||
void decode_procstat(char *record, int debug, telnet_printfunc_t prnt)
|
||||
@@ -70,14 +72,13 @@ char toksep[2];
|
||||
lptr= prntline;
|
||||
/*http://man7.org/linux/man-pages/man5/proc.5.html gives the structure of the stat file */
|
||||
|
||||
while( procfile_fiels != NULL && fieldcnt < 42)
|
||||
{
|
||||
while( procfile_fiels != NULL && fieldcnt < 42) {
|
||||
long int policy;
|
||||
if (strlen(procfile_fiels) == 0)
|
||||
continue;
|
||||
fieldcnt++;
|
||||
sprintf(toksep," ");
|
||||
switch(fieldcnt)
|
||||
{
|
||||
switch(fieldcnt) {
|
||||
case 1: /* id */
|
||||
lptr+=sprintf(lptr,"%9.9s ",procfile_fiels);
|
||||
sprintf(toksep,")");
|
||||
@@ -104,12 +105,36 @@ char toksep[2];
|
||||
break;
|
||||
case 41: //policy
|
||||
lptr+=sprintf(lptr,"%3.3s ",procfile_fiels);
|
||||
policy=strtol(procfile_fiels,NULL,0);
|
||||
switch(policy) {
|
||||
case SCHED_FIFO:
|
||||
lptr+=sprintf(lptr,"%s ","rt: fifo");
|
||||
break;
|
||||
case SCHED_OTHER:
|
||||
lptr+=sprintf(lptr,"%s ","other");
|
||||
break;
|
||||
case SCHED_IDLE:
|
||||
lptr+=sprintf(lptr,"%s ","idle");
|
||||
break;
|
||||
case SCHED_BATCH:
|
||||
lptr+=sprintf(lptr,"%s ","batch");
|
||||
break;
|
||||
case SCHED_RR:
|
||||
lptr+=sprintf(lptr,"%s ","rt: rr");
|
||||
break;
|
||||
case SCHED_DEADLINE:
|
||||
lptr+=sprintf(lptr,"%s ","rt: deadline");
|
||||
break;
|
||||
default:
|
||||
lptr+=sprintf(lptr,"%s ","????");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}/* switch on fieldcnr */
|
||||
}/* switch on fieldcnr */
|
||||
procfile_fiels =strtok_r(NULL,toksep,&strtokptr);
|
||||
} /* while on proc_fields != NULL */
|
||||
} /* while on proc_fields != NULL */
|
||||
prnt("%s\n",prntline);
|
||||
} /*decode_procstat */
|
||||
|
||||
@@ -141,7 +166,7 @@ char aname[256];
|
||||
DIR *proc_dir;
|
||||
struct dirent *entry;
|
||||
|
||||
int rt;
|
||||
|
||||
|
||||
prnt(" id name state USRmod KRNmod prio nice vsize proc pol \n\n");
|
||||
snprintf(aname, sizeof(aname), "/proc/%d/stat", getpid());
|
||||
@@ -172,14 +197,51 @@ extern log_t *g_log;
|
||||
|
||||
if (debug > 0)
|
||||
prnt(" proccmd_show received %s\n",buf);
|
||||
if (strcasestr(buf,"thread") != NULL)
|
||||
{
|
||||
if (strcasestr(buf,"thread") != NULL) {
|
||||
print_threads(buf,debug,prnt);
|
||||
}
|
||||
}
|
||||
if (strcasestr(buf,"loglvl") != NULL) {
|
||||
for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++){
|
||||
prnt("\t%s:\t%s\t%s\n",g_log->log_component[i].name, map_int_to_str(log_verbosity_names,g_log->log_component[i].flag),
|
||||
map_int_to_str(log_level_names,g_log->log_component[i].level));
|
||||
prnt("component verbosity level enabled\n");
|
||||
for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
|
||||
prnt("%02i %17.17s:%10.10s%10.10s %s\n",i ,g_log->log_component[i].name,
|
||||
map_int_to_str(log_verbosity_names,g_log->log_component[i].flag),
|
||||
map_int_to_str(log_level_names,g_log->log_component[i].level),
|
||||
((g_log->log_component[i].interval>0)?"Y":"N") );
|
||||
}
|
||||
}
|
||||
if (strcasestr(buf,"config") != NULL) {
|
||||
prnt("Command line arguments:\n");
|
||||
for (int i=0; i < config_get_if()->argc; i++) {
|
||||
prnt(" %02i %s\n",i ,config_get_if()->argv[i]);
|
||||
}
|
||||
prnt("Config module flags ( -O <cfg source>:<xxx>:dbgl<flags>): 0x%08x\n", config_get_if()->rtflags);
|
||||
|
||||
prnt(" Print config debug msg, params values (flag %u): %s\n",CONFIG_PRINTPARAMS,
|
||||
((config_get_if()->rtflags & CONFIG_PRINTPARAMS) ? "Y" : "N") );
|
||||
prnt(" Print config debug msg, memory management(flag %u): %s\n",CONFIG_DEBUGPTR,
|
||||
((config_get_if()->rtflags & CONFIG_DEBUGPTR) ? "Y" : "N") );
|
||||
prnt(" Print config debug msg, command line processing (flag %u): %s\n",CONFIG_DEBUGCMDLINE,
|
||||
((config_get_if()->rtflags & CONFIG_DEBUGCMDLINE) ? "Y" : "N") );
|
||||
prnt(" Don't exit if param check fails (flag %u): %s\n",CONFIG_NOABORTONCHKF,
|
||||
((config_get_if()->rtflags & CONFIG_NOABORTONCHKF) ? "Y" : "N") );
|
||||
prnt("Config source: %s, parameters:\n",CONFIG_GETSOURCE );
|
||||
for (int i=0; i < config_get_if()->num_cfgP; i++) {
|
||||
prnt(" %02i %s\n",i ,config_get_if()->cfgP[i]);
|
||||
}
|
||||
prnt("Softmodem components:\n");
|
||||
prnt(" %02i Ru(s)\n", RC.nb_RU);
|
||||
prnt(" %02i lte RRc(s), %02i NbIoT RRC(s)\n", RC.nb_inst, RC.nb_nb_iot_rrc_inst);
|
||||
prnt(" %02i lte MACRLC(s), %02i NbIoT MACRLC(s)\n", RC.nb_macrlc_inst, RC.nb_nb_iot_macrlc_inst);
|
||||
prnt(" %02i lte L1, %02i NbIoT L1\n", RC.nb_L1_inst, RC.nb_nb_iot_L1_inst);
|
||||
|
||||
for(int i=0; i<RC.nb_inst; i++) {
|
||||
prnt(" lte RRC %i: %02i CC(s) \n",i,((RC.nb_CC == NULL)?0:RC.nb_CC[i]));
|
||||
}
|
||||
for(int i=0; i<RC.nb_L1_inst; i++) {
|
||||
prnt(" lte L1 %i: %02i CC(s)\n",i,((RC.nb_L1_CC == NULL)?0:RC.nb_L1_CC[i]));
|
||||
}
|
||||
for(int i=0; i<RC.nb_macrlc_inst; i++) {
|
||||
prnt(" lte macrlc %i: %02i CC(s)\n",i,((RC.nb_mac_CC == NULL)?0:RC.nb_mac_CC[i]));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -190,12 +252,16 @@ int proccmd_thread(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
int bv1,bv2;
|
||||
int res;
|
||||
char sv1[64];
|
||||
char tname[32];
|
||||
|
||||
bv1=0;
|
||||
bv2=0;
|
||||
sv1[0]=0;
|
||||
if (debug > 0)
|
||||
prnt("proccmd_thread received %s\n",buf);
|
||||
if (strcasestr(buf,"help") != NULL) {
|
||||
prnt(PROCCMD_THREAD_HELP_STRING);
|
||||
return 0;
|
||||
}
|
||||
res=sscanf(buf,"%i %9s %i",&bv1,sv1,&bv2);
|
||||
if (debug > 0)
|
||||
prnt(" proccmd_thread: %i params = %i,%s,%i\n",res,bv1,sv1,bv2);
|
||||
@@ -231,32 +297,95 @@ extern void exit_fun(const char* s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int proccmd_log(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
int idx1=0;
|
||||
int idx2=NUM_LOG_LEVEL-1;
|
||||
int s = sscanf(buf,"%*s %i-%i",&idx1,&idx2);
|
||||
char *logsubcmd=NULL;
|
||||
|
||||
int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
|
||||
|
||||
if (debug > 0)
|
||||
prnt("process module received %s\n",buf);
|
||||
prnt( "proccmd_log received %s\n s=%i sub command %s\n",buf,s,((logsubcmd==NULL)?"":logsubcmd));
|
||||
|
||||
if (s == 1 && logsubcmd != NULL) {
|
||||
if (strcasestr(logsubcmd,"online") != NULL) {
|
||||
if (strcasestr(buf,"noonline") != NULL) {
|
||||
set_glog_onlinelog(0);
|
||||
prnt("online logging disabled\n",buf);
|
||||
} else {
|
||||
set_glog_onlinelog(1);
|
||||
prnt("online logging enabled\n",buf);
|
||||
}
|
||||
}
|
||||
else if (strcasestr(logsubcmd,"show") != NULL) {
|
||||
prnt("Available log levels: \n ");
|
||||
for (int i=0; log_level_names[i].name != NULL; i++)
|
||||
prnt("%s ",log_level_names[i].name);
|
||||
prnt("\nAvailable verbosity: \n ");
|
||||
for (int i=0; log_verbosity_names[i].name != NULL; i++)
|
||||
prnt("%s ",log_verbosity_names[i].name);
|
||||
prnt("\n");
|
||||
proccmd_show("loglvl",debug,prnt);
|
||||
}
|
||||
else if (strcasestr(logsubcmd,"help") != NULL) {
|
||||
prnt(PROCCMD_LOG_HELP_STRING);
|
||||
} else {
|
||||
prnt("%s: wrong log command...\n",logsubcmd);
|
||||
}
|
||||
} else if ( s == 3 && logsubcmd != NULL) {
|
||||
int level, verbosity, interval;
|
||||
char *tmpstr=NULL;
|
||||
char *logparam=NULL;
|
||||
int l;
|
||||
|
||||
level = verbosity = interval = -1;
|
||||
l=sscanf(logsubcmd,"%m[^'_']_%m[^'_']",&logparam,&tmpstr);
|
||||
if (debug > 0)
|
||||
prnt("l=%i, %s %s\n",l,((logparam==NULL)?"\"\"":logparam), ((tmpstr==NULL)?"\"\"":tmpstr));
|
||||
if (l ==2 ) {
|
||||
if (strcmp(logparam,"level") == 0) {
|
||||
level=map_str_to_int(log_level_names,tmpstr);
|
||||
if (level < 0) prnt("level %s unknown\n",tmpstr);
|
||||
} else if (strcmp(logparam,"verbos") == 0) {
|
||||
verbosity=map_str_to_int(log_verbosity_names,tmpstr);
|
||||
if (verbosity < 0) prnt("verbosity %s unknown\n",tmpstr);
|
||||
} else {
|
||||
prnt("%s%s unknown log sub command \n",logparam, tmpstr);
|
||||
}
|
||||
} else if (l ==1 ) {
|
||||
if (strcmp(logparam,"enable") == 0) {
|
||||
interval = 1;
|
||||
} else if (strcmp(logparam,"disable") == 0) {
|
||||
interval = 0;
|
||||
} else {
|
||||
prnt("%s%s unknown log sub command \n",logparam, tmpstr);
|
||||
}
|
||||
} else {
|
||||
prnt("%s unknown log sub command \n",logsubcmd);
|
||||
}
|
||||
if (logparam != NULL) free(logparam);
|
||||
if (tmpstr != NULL) free(tmpstr);
|
||||
for (int i=idx1; i<=idx2 ; i++) {
|
||||
set_comp_log(i, level, verbosity, interval);
|
||||
prnt("log level/verbosity comp %i %s set to %s / %s (%s)\n",
|
||||
i,((g_log->log_component[i].name==NULL)?"":g_log->log_component[i].name),
|
||||
map_int_to_str(log_level_names,g_log->log_component[i].level),
|
||||
map_int_to_str(log_verbosity_names,g_log->log_component[i].flag),
|
||||
((g_log->log_component[i].interval>0)?"enabled":"disabled"));
|
||||
|
||||
|
||||
}
|
||||
} else {
|
||||
prnt("%s: wrong log command...\n",buf);
|
||||
}
|
||||
|
||||
if (strcasestr(buf,"enable") != NULL)
|
||||
{
|
||||
set_glog_onlinelog(1);
|
||||
}
|
||||
if (strcasestr(buf,"disable") != NULL)
|
||||
{
|
||||
set_glog_onlinelog(0);
|
||||
}
|
||||
if (strcasestr(buf,"show") != NULL)
|
||||
{
|
||||
proccmd_show("loglvl",debug,prnt);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*-------------------------------------------------------------------------------------*/
|
||||
|
||||
void add_softmodem_cmds()
|
||||
void add_softmodem_cmds(void)
|
||||
{
|
||||
add_telnetcmd("softmodem",proc_vardef,proc_cmdarray);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -19,6 +19,7 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
|
||||
/*! \file common/utils/telnetsrv/telnetsrv_proccmd.h
|
||||
* \brief: Include file defining telnet commands related to this linux process
|
||||
* \author Francois TABURET
|
||||
@@ -43,15 +44,33 @@ extern int proccmd_log(char *buf, int debug, telnet_printfunc_t prnt);
|
||||
telnetshell_vardef_t proc_vardef[] = {
|
||||
{"",0,NULL}
|
||||
};
|
||||
#define PROCCMD_LOG_HELP_STRING " log sub commands: \n\
|
||||
show: display current log configuration \n\
|
||||
online, noonline: enable or disable console logs \n\
|
||||
enable, disable id1-id2: enable or disable logs for components index id1 to id2 \n\
|
||||
level_<level> id1-id2: set log level to <level> for components index id1 to id2 \n\
|
||||
level_<verbosity> id1-id2: set log verbosity to <verbosity> for components index id1 to id2 \n\
|
||||
use the show command to get the values for <level>, <verbosity> and the list of component indexes \
|
||||
that can be used for id1 and id2 \n"
|
||||
|
||||
#define PROCCMD_THREAD_HELP_STRING " thread sub commands: \n\
|
||||
<thread id> aff <core> : set affinity of thread <thread id> to core <core> \n\
|
||||
<thread id> prio <prio> : set scheduling parameters for thread <thread id> \n\
|
||||
if prio < -20: linux scheduling policy set to FIFO, \n\
|
||||
with priority = -20 - prio \n\
|
||||
if prio > 19: linux scheduling policy set to OTHER, \n\
|
||||
with priority (nice value) = prio \n\
|
||||
use \"softmodem show thread\" to get <thread id> \n"
|
||||
|
||||
|
||||
telnetshell_cmddef_t proc_cmdarray[] = {
|
||||
{"show","loglvl|thread", proccmd_show},
|
||||
{"log","[enable,disable]", proccmd_log},
|
||||
{"thread","<id> aff|prio <aff|prio>", proccmd_thread},
|
||||
{"show","loglvl|thread|config", proccmd_show},
|
||||
{"log","(enter help for details)", proccmd_log},
|
||||
{"thread","(enter help for details)", proccmd_thread},
|
||||
{"exit","", proccmd_exit},
|
||||
{"","",NULL},
|
||||
};
|
||||
#else
|
||||
extern void add_proccmd_cmds();
|
||||
extern void add_proccmd_cmds(void);
|
||||
#endif /* TELNETSRV_PROCCMD_MAIN */
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#if !defined(NFAPI_PNF_H__)
|
||||
#define NFAPI_PNF_H__
|
||||
|
||||
int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
|
||||
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -27,7 +27,9 @@
|
||||
#ifndef TC_MAIN
|
||||
//#include "defs.h"
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include "PHY/CODING/defs.h"
|
||||
#include "extern_3GPPinterleaver.h"
|
||||
|
||||
//#define DEBUG_TURBO_ENCODER 1
|
||||
@@ -35,7 +37,7 @@
|
||||
uint32_t threegpplte_interleaver_output;
|
||||
uint32_t threegpplte_interleaver_tmp;
|
||||
|
||||
inline void threegpplte_interleaver_reset()
|
||||
inline void threegpplte_interleaver_reset(void)
|
||||
{
|
||||
threegpplte_interleaver_output = 0;
|
||||
threegpplte_interleaver_tmp = 0;
|
||||
@@ -82,7 +84,7 @@ uint8_t output_lut[16],state_lut[16];
|
||||
inline uint8_t threegpplte_rsc_lut(uint8_t input,uint8_t *state)
|
||||
{
|
||||
|
||||
uint8_t output;
|
||||
|
||||
uint8_t off;
|
||||
|
||||
off = (*state<<1)|input;
|
||||
@@ -146,7 +148,7 @@ void threegpplte_turbo_encoder(uint8_t *input,
|
||||
for (i=0; f1f2mat[i].nb_bits!= input_length_bits && i <188; i++);
|
||||
|
||||
if ( i == 188 ) {
|
||||
msg("Illegal frame length!\n");
|
||||
printf("Illegal frame length!\n");
|
||||
return;
|
||||
} else {
|
||||
base_interleaver=il_tb+f1f2mat[i].beg_index;
|
||||
|
||||
@@ -96,7 +96,7 @@ static inline void threegpplte_rsc_termination(unsigned char *x,unsigned char *z
|
||||
*state = (*state)>>1;
|
||||
}
|
||||
|
||||
void treillis_table_init(void)
|
||||
static void treillis_table_init(void)
|
||||
{
|
||||
//struct treillis t[][]=all_treillis;
|
||||
//t=memalign(16,sizeof(struct treillis)*8*256);
|
||||
@@ -536,12 +536,12 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns
|
||||
}
|
||||
*/
|
||||
|
||||
void threegpplte_turbo_encoder(unsigned char *input,
|
||||
unsigned short input_length_bytes,
|
||||
unsigned char *output,
|
||||
unsigned char F,
|
||||
unsigned short interleaver_f1,
|
||||
unsigned short interleaver_f2)
|
||||
void threegpplte_turbo_encoder_sse(unsigned char *input,
|
||||
unsigned short input_length_bytes,
|
||||
unsigned char *output,
|
||||
unsigned char F,
|
||||
unsigned short interleaver_f1,
|
||||
unsigned short interleaver_f2)
|
||||
{
|
||||
|
||||
int i;
|
||||
@@ -641,7 +641,24 @@ void threegpplte_turbo_encoder(unsigned char *input,
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void init_encoder_sse (void) {
|
||||
treillis_table_init();
|
||||
}
|
||||
/* function which will be called by the shared lib loader, to check shared lib version
|
||||
against main exec version. version mismatch no considered as fatal (interfaces not supposed to change)
|
||||
*/
|
||||
int coding_checkbuildver(char * mainexec_buildversion, char ** shlib_buildversion)
|
||||
{
|
||||
#ifndef PACKAGE_VERSION
|
||||
#define PACKAGE_VERSION "standalone built: " __DATE__ __TIME__
|
||||
#endif
|
||||
*shlib_buildversion = PACKAGE_VERSION;
|
||||
if (strcmp(mainexec_buildversion, *shlib_buildversion) != 0) {
|
||||
fprintf(stderr,"[CODING] shared lib version %s, doesn't match main version %s, compatibility should be checked\n",
|
||||
mainexec_buildversion,*shlib_buildversion);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef TC_MAIN
|
||||
#define INPUT_LENGTH 20
|
||||
@@ -679,7 +696,7 @@ int main(int argc,char **argv)
|
||||
printf("Input %d : %d\n",i,input[i]);
|
||||
}
|
||||
|
||||
threegpplte_turbo_encoder(&input[0],
|
||||
threegpplte_turbo_encoder_sse(&input[0],
|
||||
INPUT_LENGTH,
|
||||
&output[0],
|
||||
0,
|
||||
|
||||
@@ -550,7 +550,7 @@ void compute_alpha_s(llr_t* alpha,llr_t* m_11,llr_t* m_10,unsigned short frame_l
|
||||
|
||||
void compute_beta_s(llr_t* beta,llr_t *m_11,llr_t* m_10,llr_t* alpha,unsigned short frame_length,unsigned char F)
|
||||
{
|
||||
int k,i;
|
||||
int k;
|
||||
llr_t old0, old1, old2, old3, old4, old5, old6, old7;
|
||||
llr_t new0, new1, new2, new3, new4, new5, new6, new7;
|
||||
llr_t m_b0, m_b1, m_b2, m_b3, m_b4,m_b5, m_b6, m_b7;
|
||||
@@ -874,14 +874,22 @@ void compute_ext_s(llr_t* alpha,llr_t* beta,llr_t* m_11,llr_t* m_10,llr_t* ext,
|
||||
|
||||
|
||||
unsigned char phy_threegpplte_turbo_decoder_scalar(llr_t *y,
|
||||
llr_t *y2,
|
||||
unsigned char *decoded_bytes,
|
||||
unsigned char *decoded_bytes2,
|
||||
unsigned short n,
|
||||
unsigned short f1,
|
||||
unsigned short f2,
|
||||
unsigned char max_iterations,
|
||||
unsigned char crc_type,
|
||||
unsigned char F,
|
||||
unsigned char inst)
|
||||
time_stats_t *init_stats,
|
||||
time_stats_t *alpha_stats,
|
||||
time_stats_t *beta_stats,
|
||||
time_stats_t *gamma_stats,
|
||||
time_stats_t *ext_stats,
|
||||
time_stats_t *intl1_stats,
|
||||
time_stats_t *intl2_stats)
|
||||
{
|
||||
|
||||
/* y is a pointer to the input
|
||||
@@ -897,7 +905,7 @@ unsigned char phy_threegpplte_turbo_decoder_scalar(llr_t *y,
|
||||
unsigned char crc_len,temp;
|
||||
|
||||
if (crc_type > 3) {
|
||||
msg("Illegal crc length!\n");
|
||||
fprintf(stderr,"Illegal crc length!\n");
|
||||
return 255;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
///
|
||||
///
|
||||
|
||||
#ifdef __AVX2__
|
||||
|
||||
#include "PHY/sse_intrin.h"
|
||||
|
||||
|
||||
|
||||
#ifndef TEST_DEBUG
|
||||
#include "PHY/defs.h"
|
||||
@@ -58,6 +58,8 @@
|
||||
#include "mex.h"
|
||||
#endif
|
||||
|
||||
#ifdef __AVX2__
|
||||
#include "PHY/sse_intrin.h"
|
||||
|
||||
//#define DEBUG_LOGMAP
|
||||
|
||||
@@ -837,7 +839,7 @@ void free_td16avx2(void)
|
||||
}
|
||||
}
|
||||
|
||||
void init_td16avx2()
|
||||
void init_td16avx2(void)
|
||||
{
|
||||
|
||||
int ind,i,i2,i3,j,n,pi,pi2_i,pi2_pi;
|
||||
@@ -1408,6 +1410,36 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
|
||||
#endif
|
||||
return(iteration_cnt);
|
||||
}
|
||||
#else //__AVX2__
|
||||
unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
|
||||
int16_t *y2,
|
||||
uint8_t *decoded_bytes,
|
||||
uint8_t *decoded_bytes2,
|
||||
uint16_t n,
|
||||
uint16_t f1,
|
||||
uint16_t f2,
|
||||
uint8_t max_iterations,
|
||||
uint8_t crc_type,
|
||||
uint8_t F,
|
||||
time_stats_t *init_stats,
|
||||
time_stats_t *alpha_stats,
|
||||
time_stats_t *beta_stats,
|
||||
time_stats_t *gamma_stats,
|
||||
time_stats_t *ext_stats,
|
||||
time_stats_t *intl1_stats,
|
||||
time_stats_t *intl2_stats)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
void free_td16avx2(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void init_td16avx2(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endif //__AVX2__
|
||||
|
||||
|
||||
@@ -1124,7 +1124,7 @@ void free_td16(void)
|
||||
}
|
||||
}
|
||||
|
||||
void init_td16()
|
||||
void init_td16(void)
|
||||
{
|
||||
|
||||
int ind,i,i2,i3,j,n,pi,pi3;
|
||||
@@ -1172,7 +1172,9 @@ void init_td16()
|
||||
}
|
||||
|
||||
unsigned char phy_threegpplte_turbo_decoder16(short *y,
|
||||
short *y2,
|
||||
unsigned char *decoded_bytes,
|
||||
unsigned char *decoded_bytes2,
|
||||
unsigned short n,
|
||||
unsigned short f1,
|
||||
unsigned short f2,
|
||||
|
||||
@@ -849,7 +849,7 @@ void free_td8(void)
|
||||
|
||||
extern RAN_CONTEXT_t RC;
|
||||
|
||||
void init_td8()
|
||||
void init_td8(void)
|
||||
{
|
||||
|
||||
int ind,i,j,n,n2,pi,pi3;
|
||||
@@ -898,7 +898,9 @@ void init_td8()
|
||||
}
|
||||
|
||||
unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
||||
short y2,
|
||||
unsigned char *decoded_bytes,
|
||||
unsigned char *decoded_bytes2,
|
||||
unsigned short n,
|
||||
unsigned short f1,
|
||||
unsigned short f2,
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file openair1/PHY/CODING
|
||||
* \brief: load library implementing coding/decoding algorithms
|
||||
* \author Francois TABURET
|
||||
* \date 2017
|
||||
* \version 0.1
|
||||
* \company NOKIA BellLabs France
|
||||
* \email: francois.taburet@nokia-bell-labs.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#include <sys/types.h>
|
||||
|
||||
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
#include "common/utils/telnetsrv/telnetsrv.h"
|
||||
|
||||
static int coding_setmod_cmd(char *buff, int debug, telnet_printfunc_t prnt);
|
||||
static telnetshell_cmddef_t coding_cmdarray[] = {
|
||||
{"mode","[sse,avx2,stdc,none]",coding_setmod_cmd},
|
||||
{"","",NULL},
|
||||
};
|
||||
telnetshell_vardef_t coding_vardef[] = {
|
||||
{"maxiter",TELNET_VARTYPE_INT32,&max_turbo_iterations},
|
||||
{"",0,NULL}
|
||||
};
|
||||
/* PHY/defs.h contains MODE_DECODE_XXX macros, following table must match */
|
||||
static char *modedesc[] = {"none","sse","C","avx2"};
|
||||
static int curmode;
|
||||
/* function description array, to be used when loading the encoding/decoding shared lib */
|
||||
loader_shlibfunc_t shlib_fdesc[DECODE_NUM_FPTR];
|
||||
|
||||
/* encoding decoding functions pointers, filled here and used when encoding/decoding */
|
||||
/*defined as extern in PHY?CODING/extern.h */
|
||||
decoder_if_t decoder16;
|
||||
decoder_if_t decoder8;
|
||||
encoder_if_t encoder;
|
||||
|
||||
extern int _may_i_use_cpu_feature(unsigned __int64);
|
||||
uint8_t nodecod(short *y,
|
||||
short *y2,
|
||||
unsigned char *decoded_bytes,
|
||||
unsigned char *decoded_bytes2,
|
||||
unsigned short n,
|
||||
unsigned short f1,
|
||||
unsigned short f2,
|
||||
unsigned char max_iterations,
|
||||
unsigned char crc_type,
|
||||
unsigned char F,
|
||||
time_stats_t *init_stats,
|
||||
time_stats_t *alpha_stats,
|
||||
time_stats_t *beta_stats,
|
||||
time_stats_t *gamma_stats,
|
||||
time_stats_t *ext_stats,
|
||||
time_stats_t *intl1_stats,
|
||||
time_stats_t *intl2_stats)
|
||||
{
|
||||
return max_iterations+1;
|
||||
};
|
||||
|
||||
void decoding_setmode (int mode) {
|
||||
switch (mode) {
|
||||
case MODE_DECODE_NONE:
|
||||
decoder8=nodecod;
|
||||
decoder16=nodecod;
|
||||
encoder=(encoder_if_t)shlib_fdesc[ENCODE_C_FPTRIDX].fptr;
|
||||
break;
|
||||
case MODE_DECODE_C:
|
||||
decoder16=(decoder_if_t)shlib_fdesc[DECODE_TD_C_FPTRIDX].fptr;
|
||||
decoder8=(decoder_if_t)shlib_fdesc[DECODE_TD_C_FPTRIDX].fptr;
|
||||
encoder=(encoder_if_t)shlib_fdesc[ENCODE_C_FPTRIDX].fptr;
|
||||
break;
|
||||
case MODE_DECODE_AVX2:
|
||||
decoder16=(decoder_if_t)shlib_fdesc[DECODE_TD16_AVX2_FPTRIDX].fptr;
|
||||
decoder8=(decoder_if_t)shlib_fdesc[DECODE_TD8_SSE_FPTRIDX].fptr;
|
||||
encoder=(encoder_if_t)shlib_fdesc[ENCODE_SSE_FPTRIDX].fptr;
|
||||
break;
|
||||
default:
|
||||
mode=MODE_DECODE_SSE;
|
||||
case MODE_DECODE_SSE:
|
||||
decoder8=(decoder_if_t)shlib_fdesc[DECODE_TD8_SSE_FPTRIDX].fptr;
|
||||
decoder16=(decoder_if_t)shlib_fdesc[DECODE_TD16_SSE_FPTRIDX].fptr;
|
||||
encoder=(encoder_if_t)shlib_fdesc[ENCODE_SSE_FPTRIDX].fptr;
|
||||
break;
|
||||
}
|
||||
curmode=mode;
|
||||
}
|
||||
|
||||
|
||||
int load_codinglib(void) {
|
||||
int ret;
|
||||
|
||||
memset(shlib_fdesc,0,sizeof(shlib_fdesc));
|
||||
shlib_fdesc[DECODE_INITTD8_SSE_FPTRIDX].fname = "init_td8";
|
||||
shlib_fdesc[DECODE_INITTD16_SSE_FPTRIDX].fname= "init_td16";
|
||||
shlib_fdesc[DECODE_INITTD_AVX2_FPTRIDX].fname="init_td16avx2";
|
||||
|
||||
shlib_fdesc[DECODE_TD8_SSE_FPTRIDX].fname= "phy_threegpplte_turbo_decoder8";
|
||||
shlib_fdesc[DECODE_TD16_SSE_FPTRIDX].fname= "phy_threegpplte_turbo_decoder16";
|
||||
shlib_fdesc[DECODE_TD_C_FPTRIDX].fname= "phy_threegpplte_turbo_decoder_scalar";
|
||||
shlib_fdesc[DECODE_TD16_AVX2_FPTRIDX].fname= "phy_threegpplte_turbo_decoder16avx2";
|
||||
|
||||
|
||||
shlib_fdesc[DECODE_FREETD8_FPTRIDX].fname = "free_td8";
|
||||
shlib_fdesc[DECODE_FREETD16_FPTRIDX].fname= "free_td16";
|
||||
shlib_fdesc[DECODE_FREETD_AVX2_FPTRIDX].fname= "free_td16avx2";
|
||||
|
||||
shlib_fdesc[ENCODE_SSE_FPTRIDX].fname= "threegpplte_turbo_encoder_sse";
|
||||
shlib_fdesc[ENCODE_C_FPTRIDX].fname= "threegpplte_turbo_encoder";
|
||||
shlib_fdesc[ENCODE_INIT_SSE_FPTRIDX].fname= "init_encoder_sse";
|
||||
ret=load_module_shlib("coding",shlib_fdesc,DECODE_NUM_FPTR);
|
||||
if (ret < 0) exit_fun("Error loading coding library");
|
||||
|
||||
/* execute encoder/decoder init functions */
|
||||
shlib_fdesc[DECODE_INITTD8_SSE_FPTRIDX].fptr();
|
||||
shlib_fdesc[DECODE_INITTD16_SSE_FPTRIDX].fptr();
|
||||
if(shlib_fdesc[DECODE_INITTD_AVX2_FPTRIDX].fptr != NULL) {
|
||||
shlib_fdesc[DECODE_INITTD_AVX2_FPTRIDX].fptr();
|
||||
}
|
||||
if(shlib_fdesc[ENCODE_INIT_SSE_FPTRIDX].fptr != NULL) {
|
||||
shlib_fdesc[ENCODE_INIT_SSE_FPTRIDX].fptr();
|
||||
}
|
||||
decoding_setmode(MODE_DECODE_SSE);
|
||||
/* look for telnet server, if it is loaded, add the coding commands to it */
|
||||
add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME);
|
||||
if (addcmd != NULL) {
|
||||
addcmd("coding",coding_vardef,coding_cmdarray);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_codinglib(void) {
|
||||
|
||||
shlib_fdesc[DECODE_FREETD8_FPTRIDX].fptr();
|
||||
shlib_fdesc[DECODE_FREETD16_FPTRIDX].fptr();
|
||||
shlib_fdesc[DECODE_FREETD_AVX2_FPTRIDX].fptr();
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* functions for telnet support, when telnet server is loaded */
|
||||
int coding_setmod_cmd(char *buff, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (debug > 0)
|
||||
prnt( "coding_setmod_cmd received %s\n",buff);
|
||||
|
||||
if (strcasestr(buff,"sse") != NULL) {
|
||||
decoding_setmode(MODE_DECODE_SSE);
|
||||
} else if (strcasestr(buff,"avx2") != NULL) {
|
||||
decoding_setmode(MODE_DECODE_AVX2);
|
||||
} else if (strcasestr(buff,"stdc") != NULL) {
|
||||
decoding_setmode(MODE_DECODE_C);
|
||||
} else if (strcasestr(buff,"none") != NULL) {
|
||||
decoding_setmode(MODE_DECODE_NONE);
|
||||
} else {
|
||||
prnt("%s: wrong setmod parameter...\n",buff);
|
||||
}
|
||||
prnt("Coding and decoding current mode: %s\n",modedesc[curmode]);
|
||||
return 0;
|
||||
}
|
||||
+3
-135
@@ -37,7 +37,7 @@
|
||||
#define CRC8 3
|
||||
|
||||
#define MAX_TURBO_ITERATIONS_MBSFN 8
|
||||
#define MAX_TURBO_ITERATIONS 4
|
||||
#define MAX_TURBO_ITERATIONS max_turbo_iterations
|
||||
|
||||
#define LTE_NULL 2
|
||||
|
||||
@@ -292,25 +292,9 @@ void ccodedot11_init(void);
|
||||
\brief This function initializes the trellis structure for decoding an 802.11 convolutional code.*/
|
||||
void ccodedot11_init_inv(void);
|
||||
|
||||
/*!\fn void teillis_table_init(void)
|
||||
\brief This function initializes the trellis structure for 3GPP LTE Turbo code.*/
|
||||
void treillis_table_init(void);
|
||||
|
||||
/*\fn void threegpplte_turbo_encoder(uint8_t *input,uint16_t input_length_bytes,uint8_t *output,uint8_t F,uint16_t interleaver_f1,uint16_t interleaver_f2)
|
||||
\brief This function implements a rate 1/3 8-state parralel concatenated turbo code (3GPP-LTE).
|
||||
@param input Pointer to input buffer
|
||||
@param input_length_bytes Number of bytes to encode
|
||||
@param output Pointer to output buffer
|
||||
@param F Number of filler bits at input
|
||||
@param interleaver_f1 F1 generator
|
||||
@param interleaver_f2 F2 generator
|
||||
*/
|
||||
void threegpplte_turbo_encoder(uint8_t *input,
|
||||
uint16_t input_length_bytes,
|
||||
uint8_t *output,
|
||||
uint8_t F,
|
||||
uint16_t interleaver_f1,
|
||||
uint16_t interleaver_f2);
|
||||
|
||||
|
||||
|
||||
|
||||
/** \fn void ccodelte_encode(int32_t numbits,uint8_t add_crc, uint8_t *inPtr,uint8_t *outPtr,uint16_t rnti)
|
||||
@@ -352,35 +336,7 @@ void ccodedab_init_inv(void);
|
||||
\brief This function initializes the different crc tables.*/
|
||||
void crcTableInit (void);
|
||||
|
||||
/*!\fn void free_td8(void)
|
||||
\brief This function frees the tables for 8-bit LLR Turbo decoder.*/
|
||||
void free_td8(void);
|
||||
|
||||
/*!\fn void init_td8(void)
|
||||
\brief This function initializes the tables for 8-bit LLR Turbo decoder.*/
|
||||
void init_td8 (void);
|
||||
|
||||
/*!\fn void free_td16(void)
|
||||
\brief This function frees the tables for 16-bit LLR Turbo decoder.*/
|
||||
void free_td16(void);
|
||||
|
||||
/*!\fn void init_td16(void)
|
||||
\brief This function initializes the tables for 16-bit LLR Turbo decoder.*/
|
||||
void init_td16 (void);
|
||||
|
||||
#ifdef __AVX2__
|
||||
/*!\fn void init_td8(void)
|
||||
\brief This function initializes the tables for 8-bit LLR Turbo decoder (AVX2).*/
|
||||
void init_td8avx2 (void);
|
||||
|
||||
/*!\fn void free_td16avx2(void)
|
||||
\brief This function frees the tables for 16-bit LLR Turbo decoder (AVX2).*/
|
||||
void free_td16avx2(void);
|
||||
|
||||
/*!\fn void init_td16(void)
|
||||
\brief This function initializes the tables for 16-bit LLR Turbo decoder (AVX2).*/
|
||||
void init_td16avx2 (void);
|
||||
#endif
|
||||
|
||||
/*!\fn uint32_t crc24a(uint8_t *inPtr, int32_t bitlen)
|
||||
\brief This computes a 24-bit crc ('a' variant for overall transport block)
|
||||
@@ -470,95 +426,7 @@ int32_t rate_matching_lte(uint32_t N_coded,
|
||||
uint32_t off);
|
||||
|
||||
|
||||
/*!
|
||||
\brief This routine performs max-logmap detection for the 3GPP turbo code (with termination). It is optimized for SIMD processing and 16-bit
|
||||
LLR arithmetic, and requires SSE2,SSSE3 and SSE4.1 (gcc >=4.3 and appropriate CPU)
|
||||
@param y LLR input (16-bit precision)
|
||||
@param decoded_bytes Pointer to decoded output
|
||||
@param n number of coded bits (including tail bits)
|
||||
@param max_iterations The maximum number of iterations to perform
|
||||
@param interleaver_f1 F1 generator
|
||||
@param interleaver_f2 F2 generator
|
||||
@param crc_type Length of 3GPPLTE crc (CRC24a,CRC24b,CRC16,CRC8)
|
||||
@param F Number of filler bits at start of packet
|
||||
@returns number of iterations used (this is 1+max if incorrect crc or if crc_len=0)
|
||||
*/
|
||||
uint8_t phy_threegpplte_turbo_decoder16(int16_t *y,
|
||||
uint8_t *decoded_bytes,
|
||||
uint16_t n,
|
||||
uint16_t interleaver_f1,
|
||||
uint16_t interleaver_f2,
|
||||
uint8_t max_iterations,
|
||||
uint8_t crc_type,
|
||||
uint8_t F,
|
||||
time_stats_t *init_stats,
|
||||
time_stats_t *alpha_stats,
|
||||
time_stats_t *beta_stats,
|
||||
time_stats_t *gamma_stats,
|
||||
time_stats_t *ext_stats,
|
||||
time_stats_t *intl1_stats,
|
||||
time_stats_t *intl2_stats);
|
||||
|
||||
uint8_t phy_threegpplte_turbo_decoder16avx2(int16_t *y,
|
||||
int16_t *y2,
|
||||
uint8_t *decoded_bytes,
|
||||
uint8_t *decoded_bytes2,
|
||||
uint16_t n,
|
||||
uint16_t interleaver_f1,
|
||||
uint16_t interleaver_f2,
|
||||
uint8_t max_iterations,
|
||||
uint8_t crc_type,
|
||||
uint8_t F,
|
||||
time_stats_t *init_stats,
|
||||
time_stats_t *alpha_stats,
|
||||
time_stats_t *beta_stats,
|
||||
time_stats_t *gamma_stats,
|
||||
time_stats_t *ext_stats,
|
||||
time_stats_t *intl1_stats,
|
||||
time_stats_t *intl2_stats);
|
||||
|
||||
/*!
|
||||
\brief This routine performs max-logmap detection for the 3GPP turbo code (with termination). It is optimized for SIMD processing and 8-bit
|
||||
LLR arithmetic, and requires SSE2,SSSE3 and SSE4.1 (gcc >=4.3 and appropriate CPU)
|
||||
@param y LLR input (16-bit precision)
|
||||
@param decoded_bytes Pointer to decoded output
|
||||
@param n number of coded bits (including tail bits)
|
||||
@param max_iterations The maximum number of iterations to perform
|
||||
@param interleaver_f1 F1 generator
|
||||
@param interleaver_f2 F2 generator
|
||||
@param crc_type Length of 3GPPLTE crc (CRC24a,CRC24b,CRC16,CRC8)
|
||||
@param F Number of filler bits at start of packet
|
||||
@returns number of iterations used (this is 1+max if incorrect crc or if crc_len=0)
|
||||
*/
|
||||
uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
|
||||
uint8_t *decoded_bytes,
|
||||
uint16_t n,
|
||||
uint16_t interleaver_f1,
|
||||
uint16_t interleaver_f2,
|
||||
uint8_t max_iterations,
|
||||
uint8_t crc_type,
|
||||
uint8_t F,
|
||||
time_stats_t *init_stats,
|
||||
time_stats_t *alpha_stats,
|
||||
time_stats_t *beta_stats,
|
||||
time_stats_t *gamma_stats,
|
||||
time_stats_t *ext_stats,
|
||||
time_stats_t *intl1_stats,
|
||||
time_stats_t *intl2_stats);
|
||||
|
||||
uint8_t phy_threegpplte_turbo_decoder_scalar(int16_t *y,
|
||||
uint8_t *decoded_bytes,
|
||||
uint16_t n,
|
||||
uint16_t interleaver_f1,
|
||||
uint16_t interleaver_f2,
|
||||
uint8_t max_iterations,
|
||||
uint8_t crc_type,
|
||||
uint8_t F,
|
||||
uint8_t inst);
|
||||
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
uint32_t crcbit (uint8_t * ,
|
||||
int32_t,
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/* file: PHY/CODING/defs_NB_IoT.h
|
||||
purpose: Top-level definitions, data types and function prototypes for openairinterface coding blocks for NB-IoT
|
||||
author: matthieu.kanj@b-com.com, raymond.knopp@eurecom.fr, michele.paffetti@studio.unibo.it
|
||||
date: 29.06.2017
|
||||
*/
|
||||
|
||||
#ifndef OPENAIR1_PHY_CODING_DEFS_NB_IOT_H_
|
||||
#define OPENAIR1_PHY_CODING_DEFS_NB_IOT_H_
|
||||
|
||||
#include <stdint.h> // for uint8/16/32_t
|
||||
|
||||
/* check if this ifndef is required for NB-IoT ?!
|
||||
//#ifndef NO_OPENAIR1
|
||||
//#include "PHY/defs_NB_IoT.h"
|
||||
//#else
|
||||
//#include "PHY/TOOLS/time_meas.h"
|
||||
//#endif
|
||||
*/
|
||||
|
||||
#define CRC24_A_NB_IoT 0
|
||||
#define CRC24_B_NB_IoT 1
|
||||
#define CRC16_NB_IoT 2
|
||||
#define CRC8_NB_IoT 3
|
||||
|
||||
//#define MAX_TURBO_ITERATIONS_MBSFN 8 // no MBSFN
|
||||
#define MAX_TURBO_ITERATIONS_NB_IoT 4
|
||||
|
||||
#define LTE_NULL_NB_IoT 2 // defined also in PHY/LTE_TRANSPORT/defs_NB_IoT.h
|
||||
|
||||
/** \fn uint32_t sub_block_interleaving_cc(uint32_t D, uint8_t *d,uint8_t *w)
|
||||
\brief This is the subblock interleaving algorithm for convolutionally coded blocks from 36-212 (Release 13.4, 2017).
|
||||
This function takes the d-sequence and generates the w-sequence. The nu-sequence from 36-212 is implicit.
|
||||
\param D Number of input bits
|
||||
\param d Pointer to input (d-sequence, convolutional code output)
|
||||
\param w Pointer to output (w-sequence, interleaver output)
|
||||
\returns Interleaving matrix cardinality (\f$K_{\pi}\f$ from 36-212)
|
||||
*/
|
||||
uint32_t sub_block_interleaving_cc_NB_IoT(uint32_t D, uint8_t *d,uint8_t *w);
|
||||
|
||||
/**
|
||||
\brief This is the NB-IoT rate matching algorithm for Convolutionally-coded channels (e.g. BCH,DCI,UCI). It is taken directly from 36-212 (Rel 8 8.6, 2009-03), pages 16-18 )
|
||||
\param RCC R^CC_subblock from subblock interleaver (number of rows in interleaving matrix) for up to 8 segments
|
||||
\param E Number of coded channel bits
|
||||
\param w This is a pointer to the w-sequence (second interleaver output)
|
||||
\param e This is a pointer to the e-sequence (rate matching output, channel input/output bits)
|
||||
\returns \f$E\f$, the number of coded bits per segment */
|
||||
|
||||
uint32_t lte_rate_matching_cc_NB_IoT(uint32_t RCC, // RRC = 2
|
||||
uint16_t E, // E = 1600
|
||||
uint8_t *w, // length
|
||||
uint8_t *e); // length 1600
|
||||
|
||||
/** \fn void ccodelte_encode(int32_t numbits,uint8_t add_crc, uint8_t *inPtr,uint8_t *outPtr,uint16_t rnti)
|
||||
\brief This function implements the LTE convolutional code of rate 1/3
|
||||
with a constraint length of 7 bits. The inputs are bit packed in octets
|
||||
(from MSB to LSB). Trellis tail-biting is included here.
|
||||
@param numbits Number of bits to encode
|
||||
@param add_crc crc to be appended (8 bits) if add_crc = 1
|
||||
@param inPtr Pointer to input buffer
|
||||
@param outPtr Pointer to output buffer
|
||||
@param rnti RNTI for CRC scrambling
|
||||
*/
|
||||
|
||||
void ccode_encode_NB_IoT (int32_t numbits,
|
||||
uint8_t add_crc,
|
||||
uint8_t *inPtr,
|
||||
uint8_t *outPtr,
|
||||
uint16_t rnti);
|
||||
|
||||
/*!\fn void ccodelte_init(void)
|
||||
\brief This function initializes the generator polynomials for an LTE convolutional code.*/
|
||||
void ccodelte_init_NB_IoT(void);
|
||||
|
||||
/*!\fn void crcTableInit(void)
|
||||
\brief This function initializes the different crc tables.*/
|
||||
void crcTableInit_NB_IoT (void);
|
||||
|
||||
|
||||
/*!\fn uint32_t crc24a(uint8_t *inPtr, int32_t bitlen)
|
||||
\brief This computes a 24-bit crc ('a' variant for overall transport block)
|
||||
based on 3GPP UMTS/LTE specifications.
|
||||
@param inPtr Pointer to input byte stream
|
||||
@param bitlen length of inputs in bits
|
||||
*/
|
||||
uint32_t crc24a_NB_IoT (uint8_t *inPtr, int32_t bitlen);
|
||||
|
||||
/*!\fn uint32_t crc24b(uint8_t *inPtr, int32_t bitlen)
|
||||
\brief This computes a 24-bit crc ('b' variant for transport-block segments)
|
||||
based on 3GPP UMTS/LTE specifications.
|
||||
@param inPtr Pointer to input byte stream
|
||||
@param bitlen length of inputs in bits
|
||||
*/
|
||||
uint32_t crc24b_NB_IoT (uint8_t *inPtr, int32_t bitlen);
|
||||
|
||||
/*!\fn uint32_t crc16(uint8_t *inPtr, int32_t bitlen)
|
||||
\brief This computes a 16-bit crc based on 3GPP UMTS specifications.
|
||||
@param inPtr Pointer to input byte stream
|
||||
@param bitlen length of inputs in bits*/
|
||||
uint32_t crc16_NB_IoT (uint8_t *inPtr, int32_t bitlen);
|
||||
|
||||
/*!\fn uint32_t crc8(uint8_t *inPtr, int32_t bitlen)
|
||||
\brief This computes a 8-bit crc based on 3GPP UMTS specifications.
|
||||
@param inPtr Pointer to input byte stream
|
||||
@param bitlen length of inputs in bits*/
|
||||
uint32_t crc8_NB_IoT (uint8_t *inPtr, int32_t bitlen);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
uint32_t crcbit_NB_IoT (uint8_t * ,
|
||||
int32_t,
|
||||
uint32_t);
|
||||
|
||||
|
||||
/*!\fn void phy_viterbi_lte_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n)
|
||||
\brief This routine performs a SIMD optmized Viterbi decoder for the LTE 64-state tail-biting convolutional code.
|
||||
@param y Pointer to soft input (coded on 8-bits but should be limited to 4-bit precision to avoid overflow)
|
||||
@param decoded_bytes Pointer to decoded output
|
||||
@param n Length of input/trellis depth in bits*/
|
||||
//void phy_viterbi_lte_sse2(int8_t *y,uint8_t *decoded_bytes,uint16_t n);
|
||||
void phy_viterbi_lte_sse2_NB_IoT(int8_t *y,uint8_t *decoded_bytes,uint16_t n);
|
||||
|
||||
/** \fn void sub_block_deinterleaving_cc(uint32_t D, int8_t *d,int8_t *w)
|
||||
\brief This is the subblock deinterleaving algorithm for convolutionally-coded data from 36-212 (Release 8, 8.6 2009-03), pages 15-16.
|
||||
This function takes the w-sequence and generates the d-sequence. The nu-sequence from 36-212 is implicit.
|
||||
\param D Number of input bits
|
||||
\param d Pointer to output (d-sequence, turbo code output)
|
||||
\param w Pointer to input (w-sequence, interleaver output)
|
||||
*/
|
||||
void sub_block_deinterleaving_cc_NB_IoT(uint32_t D,int8_t *d,int8_t *w);
|
||||
|
||||
|
||||
/*
|
||||
\brief This is the LTE rate matching algorithm for Convolutionally-coded channels (e.g. BCH,DCI,UCI). It is taken directly from 36-212 (Rel 8 8.6, 2009-03), pages 16-18 )
|
||||
\param RCC R^CC_subblock from subblock interleaver (number of rows in interleaving matrix)
|
||||
\param E This the number of coded bits allocated for channel
|
||||
\param w This is a pointer to the soft w-sequence (second interleaver output) with soft-combined outputs from successive HARQ rounds
|
||||
\param dummy_w This is the first row of the interleaver matrix for identifying/discarding the "LTE-NULL" positions
|
||||
\param soft_input This is a pointer to the soft channel output
|
||||
\returns \f$E\f$, the number of coded bits per segment
|
||||
*/
|
||||
void lte_rate_matching_cc_rx_NB_IoT(uint32_t RCC,
|
||||
uint16_t E,
|
||||
int8_t *w,
|
||||
uint8_t *dummy_w,
|
||||
int8_t *soft_input);
|
||||
|
||||
/** \fn generate_dummy_w_cc(uint32_t D, uint8_t *w)
|
||||
\brief This function generates a dummy interleaved sequence (first row) for receiver (convolutionally-coded data), in order to identify the NULL positions used to make the matrix complete.
|
||||
\param D Number of systematic bits plus 4 (plus 4 for termination)
|
||||
\param w This is the dummy sequence (first row), it will contain zeros and at most 31 "LTE_NULL" values
|
||||
\returns Interleaving matrix cardinality (\f$K_{\pi}\f$ from 36-212)
|
||||
*/
|
||||
uint32_t generate_dummy_w_cc_NB_IoT(uint32_t D, uint8_t *w);
|
||||
|
||||
/** \fn lte_segmentation(uint8_t *input_buffer,
|
||||
uint8_t **output_buffers,
|
||||
uint32_t B,
|
||||
uint32_t *C,
|
||||
uint32_t *Cplus,
|
||||
uint32_t *Cminus,
|
||||
uint32_t *Kplus,
|
||||
uint32_t *Kminus,
|
||||
uint32_t *F)
|
||||
\brief This function implements the LTE transport block segmentation algorithm from 36-212, V8.6 2009-03.
|
||||
@param input_buffer
|
||||
@param output_buffers
|
||||
@param B
|
||||
@param C
|
||||
@param Cplus
|
||||
@param Cminus
|
||||
@param Kplus
|
||||
@param Kminus
|
||||
@param F
|
||||
*/
|
||||
int32_t lte_segmentation_NB_IoT(uint8_t *input_buffer,
|
||||
uint8_t **output_buffers,
|
||||
uint32_t B,
|
||||
uint32_t *C,
|
||||
uint32_t *Cplus,
|
||||
uint32_t *Cminus,
|
||||
uint32_t *Kplus,
|
||||
uint32_t *Kminus,
|
||||
uint32_t *F);
|
||||
|
||||
/** \fn void sub_block_deinterleaving_turbo(uint32_t D, int16_t *d,int16_t *w)
|
||||
\brief This is the subblock deinterleaving algorithm from 36-212 (Release 8, 8.6 2009-03), pages 15-16.
|
||||
This function takes the w-sequence and generates the d-sequence. The nu-sequence from 36-212 is implicit.
|
||||
\param D Number of systematic bits plus 4 (plus 4 for termination)
|
||||
\param d Pointer to output (d-sequence, turbo code output)
|
||||
\param w Pointer to input (w-sequence, interleaver output)
|
||||
*/
|
||||
//*****************void sub_block_deinterleaving_turbo(uint32_t D, int16_t *d,int16_t *w);
|
||||
|
||||
/**
|
||||
\brief This is the LTE rate matching algorithm for Turbo-coded channels (e.g. DLSCH,ULSCH). It is taken directly from 36-212 (Rel 8 8.6, 2009-03), pages 16-18 )
|
||||
\param RTC R^TC_subblock from subblock interleaver (number of rows in interleaving matrix)
|
||||
\param G This the number of coded transport bits allocated in sub-frame
|
||||
\param w This is a pointer to the soft w-sequence (second interleaver output) with soft-combined outputs from successive HARQ rounds
|
||||
\param dummy_w This is the first row of the interleaver matrix for identifying/discarding the "LTE-NULL" positions
|
||||
\param soft_input This is a pointer to the soft channel output
|
||||
\param C Number of segments (codewords) in the sub-frame
|
||||
\param Nsoft Total number of soft bits (from UE capabilities in 36-306)
|
||||
\param Mdlharq Number of HARQ rounds
|
||||
\param Kmimo MIMO capability for this DLSCH (0 = no MIMO)
|
||||
\param rvidx round index (0-3)
|
||||
\param clear 1 means clear soft buffer (start of HARQ round)
|
||||
\param Qm modulation order (2,4,6)
|
||||
\param Nl number of layers (1,2)
|
||||
\param r segment number
|
||||
\param E_out the number of coded bits per segment
|
||||
\returns 0 on success, -1 on failure
|
||||
*/
|
||||
|
||||
// int lte_rate_matching_turbo_rx(uint32_t RTC,
|
||||
// uint32_t G,
|
||||
// int16_t *w,
|
||||
// uint8_t *dummy_w,
|
||||
// int16_t *soft_input,
|
||||
// uint8_t C,
|
||||
// uint32_t Nsoft,
|
||||
// uint8_t Mdlharq,
|
||||
// uint8_t Kmimo,
|
||||
// uint8_t rvidx,
|
||||
// uint8_t clear,
|
||||
// uint8_t Qm,
|
||||
// uint8_t Nl,
|
||||
// uint8_t r,
|
||||
// uint32_t *E_out);
|
||||
|
||||
// uint32_t lte_rate_matching_turbo_rx_abs(uint32_t RTC,
|
||||
// uint32_t G,
|
||||
// double *w,
|
||||
// uint8_t *dummy_w,
|
||||
// double *soft_input,
|
||||
// uint8_t C,
|
||||
// uint32_t Nsoft,
|
||||
// uint8_t Mdlharq,
|
||||
// uint8_t Kmimo,
|
||||
// uint8_t rvidx,
|
||||
// uint8_t clear,
|
||||
// uint8_t Qm,
|
||||
// uint8_t Nl,
|
||||
// uint8_t r,
|
||||
// uint32_t *E_out);
|
||||
|
||||
void ccode_encode_npdsch_NB_IoT (int32_t numbits,
|
||||
uint8_t *inPtr,
|
||||
uint8_t *outPtr,
|
||||
uint32_t crc);
|
||||
|
||||
#endif /* OPENAIR1_PHY_CODING_DEFS_NB_IOT_H_ */
|
||||
@@ -20,5 +20,9 @@
|
||||
*/
|
||||
|
||||
extern unsigned short f1f2mat_old[2*188];
|
||||
|
||||
|
||||
extern double cpuf;
|
||||
extern decoder_if_t decoder16;
|
||||
extern decoder_if_t decoder8;
|
||||
extern encoder_if_t encoder;
|
||||
extern int load_codinglib(void);
|
||||
extern int free_codinglib(void);
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __INIT_DEFS_NB_IOT__H__
|
||||
#define __INIT_DEFS_NB_IOT__H__
|
||||
|
||||
//#include "PHY/defs_NB_IoT.h"
|
||||
#include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h"
|
||||
#include "nfapi_interface.h"
|
||||
|
||||
//#include "SystemInformationBlockType2.h"
|
||||
//#include "RadioResourceConfigCommonSIB.h"
|
||||
//#include "RadioResourceConfigDedicated.h"
|
||||
//#include "TDD-Config.h"
|
||||
//#include "MBSFN-SubframeConfigList.h"
|
||||
//#include "MobilityControlInfo.h"
|
||||
//#if defined(Rel10) || defined(Rel14)
|
||||
//#include "SCellToAddMod-r10.h"
|
||||
//#endif
|
||||
|
||||
/*brief Configure LTE_DL_FRAME_PARMS with components derived after initial synchronization (MIB-NB decoding + primary/secondary synch).*/
|
||||
void phy_config_mib_eNB_NB_IoT(int Mod_id,
|
||||
int eutra_band,
|
||||
int Nid_cell,
|
||||
int Ncp,
|
||||
int Ncp_UL,
|
||||
int p_eNB,
|
||||
uint16_t EARFCN,
|
||||
uint16_t prb_index, // NB_IoT_RB_ID,
|
||||
uint16_t operating_mode,
|
||||
uint16_t control_region_size,
|
||||
uint16_t eutra_NumCRS_ports);
|
||||
|
||||
/*NB_phy_config_sib1_eNB is not needed since NB-IoT use only FDD mode*/
|
||||
|
||||
/*brief Configure LTE_DL_FRAME_PARMS with components of SIB2-NB (at eNB).*/
|
||||
|
||||
//void NB_phy_config_sib2_eNB(module_id_t Mod_id,
|
||||
// int CC_id,
|
||||
// RadioResourceConfigCommonSIB_NB_r13_t *radioResourceConfigCommon
|
||||
// );
|
||||
|
||||
void phy_config_sib2_eNB_NB_IoT(uint8_t Mod_id,
|
||||
nfapi_nb_iot_config_t *config,
|
||||
nfapi_rf_config_t *rf_config,
|
||||
nfapi_uplink_reference_signal_config_t* ul_nrs_config,
|
||||
extra_phyConfig_t* extra_phy_parms);
|
||||
|
||||
void phy_config_dedicated_eNB_NB_IoT(module_id_t Mod_id,
|
||||
rnti_t rnti,
|
||||
extra_phyConfig_t* extra_phy_parms);
|
||||
|
||||
// void phy_init_lte_top_NB_IoT(NB_IoT_DL_FRAME_PARMS *frame_parms);
|
||||
void phy_init_nb_iot_eNB(PHY_VARS_eNB_NB_IoT *phyvar);
|
||||
int l1_north_init_NB_IoT(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
/*!\brief Initilization and reconfiguration routines for LTE PHY */
|
||||
#include "defs.h"
|
||||
#include "PHY/extern.h"
|
||||
|
||||
#include "PHY/CODING/extern.h"
|
||||
void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms)
|
||||
{
|
||||
|
||||
@@ -34,15 +34,12 @@ void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms)
|
||||
ccodelte_init();
|
||||
ccodelte_init_inv();
|
||||
|
||||
treillis_table_init();
|
||||
|
||||
|
||||
phy_generate_viterbi_tables();
|
||||
phy_generate_viterbi_tables_lte();
|
||||
init_td8();
|
||||
init_td16();
|
||||
#ifdef __AVX2__
|
||||
init_td16avx2();
|
||||
#endif
|
||||
|
||||
load_codinglib();
|
||||
lte_sync_time_init(frame_parms);
|
||||
|
||||
generate_ul_ref_sigs();
|
||||
@@ -61,11 +58,7 @@ void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms)
|
||||
|
||||
void free_lte_top(void)
|
||||
{
|
||||
free_td8();
|
||||
free_td16();
|
||||
#ifdef __AVX2__
|
||||
free_td16avx2();
|
||||
#endif
|
||||
free_codinglib();
|
||||
lte_sync_time_free();
|
||||
|
||||
/* free_ul_ref_sigs() is called in phy_free_lte_eNB() */
|
||||
|
||||
@@ -207,10 +207,8 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
((ue->frame_parms.frame_type == TDD) && ((subframe == 1) || (subframe == 6)))
|
||||
)
|
||||
{ // FDD PSS/SSS, compute noise in DTX REs
|
||||
|
||||
if (ue->frame_parms.Ncp==NORMAL) {
|
||||
if (ue->frame_parms.Ncp == NORMAL) {
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
if(ue->frame_parms.frame_type == FDD)
|
||||
{
|
||||
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)];
|
||||
@@ -266,7 +264,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(12*aarx));
|
||||
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
} else {
|
||||
LOG_E(PHY, "Not yet implemented: noise power calculation when prefix length = EXTENDED\n");
|
||||
LOG_E(PHY, "Not yet implemented: noise power calculation when prefix length == EXTENDED\n");
|
||||
}
|
||||
}
|
||||
else if ((ue->frame_parms.frame_type == TDD) &&
|
||||
|
||||
@@ -291,7 +291,7 @@ int32_t temp_in_ifft_0[2048*2] __attribute__((aligned(32)));
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
|
||||
if (aa==0) {
|
||||
if (aa==1) {
|
||||
if (Ns == 0) {
|
||||
write_output("rxdataF_ext.m","rxF_ext",&rxdataF_ext[aa][symbol_offset],512*2,2,1);
|
||||
write_output("tmpin_ifft.m","drs_in",temp_in_ifft_0,512,1,1);
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/*******************************************************************************
|
||||
|
||||
*******************************************************************************/
|
||||
/*! \file PHY/LTE_REFSIG/defs_NB_IoT.c
|
||||
* \function called by lte_dl_cell_spec_NB_IoT.c , TS 36-211, V13.4.0 2017-02
|
||||
* \author M. KANJ
|
||||
* \date 2017
|
||||
* \version 0.0
|
||||
* \company bcom
|
||||
* \email: matthieu.kanj@b-com.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
/* Definitions for NB_IoT Reference signals */
|
||||
|
||||
#ifndef __LTE_REFSIG_DEFS_NB_IOT__H__
|
||||
#define __LTE_REFSIG_DEFS_NB_IOT__H__
|
||||
|
||||
#include "PHY/defs_L1_NB_IoT.h"
|
||||
|
||||
/** @ingroup _PHY_REF_SIG
|
||||
* @{
|
||||
*/
|
||||
/*!\brief This function generates the LTE Gold sequence (36-211, Sec 7.2), specifically for DL reference signals.
|
||||
@param frame_parms LTE DL Frame parameters
|
||||
@param lte_gold_table pointer to table where sequences are stored
|
||||
@param Nid_cell Cell Id for NB_IoT (to compute sequences for local and adjacent cells) */
|
||||
|
||||
void lte_gold_NB_IoT(NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t lte_gold_table_NB_IoT[20][2][14],
|
||||
uint16_t Nid_cell);
|
||||
|
||||
/*! \brief This function generates the Narrowband reference signal (NRS) sequence (36-211, Sec 6.10.1.1)
|
||||
@param phy_vars_eNB Pointer to eNB variables
|
||||
@param output Output vector for OFDM symbol (Frequency Domain)
|
||||
@param amp Q15 amplitude
|
||||
@param Ns Slot number (0..19)
|
||||
@param l symbol (0,1) - Note 1 means 3!
|
||||
@param p antenna index
|
||||
@param RB_IoT_ID the ID of the RB dedicated for NB_IoT
|
||||
*/
|
||||
int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB,
|
||||
int32_t *output,
|
||||
short amp,
|
||||
unsigned char Ns,
|
||||
unsigned char l,
|
||||
unsigned char p,
|
||||
unsigned short RB_IoT_ID);
|
||||
|
||||
|
||||
unsigned int lte_gold_generic_NB_IoT(unsigned int *x1,
|
||||
unsigned int *x2,
|
||||
unsigned char reset);
|
||||
|
||||
void generate_ul_ref_sigs_rx_NB_IoT(void);
|
||||
|
||||
void free_ul_ref_sigs_NB_IoT(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,292 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file PHY/LTE_TRANSPORT/dci.h
|
||||
* \brief typedefs for LTE DCI structures from 36-212, V8.6 2009-03. Limited to 5 MHz formats for the moment.Current LTE compliance V8.6 2009-03.
|
||||
* \author R. Knopp
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#ifndef __DCI_NB_IOT_H__
|
||||
#define __DCI_NB_IOT_H__
|
||||
|
||||
//#ifndef USER_MODE
|
||||
//#include "PHY/types.h"
|
||||
//#else
|
||||
#include <stdint.h>
|
||||
//#endif
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DCIFormatN0 = 0,
|
||||
DCIFormatN1,
|
||||
DCIFormatN1_RA,//is for initial RA procedure (semi-static information) so maybe is not needed
|
||||
DCIFormatN1_RAR,
|
||||
DCIFormatN2,
|
||||
DCIFormatN2_Ind,
|
||||
DCIFormatN2_Pag,
|
||||
}DCI_format_NB_IoT_t;
|
||||
|
||||
/// DCI Format Type 0 (180 kHz, 23 bits)
|
||||
struct DCIFormatN0{
|
||||
/// type = 0 => DCI Format N0, type = 1 => DCI Format N1, 1 bits
|
||||
uint8_t type;
|
||||
/// Subcarrier indication, 6 bits
|
||||
uint8_t scind;
|
||||
/// Resourse Assignment (RU Assignment), 3 bits
|
||||
uint8_t ResAssign;
|
||||
/// Modulation and Coding Scheme, 4 bits
|
||||
uint8_t mcs;
|
||||
/// New Data Indicator, 1 bits
|
||||
uint8_t ndi;
|
||||
/// Scheduling Delay, 2 bits
|
||||
uint8_t Scheddly;
|
||||
/// Repetition Number, 3 bits
|
||||
uint8_t RepNum;
|
||||
/// Redundancy version for HARQ (only use 0 and 2), 1 bits
|
||||
uint8_t rv;
|
||||
/// DCI subframe repetition Number, 2 bits
|
||||
uint8_t DCIRep;
|
||||
};
|
||||
|
||||
typedef struct DCIFormatN0 DCIFormatN0_t;
|
||||
|
||||
/// DCI Format Type N1 for User data
|
||||
struct DCIFormatN1{
|
||||
/// type = 0 => DCI Format N0, type = 1 => DCI Format N1,1bits
|
||||
uint8_t type;
|
||||
//NPDCCH order indicator (set to 0), 1 bits
|
||||
uint8_t orderIndicator;
|
||||
// Scheduling Delay,3 bits
|
||||
uint8_t Scheddly;
|
||||
// Resourse Assignment (RU Assignment),3 bits
|
||||
uint8_t ResAssign;
|
||||
// Modulation and Coding Scheme,4 bits
|
||||
uint8_t mcs;
|
||||
// Repetition Number,4 bits
|
||||
uint8_t RepNum;
|
||||
// New Data Indicator,1 bits
|
||||
uint8_t ndi;
|
||||
// HARQ-ACK resource,4 bits
|
||||
uint8_t HARQackRes;
|
||||
// DCI subframe repetition Number,2 bits
|
||||
uint8_t DCIRep;
|
||||
};
|
||||
|
||||
|
||||
typedef struct DCIFormatN1 DCIFormatN1_t;
|
||||
|
||||
/// DCI Format Type N1 for initial RA
|
||||
struct DCIFormatN1_RA{
|
||||
/// type = 0 => DCI Format N0, type = 1 => DCI Format N1, 1 bits
|
||||
uint8_t type;
|
||||
//NPDCCH order indicator (set to 0),1 bits
|
||||
uint8_t orderIndicator;
|
||||
// Start number of NPRACH repetiiton, 2 bits
|
||||
uint8_t Scheddly;
|
||||
// Subcarrier indication of NPRACH, 6 bits
|
||||
uint8_t scind;
|
||||
// All the remainging bits, 13 bits
|
||||
uint8_t remaingingBits;
|
||||
};
|
||||
|
||||
typedef struct DCIFormatN1_RA DCIFormatN1_RA_t;
|
||||
|
||||
/// DCI Format Type N1 for User data
|
||||
struct DCIFormatN1_RAR{
|
||||
/// type = 0 => DCI Format N0, type = 1 => DCI Format N1,1bits
|
||||
uint8_t type;
|
||||
//NPDCCH order indicator (set to 0), 1 bits
|
||||
uint8_t orderIndicator;
|
||||
// Scheduling Delay,3 bits
|
||||
uint8_t Scheddly;
|
||||
// Resourse Assignment (RU Assignment),3 bits
|
||||
uint8_t ResAssign;
|
||||
// Modulation and Coding Scheme,4 bits
|
||||
uint8_t mcs;
|
||||
// Repetition Number,4 bits
|
||||
uint8_t RepNum;
|
||||
// New Data Indicator,1 bits,reserved in the RAR
|
||||
uint8_t ndi;
|
||||
// HARQ-ACK resource,4 bits,reserved in the RAR
|
||||
uint8_t HARQackRes;
|
||||
// DCI subframe repetition Number,2 bits
|
||||
uint8_t DCIRep;
|
||||
};
|
||||
|
||||
typedef struct DCIFormatN1_RAR DCIFormatN1_RAR_t;
|
||||
|
||||
// DCI Format Type N2 for direct indication, 15 bits
|
||||
struct DCIFormatN2_Ind{
|
||||
//Flag for paging(1)/direct indication(0), set to 0,1 bits
|
||||
uint8_t type;
|
||||
//Direct indication information, 8 bits
|
||||
uint8_t directIndInf;
|
||||
// Reserved information bits, 6 bits
|
||||
uint8_t resInfoBits;
|
||||
};
|
||||
|
||||
typedef struct DCIFormatN2_Ind DCIFormatN2_Ind_t;
|
||||
|
||||
// DCI Format Type N2 for Paging, 15 bits
|
||||
struct DCIFormatN2_Pag{
|
||||
//Flag for paging(1)/direct indication(0), set to 1,1 bits
|
||||
uint8_t type;
|
||||
// Resourse Assignment (RU Assignment), 3 bits
|
||||
uint8_t ResAssign;
|
||||
// Modulation and Coding Scheme, 4 bits
|
||||
uint8_t mcs;
|
||||
// Repetition Number, 4 bits
|
||||
uint8_t RepNum;
|
||||
// Reserved 3 bits
|
||||
uint8_t DCIRep;
|
||||
};
|
||||
|
||||
typedef struct DCIFormatN2_Pag DCIFormatN2_Pag_t;
|
||||
|
||||
typedef union DCI_CONTENT {
|
||||
//
|
||||
DCIFormatN0_t DCIN0;
|
||||
//
|
||||
DCIFormatN1_t DCIN1;
|
||||
//
|
||||
DCIFormatN1_RA_t DCIN1_RA;
|
||||
//
|
||||
DCIFormatN1_RAR_t DCIN1_RAR;
|
||||
//
|
||||
DCIFormatN2_Ind_t DCIN2_Ind;
|
||||
//
|
||||
DCIFormatN2_Pag_t DCIN2_Pag;
|
||||
|
||||
}DCI_CONTENT;
|
||||
|
||||
/*Structure for packing*/
|
||||
|
||||
struct DCIN0{
|
||||
/// DCI subframe repetition Number, 2 bits
|
||||
uint8_t DCIRep:2;
|
||||
/// New Data Indicator, 1 bits
|
||||
uint8_t ndi:1;
|
||||
/// Repetition Number, 3 bits
|
||||
uint8_t RepNum:3;
|
||||
/// Redundancy version for HARQ (only use 0 and 2), 1 bits
|
||||
uint8_t rv:1;
|
||||
/// Modulation and Coding Scheme, 4 bits
|
||||
uint8_t mcs:4;
|
||||
/// Scheduling Delay, 2 bits
|
||||
uint8_t Scheddly:2;
|
||||
/// Resourse Assignment (RU Assignment), 3 bits
|
||||
uint8_t ResAssign:3;
|
||||
/// Subcarrier indication, 6 bits
|
||||
uint8_t scind:6;
|
||||
/// type = 0 => DCI Format N0, type = 1 => DCI Format N1, 1 bits
|
||||
uint8_t type:1;
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
typedef struct DCIN0 DCIN0_t;
|
||||
#define sizeof_DCIN0_t 23
|
||||
|
||||
struct DCIN1_RAR{
|
||||
// DCI subframe repetition Number, 2 bits
|
||||
uint8_t DCIRep:2;
|
||||
// HARQ-ACK resource,4 bits
|
||||
uint8_t HARQackRes:4;
|
||||
// New Data Indicator,1 bits
|
||||
uint8_t ndi:1;
|
||||
// Repetition Number, 4 bits
|
||||
uint8_t RepNum:4;
|
||||
// Modulation and Coding Scheme, 4 bits
|
||||
uint8_t mcs:4;
|
||||
// Resourse Assignment (RU Assignment), 3 bits
|
||||
uint8_t ResAssign:3;
|
||||
// Scheduling Delay, 3 bits
|
||||
uint8_t Scheddly:3;
|
||||
//NPDCCH order indicator (set to 0),1 bits
|
||||
uint8_t orderIndicator:1;
|
||||
/// type = 0 => DCI Format N0, type = 1 => DCI Format N1, 1 bits
|
||||
uint8_t type:1;
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
typedef struct DCIN1_RAR DCIN1_RAR_t;
|
||||
#define sizeof_DCIN1_RAR_t 23
|
||||
|
||||
struct DCIN1{
|
||||
// DCI subframe repetition Number, 2 bits
|
||||
uint8_t DCIRep:2;
|
||||
// HARQ-ACK resource,4 bits
|
||||
uint8_t HARQackRes:4;
|
||||
// New Data Indicator,1 bits
|
||||
uint8_t ndi:1;
|
||||
// Repetition Number, 4 bits
|
||||
uint8_t RepNum:4;
|
||||
// Modulation and Coding Scheme, 4 bits
|
||||
uint8_t mcs:4;
|
||||
// Resourse Assignment (RU Assignment), 3 bits
|
||||
uint8_t ResAssign:3;
|
||||
// Scheduling Delay, 3 bits
|
||||
uint8_t Scheddly:3;
|
||||
//NPDCCH order indicator (set to 0),1 bits
|
||||
uint8_t orderIndicator:1;
|
||||
/// type = 0 => DCI Format N0, type = 1 => DCI Format N1, 1 bits
|
||||
uint8_t type:1;
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
typedef struct DCIN1 DCIN1_t;
|
||||
#define sizeof_DCIN1_t 23
|
||||
|
||||
// DCI Format Type N2 for direct indication, 15 bits
|
||||
struct DCIN2_Ind{
|
||||
// Reserved information bits, 6 bits
|
||||
uint8_t resInfoBits:6;
|
||||
//Direct indication information, 8 bits
|
||||
uint8_t directIndInf:8;
|
||||
//Flag for paging(1)/direct indication(0), set to 0,1 bits
|
||||
uint8_t type:1;
|
||||
} __attribute__ ((__packed__));;
|
||||
|
||||
typedef struct DCIN2_Ind DCIN2_Ind_t;
|
||||
#define sizeof_DCIN2_Ind_t 15
|
||||
|
||||
// DCI Format Type N2 for Paging, 15 bits
|
||||
struct DCIN2_Pag{
|
||||
// Reserved 3 bits
|
||||
uint8_t DCIRep:3;
|
||||
// Repetition Number, 4 bits
|
||||
uint8_t RepNum:4;
|
||||
// Modulation and Coding Scheme, 4 bits
|
||||
uint8_t mcs:4;
|
||||
// Resourse Assignment (RU Assignment), 3 bits
|
||||
uint8_t ResAssign:3;
|
||||
//Flag for paging(1)/direct indication(0), set to 1,1 bits
|
||||
uint8_t type:1;
|
||||
} __attribute__ ((__packed__));;
|
||||
|
||||
typedef struct DCIN2_Pag DCIN2_Pag_t;
|
||||
|
||||
#define sizeof_DCIN2_Pag_t 15
|
||||
|
||||
#define MAX_DCI_SIZE_BITS_NB_IoT 23
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,787 @@
|
||||
/*******************************************************************************
|
||||
|
||||
*******************************************************************************/
|
||||
/*! \file PHY/LTE_TRANSPORT/defs_NB_IoT.h
|
||||
* \brief data structures for NPDSCH/NDLSCH/NPUSCH/NULSCH physical and transport channel descriptors (TX/RX) of NB-IoT
|
||||
* \author M. KANJ
|
||||
* \date 2017
|
||||
* \version 0.0
|
||||
* \company bcom
|
||||
* \email: matthieu.kanj@b-com.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#ifndef __LTE_TRANSPORT_DEFS_NB_IOT__H__
|
||||
#define __LTE_TRANSPORT_DEFS_NB_IOT__H__
|
||||
////#include "PHY/defs.h"
|
||||
//#include "PHY/defs_nb_iot.h"
|
||||
#include "PHY/LTE_TRANSPORT/dci_NB_IoT.h"
|
||||
#include "PHY/impl_defs_lte_NB_IoT.h"
|
||||
#include "openair2/COMMON/platform_types.h"
|
||||
//#include "dci.h"
|
||||
#include "PHY/LTE_TRANSPORT/uci_NB_IoT.h"
|
||||
//#include "dci.h"
|
||||
//#include "uci.h"
|
||||
//#ifndef STANDALONE_COMPILE
|
||||
//#include "UTIL/LISTS/list.h"
|
||||
//#endif
|
||||
|
||||
//#include "dci_nb_iot.h"
|
||||
|
||||
//#define MOD_TABLE_QPSK_OFFSET 1
|
||||
//#define MOD_TABLE_16QAM_OFFSET 5
|
||||
//#define MOD_TABLE_64QAM_OFFSET 21
|
||||
//#define MOD_TABLE_PSS_OFFSET 85
|
||||
//
|
||||
//// structures below implement 36-211 and 36-212
|
||||
//
|
||||
//#define NSOFT 1827072
|
||||
#define LTE_NULL_NB_IoT 2
|
||||
//
|
||||
//// maximum of 3 segments before each coding block if data length exceeds 6144 bits.
|
||||
//
|
||||
#define MAX_NUM_DLSCH_SEGMENTS_NB_IoT 16
|
||||
//#define MAX_NUM_ULSCH_SEGMENTS MAX_NUM_DLSCH_SEGMENTS
|
||||
//#define MAX_DLSCH_PAYLOAD_BYTES (MAX_NUM_DLSCH_SEGMENTS*768)
|
||||
//#define MAX_ULSCH_PAYLOAD_BYTES (MAX_NUM_ULSCH_SEGMENTS*768)
|
||||
//
|
||||
//#define MAX_NUM_CHANNEL_BITS_NB_IOT (14*1200*6) // 14 symbols, 1200 REs, 12 bits/RE
|
||||
//#define MAX_NUM_RE (14*1200)
|
||||
//
|
||||
//#if !defined(SI_RNTI)
|
||||
//#define SI_RNTI (rnti_t)0xffff
|
||||
//#endif
|
||||
//#if !defined(M_RNTI)
|
||||
//#define M_RNTI (rnti_t)0xfffd
|
||||
//#endif
|
||||
//#if !defined(P_RNTI)
|
||||
//#define P_RNTI (rnti_t)0xfffe
|
||||
//#endif
|
||||
//#if !defined(CBA_RNTI)
|
||||
//#define CBA_RNTI (rnti_t)0xfff4
|
||||
//#endif
|
||||
//#if !defined(C_RNTI)
|
||||
//#define C_RNTI (rnti_t)0x1234
|
||||
//#endif
|
||||
//
|
||||
//#define PMI_2A_11 0
|
||||
//#define PMI_2A_1m1 1
|
||||
//#define PMI_2A_1j 2
|
||||
//#define PMI_2A_1mj 3
|
||||
//
|
||||
//// for NB-IoT
|
||||
#define MAX_NUM_CHANNEL_BITS_NB_IoT 3360 //14 symbols * 12 sub-carriers * 10 SF * 2bits/RE // to check during real tests
|
||||
#define MAX_DL_SIZE_BITS_NB_IoT 680 // in release 13 // in release 14 = 2048 // ??? **** not sure
|
||||
////#define MAX_NUM_CHANNEL_BITS_NB_IOT 3*680 /// ??? ****not sure
|
||||
//
|
||||
//// to be created LTE_eNB_DLSCH_t --> is duplicated for each number of UE and then indexed in the table
|
||||
//
|
||||
//typedef struct { // LTE_DL_eNB_HARQ_t
|
||||
// /// Status Flag indicating for this DLSCH (idle,active,disabled)
|
||||
// SCH_status_t status;
|
||||
// /// Transport block size
|
||||
// uint32_t TBS;
|
||||
// /// The payload + CRC size in bits, "B" from 36-212
|
||||
// uint32_t B; // keep this parameter
|
||||
// /// Pointer to the payload
|
||||
// uint8_t *b; // keep this parameter
|
||||
// /// Pointers to transport block segments
|
||||
// //uint8_t *c[MAX_NUM_DLSCH_SEGMENTS];
|
||||
// /// RTC values for each segment (for definition see 36-212 V8.6 2009-03, p.15)
|
||||
// // uint32_t RTC[MAX_NUM_DLSCH_SEGMENTS];
|
||||
// /// Frame where current HARQ round was sent
|
||||
// uint32_t frame;
|
||||
// /// Subframe where current HARQ round was sent
|
||||
// uint32_t subframe;
|
||||
// /// Index of current HARQ round for this DLSCH
|
||||
// uint8_t round;
|
||||
// /// MCS format for this DLSCH
|
||||
// uint8_t mcs;
|
||||
// /// Redundancy-version of the current sub-frame
|
||||
// uint8_t rvidx;
|
||||
// /// MIMO mode for this DLSCH
|
||||
// MIMO_mode_t mimo_mode;
|
||||
// /// Current RB allocation
|
||||
// uint32_t rb_alloc[4];
|
||||
// /// distributed/localized flag
|
||||
// vrb_t vrb_type;
|
||||
// /// Current subband PMI allocation
|
||||
// uint16_t pmi_alloc;
|
||||
// /// Current subband RI allocation
|
||||
// uint32_t ri_alloc;
|
||||
// /// Current subband CQI1 allocation
|
||||
// uint32_t cqi_alloc1;
|
||||
// /// Current subband CQI2 allocation
|
||||
// uint32_t cqi_alloc2;
|
||||
// /// Current Number of RBs
|
||||
// uint16_t nb_rb;
|
||||
// /// downlink power offset field
|
||||
// uint8_t dl_power_off;
|
||||
// /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
|
||||
// uint8_t e[MAX_NUM_CHANNEL_BITS_NB_IOT];
|
||||
// /// data after scrambling
|
||||
// uint8_t s_e[MAX_NUM_CHANNEL_BITS_NB_IOT];
|
||||
// /// length of the table e
|
||||
// uint16_t length_e // new parameter
|
||||
// /// Tail-biting convolutional coding outputs
|
||||
// uint8_t d[96+(3*(24+MAX_DL_SIZE_BITS_NB_IOT))]; // new parameter
|
||||
// /// Sub-block interleaver outputs
|
||||
// uint8_t w[3*3*(MAX_DL_SIZE_BITS_NB_IOT+24)]; // new parameter
|
||||
// /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17, TM3-4)
|
||||
// uint8_t Nl;
|
||||
// /// Number of layers for this PDSCH transmission (TM8-10)
|
||||
// uint8_t Nlayers;
|
||||
// /// First layer for this PSCH transmission
|
||||
// uint8_t first_layer;
|
||||
//} NB_IoT_DL_eNB_HARQ_t;
|
||||
|
||||
typedef enum {
|
||||
|
||||
SCH_IDLE_NB_IoT,
|
||||
ACTIVE_NB_IoT,
|
||||
CBA_ACTIVE_NB_IoT,
|
||||
DISABLED_NB_IoT
|
||||
|
||||
} SCH_status_NB_IoT_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
/// NB-IoT
|
||||
SCH_status_NB_IoT_t status;
|
||||
/// The scheduling the NPDCCH and the NPDSCH transmission TS 36.213 Table 16.4.1-1
|
||||
uint8_t scheduling_delay;
|
||||
/// The number of the subframe to transmit the NPDSCH Table TS 36.213 Table 16.4.1.3-1 (Nsf) (NB. in this case is not the index Isf)
|
||||
uint8_t resource_assignment;
|
||||
/// is the index that determined the repeat number of NPDSCH through table TS 36.213 Table 16.4.1.3-2 / for SIB1-NB Table 16.4.1.3-3
|
||||
uint8_t repetition_number;
|
||||
/// Determined the ACK/NACK delay and the subcarrier allocation TS 36.213 Table 16.4.2
|
||||
uint8_t HARQ_ACK_resource;
|
||||
/// Determined the repetition number value 0-3 (2 biut carried by the FAPI NPDCCH)
|
||||
uint8_t dci_subframe_repetitions;
|
||||
/// modulation always QPSK Qm = 2
|
||||
uint8_t modulation;
|
||||
/// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
|
||||
uint8_t e[MAX_NUM_CHANNEL_BITS_NB_IoT];
|
||||
/// data after scrambling
|
||||
uint8_t s_e[MAX_NUM_CHANNEL_BITS_NB_IoT];
|
||||
//length of the table e
|
||||
uint16_t length_e; // new parameter
|
||||
/// Tail-biting convolutional coding outputs
|
||||
uint8_t d[96+(3*(24+MAX_DL_SIZE_BITS_NB_IoT))]; // new parameter
|
||||
/// Sub-block interleaver outputs
|
||||
uint8_t w[3*3*(MAX_DL_SIZE_BITS_NB_IoT+24)]; // new parameter
|
||||
|
||||
/// Status Flag indicating for this DLSCH (idle,active,disabled)
|
||||
//SCH_status_t status;
|
||||
/// Transport block size
|
||||
uint32_t TBS;
|
||||
/// The payload + CRC size in bits, "B" from 36-212
|
||||
uint32_t B;
|
||||
/// Pointer to the payload
|
||||
uint8_t *b;
|
||||
///pdu of the ndlsch message
|
||||
uint8_t *pdu;
|
||||
/// Frame where current HARQ round was sent
|
||||
uint32_t frame;
|
||||
/// Subframe where current HARQ round was sent
|
||||
uint32_t subframe;
|
||||
/// Index of current HARQ round for this DLSCH
|
||||
uint8_t round;
|
||||
/// MCS format for this NDLSCH , TS 36.213 Table 16.4.1.5
|
||||
uint8_t mcs;
|
||||
// we don't have code block segmentation / crc attachment / concatenation in NB-IoT R13 36.212 6.4.2
|
||||
// we don't have beamforming in NB-IoT
|
||||
//this index will be used mainly for SI message buffer
|
||||
uint8_t pdu_buffer_index;
|
||||
|
||||
} NB_IoT_DL_eNB_HARQ_t;
|
||||
|
||||
|
||||
typedef struct { // LTE_eNB_DLSCH_t
|
||||
/// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding)
|
||||
uint32_t *txdataF[8];
|
||||
/// Allocated RNTI (0 means DLSCH_t is not currently used)
|
||||
uint16_t rnti;
|
||||
/// Active flag for baseband transmitter processing
|
||||
uint8_t active;
|
||||
/// Indicator of TX activation per subframe. Used during PUCCH detection for ACK/NAK.
|
||||
uint8_t subframe_tx[10];
|
||||
/// First CCE of last PDSCH scheduling per subframe. Again used during PUCCH detection for ACK/NAK.
|
||||
uint8_t nCCE[10];
|
||||
/// Current HARQ process id
|
||||
uint8_t current_harq_pid;
|
||||
/// Process ID's per subframe. Used to associate received ACKs on PUSCH/PUCCH to DLSCH harq process ids
|
||||
uint8_t harq_ids[10];
|
||||
/// Window size (in outgoing transport blocks) for fine-grain rate adaptation
|
||||
uint8_t ra_window_size;
|
||||
/// First-round error threshold for fine-grain rate adaptation
|
||||
uint8_t error_threshold;
|
||||
/// Pointers to 8 HARQ processes for the DLSCH
|
||||
NB_IoT_DL_eNB_HARQ_t harq_process;
|
||||
/// circular list of free harq PIDs (the oldest come first)
|
||||
/// (10 is arbitrary value, must be > to max number of DL HARQ processes in LTE)
|
||||
int harq_pid_freelist[10];
|
||||
/// the head position of the free list (if list is free then head=tail)
|
||||
int head_freelist;
|
||||
/// the tail position of the free list
|
||||
int tail_freelist;
|
||||
/// Number of soft channel bits
|
||||
uint32_t G;
|
||||
/// Codebook index for this dlsch (0,1,2,3)
|
||||
uint8_t codebook_index;
|
||||
/// Maximum number of HARQ processes (for definition see 36-212 V8.6 2009-03, p.17)
|
||||
uint8_t Mdlharq;
|
||||
/// Maximum number of HARQ rounds
|
||||
uint8_t Mlimit;
|
||||
/// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
|
||||
uint8_t Kmimo;
|
||||
/// Nsoft parameter related to UE Category
|
||||
uint32_t Nsoft;
|
||||
/// amplitude of PDSCH (compared to RS) in symbols without pilots
|
||||
int16_t sqrt_rho_a;
|
||||
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
|
||||
int16_t sqrt_rho_b;
|
||||
|
||||
} NB_IoT_eNB_DLSCH_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
/// HARQ process id
|
||||
uint8_t harq_id;
|
||||
/// ACK bits (after decoding) 0:NACK / 1:ACK / 2:DTX
|
||||
uint8_t ack;
|
||||
/// send status (for PUCCH)
|
||||
uint8_t send_harq_status;
|
||||
/// nCCE (for PUCCH)
|
||||
uint8_t nCCE;
|
||||
/// DAI value detected from DCI1/1a/1b/1d/2/2a/2b/2c. 0xff indicates not touched
|
||||
uint8_t vDAI_DL;
|
||||
/// DAI value detected from DCI0/4. 0xff indicates not touched
|
||||
uint8_t vDAI_UL;
|
||||
} harq_status_NB_IoT_t;
|
||||
|
||||
typedef struct {
|
||||
/// UL RSSI per receive antenna
|
||||
int32_t UL_rssi[NB_ANTENNAS_RX];
|
||||
/// PUCCH1a/b power (digital linear)
|
||||
uint32_t Po_PUCCH;
|
||||
/// PUCCH1a/b power (dBm)
|
||||
int32_t Po_PUCCH_dBm;
|
||||
/// PUCCH1 power (digital linear), conditioned on below threshold
|
||||
uint32_t Po_PUCCH1_below;
|
||||
/// PUCCH1 power (digital linear), conditioned on above threshold
|
||||
uint32_t Po_PUCCH1_above;
|
||||
/// Indicator that Po_PUCCH has been updated by PHY
|
||||
int32_t Po_PUCCH_update;
|
||||
/// DL Wideband CQI index (2 TBs)
|
||||
uint8_t DL_cqi[2];
|
||||
/// DL Subband CQI index (from HLC feedback)
|
||||
uint8_t DL_subband_cqi[2][13];
|
||||
/// DL PMI Single Stream
|
||||
uint16_t DL_pmi_single;
|
||||
/// DL PMI Dual Stream
|
||||
uint16_t DL_pmi_dual;
|
||||
/// Current RI
|
||||
uint8_t rank;
|
||||
/// CRNTI of UE
|
||||
uint16_t crnti; ///user id (rnti) of connected UEs
|
||||
/// Initial timing offset estimate from PRACH for RAR
|
||||
int32_t UE_timing_offset;
|
||||
/// Timing advance estimate from PUSCH for MAC timing advance signalling
|
||||
int32_t timing_advance_update;
|
||||
/// Current mode of UE (NOT SYCHED, RAR, PUSCH)
|
||||
UE_MODE_NB_IoT_t mode;
|
||||
/// Current sector where UE is attached
|
||||
uint8_t sector;
|
||||
|
||||
/// dlsch l2 errors
|
||||
uint32_t dlsch_l2_errors[8];
|
||||
/// dlsch trials per harq and round
|
||||
uint32_t dlsch_trials[8][8];
|
||||
/// dlsch ACK/NACK per hard_pid and round
|
||||
uint32_t dlsch_ACK[8][8];
|
||||
uint32_t dlsch_NAK[8][8];
|
||||
|
||||
/// ulsch l2 errors per harq_pid
|
||||
uint32_t ulsch_errors[8];
|
||||
/// ulsch l2 consecutive errors per harq_pid
|
||||
uint32_t ulsch_consecutive_errors; //[8];
|
||||
/// ulsch trials/errors/fer per harq and round
|
||||
uint32_t nulsch_decoding_attempts[8][8];
|
||||
uint32_t ulsch_round_errors[8][8];
|
||||
uint32_t ulsch_decoding_attempts_last[8][8];
|
||||
uint32_t ulsch_round_errors_last[8][8];
|
||||
uint32_t ulsch_round_fer[8][8];
|
||||
uint32_t sr_received;
|
||||
uint32_t sr_total;
|
||||
|
||||
/// dlsch sliding count and total errors in round 0 are used to compute the dlsch_mcs_offset
|
||||
uint32_t dlsch_sliding_cnt;
|
||||
uint32_t dlsch_NAK_round0;
|
||||
int8_t dlsch_mcs_offset;
|
||||
|
||||
/// Target mcs1 after rate-adaptation (used by MAC layer scheduler)
|
||||
uint8_t dlsch_mcs1;
|
||||
/// Target mcs2 after rate-adaptation (used by MAC layer scheduler)
|
||||
uint8_t dlsch_mcs2;
|
||||
/// Total bits received from MAC on PDSCH
|
||||
int total_TBS_MAC;
|
||||
/// Total bits acknowledged on PDSCH
|
||||
int total_TBS;
|
||||
/// Total bits acknowledged on PDSCH (last interval)
|
||||
int total_TBS_last;
|
||||
/// Bitrate on the PDSCH [bps]
|
||||
unsigned int dlsch_bitrate;
|
||||
// unsigned int total_transmitted_bits;
|
||||
|
||||
} NB_IoT_eNB_UE_stats;
|
||||
|
||||
typedef struct {
|
||||
/// Indicator of first transmission
|
||||
uint8_t first_tx;
|
||||
/// Last Ndi received for this process on DCI (used for C-RNTI only)
|
||||
uint8_t DCINdi;
|
||||
/// DLSCH status flag indicating
|
||||
//SCH_status_t status;
|
||||
/// Transport block size
|
||||
uint32_t TBS;
|
||||
/// The payload + CRC size in bits
|
||||
uint32_t B;
|
||||
/// Pointer to the payload
|
||||
uint8_t *b;
|
||||
/// Pointers to transport block segments
|
||||
uint8_t *c[MAX_NUM_DLSCH_SEGMENTS_NB_IoT];
|
||||
/// RTC values for each segment (for definition see 36-212 V8.6 2009-03, p.15)
|
||||
uint32_t RTC[MAX_NUM_DLSCH_SEGMENTS_NB_IoT];
|
||||
/// Index of current HARQ round for this DLSCH
|
||||
uint8_t round;
|
||||
/// MCS format for this DLSCH
|
||||
uint8_t mcs;
|
||||
/// Qm (modulation order) for this DLSCH
|
||||
uint8_t Qm;
|
||||
/// Redundancy-version of the current sub-frame
|
||||
uint8_t rvidx;
|
||||
/// MIMO mode for this DLSCH
|
||||
// MIMO_mode_t mimo_mode;
|
||||
/// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
|
||||
int16_t w[MAX_NUM_DLSCH_SEGMENTS_NB_IoT][3*(6144+64)];
|
||||
/// for abstraction soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
|
||||
double w_abs[MAX_NUM_DLSCH_SEGMENTS_NB_IoT][3*(6144+64)];
|
||||
/// soft bits for each received segment ("d"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
|
||||
int16_t *d[MAX_NUM_DLSCH_SEGMENTS_NB_IoT];
|
||||
/// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9)
|
||||
uint32_t C;
|
||||
/// Number of "small" code segments (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t Cminus;
|
||||
/// Number of "large" code segments (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t Cplus;
|
||||
/// Number of bits in "small" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t Kminus;
|
||||
/// Number of bits in "large" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t Kplus;
|
||||
/// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t F;
|
||||
/// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17)
|
||||
uint8_t Nl;
|
||||
/// current delta_pucch
|
||||
int8_t delta_PUCCH;
|
||||
/// Number of soft channel bits
|
||||
uint32_t G;
|
||||
/// Current Number of RBs
|
||||
uint16_t nb_rb;
|
||||
/// Current subband PMI allocation
|
||||
uint16_t pmi_alloc;
|
||||
/// Current RB allocation (even slots)
|
||||
uint32_t rb_alloc_even[4];
|
||||
/// Current RB allocation (odd slots)
|
||||
uint32_t rb_alloc_odd[4];
|
||||
/// distributed/localized flag
|
||||
//vrb_t vrb_type;
|
||||
/// downlink power offset field
|
||||
uint8_t dl_power_off;
|
||||
/// trials per round statistics
|
||||
uint32_t trials[8];
|
||||
/// error statistics per round
|
||||
uint32_t errors[8];
|
||||
/// codeword this transport block is mapped to
|
||||
uint8_t codeword;
|
||||
|
||||
} NB_IoT_DL_UE_HARQ_t;
|
||||
|
||||
typedef struct {
|
||||
/// RNTI
|
||||
uint16_t rnti;
|
||||
/// Active flag for DLSCH demodulation
|
||||
uint8_t active;
|
||||
/// Transmission mode
|
||||
uint8_t mode1_flag;
|
||||
/// amplitude of PDSCH (compared to RS) in symbols without pilots
|
||||
int16_t sqrt_rho_a;
|
||||
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
|
||||
int16_t sqrt_rho_b;
|
||||
/// Current HARQ process id threadRx Odd and threadRx Even
|
||||
uint8_t current_harq_pid;
|
||||
/// Current subband antenna selection
|
||||
uint32_t antenna_alloc;
|
||||
/// Current subband RI allocation
|
||||
uint32_t ri_alloc;
|
||||
/// Current subband CQI1 allocation
|
||||
uint32_t cqi_alloc1;
|
||||
/// Current subband CQI2 allocation
|
||||
uint32_t cqi_alloc2;
|
||||
/// saved subband PMI allocation from last PUSCH/PUCCH report
|
||||
uint16_t pmi_alloc;
|
||||
/// HARQ-ACKs
|
||||
harq_status_NB_IoT_t harq_ack;
|
||||
/// Pointers to up to 8 HARQ processes
|
||||
NB_IoT_DL_UE_HARQ_t *harq_process;
|
||||
/// Maximum number of HARQ processes(for definition see 36-212 V8.6 2009-03, p.17
|
||||
uint8_t Mdlharq;
|
||||
/// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
|
||||
uint8_t Kmimo;
|
||||
/// Nsoft parameter related to UE Category
|
||||
uint32_t Nsoft;
|
||||
/// Maximum number of Turbo iterations
|
||||
uint8_t max_turbo_iterations;
|
||||
/// number of iterations used in last turbo decoding
|
||||
uint8_t last_iteration_cnt;
|
||||
/// accumulated tx power adjustment for PUCCH
|
||||
int8_t g_pucch;
|
||||
|
||||
} NB_IoT_UE_DLSCH_t;
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------
|
||||
// NB-IoT
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
|
||||
//enum for distinguish the different type of ndlsch (may in the future will be not needed)
|
||||
typedef enum
|
||||
{
|
||||
|
||||
SIB1,
|
||||
SI_Message,
|
||||
RAR,
|
||||
UE_Data
|
||||
|
||||
}ndlsch_flag_t;
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
rnti_t rnti;
|
||||
//array containing the pdus of DCI
|
||||
uint8_t *a[2];
|
||||
//Array containing encoded DCI data
|
||||
uint8_t *e[2];
|
||||
|
||||
//UE specific parameters
|
||||
uint16_t npdcch_NumRepetitions;
|
||||
|
||||
uint16_t repetition_number;
|
||||
//indicate the corresponding subframe within the repetition (set to 0 when a new NPDCCH pdu is received)
|
||||
uint16_t repetition_idx;
|
||||
|
||||
// uint16_t npdcch_Offset_USS;
|
||||
// uint16_t npdcch_StartSF_USS;
|
||||
|
||||
|
||||
}NB_IoT_eNB_NPDCCH_t;
|
||||
|
||||
|
||||
typedef struct{
|
||||
|
||||
//Number of repetitions (R) for common search space (RAR and PAGING)
|
||||
uint16_t number_repetition_RA;
|
||||
uint16_t number_repetition_PAg;
|
||||
//index of the current subframe among the repetition (set to 0 when we receive the new NPDCCH)
|
||||
uint16_t repetition_idx_RA;
|
||||
uint16_t repetition_idx_Pag;
|
||||
|
||||
}NB_IoT_eNB_COMMON_NPDCCH_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
|
||||
/// Length of DCI in bits
|
||||
uint8_t dci_length;
|
||||
/// Aggregation level only 1,2 in NB-IoT
|
||||
uint8_t L;
|
||||
/// Position of first CCE of the dci
|
||||
int firstCCE;
|
||||
/// flag to indicate that this is a RA response
|
||||
boolean_t ra_flag;
|
||||
/// rnti
|
||||
rnti_t rnti;
|
||||
/// Format
|
||||
DCI_format_NB_IoT_t format;
|
||||
/// DCI pdu
|
||||
uint8_t dci_pdu[8];
|
||||
|
||||
} DCI_ALLOC_NB_IoT_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
//delete the count for the DCI numbers,NUM_DCI_MAX should set to 2
|
||||
uint32_t num_npdcch_symbols;
|
||||
///indicates the starting OFDM symbol in the first slot of a subframe k for the NPDCCH transmission
|
||||
/// see FAPI/NFAPI specs Table 4-45
|
||||
uint8_t npdcch_start_symbol;
|
||||
uint8_t Num_dci;
|
||||
DCI_ALLOC_NB_IoT_t dci_alloc[2] ;
|
||||
|
||||
} DCI_PDU_NB_IoT;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
/// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding)
|
||||
int32_t *txdataF[8];
|
||||
/// dl channel estimates (estimated from ul channel estimates)
|
||||
int32_t **calib_dl_ch_estimates;
|
||||
/// Allocated RNTI (0 means DLSCH_t is not currently used)
|
||||
uint16_t rnti;
|
||||
/// Active flag for baseband transmitter processing
|
||||
uint8_t active;
|
||||
/// Indicator of TX activation per subframe. Used during PUCCH detection for ACK/NAK.
|
||||
uint8_t subframe_tx[10];
|
||||
/// First CCE of last PDSCH scheduling per subframe. Again used during PUCCH detection for ACK/NAK.
|
||||
uint8_t nCCE[10];
|
||||
/*in NB-IoT there is only 1 HARQ process for each UE therefore no pid is required*/
|
||||
/// The only HARQ process for the DLSCH
|
||||
NB_IoT_DL_eNB_HARQ_t *harq_process;
|
||||
/// Number of soft channel bits
|
||||
uint32_t G;
|
||||
/// Maximum number of HARQ rounds
|
||||
uint8_t Mlimit;
|
||||
/// Nsoft parameter related to UE Category
|
||||
uint32_t Nsoft;
|
||||
/// amplitude of PDSCH (compared to RS) in symbols without pilots
|
||||
int16_t sqrt_rho_a;
|
||||
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
|
||||
int16_t sqrt_rho_b;
|
||||
///NB-IoT
|
||||
/// may use in the npdsch_procedures
|
||||
uint16_t scrambling_sequence_intialization;
|
||||
/// number of cell specific TX antenna ports assumed by the UE
|
||||
uint8_t nrs_antenna_ports;
|
||||
|
||||
//This indicate the current subframe within the subframe interval between the NPDSCH transmission (Nsf*Nrep)
|
||||
uint16_t sf_index;
|
||||
///indicates the starting OFDM symbol in the first slot of a subframe k for the NPDSCH transmission
|
||||
/// see FAPI/NFAPI specs Table 4-47
|
||||
uint8_t npdsch_start_symbol;
|
||||
/*SIB1-NB related parameters*/
|
||||
///flag for indicate if the current frame is the start of a new SIB1-NB repetition within the SIB1-NB period (0 = FALSE, 1 = TRUE)
|
||||
uint8_t sib1_rep_start;
|
||||
///the number of the frame within the 16 continuous frame in which sib1-NB is transmitted (1-8 = 1st, 2nd ecc..) (0 = not foresees a transmission)
|
||||
uint8_t relative_sib1_frame;
|
||||
//Flag used to discern among different NDLSCH structures (SIB1,SI,RA,UE-spec)
|
||||
//(used inside the ndlsch procedure for distinguish the different type of data to manage also in term of repetitions and transmission over more subframes
|
||||
ndlsch_flag_t ndlsch_type;
|
||||
|
||||
} NB_IoT_eNB_NDLSCH_t;
|
||||
|
||||
typedef struct {
|
||||
/// Length of CQI data under RI=1 assumption(bits)
|
||||
uint8_t Or1;
|
||||
/// Rank information
|
||||
uint8_t o_RI[2];
|
||||
/// Format of CQI data
|
||||
UCI_format_NB_IoT_t uci_format;
|
||||
/// The value of DAI in DCI format 0
|
||||
uint8_t V_UL_DAI;
|
||||
/// Pointer to CQI data
|
||||
uint8_t o[MAX_CQI_BYTES_NB_IoT];
|
||||
/// CQI CRC status
|
||||
uint8_t cqi_crc_status;
|
||||
/// PHICH active flag
|
||||
uint8_t phich_active;
|
||||
/// PHICH ACK
|
||||
uint8_t phich_ACK;
|
||||
/// Length of rank information (bits)
|
||||
uint8_t O_RI;
|
||||
/// First Allocated RB
|
||||
uint16_t first_rb;
|
||||
/// Current Number of RBs
|
||||
uint16_t nb_rb;
|
||||
/// Determined the subcarrier allocation for the NPUSCH.(15, 3.75 KHz)
|
||||
uint8_t subcarrier_indication;
|
||||
/// Determined the number of resource unit for the NPUSCH
|
||||
uint8_t resource_assignment;
|
||||
/// Determined the scheduling delay for NPUSCH
|
||||
uint8_t scheduling_delay;
|
||||
/// The number of the repetition number for NPUSCH Transport block
|
||||
uint8_t repetition_number;
|
||||
/// Determined the repetition number value 0-3
|
||||
uint8_t dci_subframe_repetitions;
|
||||
/// Flag indicating that this ULSCH has been allocated by a DCI (otherwise it is a retransmission based on PHICH NAK)
|
||||
uint8_t dci_alloc;
|
||||
/// Flag indicating that this ULSCH has been allocated by a RAR (otherwise it is a retransmission based on PHICH NAK or DCI)
|
||||
uint8_t rar_alloc;
|
||||
/// Status Flag indicating for this ULSCH (idle,active,disabled)
|
||||
SCH_status_NB_IoT_t status;
|
||||
/// Subframe scheduling indicator (i.e. Transmission opportunity indicator)
|
||||
uint8_t subframe_scheduling_flag;
|
||||
/// Transport block size
|
||||
uint32_t TBS;
|
||||
/// The payload + CRC size in bits
|
||||
uint32_t B;
|
||||
/// Number of soft channel bits
|
||||
uint32_t G;
|
||||
/// Pointer to ACK
|
||||
uint8_t o_ACK[4];
|
||||
/// Length of ACK information (bits)
|
||||
uint8_t O_ACK;
|
||||
/// coded ACK bits
|
||||
int16_t q_ACK[MAX_ACK_PAYLOAD_NB_IoT];
|
||||
/// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9)
|
||||
/// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
|
||||
int16_t e[MAX_NUM_CHANNEL_BITS_NB_IoT] __attribute__((aligned(32)));
|
||||
/// coded RI bits
|
||||
int16_t q_RI[MAX_RI_PAYLOAD_NB_IoT];
|
||||
/// "q" sequences for CQI/PMI (for definition see 36-212 V8.6 2009-03, p.27)
|
||||
int8_t q[MAX_CQI_PAYLOAD_NB_IoT];
|
||||
/// number of coded CQI bits after interleaving
|
||||
uint8_t o_RCC;
|
||||
/// coded and interleaved CQI bits
|
||||
int8_t o_w[(MAX_CQI_BITS_NB_IoT+8)*3];
|
||||
/// coded CQI bits
|
||||
int8_t o_d[96+((MAX_CQI_BITS_NB_IoT+8)*3)];
|
||||
///
|
||||
uint32_t C;
|
||||
/// Number of "small" code segments (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t Cminus;
|
||||
/// Number of "large" code segments (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t Cplus;
|
||||
/// Number of bits in "small" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t Kminus;
|
||||
/// Number of bits in "large" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t Kplus;
|
||||
/// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10)
|
||||
uint32_t F;
|
||||
/// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled
|
||||
//uint8_t h[MAX_NUM_CHANNEL_BITS];
|
||||
/// SRS active flag
|
||||
uint8_t srs_active;
|
||||
/// Pointer to the payload
|
||||
uint8_t *b;
|
||||
/// Current Number of Symbols
|
||||
uint8_t Nsymb_pusch;
|
||||
/// Index of current HARQ round for this ULSCH
|
||||
uint8_t round;
|
||||
/// MCS format for this ULSCH
|
||||
uint8_t mcs;
|
||||
/// Redundancy-version of the current sub-frame (value 0->RV0,value 1 ->RV2)
|
||||
uint8_t rvidx;
|
||||
/// Msc_initial, Initial number of subcarriers for ULSCH (36-212, v8.6 2009-03, p.26-27)
|
||||
uint16_t Msc_initial;
|
||||
/// Nsymb_initial, Initial number of symbols for ULSCH (36-212, v8.6 2009-03, p.26-27)
|
||||
uint8_t Nsymb_initial;
|
||||
/// n_DMRS for cyclic shift of DMRS (36.213 Table 9.1.2-2)
|
||||
uint8_t n_DMRS;
|
||||
/// n_DMRS for cyclic shift of DMRS (36.213 Table 9.1.2-2) - previous scheduling
|
||||
/// This is needed for PHICH generation which
|
||||
/// is done after a new scheduling
|
||||
uint8_t previous_n_DMRS;
|
||||
/// n_DMRS 2 for cyclic shift of DMRS (36.211 Table 5.5.1.1.-1)
|
||||
uint8_t n_DMRS2;
|
||||
/// Flag to indicate that this ULSCH is for calibration information sent from UE (i.e. no MAC SDU to pass up)
|
||||
// int calibration_flag;
|
||||
/// delta_TF for power control
|
||||
int32_t delta_TF;
|
||||
///////////////////////////////////////////// 4 parameter added by vincent ///////////////////////////////////////////////
|
||||
// NB_IoT: Nsymb_UL and Nslot_UL are defined in 36.211, Section 10.1.2.3, Table 10.1.2.3-1
|
||||
// The number of symbol in a resource unit is given by Nsymb_UL*Nslot_UL
|
||||
uint8_t Nsymb_UL;
|
||||
// Number of NPUSCH slots
|
||||
uint8_t Nslot_UL;
|
||||
// Number of subcarrier for NPUSH, can be 1, 3, 6, 12
|
||||
uint8_t N_sc_RU;
|
||||
// Index of UL NB_IoT resource block
|
||||
uint32_t UL_RB_ID_NB_IoT;
|
||||
// Subcarrier indication fields, obtained through DCI, Section 16.5.1.1 in 36.213
|
||||
uint16_t I_sc;
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
} NB_IoT_UL_eNB_HARQ_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
/// Pointers to the HARQ processes for the NULSCH
|
||||
NB_IoT_UL_eNB_HARQ_t *harq_process;
|
||||
/// Maximum number of HARQ rounds
|
||||
uint8_t Mlimit;
|
||||
/// Value 0 = npush format 1 (data) value 1 = npusch format 2 (ACK/NAK)
|
||||
uint8_t npusch_format;
|
||||
/// Flag to indicate that eNB awaits UE Msg3
|
||||
uint8_t Msg3_active;
|
||||
/// Flag to indicate that eNB should decode UE Msg3
|
||||
uint8_t Msg3_flag;
|
||||
/// Subframe for Msg3
|
||||
uint8_t Msg3_subframe;
|
||||
/// Frame for Msg3
|
||||
uint32_t Msg3_frame;
|
||||
/// RNTI attributed to this ULSCH
|
||||
uint16_t rnti;
|
||||
/// cyclic shift for DM RS
|
||||
uint8_t cyclicShift;
|
||||
/// cooperation flag
|
||||
uint8_t cooperation_flag;
|
||||
/// (only in-band mode), indicate the resource block overlap the SRS configuration of LTE
|
||||
uint8_t N_srs;
|
||||
///
|
||||
uint8_t scrambling_re_intialization_batch_index;
|
||||
/// number of cell specific TX antenna ports assumed by the UE
|
||||
uint8_t nrs_antenna_ports;
|
||||
///
|
||||
uint16_t scrambling_sequence_intialization;
|
||||
///
|
||||
uint16_t sf_index;
|
||||
/// Determined the ACK/NACK delay and the subcarrier allocation TS 36.213 Table 16.4.2
|
||||
uint8_t HARQ_ACK_resource;
|
||||
|
||||
///////////// kept from LTE ///////////////////////////////////////////////////
|
||||
|
||||
/// Maximum number of iterations used in eNB turbo decoder
|
||||
uint8_t max_turbo_iterations;
|
||||
/// ACK/NAK Bundling flag
|
||||
uint8_t bundling;
|
||||
/// beta_offset_cqi times 8
|
||||
uint16_t beta_offset_cqi_times8;
|
||||
/// beta_offset_ri times 8
|
||||
uint16_t beta_offset_ri_times8;
|
||||
/// beta_offset_harqack times 8
|
||||
uint16_t beta_offset_harqack_times8;
|
||||
/// num active cba group
|
||||
uint8_t num_active_cba_groups;
|
||||
/// allocated CBA RNTI for this ulsch
|
||||
uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP];
|
||||
#ifdef LOCALIZATION
|
||||
/// epoch timestamp in millisecond
|
||||
int32_t reference_timestamp_ms;
|
||||
/// aggregate physical states every n millisecond
|
||||
int32_t aggregation_period_ms;
|
||||
/// a set of lists used for localization
|
||||
struct list loc_rss_list[10], loc_rssi_list[10], loc_subcarrier_rss_list[10], loc_timing_advance_list[10], loc_timing_update_list[10];
|
||||
struct list tot_loc_rss_list, tot_loc_rssi_list, tot_loc_subcarrier_rss_list, tot_loc_timing_advance_list, tot_loc_timing_update_list;
|
||||
#endif
|
||||
|
||||
} NB_IoT_eNB_NULSCH_t;
|
||||
|
||||
#define NPBCH_A 34
|
||||
|
||||
typedef struct {
|
||||
//the 2 LSB of the hsfn (the MSB are indicated by the SIB1-NB)
|
||||
uint16_t h_sfn_lsb;
|
||||
|
||||
uint8_t npbch_d[96+(3*(16+NPBCH_A))];
|
||||
uint8_t npbch_w[3*3*(16+NPBCH_A)];
|
||||
uint8_t npbch_e[1600];
|
||||
///pdu of the npbch message
|
||||
uint8_t *pdu;
|
||||
|
||||
} NB_IoT_eNB_NPBCH_t;
|
||||
|
||||
|
||||
#endif
|
||||
@@ -286,13 +286,13 @@ int dlsch_encoding_2threads0(te_params *tep) {
|
||||
|
||||
|
||||
|
||||
threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
dlsch->harq_processes[harq_pid]->RTC[r] =
|
||||
sub_block_interleaving_turbo(4+(Kr_bytes*8),
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
@@ -458,13 +458,13 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
|
||||
|
||||
|
||||
start_meas(te_stats);
|
||||
threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
stop_meas(te_stats);
|
||||
|
||||
start_meas(i_stats);
|
||||
@@ -651,13 +651,13 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
|
||||
printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
|
||||
#endif
|
||||
start_meas(te_stats);
|
||||
threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
stop_meas(te_stats);
|
||||
#ifdef DEBUG_DLSCH_CODING
|
||||
|
||||
@@ -833,13 +833,13 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
|
||||
printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
|
||||
#endif
|
||||
start_meas(te_stats);
|
||||
threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
stop_meas(te_stats);
|
||||
#ifdef DEBUG_DLSCH_CODING
|
||||
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
//#define DEBUG_DLSCH_DECODING
|
||||
//#define UE_DEBUG_TRACE 1
|
||||
|
||||
extern double cpuf;
|
||||
|
||||
void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
|
||||
{
|
||||
@@ -206,21 +205,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
time_stats_t *);
|
||||
|
||||
#endif
|
||||
uint8_t (*tc)(int16_t *y,
|
||||
uint8_t *,
|
||||
uint16_t,
|
||||
uint16_t,
|
||||
uint16_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *);
|
||||
decoder_if_t tc;
|
||||
|
||||
|
||||
|
||||
@@ -255,13 +240,13 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
#if 0
|
||||
tc_2cw = phy_threegpplte_turbo_decoder16avx2;
|
||||
#endif
|
||||
tc = phy_threegpplte_turbo_decoder16;
|
||||
tc = decoder16;
|
||||
}
|
||||
else
|
||||
{
|
||||
AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n",
|
||||
harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
|
||||
tc = phy_threegpplte_turbo_decoder8;
|
||||
tc = decoder8;
|
||||
}
|
||||
|
||||
|
||||
@@ -490,7 +475,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
LOG_D(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
|
||||
ret = tc
|
||||
(&harq_process->d[r][96],
|
||||
NULL,
|
||||
harq_process->c[r],
|
||||
NULL,
|
||||
Kr,
|
||||
f1f2mat_old[iind*2],
|
||||
f1f2mat_old[(iind*2)+1],
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
//#define DEBUG_LLR_SIC
|
||||
|
||||
|
||||
int16_t zero[8] __attribute__ ((aligned(16))) = {0,0,0,0,0,0,0,0};
|
||||
int16_t zeros[8] __attribute__ ((aligned(16))) = {0,0,0,0,0,0,0,0};
|
||||
int16_t ones[8] __attribute__ ((aligned(16))) = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff};
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
__m128i rho_rpi __attribute__ ((aligned(16)));
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -0,0 +1,362 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file PHY/LTE_TRANSPORT/proto.h
|
||||
* \brief Function prototypes for PHY physical/transport channel processing and generation V8.6 2009-03
|
||||
* \author R. Knopp, F. Kaltenberger
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#ifndef __LTE_TRANSPORT_PROTO_NB_IOT__H__
|
||||
#define __LTE_TRANSPORT_PROTO_NB_IOT__H__
|
||||
#include "PHY/defs_L1_NB_IoT.h"
|
||||
//#include <math.h>
|
||||
|
||||
//NPSS
|
||||
|
||||
int generate_npss_NB_IoT(int32_t **txdataF,
|
||||
short amp,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
unsigned short symbol_offset, // symbol_offset should equal to 3 for NB-IoT
|
||||
unsigned short slot_offset,
|
||||
unsigned short RB_IoT_ID); // new attribute (values are between 0.. Max_RB_number-1), it does not exist for LTE
|
||||
|
||||
//NSSS
|
||||
|
||||
int generate_sss_NB_IoT(int32_t **txdataF,
|
||||
int16_t amp,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
uint16_t symbol_offset, // symbol_offset = 3 for NB-IoT
|
||||
uint16_t slot_offset,
|
||||
unsigned short frame_number, // new attribute (Get value from higher layer), it does not exist for LTE
|
||||
unsigned short RB_IoT_ID); // new attribute (values are between 0.. Max_RB_number-1), it does not exist for LTE
|
||||
|
||||
//*****************Vincent part for Cell ID estimation from NSSS ******************//
|
||||
|
||||
int rx_nsss_NB_IoT(PHY_VARS_UE_NB_IoT *ue,int32_t *tot_metric);
|
||||
|
||||
int nsss_extract_NB_IoT(PHY_VARS_UE_NB_IoT *ue,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **nsss_ext,
|
||||
int l);
|
||||
|
||||
//NRS
|
||||
|
||||
void generate_pilots_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint16_t Ntti, // Ntti = 10
|
||||
unsigned short RB_IoT_ID, // RB reserved for NB-IoT
|
||||
unsigned short With_NSSS); // With_NSSS = 1; if the frame include a sub-Frame with NSSS signal
|
||||
|
||||
|
||||
//NPBCH
|
||||
|
||||
int allocate_npbch_REs_in_RB(NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t symbol_offset,
|
||||
uint8_t *x0,
|
||||
uint8_t pilots,
|
||||
int16_t amp,
|
||||
unsigned short id_offset,
|
||||
uint32_t *re_allocated);
|
||||
|
||||
|
||||
int generate_npbch(NB_IoT_eNB_NPBCH_t *eNB_npbch,
|
||||
int32_t **txdataF,
|
||||
int amp,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t *npbch_pdu,
|
||||
uint8_t frame_mod64,
|
||||
unsigned short NB_IoT_RB_ID);
|
||||
|
||||
|
||||
void npbch_scrambling(NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t *npbch_e,
|
||||
uint32_t length);
|
||||
|
||||
// Functions below implement 36-211 and 36-212
|
||||
|
||||
/*Function to pack the DCI*/
|
||||
// newly added function for NB-IoT , does not exist for LTE
|
||||
void add_dci_NB_IoT(DCI_PDU_NB_IoT *DCI_pdu,
|
||||
void *pdu,
|
||||
rnti_t rnti,
|
||||
unsigned char dci_size_bytes,
|
||||
unsigned char aggregation,
|
||||
unsigned char dci_size_bits,
|
||||
unsigned char dci_fmt,
|
||||
uint8_t npdcch_start_symbol);
|
||||
|
||||
|
||||
/*Use the UL DCI Information to configure PHY and also Pack the DCI*/
|
||||
int generate_eNB_ulsch_params_from_dci_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
|
||||
eNB_rxtx_proc_NB_IoT_t *proc,
|
||||
DCI_CONTENT *DCI_Content,
|
||||
uint16_t rnti,
|
||||
DCI_format_NB_IoT_t dci_format,
|
||||
uint8_t UE_id,
|
||||
uint8_t aggregation,
|
||||
uint8_t npdcch_start_symbol);
|
||||
|
||||
|
||||
/*Use the DL DCI Information to configure PHY and also Pack the DCI*/
|
||||
int generate_eNB_dlsch_params_from_dci_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
|
||||
int frame,
|
||||
uint8_t subframe,
|
||||
DCI_CONTENT *DCI_Content,
|
||||
uint16_t rnti,
|
||||
DCI_format_NB_IoT_t dci_format,
|
||||
NB_IoT_eNB_NDLSCH_t *ndlsch,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t aggregation,
|
||||
uint8_t npdcch_start_symbol);
|
||||
|
||||
|
||||
/*Function for DCI encoding, scrambling, modulation*/
|
||||
uint8_t generate_dci_top_NB_IoT(NB_IoT_eNB_NPDCCH_t *npdcch,
|
||||
uint8_t Num_dci,
|
||||
DCI_ALLOC_NB_IoT_t *dci_alloc,
|
||||
int16_t amp,
|
||||
NB_IoT_DL_FRAME_PARMS *fp,
|
||||
int32_t **txdataF,
|
||||
uint32_t subframe,
|
||||
uint8_t npdcch_start_symbol);
|
||||
|
||||
/*!
|
||||
\brief Decoding of PUSCH/ACK/RI/ACK from 36-212.
|
||||
@param phy_vars_eNB Pointer to eNB top-level descriptor
|
||||
@param proc Pointer to RXTX proc variables
|
||||
@param UE_id ID of UE transmitting this PUSCH
|
||||
@param subframe Index of subframe for PUSCH
|
||||
@param control_only_flag Receive PUSCH with control information only
|
||||
@param Nbundled Nbundled parameter for ACK/NAK scrambling from 36-212/36-213
|
||||
@param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used
|
||||
@returns 0 on success
|
||||
*/
|
||||
unsigned int ulsch_decoding_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB,
|
||||
eNB_rxtx_proc_NB_IoT_t *proc,
|
||||
uint8_t UE_id,
|
||||
uint8_t control_only_flag,
|
||||
uint8_t Nbundled,
|
||||
uint8_t llr8_flag);
|
||||
|
||||
//NB-IoT version
|
||||
NB_IoT_eNB_NDLSCH_t *new_eNB_dlsch_NB_IoT(//unsigned char Kmimo,
|
||||
//unsigned char Mdlharq,
|
||||
uint32_t Nsoft,
|
||||
//unsigned char N_RB_DL,
|
||||
uint8_t abstraction_flag,
|
||||
NB_IoT_DL_FRAME_PARMS* frame_parms);
|
||||
|
||||
|
||||
NB_IoT_eNB_NULSCH_t *new_eNB_ulsch_NB_IoT(uint8_t abstraction_flag);
|
||||
|
||||
|
||||
uint8_t subframe2harq_pid_NB_IoT(NB_IoT_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t subframe);
|
||||
|
||||
|
||||
/** \brief Compute Q (modulation order) based on I_MCS for PUSCH. Implements table 8.6.1-1 from 36.213.
|
||||
@param I_MCS */
|
||||
|
||||
//uint8_t get_Qm_ul_NB_IoT(uint8_t I_MCS);
|
||||
unsigned char get_Qm_ul_NB_IoT(unsigned char I_MCS, uint8_t N_sc_RU);
|
||||
|
||||
/** \fn dlsch_encoding(PHY_VARS_eNB *eNB,
|
||||
uint8_t *input_buffer,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
int frame,
|
||||
uint8_t subframe)
|
||||
\brief This function performs a subset of the bit-coding functions for LTE as described in 36-212, Release 8.Support is limited to turbo-coded channels (DLSCH/ULSCH). The implemented functions are:
|
||||
- CRC computation and addition
|
||||
- Code block segmentation and sub-block CRC addition
|
||||
- Channel coding (Turbo coding)
|
||||
- Rate matching (sub-block interleaving, bit collection, selection and transmission
|
||||
- Code block concatenation
|
||||
@param eNB Pointer to eNB PHY context
|
||||
@param input_buffer Pointer to input buffer for sub-frame
|
||||
@param frame_parms Pointer to frame descriptor structure
|
||||
@param num_pdcch_symbols Number of PDCCH symbols in this subframe
|
||||
@param dlsch Pointer to dlsch to be encoded
|
||||
@param frame Frame number
|
||||
@param subframe Subframe number
|
||||
@param rm_stats Time statistics for rate-matching
|
||||
@param te_stats Time statistics for turbo-encoding
|
||||
@param i_stats Time statistics for interleaving
|
||||
@returns status
|
||||
*/
|
||||
|
||||
int32_t dlsch_encoding_NB_IoT(unsigned char *a,
|
||||
NB_IoT_eNB_DLSCH_t *dlsch,
|
||||
uint8_t Nsf, // number of subframes required for npdsch pdu transmission calculated from Isf (3GPP spec table)
|
||||
unsigned int G, // G (number of available RE) is implicitly multiplied by 2 (since only QPSK modulation)
|
||||
time_stats_t *rm_stats,
|
||||
time_stats_t *te_stats,
|
||||
time_stats_t *i_stats);
|
||||
|
||||
|
||||
void rx_ulsch_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB,
|
||||
eNB_rxtx_proc_NB_IoT_t *proc,
|
||||
uint8_t eNB_id, // this is the effective sector id
|
||||
uint8_t UE_id,
|
||||
NB_IoT_eNB_NULSCH_t **ulsch,
|
||||
uint8_t cooperation_flag);
|
||||
|
||||
|
||||
|
||||
|
||||
void ulsch_extract_rbs_single_NB_IoT(int32_t **rxdataF,
|
||||
int32_t **rxdataF_ext,
|
||||
// uint32_t first_rb,
|
||||
//uint32_t UL_RB_ID_NB_IoT, // index of UL NB_IoT resource block
|
||||
uint8_t N_sc_RU, // number of subcarriers in UL
|
||||
uint32_t I_sc, // subcarrier indication field
|
||||
uint32_t nb_rb,
|
||||
uint8_t l,
|
||||
uint8_t Ns,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void extract_CQI_NB_IoT(void *o,UCI_format_NB_IoT_t uci_format,NB_IoT_eNB_UE_stats *stats,uint8_t N_RB_DL, uint16_t * crnti, uint8_t * access_mode);
|
||||
|
||||
//*****************Vincent part for nprach ******************//
|
||||
void RX_NPRACH_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB, int16_t *Rx_buffer);
|
||||
|
||||
uint32_t TA_estimation_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
|
||||
int16_t *Rx_sub_sampled_buffer,
|
||||
uint16_t sub_sampling_rate,
|
||||
uint16_t FRAME_LENGTH_COMPLEX_SUB_SAMPLES,
|
||||
uint32_t estimated_TA_coarse,
|
||||
char coarse);
|
||||
|
||||
uint8_t NPRACH_detection_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB, int16_t *Rx_sub_sampled_buffer, uint16_t sub_sampling_rate, uint32_t FRAME_LENGTH_COMPLEX_SUB_SAMPLES);
|
||||
|
||||
int16_t* sub_sampling_NB_IoT(int16_t *input_buffer, uint32_t length_input, uint32_t *length_ouput, uint16_t sub_sampling_rate);
|
||||
//************************************************************//
|
||||
//*****************Vincent part for ULSCH demodulation ******************//
|
||||
uint16_t get_UL_sc_start_NB_IoT(uint16_t I_sc);
|
||||
|
||||
void generate_grouphop_NB_IoT(NB_IoT_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void init_ul_hopping_NB_IoT(NB_IoT_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void rotate_single_carrier_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
uint8_t UE_id,
|
||||
uint8_t symbol,
|
||||
uint8_t Qm);
|
||||
|
||||
void fill_rbs_zeros_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
uint8_t UE_id,
|
||||
uint8_t symbol);
|
||||
|
||||
int32_t ulsch_bpsk_llr_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int16_t *ulsch_llr,
|
||||
uint8_t symbol,
|
||||
uint8_t uint8_t,
|
||||
int16_t **llrp);
|
||||
|
||||
|
||||
int32_t ulsch_qpsk_llr_NB_IoT(
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int16_t *ulsch_llr,
|
||||
uint8_t symbol,
|
||||
uint8_t nb_rb,
|
||||
int16_t **llrp);
|
||||
|
||||
void rotate_bpsk_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
uint8_t UE_id,
|
||||
uint8_t symbol);
|
||||
//************************************************************//
|
||||
|
||||
//************************************************************//
|
||||
//*****************Vincent part for DLSCH demodulation ******************//
|
||||
|
||||
int rx_npdsch_NB_IoT(PHY_VARS_UE_NB_IoT *ue,
|
||||
unsigned char eNB_id,
|
||||
unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
|
||||
uint32_t frame,
|
||||
uint8_t subframe,
|
||||
unsigned char symbol,
|
||||
unsigned char first_symbol_flag,
|
||||
unsigned char i_mod,
|
||||
unsigned char harq_pid);
|
||||
|
||||
unsigned short dlsch_extract_rbs_single_NB_IoT(int **rxdataF,
|
||||
int **dl_ch_estimates,
|
||||
int **rxdataF_ext,
|
||||
int **dl_ch_estimates_ext,
|
||||
unsigned short pmi,
|
||||
unsigned char *pmi_ext,
|
||||
unsigned int *rb_alloc,
|
||||
unsigned char symbol,
|
||||
unsigned char subframe,
|
||||
uint32_t frame,
|
||||
uint32_t high_speed_flag,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void dlsch_channel_level_NB_IoT(int **dl_ch_estimates_ext,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t *avg,
|
||||
uint8_t symbol,
|
||||
unsigned short nb_rb);
|
||||
|
||||
void dlsch_channel_compensation_NB_IoT(int **rxdataF_ext,
|
||||
int **dl_ch_estimates_ext,
|
||||
int **dl_ch_mag,
|
||||
int **dl_ch_magb,
|
||||
int **rxdataF_comp,
|
||||
int **rho,
|
||||
NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
unsigned char symbol,
|
||||
uint8_t first_symbol_flag,
|
||||
unsigned char mod_order,
|
||||
unsigned short nb_rb,
|
||||
unsigned char output_shift,
|
||||
PHY_MEASUREMENTS_NB_IoT *measurements);
|
||||
|
||||
int dlsch_qpsk_llr_NB_IoT(NB_IoT_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
uint8_t symbol,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
int16_t **llr32p,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
//************************************************************//
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,324 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef __UCI_NB_IOT__H__
|
||||
#define __UCI_NB_IOT__H__
|
||||
//#include "PHY/types_NB_IoT.h"
|
||||
|
||||
|
||||
|
||||
typedef enum {
|
||||
ue_selected_NB_IoT,
|
||||
wideband_cqi_rank1_2A_NB_IoT, //wideband_cqi_rank1_2A,
|
||||
wideband_cqi_rank2_2A_NB_IoT, //wideband_cqi_rank2_2A,
|
||||
HLC_subband_cqi_nopmi_NB_IoT, //HLC_subband_cqi_nopmi,
|
||||
HLC_subband_cqi_rank1_2A_NB_IoT, //HLC_subband_cqi_rank1_2A,
|
||||
HLC_subband_cqi_rank2_2A_NB_IoT, //HLC_subband_cqi_rank2_2A,
|
||||
HLC_subband_cqi_modes123_NB_IoT, //HLC_subband_cqi_modes123
|
||||
HLC_subband_cqi_mcs_CBA_NB_IoT, // MCS and RNTI, for contention-based acces
|
||||
unknown_cqi_NB_IoT//
|
||||
} UCI_format_NB_IoT_t;
|
||||
|
||||
// **********************************************1.5 MHz***************************************************************************
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:16;
|
||||
uint32_t pmi:12;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
wideband_cqi_rank1_2A_1_5MHz_NB_IoT ;
|
||||
#define sizeof_wideband_cqi_rank1_2A_1_5MHz_NB_IoT 16
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint16_t padding:2;
|
||||
uint16_t pmi:6;
|
||||
uint16_t cqi2:4;
|
||||
uint16_t cqi1:4;
|
||||
}
|
||||
wideband_cqi_rank2_2A_1_5MHz_NB_IoT ;
|
||||
#define sizeof_wideband_cqi_rank2_2A_1_5MHz_NB_IoT 14
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:16;
|
||||
uint32_t diffcqi1:12;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_nopmi_1_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_nopmi_1_5MHz_NB_IoT 16
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:14;
|
||||
uint32_t pmi:2;
|
||||
uint32_t diffcqi1:12;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_rank1_2A_1_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_rank1_2A_1_5MHz_NB_IoT 18
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint64_t padding:31;
|
||||
uint64_t pmi:1;
|
||||
uint64_t diffcqi2:12;
|
||||
uint64_t cqi2:4;
|
||||
uint64_t diffcqi1:12;
|
||||
uint64_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_rank2_2A_1_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_rank2_2A_1_5MHz_NB_IoT 33
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:16;
|
||||
uint32_t diffcqi1:12;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_modes123_1_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_modes123_1_5MHz_NB_IoT 16
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:11;
|
||||
uint32_t crnti:16;
|
||||
uint32_t mcs:5;
|
||||
}
|
||||
HLC_subband_cqi_mcs_CBA_1_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz_NB_IoT 21
|
||||
|
||||
|
||||
// **********************************************5 MHz***************************************************************************
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:14;
|
||||
uint32_t pmi:14;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
wideband_cqi_rank1_2A_5MHz_NB_IoT ;
|
||||
#define sizeof_wideband_cqi_rank1_2A_5MHz_NB_IoT 18
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint16_t padding:1;
|
||||
uint16_t pmi:7;
|
||||
uint16_t cqi2:4;
|
||||
uint16_t cqi1:4;
|
||||
}
|
||||
wideband_cqi_rank2_2A_5MHz_NB_IoT ;
|
||||
#define sizeof_wideband_cqi_rank2_2A_5MHz_NB_IoT 15
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:14;
|
||||
uint32_t diffcqi1:14;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_nopmi_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_nopmi_5MHz_NB_IoT 18
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:12;
|
||||
uint32_t pmi:2;
|
||||
uint32_t diffcqi1:14;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_rank1_2A_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_rank1_2A_5MHz_NB_IoT 20
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint64_t padding:27;
|
||||
uint64_t pmi:1;
|
||||
uint64_t diffcqi2:14;
|
||||
uint64_t cqi2:4;
|
||||
uint64_t diffcqi1:14;
|
||||
uint64_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_rank2_2A_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_rank2_2A_5MHz_NB_IoT 37
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:14;
|
||||
uint32_t diffcqi1:14;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_modes123_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_modes123_5MHz_NB_IoT 18
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:11;
|
||||
uint32_t crnti:16;
|
||||
uint32_t mcs:5;
|
||||
}
|
||||
HLC_subband_cqi_mcs_CBA_5MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_mcs_CBA_5MHz_NB_IoT 21
|
||||
|
||||
// **********************************************10 MHz***************************************************************************
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:10;
|
||||
uint32_t pmi:18;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
wideband_cqi_rank1_2A_10MHz_NB_IoT ;
|
||||
#define sizeof_wideband_cqi_rank1_2A_10MHz_NB_IoT 22
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:15;
|
||||
uint32_t pmi:9;
|
||||
uint32_t cqi2:4;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
wideband_cqi_rank2_2A_10MHz_NB_IoT ;
|
||||
#define sizeof_wideband_cqi_rank2_2A_10MHz_NB_IoT 17
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:10;
|
||||
uint32_t diffcqi1:18;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_nopmi_10MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_nopmi_10MHz_NB_IoT 22
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:8;
|
||||
uint32_t pmi:2;
|
||||
uint32_t diffcqi1:18;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_rank1_2A_10MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_rank1_2A_10MHz_NB_IoT 24
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint64_t padding:19;
|
||||
uint64_t pmi:1;
|
||||
uint64_t diffcqi2:18;
|
||||
uint64_t cqi2:4;
|
||||
uint64_t diffcqi1:18;
|
||||
uint64_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_rank2_2A_10MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_rank2_2A_10MHz_NB_IoT 45
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:10;
|
||||
uint32_t diffcqi1:18;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_modes123_10MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_modes123_10MHz_NB_IoT 22
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:11;
|
||||
uint32_t crnti:16;
|
||||
uint32_t mcs:5;
|
||||
}
|
||||
HLC_subband_cqi_mcs_CBA_10MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_mcs_CBA_10MHz_NB_IoT 21
|
||||
|
||||
// **********************************************20 MHz***************************************************************************
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:2;
|
||||
uint32_t pmi:26;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
wideband_cqi_rank1_2A_20MHz_NB_IoT ;
|
||||
#define sizeof_wideband_cqi_rank1_2A_20MHz_NB_IoT 20
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:11;
|
||||
uint32_t pmi:13;
|
||||
uint32_t cqi2:4;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
wideband_cqi_rank2_2A_20MHz_NB_IoT ;
|
||||
#define sizeof_wideband_cqi_rank2_2A_20MHz_NB_IoT 21
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:2;
|
||||
uint32_t diffcqi1:26;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_nopmi_20MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_nopmi_20MHz_NB_IoT 30
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
// uint32_t padding:12;
|
||||
uint32_t pmi:2;
|
||||
uint32_t diffcqi1:26;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_rank1_2A_20MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_rank1_2A_20MHz_NB_IoT 32
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint64_t padding:3;
|
||||
uint64_t pmi:1;
|
||||
uint64_t diffcqi2:26;
|
||||
uint64_t cqi2:4;
|
||||
uint64_t diffcqi1:26;
|
||||
uint64_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_rank2_2A_20MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_rank2_2A_20MHz_NB_IoT 61
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:2;
|
||||
uint32_t diffcqi1:26;
|
||||
uint32_t cqi1:4;
|
||||
}
|
||||
HLC_subband_cqi_modes123_20MHz_NB_IoT;
|
||||
#define sizeof_HLC_subband_cqi_modes123_20MHz_NB_IoT 30
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
{
|
||||
uint32_t padding:11;
|
||||
uint32_t crnti:16;
|
||||
uint32_t mcs:5;
|
||||
}
|
||||
HLC_subband_cqi_mcs_CBA_20MHz_NB_IoT;
|
||||
|
||||
#define sizeof_HLC_subband_cqi_mcs_CBA_20MHz_NB_IoT 21
|
||||
|
||||
#define MAX_CQI_PAYLOAD_NB_IoT (sizeof(HLC_subband_cqi_rank2_2A_20MHz_NB_IoT)*8*20)
|
||||
#define MAX_CQI_BITS_NB_IoT (sizeof(HLC_subband_cqi_rank2_2A_20MHz_NB_IoT)*8)
|
||||
#define MAX_CQI_BYTES_NB_IoT (sizeof(HLC_subband_cqi_rank2_2A_20MHz_NB_IoT))
|
||||
#define MAX_ACK_PAYLOAD_NB_IoT 18
|
||||
#define MAX_RI_PAYLOAD_NB_IoT 6
|
||||
|
||||
#endif
|
||||
@@ -371,13 +371,13 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
|
||||
#endif
|
||||
start_meas(te_stats);
|
||||
threegpplte_turbo_encoder(ulsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&ulsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? ulsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36212-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36212-820, page 14)
|
||||
);
|
||||
encoder(ulsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&ulsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? ulsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36212-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36212-820, page 14)
|
||||
);
|
||||
stop_meas(te_stats);
|
||||
#ifdef DEBUG_ULSCH_CODING
|
||||
|
||||
|
||||
@@ -242,27 +242,12 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
|
||||
uint32_t E=0;
|
||||
uint32_t Gp,GpmodC,Nl=1;
|
||||
uint32_t C = ulsch_harq->C;
|
||||
|
||||
uint8_t (*tc)(int16_t *y,
|
||||
uint8_t *,
|
||||
uint16_t,
|
||||
uint16_t,
|
||||
uint16_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *);
|
||||
decoder_if_t tc;
|
||||
|
||||
if (llr8_flag == 0)
|
||||
tc = phy_threegpplte_turbo_decoder16;
|
||||
tc = decoder16;
|
||||
else
|
||||
tc = phy_threegpplte_turbo_decoder8;
|
||||
tc = decoder8;
|
||||
|
||||
|
||||
|
||||
@@ -385,7 +370,9 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
|
||||
|
||||
|
||||
ret = tc(&ulsch_harq->d[r][96],
|
||||
NULL,
|
||||
ulsch_harq->c[r],
|
||||
NULL,
|
||||
Kr,
|
||||
f1f2mat_old[iind*2],
|
||||
f1f2mat_old[(iind*2)+1],
|
||||
@@ -463,22 +450,7 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
|
||||
int G = ulsch_harq->G;
|
||||
unsigned int E;
|
||||
int Cby2;
|
||||
|
||||
uint8_t (*tc)(int16_t *y,
|
||||
uint8_t *,
|
||||
uint16_t,
|
||||
uint16_t,
|
||||
uint16_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *);
|
||||
decoder_if_t tc;
|
||||
|
||||
struct timespec wait;
|
||||
|
||||
@@ -487,9 +459,9 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
|
||||
|
||||
|
||||
if (llr8_flag == 0)
|
||||
tc = phy_threegpplte_turbo_decoder16;
|
||||
tc = decoder16;
|
||||
else
|
||||
tc = phy_threegpplte_turbo_decoder8;
|
||||
tc = decoder8;
|
||||
|
||||
if (ulsch_harq->C>1) { // wakeup worker if more than 1 segment
|
||||
if (pthread_mutex_timedlock(&proc->mutex_td,&wait) != 0) {
|
||||
@@ -608,7 +580,9 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
|
||||
start_meas(&eNB->ulsch_turbo_decoding_stats);
|
||||
|
||||
ret = tc(&ulsch_harq->d[r][96],
|
||||
NULL,
|
||||
ulsch_harq->c[r],
|
||||
NULL,
|
||||
Kr,
|
||||
f1f2mat_old[iind*2],
|
||||
f1f2mat_old[(iind*2)+1],
|
||||
@@ -670,27 +644,12 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
|
||||
|
||||
int G = ulsch_harq->G;
|
||||
unsigned int E;
|
||||
|
||||
uint8_t (*tc)(int16_t *y,
|
||||
uint8_t *,
|
||||
uint16_t,
|
||||
uint16_t,
|
||||
uint16_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *,
|
||||
time_stats_t *);
|
||||
decoder_if_t tc;
|
||||
|
||||
if (llr8_flag == 0)
|
||||
tc = phy_threegpplte_turbo_decoder16;
|
||||
tc = *decoder16;
|
||||
else
|
||||
tc = phy_threegpplte_turbo_decoder8;
|
||||
tc = *decoder8;
|
||||
|
||||
|
||||
for (r=0; r<ulsch_harq->C; r++) {
|
||||
@@ -773,7 +732,9 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
|
||||
start_meas(&eNB->ulsch_turbo_decoding_stats);
|
||||
|
||||
ret = tc(&ulsch_harq->d[r][96],
|
||||
NULL,
|
||||
ulsch_harq->c[r],
|
||||
NULL,
|
||||
Kr,
|
||||
f1f2mat_old[iind*2],
|
||||
f1f2mat_old[(iind*2)+1],
|
||||
|
||||
@@ -1127,7 +1127,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
|
||||
uint32_t l,i;
|
||||
int32_t avgs;
|
||||
uint8_t log2_maxh=0,aarx;
|
||||
int32_t avgU[2];
|
||||
int32_t avgU[eNB->frame_parms.nb_antennas_rx];
|
||||
|
||||
|
||||
// uint8_t harq_pid = ( ulsch->RRCConnRequest_flag== 0) ? subframe2harq_pid_tdd(frame_parms->tdd_config,subframe) : 0;
|
||||
@@ -1212,7 +1212,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
|
||||
avgs = 0;
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
|
||||
avgs = cmax(avgs,avgU[(aarx<<1)]);
|
||||
avgs = cmax(avgs,avgU[aarx]);
|
||||
|
||||
// log2_maxh = 4+(log2_approx(avgs)/2);
|
||||
|
||||
@@ -1395,7 +1395,7 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB,
|
||||
if (eNB->frame_parms.nb_antennas_rx>1) {
|
||||
sprintf(fname,"/tmp/rxsigF1_ext_r%d.m",round);
|
||||
sprintf(vname,"rxsF1_ext_r%d",round);
|
||||
write_output(fname,vname,&eNB->pusch_vars[UE_id]->rxdataF_ext[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
write_output(fname,vname,&eNB->pusch_vars[UE_id]->rxdataF_ext[1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
}
|
||||
/*
|
||||
if (eNB->srs_vars[UE_id].srs_ch_estimates) write_output("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0],eNB->frame_parms.ofdm_symbol_size,1,1);
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#include "defs.h"
|
||||
//#define DEBUG_FEP
|
||||
|
||||
|
||||
|
||||
int slot_fep_ul(RU_t *ru,
|
||||
unsigned char l,
|
||||
unsigned char Ns,
|
||||
|
||||
@@ -162,7 +162,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
||||
int16_t **chest_t;
|
||||
int16_t **chest_f;
|
||||
int16_t *pusch_llr;
|
||||
int16_t *pusch_comp;
|
||||
int32_t *pusch_comp;
|
||||
int32_t *pucch1_comp;
|
||||
int32_t *pucch1_thres;
|
||||
int32_t *pucch1ab_comp;
|
||||
@@ -200,7 +200,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
||||
chest_t = (int16_t**) phy_vars_enb->srs_vars[UE_id].srs_ch_estimates[eNB_id];
|
||||
chest_f = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id];
|
||||
pusch_llr = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->llr;
|
||||
pusch_comp = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[0];
|
||||
pusch_comp = (int32_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[0];
|
||||
pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id];
|
||||
pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id];
|
||||
pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id];
|
||||
|
||||
@@ -738,6 +738,8 @@ typedef struct RU_t_s{
|
||||
void (*fh_south_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe);
|
||||
/// function pointer to initialization function for radio interface
|
||||
int (*start_rf)(struct RU_t_s *ru);
|
||||
/// function pointer to release function for radio interface
|
||||
int (*stop_rf)(struct RU_t_s *ru);
|
||||
/// function pointer to initialization function for radio interface
|
||||
int (*start_if)(struct RU_t_s *ru,struct PHY_VARS_eNB_s *eNB);
|
||||
/// function pointer to RX front-end processing routine (DFTs/prefix removal or NULL)
|
||||
@@ -1461,6 +1463,53 @@ extern pthread_cond_t sync_cond;
|
||||
extern pthread_mutex_t sync_mutex;
|
||||
extern int sync_var;
|
||||
|
||||
|
||||
#define MODE_DECODE_NONE 0
|
||||
#define MODE_DECODE_SSE 1
|
||||
#define MODE_DECODE_C 2
|
||||
#define MODE_DECODE_AVX2 3
|
||||
|
||||
#define DECODE_INITTD8_SSE_FPTRIDX 0
|
||||
#define DECODE_INITTD16_SSE_FPTRIDX 1
|
||||
#define DECODE_INITTD_AVX2_FPTRIDX 2
|
||||
#define DECODE_TD8_SSE_FPTRIDX 3
|
||||
#define DECODE_TD16_SSE_FPTRIDX 4
|
||||
#define DECODE_TD_C_FPTRIDX 5
|
||||
#define DECODE_TD16_AVX2_FPTRIDX 6
|
||||
#define DECODE_FREETD8_FPTRIDX 7
|
||||
#define DECODE_FREETD16_FPTRIDX 8
|
||||
#define DECODE_FREETD_AVX2_FPTRIDX 9
|
||||
#define ENCODE_SSE_FPTRIDX 10
|
||||
#define ENCODE_C_FPTRIDX 11
|
||||
#define ENCODE_INIT_SSE_FPTRIDX 12
|
||||
#define DECODE_NUM_FPTR 13
|
||||
|
||||
|
||||
typedef uint8_t(*decoder_if_t)(int16_t *y,
|
||||
int16_t *y2,
|
||||
uint8_t *decoded_bytes,
|
||||
uint8_t *decoded_bytes2,
|
||||
uint16_t n,
|
||||
uint16_t f1,
|
||||
uint16_t f2,
|
||||
uint8_t max_iterations,
|
||||
uint8_t crc_type,
|
||||
uint8_t F,
|
||||
time_stats_t *init_stats,
|
||||
time_stats_t *alpha_stats,
|
||||
time_stats_t *beta_stats,
|
||||
time_stats_t *gamma_stats,
|
||||
time_stats_t *ext_stats,
|
||||
time_stats_t *intl1_stats,
|
||||
time_stats_t *intl2_stats);
|
||||
|
||||
typedef uint8_t(*encoder_if_t)(uint8_t *input,
|
||||
uint16_t input_length_bytes,
|
||||
uint8_t *output,
|
||||
uint8_t F,
|
||||
uint16_t interleaver_f1,
|
||||
uint16_t interleaver_f2);
|
||||
|
||||
#define MAX_RRU_CONFIG_SIZE 1024
|
||||
typedef enum {
|
||||
RAU_tick=0,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -126,6 +126,6 @@ extern unsigned short Nb_81_110[8][4];
|
||||
|
||||
extern uint16_t hundred_times_log10_NPRB[100];
|
||||
extern uint8_t alpha_lut[8];
|
||||
|
||||
extern uint8_t max_turbo_iterations;
|
||||
#endif /*__PHY_EXTERN_H__ */
|
||||
|
||||
|
||||
@@ -0,0 +1,813 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file PHY/impl_defs_lte.h
|
||||
* \brief LTE Physical channel configuration and variable structure definitions
|
||||
* \author R. Knopp, F. Kaltenberger
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#ifndef __PHY_IMPL_DEFS_NB_IOT__H__
|
||||
#define __PHY_IMPL_DEFS_NB_IOT__H__
|
||||
|
||||
#include "types_NB_IoT.h"
|
||||
//#include "defs.h"
|
||||
|
||||
typedef enum {TDD_NB_IoT=1,FDD_NB_IoT=0} NB_IoT_frame_type_t;
|
||||
typedef enum {EXTENDED_NB_IoT=1,NORMAL_NB_IoT=0} NB_IoT_prefix_type_t;
|
||||
typedef enum {SF_DL_NB_IoT, SF_UL_NB_IoT, SF_S_NB_IoT} NB_IoT_subframe_t;
|
||||
|
||||
#define A_SEQUENCE_OF(type) A_SET_OF(type)
|
||||
|
||||
#define A_SET_OF(type) \
|
||||
struct { \
|
||||
type **array; \
|
||||
int count; /* Meaningful size */ \
|
||||
int size; /* Allocated size */ \
|
||||
void (*free)(type *); \
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////
|
||||
/// Union for \ref TPC_PDCCH_CONFIG::tpc_Index.
|
||||
typedef union {
|
||||
/// Index of N when DCI format 3 is used. See TS 36.212 (5.3.3.1.6). \vr{[1..15]}
|
||||
uint8_t indexOfFormat3;
|
||||
/// Index of M when DCI format 3A is used. See TS 36.212 (5.3.3.1.7). \vr{[1..31]}
|
||||
uint8_t indexOfFormat3A;
|
||||
} TPC_INDEX_NB_IoT_t;
|
||||
|
||||
/// TPC-PDCCH-Config Information Element from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// RNTI for power control using DCI format 3/3A, see TS 36.212. \vr{[0..65535]}
|
||||
uint16_t rnti;
|
||||
/// Index of N or M, see TS 36.212 (5.3.3.1.6 and 5.3.3.1.7), where N or M is dependent on the used DCI format (i.e. format 3 or 3a).
|
||||
TPC_INDEX_NB_IoT_t tpc_Index;
|
||||
} TPC_PDCCH_CONFIG_NB_IoT;
|
||||
/// Enumeration for parameter \f$N_\text{ANRep}\f$ \ref PUCCH_CONFIG_DEDICATED::repetitionFactor.
|
||||
typedef enum {
|
||||
//n2=0,
|
||||
n4_n,
|
||||
n6_n
|
||||
} ACKNAKREP_NB_IoT_t;
|
||||
|
||||
/// Enumeration for \ref PUCCH_CONFIG_DEDICATED::tdd_AckNackFeedbackMode.
|
||||
typedef enum {
|
||||
bundling_N=0,
|
||||
multiplexing_N
|
||||
} ANFBmode_NB_IoT_t;
|
||||
|
||||
/// PUCCH-ConfigDedicated from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// Flag to indicate ACK NAK repetition activation, see TS 36.213 (10.1). \vr{[0..1]}
|
||||
uint8_t ackNackRepetition;
|
||||
/// Parameter: \f$N_\text{ANRep}\f$, see TS 36.213 (10.1).
|
||||
ACKNAKREP_NB_IoT_t repetitionFactor;
|
||||
/// Parameter: \f$n^{(1)}_\text{PUCCH,ANRep}\f$, see TS 36.213 (10.1). \vr{[0..2047]}
|
||||
uint16_t n1PUCCH_AN_Rep;
|
||||
/// Feedback mode, see TS 36.213 (7.3). \details Applied to both PUCCH and PUSCH feedback. For TDD, should always be set to bundling.
|
||||
ANFBmode_NB_IoT_t tdd_AckNackFeedbackMode;
|
||||
} PUCCH_CONFIG_DEDICATED_NB_IoT;
|
||||
// UE specific PUSCH configuration.
|
||||
typedef struct {
|
||||
/// Parameter: \f$I^\text{HARQ-ACK}_\text{offset}\f$, see TS 36.213 (Table 8.6.3-1). \vr{[0..15]}
|
||||
uint16_t betaOffset_ACK_Index;
|
||||
/// Parameter: \f$I^{RI}_\text{offset}\f$, see TS 36.213 (Table 8.6.3-2). \vr{[0..15]}
|
||||
uint16_t betaOffset_RI_Index;
|
||||
/// Parameter: \f$I^{CQI}_\text{offset}\f$, see TS 36.213 (Table 8.6.3-3). \vr{[0..15]}
|
||||
uint16_t betaOffset_CQI_Index;
|
||||
} PUSCH_CONFIG_DEDICATED_NB_IoT;
|
||||
/// Enumeration for Parameter \f$P_A\f$ \ref PDSCH_CONFIG_DEDICATED::p_a.
|
||||
typedef enum {
|
||||
//dBm6=0, ///< (dB-6) corresponds to -6 dB
|
||||
// dBm477, ///< (dB-4dot77) corresponds to -4.77 dB
|
||||
// dBm3, ///< (dB-3) corresponds to -3 dB
|
||||
//dBm177, ///< (dB-1dot77) corresponds to -1.77 dB
|
||||
//dB0, ///< corresponds to 0 dB
|
||||
// dB1, ///< corresponds to 1 dB
|
||||
dB2_NB, ///< corresponds to 2 dB
|
||||
dB3_NB ///< corresponds to 3 dB
|
||||
} PA_NB_IoT_t;
|
||||
|
||||
/// PDSCH-ConfigDedicated from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// Parameter: \f$P_A\f$, see TS 36.213 (5.2).
|
||||
PA_NB_IoT_t p_a;
|
||||
} PDSCH_CONFIG_DEDICATED_NB_IoT;
|
||||
|
||||
/// UplinkPowerControlDedicated Information Element from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// Parameter: \f$P_\text{0\_UE\_PUSCH}(1)\f$, see TS 36.213 (5.1.1.1), unit dB. \vr{[-8..7]}\n This field is applicable for non-persistent scheduling, only.
|
||||
int8_t p0_UE_PUSCH;
|
||||
/// Parameter: Ks, see TS 36.213 (5.1.1.1). \vr{[0..1]}\n en0 corresponds to value 0 corresponding to state “disabled”. en1 corresponds to value 1.25 corresponding to “enabled”. \note the specification sais it is an enumerated value. \warning the enumeration values do not correspond to the given values in the specification (en1 should be 1.25).
|
||||
uint8_t deltaMCS_Enabled;
|
||||
/// Parameter: Accumulation-enabled, see TS 36.213 (5.1.1.1). \vr{[0..1]} 1 corresponds to "enabled" whereas 0 corresponds to "disabled".
|
||||
uint8_t accumulationEnabled;
|
||||
/// Parameter: \f$P_\text{0\_UE\_PUCCH}(1)\f$, see TS 36.213 (5.1.2.1), unit dB. \vr{[-8..7]}
|
||||
int8_t p0_UE_PUCCH;
|
||||
/// Parameter: \f$P_\text{SRS\_OFFSET}\f$, see TS 36.213 (5.1.3.1). \vr{[0..15]}\n For Ks=1.25 (\ref deltaMCS_Enabled), the actual parameter value is pSRS_Offset value - 3. For Ks=0, the actual parameter value is -10.5 + 1.5*pSRS_Offset value.
|
||||
int8_t pSRS_Offset;
|
||||
/// Specifies the filtering coefficient for RSRP measurements used to calculate path loss, as specified in TS 36.213 (5.1.1.1).\details The same filtering mechanism applies as for quantityConfig described in 5.5.3.2. \note the specification sais it is an enumerated value.
|
||||
uint8_t filterCoefficient;
|
||||
} UL_POWER_CONTROL_DEDICATED_NB_IoT;
|
||||
|
||||
/// Union for \ref TPC_PDCCH_CONFIG::tpc_Index.
|
||||
//typedef union {
|
||||
/// Index of N when DCI format 3 is used. See TS 36.212 (5.3.3.1.6). \vr{[1..15]}
|
||||
// uint8_t indexOfFormat3;
|
||||
/// Index of M when DCI format 3A is used. See TS 36.212 (5.3.3.1.7). \vr{[1..31]}
|
||||
// uint8_t indexOfFormat3A;
|
||||
//} TPC_INDEX_NB_IoT_t;
|
||||
|
||||
/// CQI-ReportPeriodic
|
||||
typedef struct {
|
||||
/// Parameter: \f$n^{(2)}_\text{PUCCH}\f$, see TS 36.213 (7.2). \vr{[0..1185]}, -1 indicates inactivity
|
||||
int16_t cqi_PUCCH_ResourceIndex;
|
||||
/// Parameter: CQI/PMI Periodicity and Offset Configuration Index \f$I_\text{CQI/PMI}\f$, see TS 36.213 (tables 7.2.2-1A and 7.2.2-1C). \vr{[0..1023]}
|
||||
int16_t cqi_PMI_ConfigIndex;
|
||||
/// Parameter: K, see 36.213 (4.2.2). \vr{[1..4]}
|
||||
uint8_t K;
|
||||
/// Parameter: RI Config Index \f$I_\text{RI}\f$, see TS 36.213 (7.2.2-1B). \vr{[0..1023]}, -1 indicates inactivity
|
||||
int16_t ri_ConfigIndex;
|
||||
/// Parameter: Simultaneous-AN-and-CQI, see TS 36.213 (10.1). \vr{[0..1]} 1 indicates that simultaneous transmission of ACK/NACK and CQI is allowed.
|
||||
uint8_t simultaneousAckNackAndCQI;
|
||||
/// parameter computed from Tables 7.2.2-1A and 7.2.2-1C
|
||||
uint16_t Npd;
|
||||
/// parameter computed from Tables 7.2.2-1A and 7.2.2-1C
|
||||
uint16_t N_OFFSET_CQI;
|
||||
} CQI_REPORTPERIODIC_NB_IoT;
|
||||
|
||||
/// Enumeration for parameter reporting mode \ref CQI_REPORT_CONFIG::cqi_ReportModeAperiodic.
|
||||
typedef enum {
|
||||
//rm12=0,
|
||||
//rm20=1,
|
||||
//rm22=2,
|
||||
rm30_N=3,
|
||||
rm31_N=4
|
||||
} CQI_REPORTMODEAPERIODIC_NB_IoT;
|
||||
|
||||
/// CQI-ReportConfig Information Element from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// Parameter: reporting mode. Value rm12 corresponds to Mode 1-2, rm20 corresponds to Mode 2-0, rm22 corresponds to Mode 2-2 etc. PUSCH reporting modes are described in TS 36.213 [23, 7.2.1].
|
||||
CQI_REPORTMODEAPERIODIC_NB_IoT cqi_ReportModeAperiodic;
|
||||
/// Parameter: \f$\Delta_\text{offset}\f$, see TS 36.213 (7.2.3). \vr{[-1..6]}\n Actual value = IE value * 2 [dB].
|
||||
int8_t nomPDSCH_RS_EPRE_Offset;
|
||||
CQI_REPORTPERIODIC_NB_IoT CQI_ReportPeriodic;
|
||||
} CQI_REPORT_CONFIG_NB_IoT;
|
||||
|
||||
/// SoundingRS-UL-ConfigDedicated Information Element from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// Parameter: \f$B_\text{SRS}\f$, see TS 36.211 (table 5.5.3.2-1, 5.5.3.2-2, 5.5.3.2-3 and 5.5.3.2-4). \vr{[0..3]} \note the specification sais it is an enumerated value.
|
||||
uint8_t srs_Bandwidth;
|
||||
/// Parameter: SRS hopping bandwidth \f$b_\text{hop}\in\{0,1,2,3\}\f$, see TS 36.211 (5.5.3.2) \vr{[0..3]} \note the specification sais it is an enumerated value.
|
||||
uint8_t srs_HoppingBandwidth;
|
||||
/// Parameter: \f$n_\text{RRC}\f$, see TS 36.211 (5.5.3.2). \vr{[0..23]}
|
||||
uint8_t freqDomainPosition;
|
||||
/// Parameter: Duration, see TS 36.213 (8.2). \vr{[0..1]} 0 corresponds to "single" and 1 to "indefinite".
|
||||
uint8_t duration;
|
||||
/// Parameter: \f$k_\text{TC}\in\{0,1\}\f$, see TS 36.211 (5.5.3.2). \vr{[0..1]}
|
||||
uint8_t transmissionComb;
|
||||
/// Parameter: \f$I_\text{SRS}\f$, see TS 36.213 (table 8.2-1). \vr{[0..1023]}
|
||||
uint16_t srs_ConfigIndex;
|
||||
/// Parameter: \f$n^\text{CS}_\text{SRS}\f$. See TS 36.211 (5.5.3.1). \vr{[0..7]} \note the specification sais it is an enumerated value.
|
||||
uint8_t cyclicShift;
|
||||
// Parameter: internal implementation: UE SRS configured
|
||||
uint8_t srsConfigDedicatedSetup;
|
||||
// Parameter: cell srs subframe for internal implementation
|
||||
uint8_t srsCellSubframe;
|
||||
// Parameter: ue srs subframe for internal implementation
|
||||
uint8_t srsUeSubframe;
|
||||
} SOUNDINGRS_UL_CONFIG_DEDICATED_NB_IoT;
|
||||
|
||||
|
||||
/// Enumeration for parameter SR transmission \ref SCHEDULING_REQUEST_CONFIG::dsr_TransMax.
|
||||
typedef enum {
|
||||
//sr_n4=0,
|
||||
// sr_n8=1,
|
||||
// sr_n16=2,
|
||||
sr_n32_N=3,
|
||||
sr_n64_N=4
|
||||
} DSR_TRANSMAX_NB_IoT_t;
|
||||
|
||||
/// SchedulingRequestConfig Information Element from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// Parameter: \f$n^{(1)}_\text{PUCCH,SRI}\f$, see TS 36.213 (10.1). \vr{[0..2047]}
|
||||
uint16_t sr_PUCCH_ResourceIndex;
|
||||
/// Parameter: \f$I_\text{SR}\f$, see TS 36.213 (10.1). \vr{[0..155]}
|
||||
uint8_t sr_ConfigIndex;
|
||||
/// Parameter for SR transmission in TS 36.321 (5.4.4). \details The value n4 corresponds to 4 transmissions, n8 corresponds to 8 transmissions and so on.
|
||||
DSR_TRANSMAX_NB_IoT_t dsr_TransMax;
|
||||
} SCHEDULING_REQUEST_CONFIG_NB_IoT;
|
||||
|
||||
typedef struct {
|
||||
/// Downlink Power offset field
|
||||
uint8_t dl_pow_off;
|
||||
///Subband resource allocation field
|
||||
uint8_t rballoc_sub[50];
|
||||
///Total number of PRBs indicator
|
||||
uint8_t pre_nb_available_rbs;
|
||||
} MU_MIMO_mode_NB_IoT;
|
||||
////////////////////////
|
||||
|
||||
typedef struct {
|
||||
|
||||
/// \brief Holds the received data in the frequency domain.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: symbol [0..28*ofdm_symbol_size[
|
||||
int32_t **rxdataF;
|
||||
|
||||
/// \brief Hold the channel estimates in frequency domain.
|
||||
/// - first index: eNB id [0..6] (hard coded)
|
||||
/// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - third index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
|
||||
int32_t **dl_ch_estimates[7];
|
||||
|
||||
/// \brief Hold the channel estimates in time domain (used for tracking).
|
||||
/// - first index: eNB id [0..6] (hard coded)
|
||||
/// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - third index: samples? [0..2*ofdm_symbol_size[
|
||||
int32_t **dl_ch_estimates_time[7];
|
||||
}NB_IoT_UE_COMMON_PER_THREAD;
|
||||
|
||||
typedef struct {
|
||||
/// \brief Holds the transmit data in time domain.
|
||||
/// For IFFT_FPGA this points to the same memory as PHY_vars->tx_vars[a].TX_DMA_BUFFER.
|
||||
/// - first index: tx antenna [0..nb_antennas_tx[
|
||||
/// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES[
|
||||
int32_t **txdata;
|
||||
/// \brief Holds the transmit data in the frequency domain.
|
||||
/// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER.
|
||||
/// - first index: tx antenna [0..nb_antennas_tx[
|
||||
/// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX[
|
||||
int32_t **txdataF;
|
||||
|
||||
/// \brief Holds the received data in time domain.
|
||||
/// Should point to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES+2048[
|
||||
int32_t **rxdata;
|
||||
|
||||
NB_IoT_UE_COMMON_PER_THREAD common_vars_rx_data_per_thread[2];
|
||||
|
||||
/// holds output of the sync correlator
|
||||
int32_t *sync_corr;
|
||||
/// estimated frequency offset (in radians) for all subcarriers
|
||||
int32_t freq_offset;
|
||||
/// eNb_id user is synched to
|
||||
int32_t eNb_id;
|
||||
} NB_IoT_UE_COMMON;
|
||||
|
||||
typedef struct {
|
||||
/// \brief Received frequency-domain signal after extraction.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **rxdataF_ext;
|
||||
/// \brief Received frequency-domain ue specific pilots.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..12*N_RB_DL[
|
||||
int32_t **rxdataF_uespec_pilots;
|
||||
/// \brief Received frequency-domain signal after extraction and channel compensation.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **rxdataF_comp0;
|
||||
/// \brief Received frequency-domain signal after extraction and channel compensation for the second stream. For the SIC receiver we need to store the history of this for each harq process and round
|
||||
/// - first index: ? [0..7] (hard coded) accessed via \c harq_pid
|
||||
/// - second index: ? [0..7] (hard coded) accessed via \c round
|
||||
/// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - fourth index: ? [0..168*N_RB_DL[
|
||||
int32_t **rxdataF_comp1[8][8];
|
||||
/// \brief Downlink channel estimates extracted in PRBS.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_ch_estimates_ext;
|
||||
/// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. For the SIC receiver we need to store the history of this for each harq process and round
|
||||
/// - first index: ? [0..7] (hard coded) accessed via \c harq_pid
|
||||
/// - second index: ? [0..7] (hard coded) accessed via \c round
|
||||
/// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - fourth index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_ch_rho_ext[8][8];
|
||||
/// \brief Downlink beamforming channel estimates in frequency domain.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
|
||||
int32_t **dl_bf_ch_estimates;
|
||||
/// \brief Downlink beamforming channel estimates.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_bf_ch_estimates_ext;
|
||||
/// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_ch_rho2_ext;
|
||||
/// \brief Downlink PMIs extracted in PRBS and grouped in subbands.
|
||||
/// - first index: ressource block [0..N_RB_DL[
|
||||
uint8_t *pmi_ext;
|
||||
/// \brief Magnitude of Downlink Channel first layer (16QAM level/First 64QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_ch_mag0;
|
||||
/// \brief Magnitude of Downlink Channel second layer (16QAM level/First 64QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_ch_mag1[8][8];
|
||||
/// \brief Magnitude of Downlink Channel, first layer (2nd 64QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_ch_magb0;
|
||||
/// \brief Magnitude of Downlink Channel second layer (2nd 64QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_ch_magb1[8][8];
|
||||
/// \brief Cross-correlation of two eNB signals.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: symbol [0..]
|
||||
int32_t **rho;
|
||||
/// never used... always send dl_ch_rho_ext instead...
|
||||
int32_t **rho_i;
|
||||
/// \brief Pointers to llr vectors (2 TBs).
|
||||
/// - first index: ? [0..1] (hard coded)
|
||||
/// - second index: ? [0..1179743] (hard coded)
|
||||
int16_t *llr[2];
|
||||
/// \f$\log_2(\max|H_i|^2)\f$
|
||||
int16_t log2_maxh;
|
||||
/// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer1 channel compensation
|
||||
int16_t log2_maxh0;
|
||||
/// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer2 channel commpensation
|
||||
int16_t log2_maxh1;
|
||||
/// \brief LLR shifts for subband scaling.
|
||||
/// - first index: ? [0..168*N_RB_DL[
|
||||
uint8_t *llr_shifts;
|
||||
/// \brief Pointer to LLR shifts.
|
||||
/// - first index: ? [0..168*N_RB_DL[
|
||||
uint8_t *llr_shifts_p;
|
||||
/// \brief Pointers to llr vectors (128-bit alignment).
|
||||
/// - first index: ? [0..0] (hard coded)
|
||||
/// - second index: ? [0..]
|
||||
int16_t **llr128;
|
||||
/// \brief Pointers to llr vectors (128-bit alignment).
|
||||
/// - first index: ? [0..0] (hard coded)
|
||||
/// - second index: ? [0..]
|
||||
int16_t **llr128_2ndstream;
|
||||
//uint32_t *rb_alloc;
|
||||
//uint8_t Qm[2];
|
||||
//MIMO_mode_t mimo_mode;
|
||||
} NB_IoT_UE_PDSCH;
|
||||
|
||||
/// NPRACH-ParametersList-NB-r13 from 36.331 RRC spec
|
||||
typedef struct NPRACH_Parameters_NB_IoT{
|
||||
/// the period time for nprach
|
||||
uint16_t nprach_Periodicity;
|
||||
/// for the start time for the NPRACH resource from 40ms-2560ms
|
||||
uint16_t nprach_StartTime;
|
||||
/// for the subcarrier of set to the NPRACH preamble from n0 - n34
|
||||
uint16_t nprach_SubcarrierOffset;
|
||||
///number of subcarriers in a NPRACH resource allowed values (n12,n24,n36,n48)
|
||||
uint16_t nprach_NumSubcarriers;
|
||||
/// where is the region that in NPRACH resource to indicate if this UE support MSG3 for multi-tone or not. from 0 - 1
|
||||
uint16_t nprach_SubcarrierMSG3_RangeStart;
|
||||
/// The max preamble transmission attempt for the CE level from 1 - 128
|
||||
uint16_t maxNumPreambleAttemptCE;
|
||||
/// Number of NPRACH repetitions per attempt for each NPRACH resource
|
||||
uint16_t numRepetitionsPerPreambleAttempt;
|
||||
/// The number of the repetition for DCI use in RAR/MSG3/MSG4 from 1 - 2048 (Rmax)
|
||||
uint16_t npdcch_NumRepetitions_RA;
|
||||
/// Starting subframe for NPDCCH Common searching space for (RAR/MSG3/MSG4)
|
||||
uint16_t npdcch_StartSF_CSS_RA;
|
||||
/// Fractional period offset of starting subframe for NPDCCH common search space
|
||||
uint16_t npdcch_Offset_RA;
|
||||
} nprach_parameters_NB_IoT_t;
|
||||
|
||||
typedef struct{
|
||||
nprach_parameters_NB_IoT_t list[3];
|
||||
}NPRACH_List_NB_IoT_t;
|
||||
|
||||
typedef long RSRP_Range_t;
|
||||
|
||||
typedef struct {
|
||||
A_SEQUENCE_OF(RSRP_Range_t) list;
|
||||
}rsrp_ThresholdsNPrachInfoList;
|
||||
|
||||
|
||||
/// NPRACH_ConfigSIB-NB from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// nprach_CP_Length_r13, for the CP length(unit us) only 66.7 and 266.7 is implemented
|
||||
uint16_t nprach_CP_Length;
|
||||
/// The criterion for UEs to select a NPRACH resource. Up to 2 RSRP threshold values can be signalled. \vr{[1..2]}
|
||||
struct rsrp_ThresholdsNPrachInfoList *rsrp_ThresholdsPrachInfoList;
|
||||
/// NPRACH Parameters List
|
||||
NPRACH_List_NB_IoT_t nprach_ParametersList;
|
||||
|
||||
} NPRACH_CONFIG_COMMON;
|
||||
|
||||
/// NPDSCH-ConfigCommon from 36.331 RRC spec
|
||||
typedef struct {
|
||||
///see TS 36.213 (16.2). \vr{[-60..50]}\n Provides the downlink reference-signal EPRE. The actual value in dBm.
|
||||
uint16_t nrs_Power;
|
||||
} NPDSCH_CONFIG_COMMON;
|
||||
|
||||
typedef struct{
|
||||
/// The base sequence of DMRS sequence in a cell for 3 tones transmission; see TS 36.211 [21, 10.1.4.1.2]. If absent, it is given by NB-IoT CellID mod 12. Value 12 is not used.
|
||||
uint16_t threeTone_BaseSequence;
|
||||
/// Define 3 cyclic shifts for the 3-tone case, see TS 36.211 [21, 10.1.4.1.2].
|
||||
uint16_t threeTone_CyclicShift;
|
||||
/// The base sequence of DMRS sequence in a cell for 6 tones transmission; see TS 36.211 [21, 10.1.4.1.2]. If absent, it is given by NB-IoT CellID mod 14. Value 14 is not used.
|
||||
uint16_t sixTone_BaseSequence;
|
||||
/// Define 4 cyclic shifts for the 6-tone case, see TS 36.211 [21, 10.1.4.1.2].
|
||||
uint16_t sixTone_CyclicShift;
|
||||
/// The base sequence of DMRS sequence in a cell for 12 tones transmission; see TS 36.211 [21, 10.1.4.1.2]. If absent, it is given by NB-IoT CellID mod 30. Value 30 is not used.
|
||||
uint16_t twelveTone_BaseSequence;
|
||||
|
||||
}DMRS_CONFIG_t;
|
||||
|
||||
/// UL-ReferenceSignalsNPUSCH from 36.331 RRC spec
|
||||
typedef struct {
|
||||
/// Parameter: Group-hopping-enabled, see TS 36.211 (5.5.1.3). \vr{[0..1]}
|
||||
uint8_t groupHoppingEnabled;
|
||||
/// , see TS 36.211 (5.5.1.3). \vr{[0..29]}
|
||||
uint8_t groupAssignmentNPUSCH;
|
||||
/// Parameter: cyclicShift, see TS 36.211 (Table 5.5.2.1.1-2). \vr{[0..7]}
|
||||
uint8_t cyclicShift;
|
||||
/// nPRS for cyclic shift of DRS \note not part of offical UL-ReferenceSignalsPUSCH ASN1 specification.
|
||||
uint8_t nPRS[20];
|
||||
/// group hopping sequence for DMRS, 36.211, Section 10.1.4.1.3. Second index corresponds to the four possible subcarrier configurations
|
||||
uint8_t grouphop[20][4];
|
||||
/// sequence hopping sequence for DRS \note not part of offical UL-ReferenceSignalsPUSCH ASN1 specification.
|
||||
uint8_t seqhop[20];
|
||||
} UL_REFERENCE_SIGNALS_NPUSCH_t;
|
||||
|
||||
|
||||
/// PUSCH-ConfigCommon from 36.331 RRC spec.
|
||||
typedef struct {
|
||||
/// Number of repetitions for ACK/NACK HARQ response to NPDSCH containing Msg4 per NPRACH resource, see TS 36.213 [23, 16.4.2].
|
||||
uint8_t ack_NACK_NumRepetitions_Msg4[3];
|
||||
/// SRS SubframeConfiguration. See TS 36.211 [21, table 5.5.3.3-1]. Value sc0 corresponds to value 0, sc1 to value 1 and so on.
|
||||
uint8_t srs_SubframeConfig;
|
||||
/// Parameter: \f$N^{HO}_{RB}\f$, see TS 36.211 (5.3.4). \vr{[0..98]}
|
||||
DMRS_CONFIG_t dmrs_Config;
|
||||
/// Ref signals configuration
|
||||
UL_REFERENCE_SIGNALS_NPUSCH_t ul_ReferenceSignalsNPUSCH;
|
||||
|
||||
} NPUSCH_CONFIG_COMMON;
|
||||
|
||||
|
||||
typedef struct{
|
||||
/// See TS 36.213 [23, 16.2.1.1], unit dBm.
|
||||
uint8_t p0_NominalNPUSCH;
|
||||
/// See TS 36.213 [23, 16.2.1.1] where al0 corresponds to 0, al04 corresponds to value 0.4, al05 to 0.5, al06 to 0.6, al07 to 0.7, al08 to 0.8, al09 to 0.9 and al1 corresponds to 1.
|
||||
uint8_t alpha;
|
||||
/// See TS 36.213 [23, 16.2.1.1]. Actual value = IE value * 2 [dB].
|
||||
uint8_t deltaPreambleMsg3;
|
||||
}UplinkPowerControlCommon_NB_IoT;
|
||||
|
||||
|
||||
/* DL-GapConfig-NB-r13 */
|
||||
typedef struct {
|
||||
uint16_t dl_GapThreshold;
|
||||
uint16_t dl_GapPeriodicity;
|
||||
uint16_t dl_GapDurationCoeff;
|
||||
} DL_GapConfig_NB_IoT;
|
||||
|
||||
#define NBIOT_INBAND_LTEPCI 0
|
||||
#define NBIOT_INBAND_IOTPCI 1
|
||||
#define NBIOT_INGUARD 2
|
||||
#define NBIOT_STANDALONE 3
|
||||
|
||||
|
||||
typedef struct {
|
||||
/// for inband, lte bandwidth
|
||||
uint8_t LTE_N_RB_DL;
|
||||
uint8_t LTE_N_RB_UL;
|
||||
/// Cell ID
|
||||
uint16_t Nid_cell;
|
||||
/// shift of pilot position in one RB
|
||||
uint8_t nushift;
|
||||
/// indicates if node is a UE (NODE=2) or eNB (PRIMARY_CH=0).
|
||||
uint8_t node_id;
|
||||
/// Frequency index of CBMIMO1 card
|
||||
uint8_t freq_idx;
|
||||
/// RX Frequency for ExpressMIMO/LIME
|
||||
uint32_t carrier_freq[4];
|
||||
/// TX Frequency for ExpressMIMO/LIME
|
||||
uint32_t carrier_freqtx[4];
|
||||
/// RX gain for ExpressMIMO/LIME
|
||||
uint32_t rxgain[4];
|
||||
/// TX gain for ExpressMIMO/LIME
|
||||
uint32_t txgain[4];
|
||||
/// RF mode for ExpressMIMO/LIME
|
||||
uint32_t rfmode[4];
|
||||
/// RF RX DC Calibration for ExpressMIMO/LIME
|
||||
uint32_t rxdc[4];
|
||||
/// RF TX DC Calibration for ExpressMIMO/LIME
|
||||
uint32_t rflocal[4];
|
||||
/// RF VCO calibration for ExpressMIMO/LIME
|
||||
uint32_t rfvcolocal[4];
|
||||
/// Turns on second TX of CBMIMO1 card
|
||||
uint8_t dual_tx;
|
||||
/// flag to indicate SISO transmission
|
||||
uint8_t mode1_flag;
|
||||
/// Indicator that 20 MHz channel uses 3/4 sampling frequency
|
||||
//uint8_t threequarter_fs;
|
||||
/// Size of FFT
|
||||
uint16_t ofdm_symbol_size;
|
||||
/// Number of prefix samples in all but first symbol of slot
|
||||
uint16_t nb_prefix_samples;
|
||||
/// Number of prefix samples in first symbol of slot
|
||||
uint16_t nb_prefix_samples0;
|
||||
/// Carrier offset in FFT buffer for first RE in PRB0
|
||||
uint16_t first_carrier_offset;
|
||||
/// Number of samples in a subframe
|
||||
uint32_t samples_per_tti;
|
||||
/// Number of OFDM/SC-FDMA symbols in one subframe (to be modified to account for potential different in UL/DL)
|
||||
uint16_t symbols_per_tti;
|
||||
/// Number of Physical transmit antennas in node
|
||||
uint8_t nb_antennas_tx;
|
||||
/// Number of Receive antennas in node
|
||||
uint8_t nb_antennas_rx;
|
||||
/// Number of common transmit antenna ports in eNodeB (1 or 2)
|
||||
uint8_t nb_antenna_ports_eNB;
|
||||
/// Number of common receiving antenna ports in eNodeB (1 or 2)
|
||||
uint8_t nb_antenna_ports_rx_eNB;
|
||||
/// NPRACH Config Common (from 36-331 RRC spec)
|
||||
NPRACH_CONFIG_COMMON nprach_config_common;
|
||||
/// NPDSCH Config Common (from 36-331 RRC spec)
|
||||
NPDSCH_CONFIG_COMMON npdsch_config_common;
|
||||
/// PUSCH Config Common (from 36-331 RRC spec)
|
||||
NPUSCH_CONFIG_COMMON npusch_config_common;
|
||||
/// UL Power Control (from 36-331 RRC spec)
|
||||
UplinkPowerControlCommon_NB_IoT ul_power_control_config_common;
|
||||
/// DL Gap
|
||||
DL_GapConfig_NB_IoT DL_gap_config;
|
||||
/// Size of SI windows used for repetition of one SI message (in frames)
|
||||
uint8_t SIwindowsize;
|
||||
/// Period of SI windows used for repetition of one SI message (in frames)
|
||||
uint16_t SIPeriod;
|
||||
int eutra_band;
|
||||
uint32_t dl_CarrierFreq;
|
||||
uint32_t ul_CarrierFreq;
|
||||
// CE level to determine the NPRACH Configuration (one CE for each NPRACH config.)
|
||||
uint8_t CE;
|
||||
|
||||
/*
|
||||
* index of the PRB assigned to NB-IoT carrier in in-band/guard-band operating mode
|
||||
*/
|
||||
unsigned short NB_IoT_RB_ID;
|
||||
|
||||
|
||||
/*Following FAPI approach:
|
||||
* 0 = in-band with same PCI
|
||||
* 1 = in-band with diff PCI
|
||||
* 2 = guard band
|
||||
* 3 =stand alone
|
||||
*/
|
||||
uint16_t operating_mode;
|
||||
/*
|
||||
* Only for In-band operating mode with same PCI
|
||||
* its measured in number of OFDM symbols
|
||||
* allowed values:
|
||||
* 1, 2, 3, 4(this value is written in FAPI specs but not exist in TS 36.331 v14.2.1 pag 587)
|
||||
* -1 (we put this value when is not defined - other operating mode)
|
||||
*/
|
||||
uint16_t control_region_size;
|
||||
|
||||
/*Number of EUTRA CRS antenna ports (AP)
|
||||
* valid only for in-band different PCI mode
|
||||
* value 0 = indicates the same number of AP as NRS APs
|
||||
* value 1 = four CRS APs
|
||||
*/
|
||||
uint16_t eutra_NumCRS_ports;
|
||||
|
||||
/* Subcarrier bandwidth
|
||||
0 -> 3.75 kHz
|
||||
1 -> 15 kHz
|
||||
*/
|
||||
uint8_t subcarrier_spacing;
|
||||
|
||||
} NB_IoT_DL_FRAME_PARMS;
|
||||
|
||||
typedef struct {
|
||||
/// \brief Pointers (dynamic) to the received data in the time domain.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx]
|
||||
/// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti]
|
||||
int32_t **rxdata;
|
||||
/// \brief Pointers (dynamic) to the received data in the frequency domain.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti]
|
||||
int32_t **rxdataF;
|
||||
/// \brief holds the transmit data in the frequency domain.
|
||||
/// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. //?
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - second index: tx antenna [0..14[ where 14 is the total supported antenna ports.
|
||||
/// - third index: sample [0..]
|
||||
int32_t **txdataF;
|
||||
} NB_IoT_eNB_COMMON;
|
||||
|
||||
typedef struct {
|
||||
/// \brief Holds the transmit data in the frequency domain.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[
|
||||
int32_t **txdata;
|
||||
/// \brief Holds the receive data in the frequency domain.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdata[3];
|
||||
/// \brief Holds the last subframe of received data in time domain after removal of 7.5kHz frequency offset.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: sample [0..samples_per_tti[
|
||||
int32_t **rxdata_7_5kHz[3];
|
||||
/// \brief Holds the received data in the frequency domain.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF[3];
|
||||
/// \brief Holds output of the sync correlator.
|
||||
/// - first index: sample [0..samples_per_tti*10[
|
||||
uint32_t *sync_corr[3];
|
||||
} NB_IoT_RU_COMMON;
|
||||
|
||||
typedef struct {
|
||||
/// \brief Hold the channel estimates in frequency domain based on SRS.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..ofdm_symbol_size[
|
||||
int32_t **srs_ch_estimates[3];
|
||||
/// \brief Hold the channel estimates in time domain based on SRS.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..2*ofdm_symbol_size[
|
||||
int32_t **srs_ch_estimates_time[3];
|
||||
/// \brief Holds the SRS for channel estimation at the RX.
|
||||
/// - first index: ? [0..ofdm_symbol_size[
|
||||
int32_t *srs;
|
||||
} NB_IoT_eNB_SRS;
|
||||
|
||||
typedef struct {
|
||||
/// \brief Holds the received data in the frequency domain for the allocated RBs in repeated format.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..2*ofdm_symbol_size[
|
||||
/// - third index (definition from phy_init_lte_eNB()): ? [0..24*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
/// \warning inconsistent third index definition
|
||||
int32_t **rxdataF_ext[3];
|
||||
/// \brief Holds the received data in the frequency domain for the allocated RBs in normal format.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_ext2[3];
|
||||
/// \brief Hold the channel estimates in time domain based on DRS.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..4*ofdm_symbol_size[
|
||||
int32_t **drs_ch_estimates_time[3];
|
||||
/// \brief Hold the channel estimates in frequency domain based on DRS.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **drs_ch_estimates[3];
|
||||
/// \brief Hold the channel estimates for UE0 in case of Distributed Alamouti Scheme.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **drs_ch_estimates_0[3];
|
||||
/// \brief Hold the channel estimates for UE1 in case of Distributed Almouti Scheme.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **drs_ch_estimates_1[3];
|
||||
/// \brief Holds the compensated signal.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_comp[3];
|
||||
/// \brief Hold the compensated data (y)*(h0*) in case of Distributed Alamouti Scheme.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_comp_0[3];
|
||||
/// \brief Hold the compensated data (y*)*(h1) in case of Distributed Alamouti Scheme.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_comp_1[3];
|
||||
/// \brief ?.
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_mag[3];
|
||||
/// \brief ?.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_magb[3];
|
||||
/// \brief Hold the channel mag for UE0 in case of Distributed Alamouti Scheme.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_mag_0[3];
|
||||
/// \brief Hold the channel magb for UE0 in case of Distributed Alamouti Scheme.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_magb_0[3];
|
||||
/// \brief Hold the channel mag for UE1 in case of Distributed Alamouti Scheme.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_mag_1[3];
|
||||
/// \brief Hold the channel magb for UE1 in case of Distributed Alamouti Scheme.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_magb_1[3];
|
||||
/// measured RX power based on DRS
|
||||
int ulsch_power[2];
|
||||
/// measured RX power based on DRS for UE0 in case of Distributed Alamouti Scheme
|
||||
int ulsch_power_0[2];
|
||||
/// measured RX power based on DRS for UE0 in case of Distributed Alamouti Scheme
|
||||
int ulsch_power_1[2];
|
||||
/// \brief llr values.
|
||||
/// - first index: ? [0..1179743] (hard coded)
|
||||
int16_t *llr;
|
||||
#ifdef LOCALIZATION
|
||||
/// number of active subcarrier for a specific UE
|
||||
int32_t active_subcarrier;
|
||||
/// subcarrier power in dBm
|
||||
int32_t *subcarrier_power;
|
||||
#endif
|
||||
} NB_IoT_eNB_PUSCH;
|
||||
|
||||
#define PBCH_A_NB_IoT 24
|
||||
typedef struct {
|
||||
uint8_t pbch_d[96+(3*(16+PBCH_A_NB_IoT))];
|
||||
uint8_t pbch_w[3*3*(16+PBCH_A_NB_IoT)];
|
||||
uint8_t pbch_e[1920];
|
||||
} NB_IoT_eNB_PBCH;
|
||||
|
||||
|
||||
typedef enum {
|
||||
/// TM1
|
||||
SISO_NB_IoT=0,
|
||||
/// TM2
|
||||
ALAMOUTI_NB_IoT=1,
|
||||
/// TM3
|
||||
LARGE_CDD_NB_IoT=2,
|
||||
/// the next 6 entries are for TM5
|
||||
UNIFORM_PRECODING11_NB_IoT=3,
|
||||
UNIFORM_PRECODING1m1_NB_IoT=4,
|
||||
UNIFORM_PRECODING1j_NB_IoT=5,
|
||||
UNIFORM_PRECODING1mj_NB_IoT=6,
|
||||
PUSCH_PRECODING0_NB_IoT=7,
|
||||
PUSCH_PRECODING1_NB_IoT=8,
|
||||
/// the next 3 entries are for TM4
|
||||
DUALSTREAM_UNIFORM_PRECODING1_NB_IoT=9,
|
||||
DUALSTREAM_UNIFORM_PRECODINGj_NB_IoT=10,
|
||||
DUALSTREAM_PUSCH_PRECODING_NB_IoT=11,
|
||||
TM7_NB_IoT=12,
|
||||
TM8_NB_IoT=13,
|
||||
TM9_10_NB_IoT=14
|
||||
} MIMO_mode_NB_IoT_t;
|
||||
|
||||
typedef struct {
|
||||
/// \brief ?.
|
||||
/// first index: ? [0..1023] (hard coded)
|
||||
int16_t *prachF;
|
||||
/// \brief ?.
|
||||
/// first index: rx antenna [0..63] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx.
|
||||
/// second index: ? [0..ofdm_symbol_size*12[
|
||||
int16_t *rxsigF[64];
|
||||
/// \brief local buffer to compute prach_ifft (necessary in case of multiple CCs)
|
||||
/// first index: rx antenna [0..63] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx.
|
||||
/// second index: ? [0..2047] (hard coded)
|
||||
int16_t *prach_ifft[64];
|
||||
} NB_IoT_eNB_PRACH;
|
||||
|
||||
typedef enum {
|
||||
NOT_SYNCHED_NB_IoT=0,
|
||||
PRACH_NB_IoT=1,
|
||||
RA_RESPONSE_NB_IoT=2,
|
||||
PUSCH_NB_IoT=3,
|
||||
RESYNCH_NB_IoT=4
|
||||
} UE_MODE_NB_IoT_t;
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,541 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file PHY/impl_defs_top.h
|
||||
* \brief More defines and structure definitions
|
||||
* \author R. Knopp, F. Kaltenberger
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#ifndef __PHY_IMPLEMENTATION_DEFS_NB_IOT_H__
|
||||
#define __PHY_IMPLEMENTATION_DEFS_NB_IOT_H__
|
||||
|
||||
|
||||
#include "openairinterface5g_limits.h"
|
||||
/** @defgroup _ref_implementation_ OpenAirInterface LTE Implementation
|
||||
* @{
|
||||
|
||||
* @defgroup _PHY_RF_INTERFACE_ PHY - RF Interface
|
||||
* @ingroup _PHY_RF_INTERFACE_
|
||||
* @{
|
||||
* @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface
|
||||
* @defgroup _USRP_PHY_RF_INTERFACE_ PHY - USRP RF Interface
|
||||
* @defgroup _BLADERF_PHY_RF_INTERFACE_ PHY - BLADERF RF Interface
|
||||
* @defgroup _LMSSDR_PHY_RF_INTERFACE_ PHY - LMSSDR RF Interface
|
||||
* @}
|
||||
*
|
||||
* @ingroup _ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for defining the generic interface between PHY and RF Target
|
||||
* @}
|
||||
|
||||
* @defgroup _openair1_ openair1 Reference Implementation
|
||||
* @ingroup _ref_implementation_
|
||||
* @{
|
||||
|
||||
|
||||
* @defgroup _physical_layer_ref_implementation_ Physical Layer Reference Implementation
|
||||
* @ingroup _openair1_
|
||||
* @{
|
||||
|
||||
|
||||
* @defgroup _PHY_STRUCTURES_ Basic Structures and Memory Initialization
|
||||
* @ingroup _physical_layer_ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for defining and initializing the PHY variables during static configuration of OpenAirInterface.
|
||||
* @}
|
||||
|
||||
* @defgroup _PHY_DSP_TOOLS_ DSP Tools
|
||||
* @ingroup _physical_layer_ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for basic signal processing related to inner-MODEM processing.
|
||||
* @}
|
||||
|
||||
* @defgroup _PHY_MODULATION_ Modulation and Demodulation
|
||||
* @ingroup _physical_layer_ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for procedures related to OFDMA modulation and demodulation.
|
||||
* @}
|
||||
|
||||
* @defgroup _PHY_PARAMETER_ESTIMATION_BLOCKS_ Parameter Estimation
|
||||
* @ingroup _physical_layer_ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for procedures related to OFDMA frequency-domain channel estimation for LTE Downlink Channels.
|
||||
* @}
|
||||
|
||||
* @defgroup _PHY_CODING_BLOCKS_ Channel Coding/Decoding Functions
|
||||
* @ingroup _physical_layer_ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for procedures related to channel coding/decoding, rate-matching, segementation and interleaving.
|
||||
* @}
|
||||
|
||||
* @defgroup _PHY_TRANSPORT_ Transport/Physical Channel Processing
|
||||
* @ingroup _physical_layer_ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for defining and processing the PHY procedures (TX/RX) related to transport and physical channels.
|
||||
* @}
|
||||
|
||||
* @defgroup _PHY_PROCEDURES_ Physical Layer Procedures
|
||||
* @ingroup _physical_layer_ref_implementation_
|
||||
* @{
|
||||
* This module is responsible for defining and processing the PHY procedures (TX/RX) related to transport and physical channels.
|
||||
* @}
|
||||
|
||||
* @}
|
||||
* @}
|
||||
* @}
|
||||
*/
|
||||
|
||||
//#include "types.h"
|
||||
|
||||
/*
|
||||
|
||||
|
||||
#define NUMBER_OF_OFDM_CARRIERS (frame_parms->ofdm_symbol_size)
|
||||
#define NUMBER_OF_SYMBOLS_PER_FRAME (frame_parms->symbols_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)
|
||||
#define NUMBER_OF_USEFUL_CARRIERS (12*frame_parms->N_RB_DL)
|
||||
#define NUMBER_OF_ZERO_CARRIERS (NUMBER_OF_OFDM_CARRIERS-NUMBER_OF_USEFUL_CARRIERS)
|
||||
#define NUMBER_OF_USEFUL_CARRIERS_BYTES (NUMBER_OF_USEFUL_CARRIERS>>2)
|
||||
#define HALF_NUMBER_OF_USEFUL_CARRIERS (NUMBER_OF_USEFUL_CARRIERS>>1)
|
||||
#define HALF_NUMBER_OF_USEFUL_CARRIERS_BYTES (HALF_NUMBER_OF_USEFUL_CARRIERS>>2)
|
||||
#define FIRST_CARRIER_OFFSET (HALF_NUMBER_OF_USEFUL_CARRIERS+NUMBER_OF_ZERO_CARRIERS)
|
||||
#define NUMBER_OF_OFDM_SYMBOLS_PER_SLOT (NUMBER_OF_SYMBOLS_PER_FRAME/LTE_SLOTS_PER_FRAME)
|
||||
|
||||
#ifdef EMOS
|
||||
#define EMOS_SCH_INDEX 1
|
||||
#endif //EMOS
|
||||
|
||||
#define EXTENSION_TYPE (PHY_config->PHY_framing.Extension_type)
|
||||
|
||||
#define NUMBER_OF_OFDM_CARRIERS_BYTES NUMBER_OF_OFDM_CARRIERS*4
|
||||
//#define NUMBER_OF_USEFUL_CARRIERS_BYTES NUMBER_OF_USEFUL_CARRIERS*4
|
||||
#define HALF_NUMBER_OF_USER_CARRIERS_BYTES NUMBER_OF_USEFUL_CARRIERS/2
|
||||
|
||||
#define CYCLIC_PREFIX_LENGTH (frame_parms->nb_prefix_samples)
|
||||
#define CYCLIC_PREFIX_LENGTH_SAMPLES (CYCLIC_PREFIX_LENGTH*2)
|
||||
#define CYCLIC_PREFIX_LENGTH_BYTES (CYCLIC_PREFIX_LENGTH*4)
|
||||
#define CYCLIC_PREFIX_LENGTH0 (frame_parms->nb_prefix_samples0)
|
||||
#define CYCLIC_PREFIX_LENGTH_SAMPLES0 (CYCLIC_PREFIX_LENGTH0*2)
|
||||
#define CYCLIC_PREFIX_LENGTH_BYTES0 (CYCLIC_PREFIX_LENGTH0*4)
|
||||
|
||||
#define OFDM_SYMBOL_SIZE_SAMPLES ((NUMBER_OF_OFDM_CARRIERS + CYCLIC_PREFIX_LENGTH)*2) // 16-bit units (i.e. real samples)
|
||||
#define OFDM_SYMBOL_SIZE_SAMPLES0 ((NUMBER_OF_OFDM_CARRIERS + CYCLIC_PREFIX_LENGTH0)*2) // 16-bit units (i.e. real samples)
|
||||
#define OFDM_SYMBOL_SIZE_SAMPLES_MAX 4096 // 16-bit units (i.e. real samples)
|
||||
#define OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES (OFDM_SYMBOL_SIZE_SAMPLES/2) // 32-bit units (i.e. complex samples)
|
||||
#define OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0 (OFDM_SYMBOL_SIZE_SAMPLES0/2) // 32-bit units (i.e. complex samples)
|
||||
#define OFDM_SYMBOL_SIZE_SAMPLES_NO_PREFIX ((NUMBER_OF_OFDM_CARRIERS)*2)
|
||||
#define OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX (OFDM_SYMBOL_SIZE_SAMPLES_NO_PREFIX/2)
|
||||
#define OFDM_SYMBOL_SIZE_BYTES (OFDM_SYMBOL_SIZE_SAMPLES*2)
|
||||
#define OFDM_SYMBOL_SIZE_BYTES0 (OFDM_SYMBOL_SIZE_SAMPLES0*2)
|
||||
#define OFDM_SYMBOL_SIZE_BYTES_NO_PREFIX (OFDM_SYMBOL_SIZE_SAMPLES_NO_PREFIX*2)
|
||||
|
||||
#define SLOT_LENGTH_BYTES (frame_parms->samples_per_tti<<1) // 4 bytes * samples_per_tti/2
|
||||
#define SLOT_LENGTH_BYTES_NO_PREFIX (OFDM_SYMBOL_SIZE_BYTES_NO_PREFIX * NUMBER_OF_OFDM_SYMBOLS_PER_SLOT)
|
||||
|
||||
#define FRAME_LENGTH_COMPLEX_SAMPLES (frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)
|
||||
#define FRAME_LENGTH_SAMPLES (FRAME_LENGTH_COMPLEX_SAMPLES*2)
|
||||
#define FRAME_LENGTH_SAMPLES_NO_PREFIX (NUMBER_OF_SYMBOLS_PER_FRAME*OFDM_SYMBOL_SIZE_SAMPLES_NO_PREFIX)
|
||||
#define FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX (FRAME_LENGTH_SAMPLES_NO_PREFIX/2)
|
||||
|
||||
#define NUMBER_OF_CARRIERS_PER_GROUP (NUMBER_OF_USEFUL_CARRIERS/NUMBER_OF_FREQUENCY_GROUPS)
|
||||
|
||||
#define RX_PRECISION (16)
|
||||
#define LOG2_RX_PRECISION (4)
|
||||
#define RX_OUTPUT_SHIFT (4)
|
||||
|
||||
|
||||
#define SAMPLE_SIZE_BYTES 2 // 2 bytes/real sample
|
||||
|
||||
#define FRAME_LENGTH_BYTES (FRAME_LENGTH_SAMPLES * SAMPLE_SIZE_BYTES) // frame size in bytes
|
||||
#define FRAME_LENGTH_BYTES_NO_PREFIX (FRAME_LENGTH_SAMPLES_NO_PREFIX * SAMPLE_SIZE_BYTES) // frame size in bytes
|
||||
|
||||
|
||||
#define FFT_SCALE_FACTOR 8 // Internal Scaling for FFT
|
||||
#define DMA_BLKS_PER_SLOT (SLOT_LENGTH_BYTES/2048) // Number of DMA blocks per slot
|
||||
#define SLOT_TIME_NS (SLOT_LENGTH_SAMPLES*(1e3)/7.68) // slot time in ns
|
||||
|
||||
#define NB_ANTENNA_PORTS_ENB 6 // total number of eNB antenna ports
|
||||
|
||||
#ifdef EXMIMO
|
||||
#define TARGET_RX_POWER 55 // Target digital power for the AGC
|
||||
#define TARGET_RX_POWER_MAX 55 // Maximum digital power, such that signal does not saturate (value found by simulation)
|
||||
#define TARGET_RX_POWER_MIN 50 // Minimum digital power, anything below will be discarded (value found by simulation)
|
||||
#else
|
||||
#define TARGET_RX_POWER 50 // Target digital power for the AGC
|
||||
#define TARGET_RX_POWER_MAX 65 // Maximum digital power, such that signal does not saturate (value found by simulation)
|
||||
#define TARGET_RX_POWER_MIN 35 // Minimum digital power, anything below will be discarded (value found by simulation)
|
||||
#endif
|
||||
|
||||
//the min and max gains have to match the calibrated gain table
|
||||
//#define MAX_RF_GAIN 160
|
||||
//#define MIN_RF_GAIN 96
|
||||
#define MAX_RF_GAIN 200
|
||||
#define MIN_RF_GAIN 80
|
||||
|
||||
#define PHY_SYNCH_OFFSET ((OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)-1) // OFFSET of BEACON SYNCH
|
||||
#define PHY_SYNCH_MIN_POWER 1000
|
||||
#define PHY_SYNCH_THRESHOLD 100
|
||||
|
||||
*/
|
||||
|
||||
#define ONE_OVER_SQRT2_Q15_NB_IoT 23170
|
||||
|
||||
/*
|
||||
#define ONE_OVER_2_Q15 16384
|
||||
|
||||
// QAM amplitude definitions
|
||||
|
||||
/// First Amplitude for QAM16 (\f$ 2^{15} \times 2/\sqrt{10}\f$)
|
||||
#define QAM16_n1 20724
|
||||
/// Second Amplitude for QAM16 (\f$ 2^{15} \times 1/\sqrt{10}\f$)
|
||||
#define QAM16_n2 10362
|
||||
|
||||
///First Amplitude for QAM64 (\f$ 2^{15} \times 4/\sqrt{42}\f$)
|
||||
#define QAM64_n1 20225
|
||||
///Second Amplitude for QAM64 (\f$ 2^{15} \times 2/\sqrt{42}\f$)
|
||||
#define QAM64_n2 10112
|
||||
///Third Amplitude for QAM64 (\f$ 2^{15} \times 1/\sqrt{42}\f$)
|
||||
#define QAM64_n3 5056
|
||||
|
||||
/// First Amplitude for QAM16 for TM5 (\f$ 2^{15} \times 2/sqrt(20)\f$)
|
||||
#define QAM16_TM5_n1 14654
|
||||
/// Second Amplitude for QAM16 for TM5 Receiver (\f$ 2^{15} \times 1/\sqrt{20}\f$)
|
||||
#define QAM16_TM5_n2 7327
|
||||
|
||||
///First Amplitude for QAM64 (\f$ 2^{15} \times 4/\sqrt{84}\f$)
|
||||
#define QAM64_TM5_n1 14301
|
||||
///Second Amplitude for QAM64 (\f$ 2^{15} \times 2/\sqrt{84}\f$)
|
||||
#define QAM64_TM5_n2 7150
|
||||
///Third Amplitude for QAM64 for TM5 Receiver (\f$ 2^{15} \times 1/\sqrt{84}\f$)
|
||||
#define QAM64_TM5_n3 3575
|
||||
|
||||
|
||||
#ifdef BIT8_RXMUX
|
||||
#define PERROR_SHIFT 0
|
||||
#else
|
||||
#define PERROR_SHIFT 10
|
||||
#endif
|
||||
|
||||
#define BIT8_TX_SHIFT 2
|
||||
#define BIT8_TX_SHIFT_DB 12
|
||||
|
||||
//#define CHBCH_RSSI_MIN -75
|
||||
|
||||
#ifdef BIT8_TX
|
||||
#define AMP 128
|
||||
#else
|
||||
#define AMP 512//1024 //4096
|
||||
#endif
|
||||
|
||||
#define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15)
|
||||
#define AMP_OVER_2 (AMP>>1)
|
||||
|
||||
/// Threshold for PUCCH Format 1 detection
|
||||
#define PUCCH1_THRES 0
|
||||
/// Threshold for PUCCH Format 1a/1b detection
|
||||
#define PUCCH1a_THRES 4
|
||||
|
||||
/// Data structure for transmission.
|
||||
typedef struct {
|
||||
/// RAW TX sample buffer
|
||||
char *TX_DMA_BUFFER[2];
|
||||
} TX_VARS ;
|
||||
|
||||
/// Data structure for reception.
|
||||
typedef struct {
|
||||
/// RAW TX sample buffer
|
||||
char *TX_DMA_BUFFER[2];
|
||||
/// RAW RX sample buffer
|
||||
int *RX_DMA_BUFFER[2];
|
||||
} TX_RX_VARS;
|
||||
|
||||
//! \brief Extension Type /
|
||||
typedef enum {
|
||||
CYCLIC_PREFIX,
|
||||
CYCLIC_SUFFIX,
|
||||
ZEROS,
|
||||
NONE
|
||||
} Extension_t;
|
||||
|
||||
/// Measurement Variables
|
||||
*/
|
||||
#define NUMBER_OF_SUBBANDS_MAX_NB_IoT 13
|
||||
/*
|
||||
#define NUMBER_OF_HARQ_PID_MAX 8
|
||||
|
||||
#define MAX_FRAME_NUMBER 0x400
|
||||
#include "openairinterface5g_limits.h"
|
||||
|
||||
#define NUMBER_OF_RN_MAX 3
|
||||
typedef enum {no_relay=1,unicast_relay_type1,unicast_relay_type2, multicast_relay} relaying_type_t;
|
||||
|
||||
typedef struct {
|
||||
//unsigned int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (linear)
|
||||
//unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (dB)
|
||||
//unsigned short rx_avg_power_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated avg received signal power (dB)
|
||||
|
||||
// RRC measurements
|
||||
uint32_t rssi;
|
||||
int n_adj_cells;
|
||||
unsigned int adj_cell_id[6];
|
||||
uint32_t rsrq[7];
|
||||
uint32_t rsrp[7];
|
||||
float rsrp_filtered[7]; // after layer 3 filtering
|
||||
float rsrq_filtered[7];
|
||||
// common measurements
|
||||
//! estimated noise power (linear)
|
||||
unsigned int n0_power[NB_ANTENNAS_RX];
|
||||
//! estimated noise power (dB)
|
||||
unsigned short n0_power_dB[NB_ANTENNAS_RX];
|
||||
//! total estimated noise power (linear)
|
||||
unsigned int n0_power_tot;
|
||||
//! total estimated noise power (dB)
|
||||
unsigned short n0_power_tot_dB;
|
||||
//! average estimated noise power (linear)
|
||||
unsigned int n0_power_avg;
|
||||
//! average estimated noise power (dB)
|
||||
unsigned short n0_power_avg_dB;
|
||||
//! total estimated noise power (dBm)
|
||||
short n0_power_tot_dBm;
|
||||
|
||||
// UE measurements
|
||||
//! estimated received spatial signal power (linear)
|
||||
int rx_spatial_power[NUMBER_OF_CONNECTED_eNB_MAX][2][2];
|
||||
//! estimated received spatial signal power (dB)
|
||||
unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][2][2];
|
||||
|
||||
/// estimated received signal power (sum over all TX antennas)
|
||||
//int wideband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
/// estimated received signal power (sum over all TX antennas)
|
||||
//int wideband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
|
||||
/// estimated received signal power (sum over all TX/RX antennas)
|
||||
int rx_power_tot[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW
|
||||
/// estimated received signal power (sum over all TX/RX antennas)
|
||||
unsigned short rx_power_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW
|
||||
|
||||
//! estimated received signal power (sum of all TX/RX antennas, time average)
|
||||
int rx_power_avg[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
//! estimated received signal power (sum of all TX/RX antennas, time average, in dB)
|
||||
unsigned short rx_power_avg_dB[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
|
||||
/// SINR (sum of all TX/RX antennas, in dB)
|
||||
int wideband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
/// SINR (sum of all TX/RX antennas, time average, in dB)
|
||||
int wideband_cqi_avg[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
|
||||
//! estimated rssi (dBm)
|
||||
short rx_rssi_dBm[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
//! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
|
||||
int rx_correlation[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
||||
//! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
|
||||
int rx_correlation_dB[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
||||
|
||||
/// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (3,4,5,6), up to 4 spatial streams)
|
||||
int precoded_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX+1][4];
|
||||
/// Subband CQI per RX antenna (= SINR)
|
||||
int subband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX];
|
||||
/// Total Subband CQI (= SINR)
|
||||
int subband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX];
|
||||
/// Subband CQI in dB (= SINR dB)
|
||||
int subband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX];
|
||||
/// Total Subband CQI
|
||||
int subband_cqi_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX];
|
||||
/// Wideband PMI for each RX antenna
|
||||
int wideband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
/// Wideband PMI for each RX antenna
|
||||
int wideband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
///Subband PMI for each RX antenna
|
||||
int subband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX];
|
||||
///Subband PMI for each RX antenna
|
||||
int subband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX];
|
||||
/// chosen RX antennas (1=Rx antenna 1, 2=Rx antenna 2, 3=both Rx antennas)
|
||||
unsigned char selected_rx_antennas[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX];
|
||||
/// Wideband Rank indication
|
||||
unsigned char rank[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
/// Number of RX Antennas
|
||||
unsigned char nb_antennas_rx;
|
||||
/// DLSCH error counter
|
||||
// short dlsch_errors;
|
||||
|
||||
} PHY_MEASUREMENTS;
|
||||
*/
|
||||
typedef enum {no_relay_NB_IoT=1,unicast_relay_type1_NB_IoT,unicast_relay_type2_NB_IoT, multicast_relay_NB_IoT} relaying_type_t_NB_IoT;
|
||||
typedef struct {
|
||||
//unsigned int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (linear)
|
||||
//unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (dB)
|
||||
//unsigned short rx_avg_power_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated avg received signal power (dB)
|
||||
|
||||
// RRC measurements
|
||||
uint32_t rssi;
|
||||
int n_adj_cells;
|
||||
unsigned int adj_cell_id[6];
|
||||
uint32_t rsrq[7];
|
||||
uint32_t rsrp[7];
|
||||
float rsrp_filtered[7]; // after layer 3 filtering
|
||||
float rsrq_filtered[7];
|
||||
// common measurements
|
||||
//! estimated noise power (linear)
|
||||
unsigned int n0_power[NB_ANTENNAS_RX];
|
||||
//! estimated noise power (dB)
|
||||
unsigned short n0_power_dB[NB_ANTENNAS_RX];
|
||||
//! total estimated noise power (linear)
|
||||
unsigned int n0_power_tot;
|
||||
//! total estimated noise power (dB)
|
||||
unsigned short n0_power_tot_dB;
|
||||
//! average estimated noise power (linear)
|
||||
unsigned int n0_power_avg;
|
||||
//! average estimated noise power (dB)
|
||||
unsigned short n0_power_avg_dB;
|
||||
//! total estimated noise power (dBm)
|
||||
short n0_power_tot_dBm;
|
||||
|
||||
// UE measurements
|
||||
//! estimated received spatial signal power (linear)
|
||||
int rx_spatial_power[NUMBER_OF_CONNECTED_eNB_MAX][2][2];
|
||||
//! estimated received spatial signal power (dB)
|
||||
unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][2][2];
|
||||
|
||||
/// estimated received signal power (sum over all TX antennas)
|
||||
//int wideband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
/// estimated received signal power (sum over all TX antennas)
|
||||
//int wideband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
|
||||
/// estimated received signal power (sum over all TX/RX antennas)
|
||||
int rx_power_tot[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW
|
||||
/// estimated received signal power (sum over all TX/RX antennas)
|
||||
unsigned short rx_power_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW
|
||||
|
||||
//! estimated received signal power (sum of all TX/RX antennas, time average)
|
||||
int rx_power_avg[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
//! estimated received signal power (sum of all TX/RX antennas, time average, in dB)
|
||||
unsigned short rx_power_avg_dB[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
|
||||
/// SINR (sum of all TX/RX antennas, in dB)
|
||||
int wideband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
/// SINR (sum of all TX/RX antennas, time average, in dB)
|
||||
int wideband_cqi_avg[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
|
||||
//! estimated rssi (dBm)
|
||||
short rx_rssi_dBm[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
//! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
|
||||
int rx_correlation[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
||||
//! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
|
||||
int rx_correlation_dB[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
||||
|
||||
/// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (3,4,5,6), up to 4 spatial streams)
|
||||
int precoded_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX+1][4];
|
||||
/// Subband CQI per RX antenna (= SINR)
|
||||
int subband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX_NB_IoT];
|
||||
/// Total Subband CQI (= SINR)
|
||||
int subband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX_NB_IoT];
|
||||
/// Subband CQI in dB (= SINR dB)
|
||||
int subband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX_NB_IoT];
|
||||
/// Total Subband CQI
|
||||
int subband_cqi_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX_NB_IoT];
|
||||
/// Wideband PMI for each RX antenna
|
||||
int wideband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
/// Wideband PMI for each RX antenna
|
||||
int wideband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||
///Subband PMI for each RX antenna
|
||||
int subband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX_NB_IoT][NB_ANTENNAS_RX];
|
||||
///Subband PMI for each RX antenna
|
||||
int subband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX_NB_IoT][NB_ANTENNAS_RX];
|
||||
/// chosen RX antennas (1=Rx antenna 1, 2=Rx antenna 2, 3=both Rx antennas)
|
||||
unsigned char selected_rx_antennas[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX_NB_IoT];
|
||||
/// Wideband Rank indication
|
||||
unsigned char rank[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
/// Number of RX Antennas
|
||||
unsigned char nb_antennas_rx;
|
||||
/// DLSCH error counter
|
||||
// short dlsch_errors;
|
||||
|
||||
} PHY_MEASUREMENTS_NB_IoT;
|
||||
|
||||
|
||||
typedef struct {
|
||||
//unsigned int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (linear)
|
||||
//unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (dB)
|
||||
//unsigned short rx_avg_power_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated avg received signal power (dB)
|
||||
|
||||
// common measurements
|
||||
//! estimated noise power (linear)
|
||||
unsigned int n0_power[NB_ANTENNAS_RX];
|
||||
//! estimated noise power (dB)
|
||||
unsigned short n0_power_dB[NB_ANTENNAS_RX];
|
||||
//! total estimated noise power (linear)
|
||||
unsigned int n0_power_tot;
|
||||
//! estimated avg noise power (dB)
|
||||
unsigned short n0_power_tot_dB;
|
||||
//! estimated avg noise power (dB)
|
||||
short n0_power_tot_dBm;
|
||||
//! estimated avg noise power per RB per RX ant (lin)
|
||||
unsigned short n0_subband_power[NB_ANTENNAS_RX][100];
|
||||
//! estimated avg noise power per RB per RX ant (dB)
|
||||
unsigned short n0_subband_power_dB[NB_ANTENNAS_RX][100];
|
||||
//! estimated avg noise power per RB (dB)
|
||||
short n0_subband_power_tot_dB[100];
|
||||
//! estimated avg noise power per RB (dBm)
|
||||
short n0_subband_power_tot_dBm[100];
|
||||
// eNB measurements (per user)
|
||||
//! estimated received spatial signal power (linear)
|
||||
unsigned int rx_spatial_power[NUMBER_OF_UE_MAX_NB_IoT][2][2];
|
||||
//! estimated received spatial signal power (dB)
|
||||
unsigned short rx_spatial_power_dB[NUMBER_OF_UE_MAX_NB_IoT][2][2];
|
||||
//! estimated rssi (dBm)
|
||||
short rx_rssi_dBm[NUMBER_OF_UE_MAX_NB_IoT];
|
||||
//! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
|
||||
int rx_correlation[NUMBER_OF_UE_MAX_NB_IoT][2];
|
||||
//! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
|
||||
int rx_correlation_dB[NUMBER_OF_UE_MAX_NB_IoT][2];
|
||||
|
||||
/// Wideband CQI (= SINR)
|
||||
int wideband_cqi[NUMBER_OF_UE_MAX_NB_IoT][NB_ANTENNAS_RX];
|
||||
/// Wideband CQI in dB (= SINR dB)
|
||||
int wideband_cqi_dB[NUMBER_OF_UE_MAX_NB_IoT][NB_ANTENNAS_RX];
|
||||
/// Wideband CQI (sum of all RX antennas, in dB)
|
||||
char wideband_cqi_tot[NUMBER_OF_UE_MAX_NB_IoT];
|
||||
/// Subband CQI per RX antenna and RB (= SINR)
|
||||
int subband_cqi[NUMBER_OF_UE_MAX_NB_IoT][NB_ANTENNAS_RX][100];
|
||||
/// Total Subband CQI and RB (= SINR)
|
||||
int subband_cqi_tot[NUMBER_OF_UE_MAX_NB_IoT][100];
|
||||
/// Subband CQI in dB and RB (= SINR dB)
|
||||
int subband_cqi_dB[NUMBER_OF_UE_MAX_NB_IoT][NB_ANTENNAS_RX][100];
|
||||
/// Total Subband CQI and RB
|
||||
int subband_cqi_tot_dB[NUMBER_OF_UE_MAX_NB_IoT][100];
|
||||
|
||||
} PHY_MEASUREMENTS_eNB_NB_IoT;
|
||||
/*
|
||||
#define MCS_COUNT 28
|
||||
#define MCS_TABLE_LENGTH_MAX 64
|
||||
*/
|
||||
#endif //__PHY_IMPLEMENTATION_DEFS_H__
|
||||
/**@}
|
||||
*/
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef __openair_TYPES_NB_IOT_H__
|
||||
#define __openair_TYPES_NB_IOT_H__
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*__openair_TYPES_NB_IOT_H__ */
|
||||
+1
-1
@@ -149,5 +149,5 @@ int16_t unscrambling_lut[65536*16] __attribute__((aligned(32)));
|
||||
/// lookup table for scrambling in TX
|
||||
uint8_t scrambling_lut[65536*16] __attribute__((aligned(32)));
|
||||
|
||||
|
||||
uint8_t max_turbo_iterations=4;
|
||||
#endif /*__PHY_VARS_H__ */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -650,7 +650,7 @@ void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
||||
{
|
||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||
uint8_t SR_payload = 0,pucch_b0b1[4][2]= {{0,0},{0,0},{0,0},{0,0}},harq_ack[4]={0,0,0,0};
|
||||
int32_t metric[4]={0,0,0,0},metric_SR=0,max_metric;
|
||||
int32_t metric[4]={0,0,0,0},metric_SR=0,max_metric=0;
|
||||
const int subframe = proc->subframe_rx;
|
||||
const int frame = proc->frame_rx;
|
||||
int i;
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "SCHED/extern.h"
|
||||
#include "nfapi_interface.h"
|
||||
#include "fapi_l1.h"
|
||||
#include "nfapi_pnf.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -859,8 +859,8 @@ int main(int argc, char **argv)
|
||||
|
||||
printf("PUSCH Beta : ACK %f, RI %f, CQI %f\n",(double)beta_ack[beta_ACK]/8,(double)beta_ri[beta_RI]/8,(double)beta_cqi[beta_CQI]/8);
|
||||
|
||||
UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
|
||||
UE->frame_parms.nb_antennas_rx,
|
||||
UE2eNB = new_channel_desc_scm(1,
|
||||
n_rx,
|
||||
channel_model,
|
||||
N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
|
||||
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
|
||||
@@ -1330,7 +1330,7 @@ int main(int argc, char **argv)
|
||||
printf("SNRmeas %f\n",SNRmeas);
|
||||
|
||||
write_output("rxsig0UL.m","rxs0", &ru->common.rxdata[0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1);
|
||||
// write_output("rxsig1UL.m","rxs1", &ru->common_vars.rxdata[0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1);
|
||||
if (eNB->frame_parms.nb_antennas_rx>1) write_output("rxsig1UL.m","rxs1", &ru->common.rxdata[1][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -77,6 +77,10 @@
|
||||
|
||||
#define MAX_MANAGED_ENB_PER_MOBILE 2
|
||||
|
||||
///NB-IOT
|
||||
#define NB_RB_MAX_NB_IOT (maxDRB_NB_r13 + 3) //MP: NB_IoT --> 2(DRB)+3(SRBs - 2 is not used) = 5
|
||||
|
||||
|
||||
#define DEFAULT_RAB_ID 1
|
||||
|
||||
#define NB_RB_MAX (maxDRB + 3) /* was 11, now 14, maxDRB comes from asn1_constants.h, + 3 because of 3 SRB, one invisible id 0, then id 1 and 2 */
|
||||
|
||||
@@ -54,6 +54,7 @@ MESSAGE_DEF(RRC_STATE_IND, MESSAGE_PRIORITY_MED, RrcStateInd,
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// eNB: ENB_APP -> RRC messages
|
||||
MESSAGE_DEF(RRC_CONFIGURATION_REQ, MESSAGE_PRIORITY_MED, RrcConfigurationReq, rrc_configuration_req)
|
||||
MESSAGE_DEF(NBIOTRRC_CONFIGURATION_REQ, MESSAGE_PRIORITY_MED, NbIoTRrcConfigurationReq, nbiotrrc_configuration_req)
|
||||
|
||||
// UE: NAS -> RRC messages
|
||||
MESSAGE_DEF(NAS_KENB_REFRESH_REQ, MESSAGE_PRIORITY_MED, NasKenbRefreshReq, nas_kenb_refresh_req)
|
||||
|
||||
@@ -62,6 +62,8 @@ typedef UL_DCCH_Message_t RrcUlDcchMessage;
|
||||
|
||||
#define RRC_CONFIGURATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_configuration_req
|
||||
|
||||
#define NBIOTRRC_CONFIGURATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nbiotrrc_configuration_req
|
||||
|
||||
#define NAS_KENB_REFRESH_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_kenb_refresh_req
|
||||
#define NAS_CELL_SELECTION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_cell_selection_req
|
||||
#define NAS_CONN_ESTABLI_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_conn_establi_req
|
||||
@@ -167,6 +169,77 @@ typedef struct RrcConfigurationReq_s {
|
||||
long ue_TimersAndConstants_n311[MAX_NUM_CCs];
|
||||
long ue_TransmissionMode[MAX_NUM_CCs];
|
||||
} RrcConfigurationReq;
|
||||
#define MAX_NUM_NBIOT_CELEVELS 3
|
||||
typedef struct NbIoTRrcConfigurationReq_s {
|
||||
uint32_t cell_identity;
|
||||
|
||||
uint16_t tac;
|
||||
|
||||
uint16_t mcc;
|
||||
uint16_t mnc;
|
||||
uint8_t mnc_digit_length;
|
||||
lte_frame_type_t frame_type;
|
||||
uint8_t tdd_config;
|
||||
uint8_t tdd_config_s;
|
||||
lte_prefix_type_t prefix_type;
|
||||
lte_prefix_type_t prefix_type_UL;
|
||||
int16_t eutra_band;
|
||||
uint32_t downlink_frequency;
|
||||
int32_t uplink_frequency_offset;
|
||||
int16_t Nid_cell;// for testing, change later
|
||||
int16_t N_RB_DL;// for testing, change later
|
||||
//RACH
|
||||
long rach_raResponseWindowSize_NB;
|
||||
long rach_macContentionResolutionTimer_NB;
|
||||
long rach_powerRampingStep_NB;
|
||||
long rach_preambleInitialReceivedTargetPower_NB;
|
||||
long rach_preambleTransMax_CE_NB;
|
||||
//BCCH
|
||||
long bcch_modificationPeriodCoeff_NB;
|
||||
//PCCH
|
||||
long pcch_defaultPagingCycle_NB;
|
||||
long pcch_nB_NB;
|
||||
long pcch_npdcch_NumRepetitionPaging_NB;
|
||||
//NPRACH
|
||||
long nprach_CP_Length;
|
||||
long nprach_rsrp_range;
|
||||
long nprach_Periodicity[MAX_NUM_NBIOT_CELEVELS];
|
||||
long nprach_StartTime[MAX_NUM_NBIOT_CELEVELS];
|
||||
long nprach_SubcarrierOffset[MAX_NUM_NBIOT_CELEVELS];
|
||||
long nprach_NumSubcarriers[MAX_NUM_NBIOT_CELEVELS];
|
||||
long numRepetitionsPerPreambleAttempt_NB[MAX_NUM_NBIOT_CELEVELS];
|
||||
long nprach_SubcarrierMSG3_RangeStart;
|
||||
long maxNumPreambleAttemptCE_NB;
|
||||
long npdcch_NumRepetitions_RA[MAX_NUM_NBIOT_CELEVELS];
|
||||
long npdcch_StartSF_CSS_RA[MAX_NUM_NBIOT_CELEVELS];
|
||||
long npdcch_Offset_RA[MAX_NUM_NBIOT_CELEVELS];
|
||||
//NPDSCH
|
||||
long npdsch_nrs_Power;
|
||||
//NPUSCH
|
||||
long npusch_ack_nack_numRepetitions_NB;
|
||||
long npusch_srs_SubframeConfig_NB;
|
||||
long npusch_threeTone_CyclicShift_r13;
|
||||
long npusch_sixTone_CyclicShift_r13;
|
||||
BOOLEAN_t npusch_groupHoppingEnabled;
|
||||
long npusch_groupAssignmentNPUSCH_r13;
|
||||
|
||||
//DL_GapConfig
|
||||
long dl_GapThreshold_NB;
|
||||
long dl_GapPeriodicity_NB;
|
||||
long dl_GapDurationCoeff_NB;
|
||||
//Uplink power control Common
|
||||
long npusch_p0_NominalNPUSCH;
|
||||
long npusch_alpha;
|
||||
long deltaPreambleMsg3;
|
||||
//UE timers and constants
|
||||
long ue_TimersAndConstants_t300_NB;
|
||||
long ue_TimersAndConstants_t301_NB;
|
||||
long ue_TimersAndConstants_t310_NB;
|
||||
long ue_TimersAndConstants_t311_NB;
|
||||
long ue_TimersAndConstants_n310_NB;
|
||||
long ue_TimersAndConstants_n311_NB;
|
||||
} NbIoTRrcConfigurationReq;
|
||||
|
||||
|
||||
// UE: NAS -> RRC messages
|
||||
typedef kenb_refresh_req_t NasKenbRefreshReq;
|
||||
|
||||
@@ -40,6 +40,10 @@ SUB_TASK_DEF(TASK_L2L1, TASK_PDCP_ENB, 200)
|
||||
|
||||
/// Radio Resource Control task
|
||||
TASK_DEF(TASK_RRC_ENB, TASK_PRIORITY_MED, 200)
|
||||
|
||||
// Define here for now
|
||||
TASK_DEF(TASK_RRC_ENB_NB_IoT, TASK_PRIORITY_MED, 200)
|
||||
|
||||
/// S1ap task
|
||||
/// RAL task for ENB
|
||||
TASK_DEF(TASK_RAL_ENB, TASK_PRIORITY_MED, 200)
|
||||
|
||||
@@ -70,7 +70,8 @@ int flexran_agent_mac_stats_reply(mid_t mod_id,
|
||||
|
||||
for (i = 0; i < report_config->nr_ue; i++) {
|
||||
|
||||
|
||||
ue_report[i]->rnti = report_config->ue_report_type[i].ue_rnti;
|
||||
ue_report[i]->has_rnti = 1;
|
||||
|
||||
/* Check flag for creation of buffer status report */
|
||||
if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_BSR) {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file openair2/ENB_APP/L1_paramdef.f
|
||||
* \brief definition of configuration parameters for all eNodeB modules
|
||||
* \author Francois TABURET
|
||||
* \date 2017
|
||||
* \version 0.1
|
||||
* \company NOKIA BellLabs France
|
||||
* \email: francois.taburet@nokia-bell-labs.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/* L1 configuration parameters names */
|
||||
#define CONFIG_STRING_L1_CC "num_cc"
|
||||
#define CONFIG_STRING_L1_LOCAL_N_IF_NAME "local_n_if_name"
|
||||
#define CONFIG_STRING_L1_LOCAL_N_ADDRESS "local_n_address"
|
||||
#define CONFIG_STRING_L1_REMOTE_N_ADDRESS "remote_n_address"
|
||||
#define CONFIG_STRING_L1_LOCAL_N_PORTC "local_n_portc"
|
||||
#define CONFIG_STRING_L1_REMOTE_N_PORTC "remote_n_portc"
|
||||
#define CONFIG_STRING_L1_LOCAL_N_PORTD "local_n_portd"
|
||||
#define CONFIG_STRING_L1_REMOTE_N_PORTD "remote_n_portd"
|
||||
#define CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE "tr_n_preference"
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* L1 configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define L1PARAMS_DESC { \
|
||||
{CONFIG_STRING_L1_CC, NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_mac", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_L1_LOCAL_N_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_L1_LOCAL_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_L1_REMOTE_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_L1_LOCAL_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \
|
||||
}
|
||||
#define L1_CC_IDX 0
|
||||
#define L1_TRANSPORT_N_PREFERENCE_IDX 1
|
||||
#define L1_LOCAL_N_IF_NAME_IDX 2
|
||||
#define L1_LOCAL_N_ADDRESS_IDX 3
|
||||
#define L1_REMOTE_N_ADDRESS_IDX 4
|
||||
#define L1_LOCAL_N_PORTC_IDX 5
|
||||
#define L1_REMOTE_N_PORTC_IDX 6
|
||||
#define L1_LOCAL_N_PORTD_IDX 7
|
||||
#define L1_REMOTE_N_PORTD_IDX 8
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file openair2/ENB_APP/MACRLC_paramdef.f
|
||||
* \brief definition of configuration parameters for all eNodeB modules
|
||||
* \author Francois TABURET
|
||||
* \date 2017
|
||||
* \version 0.1
|
||||
* \company NOKIA BellLabs France
|
||||
* \email: francois.taburet@nokia-bell-labs.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/* MACRLC configuration parameters names */
|
||||
#define CONFIG_STRING_MACRLC_CC "num_cc"
|
||||
#define CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE "tr_n_preference"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME "local_n_if_name"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS "local_n_address"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS "remote_n_address"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_N_PORTC "local_n_portc"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_N_PORTC "remote_n_portc"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_N_PORTD "local_n_portd"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_N_PORTD "remote_n_portd"
|
||||
#define CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE "tr_s_preference"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME "local_s_if_name"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS "local_s_address"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS "remote_s_address"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_PORTC "local_s_portc"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTC "remote_s_portc"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_PORTD "local_s_portd"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTD "remote_s_portd"
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* MacRLC configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define MACRLCPARAMS_DESC { \
|
||||
{CONFIG_STRING_MACRLC_CC, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_L1", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_N_PORTC, NULL, 0, uptr:NULL, defintval:50010, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50010, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_RRC", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
|
||||
}
|
||||
#define MACRLC_CC_IDX 0
|
||||
#define MACRLC_TRANSPORT_N_PREFERENCE_IDX 1
|
||||
#define MACRLC_LOCAL_N_IF_NAME_IDX 2
|
||||
#define MACRLC_LOCAL_N_ADDRESS_IDX 3
|
||||
#define MACRLC_REMOTE_N_ADDRESS_IDX 4
|
||||
#define MACRLC_LOCAL_N_PORTC_IDX 5
|
||||
#define MACRLC_REMOTE_N_PORTC_IDX 6
|
||||
#define MACRLC_LOCAL_N_PORTD_IDX 7
|
||||
#define MACRLC_REMOTE_N_PORTD_IDX 8
|
||||
#define MACRLC_TRANSPORT_S_PREFERENCE_IDX 9
|
||||
#define MACRLC_LOCAL_S_IF_NAME_IDX 10
|
||||
#define MACRLC_LOCAL_S_ADDRESS_IDX 11
|
||||
#define MACRLC_REMOTE_S_ADDRESS_IDX 12
|
||||
#define MACRLC_LOCAL_S_PORTC_IDX 13
|
||||
#define MACRLC_REMOTE_S_PORTC_IDX 14
|
||||
#define MACRLC_LOCAL_S_PORTD_IDX 15
|
||||
#define MACRLC_REMOTE_S_PORTD_IDX 16
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
@@ -0,0 +1,286 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*
|
||||
nbiot_config.c
|
||||
-------------------
|
||||
AUTHOR : Francois Taburet
|
||||
COMPANY : NOKIA
|
||||
EMAIL : francois.taburet@nokia-bell-labs.com
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "log_extern.h"
|
||||
#include "assertions.h"
|
||||
#if defined(ENABLE_ITTI)
|
||||
# include "intertask_interface.h"
|
||||
# if defined(ENABLE_USE_MME)
|
||||
# include "s1ap_eNB.h"
|
||||
# include "sctp_eNB_task.h"
|
||||
# endif
|
||||
#endif
|
||||
#include "SystemInformationBlockType2.h"
|
||||
|
||||
#include "PHY/extern.h"
|
||||
#include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "RRC_config_tools.h"
|
||||
#include "RRC_paramsvalues.h"
|
||||
#include "NB_IoT_paramdef.h"
|
||||
#include "L1_paramdef.h"
|
||||
#include "MACRLC_paramdef.h"
|
||||
#include "LAYER2/MAC/proto_NB_IoT.h"
|
||||
|
||||
|
||||
void RCconfig_NbIoTL1(void) {
|
||||
paramdef_t NbIoT_L1_Params[] = L1PARAMS_DESC;
|
||||
paramlist_def_t NbIoT_L1_ParamList = {NBIOT_L1LIST_CONFIG_STRING,NULL,0};
|
||||
|
||||
/* No component carrier for NbIoT, ignore number of CC */
|
||||
// NbIoT_L1_Params[L1_CC_IDX ].paramflags = PARAMFLAG_DONOTREAD;
|
||||
|
||||
config_getlist( &NbIoT_L1_ParamList,NbIoT_L1_Params,sizeof(NbIoT_L1_Params)/sizeof(paramdef_t), NULL);
|
||||
if (NbIoT_L1_ParamList.numelt > 0) {
|
||||
if (RC.L1_NB_IoT == NULL) {
|
||||
RC.L1_NB_IoT = (PHY_VARS_eNB_NB_IoT **)malloc(RC.nb_nb_iot_L1_inst*sizeof(PHY_VARS_eNB_NB_IoT *));
|
||||
LOG_I(PHY,"RC.L1_NB_IoT = %p\n",RC.L1_NB_IoT);
|
||||
memset(RC.L1_NB_IoT,0,RC.nb_nb_iot_L1_inst*sizeof(PHY_VARS_eNB_NB_IoT *));
|
||||
}
|
||||
|
||||
|
||||
for(int j = 0; j <NbIoT_L1_ParamList.numelt ; j++) {
|
||||
if (RC.L1_NB_IoT[j] == NULL) {
|
||||
RC.L1_NB_IoT[j] = (PHY_VARS_eNB_NB_IoT *)malloc(sizeof(PHY_VARS_eNB_NB_IoT));
|
||||
LOG_I(PHY,"RC.L1_NB_IoT[%d] = %p\n",j,RC.L1_NB_IoT[j]);
|
||||
memset(RC.L1_NB_IoT[j],0,sizeof(PHY_VARS_eNB_NB_IoT));
|
||||
}
|
||||
if (strcmp(*(NbIoT_L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
|
||||
|
||||
}
|
||||
else if (strcmp(*(NbIoT_L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
|
||||
RC.L1_NB_IoT[j]->eth_params_n.local_if_name = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_IF_NAME_IDX].strptr));
|
||||
RC.L1_NB_IoT[j]->eth_params_n.my_addr = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr));
|
||||
RC.L1_NB_IoT[j]->eth_params_n.remote_addr = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr));
|
||||
RC.L1_NB_IoT[j]->eth_params_n.my_portc = *(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr);
|
||||
RC.L1_NB_IoT[j]->eth_params_n.remote_portc = *(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr);
|
||||
RC.L1_NB_IoT[j]->eth_params_n.my_portd = *(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr);
|
||||
RC.L1_NB_IoT[j]->eth_params_n.remote_portd = *(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
|
||||
RC.L1_NB_IoT[j]->eth_params_n.transp_preference = ETH_UDP_MODE;
|
||||
}
|
||||
|
||||
else { // other midhaul
|
||||
}
|
||||
}// j=0..num_inst
|
||||
printf("Initializing northbound interface for NB-IoT L1\n");
|
||||
l1_north_init_NB_IoT();
|
||||
} else {
|
||||
LOG_I(PHY,"No " NBIOT_L1LIST_CONFIG_STRING " configuration found");
|
||||
}
|
||||
}
|
||||
|
||||
void RCconfig_NbIoTmacrlc(void) {
|
||||
|
||||
|
||||
|
||||
paramdef_t NbIoT_MacRLC_Params[] = MACRLCPARAMS_DESC;
|
||||
paramlist_def_t NbIoT_MacRLC_ParamList = {NBIOT_MACRLCLIST_CONFIG_STRING,NULL,0};
|
||||
|
||||
|
||||
/* No component carrier for NbIoT, ignore number of CC */
|
||||
// NbIoT_MacRLC_Params[MACRLC_CC_IDX ].paramflags = PARAMFLAG_DONOTREAD;
|
||||
|
||||
config_getlist( &NbIoT_MacRLC_ParamList,NbIoT_MacRLC_Params,sizeof(NbIoT_MacRLC_Params)/sizeof(paramdef_t), NULL);
|
||||
|
||||
|
||||
if ( NbIoT_MacRLC_ParamList.numelt > 0) {
|
||||
mac_top_init_eNB_NB_IoT();
|
||||
for (int j=0;j<RC.nb_nb_iot_macrlc_inst;j++) {
|
||||
|
||||
if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) {
|
||||
// check number of instances is same as RRC/PDCP
|
||||
|
||||
} else if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "cudu") == 0) {
|
||||
RC.nb_iot_mac[j]->eth_params_n.local_if_name = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr));
|
||||
RC.nb_iot_mac[j]->eth_params_n.my_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr));
|
||||
RC.nb_iot_mac[j]->eth_params_n.remote_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr));
|
||||
RC.nb_iot_mac[j]->eth_params_n.my_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr);
|
||||
RC.nb_iot_mac[j]->eth_params_n.remote_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr);
|
||||
RC.nb_iot_mac[j]->eth_params_n.my_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr);
|
||||
RC.nb_iot_mac[j]->eth_params_n.remote_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);;
|
||||
RC.nb_iot_mac[j]->eth_params_n.transp_preference = ETH_UDP_MODE;
|
||||
} else { // other midhaul
|
||||
AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr));
|
||||
}
|
||||
|
||||
if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_L1") == 0) {
|
||||
|
||||
|
||||
} else if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "nfapi") == 0) {
|
||||
RC.nb_iot_mac[j]->eth_params_s.local_if_name = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr));
|
||||
RC.nb_iot_mac[j]->eth_params_s.my_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr));
|
||||
RC.nb_iot_mac[j]->eth_params_s.remote_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr));
|
||||
RC.nb_iot_mac[j]->eth_params_s.my_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr);
|
||||
RC.nb_iot_mac[j]->eth_params_s.remote_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr);
|
||||
RC.nb_iot_mac[j]->eth_params_s.my_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr);
|
||||
RC.nb_iot_mac[j]->eth_params_s.remote_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr);
|
||||
RC.nb_iot_mac[j]->eth_params_s.transp_preference = ETH_UDP_MODE;
|
||||
} else { // other midhaul
|
||||
AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
|
||||
}
|
||||
}// j=0..num_inst */
|
||||
} else {// MacRLC_ParamList.numelt > 0
|
||||
AssertFatal (0,
|
||||
"No " NBIOT_MACRLCLIST_CONFIG_STRING " configuration found");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int RCconfig_NbIoTRRC(MessageDef *msg_p, int nbiotrrc_id,eNB_RRC_INST_NB_IoT *nbiotrrc) {
|
||||
|
||||
|
||||
char instprefix[MAX_OPTNAME_SIZE*3 + 32];
|
||||
|
||||
|
||||
checkedparam_t NBIoTCheckParams[] = NBIOT_RRCPARAMS_CHECK_DESC;
|
||||
paramdef_t NBIoTParams[] = NBIOTRRCPARAMS_DESC;
|
||||
|
||||
paramdef_t NBIoTPrachParams[] = NBIOTRRC_NPRACH_PARAMS_DESC;
|
||||
checkedparam_t NBIoTPrachCheckParams[] = NBIOT_RRCLIST_NPRACHPARAMSCHECK_DESC;
|
||||
|
||||
paramdef_t NBIoTRRCRefParams[] = NBIOTRRCPARAMS_RRCREF_DESC;
|
||||
|
||||
paramdef_t NBIoTLteCCParams[] = NBIOT_LTECCPARAMS_DESC;
|
||||
checkedparam_t NBIoTLteCCCheckParams[] = NBIOT_LTECCPARAMS_CHECK_DESC;
|
||||
/* map parameter checking array instances to parameter definition array instances */
|
||||
for (int i=0; (i<sizeof(NBIoTParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTCheckParams)/sizeof(checkedparam_t)); i++ ) {
|
||||
NBIoTParams[i].chkPptr = &(NBIoTCheckParams[i]);
|
||||
}
|
||||
for (int i=0; (i<sizeof(NBIoTPrachParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTPrachCheckParams)/sizeof(checkedparam_t)); i++ ) {
|
||||
NBIoTPrachParams[i].chkPptr = &(NBIoTPrachCheckParams[i]);
|
||||
}
|
||||
|
||||
/* brut force itti message fields assignment, to be redesigned with itti replacement */
|
||||
NBIoTParams[NBIOT_RACH_RARESPONSEWINDOWSIZE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize_NB);
|
||||
NBIoTParams[NBIOT_RACH_MACCONTENTIONRESOLUTIONTIMER_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer_NB);
|
||||
NBIoTParams[NBIOT_RACH_POWERRAMPINGSTEP_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep_NB);
|
||||
NBIoTParams[NBIOT_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower_NB);
|
||||
NBIoTParams[NBIOT_RACH_PREAMBLETRANSMAX_CE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax_CE_NB);
|
||||
NBIoTParams[NBIOT_BCCH_MODIFICATIONPERIODCOEFF_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff_NB);
|
||||
NBIoTParams[NBIOT_PCCH_DEFAULTPAGINGCYCLE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle_NB);
|
||||
NBIoTParams[NBIOT_NPRACH_CP_LENGTH_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_CP_Length);
|
||||
NBIoTParams[NBIOT_NPRACH_RSRP_RANGE_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_rsrp_range);
|
||||
|
||||
|
||||
|
||||
NBIoTParams[NBIOT_MAXNUMPREAMBLEATTEMPTCE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).maxNumPreambleAttemptCE_NB);
|
||||
|
||||
NBIoTParams[NBIOT_NPDSCH_NRS_POWER_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdsch_nrs_Power);
|
||||
NBIoTParams[NBIOT_NPUSCH_ACK_NACK_NUMREPETITIONS_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p). npusch_ack_nack_numRepetitions_NB);
|
||||
NBIoTParams[NBIOT_NPUSCH_SRS_SUBFRAMECONFIG_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p). npusch_srs_SubframeConfig_NB);
|
||||
NBIoTParams[NBIOT_NPUSCH_THREETONE_CYCLICSHIFT_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_threeTone_CyclicShift_r13);
|
||||
NBIoTParams[NBIOT_NPUSCH_SIXTONE_CYCLICSHIFT_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_sixTone_CyclicShift_r13);
|
||||
|
||||
NBIoTParams[NBIOT_NPUSCH_GROUPASSIGNMENTNPUSCH_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_groupAssignmentNPUSCH_r13);
|
||||
NBIoTParams[NBIOT_DL_GAPTHRESHOLD_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapThreshold_NB);
|
||||
NBIoTParams[NBIOT_DL_GAPPERIODICITY_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapPeriodicity_NB);
|
||||
|
||||
NBIoTParams[NBIOT_NPUSCH_P0_NOMINALNPUSCH_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_p0_NominalNPUSCH);
|
||||
|
||||
NBIoTParams[NBIOT_DELTAPREAMBLEMSG3_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).deltaPreambleMsg3);
|
||||
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T300_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300_NB);
|
||||
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T301_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301_NB);
|
||||
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T310_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310_NB);
|
||||
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T311_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311_NB);
|
||||
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_N310_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310_NB);
|
||||
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_N311_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311_NB);
|
||||
|
||||
sprintf(instprefix, NBIOT_RRCLIST_CONFIG_STRING ".[%i]",nbiotrrc_id);
|
||||
config_get( NBIoTParams,sizeof(NBIoTParams)/sizeof(paramdef_t),instprefix);
|
||||
|
||||
NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_SubcarrierMSG3_RangeStart = config_get_processedint( &(NBIoTParams[NBIOT_NPRACH_SUBCARRIERMSG3_RANGESTART_IDX]) );
|
||||
NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_groupHoppingEnabled = config_get_processedint( &(NBIoTParams[NBIOT_NPUSCH_GROUPHOPPINGENABLED_IDX] ) );
|
||||
NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapDurationCoeff_NB = config_get_processedint( &(NBIoTParams[NBIOT_DL_GAPDURATIONCOEFF_NB_IDX] ) );
|
||||
NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_alpha = config_get_processedint( &(NBIoTParams[NBIOT_NPUSCH_ALPHA_IDX] ) );
|
||||
for (int i=0; i<MAX_NUM_NBIOT_CELEVELS; i++) {
|
||||
char *tmpptr=NULL;
|
||||
NBIoTPrachParams[NBIOT_NPRACH_PERIODICITY_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_Periodicity[i]);
|
||||
NBIoTPrachParams[NBIOT_NPRACH_STARTTIME_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_StartTime[i]);
|
||||
NBIoTPrachParams[NBIOT_NPRACH_SUBCARRIEROFFSET_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_SubcarrierOffset[i]);
|
||||
NBIoTPrachParams[NBIOT_NPRACH_NUMSUBCARRIERS_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_NumSubcarriers[i]);
|
||||
NBIoTPrachParams[NBIOT_NUMREPETITIONSPERPREAMBLEATTEMPT_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).numRepetitionsPerPreambleAttempt_NB[i]);
|
||||
NBIoTParams[NBIOT_NPDCCH_NUMREPETITIONS_RA_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_NumRepetitions_RA[i]);
|
||||
NBIoTParams[NBIOT_NPDCCH_STARTSF_CSS_RA_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_StartSF_CSS_RA[i]);
|
||||
NBIoTParams[NBIOT_NPDCCH_OFFSET_RA_IDX].strptr = &tmpptr;
|
||||
sprintf(instprefix, "%s.[%i].%s.[%i]",NBIOT_RRCLIST_CONFIG_STRING, nbiotrrc_id,NBIOT_RRCLIST_NPRACHPARAMS_CONFIG_STRING,i);
|
||||
config_get( NBIoTPrachParams,sizeof(NBIoTPrachParams)/sizeof(paramdef_t),instprefix);
|
||||
NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_Offset_RA[i] = config_get_processedint( &(NBIoTPrachParams[NBIOT_NPDCCH_OFFSET_RA_IDX]) );
|
||||
}
|
||||
/* get the LTE RRC and CC this NB-IoT RRC instance is attached to */
|
||||
sprintf(instprefix, NBIOT_RRCLIST_CONFIG_STRING ".[%i]." NBIOT_LTERRCREF_CONFIG_STRING, nbiotrrc_id );
|
||||
config_get( NBIoTRRCRefParams,sizeof(NBIoTRRCRefParams)/sizeof(paramdef_t),instprefix);
|
||||
|
||||
/* read SIB1 parameters in the LTE RRC and CC sections */
|
||||
sprintf(instprefix, ENB_CONFIG_STRING_ENB_LIST ".[%i]." ENB_CONFIG_STRING_COMPONENT_CARRIERS ".[%i]",
|
||||
*(NBIoTRRCRefParams[NBIOT_RRCINST_IDX].uptr), *(NBIoTRRCRefParams[NBIOT_CCINST_IDX].uptr));
|
||||
|
||||
NBIoTLteCCParams[LTECCPARAMS_TDD_CONFIG_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).tdd_config);
|
||||
NBIoTLteCCParams[LTECCPARAMS_TDD_CONFIG_S_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).tdd_config_s);
|
||||
NBIoTLteCCParams[LTECCPARAMS_EUTRA_BAND_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).eutra_band);
|
||||
NBIoTLteCCParams[LTECCPARAMS_DOWNLINK_FREQUENCY_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).downlink_frequency);
|
||||
NBIoTLteCCParams[LTECCPARAMS_UPLINK_FREQUENCY_OFFSET_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset);
|
||||
NBIoTLteCCParams[LTECCPARAMS_NID_CELL_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).Nid_cell);
|
||||
NBIoTLteCCParams[LTECCPARAMS_N_RB_DL_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).N_RB_DL);
|
||||
|
||||
for (int i=0; (i<sizeof(NBIoTLteCCParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTLteCCCheckParams)/sizeof(checkedparam_t)); i++ ) {
|
||||
NBIoTLteCCParams[i].chkPptr = &(NBIoTLteCCCheckParams[i]);
|
||||
}
|
||||
config_get( NBIoTLteCCParams,sizeof(NBIoTLteCCParams)/sizeof(paramdef_t),instprefix);
|
||||
NBIOTRRC_CONFIGURATION_REQ (msg_p).frame_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_FRAME_TYPE_IDX]) );
|
||||
NBIOTRRC_CONFIGURATION_REQ (msg_p).prefix_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_PREFIX_TYPE_IDX]) );
|
||||
NBIOTRRC_CONFIGURATION_REQ (msg_p).prefix_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_PREFIX_TYPE_UL_IDX]) );
|
||||
return 0;
|
||||
}
|
||||
|
||||
void RCConfig_NbIoT(RAN_CONTEXT_t *RC) {
|
||||
|
||||
paramlist_def_t NbIoT_MACRLCParamList = {NBIOT_MACRLCLIST_CONFIG_STRING,NULL,0};
|
||||
paramlist_def_t NbIoT_L1ParamList = {NBIOT_L1LIST_CONFIG_STRING,NULL,0};
|
||||
paramlist_def_t NbIoT_ParamList = {NBIOT_RRCLIST_CONFIG_STRING,NULL,0};
|
||||
|
||||
|
||||
config_getlist( &NbIoT_ParamList,NULL,0,NULL);
|
||||
RC->nb_nb_iot_rrc_inst = NbIoT_ParamList.numelt;
|
||||
|
||||
|
||||
|
||||
|
||||
config_getlist( &NbIoT_MACRLCParamList,NULL,0, NULL);
|
||||
RC->nb_nb_iot_macrlc_inst = NbIoT_MACRLCParamList.numelt;
|
||||
// Get num L1 instances
|
||||
config_getlist( &NbIoT_L1ParamList,NULL,0, NULL);
|
||||
RC->nb_nb_iot_L1_inst = NbIoT_L1ParamList.numelt;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*
|
||||
nbiot_config.h
|
||||
-------------------
|
||||
AUTHOR : Francois Taburet
|
||||
COMPANY : NOKIA
|
||||
EMAIL : francois.taburet@nokia-bell-labs.com
|
||||
*/
|
||||
#ifndef INCLUDE_NBIOT_CONFIG_H
|
||||
#define INCLUDE_NBIOT_CONFIG_H
|
||||
|
||||
|
||||
extern void RCconfig_NbIoTL1(void) ;
|
||||
extern void RCconfig_NbIoTmacrlc(void);
|
||||
extern int RCconfig_NbIoTRRC(MessageDef *msg_p, int nbiotrrc_id,eNB_RRC_INST_NB_IoT *nbiotrrc);
|
||||
extern void RCConfig_NbIoT(RAN_CONTEXT_t *RC);
|
||||
#endif
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file openair2/ENB_APP/NB_IoT_interface.c
|
||||
* \brief: load library implementing coding/decoding algorithms
|
||||
* \date 2018
|
||||
* \version 0.1
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#include <sys/types.h>
|
||||
|
||||
|
||||
#include "openair1/PHY/extern.h"
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
#define NBIOT_INTERFACE_SOURCE
|
||||
#include "NB_IoT_interface.h"
|
||||
|
||||
|
||||
|
||||
|
||||
int load_NB_IoT(void) {
|
||||
int ret;
|
||||
RCConfig_NbIoT_f_t RCConfig;
|
||||
loader_shlibfunc_t shlib_fdesc[]=NBIOT_INTERFACE_FLIST;
|
||||
|
||||
ret=load_module_shlib(NBIOT_MODULENAME,shlib_fdesc,sizeof(shlib_fdesc)/sizeof(loader_shlibfunc_t));
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
RCConfig = get_shlibmodule_fptr(NBIOT_MODULENAME,NBIOT_RCCONFIG_FNAME );
|
||||
if (RCConfig == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
RCConfig(&RC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
*Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file openair2/ENB_APP/NB_IoT_interface.h
|
||||
* \brief: api interface for nb-iot application
|
||||
* \date 2018
|
||||
* \version 0.1
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#ifndef NBIOT_INTERFACE_H
|
||||
#define NBIOT_INTERFACE_H
|
||||
|
||||
|
||||
#define NBIOT_MODULENAME "NB_IoT"
|
||||
|
||||
typedef void(*RCConfig_NbIoT_f_t)(RAN_CONTEXT_t *RC);
|
||||
#define NBIOT_RCCONFIG_FNAME "RCConfig_NbIoT"
|
||||
|
||||
#ifdef NBIOT_INTERFACE_SOURCE
|
||||
|
||||
#define NBIOT_INTERFACE_FLIST {\
|
||||
{NBIOT_RCCONFIG_FNAME,NULL},\
|
||||
}
|
||||
|
||||
#else /* NBIOT_INTERFACE_SOURCE */
|
||||
|
||||
extern int load_NB_IoT(void);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,400 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file openair2/ENB_APP/enb_paramdef.f
|
||||
* \brief definition of configuration parameters for all eNodeB modules
|
||||
* \author Francois TABURET
|
||||
* \date 2017
|
||||
* \version 0.1
|
||||
* \company NOKIA BellLabs France
|
||||
* \email: francois.taburet@nokia-bell-labs.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include "common/config/config_paramdesc.h"
|
||||
#include "SystemInformationBlockType2.h"
|
||||
#include "DL-GapConfig-NB-r13.h"
|
||||
#include "NPRACH-Parameters-NB-r13.h"
|
||||
#include "PowerRampingParameters.h"
|
||||
#include "BCCH-Config-NB-r13.h"
|
||||
#include "PCCH-Config-NB-r13.h"
|
||||
#include "ACK-NACK-NumRepetitions-NB-r13.h"
|
||||
#include "TDD-Config.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
int16_t eutra_band;
|
||||
uint32_t downlink_frequency;
|
||||
int32_t uplink_frequency_offset;
|
||||
int16_t Nid_cell;// for testing, change later
|
||||
int16_t N_RB_DL;// for testing, change later
|
||||
*/
|
||||
/*-------------------------------------------------------------------------------------------------------------------*/
|
||||
/* SIB1 parameters possibly coming from LTE RRC (in band deployment) */
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* component carriers configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt checked_param */
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define NBIOT_LTECCPARAMS_CHECK_DESC { \
|
||||
{ .s3a= { config_checkstr_assign_integer, FRAMETYPE_OKVALUES, FRAMETYPE_MODVALUES,2}} , \
|
||||
{ .s2= { config_check_intrange, TDDCONFIG_OKRANGE}}, \
|
||||
{ .s2= { config_check_intrange, TDDCONFIGS_OKRANGE}}, \
|
||||
{ .s3a= { config_checkstr_assign_integer, PREFIX_OKVALUES, PREFIX_MODVALUES,2}} , \
|
||||
{ .s3a= { config_checkstr_assign_integer, PREFIXUL_OKVALUES, PREFIXUL_MODVALUES,2}} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s1= { config_check_intval, NRBDL_OKVALUES,6}} , \
|
||||
}
|
||||
|
||||
|
||||
#define NBIOT_LTECCPARAMS_DESC { \
|
||||
{ENB_CONFIG_STRING_FRAME_TYPE, NULL, 0, strptr:NULL, defstrval:"FDD", TYPE_STRING, 0}, \
|
||||
{ENB_CONFIG_STRING_TDD_CONFIG, NULL, 0, iptr:NULL, defintval:3, TYPE_UINT, 0}, \
|
||||
{ENB_CONFIG_STRING_TDD_CONFIG_S, NULL, 0, iptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{ENB_CONFIG_STRING_PREFIX_TYPE, NULL, 0, strptr:NULL, defstrval:"NORMAL", TYPE_STRING, 0}, \
|
||||
{ENB_CONFIG_STRING_PREFIX_TYPE_UL, NULL, 0, strptr:NULL, defstrval:"NORMAL", TYPE_STRING, 0}, \
|
||||
{ENB_CONFIG_STRING_EUTRA_BAND, NULL, 0, iptr:NULL, defintval:7, TYPE_UINT, 0}, \
|
||||
{ENB_CONFIG_STRING_DOWNLINK_FREQUENCY, NULL, 0, i64ptr:NULL, defint64val:2680000000, TYPE_UINT64, 0}, \
|
||||
{ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET, NULL, 0, iptr:NULL, defintval:-120000000, TYPE_INT, 0}, \
|
||||
{ENB_CONFIG_STRING_NID_CELL, NULL, 0, iptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{ENB_CONFIG_STRING_N_RB_DL, NULL, 0, iptr:NULL, defintval:25, TYPE_UINT, 0}, \
|
||||
}
|
||||
#define LTECCPARAMS_FRAME_TYPE_IDX 0
|
||||
#define LTECCPARAMS_TDD_CONFIG_IDX 1
|
||||
#define LTECCPARAMS_TDD_CONFIG_S_IDX 2
|
||||
#define LTECCPARAMS_PREFIX_TYPE_IDX 3
|
||||
#define LTECCPARAMS_PREFIX_TYPE_UL_IDX 4
|
||||
#define LTECCPARAMS_EUTRA_BAND_IDX 5
|
||||
#define LTECCPARAMS_DOWNLINK_FREQUENCY_IDX 6
|
||||
#define LTECCPARAMS_UPLINK_FREQUENCY_OFFSET_IDX 7
|
||||
#define LTECCPARAMS_NID_CELL_IDX 8
|
||||
#define LTECCPARAMS_N_RB_DL_IDX 9
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* NB-Iot RRC list section name */
|
||||
#define NBIOT_RRCLIST_CONFIG_STRING "NB-IoT_RRCs"
|
||||
|
||||
|
||||
#define RACH_RARESPONSEWINDOWSIZE_NB_OKVALUES {20,50,80,120,180,240,320,400}
|
||||
#define PREF1(A) RACH_CE_LevelInfo_r13__ra_ResponseWindowSize_r13_ ## A
|
||||
#define RACH_RARESPONSEWINDOWSIZE_NB_MODVALUES { PREF1(sf20),PREF1(sf50),PREF1(sf80),PREF1(sf120), \
|
||||
PREF1(sf180),PREF1(sf240),PREF1(sf320),PREF1(sf400) }
|
||||
|
||||
|
||||
#define RACH_MACCONTENTIONRESOLUTIONTIMER_NB_OKVALUES {80,100,120,160,200,240,480,960}
|
||||
#define PREF2(A) RACH_CE_LevelInfo_r13__mac_ContentionResolutionTimer_r13_ ## A
|
||||
#define RACH_MACCONTENTIONRESOLUTIONTIMER_NB_MODVALUES { PREF2(sf80),PREF2(sf100),PREF2(sf120),PREF2(sf160), \
|
||||
PREF2(sf200),PREF2(sf240),PREF2(sf480),PREF2(sf960) }
|
||||
|
||||
|
||||
#define RACH_POWERRAMPINGSTEP_NB_OKVALUES {0,2,4,6}
|
||||
#define PREF3(A) PowerRampingParameters__powerRampingStep_ ## A
|
||||
#define RACH_POWERRAMPINGSTEP_NB_MODVALUES { PREF3(dB0),PREF3(dB2),PREF3(dB4),PREF3(dB6) }
|
||||
|
||||
|
||||
#define RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_OKRANGE {-120, -90}
|
||||
|
||||
#define RACH_PREAMBLETRANSMAX_CE_NB_OKVALUES {3,4,5,6,7,8,10,20,50,100,200}
|
||||
#define PREF4(A) PreambleTransMax_ ## A
|
||||
#define RACH_PREAMBLETRANSMAX_CE_NB_MODVALUES { PREF4(n3), PREF4(n4), PREF4(n5), PREF4(n6), PREF4(n7), PREF4(n8), \
|
||||
PREF4(n10),PREF4(n20),PREF4(n50),PREF4(n100),PREF4(n200) }
|
||||
|
||||
#define BCCH_MODIFICATIONPERIODCOEFF_NB_OKVALUES {16,32,64,128}
|
||||
#define PREF5(A) BCCH_Config_NB_r13__modificationPeriodCoeff_r13_ ## A
|
||||
#define BCCH_MODIFICATIONPERIODCOEFF_NB_MODVALUES { PREF5(n16), PREF5(n32), PREF5(n64),PREF5(n128) }
|
||||
|
||||
#define PCCH_DEFAULTPAGINGCYCLE_NB_OKVALUES {128,256,512,1024}
|
||||
#define PREF6(A) PCCH_Config_NB_r13__defaultPagingCycle_r13_ ## A
|
||||
#define PCCH_DEFAULTPAGINGCYCLE_NB_MODVALUES { PREF6(rf128), PREF6(rf256), PREF6(rf512), PREF6(rf1024) }
|
||||
|
||||
#define NPRACH_CP_LENGTH_OKVALUES {0,1}
|
||||
#define NPRACH_RSRP_RANGE_OKVALUES {0,96}
|
||||
|
||||
#define MSG3RANGESTART_OKVALUES {"zero","oneThird","twoThird","one"}
|
||||
#define MSG3RANGESTART_MODVALUES {NPRACH_Parameters_NB_r13__nprach_SubcarrierMSG3_RangeStart_r13_zero, NPRACH_Parameters_NB_r13__nprach_SubcarrierMSG3_RangeStart_r13_oneThird, \
|
||||
NPRACH_Parameters_NB_r13__nprach_SubcarrierMSG3_RangeStart_r13_twoThird, NPRACH_Parameters_NB_r13__nprach_SubcarrierMSG3_RangeStart_r13_one}
|
||||
|
||||
|
||||
#define MAXNUMPREAMBLEATTEMPTCE_OKVALUES {3,4,5,6,7,8,10}
|
||||
#define MAXNUMPREAMBLEATTEMPTCE_MODVALUES { NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n3, NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n4, \
|
||||
NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n5, NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n6, \
|
||||
NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n7, NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n8, \
|
||||
NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n10 }
|
||||
|
||||
#define NPDSCH_NRS_POWER_OKRANGE {-60,50}
|
||||
|
||||
#define NPUSCH_ACK_NACK_NUMREPETITIONS_NB_OKVALUES {1,2,4,8,16,32,64,128}
|
||||
#define PREF9(A) ACK_NACK_NumRepetitions_NB_r13_ ## A
|
||||
#define NPUSCH_ACK_NACK_NUMREPETITIONS_NB_MODVALUES { PREF9(r1), PREF9(r2), PREF9(r4), PREF9(r8), \
|
||||
PREF9(r16), PREF9(r32), PREF9(r64), PREF9(r128) }
|
||||
|
||||
#define NPUSCH_SRS_SUBFRAMECONFIG_NB_OKRANGE {0,15}
|
||||
#define NPUSCH_THREETONE_CYCLICSHIFT_R13_OKRANGE {0,2}
|
||||
#define NPUSCH_SIXTONE_CYCLICSHIFT_R13_OKRANGE {0,3}
|
||||
|
||||
#define NPUSCH_GROUPHOPPINGENABLED_OKVALUES {"enable","disable"}
|
||||
#define NPUSCH_GROUPHOPPINGENABLED_MODVALUES {1,0}
|
||||
|
||||
#define NPUSCH_GROUPASSIGNMENTNPUSCH_R13_OKRANGE {0,29}
|
||||
|
||||
#define DLGAPTHRESHOLD_OKVALUES {32,64,128,256}
|
||||
#define DLGAPTHRESHOLD_MODVALUES { DL_GapConfig_NB_r13__dl_GapThreshold_r13_n32, DL_GapConfig_NB_r13__dl_GapThreshold_r13_n64, \
|
||||
DL_GapConfig_NB_r13__dl_GapThreshold_r13_n128, DL_GapConfig_NB_r13__dl_GapThreshold_r13_n256} \
|
||||
|
||||
#define DLGAPPERIODICITY_OKVALUES {64,128,256,512}
|
||||
#define DLGAPPERIODICITY_MODVALUES { DL_GapConfig_NB_r13__dl_GapPeriodicity_r13_sf64, DL_GapConfig_NB_r13__dl_GapPeriodicity_r13_sf128, \
|
||||
DL_GapConfig_NB_r13__dl_GapPeriodicity_r13_sf256,DL_GapConfig_NB_r13__dl_GapPeriodicity_r13_sf512}
|
||||
|
||||
#define DLGAPDURATION_OKVALUES {"oneEighth","oneFourth","threeEighth","oneHalf"}
|
||||
#define DLGAPDURATION_MODVALUES {DL_GapConfig_NB_r13__dl_GapDurationCoeff_r13_oneEighth, DL_GapConfig_NB_r13__dl_GapDurationCoeff_r13_oneFourth, \
|
||||
DL_GapConfig_NB_r13__dl_GapDurationCoeff_r13_threeEighth, DL_GapConfig_NB_r13__dl_GapDurationCoeff_r13_oneHalf}
|
||||
|
||||
#define NPUSCH_P0_NOMINALNPUSCH_OKRANGE {-126,24}
|
||||
|
||||
#define NPUSCH_ALPHA_OKVALUES {"AL0","AL04","AL05","AL06","AL07","AL08","AL09","AL1"}
|
||||
#define NPUSCH_ALPHA_MODVALUES { Alpha_r12_al0, Alpha_r12_al04, Alpha_r12_al05, Alpha_r12_al06, \
|
||||
Alpha_r12_al07, Alpha_r12_al08, Alpha_r12_al09, Alpha_r12_al1}
|
||||
|
||||
#define DELTAPREAMBLEMSG3_OKRANGE {-1,6}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define NBIOT_RRCPARAMS_CHECK_DESC { \
|
||||
{ .s1a= { config_check_modify_integer, RACH_RARESPONSEWINDOWSIZE_NB_OKVALUES, RACH_RARESPONSEWINDOWSIZE_NB_MODVALUES, 8}}, \
|
||||
{ .s1a= { config_check_modify_integer, RACH_MACCONTENTIONRESOLUTIONTIMER_NB_OKVALUES, RACH_MACCONTENTIONRESOLUTIONTIMER_NB_MODVALUES, 8}}, \
|
||||
{ .s1a= { config_check_modify_integer, RACH_POWERRAMPINGSTEP_NB_OKVALUES, RACH_POWERRAMPINGSTEP_NB_MODVALUES, 4}} , \
|
||||
{ .s2= { config_check_intrange, RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_OKRANGE}}, \
|
||||
{ .s1a= { config_check_modify_integer, RACH_PREAMBLETRANSMAX_CE_NB_OKVALUES, RACH_PREAMBLETRANSMAX_CE_NB_MODVALUES, 11}} , \
|
||||
{ .s1a= { config_check_modify_integer, BCCH_MODIFICATIONPERIODCOEFF_NB_OKVALUES, BCCH_MODIFICATIONPERIODCOEFF_NB_MODVALUES, 4}} , \
|
||||
{ .s1a= { config_check_modify_integer, PCCH_DEFAULTPAGINGCYCLE_NB_OKVALUES, PCCH_DEFAULTPAGINGCYCLE_NB_MODVALUES, 4}} , \
|
||||
{ .s1= { NULL, NPRACH_CP_LENGTH_OKVALUES ,4}} , \
|
||||
{ .s2= { config_check_intrange, NPRACH_RSRP_RANGE_OKVALUES}} , \
|
||||
{ .s3a= { config_checkstr_assign_integer, MSG3RANGESTART_OKVALUES, MSG3RANGESTART_MODVALUES, 4}} , \
|
||||
{ .s1a= { config_check_modify_integer, MAXNUMPREAMBLEATTEMPTCE_OKVALUES, MAXNUMPREAMBLEATTEMPTCE_MODVALUES, 7}} , \
|
||||
{ .s1= { config_check_intval, NPDSCH_NRS_POWER_OKRANGE,4}} , \
|
||||
{ .s1a= { config_check_modify_integer, NPUSCH_ACK_NACK_NUMREPETITIONS_NB_OKVALUES, NPUSCH_ACK_NACK_NUMREPETITIONS_NB_MODVALUES, 8}} , \
|
||||
{ .s2= { config_check_intrange, NPUSCH_SRS_SUBFRAMECONFIG_NB_OKRANGE}} , \
|
||||
{ .s2= { config_check_intrange, NPUSCH_THREETONE_CYCLICSHIFT_R13_OKRANGE}} , \
|
||||
{ .s2= { config_check_intrange, NPUSCH_SIXTONE_CYCLICSHIFT_R13_OKRANGE}} , \
|
||||
{ .s3a= { config_checkstr_assign_integer, NPUSCH_GROUPHOPPINGENABLED_OKVALUES, NPUSCH_GROUPHOPPINGENABLED_MODVALUES, 2}} , \
|
||||
{ .s2= { config_check_intrange, NPUSCH_GROUPASSIGNMENTNPUSCH_R13_OKRANGE}} , \
|
||||
{ .s1a= { config_check_modify_integer, DLGAPTHRESHOLD_OKVALUES, DLGAPTHRESHOLD_MODVALUES, 4}} , \
|
||||
{ .s1a= { config_check_modify_integer, DLGAPPERIODICITY_OKVALUES, DLGAPPERIODICITY_MODVALUES, 4}} , \
|
||||
{ .s3a= { config_checkstr_assign_integer, DLGAPDURATION_OKVALUES, DLGAPDURATION_MODVALUES , 4}} , \
|
||||
{ .s2= { config_check_intrange, NPUSCH_P0_NOMINALNPUSCH_OKRANGE}} , \
|
||||
{ .s3a= { config_checkstr_assign_integer, NPUSCH_ALPHA_OKVALUES, NPUSCH_ALPHA_MODVALUES, 8}} , \
|
||||
{ .s2= { config_check_intrange, DELTAPREAMBLEMSG3_OKRANGE}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_T300_OKVALUES, UETIMER_T300_MODVALUES,8}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_T301_OKVALUES, UETIMER_T301_MODVALUES,8}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_T310_OKVALUES, UETIMER_T310_MODVALUES,7}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_T311_OKVALUES, UETIMER_T311_MODVALUES,7}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_N310_OKVALUES, UETIMER_N310_MODVALUES,8}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_N311_OKVALUES, UETIMER_N311_MODVALUES,8}} , \
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* NB-IoT RRC configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*-----------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define NBIOTRRCPARAMS_DESC { \
|
||||
{"rach_raResponseWindowSize_NB", NULL, 0, uptr:NULL, defintval:20, TYPE_UINT, 0}, \
|
||||
{"rach_macContentionResolutionTimer_NB", NULL, 0, uptr:NULL, defintval:80, TYPE_UINT, 0}, \
|
||||
{"rach_powerRampingStep_NB", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"rach_preambleInitialReceivedTargetPower_NB", NULL, 0, iptr:NULL, defintval:-112, TYPE_INT32, 0}, \
|
||||
{"rach_preambleTransMax_CE_NB", NULL, 0, uptr:NULL, defintval:3, TYPE_UINT, 0}, \
|
||||
{"bcch_modificationPeriodCoeff_NB", NULL, 0, uptr:NULL, defintval:16, TYPE_UINT, 0}, \
|
||||
{"pcch_defaultPagingCycle_NB", NULL, 0, uptr:NULL, defintval:256, TYPE_UINT, 0}, \
|
||||
{"nprach_CP_Length", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"nprach_rsrp_range", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"nprach_SubcarrierMSG3_RangeStart", NULL, 0, strptr:NULL, defstrval:"one", TYPE_STRING, 0}, \
|
||||
{"maxNumPreambleAttemptCE_NB", NULL, 0, uptr:NULL, defintval:10, TYPE_UINT, 0}, \
|
||||
{"npdsch_nrs_Power", NULL, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
|
||||
{"npusch_ack_nack_numRepetitions_NB", NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \
|
||||
{"npusch_srs_SubframeConfig_NB", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"npusch_threeTone_CyclicShift_r13", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"npusch_sixTone_CyclicShift_r13", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"npusch_groupHoppingEnabled", NULL, 0, strptr:NULL, defstrval:"disable", TYPE_STRING, 0}, \
|
||||
{"npusch_groupAssignmentNPUSCH_r13", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"dl_GapThreshold_NB", NULL, 0, uptr:NULL, defintval:32, TYPE_UINT, 0}, \
|
||||
{"dl_GapPeriodicity_NB", NULL, 0, uptr:NULL, defintval:64, TYPE_UINT, 0}, \
|
||||
{"dl_GapDurationCoeff_NB", NULL, 0, strptr:NULL, defstrval:"oneEighth", TYPE_STRING, 0}, \
|
||||
{"npusch_p0_NominalNPUSCH", NULL, 0, iptr:NULL, defintval:0, TYPE_INT32, 0}, \
|
||||
{"npusch_alpha", NULL, 0, strptr:NULL, defstrval:"AL0", TYPE_STRING, 0}, \
|
||||
{"deltaPreambleMsg3", NULL, 0, iptr:NULL, defintval:0, TYPE_INT32, 0}, \
|
||||
{"ue_TimersAndConstants_t300_NB", NULL, 0, uptr:NULL, defintval:1000, TYPE_UINT, 0}, \
|
||||
{"ue_TimersAndConstants_t301_NB", NULL, 0, uptr:NULL, defintval:1000, TYPE_UINT, 0}, \
|
||||
{"ue_TimersAndConstants_t310_NB", NULL, 0, uptr:NULL, defintval:1000, TYPE_UINT, 0}, \
|
||||
{"ue_TimersAndConstants_t311_NB", NULL, 0, uptr:NULL, defintval:10000, TYPE_UINT, 0}, \
|
||||
{"ue_TimersAndConstants_n310_NB", NULL, 0, uptr:NULL, defintval:20, TYPE_UINT, 0}, \
|
||||
{"ue_TimersAndConstants_n311_NB", NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \
|
||||
}
|
||||
|
||||
#define NBIOT_RACH_RARESPONSEWINDOWSIZE_NB_IDX 0
|
||||
#define NBIOT_RACH_MACCONTENTIONRESOLUTIONTIMER_NB_IDX 1
|
||||
#define NBIOT_RACH_POWERRAMPINGSTEP_NB_IDX 2
|
||||
#define NBIOT_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_IDX 3
|
||||
#define NBIOT_RACH_PREAMBLETRANSMAX_CE_NB_IDX 4
|
||||
#define NBIOT_BCCH_MODIFICATIONPERIODCOEFF_NB_IDX 5
|
||||
#define NBIOT_PCCH_DEFAULTPAGINGCYCLE_NB_IDX 6
|
||||
#define NBIOT_NPRACH_CP_LENGTH_IDX 7
|
||||
#define NBIOT_NPRACH_RSRP_RANGE_IDX 8
|
||||
#define NBIOT_NPRACH_SUBCARRIERMSG3_RANGESTART_IDX 9
|
||||
#define NBIOT_MAXNUMPREAMBLEATTEMPTCE_NB_IDX 10
|
||||
#define NBIOT_NPDSCH_NRS_POWER_IDX 11
|
||||
#define NBIOT_NPUSCH_ACK_NACK_NUMREPETITIONS_NB_IDX 12
|
||||
#define NBIOT_NPUSCH_SRS_SUBFRAMECONFIG_NB_IDX 13
|
||||
#define NBIOT_NPUSCH_THREETONE_CYCLICSHIFT_R13_IDX 14
|
||||
#define NBIOT_NPUSCH_SIXTONE_CYCLICSHIFT_R13_IDX 15
|
||||
#define NBIOT_NPUSCH_GROUPHOPPINGENABLED_IDX 16
|
||||
#define NBIOT_NPUSCH_GROUPASSIGNMENTNPUSCH_R13_IDX 17
|
||||
#define NBIOT_DL_GAPTHRESHOLD_NB_IDX 18
|
||||
#define NBIOT_DL_GAPPERIODICITY_NB_IDX 19
|
||||
#define NBIOT_DL_GAPDURATIONCOEFF_NB_IDX 20
|
||||
#define NBIOT_NPUSCH_P0_NOMINALNPUSCH_IDX 21
|
||||
#define NBIOT_NPUSCH_ALPHA_IDX 22
|
||||
#define NBIOT_DELTAPREAMBLEMSG3_IDX 23
|
||||
#define NBIOT_UE_TIMERSANDCONSTANTS_T300_NB_IDX 24
|
||||
#define NBIOT_UE_TIMERSANDCONSTANTS_T301_NB_IDX 25
|
||||
#define NBIOT_UE_TIMERSANDCONSTANTS_T310_NB_IDX 26
|
||||
#define NBIOT_UE_TIMERSANDCONSTANTS_T311_NB_IDX 27
|
||||
#define NBIOT_UE_TIMERSANDCONSTANTS_N310_NB_IDX 28
|
||||
#define NBIOT_UE_TIMERSANDCONSTANTS_N311_NB_IDX 29
|
||||
|
||||
/* NB-Iot RRC: link to LTE RRC section name */
|
||||
#define NBIOT_LTERRCREF_CONFIG_STRING "LTERRC_Ref"
|
||||
/*---------------------------------------------------------------------------------------------------------------*/
|
||||
/* NB-IoT RRC configuration parameters to link to a LTE RRC instance (in-guard, in-band) */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*---------------------------------------------------------------------------------------------------------------*/
|
||||
#define NBIOTRRCPARAMS_RRCREF_DESC { \
|
||||
{"RRC_inst", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"CC_inst", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
}
|
||||
/*--------------------------------------------------------------------------------------------------------------*/
|
||||
#define NBIOT_RRCINST_IDX 0
|
||||
#define NBIOT_CCINST_IDX 1
|
||||
|
||||
#define NBIOT_RRCLIST_NPRACHPARAMS_CONFIG_STRING "NPRACH-NB-r13"
|
||||
|
||||
|
||||
#define NPRACH_PERIODICITY_OKVALUES {40,80,160,240,320,640,1280,2560}
|
||||
#define NPRACH_PERIODICITY_MODVALUES { NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms40, NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms80, \
|
||||
NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms160, NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms240, \
|
||||
NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms320, NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms640, \
|
||||
NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms1280, NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms2560 }
|
||||
|
||||
#define NPRACH_STARTTIME_OKVALUES {8,16,32,64,128,256,512,1024}
|
||||
#define NPRACH_STARTTIME_MODVALUES { NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms8, NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms16, \
|
||||
NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms32, NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms64, \
|
||||
NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms128, NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms256, \
|
||||
NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms512, NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms1024 }
|
||||
|
||||
#define NPRACH_SUBCARRIEROFFSET_OKVALUES {0,12,24,36,2,18,34}
|
||||
#define NPRACH_SUBCARRIEROFFSET_MODVALUES { NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n0, NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n12, \
|
||||
NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n24, NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n36, \
|
||||
NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n2, NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n18, \
|
||||
NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n34 }
|
||||
|
||||
#define NPRACH_NUMSUBCARRIERS_OKVALUES {12,24,36,48}
|
||||
#define NPRACH_NUMSUBCARRIERS_MODVALUES { NPRACH_Parameters_NB_r13__nprach_NumSubcarriers_r13_n12, NPRACH_Parameters_NB_r13__nprach_NumSubcarriers_r13_n24, \
|
||||
NPRACH_Parameters_NB_r13__nprach_NumSubcarriers_r13_n36, NPRACH_Parameters_NB_r13__nprach_NumSubcarriers_r13_n48 }
|
||||
|
||||
|
||||
#define NUMREPETITIONSPERPREAMBLEATTEMPT_OKVALUES {1,2,4,8,16,32,64,128}
|
||||
#define NUMREPETITIONSPERPREAMBLEATTEMPT_MODVALUES { NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n1, NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n2, \
|
||||
NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n4, NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n8, \
|
||||
NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n16, NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n32, \
|
||||
NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n64, NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n128}
|
||||
|
||||
#define NPDCCHNUMREPETITIONSRA_OKVALUES {1,2,4,8,16,32,64,128,256,512,1024,2048}
|
||||
#define NPDCCHNUMREPETITIONSRA_MODVALUES { NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r1, NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r2, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r4, NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r8, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r16, NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r32, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r64, NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r128, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r256, NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r512, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r1024,NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r2048}
|
||||
|
||||
#define NPDCCHSTARTSFCSSRA_OKVALUES {1,2,4,8,16,32,48,64}
|
||||
#define NPDCCHSTARTSFCSSRA_MODVALUES { NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v1dot5, NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v2, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v4, NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v8, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v16, NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v32, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v48, NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v64}
|
||||
|
||||
#define NPDCCHOFFSETRA_OKVALUES {"zero","oneEighth","oneFourth","threeEighth"}
|
||||
#define NPDCCHOFFSETRA_MODVALUES { NPRACH_Parameters_NB_r13__npdcch_Offset_RA_r13_zero, NPRACH_Parameters_NB_r13__npdcch_Offset_RA_r13_oneEighth, \
|
||||
NPRACH_Parameters_NB_r13__npdcch_Offset_RA_r13_oneFourth, NPRACH_Parameters_NB_r13__npdcch_Offset_RA_r13_threeEighth}
|
||||
|
||||
|
||||
|
||||
#define NBIOT_RRCLIST_NPRACHPARAMSCHECK_DESC { \
|
||||
{ .s1a= { config_check_modify_integer, NPRACH_PERIODICITY_OKVALUES, NPRACH_PERIODICITY_MODVALUES, 8 }}, \
|
||||
{ .s1a= { config_check_modify_integer, NPRACH_STARTTIME_OKVALUES, NPRACH_STARTTIME_MODVALUES, 8 }}, \
|
||||
{ .s1a= { config_check_modify_integer, NPRACH_SUBCARRIEROFFSET_OKVALUES, NPRACH_SUBCARRIEROFFSET_MODVALUES, 7 }}, \
|
||||
{ .s1a= { config_check_modify_integer, NPRACH_NUMSUBCARRIERS_OKVALUES, NPRACH_NUMSUBCARRIERS_MODVALUES, 4 }}, \
|
||||
{ .s1a= { config_check_modify_integer, NUMREPETITIONSPERPREAMBLEATTEMPT_OKVALUES, NUMREPETITIONSPERPREAMBLEATTEMPT_MODVALUES,8 }}, \
|
||||
{ .s1a= { config_check_modify_integer, NPDCCHNUMREPETITIONSRA_OKVALUES, NPDCCHNUMREPETITIONSRA_MODVALUES, 12}}, \
|
||||
{ .s1a= { config_check_modify_integer, NPDCCHSTARTSFCSSRA_OKVALUES, NPDCCHSTARTSFCSSRA_MODVALUES, 8 }}, \
|
||||
{ .s3a= { config_checkstr_assign_integer, NPDCCHOFFSETRA_OKVALUES, NPDCCHOFFSETRA_MODVALUES, 4 }}, \
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* NB-IoT NPrach parameters, there will be three ocuurences of these parameters in each RRC instance */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define NBIOTRRC_NPRACH_PARAMS_DESC { \
|
||||
{"nprach_Periodicity", NULL, 0, uptr:NULL, defintval:320, TYPE_UINT, 0}, \
|
||||
{"nprach_StartTime", NULL, 0, uptr:NULL, defintval:8, TYPE_UINT, 0}, \
|
||||
{"nprach_SubcarrierOffset", NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{"nprach_NumSubcarriers", NULL, 0, uptr:NULL, defintval:12, TYPE_UINT, 0}, \
|
||||
{"numRepetitionsPerPreambleAttempt", NULL, 0, uptr:NULL, defintval:2, TYPE_UINT, 0}, \
|
||||
{"npdcch_NumRepetitions_RA", NULL, 0, uptr:NULL, defintval:16, TYPE_UINT, 0}, \
|
||||
{"npdcch_StartSF_CSS_RA", NULL, 0, uptr:NULL, defintval:2, TYPE_UINT, 0}, \
|
||||
{"npdcch_Offset_RA", NULL, 0, strptr:NULL, defstrval:"zero", TYPE_STRING, 0}, \
|
||||
}
|
||||
|
||||
#define NBIOT_NPRACH_PERIODICITY_IDX 0
|
||||
#define NBIOT_NPRACH_STARTTIME_IDX 1
|
||||
#define NBIOT_NPRACH_SUBCARRIEROFFSET_IDX 2
|
||||
#define NBIOT_NPRACH_NUMSUBCARRIERS_IDX 3
|
||||
#define NBIOT_NUMREPETITIONSPERPREAMBLEATTEMPT_NB_IDX 4
|
||||
#define NBIOT_NPDCCH_NUMREPETITIONS_RA_IDX 5
|
||||
#define NBIOT_NPDCCH_STARTSF_CSS_RA_IDX 6
|
||||
#define NBIOT_NPDCCH_OFFSET_RA_IDX 7
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* NB IoT MACRLC configuration list section name */
|
||||
#define NBIOT_MACRLCLIST_CONFIG_STRING "NB-IoT_MACRLCs"
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* NB IoT L1 configuration list section name */
|
||||
#define NBIOT_L1LIST_CONFIG_STRING "NB-IoT_L1s"
|
||||
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*
|
||||
RRC_config_tools.c
|
||||
-------------------
|
||||
AUTHOR : Francois TABURET
|
||||
COMPANY : NOKIA BellLabs France
|
||||
EMAIL : francois.taburet@nokia-bell-labs.com
|
||||
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "log_extern.h"
|
||||
#include "assertions.h"
|
||||
#if defined(ENABLE_ITTI)
|
||||
# include "intertask_interface.h"
|
||||
# if defined(ENABLE_USE_MME)
|
||||
# include "s1ap_eNB.h"
|
||||
# include "sctp_eNB_task.h"
|
||||
# endif
|
||||
#endif
|
||||
#include "SystemInformationBlockType2.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "RRC_config_tools.h"
|
||||
#include "DL-GapConfig-NB-r13.h"
|
||||
#include "NPRACH-Parameters-NB-r13.h"
|
||||
|
||||
static const eutra_band_t eutra_bands[] = {
|
||||
{ 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD},
|
||||
{ 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD},
|
||||
{ 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD},
|
||||
{ 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD},
|
||||
{ 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD},
|
||||
{ 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD},
|
||||
{ 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD},
|
||||
{ 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD},
|
||||
{ 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD},
|
||||
{10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD},
|
||||
{11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD},
|
||||
{12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD},
|
||||
{13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD},
|
||||
{14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD},
|
||||
|
||||
{17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD},
|
||||
{20, 832 * MHz, 862 * MHz, 791 * MHz, 821 * MHz, FDD},
|
||||
{33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD},
|
||||
{33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD},
|
||||
{34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD},
|
||||
{35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD},
|
||||
{36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD},
|
||||
{37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD},
|
||||
{38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD},
|
||||
{39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD},
|
||||
{40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD},
|
||||
{41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD},
|
||||
{42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD},
|
||||
{43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD},
|
||||
{44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD},
|
||||
};
|
||||
|
||||
|
||||
int config_check_band_frequencies( int ind,
|
||||
int16_t band,
|
||||
uint32_t downlink_frequency,
|
||||
int32_t uplink_frequency_offset,
|
||||
uint32_t frame_type)
|
||||
{
|
||||
int errors = 0;
|
||||
|
||||
if (band > 0) {
|
||||
int band_index;
|
||||
|
||||
for (band_index = 0; band_index < sizeof (eutra_bands) / sizeof (eutra_bands[0]); band_index++) {
|
||||
if (band == eutra_bands[band_index].band) {
|
||||
uint32_t uplink_frequency = downlink_frequency + uplink_frequency_offset;
|
||||
|
||||
AssertError (eutra_bands[band_index].dl_min < downlink_frequency, errors ++,
|
||||
"enb %d downlink frequency %u too low (%u) for band %d!",
|
||||
ind, downlink_frequency, eutra_bands[band_index].dl_min, band);
|
||||
AssertError (downlink_frequency < eutra_bands[band_index].dl_max, errors ++,
|
||||
"enb %d downlink frequency %u too high (%u) for band %d!",
|
||||
ind, downlink_frequency, eutra_bands[band_index].dl_max, band);
|
||||
|
||||
AssertError (eutra_bands[band_index].ul_min < uplink_frequency, errors ++,
|
||||
"enb %d uplink frequency %u too low (%u) for band %d!",
|
||||
ind, uplink_frequency, eutra_bands[band_index].ul_min, band);
|
||||
AssertError (uplink_frequency < eutra_bands[band_index].ul_max, errors ++,
|
||||
"enb %d uplink frequency %u too high (%u) for band %d!",
|
||||
ind, uplink_frequency, eutra_bands[band_index].ul_max, band);
|
||||
|
||||
AssertError (eutra_bands[band_index].frame_type == frame_type, errors ++,
|
||||
"enb %d invalid frame type (%d/%d) for band %d!",
|
||||
ind, eutra_bands[band_index].frame_type, frame_type, band);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return errors;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*
|
||||
RRC_config_tools.h
|
||||
-------------------
|
||||
AUTHOR : Francois TABURET
|
||||
COMPANY : NOKIA BellLabs France
|
||||
EMAIL : francois.taburet@nokia-bell-labs.com
|
||||
*/
|
||||
#ifndef RRC_CONFIG_TOOLS_H_
|
||||
#define RRC_CONFIG_TOOLS_H_
|
||||
|
||||
#define KHz (1000UL)
|
||||
#define MHz (1000 * KHz)
|
||||
|
||||
typedef struct eutra_band_s {
|
||||
int16_t band;
|
||||
uint32_t ul_min;
|
||||
uint32_t ul_max;
|
||||
uint32_t dl_min;
|
||||
uint32_t dl_max;
|
||||
lte_frame_type_t frame_type;
|
||||
} eutra_band_t;
|
||||
|
||||
|
||||
extern int config_check_band_frequencies(int ind, int16_t band, uint32_t downlink_frequency,
|
||||
int32_t uplink_frequency_offset, uint32_t frame_type);
|
||||
|
||||
extern int config_check_assign_DLGap_NB(paramdef_t *param);
|
||||
extern int config_check_assign_rach_NB(paramdef_t *param);
|
||||
#endif
|
||||
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file openair2/ENB_APP/RRC_paramsvalues.h
|
||||
* \brief macro definitions for RRC authorized and asn1 parameters values, to be used in paramdef_t/chechedparam_t structure initializations
|
||||
* \author Francois TABURET
|
||||
* \date 2017
|
||||
* \version 0.1
|
||||
* \company NOKIA BellLabs France
|
||||
* \email: francois.taburet@nokia-bell-labs.com
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#ifndef __RRC_PARAMSVALUES__H__
|
||||
#define __RRC_PARAMSVALUES__H__
|
||||
/* cell configuration section name */
|
||||
#define ENB_CONFIG_STRING_ENB_LIST "eNBs"
|
||||
/* component carriers configuration section name */
|
||||
#define ENB_CONFIG_STRING_COMPONENT_CARRIERS "component_carriers"
|
||||
|
||||
#define ENB_CONFIG_STRING_FRAME_TYPE "frame_type"
|
||||
#define ENB_CONFIG_STRING_PBCH_REPETITION "pbch_repetition"
|
||||
#define ENB_CONFIG_STRING_TDD_CONFIG "tdd_config"
|
||||
#define ENB_CONFIG_STRING_TDD_CONFIG_S "tdd_config_s"
|
||||
#define ENB_CONFIG_STRING_PREFIX_TYPE "prefix_type"
|
||||
#define ENB_CONFIG_STRING_PREFIX_TYPE_UL "prefix_type_UL"
|
||||
#define ENB_CONFIG_STRING_EUTRA_BAND "eutra_band"
|
||||
#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY "downlink_frequency"
|
||||
#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET "uplink_frequency_offset"
|
||||
#define ENB_CONFIG_STRING_NID_CELL "Nid_cell"
|
||||
#define ENB_CONFIG_STRING_N_RB_DL "N_RB_DL"
|
||||
#define ENB_CONFIG_STRING_CELL_MBSFN "Nid_cell_mbsfn"
|
||||
|
||||
|
||||
#define FRAMETYPE_OKVALUES {"FDD","TDD"}
|
||||
#define FRAMETYPE_MODVALUES { FDD, TDD}
|
||||
|
||||
#define TDDCFG(A) TDD_Config__subframeAssignment_ ## A
|
||||
#define TDDCONFIG_OKRANGE { TDDCFG(sa0), TDDCFG(sa6)}
|
||||
|
||||
#define TDDCFGS(A) TDD_Config__specialSubframePatterns_ ## A
|
||||
#define TDDCONFIGS_OKRANGE { TDDCFGS(ssp0), TDDCFGS(ssp8)}
|
||||
|
||||
#define PREFIX_OKVALUES {"NORMAL","EXTENDED"}
|
||||
#define PREFIX_MODVALUES { NORMAL, EXTENDED}
|
||||
|
||||
#define PREFIXUL_OKVALUES {"NORMAL","EXTENDED"}
|
||||
#define PREFIXUL_MODVALUES { NORMAL, EXTENDED}
|
||||
|
||||
#define NRBDL_OKVALUES {6,15,25,50,75,100}
|
||||
|
||||
#define UETIMER_T300_OKVALUES {100,200,300,400,600,1000,1500,2000}
|
||||
#define UETT300(A) UE_TimersAndConstants__t300_ ## A
|
||||
#define UETIMER_T300_MODVALUES { UETT300(ms100), UETT300(ms200),UETT300(ms300),UETT300(ms400),UETT300(ms600),UETT300(ms1000),UETT300(ms1500),UETT300(ms2000)}
|
||||
|
||||
#define UETIMER_T301_OKVALUES {100,200,300,400,600,1000,1500,2000}
|
||||
#define UETT301(A) UE_TimersAndConstants__t301_ ## A
|
||||
#define UETIMER_T301_MODVALUES { UETT301(ms100), UETT301(ms200),UETT301(ms300),UETT301(ms400),UETT301(ms600),UETT301(ms1000),UETT301(ms1500),UETT301(ms2000)}
|
||||
|
||||
#define UETIMER_T310_OKVALUES {0,50,100,200,500,1000,2000}
|
||||
#define UETT310(A) UE_TimersAndConstants__t310_ ## A
|
||||
#define UETIMER_T310_MODVALUES { UETT310(ms0), UETT310(ms50),UETT310(ms100),UETT310(ms200),UETT310(ms500),UETT310(ms1000),UETT310(ms2000)}
|
||||
|
||||
#define UETIMER_T311_OKVALUES {1000,3110,5000,10000,15000,20000,31100}
|
||||
#define UETT311(A) UE_TimersAndConstants__t311_ ## A
|
||||
#define UETIMER_T311_MODVALUES { UETT311(ms1000), UETT311(ms3000),UETT311(ms5000),UETT311(ms10000),UETT311(ms15000),UETT311(ms20000),UETT311(ms30000)}
|
||||
|
||||
#define UETIMER_N310_OKVALUES {1,2,3,4,6,8,10,20}
|
||||
#define UETN310(A) UE_TimersAndConstants__n310_ ## A
|
||||
#define UETIMER_N310_MODVALUES { UETN310(n1), UETN310(n2),UETN310(n3),UETN310(n4),UETN310(n6),UETN310(n8),UETN310(n10),UETN310(n20)}
|
||||
|
||||
#define UETIMER_N311_OKVALUES {1,2,3,4,5,6,8,10}
|
||||
#define UETN311(A) UE_TimersAndConstants__n311_ ## A
|
||||
#define UETIMER_N311_MODVALUES { UETN311(n1), UETN311(n2),UETN311(n3),UETN311(n4),UETN311(n5),UETN311(n6),UETN311(n8),UETN311(n10)}
|
||||
|
||||
#endif
|
||||
+39
-585
@@ -52,51 +52,14 @@
|
||||
#include "nfapi_vnf.h"
|
||||
#include "nfapi_pnf.h"
|
||||
|
||||
#include "enb_paramdef.h"
|
||||
#include "L1_paramdef.h"
|
||||
#include "MACRLC_paramdef.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "RRC_config_tools.h"
|
||||
#include "enb_paramdef.h"
|
||||
|
||||
extern uint16_t sf_ahead;
|
||||
|
||||
static int enb_check_band_frequencies(char* lib_config_file_name_pP,
|
||||
int ind,
|
||||
int16_t band,
|
||||
uint32_t downlink_frequency,
|
||||
int32_t uplink_frequency_offset,
|
||||
lte_frame_type_t frame_type)
|
||||
{
|
||||
int errors = 0;
|
||||
|
||||
if (band > 0) {
|
||||
int band_index;
|
||||
|
||||
for (band_index = 0; band_index < sizeof (eutra_bands) / sizeof (eutra_bands[0]); band_index++) {
|
||||
if (band == eutra_bands[band_index].band) {
|
||||
uint32_t uplink_frequency = downlink_frequency + uplink_frequency_offset;
|
||||
|
||||
AssertError (eutra_bands[band_index].dl_min < downlink_frequency, errors ++,
|
||||
"Failed to parse eNB configuration file %s, enb %d downlink frequency %u too low (%u) for band %d!",
|
||||
lib_config_file_name_pP, ind, downlink_frequency, eutra_bands[band_index].dl_min, band);
|
||||
AssertError (downlink_frequency < eutra_bands[band_index].dl_max, errors ++,
|
||||
"Failed to parse eNB configuration file %s, enb %d downlink frequency %u too high (%u) for band %d!",
|
||||
lib_config_file_name_pP, ind, downlink_frequency, eutra_bands[band_index].dl_max, band);
|
||||
|
||||
AssertError (eutra_bands[band_index].ul_min < uplink_frequency, errors ++,
|
||||
"Failed to parse eNB configuration file %s, enb %d uplink frequency %u too low (%u) for band %d!",
|
||||
lib_config_file_name_pP, ind, uplink_frequency, eutra_bands[band_index].ul_min, band);
|
||||
AssertError (uplink_frequency < eutra_bands[band_index].ul_max, errors ++,
|
||||
"Failed to parse eNB configuration file %s, enb %d uplink frequency %u too high (%u) for band %d!",
|
||||
lib_config_file_name_pP, ind, uplink_frequency, eutra_bands[band_index].ul_max, band);
|
||||
|
||||
AssertError (eutra_bands[band_index].frame_type == frame_type, errors ++,
|
||||
"Failed to parse eNB configuration file %s, enb %d invalid frame type (%d/%d) for band %d!",
|
||||
lib_config_file_name_pP, ind, eutra_bands[band_index].frame_type, frame_type, band);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return errors;
|
||||
}
|
||||
|
||||
void RCconfig_flexran()
|
||||
{
|
||||
@@ -420,14 +383,16 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
|
||||
paramdef_t ENBParams[] = ENBPARAMS_DESC;
|
||||
paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
|
||||
|
||||
checkedparam_t config_check_CCparams[] = CCPARAMS_CHECK;
|
||||
paramdef_t CCsParams[] = CCPARAMS_DESC;
|
||||
paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
|
||||
|
||||
paramdef_t SRB1Params[] = SRB1PARAMS_DESC;
|
||||
|
||||
|
||||
|
||||
|
||||
/* map parameter checking array instances to parameter definition array instances */
|
||||
for (int I=0; I< ( sizeof(CCsParams)/ sizeof(paramdef_t) ) ; I++) {
|
||||
CCsParams[I].chkPptr = &(config_check_CCparams[I]);
|
||||
}
|
||||
/* get global parameters, defined outside any section in the config file */
|
||||
|
||||
config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
|
||||
@@ -562,43 +527,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
|
||||
|
||||
|
||||
nb_cc++;
|
||||
/*
|
||||
if (strcmp(cc_node_function, "eNodeB_3GPP") == 0) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = eNodeB_3GPP;
|
||||
} else if (strcmp(cc_node_function, "eNodeB_3GPP_BBU") == 0) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = eNodeB_3GPP_BBU;
|
||||
} else if (strcmp(cc_node_function, "NGFI_RCC_IF4p5") == 0) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RCC_IF4p5;
|
||||
} else if (strcmp(cc_node_function, "NGFI_RAU_IF4p5") == 0) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RAU_IF4p5;
|
||||
} else if (strcmp(cc_node_function, "NGFI_RRU_IF4p5") == 0) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RRU_IF4p5;
|
||||
} else if (strcmp(cc_node_function, "NGFI_RRU_IF5") == 0) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RRU_IF5;
|
||||
} else {
|
||||
AssertError (0, parse_errors ++,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for node_function choice: eNodeB_3GPP or eNodeB_3GPP_BBU or NGFI_IF4_RCC or NGFI_IF4_RRU or NGFI_IF5_RRU !\n",
|
||||
lib_config_file_name_pP, i, cc_node_function);
|
||||
}
|
||||
|
||||
if (strcmp(cc_node_timing, "synch_to_ext_device") == 0) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_timing[j] = synch_to_ext_device;
|
||||
} else if (strcmp(cc_node_timing, "synch_to_other") == 0) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_timing[j] = synch_to_other;
|
||||
} else {
|
||||
AssertError (0, parse_errors ++,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for node_function choice: SYNCH_TO_DEVICE or SYNCH_TO_OTHER !\n",
|
||||
lib_config_file_name_pP, i, cc_node_timing);
|
||||
}
|
||||
|
||||
if ((cc_node_synch_ref >= -1) && (cc_node_synch_ref < num_component_carriers)) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->cc_node_synch_ref[j] = (int16_t) cc_node_synch_ref;
|
||||
} else {
|
||||
AssertError (0, parse_errors ++,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for node_synch_ref choice: valid CC_id or -1 !\n",
|
||||
lib_config_file_name_pP, i, cc_node_synch_ref);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
|
||||
|
||||
@@ -710,8 +639,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
|
||||
|
||||
RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
|
||||
|
||||
if (enb_check_band_frequencies(RC.config_file_name,
|
||||
j,
|
||||
if (config_check_band_frequencies(j,
|
||||
RRC_CONFIGURATION_REQ (msg_p).eutra_band[j],
|
||||
RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j],
|
||||
RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j],
|
||||
@@ -1385,244 +1313,13 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
switch (ue_TimersAndConstants_t300) {
|
||||
case 100:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms100;
|
||||
break;
|
||||
|
||||
case 200:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms200;
|
||||
break;
|
||||
|
||||
case 300:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms300;
|
||||
break;
|
||||
|
||||
case 400:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms400;
|
||||
break;
|
||||
|
||||
case 600:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms600;
|
||||
break;
|
||||
|
||||
case 1000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1000;
|
||||
break;
|
||||
|
||||
case 1500:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1500;
|
||||
break;
|
||||
|
||||
case 2000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms2000;
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal (0,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t300 choice: 100,200,300,400,600,1000,1500,2000 ",
|
||||
RC.config_file_name, i, ue_TimersAndConstants_t300);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (ue_TimersAndConstants_t301) {
|
||||
case 100:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms100;
|
||||
break;
|
||||
|
||||
case 200:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms200;
|
||||
break;
|
||||
|
||||
case 300:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms300;
|
||||
break;
|
||||
|
||||
case 400:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms400;
|
||||
break;
|
||||
|
||||
case 600:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms600;
|
||||
break;
|
||||
|
||||
case 1000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1000;
|
||||
break;
|
||||
|
||||
case 1500:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1500;
|
||||
break;
|
||||
|
||||
case 2000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms2000;
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal (0,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t301 choice: 100,200,300,400,600,1000,1500,2000 ",
|
||||
RC.config_file_name, i, ue_TimersAndConstants_t301);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (ue_TimersAndConstants_t310) {
|
||||
case 0:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms0;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms50;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms100;
|
||||
break;
|
||||
|
||||
case 200:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms200;
|
||||
break;
|
||||
|
||||
case 500:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms500;
|
||||
break;
|
||||
|
||||
case 1000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms1000;
|
||||
break;
|
||||
|
||||
case 2000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms2000;
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal (0,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t310 choice: 0,50,100,200,500,1000,1500,2000 ",
|
||||
RC.config_file_name, i, ue_TimersAndConstants_t310);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (ue_TimersAndConstants_t311) {
|
||||
case 1000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms1000;
|
||||
break;
|
||||
|
||||
case 3110:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms3000;
|
||||
break;
|
||||
|
||||
case 5000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms5000;
|
||||
break;
|
||||
|
||||
case 10000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms10000;
|
||||
break;
|
||||
|
||||
case 15000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms15000;
|
||||
break;
|
||||
|
||||
case 20000:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms20000;
|
||||
break;
|
||||
|
||||
case 31100:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms30000;
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal (0,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1000,3000,5000,10000,150000,20000,30000",
|
||||
RC.config_file_name, i, ue_TimersAndConstants_t311);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (ue_TimersAndConstants_n310) {
|
||||
case 1:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n1;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n2;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n3;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n4;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n6;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n8;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n10;
|
||||
break;
|
||||
|
||||
case 20:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n20;
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal (0,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_n310 choice: 1,2,3,4,6,6,8,10,20",
|
||||
RC.config_file_name, i, ue_TimersAndConstants_n311);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (ue_TimersAndConstants_n311) {
|
||||
case 1:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n1;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n2;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n3;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n4;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n5;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n6;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n8;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n10;
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal (0,
|
||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1,2,3,4,5,6,8,10",
|
||||
RC.config_file_name, i, ue_TimersAndConstants_t311);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = ue_TimersAndConstants_t300;
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = ue_TimersAndConstants_t301;
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = ue_TimersAndConstants_t310;
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = ue_TimersAndConstants_t311;
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = ue_TimersAndConstants_n310;
|
||||
RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = ue_TimersAndConstants_n311;
|
||||
|
||||
switch (ue_TransmissionMode) {
|
||||
case 1:
|
||||
@@ -1965,275 +1662,32 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
|
||||
}
|
||||
|
||||
/*
|
||||
// OTG _CONFIG
|
||||
setting_otg = config_setting_get_member (setting_enb, ENB_CONF_STRING_OTG_CONFIG);
|
||||
|
||||
if (setting_otg != NULL) {
|
||||
num_otg_elements = config_setting_length(setting_otg);
|
||||
printf("num otg elements %d \n", num_otg_elements);
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->num_otg_elements = 0;
|
||||
|
||||
for (j = 0; j < num_otg_elements; j++) {
|
||||
subsetting_otg=config_setting_get_elem(setting_otg, j);
|
||||
|
||||
if (config_setting_lookup_int(subsetting_otg, ENB_CONF_STRING_OTG_UE_ID, &otg_ue_id)) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->otg_ue_id[j] = otg_ue_id;
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->otg_ue_id[j] = 1;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting_otg, ENB_CONF_STRING_OTG_APP_TYPE, (const char **)&otg_app_type)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = map_str_to_int(otg_app_type_names,otg_app_type))== -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = BCBR;
|
||||
}
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = NO_PREDEFINED_TRAFFIC; // 0
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting_otg, ENB_CONF_STRING_OTG_BG_TRAFFIC, (const char **)&otg_bg_traffic)) {
|
||||
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j] = map_str_to_int(switch_names,otg_bg_traffic)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j]=0;
|
||||
}
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j] = 0;
|
||||
printf("otg bg %s\n", otg_bg_traffic);
|
||||
}
|
||||
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->num_otg_elements+=1;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// log_config
|
||||
subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_LOG_CONFIG);
|
||||
// Network Controller
|
||||
subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
|
||||
|
||||
if (subsetting != NULL) {
|
||||
// global
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GLOBAL_LOG_LEVEL, (const char **) &glog_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->glog_level = map_str_to_int(log_level_names, glog_level)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->glog_level = LOG_INFO;
|
||||
if ( (
|
||||
config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_INTERFACE_NAME,
|
||||
(const char **)&flexran_agent_interface_name)
|
||||
&& config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS,
|
||||
(const char **)&flexran_agent_ipv4_address)
|
||||
&& config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT,
|
||||
&flexran_agent_port)
|
||||
&& config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE,
|
||||
(const char **)&flexran_agent_cache)
|
||||
)
|
||||
) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_interface_name = strdup(flexran_agent_interface_name);
|
||||
cidr = flexran_agent_ipv4_address;
|
||||
address = strtok(cidr, "/");
|
||||
//enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address = strdup(address);
|
||||
if (address) {
|
||||
IPV4_STR_ADDR_TO_INT_NWBO (address, enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address, "BAD IP ADDRESS FORMAT FOR eNB Agent !\n" );
|
||||
}
|
||||
|
||||
//printf( "\tGlobal log level :\t%s->%d\n",glog_level, enb_properties_loc.properties[enb_properties_loc_index]->glog_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->glog_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_port = flexran_agent_port;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_cache = strdup(flexran_agent_cache);
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GLOBAL_LOG_VERBOSITY,(const char **) &glog_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = map_str_to_int(log_verbosity_names, glog_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tGlobal log verbosity:\t%s->%d\n",glog_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
// HW
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_HW_LOG_LEVEL, (const char **) &hw_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = map_str_to_int(log_level_names,hw_log_level)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tHW log level :\t%s->%d\n",hw_log_level,enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_HW_LOG_VERBOSITY, (const char **) &hw_log_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = map_str_to_int(log_verbosity_names,hw_log_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tHW log verbosity:\t%s->%d\n",hw_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
// phy
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PHY_LOG_LEVEL,(const char **) &phy_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = map_str_to_int(log_level_names,phy_log_level)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tPHY log level :\t%s->%d\n",phy_log_level,enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PHY_LOG_VERBOSITY, (const char **)&phy_log_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = map_str_to_int(log_verbosity_names,phy_log_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tPHY log verbosity:\t%s->%d\n",phy_log_level,enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//mac
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_MAC_LOG_LEVEL, (const char **)&mac_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = map_str_to_int(log_level_names,mac_log_level)) == -1 ) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tMAC log level :\t%s->%d\n",mac_log_level,enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_MAC_LOG_VERBOSITY, (const char **)&mac_log_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = map_str_to_int(log_verbosity_names,mac_log_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tMAC log verbosity:\t%s->%d\n",mac_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//rlc
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RLC_LOG_LEVEL, (const char **)&rlc_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = map_str_to_int(log_level_names,rlc_log_level)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tRLC log level :\t%s->%d\n",rlc_log_level, enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RLC_LOG_VERBOSITY, (const char **)&rlc_log_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = map_str_to_int(log_verbosity_names,rlc_log_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tRLC log verbosity:\t%s->%d\n",rlc_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//pdcp
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PDCP_LOG_LEVEL, (const char **)&pdcp_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = map_str_to_int(log_level_names,pdcp_log_level)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tPDCP log level :\t%s->%d\n",pdcp_log_level, enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PDCP_LOG_VERBOSITY, (const char **)&pdcp_log_verbosity)) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = map_str_to_int(log_verbosity_names,pdcp_log_verbosity);
|
||||
//printf( "\tPDCP log verbosity:\t%s->%d\n",pdcp_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//rrc
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RRC_LOG_LEVEL, (const char **)&rrc_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = map_str_to_int(log_level_names,rrc_log_level)) == -1 ) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tRRC log level :\t%s->%d\n",rrc_log_level,enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RRC_LOG_VERBOSITY, (const char **)&rrc_log_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = map_str_to_int(log_verbosity_names,rrc_log_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tRRC log verbosity:\t%s->%d\n",rrc_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GTPU_LOG_LEVEL, (const char **)>pu_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = map_str_to_int(log_level_names,gtpu_log_level)) == -1 ) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tGTPU log level :\t%s->%d\n",gtpu_log_level,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GTPU_LOG_VERBOSITY, (const char **)>pu_log_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = map_str_to_int(log_verbosity_names,gtpu_log_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tGTPU log verbosity:\t%s->%d\n",gtpu_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_UDP_LOG_LEVEL, (const char **)&udp_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = map_str_to_int(log_level_names,udp_log_level)) == -1 ) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tUDP log level :\t%s->%d\n",udp_log_level,enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_UDP_LOG_VERBOSITY, (const char **)&udp_log_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = map_str_to_int(log_verbosity_names,udp_log_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tUDP log verbosity:\t%s->%d\n",udp_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_OSA_LOG_LEVEL, (const char **)&osa_log_level)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = map_str_to_int(log_level_names,osa_log_level)) == -1 ) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
//printf( "\tOSA log level :\t%s->%d\n",osa_log_level,enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = LOG_INFO;
|
||||
}
|
||||
|
||||
if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_OSA_LOG_VERBOSITY, (const char **)&osa_log_verbosity)) {
|
||||
if ((enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = map_str_to_int(log_verbosity_names,osa_log_verbosity)) == -1) {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
//printf( "\tOSA log verbosity:\t%s->%d\n",osa_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gosa_log_verbosity);
|
||||
} else {
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = LOG_MED;
|
||||
}
|
||||
|
||||
} else { // not configuration is given
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->glog_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = LOG_MED;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = LOG_INFO;
|
||||
enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = LOG_MED;
|
||||
}
|
||||
*/
|
||||
break;
|
||||
|
||||
+155
-167
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -31,7 +31,7 @@
|
||||
*/
|
||||
|
||||
#include "common/config/config_paramdesc.h"
|
||||
|
||||
#include "RRC_paramsvalues.h"
|
||||
|
||||
|
||||
|
||||
@@ -56,52 +56,6 @@
|
||||
|
||||
|
||||
|
||||
#define KHz (1000UL)
|
||||
#define MHz (1000 * KHz)
|
||||
|
||||
typedef struct eutra_band_s {
|
||||
int16_t band;
|
||||
uint32_t ul_min;
|
||||
uint32_t ul_max;
|
||||
uint32_t dl_min;
|
||||
uint32_t dl_max;
|
||||
lte_frame_type_t frame_type;
|
||||
} eutra_band_t;
|
||||
|
||||
static const eutra_band_t eutra_bands[] = {
|
||||
{ 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD},
|
||||
{ 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD},
|
||||
{ 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD},
|
||||
{ 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD},
|
||||
{ 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD},
|
||||
{ 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD},
|
||||
{ 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD},
|
||||
{ 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD},
|
||||
{ 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD},
|
||||
{10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD},
|
||||
{11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD},
|
||||
{12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD},
|
||||
{13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD},
|
||||
{14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD},
|
||||
|
||||
{17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD},
|
||||
{20, 832 * MHz, 862 * MHz, 791 * MHz, 821 * MHz, FDD},
|
||||
{33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD},
|
||||
{33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD},
|
||||
{34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD},
|
||||
{35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD},
|
||||
{36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD},
|
||||
{37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD},
|
||||
{38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD},
|
||||
{39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD},
|
||||
{40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD},
|
||||
{41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD},
|
||||
{42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD},
|
||||
{43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD},
|
||||
{44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD},
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -152,7 +106,7 @@ typedef enum {
|
||||
#define CONFIG_STRING_RU_MAX_RS_EPRE "max_pdschReferenceSignalPower"
|
||||
#define CONFIG_STRING_RU_MAX_RXGAIN "max_rxgain"
|
||||
#define CONFIG_STRING_RU_IF_COMPRESSION "if_compression"
|
||||
|
||||
#define CONFIG_STRING_RU_NBIOTRRC_LIST "NbIoT_RRC_instances"
|
||||
|
||||
#define RU_LOCAL_IF_NAME_IDX 0
|
||||
#define RU_LOCAL_ADDRESS_IDX 1
|
||||
@@ -171,7 +125,7 @@ typedef enum {
|
||||
#define RU_ENB_LIST_IDX 14
|
||||
#define RU_ATT_TX_IDX 15
|
||||
#define RU_ATT_RX_IDX 16
|
||||
|
||||
#define RU_NBIOTRRC_LIST_IDX 17
|
||||
|
||||
|
||||
|
||||
@@ -196,7 +150,8 @@ typedef enum {
|
||||
{CONFIG_STRING_RU_BAND_LIST, NULL, 0, uptr:NULL, defintarrayval:DEFBANDS, TYPE_INTARRAY, 1}, \
|
||||
{CONFIG_STRING_RU_ENB_LIST, NULL, 0, uptr:NULL, defintarrayval:DEFENBS, TYPE_INTARRAY, 1}, \
|
||||
{CONFIG_STRING_RU_ATT_TX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_ATT_RX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0} \
|
||||
{CONFIG_STRING_RU_ATT_RX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_NBIOTRRC_LIST, NULL, 0, uptr:NULL, defintarrayval:DEFENBS, TYPE_INTARRAY, 1}, \
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
@@ -233,8 +188,7 @@ typedef enum {
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* cell configuration section name */
|
||||
#define ENB_CONFIG_STRING_ENB_LIST "eNBs"
|
||||
|
||||
|
||||
/* cell configuration parameters names */
|
||||
#define ENB_CONFIG_STRING_ENB_ID "eNB_ID"
|
||||
@@ -289,21 +243,9 @@ typedef enum {
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* component carriers configuration section name */
|
||||
#define ENB_CONFIG_STRING_COMPONENT_CARRIERS "component_carriers"
|
||||
|
||||
/* component carries configuration parameters name */
|
||||
#define ENB_CONFIG_STRING_FRAME_TYPE "frame_type"
|
||||
#define ENB_CONFIG_STRING_PBCH_REPETITION "pbch_repetition"
|
||||
#define ENB_CONFIG_STRING_TDD_CONFIG "tdd_config"
|
||||
#define ENB_CONFIG_STRING_TDD_CONFIG_S "tdd_config_s"
|
||||
#define ENB_CONFIG_STRING_PREFIX_TYPE "prefix_type"
|
||||
#define ENB_CONFIG_STRING_EUTRA_BAND "eutra_band"
|
||||
#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY "downlink_frequency"
|
||||
#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET "uplink_frequency_offset"
|
||||
#define ENB_CONFIG_STRING_NID_CELL "Nid_cell"
|
||||
#define ENB_CONFIG_STRING_N_RB_DL "N_RB_DL"
|
||||
#define ENB_CONFIG_STRING_CELL_MBSFN "Nid_cell_mbsfn"
|
||||
|
||||
#define ENB_CONFIG_STRING_NB_ANT_PORTS "nb_antenna_ports"
|
||||
#define ENB_CONFIG_STRING_NB_ANT_TX "nb_antennas_tx"
|
||||
#define ENB_CONFIG_STRING_NB_ANT_RX "nb_antennas_rx"
|
||||
@@ -367,11 +309,83 @@ typedef enum {
|
||||
#define ENB_CONFIG_STRING_UETIMERS_N310 "ue_TimersAndConstants_n310"
|
||||
#define ENB_CONFIG_STRING_UETIMERS_N311 "ue_TimersAndConstants_n311"
|
||||
#define ENB_CONFIG_STRING_UE_TRANSMISSION_MODE "ue_TransmissionMode"
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* component carriers configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* init for checkedparam_t structure */
|
||||
|
||||
#define CCPARAMS_CHECK { \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s5= {NULL }} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_T300_OKVALUES, UETIMER_T300_MODVALUES,8}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_T301_OKVALUES, UETIMER_T301_MODVALUES,8}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_T310_OKVALUES, UETIMER_T310_MODVALUES,7}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_T311_OKVALUES, UETIMER_T311_MODVALUES,7}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_N310_OKVALUES, UETIMER_N310_MODVALUES,8}} , \
|
||||
{ .s1a= { config_check_modify_integer, UETIMER_N311_OKVALUES, UETIMER_N311_MODVALUES,8}} , \
|
||||
{ .s5= {NULL }} , \
|
||||
}
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* component carriers configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt checked_param */
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define CCPARAMS_DESC { \
|
||||
{ENB_CONFIG_STRING_FRAME_TYPE, NULL, 0, strptr:&frame_type, defstrval:"FDD", TYPE_STRING, 0}, \
|
||||
{ENB_CONFIG_STRING_TDD_CONFIG, NULL, 0, iptr:&tdd_config, defintval:3, TYPE_UINT, 0}, \
|
||||
@@ -443,6 +457,75 @@ typedef enum {
|
||||
{ENB_CONFIG_STRING_UE_TRANSMISSION_MODE, NULL, 0, iptr:&ue_TransmissionMode, defintval:1, TYPE_UINT, 0} \
|
||||
}
|
||||
|
||||
#define ENB_CONFIG_FRAME_TYPE_IDX 0
|
||||
#define ENB_CONFIG_TDD_CONFIG_IDX 1
|
||||
#define ENB_CONFIG_TDD_CONFIG_S_IDX 2
|
||||
#define ENB_CONFIG_PREFIX_TYPE_IDX 3
|
||||
#define ENB_CONFIG_PBCH_REPETITION_IDX 4
|
||||
#define ENB_CONFIG_EUTRA_BAND_IDX 5
|
||||
#define ENB_CONFIG_DOWNLINK_FREQUENCY_IDX 6
|
||||
#define ENB_CONFIG_UPLINK_FREQUENCY_OFFSET_IDX 7
|
||||
#define ENB_CONFIG_NID_CELL_IDX 8
|
||||
#define ENB_CONFIG_N_RB_DL_IDX 9
|
||||
#define ENB_CONFIG_CELL_MBSFN_IDX 10
|
||||
#define ENB_CONFIG_NB_ANT_PORTS_IDX 11
|
||||
#define ENB_CONFIG_PRACH_ROOT_IDX 12
|
||||
#define ENB_CONFIG_PRACH_CONFIG_INDEX_IDX 13
|
||||
#define ENB_CONFIG_PRACH_HIGH_SPEED_IDX 14
|
||||
#define ENB_CONFIG_PRACH_ZERO_CORRELATION_IDX 15
|
||||
#define ENB_CONFIG_PRACH_FREQ_OFFSET_IDX 16
|
||||
#define ENB_CONFIG_PUCCH_DELTA_SHIFT_IDX 17
|
||||
#define ENB_CONFIG_PUCCH_NRB_CQI_IDX 18
|
||||
#define ENB_CONFIG_PUCCH_NCS_AN_IDX 19
|
||||
#define ENB_CONFIG_PUCCH_N1_AN_IDX 20
|
||||
#define ENB_CONFIG_PDSCH_RS_EPRE_IDX 21
|
||||
#define ENB_CONFIG_PDSCH_PB_IDX 22
|
||||
#define ENB_CONFIG_PUSCH_N_SB_IDX 23
|
||||
#define ENB_CONFIG_PUSCH_HOPPINGMODE_IDX 24
|
||||
#define ENB_CONFIG_PUSCH_HOPPINGOFFSET_IDX 25
|
||||
#define ENB_CONFIG_PUSCH_ENABLE64QAM_IDX 26
|
||||
#define ENB_CONFIG_PUSCH_GROUP_HOPPING_EN_IDX 27
|
||||
#define ENB_CONFIG_PUSCH_GROUP_ASSIGNMENT_IDX 28
|
||||
#define ENB_CONFIG_PUSCH_SEQUENCE_HOPPING_EN_IDX 29
|
||||
#define ENB_CONFIG_PUSCH_NDMRS1_IDX 30
|
||||
#define ENB_CONFIG_PHICH_DURATION_IDX 31
|
||||
#define ENB_CONFIG_PHICH_RESOURCE_IDX 32
|
||||
#define ENB_CONFIG_SRS_ENABLE_IDX 33
|
||||
#define ENB_CONFIG_SRS_BANDWIDTH_CONFIG_IDX 34
|
||||
#define ENB_CONFIG_SRS_SUBFRAME_CONFIG_IDX 35
|
||||
#define ENB_CONFIG_SRS_ACKNACKST_CONFIG_IDX 36
|
||||
#define ENB_CONFIG_SRS_MAXUPPTS_IDX 37
|
||||
#define ENB_CONFIG_PUSCH_PO_NOMINAL_IDX 38
|
||||
#define ENB_CONFIG_PUSCH_ALPHA_IDX 39
|
||||
#define ENB_CONFIG_PUCCH_PO_NOMINAL_IDX 40
|
||||
#define ENB_CONFIG_MSG3_DELTA_PREAMBLE_IDX 41
|
||||
#define ENB_CONFIG_PUCCH_DELTAF_FORMAT1_IDX 42
|
||||
#define ENB_CONFIG_PUCCH_DELTAF_FORMAT1b_IDX 43
|
||||
#define ENB_CONFIG_PUCCH_DELTAF_FORMAT2_IDX 44
|
||||
#define ENB_CONFIG_PUCCH_DELTAF_FORMAT2A_IDX 45
|
||||
#define ENB_CONFIG_PUCCH_DELTAF_FORMAT2B_IDX 46
|
||||
#define ENB_CONFIG_RACH_NUM_RA_PREAMBLES_IDX 47
|
||||
#define ENB_CONFIG_RACH_PREAMBLESGROUPACONFIG_IDX 48
|
||||
#define ENB_CONFIG_RACH_SIZEOFRA_PREAMBLESGROUPA_IDX 49
|
||||
#define ENB_CONFIG_RACH_MESSAGESIZEGROUPA_IDX 50
|
||||
#define ENB_CONFIG_RACH_MESSAGEPOWEROFFSETGROUPB_IDX 51
|
||||
#define ENB_CONFIG_RACH_POWERRAMPINGSTEP_IDX 52
|
||||
#define ENB_CONFIG_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_IDX 53
|
||||
#define ENB_CONFIG_RACH_PREAMBLETRANSMAX_IDX 54
|
||||
#define ENB_CONFIG_RACH_RARESPONSEWINDOWSIZE_IDX 55
|
||||
#define ENB_CONFIG_RACH_MACCONTENTIONRESOLUTIONTIMER_IDX 56
|
||||
#define ENB_CONFIG_RACH_MAXHARQMSG3TX_IDX 57
|
||||
#define ENB_CONFIG_PCCH_DEFAULT_PAGING_CYCLE_IDX 58
|
||||
#define ENB_CONFIG_PCCH_NB_IDX 59
|
||||
#define ENB_CONFIG_BCCH_MODIFICATIONPERIODCOEFF_IDX 60
|
||||
#define ENB_CONFIG_UETIMERS_T300_IDX 61
|
||||
#define ENB_CONFIG_UETIMERS_T301_IDX 62
|
||||
#define ENB_CONFIG_UETIMERS_T310_IDX 63
|
||||
#define ENB_CONFIG_UETIMERS_T311_IDX 64
|
||||
#define ENB_CONFIG_UETIMERS_N310_IDX 65
|
||||
#define ENB_CONFIG_UETIMERS_N311_IDX 66
|
||||
#define ENB_CONFIG_UE_TRANSMISSION_MODE_IDX 67
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* SRB1 configuration parameters section name */
|
||||
@@ -569,43 +652,8 @@ typedef enum {
|
||||
|
||||
|
||||
|
||||
/* L1 configuration parameters names */
|
||||
#define CONFIG_STRING_L1_CC "num_cc"
|
||||
#define CONFIG_STRING_L1_LOCAL_N_IF_NAME "local_n_if_name"
|
||||
#define CONFIG_STRING_L1_LOCAL_N_ADDRESS "local_n_address"
|
||||
#define CONFIG_STRING_L1_REMOTE_N_ADDRESS "remote_n_address"
|
||||
#define CONFIG_STRING_L1_LOCAL_N_PORTC "local_n_portc"
|
||||
#define CONFIG_STRING_L1_REMOTE_N_PORTC "remote_n_portc"
|
||||
#define CONFIG_STRING_L1_LOCAL_N_PORTD "local_n_portd"
|
||||
#define CONFIG_STRING_L1_REMOTE_N_PORTD "remote_n_portd"
|
||||
#define CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE "tr_n_preference"
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* L1 configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define L1PARAMS_DESC { \
|
||||
{CONFIG_STRING_L1_CC, NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_mac", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_L1_LOCAL_N_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_L1_LOCAL_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_L1_REMOTE_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_L1_LOCAL_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \
|
||||
}
|
||||
#define L1_CC_IDX 0
|
||||
#define L1_TRANSPORT_N_PREFERENCE_IDX 1
|
||||
#define L1_LOCAL_N_IF_NAME_IDX 2
|
||||
#define L1_LOCAL_N_ADDRESS_IDX 3
|
||||
#define L1_REMOTE_N_ADDRESS_IDX 4
|
||||
#define L1_LOCAL_N_PORTC_IDX 5
|
||||
#define L1_REMOTE_N_PORTC_IDX 6
|
||||
#define L1_LOCAL_N_PORTD_IDX 7
|
||||
#define L1_REMOTE_N_PORTD_IDX 8
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define CONFIG_STRING_NETWORK_CONTROLLER_CONFIG "NETWORK_CONTROLLER"
|
||||
|
||||
@@ -639,64 +687,4 @@ typedef enum {
|
||||
#define CONFIG_STRING_MACRLC_CONFIG "macrlc_config"
|
||||
|
||||
|
||||
/* MACRLC configuration parameters names */
|
||||
#define CONFIG_STRING_MACRLC_CC "num_cc"
|
||||
#define CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE "tr_n_preference"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME "local_n_if_name"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS "local_n_address"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS "remote_n_address"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_N_PORTC "local_n_portc"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_N_PORTC "remote_n_portc"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_N_PORTD "local_n_portd"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_N_PORTD "remote_n_portd"
|
||||
#define CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE "tr_s_preference"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME "local_s_if_name"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS "local_s_address"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS "remote_s_address"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_PORTC "local_s_portc"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTC "remote_s_portc"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_PORTD "local_s_portd"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTD "remote_s_portd"
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* MacRLC configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define MACRLCPARAMS_DESC { \
|
||||
{CONFIG_STRING_MACRLC_CC, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_L1", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_N_PORTC, NULL, 0, uptr:NULL, defintval:50010, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50010, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_RRC", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
|
||||
}
|
||||
#define MACRLC_CC_IDX 0
|
||||
#define MACRLC_TRANSPORT_N_PREFERENCE_IDX 1
|
||||
#define MACRLC_LOCAL_N_IF_NAME_IDX 2
|
||||
#define MACRLC_LOCAL_N_ADDRESS_IDX 3
|
||||
#define MACRLC_REMOTE_N_ADDRESS_IDX 4
|
||||
#define MACRLC_LOCAL_N_PORTC_IDX 5
|
||||
#define MACRLC_REMOTE_N_PORTC_IDX 6
|
||||
#define MACRLC_LOCAL_N_PORTD_IDX 7
|
||||
#define MACRLC_REMOTE_N_PORTD_IDX 8
|
||||
#define MACRLC_TRANSPORT_S_PREFERENCE_IDX 9
|
||||
#define MACRLC_LOCAL_S_IF_NAME_IDX 10
|
||||
#define MACRLC_LOCAL_S_ADDRESS_IDX 11
|
||||
#define MACRLC_REMOTE_S_ADDRESS_IDX 12
|
||||
#define MACRLC_LOCAL_S_PORTC_IDX 13
|
||||
#define MACRLC_REMOTE_S_PORTC_IDX 14
|
||||
#define MACRLC_LOCAL_S_PORTD_IDX 15
|
||||
#define MACRLC_REMOTE_S_PORTD_IDX 16
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
@@ -131,7 +131,7 @@ int8_t flexran_get_ue_phr(mid_t mod_id, mid_t ue_id)
|
||||
|
||||
uint8_t flexran_get_ue_wcqi(mid_t mod_id, mid_t ue_id)
|
||||
{
|
||||
if (!phy_is_present(mod_id, 0)) return 0;
|
||||
if (!mac_is_present(mod_id)) return 0;
|
||||
return RC.mac[mod_id]->UE_list.UE_sched_ctrl[ue_id].dl_cqi[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
|
||||
@@ -0,0 +1,301 @@
|
||||
|
||||
/*! \file config_NB_IoT.h
|
||||
* \brief configured structures used by scheduler
|
||||
* \author NTUST BMW Lab./
|
||||
* \date 2017
|
||||
* \email:
|
||||
* \version 1.0
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_H_
|
||||
#define _CONFIG_H_
|
||||
|
||||
//#include "NB_IoT_Message_definitions.h"
|
||||
|
||||
#define NUMBER_OF_SIBS_MAX_NB_IoT 6
|
||||
|
||||
///MIB
|
||||
typedef enum operationModeInf{
|
||||
iNB_IoTand_SamePCI_r13 = 1,
|
||||
iNB_IoTand_DifferentPCI_r13 = 2,
|
||||
guardband_r13 = 3,
|
||||
standalone_r13 = 4
|
||||
}operationModeInf_t;
|
||||
|
||||
///SIB1_SchedulingInfo_NB_IoT_r13
|
||||
typedef enum si_Periodicity{
|
||||
si_Periodicity_rf64=640,
|
||||
si_Periodicity_rf128=1280,
|
||||
si_Periodicity_rf256=2560,
|
||||
si_Periodicity_rf512=5120,
|
||||
si_Periodicity_rf1024=10240,
|
||||
si_Periodicity_rf2048=20480,
|
||||
si_Periodicity_rf4096=40960
|
||||
}si_Periodicity_NB_IoT;
|
||||
|
||||
typedef enum si_RepetitionPattern{
|
||||
si_RepetitionPattern_every2ndRF=0,
|
||||
si_RepetitionPattern_every4thRF,
|
||||
si_RepetitionPattern_every8thRF,
|
||||
si_RepetitionPattern_every16thRF
|
||||
}si_RepetitionPattern_NB_IoT;
|
||||
|
||||
typedef enum sib_MappingInfo{
|
||||
sib2_v=0x1,
|
||||
sib3_v=0x2,
|
||||
sib4_v=0x4,
|
||||
sib5_v=0x8,
|
||||
sib14_v=0x10,
|
||||
sib16_v=0x20
|
||||
}sib_MappingInfo_NB_IoT;
|
||||
|
||||
typedef enum si_TB{
|
||||
si_TB_56=2,
|
||||
si_TB_120=2,
|
||||
si_TB_208=8,
|
||||
si_TB_256=8,
|
||||
si_TB_328=8,
|
||||
si_TB_440=8,
|
||||
si_TB_552=8,
|
||||
si_TB_680=8
|
||||
}si_TB_NB_IoT;
|
||||
|
||||
///RACH_ConfigCommon configuration
|
||||
|
||||
typedef enum ra_ResponseWindowSize{
|
||||
ra_ResponseWindowSize_pp2=2,
|
||||
ra_ResponseWindowSize_pp3=3,
|
||||
ra_ResponseWindowSize_pp4=4,
|
||||
ra_ResponseWindowSize_pp5=5,
|
||||
ra_ResponseWindowSize_pp6=6,
|
||||
ra_ResponseWindowSize_pp7=7,
|
||||
ra_ResponseWindowSize_pp8=8,
|
||||
ra_ResponseWindowSize_pp10=10
|
||||
}ra_ResponseWindowSize_NB_IoT;
|
||||
|
||||
typedef enum mac_ContentionResolutionTimer{
|
||||
mac_ContentionResolutionTimer_pp1=1,
|
||||
mac_ContentionResolutionTimer_pp2=2,
|
||||
mac_ContentionResolutionTimer_pp3=3,
|
||||
mac_ContentionResolutionTimer_pp4=4,
|
||||
mac_ContentionResolutionTimer_pp8=8,
|
||||
mac_ContentionResolutionTimer_pp16=16,
|
||||
mac_ContentionResolutionTimer_pp32=32,
|
||||
mac_ContentionResolutionTimer_pp64=64
|
||||
}mac_ContentionResolutionTimer_NB_IoT;
|
||||
|
||||
///NPRACH_ConfigSIB configuration
|
||||
|
||||
typedef enum nprach_Periodicity{
|
||||
nprach_Periodicity_ms40=40,
|
||||
nprach_Periodicity_ms80=80,
|
||||
nprach_Periodicity_ms160=160,
|
||||
nprach_Periodicity_ms240=240,
|
||||
nprach_Periodicity_ms320=320,
|
||||
nprach_Periodicity_ms640=640,
|
||||
nprach_Periodicity_ms1280=1280,
|
||||
nprach_Periodicity_ms2560=2560
|
||||
}nprach_Periodicity_NB_IoT;
|
||||
|
||||
typedef enum nprach_StartTime{
|
||||
nprach_StartTime_ms8=8,
|
||||
nprach_StartTime_ms16=16,
|
||||
nprach_StartTime_ms32=32,
|
||||
nprach_StartTime_ms64=64,
|
||||
nprach_StartTime_ms128=128,
|
||||
nprach_StartTime_ms256=256,
|
||||
nprach_StartTime_ms512=512,
|
||||
nprach_StartTime_ms1024=1024
|
||||
}nprach_StartTime_NB_IoT;
|
||||
|
||||
typedef enum nprach_SubcarrierOffset{
|
||||
nprach_SubcarrierOffset_n0=0,
|
||||
nprach_SubcarrierOffset_n12=12,
|
||||
nprach_SubcarrierOffset_n24=24,
|
||||
nprach_SubcarrierOffset_n36=36,
|
||||
nprach_SubcarrierOffset_n2=2,
|
||||
nprach_SubcarrierOffset_n18=18,
|
||||
nprach_SubcarrierOffset_n34=34
|
||||
}nprach_SubcarrierOffset_NB_IoT;
|
||||
|
||||
typedef enum nprach_NumSubcarriers{
|
||||
nprach_NumSubcarriers_n12=12,
|
||||
nprach_NumSubcarriers_n24=24,
|
||||
nprach_NumSubcarriers_n36=36,
|
||||
nprach_NumSubcarriers_n48=48
|
||||
}nprach_NumSubcarriers_NB_IoT;
|
||||
|
||||
typedef enum nprach_SubcarrierMSG3_RangeStart{
|
||||
nprach_SubcarrierMSG3_RangeStart_zero=0,
|
||||
nprach_SubcarrierMSG3_RangeStart_oneThird=1/3,
|
||||
nprach_SubcarrierMSG3_RangeStart_twoThird=2/3,
|
||||
nprach_SubcarrierMSG3_RangeStart_one=1
|
||||
}nprach_SubcarrierMSG3_RangeStart_NB_IoT;
|
||||
|
||||
typedef enum maxNumPreambleAttemptCE{
|
||||
maxNumPreambleAttemptCE_n3=3,
|
||||
maxNumPreambleAttemptCE_n4=4,
|
||||
maxNumPreambleAttemptCE_n5=5,
|
||||
maxNumPreambleAttemptCE_n6=6,
|
||||
maxNumPreambleAttemptCE_n7=7,
|
||||
maxNumPreambleAttemptCE_n8=8,
|
||||
maxNumPreambleAttemptCE_n10=10
|
||||
}maxNumPreambleAttemptCE_NB_IoT;
|
||||
|
||||
typedef enum numRepetitionsPerPreambleAttempt{
|
||||
numRepetitionsPerPreambleAttempt_n1=1,
|
||||
numRepetitionsPerPreambleAttempt_n2=2,
|
||||
numRepetitionsPerPreambleAttempt_n4=4,
|
||||
numRepetitionsPerPreambleAttempt_n8=8,
|
||||
numRepetitionsPerPreambleAttempt_n16=16,
|
||||
numRepetitionsPerPreambleAttempt_n32=32,
|
||||
numRepetitionsPerPreambleAttempt_n64=64,
|
||||
numRepetitionsPerPreambleAttempt_n128=128
|
||||
}numRepetitionsPerPreambleAttempt_NB_IoT;
|
||||
|
||||
typedef enum npdcch_NumRepetitions_RA{
|
||||
npdcch_NumRepetitions_RA_r1=1,
|
||||
npdcch_NumRepetitions_RA_r2=2,
|
||||
npdcch_NumRepetitions_RA_r4=4,
|
||||
npdcch_NumRepetitions_RA_r8=8,
|
||||
npdcch_NumRepetitions_RA_r16=16,
|
||||
npdcch_NumRepetitions_RA_r32=32,
|
||||
npdcch_NumRepetitions_RA_r64=64,
|
||||
npdcch_NumRepetitions_RA_r128=128,
|
||||
npdcch_NumRepetitions_RA_r256=256,
|
||||
npdcch_NumRepetitions_RA_r512=512,
|
||||
npdcch_NumRepetitions_RA_r1024=1024,
|
||||
npdcch_NumRepetitions_RA_r2048=2048
|
||||
}npdcch_NumRepetitions_RA_NB_IoT;
|
||||
|
||||
typedef enum npdcch_StartSF_CSS_RA{
|
||||
npdcch_StartSF_CSS_RA_v1dot5=3/2,
|
||||
npdcch_StartSF_CSS_RA_v2=2,
|
||||
npdcch_StartSF_CSS_RA_v4=4,
|
||||
npdcch_StartSF_CSS_RA_v8=8,
|
||||
npdcch_StartSF_CSS_RA_v16=16,
|
||||
npdcch_StartSF_CSS_RA_v32=32,
|
||||
npdcch_StartSF_CSS_RA_v48=48,
|
||||
npdcch_StartSF_CSS_RA_v64=64
|
||||
}npdcch_StartSF_CSS_RA_NB_IoT;
|
||||
|
||||
typedef enum npdcch_Offset_RA{
|
||||
zero=0,
|
||||
oneEighth=1/8,
|
||||
oneFourth=1/4,
|
||||
threeEighth=3/8
|
||||
}npdcch_Offset_RA_NB_IoT;
|
||||
|
||||
typedef enum si_window_length_e{
|
||||
ms160=160,
|
||||
ms320=320,
|
||||
ms480=480,
|
||||
ms640=640,
|
||||
ms960=960,
|
||||
ms1280=1280,
|
||||
ms1600=1600
|
||||
}si_window_length_t;
|
||||
|
||||
typedef enum si_periodicity_e{
|
||||
rf64=640,
|
||||
rf128=1280,
|
||||
rf256=2560,
|
||||
rf512=5120,
|
||||
rf1024=10240,
|
||||
rf2048=20480,
|
||||
rf4096=40960
|
||||
}si_periodicity_t;
|
||||
|
||||
typedef enum si_repetition_pattern_e{
|
||||
every2ndRF=20,
|
||||
every4thRF=40,
|
||||
every8thRF=80,
|
||||
every16thRF=160
|
||||
}si_repetition_pattern_t;
|
||||
|
||||
typedef enum si_tb_e{
|
||||
b56=2,
|
||||
b120=2,
|
||||
b208=8,
|
||||
b256=8,
|
||||
b328=8,
|
||||
b440=8,
|
||||
b552=8,
|
||||
b680=8
|
||||
}si_tb_t;
|
||||
|
||||
|
||||
typedef struct sibs_NB_IoT_sched_s{
|
||||
si_periodicity_t si_periodicity;
|
||||
si_repetition_pattern_t si_repetition_pattern;
|
||||
sib_MappingInfo_NB_IoT sib_mapping_info; //bit vector
|
||||
si_tb_t si_tb;
|
||||
|
||||
}sibs_NB_IoT_sched_t;
|
||||
|
||||
|
||||
///-------------------------------------------------------MAC--------------------------------------------------------------------///
|
||||
typedef struct sib1_NB_IoT_sched_s{
|
||||
int repetitions; // 4, 8, 16
|
||||
int starting_rf;
|
||||
}sib1_NB_IoT_sched_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
uint32_t mac_ra_ResponseWindowSize_NB_IoT;
|
||||
uint32_t mac_ContentionResolutionTimer_NB_IoT;
|
||||
|
||||
}mac_RACH_ConfigCommon_NB_IoT;
|
||||
|
||||
typedef struct {
|
||||
|
||||
uint32_t mac_nprach_Periodicity_NB_IoT;
|
||||
uint32_t mac_nprach_StartTime_NB_IoT;
|
||||
uint32_t mac_nprach_SubcarrierOffset_NB_IoT;
|
||||
uint32_t mac_nprach_NumSubcarriers_NB_IoT;
|
||||
uint32_t mac_nprach_SubcarrierMSG3_RangeStart_NB_IoT;
|
||||
uint32_t mac_maxNumPreambleAttemptCE_NB_IoT;
|
||||
uint32_t mac_numRepetitionsPerPreambleAttempt_NB_IoT;
|
||||
// css
|
||||
uint32_t mac_npdcch_NumRepetitions_RA_NB_IoT; // rmax
|
||||
uint32_t mac_npdcch_StartSF_CSS_RA_NB_IoT; // G
|
||||
uint32_t mac_npdcch_Offset_RA_NB_IoT; // alpha offset
|
||||
|
||||
}mac_NPRACH_ConfigSIB_NB_IoT;
|
||||
|
||||
typedef struct{
|
||||
//npdcch-NumRepetitions-r13
|
||||
uint32_t R_max;
|
||||
//npdcch-StartSF-USS-r13
|
||||
double G;
|
||||
//npdcch-Offset-USS-r13
|
||||
double a_offset;
|
||||
}npdcch_ConfigDedicated_NB_IoT;
|
||||
|
||||
typedef struct rrc_config_NB_IoT_s{
|
||||
|
||||
///MIB
|
||||
uint16_t schedulingInfoSIB1_NB_IoT;
|
||||
|
||||
///SIB1
|
||||
uint32_t cellIdentity_NB_IoT;
|
||||
|
||||
sib1_NB_IoT_sched_t sib1_NB_IoT_sched_config;
|
||||
///SIBS
|
||||
sibs_NB_IoT_sched_t sibs_NB_IoT_sched[NUMBER_OF_SIBS_MAX_NB_IoT];
|
||||
si_window_length_t si_window_length;
|
||||
uint32_t si_radio_frame_offset;
|
||||
|
||||
///SIB2 mac_RACH_ConfigCommon_NB_IoT
|
||||
mac_RACH_ConfigCommon_NB_IoT mac_RACH_ConfigCommon[3];
|
||||
|
||||
///SIB2 mac_NPRACH_ConfigSIB_NB_IoT
|
||||
mac_NPRACH_ConfigSIB_NB_IoT mac_NPRACH_ConfigSIB[3];
|
||||
|
||||
///NPDCCH Dedicated config
|
||||
npdcch_ConfigDedicated_NB_IoT npdcch_ConfigDedicated[3];
|
||||
|
||||
}rrc_config_NB_IoT_t;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,543 @@
|
||||
|
||||
/*! \file defs_NB_IoT.c
|
||||
* \brief MAC layer structures
|
||||
* \author NTUST BMW Lab./
|
||||
* \date 2017
|
||||
* \email:
|
||||
* \version 1.0
|
||||
*
|
||||
*/
|
||||
#ifndef __LAYER2_MAC_DEFS_NB_IOT_H__
|
||||
#define __LAYER2_MAC_DEFS_NB_IOT_H__
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
//#include "COMMON/openair_defs.h"
|
||||
#include "COMMON/platform_constants.h"
|
||||
#include "COMMON/mac_rrc_primitives.h"
|
||||
#include "PHY/LTE_TRANSPORT/defs_NB_IoT.h"
|
||||
//#include "PHY/defs.h"
|
||||
#include "PHY/defs_L1_NB_IoT.h"
|
||||
#include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h"
|
||||
#include "config_NB_IoT.h"
|
||||
// MAC definition
|
||||
#define MAX_FRAME 0xfffff
|
||||
#define NUM_FRAME 0x100000
|
||||
#define MAX_SUBFRAME 10485760
|
||||
|
||||
#define MAX(a, b) (((a)>(b))?(a):(b))
|
||||
|
||||
// RA-RNTI: 1+SFN_id>>2
|
||||
#define RA_RNTI_LOW 0x0001 // SFN_id = 0
|
||||
#define RA_RNTI_HIGH 0x0100 // SFN_id = 1023
|
||||
#define C_RNTI_LOW 0x0101
|
||||
#define C_RNTI_HIGH
|
||||
|
||||
// ULSCH LCHAN IDs
|
||||
/*!\brief LCID of extended power headroom for ULSCH */
|
||||
#define EXTENDED_POWER_HEADROOM 25
|
||||
/*!\brief LCID of power headroom for ULSCH */
|
||||
#define POWER_HEADROOM 26
|
||||
/*!\brief LCID of CRNTI for ULSCH */
|
||||
#define CRNTI 27
|
||||
/*!\brief LCID of truncated BSR for ULSCH */
|
||||
#define TRUNCATED_BSR 28
|
||||
/*!\brief LCID of short BSR for ULSCH */
|
||||
#define SHORT_BSR 29
|
||||
/*!\brief LCID of long BSR for ULSCH */
|
||||
#define LONG_BSR 30
|
||||
/*! \brief Values of CCCH LCID for DLSCH */
|
||||
#define CCCH_LCHANID 0
|
||||
/*!\brief Values of BCCH logical channel */
|
||||
#define BCCH 3 // SI
|
||||
/*!\brief Values of PCCH logical channel */
|
||||
#define PCCH 4 // Paging
|
||||
/*!\brief Value of CCCH / SRB0 logical channel */
|
||||
#define CCCH 0 // srb0
|
||||
/*!\brief DCCH / SRB1 logical channel */
|
||||
#define DCCH 1 // srb1
|
||||
/*!\brief DCCH1 / SRB2 logical channel */
|
||||
#define DCCH1 2 // srb2
|
||||
/*!\brief DTCH DRB1 logical channel */
|
||||
#define DTCH 3 // LCID
|
||||
/*!\brief MCCH logical channel */
|
||||
#define MCCH 4
|
||||
/*!\brief MTCH logical channel */
|
||||
#define MTCH 1
|
||||
// DLSCH LCHAN ID
|
||||
/*!\brief LCID of UE contention resolution identity for DLSCH*/
|
||||
#define UE_CONT_RES 28
|
||||
/*!\brief LCID of timing advance for DLSCH */
|
||||
#define TIMING_ADV_CMD 29
|
||||
/*!\brief LCID of discontinous reception mode for DLSCH */
|
||||
#define DRX_CMD 30
|
||||
/*!\brief LCID of padding LCID for DLSCH */
|
||||
#define SHORT_PADDING 31
|
||||
|
||||
|
||||
typedef enum tone_type_e
|
||||
{
|
||||
sixtone = 0,
|
||||
threetone,
|
||||
singletone1,
|
||||
singletone2,
|
||||
singletone3
|
||||
}tone_type_t;
|
||||
|
||||
typedef enum channel_NB_IoT_e
|
||||
{
|
||||
NPDCCH = 0,
|
||||
NPUSCH,
|
||||
NPDSCH
|
||||
}channel_NB_IoT_t;
|
||||
|
||||
typedef enum{
|
||||
UL = 0,
|
||||
DL
|
||||
}message_direction_t;
|
||||
|
||||
#define MAX_NUMBER_OF_UE_MAX_NB_IoT 20
|
||||
#define SCH_PAYLOAD_SIZE_MAX_NB_IoT 320
|
||||
#define MAX_NUMBER_OF_SIBs_NB_IoT 16
|
||||
|
||||
/*!\brief Values of BCCH0 logical channel for MIB*/
|
||||
#define BCCH0_NB_IoT 11 // MIB-NB_IoT
|
||||
/*!\brief Values of BCCH1 logical channel for SIBs */
|
||||
#define BCCH1_NB_IoT 12 // SI-SIB-NB_IoTs
|
||||
/*!\brief Values of PCCH logical channel */
|
||||
#define PCCH_NB_IoT 13 // Paging XXX not used for the moment
|
||||
#define MCCH_NB_IoT 14
|
||||
/*!\brief Value of CCCH / SRB0 logical channel */
|
||||
#define CCCH_NB_IoT 0 // srb0 ---> XXX exactly the same as in LTE (commented for compilation purposes)
|
||||
/*!\brief DCCH0 / SRB1bis logical channel */
|
||||
#define DCCH0_NB_IoT 3 // srb1bis
|
||||
/*!\brief DCCH1 / SRB1 logical channel */
|
||||
#define DCCH1_NB_IoT 1 // srb1 //XXX we redefine it for the SRB1
|
||||
/*!\brief DTCH0 DRB0 logical channel */
|
||||
#define DTCH0_NB_IoT 4 // DRB0
|
||||
/*!\brief DTCH1 DRB1 logical channel */
|
||||
#define DTCH1_NB_IoT 5 // DRB1
|
||||
/*Index of UE contention resoulution logical channel*/
|
||||
#define UE_CONTENTION_RESOLUTION 28
|
||||
/*Index of TIMING_ADVANCE logical channel*/
|
||||
#define TIMING_ADVANCE 29
|
||||
/*Index of DRX_COMMAND logical channel*/
|
||||
#define DRX_COMMAND 30
|
||||
/*Index of PADDING logical channel*/
|
||||
#define PADDING 31
|
||||
|
||||
|
||||
/// NPRACH-ParametersList-NB_IoT-r13 from 36.331 RRC spec defined in PHY
|
||||
/*typedef struct NPRACH_Parameters_NB_IoT{
|
||||
|
||||
/// the period time for nprach
|
||||
int nprach_Periodicity;
|
||||
/// for the start time for the NPRACH resource from 40ms-2560ms
|
||||
int nprach_StartTime;
|
||||
/// for the subcarrier of set to the NPRACH preamble from n0 - n34
|
||||
int nprach_SubcarrierOffset;
|
||||
///number of subcarriers in a NPRACH resource allowed values (n12,n24,n36,n48)
|
||||
int nprach_NumSubcarriers;
|
||||
/// where is the region that in NPRACH resource to indicate if this UE support MSG3 for multi-tone or not. from 0 - 1
|
||||
int nprach_SubcarrierMSG3_RangeStart;
|
||||
/// The max preamble transmission attempt for the CE level from 1 - 128
|
||||
int maxNumPreambleAttemptCE;
|
||||
/// Number of NPRACH repetitions per attempt for each NPRACH resource
|
||||
int numRepetitionsPerPreambleAttempt;
|
||||
/// The number of the repetition for DCI use in RAR/MSG3/MSG4 from 1 - 2048 (Rmax)
|
||||
int npdcch_NumRepetitions_RA;
|
||||
/// Starting subframe for NPDCCH Common searching space for (RAR/MSG3/MSG4)
|
||||
int npdcch_StartSF_CSS_RA;
|
||||
/// Fractional period offset of starting subframe for NPDCCH common search space
|
||||
int npdcch_Offset_RA;
|
||||
|
||||
} nprach_parameters_NB_IoT_t;*/
|
||||
|
||||
/*! \brief Downlink SCH PDU Structure */
|
||||
typedef struct {
|
||||
uint8_t payload[SCH_PAYLOAD_SIZE_MAX_NB_IoT];
|
||||
uint32_t pdu_size;
|
||||
} __attribute__ ((__packed__)) DLSCH_PDU_NB_IoT;
|
||||
|
||||
/*! \brief eNB template for UE context information */
|
||||
typedef struct {
|
||||
// C-RNTI of UE
|
||||
rnti_t rnti;
|
||||
// UE CE level
|
||||
int CE_level;
|
||||
// Direction of transmission(DL:0\UL:1\NONE:-1)
|
||||
int32_t direction;
|
||||
// DCI Reptition
|
||||
uint32_t R_dci;
|
||||
// MAX repetition
|
||||
uint32_t R_max;
|
||||
|
||||
// HARQ round
|
||||
uint32_t HARQ_round;
|
||||
/*Downlink information*/
|
||||
|
||||
/// DLSCH pdu
|
||||
DLSCH_PDU_NB_IoT DLSCH_pdu;
|
||||
// PDU size
|
||||
uint32_t DLSCH_pdu_size;
|
||||
// Data Reptition
|
||||
uint32_t R_dl;
|
||||
// MCS index
|
||||
uint32_t I_mcs_dl;
|
||||
// total downlink buffer DCCH0_NB_IoT
|
||||
uint32_t dl_buffer_DCCH0_NB_IoT;
|
||||
// NDI
|
||||
int oldNDI_DL;
|
||||
//HARQ ACK/NACK repetition
|
||||
uint32_t R_harq;
|
||||
|
||||
/*Uplink information*/
|
||||
int oldNDI_UL;
|
||||
// Uplink data repeat, now just follow the rach repeat number
|
||||
uint32_t R_ul;
|
||||
// PHR value (0-3)
|
||||
uint32_t PHR;
|
||||
// The uplink data size from BSR or DVI
|
||||
uint32_t ul_total_buffer;
|
||||
// Determine if this UE support multi-tone transmission or not
|
||||
int multi_tone;
|
||||
// Next UE_template ID
|
||||
int next;
|
||||
// Previous UE_template ID
|
||||
int prev;
|
||||
// MSG4 complete
|
||||
int RRC_connected;
|
||||
// UE active flag
|
||||
int active;
|
||||
|
||||
} UE_TEMPLATE_NB_IoT;
|
||||
|
||||
/*36331 NPDCCH-ConfigDedicated-NB_IoT*/
|
||||
typedef struct{
|
||||
//npdcch-NumRepetitions-r13
|
||||
uint32_t R_max;
|
||||
//npdcch-StartSF-USS-r13
|
||||
double G;
|
||||
//npdcch-Offset-USS-r13
|
||||
double a_offset;
|
||||
//NPDCCH period
|
||||
uint32_t T;
|
||||
//Starting subfrane of Search Space which is mod T
|
||||
uint32_t ss_start_uss;
|
||||
}NPDCCH_config_dedicated_NB_IoT_t;
|
||||
|
||||
|
||||
/*! \brief UE list used by eNB to order UEs/CC for scheduling*/
|
||||
typedef struct {
|
||||
|
||||
/// DCI template and MAC connection parameters for UEs
|
||||
UE_TEMPLATE_NB_IoT UE_template_NB_IoT[MAX_NUMBER_OF_UE_MAX_NB_IoT];
|
||||
|
||||
/// NPDCCH Period and searching space info
|
||||
NPDCCH_config_dedicated_NB_IoT_t NPDCCH_config_dedicated;
|
||||
//int next[MAX_NUMBER_OF_UE_MAX_NB_IoT];
|
||||
// -1:No UE in list
|
||||
int head;
|
||||
// -1:No UE in list
|
||||
int tail;
|
||||
int num_UEs;
|
||||
//boolean_t active[MAX_NUMBER_OF_UE_MAX_NB_IoT];
|
||||
|
||||
} UE_list_NB_IoT_t;
|
||||
|
||||
|
||||
typedef struct{
|
||||
|
||||
// flag to indicate scheduing MIB-NB_IoT
|
||||
uint8_t flag_MIB;
|
||||
// flag to indicate scheduling SIB1-NB_IoT
|
||||
uint8_t flag_SIB1;
|
||||
// flag to indicate scheduling SIBs-NB_IoT
|
||||
uint8_t flag_SIBs[MAX_NUMBER_OF_SIBs_NB_IoT];
|
||||
// flag to indicate scheduling type2 NPDCCH CSS with different CE level
|
||||
uint8_t flag_type2_css[3];
|
||||
// flag to indicate scheduling type1 NPDCCH CSS with different CE level
|
||||
uint8_t flag_type1_css[3];
|
||||
// flag to indicate scheduling NPDCCH USS with UE list
|
||||
uint8_t flag_uss[MAX_NUMBER_OF_UE_MAX_NB_IoT];
|
||||
// flag to indicate scheduling sib1/MIB
|
||||
uint8_t flag_fix_scheduling;
|
||||
// number of the type2 css to schedule in this period
|
||||
uint8_t num_type2_css_run;
|
||||
// number of the type1 css to schedule in this period
|
||||
uint8_t num_type1_css_run;
|
||||
// number of the uss to schedule in this period
|
||||
uint8_t num_uss_run;
|
||||
|
||||
}scheduling_flag_t;
|
||||
|
||||
typedef struct available_resource_UL_s{
|
||||
|
||||
///Resource start subframe
|
||||
uint32_t start_subframe;
|
||||
///Resource end subframe
|
||||
uint32_t end_subframe;
|
||||
// pointer to next node
|
||||
struct available_resource_UL_s *next, *prev;
|
||||
|
||||
}available_resource_UL_t;
|
||||
|
||||
typedef struct available_resource_DL_s{
|
||||
uint32_t start_subframe;
|
||||
uint32_t end_subframe;
|
||||
|
||||
struct available_resource_DL_s *next, *prev;
|
||||
}available_resource_DL_t;
|
||||
|
||||
/*Structure used for scheduling*/
|
||||
typedef struct{
|
||||
//resource position info.
|
||||
uint32_t sf_end,sf_start;
|
||||
//resource position info. separate by HyperSF, Frame, Subframe
|
||||
uint32_t start_h, end_h;
|
||||
uint32_t start_f, end_f;
|
||||
uint32_t start_sf, end_sf;
|
||||
//whcih available resource node is used
|
||||
available_resource_DL_t *node;
|
||||
}sched_temp_DL_NB_IoT_t;
|
||||
|
||||
/*!\brief MAC subheader short with 7bit Length field */
|
||||
typedef struct {
|
||||
uint8_t LCID:5; // octet 1 LSB
|
||||
uint8_t E:1;
|
||||
uint8_t F2:1;
|
||||
uint8_t R:1; // octet 1 MSB
|
||||
uint8_t L:7; // octet 2 LSB
|
||||
uint8_t F:1; // octet 2 MSB
|
||||
} __attribute__((__packed__))SCH_SUBHEADER_SHORT_NB_IoT;
|
||||
typedef struct {
|
||||
uint8_t LCID:5; // octet 1 LSB
|
||||
uint8_t E:1;
|
||||
uint8_t F2:1;
|
||||
uint8_t R:1; // octet 1 MSB
|
||||
uint8_t L_MSB:7;
|
||||
uint8_t F:1; // octet 2 MSB
|
||||
uint8_t L_LSB:8;
|
||||
} __attribute__((__packed__))SCH_SUBHEADER_LONG_NB_IoT;
|
||||
typedef struct {
|
||||
uint8_t LCID:5; // octet 1 LSB
|
||||
uint8_t E:1;
|
||||
uint8_t F2:1;
|
||||
uint8_t R:1; // octet 1 MSB
|
||||
uint8_t L_MSB:8; // octet 2 MSB
|
||||
uint8_t L_LSB:8;
|
||||
} __attribute__((__packed__))SCH_SUBHEADER_LONG_EXTEND_NB_IoT;
|
||||
/*!\brief MAC subheader short without length field */
|
||||
typedef struct {
|
||||
uint8_t LCID:5;
|
||||
uint8_t F2:1;
|
||||
uint8_t E:1;
|
||||
uint8_t R:1;
|
||||
} __attribute__((__packed__))SCH_SUBHEADER_FIXED_NB_IoT;
|
||||
|
||||
|
||||
/*! \brief Uplink SCH PDU Structure */
|
||||
typedef struct {
|
||||
int8_t payload[SCH_PAYLOAD_SIZE_MAX_NB_IoT]; /*!< \brief SACH payload */
|
||||
uint16_t Pdu_size;
|
||||
} __attribute__ ((__packed__)) ULSCH_PDU_NB_IoT;
|
||||
|
||||
typedef struct {
|
||||
uint8_t PH:6;
|
||||
uint8_t R:2;
|
||||
} __attribute__((__packed__))POWER_HEADROOM_CMD_NB_IoT;
|
||||
|
||||
typedef struct {
|
||||
uint8_t RAPID:6;
|
||||
uint8_t T:1;
|
||||
uint8_t E:1;
|
||||
} __attribute__((__packed__))RA_HEADER_RAPID_NB_IoT;
|
||||
|
||||
/*Structure used for UL scheduling*/
|
||||
typedef struct{
|
||||
//resource position info.
|
||||
uint32_t sf_end, sf_start;
|
||||
//resource position info. separate by HyperSF, Frame, Subframe
|
||||
//uint32_t start_h, end_h;
|
||||
//uint32_t start_f, end_f;
|
||||
//uint32_t start_sf, end_sf;
|
||||
// information for allocating the resource
|
||||
int tone;
|
||||
int scheduling_delay;
|
||||
int subcarrier_indication;
|
||||
int ACK_NACK_resource_field;
|
||||
available_resource_UL_t *node;
|
||||
}sched_temp_UL_NB_IoT_t;
|
||||
|
||||
typedef struct Available_available_resource_DL{
|
||||
|
||||
///Available Resoruce for sixtone
|
||||
available_resource_UL_t *sixtone_Head;//, *sixtone_npusch_frame;
|
||||
uint32_t sixtone_end_subframe;
|
||||
///Available Resoruce for threetone
|
||||
available_resource_UL_t *threetone_Head;//, *threetone_npusch_frame;
|
||||
uint32_t threetone_end_subframe;
|
||||
///Available Resoruce for singletone1
|
||||
available_resource_UL_t *singletone1_Head;//, *singletone1_npusch_frame;
|
||||
uint32_t singletone1_end_subframe;
|
||||
///Available Resoruce for singletone2
|
||||
available_resource_UL_t *singletone2_Head;//, *singletone2_npusch_frame;
|
||||
uint32_t singletone2_end_subframe;
|
||||
///Available Resoruce for singletone3
|
||||
available_resource_UL_t *singletone3_Head;//, *singletone3_npusch_frame;
|
||||
uint32_t singletone3_end_subframe;
|
||||
|
||||
}available_resource_tones_UL_t;
|
||||
|
||||
typedef struct schedule_result{
|
||||
// The subframe read by output handler
|
||||
uint32_t output_subframe;
|
||||
// SDU length
|
||||
uint32_t sdu_length;
|
||||
// MAC PDU
|
||||
uint8_t *DLSCH_pdu;
|
||||
// The data direction indicated by this DCI
|
||||
uint8_t direction;
|
||||
// pointer to DCI
|
||||
void *DCI_pdu;
|
||||
// when all the procedure related to this DCI, enable this flag
|
||||
boolean_t DCI_release;
|
||||
// Indicate the channel which to transmit
|
||||
channel_NB_IoT_t channel;
|
||||
// rnti
|
||||
rnti_t rnti;
|
||||
// 0 = TC-RNTI , 1 = RA-RNTI, 2 = P-RNTI, 3 = others
|
||||
uint8_t rnti_type;
|
||||
// 0 = data, 1 = ACK/NACK
|
||||
uint8_t npusch_format;
|
||||
//HARQ ACK/NACK repetition
|
||||
uint32_t R_harq;
|
||||
// pointer to next node
|
||||
struct schedule_result *next;
|
||||
|
||||
uint32_t end_subframe;
|
||||
|
||||
uint8_t *rar_buffer;
|
||||
|
||||
}schedule_result_t;
|
||||
|
||||
/*Flag structure used for trigger each scheduler*/
|
||||
typedef struct{
|
||||
scheduling_flag_t scheduling_flag;
|
||||
//sched_temp_DL_NB_IoT_t sched_result_DL;
|
||||
//resource grid for Uplink
|
||||
available_resource_tones_UL_t *UL_resource;
|
||||
//scheduling result read by output handler
|
||||
schedule_result_t *schedule_result_list_UL;
|
||||
schedule_result_t *schedule_result_list_DL;
|
||||
}SCHEDULE_NB_IoT_t;
|
||||
|
||||
typedef struct{
|
||||
uint32_t num_dlsf_per_period;
|
||||
uint16_t *sf_to_dlsf_table;
|
||||
uint16_t *dlsf_to_sf_table;
|
||||
}DLSF_INFO_t;
|
||||
|
||||
typedef enum ce_level_e{
|
||||
ce0=0,
|
||||
ce1,
|
||||
ce2,
|
||||
ce_level_total
|
||||
}ce_level_t;
|
||||
|
||||
|
||||
|
||||
/*! \brief eNB template for the Random access information */
|
||||
typedef struct RA_TEMPLATE_NB_IoT_s{
|
||||
|
||||
boolean_t active;
|
||||
uint32_t msg3_retransmit_count;
|
||||
uint32_t msg4_retransmit_count;
|
||||
uint16_t ta;
|
||||
uint8_t preamble_index;
|
||||
ce_level_t ce_level;
|
||||
rnti_t ue_rnti;
|
||||
rnti_t ra_rnti;
|
||||
struct RA_TEMPLATE_NB_IoT_s *next, *prev;
|
||||
boolean_t wait_msg4_ack;
|
||||
boolean_t wait_msg3_ack;
|
||||
uint8_t rar_buffer[7];
|
||||
|
||||
} RA_TEMPLATE_NB_IoT;
|
||||
|
||||
typedef struct RA_template_list_s{
|
||||
RA_TEMPLATE_NB_IoT *head;
|
||||
RA_TEMPLATE_NB_IoT *tail;
|
||||
}RA_template_list_t;
|
||||
|
||||
|
||||
/*! \brief top level eNB MAC structure */
|
||||
typedef struct eNB_MAC_INST_NB_IoT_s {
|
||||
/// Ethernet parameters for northbound midhaul interface
|
||||
eth_params_t eth_params_n;
|
||||
/// Ethernet parameters for fronthaul interface
|
||||
eth_params_t eth_params_s;
|
||||
|
||||
uint8_t Mod_id;
|
||||
// System
|
||||
uint32_t hyper_system_frame;
|
||||
uint32_t system_frame;
|
||||
uint32_t sub_frame;
|
||||
|
||||
uint32_t current_subframe;
|
||||
/// Pointer to IF module instance for PHY
|
||||
IF_Module_t *if_inst;
|
||||
// RA
|
||||
RA_template_list_t RA_msg2_list;
|
||||
RA_template_list_t RA_msg3_list;
|
||||
RA_template_list_t RA_msg4_list;
|
||||
|
||||
RA_TEMPLATE_NB_IoT RA_template[MAX_NUMBER_OF_UE_MAX_NB_IoT];
|
||||
|
||||
//int32_t last_tx_subframe;
|
||||
|
||||
// for tool
|
||||
int32_t sib1_flag[64];
|
||||
int32_t sib1_count[64];
|
||||
int32_t sib1_period;
|
||||
uint16_t dlsf_table[64];
|
||||
int32_t sibs_table[256];
|
||||
|
||||
// channel config
|
||||
|
||||
//USS list
|
||||
//Number of USS period is used
|
||||
int num_uss_list;
|
||||
UE_list_NB_IoT_t *UE_list_spec;
|
||||
|
||||
scheduling_flag_t scheduling_flag;
|
||||
|
||||
uint32_t schedule_subframe_DL;
|
||||
uint32_t schedule_subframe_UL;
|
||||
|
||||
rrc_config_NB_IoT_t rrc_config;
|
||||
|
||||
nfapi_config_request_t config;
|
||||
|
||||
IF_Module_NB_IoT_t *if_inst_NB_IoT;
|
||||
} eNB_MAC_INST_NB_IoT;
|
||||
|
||||
// actually not here, but for now put it here
|
||||
typedef struct {
|
||||
uint32_t bytes_in_buffer; /*!< \brief Bytes buffered in RLC protocol instance. */
|
||||
uint32_t pdus_in_buffer; /*!< \brief Number of PDUs buffered in RLC protocol instance (OBSOLETE). */
|
||||
uint32_t head_sdu_creation_time; /*!< \brief Head SDU creation time. */
|
||||
uint32_t head_sdu_remaining_size_to_send; /*!< \brief remaining size of sdu: could be the total size or the remaining size of already segmented sdu */
|
||||
boolean_t head_sdu_is_segmented; /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */
|
||||
} mac_rlc_status_resp_NB_IoT_t;
|
||||
|
||||
// global variables
|
||||
|
||||
nprach_parameters_NB_IoT_t nprach_list[3];
|
||||
|
||||
//DLSF Table
|
||||
DLSF_INFO_t DLSF_information;
|
||||
|
||||
#endif /*__LAYER2_MAC_DEFS_NB_IoT_H__ */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user