diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 311f3952aa..0dc8d3051b 100755
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,8 +2,6 @@ job1:
script:
- date
- pwd
- - echo $OAI_USER
- - echo $OAI_PASS
- echo $OAI_TEST_CASE_GROUP
- echo $MACHINELIST
- echo $MACHINELISTGENERIC
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index e3a5f02b42..6058fb9436 100755
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -237,6 +237,9 @@ add_boolean_option(XFORMS False "This adds the possibility to see t
add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
add_boolean_option(T_TRACER False "Activate the T tracer, a debugging/monitoring framework" )
add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs")
+add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace")
+add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace")
+add_boolean_option(DISABLE_LOG_X False "Deactivate all LOG_* macros")
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
@@ -485,8 +488,24 @@ add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4")
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "EXMIMO" "OAI_USRP" "OAI_BLADERF" "CPRIGW" "OAI_LMSSDR")
add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET")
-
-
+#NOKIA config enhancement
+set (CONFIG_ROOTDIR
+ ${OPENAIR_DIR}/common/config
+ )
+set (CONFIG_SOURCES
+ ${CONFIG_ROOTDIR}/config_load_configmodule.c
+ ${CONFIG_ROOTDIR}/config_userapi.c
+ ${CONFIG_ROOTDIR}/config_cmdline.c
+ )
+set (CONFIG_LIBCONFIG_SOURCES
+ ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c
+ )
+add_library(params_libconfig MODULE ${CONFIG_LIBCONFIG_SOURCES} )
+target_link_libraries(params_libconfig config)
+# shared library loader
+set (SHLIB_LOADER_SOURCES
+ ${OPENAIR_DIR}/common/utils/load_module_shlib.c
+)
# include RF devices / transport protocols library modules
######################################################################
@@ -530,6 +549,19 @@ set(TPLIB_ETHERNET_SOURCE
)
add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
+include_directories("${OPENAIR_TARGETS}/ARCH/mobipass/")
+set(TPLIB_MOBIPASS_SOURCE
+ ${OPENAIR_TARGETS}/ARCH/mobipass/interface.c
+ ${OPENAIR_TARGETS}/ARCH/mobipass/mobipass.c
+ ${OPENAIR_TARGETS}/ARCH/mobipass/queues.c
+ )
+add_library(oai_mobipass MODULE ${TPLIB_MOBIPASS_SOURCE} )
+
+# Hide all functions/variables in the mobipass library.
+# Use __attribute__((__visibility__("default")))
+# in the source code to unhide a function/variable.
+get_target_property(mobipas_cflags oai_mobipass COMPILE_FLAGS)
+set_target_properties(oai_mobipass PROPERTIES COMPILE_FLAGS "${mobipass_cflags} -fvisibility=hidden")
##########################################################
@@ -956,6 +988,7 @@ add_library(SECU_CN ${SECU_CN_SRC})
# Scheduler
################################"
set(SCHED_SRC
+ ${OPENAIR1_DIR}/SCHED/fapi_l1.c
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_eNb.c
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_ue.c
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c
@@ -1638,9 +1671,25 @@ else()
endif()
# Atlas is required by some packages, but not found in pkg-config
-if(EXISTS "/usr/include/atlas/cblas.h")
+# So, here are some hacks here. Hope this gets fixed in future!
+if(EXISTS "/usr/include/atlas/cblas.h" OR EXISTS "/usr/include/cblas.h")
include_directories("/usr/include/atlas")
- list(APPEND ATLAS_LIBRARIES cblas atlas lapack)
+ LINK_DIRECTORIES("/usr/lib64")
+ LINK_DIRECTORIES("/usr/lib64/atlas") #Added because atlas libraries in CentOS 7 are here!
+
+ if(EXISTS "/usr/lib64/libblas.so" OR EXISTS "/usr/lib/libblas.so") #Case for CentOS7
+ list(APPEND ATLAS_LIBRARIES blas)
+ else() # Case for Ubuntu
+ list(APPEND ATLAS_LIBRARIES cblas)
+ endif()
+
+ if(EXISTS "/usr/lib/atlas/libtatlas.so" OR EXISTS "/usr/lib64/atlas/libtatlas.so") #Case for CentOS7
+ list(APPEND ATLAS_LIBRARIES tatlas)
+ else()
+ list(APPEND ATLAS_LIBRARIES atlas) #Case for Ubuntu
+ endif()
+
+ list(APPEND ATLAS_LIBRARIES lapack)
else()
message("No Blas/Atlas libs found, some targets will fail")
endif()
@@ -1721,6 +1770,8 @@ add_executable(lte-softmodem
${XFORMS_SOURCE}
${XFORMS_SOURCE_SOFTMODEM}
${T_SOURCE}
+ ${CONFIG_SOURCES}
+ ${SHLIB_LOADER_SOURCES}
)
target_link_libraries (lte-softmodem -ldl
@@ -1755,6 +1806,8 @@ add_executable(lte-softmodem-nos1
${XFORMS_SOURCE}
${XFORMS_SOURCE_SOFTMODEM}
${T_SOURCE}
+ ${CONFIG_SOURCES}
+ ${SHLIB_LOADER_SOURCES}
)
target_link_libraries (lte-softmodem-nos1
-Wl,--start-group
@@ -1842,6 +1895,8 @@ add_executable(oaisim
${OPENAIR_TARGETS}/COMMON/create_tasks.c
${XFORMS_SOURCE}
${T_SOURCE}
+ ${CONFIG_SOURCES}
+ ${SHLIB_LOADER_SOURCES}
)
@@ -1885,6 +1940,8 @@ add_executable(oaisim_nos1
${OPENAIR_DIR}/common/utils/system.c
${XFORMS_SOURCE}
${T_SOURCE}
+ ${CONFIG_SOURCES}
+ ${SHLIB_LOADER_SOURCES}
)
target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER)
target_link_libraries (oaisim_nos1
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 0c80e960a4..d9ed38a4ec 100755
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -941,9 +941,14 @@
(Test 7b, 5 MHz, R3-1.FDD (MCS 15), ETU70, 1.4 dB (30%)),
(Test 10, 5 MHz, R6.FDD (MCS 25), EVA5, 17.4 dB (70%)),
(Test 10b, 5 MHz, R6-1.FDD (MCS 24,18 PRB), EVA5, 17.5dB (70%)),
- (Test 11, 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%))
+ (Test 11, 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%)),
+ (Test 11b, 10 MHz, R7-1.FDD (MCS 25), EVA5, 16.7dB (70%)),
+ (Test 15, 20 MHz, R.9 FDD (MCS 26), EVA5, 17.6dB (70%)),
+ (Test 15b, 20 MHz, R.9-2 FDD (MCS 26, 17PRB), EVA5, 17.3dB (70%)),
+ (Test 15c, 20 MHz, R.9-1 FDD (MCS 26, 83 PRB), EVA5, 16.6dB (70%)),
+
(TM2 Test 1 10 MHz, R.11 FDD (MCS 14), EVA5, 6.8 dB (70%)),
- (TM2 Test 1b 20 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)),
+ (TM2 Test 1b 5 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)),
$OPENAIR_DIR/cmake_targets/build_oai
@@ -960,6 +965,9 @@
-m25 -gF -s17.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70
-m25 -gF -s17.5 -w1.0 -f.2 -n500 -B25 -c3 -z2 -r1022 -O70
-m26 -gF -s17.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70
+ -m26 -gF -s17.6 -w1.0 -f.2 -n500 -B100 -c2 -z2 -O70
+ -m26 -gF -s17.3 -w1.0 -f.2 -n500 -B100 -c2 -z2 -r1600 -O70
+ -m26 -gF -s16.6 -w1.0 -f.2 -n500 -B100 -c2 -z2 -r1899 -O70
-m14 -gF -s6.8 -w1.0 -f.2 -n500 -B50 -c2 -x2 -y2 -z2 -O70
-m13 -gF -s5.9 -w1.0 -f.2 -n500 -B25 -c3 -x2 -y2 -z2 -O70
dlsim.test1 dlsim.test5 dlsim.test6 dlsim.test6b dlsim.test7 dlsim.test7b dlsim.test10 dlsim.test10b dlsim.test11 dlsim.TM2_test1 dlsim.TM2_test1b
diff --git a/cmake_targets/autotests/testsuite_ue_noS1_TCL.xml b/cmake_targets/autotests/testsuite_ue_noS1_TCL.xml
index 971819ade5..43aef8c322 100755
--- a/cmake_targets/autotests/testsuite_ue_noS1_TCL.xml
+++ b/cmake_targets/autotests/testsuite_ue_noS1_TCL.xml
@@ -7,8 +7,8 @@
https://gitlab.eurecom.fr/oai/openair-cn.git -->
- eNB_phy-test_fix_20MHz
- eNB_phy-test_fix_20MHz -->
+ develop
+ develop -->
@@ -71,7 +71,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -96,6 +96,59 @@
unit_of_meas = ""/>
+
+
+
+ lte-softmodem-noS1
+
+ TCT-Labo1
+ TCT-Labo3
+ 300
+ /tmp
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c -w USRP --eNB --noS1
+ source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB
+
+ $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.25PRB.usrpb210.conf -W -m 0 --single-thread-disable --phy-test
+
+
+
+
+ False
+
+ /tmp
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c --UE -w USRP --noS1 --eNB --ue-autotest-trace
+ source ./targets/bin/init_nas_nos1 UE
+
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r25 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S --phy-test
+
+
+
+
+
+ False
+
+ UE_USRP.NOS1.PHYTEST_PERF.BAND40.5MHZ.MCS00
+ 11
+
+
+
+
+
lte-softmodem-noS1
@@ -173,7 +226,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -280,7 +333,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -382,7 +435,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -484,7 +537,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -586,7 +639,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -688,7 +741,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -790,7 +843,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -893,7 +946,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -995,7 +1048,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1097,7 +1150,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1199,7 +1252,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1301,7 +1354,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1404,7 +1457,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1506,7 +1559,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1608,7 +1661,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1762,7 +1815,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1865,7 +1918,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -1968,7 +2021,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -2074,7 +2127,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2098,6 +2151,54 @@
+
+ lte-softmodem-noS1
+
+ TCT-Labo1
+ TCT-Labo3
+ 300
+ /tmp
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c -w USRP --eNB --noS1
+ source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB
+
+ $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.50PRB.usrpb210.conf -W -m 28
+ sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 18M
+
+
+
+ False
+
+ /tmp
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c --UE -w USRP --noS1 --eNB --ue-autotest-trace
+ source ./targets/bin/init_nas_nos1 UE
+
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r50 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S
+
+ iperf -s -i 1 -u
+
+ 200
+
+ False
+ UE_USRP.NOS1.DATA_IPERF.BAND40.10MHZ.MCS28
+ 36
+
+
+
+
+
@@ -2441,7 +2542,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2518,7 +2619,8 @@
-
+
+
lte-softmodem-noS1
TCT-Labo1
@@ -2544,7 +2646,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2568,6 +2670,54 @@
+
+ lte-softmodem-noS1
+
+ TCT-Labo1
+ TCT-Labo3
+ 300
+ /tmp
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c -w USRP --eNB --noS1
+ source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB
+
+ $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.25PRB.usrpb210.conf -W -m 0
+ sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 300K
+
+
+
+ False
+
+ /tmp
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c --UE -w USRP --noS1 --eNB --ue-autotest-trace
+ source ./targets/bin/init_nas_nos1 UE
+
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r25 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S
+
+ iperf -s -i 1 -u
+
+ 200
+
+ False
+ UE_USRP.NOS1.DATA_IPERF.BAND40.5MHZ.MCS00
+ 36
+
+
+
+
+
lte-softmodem-noS1
@@ -2595,7 +2745,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2645,7 +2795,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2696,7 +2846,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2719,6 +2869,54 @@
unit_of_meas = ""/>
+
+
+ lte-softmodem-noS1
+
+ TCT-Labo1
+ TCT-Labo3
+ 300
+ /tmp
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c -w USRP --eNB --noS1
+ source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB
+
+ $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.25PRB.usrpb210.conf -W -m 0
+ sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 1200K
+
+
+
+ False
+
+ /tmp
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c --UE -w USRP --noS1 --eNB --ue-autotest-trace
+ source ./targets/bin/init_nas_nos1 UE
+
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r25 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S
+
+ iperf -s -i 1 -u
+
+ 200
+
+ False
+ UE_USRP.NOS1.DATA_IPERF.BAND40.5MHZ.MCS16
+ 36
+
+
+
+
lte-softmodem-noS1
@@ -2746,7 +2944,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2796,7 +2994,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2846,7 +3044,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -2905,7 +3103,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -2956,7 +3154,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test
@@ -3008,7 +3206,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -3037,6 +3235,55 @@
+
+ lte-softmodem-noS1
+
+ TCT-Labo1
+ TCT-Labo3
+ 300
+ /tmp
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c -w USRP --eNB --noS1
+ source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB
+
+ $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.25PRB.usrpb210.conf -W -m 28
+ sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 8220K
+
+
+
+ False
+
+ /tmp
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c --UE -w USRP --noS1 --eNB --ue-autotest-trace
+ source ./targets/bin/init_nas_nos1 UE
+
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r25 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S
+
+ iperf -s -i 1 -u
+
+ 200
+
+ False
+ UE_USRP.NOS1.DATA_IPERF.BAND40.5MHZ.MCS28
+ 36
+
+
+
+
+
+
lte-softmodem-noS1
@@ -3066,7 +3313,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1 -u
@@ -3116,7 +3363,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1
@@ -3171,7 +3418,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 85 -A 24 --ue-rxgain 100 -S
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S
iperf -s -i 1
@@ -3228,7 +3475,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S --phy-test
@@ -3254,6 +3501,9 @@
+
+
+
lte-softmodem-noS1
@@ -3280,7 +3530,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S --phy-test
@@ -3332,7 +3582,7 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 -S --phy-test
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S --phy-test
@@ -3373,7 +3623,7 @@
$OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 0
- sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M
+ sleep 60;iperf -c 10.0.1.9 -i 1 -u -b 2M
@@ -3385,11 +3635,11 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100
iperf -s -i 1 -u
- 600
+ 200
False
$OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 18
- sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 24M
+ sleep 60;iperf -c 10.0.1.9 -i 1 -u -b 24M
@@ -3435,11 +3685,11 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100
iperf -s -i 1 -u
- 600
+ 200
False
$OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 28
- sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 55M
+ sleep 60;iperf -c 10.0.1.9 -i 1 -u -b 55M
@@ -3486,11 +3736,11 @@
-c --UE -w USRP --noS1 --eNB --ue-autotest-trace
source ./targets/bin/init_nas_nos1 UE
- sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100
iperf -s -i 1 -u
- 600
+ 200
False
36
+
+ lte-softmodem-noS1
+
+ TCT-Labo1
+ TCT-Labo3
+ 300
+ /tmp
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c -w USRP --eNB --noS1
+ source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB
+
+ $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.100PRB.usrpb210.conf -W -m 28
+ sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 33M
+
+
+
+ False
+ /tmp
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ -c --UE -w USRP --noS1 --eNB --ue-autotest-trace
+ source ./targets/bin/init_nas_nos1 UE
+
+ sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S
+
+ iperf -s -i 1 -u
+
+ 200
+
+ False
+ UE_USRP.NOS1.DATA_IPERF.BAND40.20MHZ.MCS28
+ 36
+
+
+
+
diff --git a/cmake_targets/autotests/v2/actions/alu_hss.bash b/cmake_targets/autotests/v2/actions/alu_hss.bash
index be32fe9eb0..1fb719c25b 100755
--- a/cmake_targets/autotests/v2/actions/alu_hss.bash
+++ b/cmake_targets/autotests/v2/actions/alu_hss.bash
@@ -1,4 +1,5 @@
sudo rmmod nasmesh || true
sudo rmmod ue_ip || true
sudo /opt/ltebox/tools/stop_ltebox || true
+sudo killall -9 hss_sim || true
sudo /opt/hss_sim0609/starthss_real
diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf
index c25b954e1a..e09e068c63 100755
--- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf
index 0773f9c267..1f992daba2 100755
--- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf
index 024be3b775..bb7df8b72d 100755
--- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf
index 3b15799eb7..ff97827b57 100755
--- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf
index 869c7f05f1..ebb9e417e7 100755
--- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf
index d3c1a5354a..4e89102766 100755
--- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf
index 81eed5f4b1..beaf5ae0f1 100755
--- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf
+++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -29;
diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf
index 4b4190f8ce..b0efe66e14 100755
--- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf
+++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -29;
diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf
index 99b9a66226..1b33c7b3c2 100755
--- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf
+++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -29;
diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf
index 4cc40b6d84..dc64a69c00 100755
--- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf
+++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -29;
diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf
index 787cedb18d..c93ce24d08 100755
--- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf
+++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -29;
diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf
index d9d46bf944..57f7ef83b9 100755
--- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf
+++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf
@@ -47,7 +47,7 @@ eNBs =
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
- pucch_nRB_CQI = 1;
+ pucch_nRB_CQI = 0;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -29;
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 93a7ac073e..01d94da73e 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -61,9 +61,12 @@ BUILD_DOXYGEN=0
T_TRACER="False"
DISABLE_HARDWARE_DEPENDENCY="False"
CMAKE_BUILD_TYPE=""
+CMAKE_CMD="$CMAKE"
UE_AUTOTEST_TRACE="False"
+UE_DEBUG_TRACE="False"
+UE_TIMING_TRACE="False"
+DISABLE_LOG_X="False"
BUILD_ECLIPSE=0
-CMAKE_CMD='cmake'
trap handle_ctrl_c INT
function print_help() {
@@ -147,6 +150,12 @@ Options
Disable HW dependency during installation
--ue-autotest-trace
Enable specific traces for UE autotest framework
+--ue-trace
+ Enable traces for UE debugging
+--ue-timing
+ Enable traces for timing
+--disable-log
+ Disable all LOG_* macros
--build-eclipse
Build eclipse project files. Paths are auto corrected by fixprj.sh
Usage (first build):
@@ -316,6 +325,18 @@ function main() {
UE_AUTOTEST_TRACE="True"
echo_info "Enabling autotest specific trace for UE"
shift 1;;
+ --ue-trace)
+ UE_DEBUG_TRACE="True"
+ echo_info "Enabling UE trace for debug"
+ shift 1;;
+ --ue-timing)
+ UE_TIMING_TRACE="True"
+ echo_info "Enabling UE timing trace"
+ shift 1;;
+ --disable-log)
+ DISABLE_LOG_X="True"
+ echo_info "Disabling all LOG_* traces"
+ shift 1;;
--uhd-images-dir)
UHD_IMAGES_DIR=$2
echo_info "Downloading UHD images in the indicated location"
@@ -324,7 +345,11 @@ function main() {
BUILD_ECLIPSE=1
CMAKE_CMD="$CMAKE_CMD"' -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE -G"Eclipse CDT4 - Unix Makefiles"'
echo_info "Enabling build eclipse project support"
- shift 1;;
+ shift 1;;
+ --build-telnetsrv)
+ BUILD_TELNETSRV=1
+ echo_info "Build embedded telnet server"
+ shift ;;
-h | --help)
print_help
exit 1;;
@@ -448,6 +473,11 @@ function main() {
flash_firmware_bladerf
fi
fi
+ if [ "$FLEXRAN_AGENT" == "1" ] ; then
+ echo_info "installing protobuf/protobuf-c for flexran agent support"
+ install_protobuf_from_source
+ install_protobuf_c_from_source
+ fi
fi
if [ "$INSTALL_OPTIONAL" = "1" ] ; then
@@ -478,6 +508,9 @@ function main() {
lte_exec=lte-softmodem
fi
+# configuration module libraries, one currently available, using libconfig
+ config_libconfig_shlib=params_libconfig
+
# first generate the CMakefile in the right directory
if [ "$eNB" = "1" -o "$UE" = "1" -o "$HW" = "EXMIMO" ] ; then
@@ -504,6 +537,9 @@ function main() {
echo "set (CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file
echo "set ( T_TRACER $T_TRACER )" >> $cmake_file
echo "set (UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE)" >> $cmake_file
+ echo "set (UE_DEBUG_TRACE $UE_DEBUG_TRACE)" >> $cmake_file
+ echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file
+ echo "set (DISABLE_LOG_X $DISABLE_LOG_X)" >> $cmake_file
if [ "$UE" = 1 -a "$NOS1" = "0" ] ; then
echo_info "Compiling UE S1 build : enabling Linux and NETLINK"
echo "set (LINUX True )" >> $cmake_file
@@ -520,6 +556,11 @@ function main() {
$lte_build_dir $lte_exec \
$lte_exec $dbin/$lte_exec.$REL
+# mandatory shared lib
+ compilations \
+ $lte_build_dir $config_libconfig_shlib \
+ lib$config_libconfig_shlib.so $dbin/lib$config_libconfig_shlib.so
+
if [ "$NOS1" = "1" ] ; then
compilations \
$lte_build_dir nasmesh \
@@ -774,7 +815,22 @@ function main() {
rrh_gw $dbin/rrh_gw
fi
-
+ # 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
+
+ fi
# build RF device and transport protocol libraries
#####################################
if [ "$eNB" = "1" -o "$UE" = "1" -o "$RRH" = "1" ] ; then
diff --git a/cmake_targets/lte-simulators/CMakeLists.txt b/cmake_targets/lte-simulators/CMakeLists.txt
index 5ed4d93d80..ab718a8503 100755
--- a/cmake_targets/lte-simulators/CMakeLists.txt
+++ b/cmake_targets/lte-simulators/CMakeLists.txt
@@ -3,7 +3,7 @@ set(PACKAGE_NAME "unitary_tests_simulators")
set(PHYSIM True)
set(RF_BOARD None)
set(XFORMS True)
-
+set(ENABLE_ITTI False)
set(DEBUG_PHY False)
set(MU_RECIEVER False)
set(RANDOM_BF False)
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index a57040449c..f6c51944d2 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -24,6 +24,22 @@
# authors Laurent Thomas, Lionel GAUTHIER
#
#######################################
+if [ ! -f /etc/os-release ]; then
+ echo "No /etc/os-release file found. You're likely on an unsupported distro."
+ exit -1
+fi
+OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g")
+OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g")
+case "$OS_DISTRO" in
+ fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
+ rhel) OS_BASEDISTRO="fedora"; INSTALLER="yum"; CMAKE="cmake3" ;;
+ centos) OS_BASEDISTRO="fedora"; INSTALLER="yum"; CMAKE="cmake3" ;;
+ debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
+ ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
+esac
+KERNEL_VERSION=$(uname -r | cut -d '.' -f1)
+KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)
+
SUDO='sudo -E'
###############################
@@ -66,12 +82,11 @@ echo_info() { cecho "$*" $blue ;}
# If we can't check the distribution, it returns "Unknown"
# This function return always true as exit code by design
# Examples:
-# Ubuntu16.04
-# Debian8.5
+# ubuntu16.04
+# debian8.5
get_distribution_release() {
- local distributor
- if distributor=$(lsb_release -si 2>/dev/null) ; then
- echo $distributor$(lsb_release -sr)
+ if [[ ! -z "$OS_DISTRO$OS_RELEASE" ]]; then
+ echo "$OS_DISTRO$OS_RELEASE"
else
echo Unknown
fi
@@ -80,8 +95,11 @@ get_distribution_release() {
check_supported_distribution() {
local distribution=$(get_distribution_release)
case "$distribution" in
- "Ubuntu16.04") return 0 ;;
- "Ubuntu14.04") return 0 ;;
+ "ubuntu16.04") return 0 ;;
+ "ubuntu14.04") return 0 ;;
+ "fedora24") return 0 ;;
+ "rhel7") return 0 ;;
+ "centos7") return 0 ;;
esac
return 1
}
@@ -184,10 +202,14 @@ install_protobuf_from_source(){
(
cd /tmp
echo "Downloading protobuf"
- rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1
- wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
- tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner
- cd protobuf-2.6.1/
+ #rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1
+ #wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
+ #tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner
+ #cd protobuf-2.6.1/
+ rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0
+ wget https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
+ tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $USER --group $USER --no-same-owner
+ cd protobuf-3.3.0/
./configure
echo "Compiling protobuf"
make -j`nproc`
@@ -200,6 +222,9 @@ install_protobuf_c_from_source(){
protobuf_c_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_c_install_log.txt
echo_info "\nInstalling Google Protobuf_C from sources. The log file for Protobuf_C installation is here: $protobuf_c_install_log "
(
+ if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
+ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
+ fi
cd /tmp
echo "Downloading protobuf-c"
rm -rf /tmp/protobuf-c
@@ -214,7 +239,29 @@ install_protobuf_c_from_source(){
) >& $protobuf_c_install_log
}
+install_usrp_uhd_driver_from_source(){
+ uhd_install_log=$OPENAIR_DIR/cmake_targets/log/uhd_install_log.txt
+ echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log "
+ (
+ cd /tmp
+ echo "Downloading UHD driver"
+ rm -rf /tmp/uhd
+ git clone git://github.com/EttusResearch/uhd.git
+ cd uhd
+ git checkout tags/release_003_010_001_001
+ mkdir -p host/build
+ cd host/build
+ $CMAKE ../
+ echo "Compiling UHD"
+ make
+ make test
+ $SUDO make install
+ $SUDO ldconfig
+ ) >& $uhd_install_log
+}
+
check_install_usrp_uhd_driver(){
+ if [[ "$OS_DISTRO" == "ubuntu" ]]; then
#first we remove old installation
$SUDO apt-get remove -y uhd || true
$SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y
@@ -225,27 +272,72 @@ check_install_usrp_uhd_driver(){
$SUDO apt-get update
$SUDO apt-get -y --allow-unauthenticated install python python-tk libboost-all-dev libusb-1.0-0-dev
$SUDO apt-get -y --allow-unauthenticated install libuhd-dev libuhd003 uhd-host
+ elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
+ $SUDO $INSTALLER -y install python boost libusb-devel libusbx-devel boost-devel python-mako python-docutils cmake
+ if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
+ # until EPEL repo hasn't bumped UHD driver to >=3.10 in EPEL, build driver from source
+ $SUDO $INSTALLER -y remove uhd uhd-devel uhd-firmware
+ install_ursp_uhd_driver_from_source
+ else
+ $SUDO $INSTALLER -y install uhd uhd-devel uhd-firmware
+ fi
+ fi
}
install_usrp_uhd_driver() {
+ if [[ "$OS_DISTRO" == "ubuntu" ]]; then
# We move uhd-host apart because it depends on linux kernel version
# On newer kernels, it fails to install
$SUDO apt-get -y install uhd-host
- if [ -z $1 ]; then
- $SUDO uhd_images_downloader
- else
- $SUDO uhd_images_downloader -i $1
- fi
+ fi
+ if [ -z $1 ]; then
+ $SUDO uhd_images_downloader
+ else
+ $SUDO uhd_images_downloader -i $1
+ fi
+}
+
+install_bladerf_driver_from_source(){
+ bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt
+ echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log "
+ (
+ cd /tmp
+ echo "Downloading BladeRF driver"
+ rm -rf /tmp/bladeRF
+ git clone https://github.com/Nuand/bladeRF.git
+ cd bladeRF
+ git checkout tags/2016.06
+ mkdir -p build
+ cd build
+ $CMAKE ../
+ echo "Compiling BladeRF driver"
+ make
+ $SUDO make install
+ $SUDO ldconfig
+ echo "Downloading FPGA and firmware images"
+ cd /tmp/bladeRF
+ wget https://www.nuand.com/fx3/bladeRF_fw_latest.img
+ wget https://www.nuand.com/fpga/hostedx40-latest.rbf
+ sudo mkdir -p /usr/share/Nuand/bladeRF
+ sudo mv bladeRF_fw_latest.img /usr/share/Nuand/bladeRF/bladeRF_fw.img
+ sudo mv hostedx40-latest.rbf /usr/share/Nuand/bladeRF/hostedx40.rbf
+ ) >& $bladerf_install_log
}
check_install_bladerf_driver(){
- if [ "$(get_distribution_release)" == "Ubuntu14.04" ] ; then
- $SUDO add-apt-repository -y ppa:bladerf/bladerf
- $SUDO apt-get update
- fi
- $SUDO apt-get install -y --allow-unauthenticated bladerf libbladerf-dev
- $SUDO apt-get install -y --allow-unauthenticated bladerf-firmware-fx3
- $SUDO apt-get install -y --allow-unauthenticated bladerf-fpga-hostedx40
+ if [[ "$OS_DISTRO" == "ubuntu" ]]; then
+ if [ "$(get_distribution_release)" == "ubuntu14.04" ] ; then
+ $SUDO add-apt-repository -y ppa:bladerf/bladerf
+ $SUDO apt-get update
+ fi
+ $SUDO apt-get install -y --allow-unauthenticated bladerf libbladerf-dev
+ $SUDO apt-get install -y --allow-unauthenticated bladerf-firmware-fx3
+ $SUDO apt-get install -y --allow-unauthenticated bladerf-fpga-hostedx40
+ elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
+ install_bladerf_driver_from_source
+ else
+ echo_error "BladeRF Installer for OAI does not support automatic build. Install BladeRF compiling sources manually from BladeRF website"
+ fi
}
flash_firmware_bladerf() {
@@ -268,8 +360,9 @@ check_install_lmssdr_driver(){
}
check_install_additional_tools (){
- $SUDO apt-get update
- $SUDO apt-get install -y \
+ $SUDO $INSTALLER update -y
+ if [[ "$OS_DISTRO" == "ubuntu" ]]; then
+ PACKAGE_LIST="\
check \
dialog \
dkms \
@@ -298,13 +391,73 @@ check_install_additional_tools (){
bc \
ntp \
python-scipy \
- python-matplotlib
-
- $SUDO pip install paramiko
- $SUDO pip install pyroute2 colorama
+ python-matplotlib"
+ elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
+ PACKAGE_LIST="\
+ check \
+ dialog \
+ dkms \
+ gawk \
+ boost-devel \
+ openvpn \
+ pkgconfig \
+ pexpect \
+ sshfs \
+ swig \
+ wireshark \
+ unzip \
+ valgrind \
+ vconfig \
+ ctags \
+ ntpdate \
+ iperf3 \
+ wvdial \
+ numpy \
+ sshpass \
+ nscd \
+ python2-paramiko \
+ python-pyroute2 \
+ python-netifaces \
+ scipy \
+ python-matplotlib"
+ elif [[ "$OS_DISTRO" == "fedora" ]]; then
+ PACKAGE_LIST=" \
+ check \
+ dialog \
+ dkms \
+ gawk \
+ boost-devel \
+ openvpn \
+ pkgconfig \
+ python-pexpect \
+ sshfs \
+ swig \
+ wireshark \
+ unzip \
+ valgrind \
+ vconfig \
+ ctags \
+ ntpdate \
+ iperf3 \
+ wvdial \
+ python-numpy \
+ sshpass \
+ nscd \
+ python2-paramiko \
+ python-pyroute2 \
+ python-netifaces \
+ python2-scipy \
+ python2-matplotlib"
+ fi
+ $SUDO $INSTALLER install -y $PACKAGE_LIST
+
$SUDO rm -fr /opt/ssh
$SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/ssh.git /opt/ssh
-
+
+ #The packages below are already installed for Redhat distros (RHEL, CentOS, Fedora)
+ if [[ "$OS_DISTRO" == "ubuntu" ]]; then
+ $SUDO pip install paramiko
+ $SUDO pip install pyroute2 colorama
log_netiface=$OPENAIR_DIR/cmake_targets/log/netiface_install_log.txt
echo_info "Installing Netinterfaces package. The logfile for installation is in $log_netiface"
(
@@ -315,6 +468,7 @@ check_install_additional_tools (){
$SUDO python setup.py install
cd -
) >& $log_netiface
+ fi
}
check_install_oai_software() {
@@ -323,16 +477,17 @@ check_install_oai_software() {
echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
exit 1
fi
- $SUDO apt-get update
+ $SUDO $INSTALLER update -y
+ if [[ "$OS_DISTRO" == "ubuntu" ]]; then
$SUDO apt install -y software-properties-common
case "$(get_distribution_release)" in
- "Ubuntu14.04")
+ "ubuntu14.04")
specific_packages="libtasn1-3-dev"
# For iperf3
$SUDO add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports universe"
$SUDO apt-get update
;;
- "Ubuntu16.04")
+ "ubuntu16.04")
specific_packages="libtasn1-6-dev"
;;
esac
@@ -395,73 +550,97 @@ check_install_oai_software() {
python-pip \
pydb \
libyaml-dev \
- wget
+ wget \
+ libxpm-dev
$SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
- #Remove old gnutls/nettle installation that was done from sources
- remove_nettle_from_source
-
$SUDO apt-get install -y nettle-dev nettle-bin
- remove_gnutls_from_source
$SUDO apt-get install -y libgnutls-dev
+ elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
+ if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
+ if rpm -q epel-release > /dev/null; then
+ echo "EPEL repos already present. Good."
+ else
+ echo "EPEL repos not present. Installing them."
+ $SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
+ fi
+ $SUDO $INSTALLER install -y python-epdb
+ $SUDO $INSTALLER install -y gccxml
+ else
+ $SUDO $INSTALLER install -y mscgen pydb
+ # Fedora repos already contain gccxml's successor castxml.
+ $SUDO $INSTALLER install -y castxml
+ fi
+ $SUDO $INSTALLER install -y \
+ autoconf \
+ automake \
+ bc \
+ bison \
+ $CMAKE \
+ doxygen \
+ ethtool \
+ flex \
+ gdb \
+ git \
+ graphviz \
+ gtkwave \
+ guile-devel \
+ iperf \
+ iproute \
+ iptables \
+ iptables-devel \
+ atlas-devel \
+ blas-devel \
+ libconfig-devel \
+ libffi-devel \
+ xforms \
+ xforms-devel \
+ libgcrypt-devel \
+ gmp-devel \
+ gtk3-devel \
+ libidn2-devel \
+ libidn-devel \
+ mariadb-devel \
+ octave-devel \
+ openpgm-devel \
+ lksctp-tools \
+ lksctp-tools-devel \
+ openssl-devel \
+ libtasn1 \
+ libtool \
+ libusb-devel \
+ libxml2 \
+ libxml2-devel \
+ libxslt-devel \
+ octave \
+ octave-signal \
+ openssh-clients \
+ openssh-server \
+ openssl \
+ patch \
+ psmisc \
+ python \
+ subversion \
+ xmlstarlet \
+ python-pip \
+ wget \
+ kernel-headers \
+ kernel-devel \
+ nettle-devel \
+ gnutls-devel \
+ libXpm-devel \
+ lapack \
+ lapack-devel \
+ blas \
+ blas-devel
+ fi
+
install_asn1c_from_source
$SUDO rm -fr /opt/ssh
$SUDO git clone https://gist.github.com/2190472.git /opt/ssh
- install_protobuf_from_source
- install_protobuf_c_from_source
-}
-
-### Remove Nettle installation which was done from sources
-remove_nettle_from_source() {
- nettle_uninstall_log=$OPENAIR_DIR/cmake_targets/log/nettle_uninstall_log.txt
- echo_info "\nUn-Installing Nettle from sources. The log file for nettle un-installation is here: $nettle_uninstall_log "
- (
- $SUDO apt-get remove -y nettle-dev nettle-bin
- cd /tmp
- echo "Downloading nettle archive"
- $SUDO rm -rf /tmp/nettle-2.5.tar.gz* /tmp/nettle-2.5
- wget https://ftp.gnu.org/gnu/nettle/nettle-2.5.tar.gz
- if [ $? -ne 0 ]; then
- wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
- fi
- if [ ! -f nettle-2.5.tar.gz ]; then
- echo_error "Could not download nettle source files"
- cd -
- return
- fi
- tar -xzf nettle-2.5.tar.gz
- cd nettle-2.5/
- ./configure --disable-openssl --enable-shared --prefix=/usr
- $SUDO make uninstall || true
- $SUDO ldconfig
- ) >& $nettle_uninstall_log
-}
-
-### Remove Gnutls from source
-remove_gnutls_from_source(){
- gnutls_uninstall_log=$OPENAIR_DIR/cmake_targets/log/gnutls_uninstall_log.txt
- echo_info "\nUn-Installing Gnutls. The log file for Gnutls un-installation is here: $gnutls_uninstall_log "
- (
- $SUDO apt-get remove -y libgnutls-dev
- cd /tmp
- echo "Downloading gnutls archive"
- $SUDO rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23
- wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz || \
- wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz
- if [ ! -f gnutls-3.1.23.tar.xz ]; then
- echo_error "Could not download gnutls source files"
- cd -
- return
- fi
- tar -xJf gnutls-3.1.23.tar.xz
- cd gnutls-3.1.23/
- ./configure --prefix=/usr
- $SUDO make uninstall || true
- $SUDO ldconfig
- )>& $gnutls_uninstall_log
}
install_asn1c_from_source(){
diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c
new file mode 100644
index 0000000000..42ea7259c3
--- /dev/null
+++ b/common/config/config_cmdline.c
@@ -0,0 +1,163 @@
+/*
+ * 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.0 (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/cmdline/config_libconfig.c
+ * \brief configuration module, command line parsing implementation
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#include
+#include
+#include
+#include
+#include "config_userapi.h"
+
+int processoption(paramdef_t *cfgoptions, char *value)
+{
+char *tmpval = value;
+int optisset=0;
+char defbool[2]="1";
+
+ if ( value == NULL) {
+ if( (cfgoptions->paramflags &PARAMFLAG_BOOL) == 0 ) { /* not a boolean, argument required */
+ fprintf(stderr,"[CONFIG] command line, option %s requires an argument\n",cfgoptions->optname);
+ return 0;
+ } else { /* boolean value option without argument, set value to true*/
+ tmpval = defbool;
+ }
+ }
+ switch(cfgoptions->type)
+ {
+ case TYPE_STRING:
+ config_check_valptr(cfgoptions, (char **)(cfgoptions->strptr), sizeof(char *));
+ config_check_valptr(cfgoptions, cfgoptions->strptr, strlen(tmpval+1));
+ sprintf(*(cfgoptions->strptr), "%s",tmpval);
+ printf_cmdl("[CONFIG] %s set to %s from command line\n", cfgoptions->optname, tmpval);
+ optisset=1;
+ break;
+
+ case TYPE_STRINGLIST:
+ break;
+ case TYPE_UINT32:
+ case TYPE_INT32:
+ case TYPE_UINT16:
+ case TYPE_INT16:
+ case TYPE_UINT8:
+ case TYPE_INT8:
+ config_check_valptr(cfgoptions, (char **)&(cfgoptions->iptr),sizeof(int32_t));
+ config_assign_int(cfgoptions,cfgoptions->optname,(int32_t)strtol(tmpval,NULL,0));
+ optisset=1;
+ break;
+ case TYPE_UINT64:
+ case TYPE_INT64:
+ config_check_valptr(cfgoptions, (char **)&(cfgoptions->i64ptr),sizeof(uint64_t));
+ *(cfgoptions->i64ptr)=strtoll(tmpval,NULL,0);
+ printf_cmdl("[CONFIG] %s set to %lli from command line\n", cfgoptions->optname, (long long)*(cfgoptions->i64ptr));
+ optisset=1;
+ break;
+ case TYPE_UINTARRAY:
+ case TYPE_INTARRAY:
+
+ break;
+ case TYPE_DOUBLE:
+ config_check_valptr(cfgoptions, (char **)&(cfgoptions->dblptr),sizeof(double));
+ *(cfgoptions->dblptr) = strtof(tmpval,NULL);
+ printf_cmdl("[CONFIG] %s set to %lf from command line\n", cfgoptions->optname, *(cfgoptions->dblptr));
+ optisset=1;
+ break;
+
+ case TYPE_IPV4ADDR:
+
+ break;
+
+ default:
+ fprintf(stderr,"[CONFIG] command line, %s type %i not supported\n",cfgoptions->optname, cfgoptions->type);
+ break;
+ } /* switch on param type */
+ if (optisset == 1) {
+ cfgoptions->paramflags = cfgoptions->paramflags | PARAMFLAG_PARAMSET;
+ }
+
+ return optisset;
+}
+
+int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix)
+{
+char **p = config_get_if()->argv;
+int c = config_get_if()->argc;
+int j;
+char *pp;
+char *cfgpath;
+
+ j = (prefix ==NULL) ? 0 : strlen(prefix);
+ cfgpath = malloc( j + MAX_OPTNAME_SIZE +1);
+ if (cfgpath == NULL) {
+ fprintf(stderr,"[CONFIG] %s %i malloc error, %s\n", __FILE__, __LINE__,strerror(errno));
+ return -1;
+ }
+
+ j=0;
+ p++;
+ c--;
+ while (c > 0 && *p != NULL) {
+ if (strcmp(*p, "-h") == 0 || strcmp(*p, "--help") == 0 ) {
+ config_printhelp(cfgoptions,numoptions);
+ }
+
+ if (*p[0] == '-') {
+ for(int i=0;i 2) && (strcmp(*p + 2,cfgpath ) == 0 )) ) {
+ pp = *(p+1);
+ if ( ( pp != NULL ) && (c>1) && (pp[0]!= '-') ) {
+
+ j += processoption(&(cfgoptions[i]), pp);
+ } else {
+ j += processoption(&(cfgoptions[i]), NULL);
+ }
+ break;
+ }
+ } /* for */
+ } /* if (*p[0] == '-') */
+ p++;
+ c--;
+ } /* fin du while */
+ printf_cmdl("[CONFIG] %s %i options set from command line\n",((prefix == NULL) ? "":prefix),j);
+ free(cfgpath);
+ return j;
+} /* parse_cmdline*/
+
+
+
diff --git a/common/config/config_load_configmodule.c b/common/config/config_load_configmodule.c
new file mode 100644
index 0000000000..8351d4d82c
--- /dev/null
+++ b/common/config/config_load_configmodule.c
@@ -0,0 +1,226 @@
+/*
+ * 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.0 (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/config_load_configmodule.c
+ * \brief configuration module, load the shared library implementing the configuration module
+ * \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
+#include
+#include
+#include
+#include
+#include
+
+#define CONFIG_LOADCONFIG_MAIN
+#include "config_load_configmodule.h"
+#include "config_userapi.h"
+#define CONFIG_SHAREDLIBFORMAT "libparams_%s.so"
+
+int load_config_sharedlib(configmodule_interface_t *cfgptr)
+{
+void *lib_handle;
+char fname[128];
+char libname[FILENAME_MAX];
+int st;
+
+ st=0;
+ sprintf(libname,CONFIG_SHAREDLIBFORMAT,cfgptr->cfgmode);
+
+ lib_handle = dlopen(libname,RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE);
+ if (!lib_handle) {
+ fprintf(stderr,"[CONFIG] %s %d Error calling dlopen(%s): %s\n",__FILE__, __LINE__, libname,dlerror());
+ st = -1;
+ } else {
+ sprintf (fname,"config_%s_init",cfgptr->cfgmode);
+ cfgptr->init = dlsym(lib_handle,fname);
+
+ if (cfgptr->init == NULL ) {
+ printf("[CONFIG] %s %d no function %s for config mode %s\n",
+ __FILE__, __LINE__,fname, cfgptr->cfgmode);
+ } else {
+ st=cfgptr->init(cfgptr->cfgP,cfgptr->num_cfgP);
+ printf("[CONFIG] function %s returned %i\n",
+ fname, st);
+ }
+
+ sprintf (fname,"config_%s_get",cfgptr->cfgmode);
+ cfgptr->get = dlsym(lib_handle,fname);
+ if (cfgptr->get == NULL ) {
+ printf("[CONFIG] %s %d no function %s for config mode %s\n",
+ __FILE__, __LINE__,fname, cfgptr->cfgmode);
+ st = -1;
+ }
+
+ sprintf (fname,"config_%s_getlist",cfgptr->cfgmode);
+ cfgptr->getlist = dlsym(lib_handle,fname);
+ if (cfgptr->getlist == NULL ) {
+ printf("[CONFIG] %s %d no function %s for config mode %s\n",
+ __FILE__, __LINE__,fname, cfgptr->cfgmode);
+ st = -1;
+ }
+
+ sprintf (fname,"config_%s_end",cfgptr->cfgmode);
+ cfgptr->end = dlsym(lib_handle,fname);
+ if (cfgptr->getlist == NULL ) {
+ printf("[CONFIG] %s %d no function %s for config mode %s\n",
+ __FILE__, __LINE__,fname, cfgptr->cfgmode);
+ }
+ }
+
+ return st;
+}
+/*-----------------------------------------------------------------------------------*/
+/* from here: interface implementtion of the configuration module */
+
+
+configmodule_interface_t *load_configmodule(int argc, char **argv)
+{
+char *cfgparam=NULL;
+char *modeparams=NULL;
+char *cfgmode=NULL;
+char *strtokctx=NULL;
+char *atoken;
+uint32_t tmpflags=0;
+int i;
+
+/* first parse the command line to look for the -O option */
+ opterr=0;
+ for (i = 0;i option, default cfgmode to libconfig
+ with one parameter, the path to the configuration file */
+ modeparams=cfgmode;
+ cfgmode=strdup("libconfig");
+ }
+
+ cfgptr = malloc(sizeof(configmodule_interface_t));
+ memset(cfgptr,0,sizeof(configmodule_interface_t));
+
+ cfgptr->rtflags = cfgptr->rtflags | tmpflags;
+ cfgptr->argc = argc;
+ cfgptr->argv = argv;
+ cfgptr->cfgmode=strdup(cfgmode);
+
+ cfgptr->num_cfgP=0;
+ atoken=strtok_r(modeparams,":",&strtokctx);
+ while ( cfgptr->num_cfgP< CONFIG_MAX_OOPT_PARAMS && atoken != NULL) {
+ /* look for debug level in the config parameters, it is commom to all config mode
+ and will be removed frome the parameter array passed to the shared module */
+ char *aptr;
+ aptr=strcasestr(atoken,"dbgl");
+ if (aptr != NULL) {
+ cfgptr->rtflags = cfgptr->rtflags | strtol(aptr+4,NULL,0);
+
+ } else {
+ cfgptr->cfgP[cfgptr->num_cfgP] = strdup(atoken);
+ cfgptr->num_cfgP++;
+ }
+ atoken = strtok_r(NULL,":",&strtokctx);
+ }
+
+
+ printf("[CONFIG] get parameters from %s ",cfgmode);
+ for (i=0;inum_cfgP; i++) {
+ printf("%s ",cfgptr->cfgP[i]);
+ }
+ printf("\n");
+
+
+ i=load_config_sharedlib(cfgptr);
+ if (i< 0) {
+ fprintf(stderr,"[CONFIG] %s %d config module %s couldn't be loaded\n", __FILE__, __LINE__,cfgmode);
+ cfgptr->rtflags = cfgptr->rtflags | CONFIG_HELP | CONFIG_ABORT;
+ } else {
+ printf("[CONFIG] config module %s loaded\n",cfgmode);
+ Config_Params[CONFIGPARAM_DEBUGFLAGS_IDX].uptr=&(cfgptr->rtflags);
+ config_get(Config_Params,CONFIG_PARAMLENGTH(Config_Params), CONFIG_SECTIONNAME );
+ }
+
+
+
+ if (modeparams != NULL) free(modeparams);
+ if (cfgmode != NULL) free(cfgmode);
+ if (CONFIG_ISFLAGSET(CONFIG_ABORT)) config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params));
+ return cfgptr;
+}
+
+void end_configmodule()
+{
+ if (cfgptr != NULL) {
+ if (cfgptr->end != NULL) {
+ printf ("[CONFIG] calling config module end function...\n");
+ cfgptr->end();
+ }
+ if( cfgptr->cfgmode != NULL) free(cfgptr->cfgmode);
+ printf ("[CONFIG] free %u config parameter pointers\n",cfgptr->num_cfgP);
+ for (int i=0; inum_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; inumptrs ; i++) {
+ if (cfgptr->ptrs[i] != NULL) {
+ free(cfgptr->ptrs[i]);
+ }
+ cfgptr->ptrs[i]=NULL;
+ }
+
+ free(cfgptr);
+ cfgptr=NULL;
+ }
+}
+
+
+
+
diff --git a/common/config/config_load_configmodule.h b/common/config/config_load_configmodule.h
new file mode 100644
index 0000000000..71c642f680
--- /dev/null
+++ b/common/config/config_load_configmodule.h
@@ -0,0 +1,103 @@
+/*
+ * 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.0 (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/config_load_configmodule.h
+ * \brief: configuration module, include file to be used by the source code calling the
+ * configuration module initialization
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#ifndef INCLUDE_CONFIG_LOADCONFIGMODULE_H
+#define INCLUDE_CONFIG_LOADCONFIGMODULE_H
+
+
+#include
+#include
+#include "common/config/config_paramdesc.h"
+#define CONFIG_MAX_OOPT_PARAMS 10 // maximum number of parameters in the -O option (-O :P1:P2...
+#define CONFIG_MAX_ALLOCATEDPTRS 1024 // maximum number of parameters that can be dynamicaly allocated in the config module
+
+/* 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
+
+
+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);
+typedef void(*configmodule_endfunc_t)(void);
+typedef struct configmodule_interface
+{
+ int argc;
+ char **argv;
+ char *cfgmode;
+ int num_cfgP;
+ char *cfgP[CONFIG_MAX_OOPT_PARAMS];
+ configmodule_initfunc_t init;
+ configmodule_getfunc_t get;
+ configmodule_getlistfunc_t getlist;
+ configmodule_endfunc_t end;
+ uint32_t numptrs;
+ uint32_t rtflags;
+ char *ptrs[CONFIG_MAX_ALLOCATEDPTRS];
+} configmodule_interface_t;
+
+#ifdef CONFIG_LOADCONFIG_MAIN
+configmodule_interface_t *cfgptr=NULL;
+
+static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbg[debugflags]> \n \
+ debugflags can also be defined in the config_libconfig section of the config file\n \
+ debugflags: mask, 1->print parameters, 2->print memory allocations debug messages\n \
+ 4->print command line processing debug messages\n ";
+
+#define CONFIG_SECTIONNAME "config"
+#define CONFIGPARAM_DEBUGFLAGS_IDX 0
+
+
+static paramdef_t Config_Params[] = {
+/*-----------------------------------------------------------------------------------------------------------------------*/
+/* config parameters for config module */
+/* optname helpstr paramflags XXXptr defXXXval type numelt */
+/*-----------------------------------------------------------------------------------------------------------------------*/
+{"debugflags", config_helpstr, 0, uptr:NULL, defintval:0, TYPE_MASK, 0},
+};
+
+#else
+extern configmodule_interface_t *cfgptr;
+#endif
+
+
+#define printf_params(...) if ( (cfgptr->rtflags & CONFIG_PRINTPARAMS) != 0 ) { printf ( __VA_ARGS__ ); }
+#define printf_ptrs(...) if ( (cfgptr->rtflags & CONFIG_DEBUGPTR) != 0 ) { printf ( __VA_ARGS__ ); }
+#define printf_cmdl(...) if ( (cfgptr->rtflags & CONFIG_DEBUGCMDLINE) != 0 ) { printf ( __VA_ARGS__ ); }
+
+extern configmodule_interface_t *load_configmodule(int argc, char **argv);
+extern void end_configmodule(void);
+
+#endif /* INCLUDE_CONFIG_LOADCONFIGMODULE_H */
diff --git a/common/config/config_paramdesc.h b/common/config/config_paramdesc.h
new file mode 100644
index 0000000000..a7de5e3098
--- /dev/null
+++ b/common/config/config_paramdesc.h
@@ -0,0 +1,120 @@
+/*
+ * 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.0 (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/config_paramdesc.h
+ * \brief configuration module, include file describing parameters, common to all implementations
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#include
+#ifndef INCLUDE_CONFIG_PARAMDESC_H
+#define INCLUDE_CONFIG_PARAMDESC_H
+
+
+
+
+
+#define MAX_OPTNAME_SIZE 64
+
+
+
+/* parameter flags definitions */
+/* Flags to be used by calling modules in their parameters definitions to modify config module behavior*/
+#define PARAMFLAG_MANDATORY (1 << 0) // parameter must be explicitely set, default value ignored
+#define PARAMFLAG_DISABLECMDLINE (1 << 1) // parameter cannot bet set from comand line
+#define PARAMFLAG_DONOTREAD (1 << 2) // parameter must be ignored in get function
+#define PARAMFLAG_NOFREE (1 << 3) // don't free parameter in end function
+#define PARAMFLAG_BOOL (1 << 4) // integer param can be 0 or 1
+
+
+/* Flags used by config modules to return info to calling modules and/or to for internal usage*/
+#define PARAMFLAG_MALLOCINCONFIG (1 << 15) // parameter allocated in config module
+#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
+
+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 **strptr;
+ char **strlistptr;
+ uint8_t *u8ptr;
+ char *i8ptr;
+ uint16_t *u16ptr;
+ int16_t *i16ptr;
+ uint32_t *uptr;
+ int32_t *iptr;
+ uint64_t *u64ptr;
+ int64_t *i64ptr;
+ double *dblptr;
+ } ;
+ 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 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 */
+} paramdef_t;
+
+#define TYPE_INT TYPE_INT32
+#define TYPE_UINT TYPE_UINT32
+#define TYPE_STRING 1
+#define TYPE_INT8 2
+#define TYPE_UINT8 3
+#define TYPE_INT16 4
+#define TYPE_UINT16 5
+#define TYPE_INT32 6
+#define TYPE_UINT32 7
+#define TYPE_INT64 8
+#define TYPE_UINT64 9
+#define TYPE_MASK 10
+#define TYPE_DOUBLE 16
+#define TYPE_IPV4ADDR 20
+
+
+#define TYPE_STRINGLIST 50
+#define TYPE_INTARRAY 51
+#define TYPE_UINTARRAY 52
+#define TYPE_LIST 55
+
+#define ANY_IPV4ADDR_STRING "0.0.0.0"
+
+typedef struct paramlist_def {
+ char listname[MAX_OPTNAME_SIZE];
+ paramdef_t **paramarray;
+ int numelt ;
+} paramlist_def_t;
+
+/* macro helpers for module users */
+#define CONFIG_PARAMLENGTH(A) (sizeof(A)/sizeof(paramdef_t))
+#endif /* INCLUDE_CONFIG_PARAMDESC_H */
diff --git a/common/config/config_userapi.c b/common/config/config_userapi.c
new file mode 100644
index 0000000000..ad2e355d52
--- /dev/null
+++ b/common/config/config_userapi.c
@@ -0,0 +1,149 @@
+/*
+ * 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.0 (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/config_userapi.c
+ * \brief configuration module, api implementation to access configuration parameters
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#include
+#include
+#include
+#include
+#include
+#include
+#include "config_userapi.h"
+
+
+configmodule_interface_t *config_get_if(void)
+{
+ if (cfgptr == NULL) {
+ fprintf(stderr,"[CONFIG] %s %d config module not initialized\n",__FILE__, __LINE__);
+ exit(-1);
+ }
+ return cfgptr;
+}
+
+char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length)
+{
+
+ printf_ptrs("-- %s 0x%08lx %i\n",cfgoptions->optname,(uintptr_t)(*ptr),length);
+ if (*ptr == NULL) {
+ *ptr = malloc(length);
+ if ( *ptr != NULL) {
+ memset(*ptr,0,length);
+ if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) != 0) {
+ config_get_if()->ptrs[config_get_if()->numptrs] = *ptr;
+ config_get_if()->numptrs++;
+ }
+ } else {
+ fprintf (stderr,"[CONFIG] %s %d malloc error\n",__FILE__, __LINE__);
+ exit(-1);
+ }
+ }
+ return *ptr;
+}
+
+void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val)
+{
+int tmpval=val;
+ if ( ((cfgoptions->paramflags &PARAMFLAG_BOOL) != 0) && tmpval >1) {
+ tmpval =1;
+ }
+ switch (cfgoptions->type) {
+ case TYPE_UINT8:
+ *(cfgoptions->u8ptr) = (uint8_t)tmpval;
+ printf_params("[CONFIG] %s: %u\n", fullname, (uint8_t)tmpval);
+ break;
+ case TYPE_INT8:
+ *(cfgoptions->i8ptr) = (int8_t)tmpval;
+ printf_params("[CONFIG] %s: %i\n", fullname, (int8_t)tmpval);
+ break;
+ case TYPE_UINT16:
+ *(cfgoptions->u16ptr) = (uint16_t)tmpval;
+ printf_params("[CONFIG] %s: %hu\n", fullname, (uint16_t)tmpval);
+ break;
+ case TYPE_INT16:
+ *(cfgoptions->i16ptr) = (int16_t)tmpval;
+ printf_params("[CONFIG] %s: %hi\n", fullname, (int16_t)tmpval);
+ break;
+ case TYPE_UINT32:
+ *(cfgoptions->uptr) = (uint32_t)tmpval;
+ printf_params("[CONFIG] %s: %u\n", fullname, (uint32_t)tmpval);
+ break;
+ case TYPE_MASK:
+ *(cfgoptions->uptr) = *(cfgoptions->uptr) | (uint32_t)tmpval;
+ printf_params("[CONFIG] %s: 0x%08x\n", fullname, (uint32_t)tmpval);
+ break;
+ case TYPE_INT32:
+ *(cfgoptions->iptr) = (int32_t)tmpval;
+ printf_params("[CONFIG] %s: %i\n", fullname, (int32_t)tmpval);
+ break;
+ default:
+ fprintf (stderr,"[CONFIG] %s %i type %i non integer parameter %s not assigned\n",__FILE__, __LINE__,cfgoptions->type,fullname);
+ break;
+ }
+}
+
+void config_printhelp(paramdef_t *params,int numparams)
+{
+ for (int i=0 ; iget(params, numparams,prefix);
+ if (ret >= 0) {
+ config_process_cmdline(params,numparams,prefix);
+ }
+ return ret;
+ }
+return ret;
+}
+
+int config_isparamset(paramdef_t *params,int paramidx)
+{
+ if ((params[paramidx].paramflags & PARAMFLAG_PARAMSET) != 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
diff --git a/common/config/config_userapi.h b/common/config/config_userapi.h
new file mode 100644
index 0000000000..6acaacf716
--- /dev/null
+++ b/common/config/config_userapi.h
@@ -0,0 +1,61 @@
+/*
+ * 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.0 (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/config_userapi.h
+ * \brief: configuration module, include file to be used by the source code calling the
+ * configuration module to access configuration parameters
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#ifndef INCLUDE_CONFIG_USERAPI_H
+#define INCLUDE_CONFIG_USERAPI_H
+#include "config_load_configmodule.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+#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))
+
+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_int(paramdef_t *cfgoptions, char *fullname, int val);
+extern int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix);
+#define config_getlist config_get_if()->getlist
+#define CONFIG_GETCONFFILE (config_get_if()->cfgP[0])
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c
new file mode 100644
index 0000000000..35a70dfcc7
--- /dev/null
+++ b/common/config/libconfig/config_libconfig.c
@@ -0,0 +1,368 @@
+#define _GNU_SOURCE
+#include
+
+#include
+#include
+
+#include
+
+#include "config_libconfig.h"
+#include "config_libconfig_private.h"
+#include "../config_userapi.h"
+#include "errno.h"
+
+#if ( LIBCONFIG_VER_MAJOR == 1 && LIBCONFIG_VER_MINOR < 5)
+#define config_setting_lookup config_lookup_from
+#endif
+
+void config_libconfig_end(void );
+
+int read_strlist(paramdef_t *cfgoptions,config_setting_t *setting, char *cfgpath)
+{
+const char *str;
+int st;
+
+ cfgoptions->numelt=config_setting_length(setting);
+ cfgoptions->strlistptr=malloc(sizeof(char *) * (cfgoptions->numelt));
+ st=0;
+ for (int i=0; i< cfgoptions->numelt && cfgoptions->strlistptr != NULL; 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);
+ sprintf(cfgoptions->strlistptr[i],"%s",str);
+ st++;
+ printf_params("[LIBCONFIG] %s%i: %s\n", cfgpath,i,cfgoptions->strlistptr[i]);
+ }
+ }
+ return st;
+}
+
+int read_intarray(paramdef_t *cfgoptions,config_setting_t *setting, char *cfgpath)
+{
+
+ cfgoptions->numelt=config_setting_length(setting);
+
+ if (cfgoptions->numelt > 0) {
+ cfgoptions->iptr=malloc(sizeof(int) * (cfgoptions->numelt));
+ for (int i=0; i< cfgoptions->numelt && cfgoptions->iptr != NULL; i++) {
+ cfgoptions->iptr[i]=config_setting_get_int_elem(setting,i);
+ printf_params("[LIBCONFIG] %s[%i]: %i\n", cfgpath,i,cfgoptions->iptr[i]);
+ } /* for loop on array element... */
+ }
+ return cfgoptions->numelt;
+}
+
+
+
+
+int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
+{
+
+
+ config_setting_t *setting;
+ char *str;
+ int i,u;
+ long long int llu;
+ double dbl;
+ int rst;
+ int status=0;
+ int notfound;
+ int defval;
+ int fatalerror=0;
+ char *cfgpath; /* listname.[listindex].paramname */
+ int numdefvals=0;
+
+ i = (prefix ==NULL) ? 0 : strlen(prefix);
+ cfgpath = malloc( i+ MAX_OPTNAME_SIZE +1);
+ if (cfgpath == NULL) {
+ fprintf(stderr,"[LIBCONFIG] %s %i malloc error, %s\n", __FILE__, __LINE__,strerror(errno));
+ return -1;
+ }
+ for(i=0;iparamflags & PARAMFLAG_DONOTREAD) != 0) {
+ printf_params("[LIBCONFIG] %s.%s ignored\n", cfgpath,cfgoptions[i].optname );
+ continue;
+ }
+ notfound=0;
+ defval=0;
+ switch(cfgoptions[i].type)
+ {
+ case TYPE_STRING:
+
+ if ( config_lookup_string(&(libconfig_privdata.cfg),cfgpath, (const char **)&str)) {
+ if ( cfgoptions[i].numelt > 0 && str != NULL && strlen(str) >= cfgoptions[i].numelt ) {
+ fprintf(stderr,"[LIBCONFIG] %s: %s exceeds maximum length of %i bytes, value truncated\n",
+ cfgpath,str,cfgoptions[i].numelt);
+ str[strlen(str)-1] = 0;
+ }
+ 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) );
+ } else {
+ if( cfgoptions[i].defstrval != NULL) {
+ defval=1;
+ 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));
+ } else {
+ notfound=1;
+ }
+ }
+ break;
+ case TYPE_STRINGLIST:
+ setting = config_setting_lookup (config_root_setting(&(libconfig_privdata.cfg)),cfgpath );
+ if ( setting != NULL) {
+ read_strlist(&cfgoptions[i],setting,cfgpath);
+ } else {
+ if( cfgoptions[i].defstrlistval != NULL) {
+ cfgoptions[i].strlistptr=cfgoptions[i].defstrlistval;
+ defval=1;
+ for(int j=0; j 0) {
+ printf_params("[LIBCONFIG] %s: %s\n", cfgpath,str );
+ } else {
+ if ( strncmp(str,ANY_IPV4ADDR_STRING,sizeof(ANY_IPV4ADDR_STRING)) == 0) {
+ printf_params("[LIBCONFIG] %s:%s (INADDR_ANY) \n",cfgpath,str);
+ *cfgoptions[i].uptr=INADDR_ANY;
+ } else {
+ fprintf(stderr,"[LIBCONFIG] %s not valid for %s \n", str, cfgpath);
+ fatalerror=1;
+ }
+ }
+ } else {
+ notfound=1;
+ }
+
+ break;
+ case TYPE_LIST:
+ setting = config_setting_lookup (config_root_setting(&(libconfig_privdata.cfg)),cfgpath );
+ if ( setting) {
+ cfgoptions[i].numelt=config_setting_length(setting);
+ } else {
+ notfound=1;
+ }
+ break;
+ default:
+ fprintf(stderr,"[LIBCONFIG] %s type %i not supported\n", cfgpath,cfgoptions[i].type);
+ fatalerror=1;
+ break;
+ } /* switch on param type */
+ if( notfound == 1) {
+ printf("[LIBCONFIG] %s not found in %s ", cfgpath,libconfig_privdata.configfile );
+ if ( (cfgoptions[i].paramflags & PARAMFLAG_MANDATORY) != 0) {
+ fatalerror=1;
+ printf(" mandatory parameter missing\n");
+ } else {
+ printf("\n");
+ }
+ } else {
+ if (defval == 1) {
+ numdefvals++;
+ cfgoptions[i].paramflags = cfgoptions[i].paramflags | PARAMFLAG_PARAMSETDEF;
+ } else {
+ cfgoptions[i].paramflags = cfgoptions[i].paramflags | PARAMFLAG_PARAMSET;
+ }
+ status++;
+ }
+ } /* for loop on options */
+ printf("[LIBCONFIG] %s: %i/%i parameters successfully set, (%i to default value)\n",
+ ((prefix == NULL)?"(root)":prefix),
+ status,numoptions,numdefvals );
+ if (fatalerror == 1) {
+ fprintf(stderr,"[LIBCONFIG] fatal errors found when processing %s \n", libconfig_privdata.configfile );
+ config_libconfig_end();
+ end_configmodule();
+ }
+ free(cfgpath);
+ return status;
+}
+
+int config_libconfig_getlist(paramlist_def_t *ParamList,
+ paramdef_t *params, int numparams, char *prefix)
+{
+config_setting_t *setting;
+int i,j,status;
+char *listpath=NULL;
+char cfgpath[MAX_OPTNAME_SIZE*2 + 6]; /* prefix.listname.[listindex] */
+
+ if (prefix != NULL)
+ {
+ i=asprintf(&listpath ,"%s.%s",prefix,ParamList->listname);
+ }
+ else
+ {
+ i=asprintf(&listpath ,"%s",ParamList->listname);
+ }
+ setting = config_lookup(&(libconfig_privdata.cfg), listpath);
+ if ( setting) {
+ status = ParamList->numelt = config_setting_length(setting);
+ printf_params("[LIBCONFIG] %i %s in config file %s \n",
+ ParamList->numelt,listpath,libconfig_privdata.configfile );
+ } else {
+ printf("[LIBCONFIG] list %s not found in config file %s \n",
+ listpath,libconfig_privdata.configfile );
+ ParamList->numelt= 0;
+ status = -1;
+ }
+ if (ParamList->numelt > 0 && params != NULL) {
+ ParamList->paramarray = malloc(ParamList->numelt * sizeof(paramdef_t *));
+ if ( ParamList->paramarray != NULL) {
+ config_get_if()->ptrs[config_get_if()->numptrs] = (char *)(ParamList->paramarray);
+ config_get_if()->numptrs++;
+ } else {
+ fprintf (stderr,"[LIBCONFIG] %s %d malloc error\n",__FILE__, __LINE__);
+ exit(-1);
+ }
+ for (i=0 ; i < ParamList->numelt ; i++) {
+ ParamList->paramarray[i] = malloc(numparams * sizeof(paramdef_t));
+ if ( ParamList->paramarray[i] != NULL) {
+ config_get_if()->ptrs[config_get_if()->numptrs] = (char *)(ParamList->paramarray[i]);
+ config_get_if()->numptrs++;
+ } else {
+ fprintf (stderr,"[LIBCONFIG] %s %d malloc error\n",__FILE__, __LINE__);
+ exit(-1);
+ }
+
+ memcpy(ParamList->paramarray[i], params, sizeof(paramdef_t)*numparams);
+ for (j=0;jparamarray[i][j].strptr = NULL ;
+ }
+ sprintf(cfgpath,"%s.[%i]",listpath,i);
+ config_libconfig_get(ParamList->paramarray[i], numparams, cfgpath );
+ } /* for i... */
+ } /* ParamList->numelt > 0 && params != NULL */
+ if (listpath != NULL)
+ free(listpath);
+ return status;
+}
+
+int config_libconfig_init(char *cfgP[], int numP)
+{
+ config_init(&(libconfig_privdata.cfg));
+ libconfig_privdata.configfile = strdup((char *)cfgP[0]);
+ config_get_if()->numptrs=0;
+ memset(config_get_if()->ptrs,0,sizeof(void *) * CONFIG_MAX_ALLOCATEDPTRS);
+
+ /* Read the file. If there is an error, report it and exit. */
+ if(! config_read_file(&(libconfig_privdata.cfg), libconfig_privdata.configfile)) {
+ fprintf(stderr,"[LIBCONFIG] %s %d file %s - %d - %s\n",__FILE__, __LINE__,
+ libconfig_privdata.configfile, config_error_line(&(libconfig_privdata.cfg)),
+ config_error_text(&(libconfig_privdata.cfg)));
+ config_destroy(&(libconfig_privdata.cfg));
+ printf( "\n");
+ return -1;
+ }
+
+
+ return 0;
+}
+
+
+void config_libconfig_end(void )
+{
+ config_destroy(&(libconfig_privdata.cfg));
+ if ( libconfig_privdata.configfile != NULL ) {
+ free(libconfig_privdata.configfile);
+ }
+
+}
diff --git a/common/config/libconfig/config_libconfig.h b/common/config/libconfig/config_libconfig.h
new file mode 100644
index 0000000000..8013d602cf
--- /dev/null
+++ b/common/config/libconfig/config_libconfig.h
@@ -0,0 +1,54 @@
+/*
+ * 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.0 (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 configuration module, include file for libconfig implementation
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#ifndef INCLUDE_CONFIG_LIBCONFIG_H
+#define INCLUDE_CONFIG_LIBCONFIG_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "common/config/config_paramdesc.h"
+
+
+
+
+typedef struct libconfig_privatedata {
+ char *configfile;
+ config_t cfg;
+} libconfig_privatedata_t;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* INCLUDE_CONFIG_LIBCONFIG_H */
diff --git a/common/config/libconfig/config_libconfig_private.h b/common/config/libconfig/config_libconfig_private.h
new file mode 100644
index 0000000000..022e0e6330
--- /dev/null
+++ b/common/config/libconfig/config_libconfig_private.h
@@ -0,0 +1,39 @@
+/*
+ * 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.0 (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_private.h
+ * \brief configuration module, include file for libconfig implementation
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+
+
+static libconfig_privatedata_t libconfig_privdata;
+
+
+
+
+
diff --git a/common/ran_context.h b/common/ran_context.h
index 625e029382..4e25729c86 100755
--- a/common/ran_context.h
+++ b/common/ran_context.h
@@ -56,6 +56,8 @@ typedef struct {
int *nb_CC;
/// Number of MACRLC instances in this node
int nb_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 Component Carriers per instance in this node
diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h
index eb327bb261..65f2430265 100755
--- a/common/utils/T/T_defs.h
+++ b/common/utils/T/T_defs.h
@@ -29,10 +29,10 @@ typedef struct {
#define T_SHM_FILENAME "/T_shm_segment"
/* number of VCD functions (to be kept up to date! see in T_messages.txt) */
-#define VCD_NUM_FUNCTIONS 142
+#define VCD_NUM_FUNCTIONS 172
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
-#define VCD_NUM_VARIABLES 107
+#define VCD_NUM_VARIABLES 118
/* first VCD function (to be kept up to date! see in T_messages.txt) */
#define VCD_FIRST_FUNCTION ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP)
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index c78bc92d36..0eef56505a 100755
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -16,63 +16,67 @@ ID = ENB_PHY_DL_TICK
ID = ENB_PHY_DLSCH_UE_DCI
DESC = eNodeB downlink UE specific DCI as sent by the PHY layer
GROUP = ALL:PHY:GRAPHIC:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
ID = ENB_PHY_DLSCH_UE_ACK
DESC = eNodeB downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
GROUP = ALL:PHY:GRAPHIC:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = ENB_PHY_DLSCH_UE_NACK
DESC = eNodeB downlink UE NACK as seen by the PHY layer in process_HARQ_feedback
GROUP = ALL:PHY:GRAPHIC:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = ENB_PHY_ULSCH_UE_DCI
DESC = eNodeB uplink UE specific DCI as sent by the PHY layer
GROUP = ALL:PHY:GRAPHIC:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS : int,L : int,firstCCE
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS : int,L : int,firstCCE
ID = ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION
DESC = eNodeB uplink UE retransmission due to PHICH NACK (see generate_phich_top)
GROUP = ALL:PHY:GRAPHIC:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = ENB_PHY_ULSCH_UE_ACK
DESC = eNodeB uplink UE ACK as seen by the PHY layer
GROUP = ALL:PHY:GRAPHIC:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = ENB_PHY_ULSCH_UE_NACK
DESC = eNodeB uplink UE NACK as seen by the PHY layer
GROUP = ALL:PHY:GRAPHIC:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = ENB_PHY_INPUT_SIGNAL
DESC = eNodeB received signal in the time domain for a duration of 1ms
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,rxdata
+ID = ENB_PHY_OUTPUT_SIGNAL
+ DESC = eNodeB sent signal in the time domain for a duration of 1ms
+ GROUP = ALL:PHY:HEAVY:ENB
+ FORMAT = int,eNB_ID : int,CC_id : int,frame : int,subframe : int,antenna : buffer,txdata
ID = ENB_PHY_UL_CHANNEL_ESTIMATE
DESC = eNodeB channel estimation in the time domain
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,antenna : buffer,chest_t
+ FORMAT = int,eNB_ID : int,rnti : int,frame : int,subframe : int,antenna : buffer,chest_t
ID = ENB_PHY_PUSCH_IQ
DESC = eNodeB PUSCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp
+ FORMAT = int,eNB_ID : int,rnti : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp
ID = ENB_PHY_PUCCH_1AB_IQ
DESC = eNodeB PUCCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,I : int,Q
+ FORMAT = int,eNB_ID : int,rnti : int,frame : int,subframe : int,I : int,Q
ID = ENB_PHY_PUCCH_1_ENERGY
DESC = eNodeB PUCCH 1 energy and threshold
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,energy : int,threshold
+ FORMAT = int,eNB_ID : int,rnti : int,frame : int,subframe : int,energy : int,threshold
ID = ENB_PHY_PHICH
DESC = eNodeB PHICH
GROUP = ALL:PHY:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,NGROUP : int,NSF : int,ngroup : int,nseq : int,ACK : int,first_rb : int,n_DMRS
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid : int,NGROUP : int,NSF : int,ngroup : int,nseq : int,ACK : int,first_rb : int,n_DMRS
ID = ENB_PHY_MSG3_ALLOCATION
DESC = eNodeB Msg3 allocation/reallocation
GROUP = ALL:PHY:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,first_transmission : int,Msg3_frame : int,Msg3_subframe
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,first_transmission : int,Msg3_frame : int,Msg3_subframe
ID = ENB_PHY_INITIATE_RA_PROCEDURE
DESC = eNodeB initiates a random access procedure after detecting enough energy for one of the preambles
GROUP = ALL:PHY:ENB
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,preamble : int,energy : int,delay
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,preamble : int,energy : int,delay
#MAC logs
ID = ENB_MAC_UE_DL_SDU
@@ -111,6 +115,10 @@ ID = ENB_MAC_UE_DL_PDU_WITH_DATA
DESC = MAC downlink PDU for an UE
GROUP = ALL:MAC:ENB
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : buffer,data
+ID = ENB_MAC_SCHEDULING_REQUEST
+ DESC = MAC scheduling request detected for an UE
+ GROUP = ALL:MAC:ENB
+ FORMAT = int,eNB_ID : int,CC_id : int,frame : int,subframe : int,rnti
#RLC logs
ID = ENB_RLC_DL
@@ -826,27 +834,27 @@ ID = UE_PHY_DL_TICK
ID = UE_PHY_DLSCH_UE_DCI
DESC = UE downlink UE specific DCI as sent by the PHY layer
GROUP = ALL:PHY:GRAPHIC:UE
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
ID = UE_PHY_DLSCH_UE_ACK
DESC = UE downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
GROUP = ALL:PHY:GRAPHIC:UE
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = UE_PHY_DLSCH_UE_NACK
DESC = UE downlink UE NACK as seen by the PHY layer in process_HARQ_feedback
GROUP = ALL:PHY:GRAPHIC:UE
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = UE_PHY_ULSCH_UE_DCI
DESC = UE uplink UE specific DCI as sent by the PHY layer
GROUP = ALL:PHY:GRAPHIC:UE
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS
ID = UE_PHY_ULSCH_UE_ACK
DESC = UE uplink UE ACK as seen by the PHY layer
GROUP = ALL:PHY:GRAPHIC:UE
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = UE_PHY_ULSCH_UE_NACK
DESC = UE uplink UE NACK as seen by the PHY layer
GROUP = ALL:PHY:GRAPHIC:UE
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid
ID = UE_PHY_INPUT_SIGNAL
DESC = UE received signal in the time domain for a duration of 1ms
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
@@ -854,7 +862,7 @@ ID = UE_PHY_INPUT_SIGNAL
ID = UE_PHY_DL_CHANNEL_ESTIMATE
DESC = UE channel estimation in the time domain
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,antenna : buffer,chest_t
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,chest_t
ID = UE_PHY_PDCCH_IQ
DESC = UE PDCCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
@@ -862,27 +870,27 @@ ID = UE_PHY_PDCCH_IQ
ID = UE_PHY_PDCCH_ENERGY
DESC = UE PDSCH 1 energy and threshold
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,pdcch_ch_level00 : int,pdcch_ch_level01 : int,pdcch_ch_level10: int,pdcch_ch_level11
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,pdcch_ch_level00 : int,pdcch_ch_level01 : int,pdcch_ch_level10: int,pdcch_ch_level11
ID = UE_PHY_PDSCH_IQ
DESC = UE PDSCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp
ID = UE_PHY_PDSCH_ENERGY
DESC = UE PDSCH 1 energy and threshold
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,pdsch_ch_level00 : int,pdsch_ch_level01 : int,pdsch_ch_level10: int,pdsch_ch_level11
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,pdsch_ch_level00 : int,pdsch_ch_level01 : int,pdsch_ch_level10: int,pdsch_ch_level11
ID = UE_PHY_PUSCH_TX_POWER
DESC = UE PUSCH tx power
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
- FORMAT = int,eNB_ID : int,UE_id : int,frame : int,subframe : int,p0_pusch : int,ampl: int,g_pusch: int,pl: int,nb_rb
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,p0_pusch : int,ampl: int,g_pusch: int,pl: int,nb_rb
ID = UE_PHY_PUCCH_TX_POWER
DESC = UE PDSCH 1 energy and threshold
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
- FORMAT = int,eNB_ID : int,UE_id : int,frame : int,subframe : int,p0_pucch : int,ampl: int,g_pucch: int,pl
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,p0_pucch : int,ampl: int,g_pucch: int,pl
ID = UE_PHY_MEAS
DESC = UE PHY measurements
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
- FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,rsrp : int,rssi : int,snr: int,rx_power: int,noise_power: int,w_cqi: int,freq_offset
+ FORMAT = int,eNB_ID : int,frame : int,subframe : int,rsrp : int,rssi : int,snr: int,rx_power: int,noise_power: int,w_cqi: int,freq_offset
#for debug/test - not used
ID = first
@@ -1350,6 +1358,22 @@ ID = VCD_VARIABLE_UE0_SFN7
DESC = VCD variable UE0_SFN7
GROUP = ALL:VCD:ENB:VCD_VARIABLE
FORMAT = ulong,value
+ID = VCD_VARIABLE_SEND_IF4_SYMBOL
+ DESC = VCD variable SEND_IF4_SYMBOL
+ GROUP = ALL:VCD:ENB:VCD_VARIABLE
+ FORMAT = ulong,value
+ID = VCD_VARIABLE_RECV_IF4_SYMBOL
+ DESC = VCD variable RECV_IF4_SYMBOL
+ GROUP = ALL:VCD:ENB:VCD_VARIABLE
+ FORMAT = ulong,value
+ID = VCD_VARIABLE_SEND_IF5_PKT_ID
+ DESC = VCD variable SEND_IF5_PKT_ID
+ GROUP = ALL:VCD:ENB:VCD_VARIABLE
+ FORMAT = ulong,value
+ID = VCD_VARIABLE_RECV_IF5_PKT_ID
+ DESC = VCD variable RECV_IF5_PKT_ID
+ GROUP = ALL:VCD:ENB:VCD_VARIABLE
+ FORMAT = ulong,value
ID = VCD_VARIABLE_UE_PDCP_FLUSH_SIZE
DESC = VCD variable UE_PDCP_FLUSH_SIZE
GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE
@@ -2061,3 +2085,11 @@ ID = VCD_FUNCTION_RECV_IF5
DESC = VCD function RECV_IF5
GROUP = ALL:VCD:ENB:VCD_FUNCTION
FORMAT = int,value
+ID = VCD_FUNCTION_TRX_COMPR_IF
+ DESC = VCD function TRX_COMPR_IF
+ GROUP = ALL:VCD:ENB:VCD_FUNCTION
+ FORMAT = int,value
+ID = VCD_FUNCTION_TRX_DECOMPR_IF
+ DESC = VCD function TRX_DECOMPR_IF
+ GROUP = ALL:VCD:ENB:VCD_FUNCTION
+ FORMAT = int,value
diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile
index f6c65f6400..6546345968 100755
--- a/common/utils/T/tracer/Makefile
+++ b/common/utils/T/tracer/Makefile
@@ -5,7 +5,8 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I.
LIBS=-lX11 -lm -lpng -lXft
-all: record replay extract_config textlog enb ue vcd macpdu2wireshark
+all: record replay extract_config textlog enb ue vcd macpdu2wireshark \
+ extract_input_subframe
record: utils.o record.o database.o config.o
$(CC) $(CFLAGS) -o record $^ $(LIBS)
@@ -16,6 +17,10 @@ replay: utils.o replay.o
extract_config: extract_config.o
$(CC) $(CFLAGS) -o extract_config $^ $(LIBS)
+extract_input_subframe: extract_input_subframe.o database.o event.o utils.o \
+ config.o
+ $(CC) $(CFLAGS) -o $@ $^ $(LIBS)
+
textlog: utils.o textlog.o database.o event.o handler.o config.o \
event_selector.o view/view.a gui/gui.a logger/logger.a \
filter/filter.a
@@ -58,8 +63,8 @@ filter/filter.a:
$(CC) $(CFLAGS) -c -o $@ $<
clean:
- rm -f *.o core tracer_remote textlog enb vcd record replay
- rm -f extract_config macpdu2wireshark
+ rm -f *.o core tracer_remote textlog enb ue vcd record replay
+ rm -f extract_config macpdu2wireshark extract_input_subframe
cd gui && make clean
cd view && make clean
cd logger && make clean
diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c
index 27d8630fd8..74bea1e675 100755
--- a/common/utils/T/tracer/enb.c
+++ b/common/utils/T/tracer/enb.c
@@ -17,6 +17,40 @@
#include "openair_logo.h"
#include "config.h"
+/****************************************************************************/
+/* conversion from rnti to "ue_id" (which does not really exists) */
+/* the idea is to assign an ue_id to an rnti as soon as we get an event */
+/* for the rnti */
+/****************************************************************************/
+
+int ue_id[65536];
+int next_ue_id;
+
+void reset_ue_ids(void)
+{
+ int i;
+ printf("resetting known UEs\n");
+ for (i = 0; i < 65536; i++) ue_id[i] = -1;
+ next_ue_id = 0;
+}
+
+int ue_id_from_rnti(void *_priv, int rnti)
+{
+rnti = 0; /* HACK, to be removed */
+ if (rnti < 0 || rnti > 65535) { printf("bad rnti %d\n", rnti); exit(1); }
+ /* rnti not seen yet? give it a new ue_id */
+ if (ue_id[rnti] == -1) {
+ ue_id[rnti] = next_ue_id;
+ next_ue_id++;
+ }
+ return ue_id[rnti];
+}
+
+/****************************************************************************/
+/* end of rnti->ue_id conversion */
+/****************************************************************************/
+
+
typedef struct {
view *phyview;
view *macview;
@@ -25,6 +59,7 @@ typedef struct {
view *rrcview;
view *legacy;
widget *current_ue_label;
+ widget *current_ue_button;
widget *prev_ue_button;
widget *next_ue_button;
widget *pusch_iq_ue_xy_plot;
@@ -116,11 +151,15 @@ static void *gui_thread(void *_g)
static filter *ticktime_filter(void *database, char *event, int i, int ue)
{
/* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */
+ /* we get the UE_id from the rnti */
return
filter_and(
filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)),
filter_and(
- filter_eq(filter_evarg(database, event, "UE_id"), filter_int(ue)),
+ filter_eq(
+ filter_evfun(database, ue_id_from_rnti, NULL,
+ filter_evarg(database, event, "rnti")),
+ filter_int(ue)),
filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0))));
}
@@ -148,23 +187,28 @@ static void set_current_ue(gui *g, enb_data *e, int ue)
logger_set_filter(e->e->pusch_iq_ue_logger,
filter_eq(
- filter_evarg(e->database, "ENB_PHY_PUSCH_IQ", "UE_ID"),
+ filter_evfun(e->database, ue_id_from_rnti, NULL,
+ filter_evarg(e->database, "ENB_PHY_PUSCH_IQ", "rnti")),
filter_int(ue)));
logger_set_filter(e->e->ul_estimate_ue_logger,
filter_eq(
- filter_evarg(e->database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "UE_ID"),
+ filter_evfun(e->database, ue_id_from_rnti, NULL,
+ filter_evarg(e->database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "rnti")),
filter_int(ue)));
logger_set_filter(e->e->pucch1_energy_ue_threshold_logger,
filter_eq(
- filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
+ filter_evfun(e->database, ue_id_from_rnti, NULL,
+ filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "rnti")),
filter_int(ue)));
logger_set_filter(e->e->pucch1_energy_ue_energy_logger,
filter_eq(
- filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
+ filter_evfun(e->database, ue_id_from_rnti, NULL,
+ filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "rnti")),
filter_int(ue)));
logger_set_filter(e->e->pucch_iq_ue_logger,
filter_eq(
- filter_evarg(e->database, "ENB_PHY_PUCCH_1AB_IQ", "UE_ID"),
+ filter_evfun(e->database, ue_id_from_rnti, NULL,
+ filter_evarg(e->database, "ENB_PHY_PUCCH_1AB_IQ", "rnti")),
filter_int(ue)));
for (i = 0; i < 8; i++) {
logger_set_filter(e->e->dl_dci_logger[i],
@@ -185,11 +229,13 @@ static void set_current_ue(gui *g, enb_data *e, int ue)
}
logger_set_filter(e->e->dl_mcs_logger,
filter_eq(
- filter_evarg(e->database, "ENB_PHY_DLSCH_UE_DCI", "UE_id"),
+ filter_evfun(e->database, ue_id_from_rnti, NULL,
+ filter_evarg(e->database, "ENB_PHY_DLSCH_UE_DCI", "rnti")),
filter_int(ue)));
logger_set_filter(e->e->ul_mcs_logger,
filter_eq(
- filter_evarg(e->database, "ENB_PHY_ULSCH_UE_DCI", "UE_id"),
+ filter_evfun(e->database, ue_id_from_rnti, NULL,
+ filter_evarg(e->database, "ENB_PHY_ULSCH_UE_DCI", "rnti")),
filter_int(ue)));
}
@@ -205,6 +251,7 @@ static void click(void *private, gui *g,
if (button != 1) return;
if (w == e->prev_ue_button) { ue--; if (ue < 0) ue = 0; }
if (w == e->next_ue_button) ue++;
+ if (w == e->current_ue_button) reset_ue_ids();
if (pthread_mutex_lock(&ed->lock)) abort();
if (ue != ed->ue) {
@@ -248,10 +295,12 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
widget_add_child(g, col, logo, -1);
w = new_container(g, HORIZONTAL);
widget_add_child(g, col, w, -1);
+ /* TODO: use button widget, not label widget */
w2 = new_label(g, "");
widget_add_child(g, w, w2, -1);
+ label_set_clickable(g, w2, 1);
+ e->current_ue_button = w2;
e->current_ue_label = w2;
- /* TODO: use button widget, not label widget */
w2 = new_label(g, " [prev UE] ");
widget_add_child(g, w, w2, -1);
label_set_clickable(g, w2, 1);
@@ -590,6 +639,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
e->legacy = new_view_textlist(10000, 10, g, text);
set_current_ue(g, ed, 0);
+ register_notifier(g, "click", e->current_ue_button, click, ed);
register_notifier(g, "click", e->prev_ue_button, click, ed);
register_notifier(g, "click", e->next_ue_button, click, ed);
}
@@ -628,6 +678,8 @@ int main(int n, char **v)
enb_gui eg;
enb_data enb_data;
+ reset_ue_ids();
+
/* write on a socket fails if the other end is closed and we get SIGPIPE */
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
diff --git a/common/utils/T/tracer/extract_input_subframe.c b/common/utils/T/tracer/extract_input_subframe.c
new file mode 100644
index 0000000000..b5f74b3b27
--- /dev/null
+++ b/common/utils/T/tracer/extract_input_subframe.c
@@ -0,0 +1,109 @@
+#include
+#include
+#include
+#include
+#include "database.h"
+#include "event.h"
+#include "config.h"
+
+void usage(void)
+{
+ printf(
+"usage: [options] \n"
+"options:\n"
+" -d this option is mandatory\n"
+" -v verbose\n"
+ );
+ exit(1);
+}
+
+int main(int n, char **v)
+{
+ char *database_filename = NULL;
+ void *database;
+ int i;
+ int input_event_id;
+ database_event_format f;
+ char *file = NULL;
+ int fd;
+ int frame = -1, subframe = -1;
+ int frame_arg, subframe_arg, buffer_arg;
+ int verbose = 0;
+
+ for (i = 1; i < n; i++) {
+ if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
+ if (!strcmp(v[i], "-d"))
+ { if (i > n-2) usage(); database_filename = v[++i]; continue; }
+ if (!strcmp(v[i], "-v")) { verbose = 1; continue; }
+ if (file == NULL) { file = v[i]; continue; }
+ if (frame == -1) { frame = atoi(v[i]); continue; }
+ if (subframe == -1) { subframe = atoi(v[i]); continue; }
+ usage();
+ }
+ if (file == NULL || frame == -1 || subframe == -1) usage();
+
+ if (database_filename == NULL) {
+ printf("ERROR: provide a database file (-d)\n");
+ exit(1);
+ }
+
+ database = parse_database(database_filename);
+
+ load_config_file(database_filename);
+
+ input_event_id = event_id_from_name(database, "ENB_PHY_INPUT_SIGNAL");
+ f = get_format(database, input_event_id);
+
+ frame_arg = subframe_arg = buffer_arg = -1;
+ for (i = 0; i < f.count; i++) {
+ if (!strcmp(f.name[i], "frame")) {
+ if (frame_arg != -1) goto err;
+ if (strcmp(f.type[i], "int")) goto err;
+ frame_arg = i;
+ }
+ if (!strcmp(f.name[i], "subframe")) {
+ if (subframe_arg != -1) goto err;
+ if (strcmp(f.type[i], "int")) goto err;
+ subframe_arg = i;
+ }
+ if (!strcmp(f.name[i], "rxdata")) {
+ if (buffer_arg != -1) goto err;
+ if (strcmp(f.type[i], "buffer")) goto err;
+ buffer_arg = i;
+ }
+ continue;
+err:
+ printf("cannot deal with ENB_PHY_INPUT_SIGNAL from database file\n");
+ exit(1);
+ }
+ if (frame_arg == -1 || subframe_arg == -1 || buffer_arg == -1) goto err;
+
+ fd = open(file, O_RDONLY);
+ if (fd == -1) { perror(file); exit(1); }
+
+ /* get wanted frame/subframe */
+ while (1) {
+ char v[T_BUFFER_MAX];
+ event e;
+ e = get_event(fd, v, database);
+ if (e.type == -1) break;
+ if (e.type != input_event_id) continue;
+ if (verbose)
+ printf("input frame %d subframe %d size %d\n",
+ e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize);
+ if (!(frame == e.e[frame_arg].i && subframe == e.e[subframe_arg].i))
+ continue;
+#if 0
+for (i = 0; i < e.e[buffer_arg].bsize/2; i++) {
+short *x = e.e[buffer_arg].b;
+x[i] *= 14;
+}
+#endif
+ fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, stdout);
+ fflush(stdout);
+ return 0;
+ }
+
+ printf("frame %d subframe %d not found\n", frame, subframe);
+ return 0;
+}
diff --git a/common/utils/T/tracer/filter/filter.c b/common/utils/T/tracer/filter/filter.c
index d26dc25000..ddc9e3af3e 100755
--- a/common/utils/T/tracer/filter/filter.c
+++ b/common/utils/T/tracer/filter/filter.c
@@ -10,6 +10,8 @@ struct filter {
struct { struct filter *a, *b; } op2;
int v;
struct { int event_type; int arg_index; } evarg;
+ struct { int (*fun)(void *priv, int v); void *priv;
+ struct filter *x; } evfun;
} v;
int (*eval)(struct filter *this, event e);
@@ -52,6 +54,11 @@ int eval_evarg(struct filter *f, event e)
return e.e[f->v.evarg.arg_index].i;
}
+int eval_evfun(struct filter *f, event e)
+{
+ return f->v.evfun.fun(f->v.evfun.priv, f->v.evfun.x->eval(f->v.evfun.x, e));
+}
+
/****************************************************************************/
/* free memory functions */
/****************************************************************************/
@@ -63,6 +70,12 @@ void free_op2(struct filter *f)
free(f);
}
+void free_evfun(struct filter *f)
+{
+ free_filter(f->v.evfun.x);
+ free(f);
+}
+
void free_noop(struct filter *f)
{
free(f);
@@ -135,6 +148,19 @@ filter *filter_evarg(void *database, char *event_name, char *varname)
return ret;
}
+filter *filter_evfun(void *database, int (*fun)(void *priv, int v),
+ void *priv, filter *x)
+{
+ struct filter *ret = calloc(1, sizeof(struct filter));
+ if (ret == NULL) abort();
+ ret->eval = eval_evfun;
+ ret->free = free_evfun;
+ ret->v.evfun.fun = fun;
+ ret->v.evfun.priv = priv;
+ ret->v.evfun.x = x;
+ return ret;
+}
+
void free_filter(filter *_f)
{
struct filter *f;
diff --git a/common/utils/T/tracer/filter/filter.h b/common/utils/T/tracer/filter/filter.h
index d45e0bdd86..0e48fb6ca3 100755
--- a/common/utils/T/tracer/filter/filter.h
+++ b/common/utils/T/tracer/filter/filter.h
@@ -9,6 +9,8 @@ filter *filter_and(filter *a, filter *b);
filter *filter_eq(filter *a, filter *b);
filter *filter_int(int v);
filter *filter_evarg(void *database, char *event_name, char *varname);
+filter *filter_evfun(void *database, int (*fun)(void *priv, int v),
+ void *priv, filter *x);
int filter_eval(filter *f, event e);
diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c
index d70a6386b9..5ffb17c234 100755
--- a/common/utils/itti/intertask_interface.c
+++ b/common/utils/itti/intertask_interface.c
@@ -623,7 +623,7 @@ static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t
read_ret = read (itti_desc.threads[thread_id].task_event_fd, &sem_counter, sizeof(sem_counter));
AssertFatal (read_ret == sizeof(sem_counter), "Read from task message FD (%d) failed (%d/%d)!\n", thread_id, (int) read_ret, (int) sizeof(sem_counter));
-
+ printf("sem_counter %d task %d\n", (int)sem_counter, task_id);
if (lfds611_queue_dequeue (itti_desc.tasks[task_id].message_queue, (void **) &message) == 0) {
/* No element in list -> this should not happen */
AssertFatal (0, "No message in queue for task %d while there are %d events and some for the messages queue!\n", task_id, epoll_ret);
@@ -631,9 +631,13 @@ static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t
AssertFatal(message != NULL, "Message from message queue is NULL!\n");
*received_msg = message->msg;
+
+ printf("ITTI: message %s\n", ITTI_MSG_NAME(message->msg));
+
result = itti_free (ITTI_MSG_ORIGIN_ID(*received_msg), message);
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+
/* Mark that the event has been processed */
itti_desc.threads[thread_id].events[i].events &= ~EPOLLIN;
return;
diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c
new file mode 100644
index 0000000000..27e7ba8b09
--- /dev/null
+++ b/common/utils/load_module_shlib.c
@@ -0,0 +1,52 @@
+
+/* FT NOKBLF:
+ * this source is to be linked with the program using the telnet server, it looks for
+ * the telnet server dynamic library, possibly loads it and calls the telnet server
+ * init functions
+*/
+#define _GNU_SOURCE
+#include
+#include
+#include
+#include
+#include
+#include
+#include "openair1/PHY/defs.h"
+#define LOAD_MODULE_SHLIB_MAIN
+#include "load_module_shlib.h"
+int load_module_shlib(char *modname)
+{
+ void *lib_handle;
+ initfunc_t fpi;
+ char *tmpstr;
+ int ret=0;
+
+ tmpstr = malloc(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;
+ }
+ sprintf(tmpstr,"lib%s.so",modname);
+ lib_handle = dlopen(tmpstr, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
+ if (!lib_handle) {
+ printf("[LOADER] library %s is not loaded: %s\n", tmpstr,dlerror());
+ ret = -1;
+ } else {
+ sprintf(tmpstr,"init_%s",modname);
+ fpi = dlsym(lib_handle,tmpstr);
+
+ if (fpi != NULL )
+ {
+ fpi();
+ }
+ else
+ {
+ fprintf(stderr,"[LOADER] %s %d %s function not found %s\n",__FILE__, __LINE__, dlerror(),tmpstr);
+ ret = -1;
+ }
+ }
+
+ if (tmpstr != NULL) free(tmpstr);
+ if (lib_handle != NULL) dlclose(lib_handle);
+ return ret;
+}
diff --git a/common/utils/load_module_shlib.h b/common/utils/load_module_shlib.h
new file mode 100644
index 0000000000..2db1d17ec0
--- /dev/null
+++ b/common/utils/load_module_shlib.h
@@ -0,0 +1,11 @@
+#ifndef LOAD_SHLIB_H
+#define LOAD_SHLIB_H
+
+
+typedef int(*initfunc_t)(void);
+#ifdef LOAD_MODULE_SHLIB_MAIN
+#else
+extern int load_module_shlib(char *modname);
+#endif
+
+#endif
diff --git a/common/utils/telnetsrv/CMakeLists.txt b/common/utils/telnetsrv/CMakeLists.txt
new file mode 100644
index 0000000000..51284ad2e8
--- /dev/null
+++ b/common/utils/telnetsrv/CMakeLists.txt
@@ -0,0 +1,59 @@
+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_FXP -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 -DNB_ANTENNAS_TXRX=2 -DNEW_FFT -DNO_RRM -DNone=1 -DOAI_NW_DRIVER_USE_NETLINK -DOPENAIR1 -DOPENAIR2 -DOPENAIR_LTE -DPC_DSP -DPC_TARGET -DPHYSIM -DPHY_CONTEXT -DPUCCH -DRel10=1 -DS1AP_VERSION=R10 -DTRACE_RLC_MUTEX -DUSER_MODE -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")
diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c
new file mode 100644
index 0000000000..6d6b84f568
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv.c
@@ -0,0 +1,696 @@
+/*
+ * 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.0 (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.c
+ * \brief: implementation of a telnet server
+ * \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
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "common/config/config_userapi.h"
+
+
+#include "telnetsrv_phycmd.h"
+#include "telnetsrv_proccmd.h"
+static char* telnet_defstatmod[] = {"softmodem","phy"};
+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
+paramdef_t telnetoptions[] = {
+/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/* configuration parameters for telnet utility */
+/* optname helpstr paramflags XXXptr defXXXval type numelt */
+/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+ {"listenaddr", "", 0, uptr:&telnetparams.listenaddr, defstrval:"0.0.0.0", TYPE_IPV4ADDR, 0 },
+ {"listenport", "", 0, uptr:&(telnetparams.listenport), defuintval:9090, TYPE_UINT, 0 },
+ {"priority", "", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0 },
+ {"loopcount", "", 0, uptr:&(telnetparams.loopcount), defuintval:10, TYPE_UINT, 0 },
+ {"loopdelay", "", 0, uptr:&(telnetparams.loopdelay), defuintval:5000, TYPE_UINT, 0 },
+ {"phypbsize", "",0, uptr:&(telnetparams.phyprntbuff_size),defuintval:65000, TYPE_UINT, 0 },
+ {"staticmod", "", 0, NULL, defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,1},
+ {"shrmod", "", 0, NULL, NULL,TYPE_STRINGLIST,0 },
+};
+
+int get_phybsize() {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);
+
+telnetshell_vardef_t telnet_vardef[] = {
+{"debug",TELNET_VARTYPE_INT32,&telnetparams.telnetdbg},
+{"prio",TELNET_VARTYPE_INT32,&telnetparams.priority},
+{"loopc",TELNET_VARTYPE_INT32,&telnetparams.loopcount},
+{"loopd",TELNET_VARTYPE_INT32,&telnetparams.loopdelay},
+{"phypb",TELNET_VARTYPE_INT32,&telnetparams.phyprntbuff_size},
+{"",0,NULL}
+};
+
+telnetshell_cmddef_t telnet_cmdarray[] = {
+ {"redirlog","[here,file,off]",setoutput},
+ {"param","[prio]",setparam},
+ {"","",NULL},
+};
+
+
+void client_printf(const char *message, ...)
+{
+ va_list va_args;
+
+ va_start(va_args, message);
+ if (telnetparams.new_socket > 0)
+ {
+ vsnprintf(telnetparams.msgbuff,sizeof(telnetparams.msgbuff)-1,message, va_args);
+ send(telnetparams.new_socket,telnetparams.msgbuff , strlen(telnetparams.msgbuff), MSG_NOSIGNAL);
+ }
+ else
+ {
+ vprintf(message, va_args);
+ }
+ va_end(va_args);
+ return ;
+}
+
+#define NICE_MAX 19
+#define NICE_MIN -20
+void set_sched(pthread_t tid, int pid, int priority)
+{
+int rt;
+struct sched_param schedp;
+int policy;
+char strpolicy[10];
+
+
+//sched_get_priority_max(SCHED_FIFO)
+if (priority < NICE_MIN)
+ {
+ policy=SCHED_FIFO;
+ sprintf(strpolicy,"%s","fifo");
+ schedp.sched_priority= NICE_MIN - priority ;
+ }
+else if (priority > NICE_MAX)
+ {
+ policy=SCHED_IDLE;
+ sprintf(strpolicy,"%s","idle");
+ schedp.sched_priority=0;
+ }
+else
+ {
+ policy=SCHED_OTHER;
+ sprintf(strpolicy,"%s","other");
+ schedp.sched_priority=0;
+ }
+if( tid != 0)
+ {
+ rt = pthread_setschedparam(tid, policy, &schedp);
+ }
+else if(pid > 0)
+ {
+ rt = sched_setscheduler( pid, policy,&schedp);
+ }
+if (rt != 0)
+ {
+ client_printf("Error %i: %s modifying sched param to %s:%i, \n",
+ errno,strerror(errno),strpolicy,schedp.sched_priority);
+ }
+else
+ {
+ client_printf("policy set to %s, priority %i\n",strpolicy,schedp.sched_priority);
+ }
+
+
+
+if ( policy == SCHED_OTHER)
+ {
+ if ( tid > 0 && tid != pthread_self())
+ {
+ client_printf("setting nice value using a thread id not implemented....\n");
+ }
+ else if (pid > 0)
+ {
+ errno=0;
+ rt = setpriority(PRIO_PROCESS,pid,priority);
+ if (rt != 0)
+ {
+ client_printf("Error %i: %s calling setpriority, \n",errno,strerror(errno));
+ }
+ else
+ {
+ client_printf("nice value set to %i\n",priority);
+ }
+ }
+ }
+}
+
+void set_affinity(pthread_t tid, int pid, int coreid)
+{
+cpu_set_t cpuset;
+int rt;
+
+ CPU_ZERO(&cpuset);
+ CPU_SET(coreid, &cpuset);
+ if (tid > 0)
+ {
+ rt = pthread_setaffinity_np((pthread_t)tid, sizeof(cpu_set_t), &cpuset);
+ }
+ else if (pid > 0)
+ {
+ rt = sched_setaffinity((pid_t)pid, sizeof(cpu_set_t), &cpuset);
+ }
+ if (rt != 0)
+ {
+ client_printf("Error %i: %s calling , xxx_setaffinity...\n",errno,strerror(errno));
+ }
+ else
+ {
+ client_printf("thread %i affinity set to %i\n",(pid==0)?(int)tid:pid,coreid);
+ }
+}
+/*------------------------------------------------------------------------------------*/
+/*
+function implementing telnet server specific commands, parameters of the
+telnet_cmdarray table
+*/
+
+void redirstd(char *newfname,telnet_printfunc_t prnt )
+{
+FILE *fd;
+ fd=freopen(newfname, "w", stdout);
+ if (fd == NULL)
+ {
+ prnt("ERROR: stdout redir to %s error %s",strerror(errno));
+ }
+ fd=freopen(newfname, "w", stderr);
+ if (fd == NULL)
+ {
+ prnt("ERROR: stderr redir to %s error %s",strerror(errno));
+ }
+}
+int setoutput(char *buff, int debug, telnet_printfunc_t prnt)
+{
+
+char cmds[TELNET_MAX_MSGLENGTH/TELNET_CMD_MAXSIZE][TELNET_CMD_MAXSIZE];
+char *logfname;
+char stdout_str[64];
+
+
+#define LOGFILE "logfile.log"
+memset(cmds,0,sizeof(cmds));
+sscanf(buff,"%9s %32s %9s %9s %9s", cmds[0],cmds[1],cmds[2],cmds[3],cmds[4] );
+if (strncasecmp(cmds[0],"here",4) == 0)
+ {
+ fflush(stdout);
+ sprintf(stdout_str,"/proc/%i/fd/%i",getpid(),telnetparams.new_socket);
+ dup2(telnetparams.new_socket,fileno(stdout));
+// freopen(stdout_str, "w", stdout);
+// freopen(stdout_str, "w", stderr);
+ dup2(telnetparams.new_socket,fileno(stderr));
+ prnt("Log output redirected to this terminal (%s)\n",stdout_str);
+ }
+if (strncasecmp(cmds[0],"file",4) == 0)
+ {
+ if (cmds[1][0] == 0)
+ logfname=LOGFILE;
+ else
+ logfname=cmds[1];
+ fflush(stdout);
+ redirstd(logfname,prnt);
+
+ }
+if (strncasecmp(cmds[0],"off",3) == 0)
+ {
+ fflush(stdout);
+ redirstd("/dev/tty",prnt);
+ }
+
+return CMDSTATUS_FOUND;
+} /* setoutput */
+
+int setparam(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 (strncasecmp(cmds[0],"prio",4) == 0)
+ {
+ pthread_attr_t attr;
+ int prio;
+ prio=(int)strtol(cmds[1],NULL,0);
+ if (errno == ERANGE)
+ return CMDSTATUS_VARNOTFOUND;
+ telnetparams.priority = prio;
+ set_sched(pthread_self(),0,prio);
+ return CMDSTATUS_FOUND;
+ }
+if (strncasecmp(cmds[0],"aff",3) == 0)
+ {
+ int aff;
+ aff=(int)strtol(cmds[1],NULL,0);
+ if (errno == ERANGE)
+ return CMDSTATUS_VARNOTFOUND;
+ set_affinity(pthread_self(),0,aff);
+ return CMDSTATUS_FOUND;
+ }
+
+return CMDSTATUS_NOTFOUND;
+} /* setparam */
+/*-------------------------------------------------------------------------------------------------------*/
+/*
+generic commands available for all modules loaded by the server
+*/
+
+int setgetvar(int moduleindex,char getorset,char *params)
+{
+int n,i;
+char varname[TELNET_CMD_MAXSIZE];
+char varval[TELNET_CMD_MAXSIZE];
+
+ memset(varname,0,sizeof(varname));
+ memset(varval,0,sizeof(varval));
+ n = sscanf(params,"%s %s",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)
+ {
+ if (n > 0 && (getorset == 'g' || getorset == 'G'))
+ {
+ client_printf("%s, %s = ", telnetparams.CmdParsers[moduleindex].module,
+ telnetparams.CmdParsers[moduleindex].var[i].varname );
+ switch(telnetparams.CmdParsers[moduleindex].var[i].vartype)
+ {
+ case TELNET_VARTYPE_INT32:
+ client_printf("%i\n",*(int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
+ break;
+ case TELNET_VARTYPE_INT16:
+ client_printf("%hi\n",*(short *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
+ break;
+ 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)));
+ break;
+ default:
+ client_printf("unknown type\n");
+ break;
+ }
+ }
+ if (n > 1 && (getorset == 's' || getorset == 'S'))
+ {
+ client_printf("%s, %s set to \n", telnetparams.CmdParsers[moduleindex].module,
+ telnetparams.CmdParsers[moduleindex].var[i].varname);
+
+ switch(telnetparams.CmdParsers[moduleindex].var[i].vartype)
+ {
+ case TELNET_VARTYPE_INT32:
+ *(int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr) = (int)strtol(varval,NULL,0);
+ client_printf("%i\n",*(int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
+ break;
+ case TELNET_VARTYPE_INT16:
+ *(short *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr) = (short)strtol(varval,NULL,0);
+ client_printf("%hi\n",*(short *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
+ break;
+ 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;
+ default:
+ client_printf("unknown type\n");
+ break;
+ }
+ }
+ }
+ }
+return CMDSTATUS_VARNOTFOUND;
+}
+/*----------------------------------------------------------------------------------------------------*/
+char *get_time(char *buff,int bufflen)
+{
+
+struct tm tmstruct;
+time_t now = time (0);
+strftime (buff, bufflen, "%Y-%m-%d %H:%M:%S.000", localtime_r(&now,&tmstruct));
+return buff;
+}
+
+int process_command(char *buf)
+{
+int i,j,k;
+char modulename[TELNET_CMD_MAXSIZE];
+char cmd[TELNET_CMD_MAXSIZE];
+char cmdb[TELNET_MAX_MSGLENGTH];
+char *bufbck;
+int rt;
+
+memset(modulename,0,sizeof(modulename));
+memset(cmd,0,sizeof(cmd));
+memset(cmdb,0,sizeof(cmdb));
+if (strncasecmp(buf,"ex",2) == 0)
+ return CMDSTATUS_EXIT;
+
+if (strncasecmp(buf,"help",4) == 0)
+ {
+ for (i=0; telnetparams.CmdParsers[i].var != NULL && telnetparams.CmdParsers[i].cmd != NULL; i++)
+ {
+ client_printf(" module %i = %s:\n",i,telnetparams.CmdParsers[i].module);
+ for(j=0; telnetparams.CmdParsers[i].var[j].varvalptr != NULL ; j++)
+ {
+ client_printf(" %s [get set] %s \n",
+ telnetparams.CmdParsers[i].module, telnetparams.CmdParsers[i].var[j].varname);
+ }
+ for(j=0; telnetparams.CmdParsers[i].cmd[j].cmdfunc != NULL ; j++)
+ {
+ client_printf(" %s %s %s\n",
+ telnetparams.CmdParsers[i].module,telnetparams.CmdParsers[i].cmd[j].cmdname,
+ telnetparams.CmdParsers[i].cmd[j].helpstr);
+ }
+ }
+ return CMDSTATUS_FOUND;
+ }
+
+memset(modulename,0,sizeof(modulename));
+memset(cmd,0,sizeof(cmd));
+memset(cmdb,0,sizeof(cmdb));
+bufbck=strdup(buf);
+rt=CMDSTATUS_NOTFOUND;
+j = sscanf(buf,"%9s %9s %[^\t\n]",modulename,cmd,cmdb);
+if (telnetparams.telnetdbg > 0)
+ printf("process_command: %i words, module=%s cmd=%s, parameters= %s\n",j,modulename,cmd,cmdb);
+for (i=0; j>=2 && telnetparams.CmdParsers[i].var != NULL && telnetparams.CmdParsers[i].cmd != NULL; i++)
+ {
+ if ( (strncasecmp(telnetparams.CmdParsers[i].module,modulename,strlen(telnetparams.CmdParsers[i].module)) == 0))
+ {
+ if (strncasecmp(cmd,"getall",7) == 0 )
+ {
+ for(j=0; telnetparams.CmdParsers[i].var[j].varvalptr != NULL ; j++)
+ {
+ setgetvar(i,'g',telnetparams.CmdParsers[i].var[j].varname);
+ }
+ rt= CMDSTATUS_FOUND;
+ }
+ else if (strncasecmp(cmd,"get",3) == 0 || strncasecmp(cmd,"set",3) == 0)
+ {
+ rt= setgetvar(i,cmd[0],cmdb);
+ }
+ else
+ {
+ for (k=0 ; telnetparams.CmdParsers[i].cmd[k].cmdfunc != NULL ; k++)
+ {
+ if (strncasecmp(cmd, telnetparams.CmdParsers[i].cmd[k].cmdname,sizeof(telnetparams.CmdParsers[i].cmd[k].cmdname)) == 0)
+ {
+ telnetparams.CmdParsers[i].cmd[k].cmdfunc(cmdb, telnetparams.telnetdbg, client_printf);
+ rt= CMDSTATUS_FOUND;
+ }
+ } /* for k */
+ }/* else */
+ }/* strncmp: module name test */
+ else if (strncasecmp(modulename,"loop",4) == 0 )
+ {
+ int lc;
+ int f = fcntl(telnetparams.new_socket,F_GETFL);
+ fcntl (telnetparams.new_socket, F_SETFL, O_NONBLOCK | f);
+ for(lc=0; lc 0 )
+ {
+ break;
+ }
+ }
+ fcntl (telnetparams.new_socket, F_SETFL, f);
+ rt= CMDSTATUS_FOUND;
+ } /* loop */
+ } /* for i */
+free(bufbck);
+return rt;
+}
+
+void run_telnetsrv(void)
+{
+int sock;
+struct sockaddr_in name;
+char buf[TELNET_MAX_MSGLENGTH];
+struct sockaddr cli_addr;
+unsigned int cli_len = sizeof(cli_addr);
+int readc , filled;
+
+int status;
+int optval = 1;
+
+pthread_setname_np(pthread_self(), "telnet");
+set_sched(pthread_self(),0,telnetparams.priority);
+sock = socket(AF_INET, SOCK_STREAM, 0);
+if (sock < 0)
+ fprintf(stderr,"[TELNETSRV] Error %s on socket call\n",strerror(errno));
+
+setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
+name.sin_family = AF_INET;
+if (telnetparams.listenaddr == 0)
+ name.sin_addr.s_addr = INADDR_ANY;
+else
+ name.sin_addr.s_addr = telnetparams.listenaddr;
+name.sin_port = htons((unsigned short)(telnetparams.listenport));
+
+if(bind(sock, (void*) &name, sizeof(name)))
+ fprintf(stderr,"[TELNETSRV] Error %s on bind call\n",strerror(errno));
+if(listen(sock, 1) == -1)
+ fprintf(stderr,"[TELNETSRV] Error %s on listen call\n",strerror(errno));
+
+
+
+printf("\nInitializing telnet server...\n");
+while( (telnetparams.new_socket = accept(sock, &cli_addr, &cli_len)) )
+ {
+ printf("[TELNETSRV] Telnet client connected....\n");
+
+
+ if(telnetparams.new_socket < 0)
+ fprintf(stderr,"[TELNETSRV] Error %s on accept call\n",strerror(errno));
+
+ while(telnetparams.new_socket>0)
+ {
+ filled = 0;
+ memset(buf,0,sizeof(buf));
+ while(filled < ( TELNET_MAX_MSGLENGTH-1))
+ {
+ readc = recv(telnetparams.new_socket, buf+filled, TELNET_MAX_MSGLENGTH-filled-1, 0);
+ if(!readc)
+ break;
+ filled += readc;
+ if(buf[filled-1] == '\n')
+ {
+ buf[filled-1] = 0;
+
+ break;
+ }
+ }
+ if(!readc)
+ {
+ printf ("[TELNETSRV] Telnet Client disconnected.\n");
+ break;
+ }
+ if (telnetparams.telnetdbg > 0)
+ printf("[TELNETSRV] Command received: readc %i filled %i %s\n", readc, filled ,buf);
+ if (strlen(buf) >= 2 )
+ {
+ status=process_command(buf);
+ }
+ else
+ status=CMDSTATUS_NOCMD;
+
+ 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);
+ }
+ send(telnetparams.new_socket, TELNET_PROMPT, sizeof(TELNET_PROMPT), MSG_NOSIGNAL);
+ }
+ else
+ {
+ printf ("[TELNETSRV] Closing telnet connection...\n");
+ break;
+ }
+ }
+
+ close(telnetparams.new_socket);
+ printf ("[TELNETSRV] Telnet server waitting for connection...\n");
+ }
+close(sock);
+return;
+}
+
+/*------------------------------------------------------------------------------------------------*/
+/* set_telnetmodule loads the commands delivered with the telnet server
+ *
+ *
+ *
+*/
+void exec_moduleinit(char *modname)
+{
+void (*fptr)();
+char initfunc[TELNET_CMD_MAXSIZE+9];
+
+ if (strlen(modname) > TELNET_CMD_MAXSIZE)
+ {
+ fprintf(stderr,"[TELNETSRV] module %s not loaded, name exceeds the %i size limit\n",
+ modname, TELNET_CMD_MAXSIZE);
+ return;
+ }
+ sprintf(initfunc,"add_%s_cmds",modname);
+ fptr = dlsym(RTLD_DEFAULT,initfunc);
+ if ( fptr != NULL)
+ {
+ fptr();
+ }
+ else
+ {
+ fprintf(stderr,"[TELNETSRV] couldn't find %s for module %s \n",initfunc,modname);
+ }
+}
+
+int add_embeddedmodules()
+{
+
+
+
+
+ for(int i=0; i "
+#define TELNET_MAXCMD 20
+#define TELNET_CMD_MAXSIZE 10
+#define TELNET_HELPSTR_SIZE 80
+
+/* status return by the command parser after it analysed user input */
+#define CMDSTATUS_NOCMD 0
+#define CMDSTATUS_EXIT 1
+#define CMDSTATUS_FOUND 2
+#define CMDSTATUS_VARNOTFOUND 3
+#define CMDSTATUS_NOTFOUND 4
+
+/*----------------------------------------------------------------------------*/
+/* structure to be used when adding a module to the telnet server */
+/* This is the second parameter of the add_telnetcmd function, which can be used */
+/* to add a set of new command to the telnet server shell */
+typedef void(*telnet_printfunc_t)(const char* format, ...);
+typedef int(*cmdfunc_t)(char*, int, telnet_printfunc_t prnt);
+
+typedef struct cmddef {
+ char cmdname[TELNET_CMD_MAXSIZE];
+ char helpstr[TELNET_HELPSTR_SIZE];
+ cmdfunc_t cmdfunc;
+} telnetshell_cmddef_t;
+
+/*----------------------------------------------------------------------------*/
+/*structure to be used when adding a module to the telnet server */
+/* This is the first parameter of the add_telnetcmd function, which can be used */
+/* to add a set of new variables which can be got/set from the telnet server shell */
+#define TELNET_VARTYPE_INT32 1
+#define TELNET_VARTYPE_INT16 2
+#define TELNET_VARTYPE_INT64 3
+#define TELNET_VARTYPE_STRING 4
+#define TELNET_VARTYPE_DOUBLE 5
+#define TELNET_VARTYPE_PTR 6
+typedef struct variabledef {
+ char varname[TELNET_CMD_MAXSIZE];
+ char vartype;
+ void *varvalptr;
+} telnetshell_vardef_t;
+
+
+
+/*----------------------------------------------------------------------------*/
+/* internal structure definitions */
+/* cmdparser_t is used to store all modules which have been added to the telnet server. */
+/* Each time the add_telnetcmd function is used, the internal array cmdparser_t[] of the */
+/* telnet server is populated with the new commands and variables */
+typedef struct cmdparser {
+ char module[TELNET_CMD_MAXSIZE]; // module name = first token of the telnet shell command
+ telnetshell_cmddef_t *cmd; // array of functions added to the shell
+ telnetshell_vardef_t *var; // array of variables added to the shell
+} cmdparser_t;
+
+/* telnetsrv_params_t is an internal structure storing all the current parameters and */
+/* global variables used by the telnet server */
+typedef struct {
+ pthread_t telnet_pthread; // thread id of the telnet server
+ int telnetdbg; // debug level of the server
+ int priority; // server running priority
+ 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
+ cmdparser_t CmdParsers[TELNET_MAXCMD]; // array of registered modules.
+ char msgbuff[TELNET_MAX_MSGLENGTH]; // internal buffer of the client_printf function which is used to print to the client terminal */
+ unsigned int listenport; // ip port the telnet server is listening on
+ unsigned int listenaddr; // ip address the telnet server is listening on
+ unsigned int loopcount; // loop command param: number of loop iteration
+ unsigned int loopdelay; // loop command param: delay in ms between 2 iterations
+ unsigned int phyprntbuff_size; // for phy module, dump_eNB_stats function buffer size
+} telnetsrv_params_t;
+
+
+
+typedef int(*addcmdfunc_t)(char*, telnetshell_vardef_t*, telnetshell_cmddef_t*);
+
+typedef void(*settelnetmodule_t)(char *name, void *ptr);
+
+/*-------------------------------------------------------------------------------------------*/
+/*
+VT escape sequence definition, for smarter display....
+*/
+
+#define ESC "\x1b"
+#define CSI "\x1b["
+#define BOLD "\x1b[1m"
+#define RED "\x1b[31m"
+#define GREEN "\x1b[32m"
+#define BLUE "\x1b[34m"
+#define MAGENTA "\x1b[35m"
+#define CYAN "\x1b[36m"
+#define STDFMT "\x1b[0m"
+
+/*---------------------------------------------------------------------------------------------*/
+#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();
+#endif
+#endif
diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.c b/common/utils/telnetsrv/telnetsrv_phycmd.c
new file mode 100644
index 0000000000..1e267f6890
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv_phycmd.c
@@ -0,0 +1,111 @@
+#define _GNU_SOURCE
+#include
+#include
+
+
+#define TELNETSERVERCODE
+#include "telnetsrv.h"
+#define TELNETSRV_PHYCMD_MAIN
+#include "telnetsrv_phycmd.h"
+char *prnbuff;
+extern int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length);
+
+void init_phytelnet()
+{
+prnbuff=malloc(get_phybsize() );
+if (prnbuff == NULL)
+ {
+ fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno));
+ }
+}
+
+void display_uestatshead( telnet_printfunc_t prnt)
+{
+prnt("cc ue rnti Dmcs Umcs tao tau Dbr Dtb \n");
+}
+
+void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag)
+{
+
+int p;
+
+ p=dump_eNB_l2_stats( prnbuff, 0);
+ if(prntflag>=1)
+ prnt("%s\n",prnbuff);
+ if(debug>=1)
+ prnt("%i bytes printed\n",p);
+
+
+}
+
+void display_uestats(int debug, telnet_printfunc_t prnt, int ue)
+{
+ for (int cc=0; cc<1 ; cc++)
+ {
+
+
+ }
+}
+
+void display_phycounters(char *buf, int debug, telnet_printfunc_t prnt)
+{
+ prnt(" DLSCH kb DLSCH kb/s\n");
+
+ dump_uestats(debug, prnt,0);
+
+}
+
+int dump_phyvars(char *buf, int debug, telnet_printfunc_t prnt)
+{
+
+
+
+ if (debug > 0)
+ prnt("phy interface module received %s\n",buf);
+ if (strcasestr(buf,"phycnt") != NULL)
+ {
+ display_phycounters(buf, debug, prnt);
+ }
+ if (strcasestr(buf,"uestat") != NULL)
+ {
+ char *cptr=strcasestr(buf+sizeof("uestat"),"UE");
+ display_uestatshead(prnt);
+ if (cptr != NULL)
+ {
+ int ueidx = strtol( cptr+sizeof("UE"), NULL, 10);
+ if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0)
+ {
+ display_uestats(debug, prnt,ueidx);
+ }
+ } /* if cptr != NULL */
+ else
+ {
+ for (int ue=0; ue]", dump_phyvars},
+
+ {"","",NULL},
+};
+
+
+/*-------------------------------------------------------------------------------------*/
+void add_phy_cmds()
+{
+
+ init_phytelnet();
+ add_telnetcmd("phy", phy_vardef, phy_cmdarray);
+}
diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.h b/common/utils/telnetsrv/telnetsrv_phycmd.h
new file mode 100644
index 0000000000..7289810c8a
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv_phycmd.h
@@ -0,0 +1,35 @@
+
+
+#ifdef TELNETSRV_PHYCMD_MAIN
+
+#include "UTIL/LOG/log.h"
+
+
+#include "openair1/PHY/extern.h"
+
+
+#define TELNETVAR_PHYCC0 0
+#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},
+//{"sndslp",TELNET_VARTYPE_INT32,NULL},
+//{"rxrescale",TELNET_VARTYPE_INT32,NULL},
+//{"txshift",TELNET_VARTYPE_INT32,NULL},
+//{"rachemin",TELNET_VARTYPE_INT32,NULL},
+//{"rachdmax",TELNET_VARTYPE_INT32,NULL},
+{"",0,NULL}
+};
+
+#else
+
+extern void add_phy_cmds();
+
+#endif
+
+/*-------------------------------------------------------------------------------------*/
+
diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.c b/common/utils/telnetsrv/telnetsrv_proccmd.c
new file mode 100644
index 0000000000..6a8f60ac8b
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv_proccmd.c
@@ -0,0 +1,230 @@
+#define _GNU_SOURCE
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define READCFG_DYNLOAD
+
+#define TELNETSERVERCODE
+#include "telnetsrv.h"
+#define TELNETSRV_PROCCMD_MAIN
+#include "log.h"
+#include "telnetsrv_proccmd.h"
+
+void decode_procstat(char *record, int debug, telnet_printfunc_t prnt)
+{
+char prntline[160];
+char *procfile_fiels;
+char *strtokptr;
+char *lptr;
+int fieldcnt;
+char toksep[2];
+
+ fieldcnt=0;
+ procfile_fiels =strtok_r(record," ",&strtokptr);
+ 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)
+ {
+ if (strlen(procfile_fiels) == 0)
+ continue;
+ fieldcnt++;
+ sprintf(toksep," ");
+ switch(fieldcnt)
+ {
+ case 1: /* id */
+ lptr+=sprintf(lptr,"%9.9s ",procfile_fiels);
+ sprintf(toksep,")");
+ break;
+ case 2: /* name */
+ lptr+=sprintf(lptr,"%20.20s ",procfile_fiels+1);
+ break;
+ case 3: //thread state
+ lptr+=sprintf(lptr," %c ",procfile_fiels[0]);
+ break;
+ case 14: //time in user mode
+ case 15: //time in kernel mode
+ lptr+=sprintf(lptr,"%9.9s ",procfile_fiels);
+ break;
+ case 18: //priority
+ case 19: //nice
+ lptr+=sprintf(lptr,"%3.3s ",procfile_fiels);
+ break;
+ case 23: //vsize
+ lptr+=sprintf(lptr,"%9.9s ",procfile_fiels);
+ break;
+ case 39: //processor
+ lptr+=sprintf(lptr," %2.2s ",procfile_fiels);
+ break;
+ case 41: //policy
+ lptr+=sprintf(lptr,"%3.3s ",procfile_fiels);
+ break;
+ default:
+ break;
+ }/* switch on fieldcnr */
+ procfile_fiels =strtok_r(NULL,toksep,&strtokptr);
+ } /* while on proc_fields != NULL */
+ prnt("%s\n",prntline);
+} /*decode_procstat */
+
+void read_statfile(char *fname,int debug, telnet_printfunc_t prnt)
+{
+FILE *procfile;
+char arecord[1024];
+
+ procfile=fopen(fname,"r");
+ if (procfile == NULL)
+ {
+ prnt("Error: Couldn't open %s %i %s\n",fname,errno,strerror(errno));
+ return;
+ }
+ if ( fgets(arecord,sizeof(arecord),procfile) == NULL)
+ {
+ prnt("Error: Nothing read from %s %i %s\n",fname,errno,strerror(errno));
+ fclose(procfile);
+ return;
+ }
+ fclose(procfile);
+ decode_procstat(arecord, debug, prnt);
+}
+
+void print_threads(char *buf, int debug, telnet_printfunc_t prnt)
+{
+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());
+ read_statfile(aname,debug,prnt);
+ prnt("\n");
+ snprintf(aname, sizeof(aname), "/proc/%d/task", getpid());
+ proc_dir = opendir(aname);
+ if (proc_dir == NULL)
+ {
+ prnt("Error: Couldn't open %s %i %s\n",aname,errno,strerror(errno));
+ return;
+ }
+
+ while ((entry = readdir(proc_dir)) != NULL)
+ {
+ if(entry->d_name[0] == '.')
+ continue;
+ snprintf(aname, sizeof(aname), "/proc/%d/task/%s/stat", getpid(),entry->d_name);
+ read_statfile(aname,debug,prnt);
+ } /* while entry != NULL */
+ closedir(proc_dir);
+} /* print_threads */
+
+
+int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
+{
+extern log_t *g_log;
+
+ if (debug > 0)
+ prnt(" proccmd_show received %s\n",buf);
+ 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));
+ }
+ }
+ return 0;
+}
+
+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);
+ 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);
+ if(res != 3)
+ {
+ prnt("softmodem thread needs 3 params, %i received\n",res);
+ return 0;
+ }
+
+
+ if (strcasestr(sv1,"prio") != NULL)
+ {
+ set_sched(0,bv1, bv2);
+ }
+ else if (strcasestr(sv1,"aff") != NULL)
+ {
+ set_affinity(0,bv1, bv2);
+ }
+ else
+ {
+ prnt("%s is not a valid thread command\n",sv1);
+ }
+ return 0;
+}
+int proccmd_exit(char *buf, int debug, telnet_printfunc_t prnt)
+{
+extern void exit_fun(const char* s);
+
+ if (debug > 0)
+ prnt("process module received %s\n",buf);
+
+ exit_fun("telnet server received exit command\n");
+ 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);
+
+ if (debug > 0)
+ prnt("process module received %s\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()
+{
+ add_telnetcmd("softmodem",proc_vardef,proc_cmdarray);
+}
diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.h b/common/utils/telnetsrv/telnetsrv_proccmd.h
new file mode 100644
index 0000000000..a80c120b60
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv_proccmd.h
@@ -0,0 +1,59 @@
+/*
+ * 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.0 (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 this linux process
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#include
+#include "telnetsrv.h"
+
+
+#ifdef TELNETSRV_PROCCMD_MAIN
+/* global variable from log.c */
+extern mapping *log_level_names;
+extern mapping *log_verbosity_names;
+
+extern int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt);
+extern int proccmd_thread(char *buf, int debug, telnet_printfunc_t prnt);
+extern int proccmd_exit(char *buf, int debug, telnet_printfunc_t prnt);
+extern int proccmd_log(char *buf, int debug, telnet_printfunc_t prnt);
+telnetshell_vardef_t proc_vardef[] = {
+{"",0,NULL}
+};
+
+telnetshell_cmddef_t proc_cmdarray[] = {
+ {"show","loglvl|thread", proccmd_show},
+ {"log","[enable,disable]", proccmd_log},
+ {"thread"," aff|prio ", proccmd_thread},
+ {"exit","", proccmd_exit},
+ {"","",NULL},
+};
+#else
+extern void add_proccmd_cmds();
+#endif /* TELNETSRV_PROCCMD_MAIN */
+
diff --git a/open-nfapi.oai.patch b/open-nfapi.oai.patch
new file mode 100644
index 0000000000..95aeb2e64a
--- /dev/null
+++ b/open-nfapi.oai.patch
@@ -0,0 +1,40 @@
+diff --git a/nfapi/public_inc/nfapi_interface.h b/nfapi/public_inc/nfapi_interface.h
+index 2d58c2a..45af99a 100644
+--- a/nfapi/public_inc/nfapi_interface.h
++++ b/nfapi/public_inc/nfapi_interface.h
+@@ -34,7 +34,7 @@
+ #define NFAPI_MAX_NUM_ANTENNAS 8
+ #define NFAPI_MAX_NUM_SUBBANDS 13
+ #define NFAPI_MAX_BF_VECTORS 8
+-#define NFAPI_MAX_CC 1
++#define NFAPI_MAX_CC 2
+ #define NFAPI_MAX_NUM_PHYSICAL_ANTENNAS 8
+ #define NFAPI_MAX_RSSI 8
+ #define NFAPI_MAX_PSC_LIST 32
+@@ -1689,7 +1689,7 @@ typedef struct {
+ uint16_t number_pdu;
+ uint8_t number_pdsch_rnti;
+ uint16_t transmission_power_pcfich;
+- nfapi_dl_config_request_pdu_t* dl_config_pdu_list;
++ nfapi_dl_config_request_pdu_t* dl_config_pdu_list;
+ } nfapi_dl_config_request_body_t;
+ #define NFAPI_DL_CONFIG_REQUEST_BODY_TAG 0x2000
+
+@@ -1772,7 +1772,7 @@ typedef struct {
+ uint8_t number_of_cc;
+ struct {
+ uint8_t ri_size;
+- uint8_t dl_cqi_pmi_size;
++ uint8_t dl_cqi_pmi_size[8];
+ } cc[NFAPI_MAX_CC];
+ } nfapi_ul_config_aperiodic_cqi_pmi_ri_report_t;
+
+@@ -1962,7 +1962,7 @@ typedef struct {
+ } nfapi_ul_config_harq_information_rel8_fdd_t;
+ #define NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG 0x2019
+
+-typedef struct {
++typedef struct {
+ nfapi_tl_t tl;
+ uint8_t harq_size;
+ uint8_t ack_nack_mode;
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index faf884429c..0eb7d5a0b2 100755
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -106,6 +106,7 @@ void phy_config_request(PHY_Config_t *phy_config) {
fp->phich_config_common.phich_resource = phich_resource_table[cfg->phich_config.phich_resource.value];
fp->phich_config_common.phich_duration = cfg->phich_config.phich_duration.value;
+ // Note: "from_earfcn" has to be in a common library with MACRLC
fp->dl_CarrierFreq = from_earfcn(eutra_band,dl_CarrierFreq);
fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(eutra_band)*100000);
@@ -153,91 +154,94 @@ void phy_config_request(PHY_Config_t *phy_config) {
RC.eNB[Mod_id][CC_id]->X_u);
#ifdef Rel14
- fp->prach_emtc_config_common.prach_Config_enabled=1;
+ if (cfg->emtc_config.prach_ce_level_0_enable.value == 1) {
+ fp->prach_emtc_config_common.prach_Config_enabled=1;
- fp->prach_emtc_config_common.rootSequenceIndex = cfg->emtc_config.prach_catm_root_sequence_index.value;
+ fp->prach_emtc_config_common.rootSequenceIndex = cfg->emtc_config.prach_catm_root_sequence_index.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag = cfg->emtc_config.prach_catm_high_speed_flag.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = cfg->emtc_config.prach_catm_zero_correlation_zone_configuration.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag = cfg->emtc_config.prach_catm_high_speed_flag.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = cfg->emtc_config.prach_catm_zero_correlation_zone_configuration.value;
- // CE Level 3 parameters
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[3] = cfg->emtc_config.prach_ce_level_3_enable.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[3] = cfg->emtc_config.prach_ce_level_3_starting_subframe_periodicity.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[3] = cfg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt.value;
- AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[3]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[3],
- "prach_starting_subframe_periodicity[3] < prach_numPetitionPerPreambleAttempt[3]\n");
+ // CE Level 3 parameters
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[3] = cfg->emtc_config.prach_ce_level_3_enable.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[3] = cfg->emtc_config.prach_ce_level_3_starting_subframe_periodicity.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[3] = cfg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt.value;
+ AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[3]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[3],
+ "prach_starting_subframe_periodicity[3] < prach_numPetitionPerPreambleAttempt[3]\n");
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3] = cfg->emtc_config.prach_ce_level_3_configuration_index.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[3] = cfg->emtc_config.prach_ce_level_3_frequency_offset.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[3] = cfg->emtc_config.prach_ce_level_3_hopping_enable.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[3] = cfg->emtc_config.prach_ce_level_3_hopping_offset.value;
- if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[3] == 1)
- compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex,
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3],
- fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
- fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag,
- fp->frame_type,
- RC.eNB[Mod_id][CC_id]->X_u_br[3]);
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3] = cfg->emtc_config.prach_ce_level_3_configuration_index.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[3] = cfg->emtc_config.prach_ce_level_3_frequency_offset.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[3] = cfg->emtc_config.prach_ce_level_3_hopping_enable.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[3] = cfg->emtc_config.prach_ce_level_3_hopping_offset.value;
+ if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[3] == 1)
+ compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex,
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3],
+ fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
+ fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag,
+ fp->frame_type,
+ RC.eNB[Mod_id][CC_id]->X_u_br[3]);
- // CE Level 2 parameters
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[2] = cfg->emtc_config.prach_ce_level_2_enable.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[2] = cfg->emtc_config.prach_ce_level_2_starting_subframe_periodicity.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[2] = cfg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt.value;
- AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[2]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[2],
- "prach_starting_subframe_periodicity[2] < prach_numPetitionPerPreambleAttempt[2]\n");
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[2] = cfg->emtc_config.prach_ce_level_2_configuration_index.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[2] = cfg->emtc_config.prach_ce_level_2_frequency_offset.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[2] = cfg->emtc_config.prach_ce_level_2_hopping_enable.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[2] = cfg->emtc_config.prach_ce_level_2_hopping_offset.value;
- if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[2] == 1)
- compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex,
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3],
- fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
- fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag,
- fp->frame_type,
- RC.eNB[Mod_id][CC_id]->X_u_br[2]);
+ // CE Level 2 parameters
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[2] = cfg->emtc_config.prach_ce_level_2_enable.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[2] = cfg->emtc_config.prach_ce_level_2_starting_subframe_periodicity.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[2] = cfg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt.value;
+ AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[2]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[2],
+ "prach_starting_subframe_periodicity[2] < prach_numPetitionPerPreambleAttempt[2]\n");
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[2] = cfg->emtc_config.prach_ce_level_2_configuration_index.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[2] = cfg->emtc_config.prach_ce_level_2_frequency_offset.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[2] = cfg->emtc_config.prach_ce_level_2_hopping_enable.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[2] = cfg->emtc_config.prach_ce_level_2_hopping_offset.value;
+ if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[2] == 1)
+ compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex,
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3],
+ fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
+ fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag,
+ fp->frame_type,
+ RC.eNB[Mod_id][CC_id]->X_u_br[2]);
- // CE Level 1 parameters
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[1] = cfg->emtc_config.prach_ce_level_1_enable.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[1] = cfg->emtc_config.prach_ce_level_1_starting_subframe_periodicity.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[1] = cfg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt.value;
- AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[1]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[1],
- "prach_starting_subframe_periodicity[1] < prach_numPetitionPerPreambleAttempt[1]\n");
+ // CE Level 1 parameters
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[1] = cfg->emtc_config.prach_ce_level_1_enable.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[1] = cfg->emtc_config.prach_ce_level_1_starting_subframe_periodicity.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[1] = cfg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt.value;
+ AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[1]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[1],
+ "prach_starting_subframe_periodicity[1] < prach_numPetitionPerPreambleAttempt[1]\n");
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[1] = cfg->emtc_config.prach_ce_level_1_configuration_index.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[1] = cfg->emtc_config.prach_ce_level_1_frequency_offset.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[1] = cfg->emtc_config.prach_ce_level_1_hopping_enable.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[1] = cfg->emtc_config.prach_ce_level_1_hopping_offset.value;
- if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[1] == 1)
- compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex,
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3],
- fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
- fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag,
- fp->frame_type,
- RC.eNB[Mod_id][CC_id]->X_u_br[1]);
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[1] = cfg->emtc_config.prach_ce_level_1_configuration_index.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[1] = cfg->emtc_config.prach_ce_level_1_frequency_offset.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[1] = cfg->emtc_config.prach_ce_level_1_hopping_enable.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[1] = cfg->emtc_config.prach_ce_level_1_hopping_offset.value;
+ if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[1] == 1)
+ compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex,
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3],
+ fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
+ fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag,
+ fp->frame_type,
+ RC.eNB[Mod_id][CC_id]->X_u_br[1]);
- // CE Level 0 parameters
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0] = cfg->emtc_config.prach_ce_level_0_enable.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0] = cfg->emtc_config.prach_ce_level_0_starting_subframe_periodicity.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0] = cfg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt.value;
- AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0],
- "prach_starting_subframe_periodicity[0] %d < prach_numPetitionPerPreambleAttempt[0] %d\n",
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0],
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0]);
- AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0] > 0,
- "prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0]==0\n");
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[0] = cfg->emtc_config.prach_ce_level_0_configuration_index.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[0] = cfg->emtc_config.prach_ce_level_0_frequency_offset.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[0] = cfg->emtc_config.prach_ce_level_0_hopping_enable.value;
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[0] = cfg->emtc_config.prach_ce_level_0_hopping_offset.value;
- if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0] == 1)
- compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex,
- fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3],
- fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
- fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag,
- fp->frame_type,
- RC.eNB[Mod_id][CC_id]->X_u_br[0]);
+ // CE Level 0 parameters
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0] = cfg->emtc_config.prach_ce_level_0_enable.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0] = cfg->emtc_config.prach_ce_level_0_starting_subframe_periodicity.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0] = cfg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt.value;
+ AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0],
+ "prach_starting_subframe_periodicity[0] %d < prach_numPetitionPerPreambleAttempt[0] %d\n",
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0],
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0]);
+ AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0] > 0,
+ "prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0]==0\n");
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[0] = cfg->emtc_config.prach_ce_level_0_configuration_index.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[0] = cfg->emtc_config.prach_ce_level_0_frequency_offset.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[0] = cfg->emtc_config.prach_ce_level_0_hopping_enable.value;
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[0] = cfg->emtc_config.prach_ce_level_0_hopping_offset.value;
+ if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0] == 1)
+ compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex,
+ fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3],
+ fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
+ fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag,
+ fp->frame_type,
+ RC.eNB[Mod_id][CC_id]->X_u_br[0]);
+ }
+
#endif
@@ -264,9 +268,9 @@ void phy_config_request(PHY_Config_t *phy_config) {
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 0;
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
if (cfg->uplink_reference_signal_config.uplink_rs_hopping.value == 1)
- fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
+ fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
if (cfg->uplink_reference_signal_config.uplink_rs_hopping.value == 2)
- fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 1;
+ fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 1;
LOG_I(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled);
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = cfg->uplink_reference_signal_config.group_assignment.value;
LOG_I(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH);
@@ -313,14 +317,14 @@ void phy_config_sib1_ue(uint8_t Mod_id,int CC_id,
}
/*
-void phy_config_sib2_eNB(uint8_t Mod_id,
- int CC_id,
- RadioResourceConfigCommonSIB_t *radioResourceConfigCommon,
- ARFCN_ValueEUTRA_t *ul_CArrierFreq,
- long *ul_Bandwidth,
- AdditionalSpectrumEmission_t *additionalSpectrumEmission,
- struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList)
-{
+ void phy_config_sib2_eNB(uint8_t Mod_id,
+ int CC_id,
+ RadioResourceConfigCommonSIB_t *radioResourceConfigCommon,
+ ARFCN_ValueEUTRA_t *ul_CArrierFreq,
+ long *ul_Bandwidth,
+ AdditionalSpectrumEmission_t *additionalSpectrumEmission,
+ struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList)
+ {
LTE_DL_FRAME_PARMS *fp = &RC.eNB[Mod_id][CC_id]->frame_parms;
//LTE_eNB_UE_stats *eNB_UE_stats = RC.eNB[Mod_id][CC_id].eNB_UE_stats;
@@ -347,7 +351,7 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
init_prach_tables(839);
compute_prach_seq(&fp->prach_config_common,fp->frame_type,
- RC.eNB[Mod_id][CC_id]->X_u);
+ RC.eNB[Mod_id][CC_id]->X_u);
fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift;
fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI;
@@ -389,15 +393,15 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
fp->soundingrs_ul_config_common.enabled_flag = 0;
if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) {
- fp->soundingrs_ul_config_common.enabled_flag = 1;
- fp->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig;
- fp->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig;
- fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission;
+ fp->soundingrs_ul_config_common.enabled_flag = 1;
+ fp->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig;
+ fp->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig;
+ fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission;
- if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts)
- fp->soundingrs_ul_config_common.srs_MaxUpPts = 1;
- else
- fp->soundingrs_ul_config_common.srs_MaxUpPts = 0;
+ if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts)
+ fp->soundingrs_ul_config_common.srs_MaxUpPts = 1;
+ else
+ fp->soundingrs_ul_config_common.srs_MaxUpPts = 0;
}
@@ -425,34 +429,34 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
// MBSFN
if (mbsfn_SubframeConfigList != NULL) {
- fp->num_MBSFN_config = mbsfn_SubframeConfigList->list.count;
+ fp->num_MBSFN_config = mbsfn_SubframeConfigList->list.count;
- for (i=0; ilist.count; i++) {
- fp->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod;
- fp->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset;
+ for (i=0; ilist.count; i++) {
+ fp->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod;
+ fp->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset;
- if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) {
- fp->MBSFN_config[i].fourFrames_flag = 0;
- fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration
- LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
- fp->MBSFN_config[i].mbsfn_SubframeConfig);
- } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration
- fp->MBSFN_config[i].fourFrames_flag = 1;
- fp->MBSFN_config[i].mbsfn_SubframeConfig =
- mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]|
- (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)|
- (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16);
+ if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) {
+ fp->MBSFN_config[i].fourFrames_flag = 0;
+ fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration
+ LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
+ fp->MBSFN_config[i].mbsfn_SubframeConfig);
+ } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration
+ fp->MBSFN_config[i].fourFrames_flag = 1;
+ fp->MBSFN_config[i].mbsfn_SubframeConfig =
+ mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]|
+ (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)|
+ (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16);
- LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
- fp->MBSFN_config[i].mbsfn_SubframeConfig);
- }
- }
+ LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
+ fp->MBSFN_config[i].mbsfn_SubframeConfig);
+ }
+ }
} else
- fp->num_MBSFN_config = 0;
+ fp->num_MBSFN_config = 0;
//
-}
+ }
*/
void phy_config_sib2_ue(uint8_t Mod_id,int CC_id,
@@ -852,7 +856,7 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility
PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
LOG_I(PHY,"SET C-RNTI %x %x\n",PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_id]->crnti,
- PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti);
+ PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti);
}
if(ho_failed) {
@@ -881,67 +885,67 @@ void phy_config_meas_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n
}
/*
-void phy_config_dedicated_eNB(uint8_t Mod_id,
- int CC_id,
- uint16_t rnti,
- struct PhysicalConfigDedicated *physicalConfigDedicated)
-{
+ void phy_config_dedicated_eNB(uint8_t Mod_id,
+ int CC_id,
+ uint16_t rnti,
+ struct PhysicalConfigDedicated *physicalConfigDedicated)
+ {
PHY_VARS_eNB *eNB = RC.eNB[Mod_id][CC_id];
int8_t UE_id = find_ue(rnti,eNB);
int i;
if (UE_id == -1) {
- LOG_E( PHY, "[eNB %"PRIu8"] find_ue() returns -1\n", Mod_id);
- return;
+ LOG_E( PHY, "[eNB %"PRIu8"] find_ue() returns -1\n", Mod_id);
+ return;
}
if (physicalConfigDedicated) {
- eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated;
- LOG_I(PHY,"phy_config_dedicated_eNB: physicalConfigDedicated=%p\n",physicalConfigDedicated);
+ eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated;
+ LOG_I(PHY,"phy_config_dedicated_eNB: physicalConfigDedicated=%p\n",physicalConfigDedicated);
- if (physicalConfigDedicated->antennaInfo) {
- switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
- case AntennaInfoDedicated__transmissionMode_tm1:
- eNB->transmission_mode[UE_id] = 1;
- break;
- case AntennaInfoDedicated__transmissionMode_tm2:
- eNB->transmission_mode[UE_id] = 2;
- break;
- case AntennaInfoDedicated__transmissionMode_tm3:
- eNB->transmission_mode[UE_id] = 3;
- break;
- case AntennaInfoDedicated__transmissionMode_tm4:
- eNB->transmission_mode[UE_id] = 4;
- break;
- case AntennaInfoDedicated__transmissionMode_tm5:
- eNB->transmission_mode[UE_id] = 5;
- break;
- case AntennaInfoDedicated__transmissionMode_tm6:
- eNB->transmission_mode[UE_id] = 6;
- break;
- case AntennaInfoDedicated__transmissionMode_tm7:
- lte_gold_ue_spec_port5(eNB->lte_gold_uespec_port5_table[0],eNB->frame_parms.Nid_cell,rnti);
+ if (physicalConfigDedicated->antennaInfo) {
+ switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
+ case AntennaInfoDedicated__transmissionMode_tm1:
+ eNB->transmission_mode[UE_id] = 1;
+ break;
+ case AntennaInfoDedicated__transmissionMode_tm2:
+ eNB->transmission_mode[UE_id] = 2;
+ break;
+ case AntennaInfoDedicated__transmissionMode_tm3:
+ eNB->transmission_mode[UE_id] = 3;
+ break;
+ case AntennaInfoDedicated__transmissionMode_tm4:
+ eNB->transmission_mode[UE_id] = 4;
+ break;
+ case AntennaInfoDedicated__transmissionMode_tm5:
+ eNB->transmission_mode[UE_id] = 5;
+ break;
+ case AntennaInfoDedicated__transmissionMode_tm6:
+ eNB->transmission_mode[UE_id] = 6;
+ break;
+ case AntennaInfoDedicated__transmissionMode_tm7:
+ lte_gold_ue_spec_port5(eNB->lte_gold_uespec_port5_table[0],eNB->frame_parms.Nid_cell,rnti);
- for (i=0;inum_RU;i++) eNB->RU_list[i]->do_precoding=1;
- eNB->transmission_mode[UE_id] = 7;
- break;
- default:
- LOG_E(PHY,"Unknown transmission mode!\n");
- break;
- }
- LOG_I(PHY,"Transmission Mode (phy_config_dedicated_eNB) %d\n",eNB->transmission_mode[UE_id]);
+ for (i=0;inum_RU;i++) eNB->RU_list[i]->do_precoding=1;
+ eNB->transmission_mode[UE_id] = 7;
+ break;
+ default:
+ LOG_E(PHY,"Unknown transmission mode!\n");
+ break;
+ }
+ LOG_I(PHY,"Transmission Mode (phy_config_dedicated_eNB) %d\n",eNB->transmission_mode[UE_id]);
- } else {
- LOG_D(PHY,"[eNB %d] : Received NULL radioResourceConfigDedicated->antennaInfo from eNB %d\n",Mod_id,UE_id);
- }
} else {
- LOG_E(PHY,"[eNB %d] Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, UE_id);
- return;
+ LOG_D(PHY,"[eNB %d] : Received NULL radioResourceConfigDedicated->antennaInfo from eNB %d\n",Mod_id,UE_id);
+ }
+ } else {
+ LOG_E(PHY,"[eNB %d] Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, UE_id);
+ return;
}
-}
+ }
*/
#if defined(Rel10) || defined(Rel14)
@@ -953,11 +957,11 @@ void phy_config_dedicated_scell_ue(uint8_t Mod_id,
}
/*
-void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
- uint16_t rnti,
- SCellToAddMod_r10_t *sCellToAddMod_r10,
- int CC_id)
-{
+ void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
+ uint16_t rnti,
+ SCellToAddMod_r10_t *sCellToAddMod_r10,
+ int CC_id)
+ {
uint8_t UE_id = find_ue(rnti,RC.eNB[Mod_id][0]);
@@ -968,37 +972,37 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
uint32_t carrier_freq_local;
if ((dl_CarrierFreq_r10>=36000) && (dl_CarrierFreq_r10<=36199)) {
- carrier_freq_local = 1900000000 + (dl_CarrierFreq_r10-36000)*100000; //band 33 from 3GPP 36.101 v 10.9 Table 5.7.3-1
- LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id,
- //eNB->frame
- 0,
- CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id);
+ carrier_freq_local = 1900000000 + (dl_CarrierFreq_r10-36000)*100000; //band 33 from 3GPP 36.101 v 10.9 Table 5.7.3-1
+ LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id,
+ //eNB->frame
+ 0,
+ CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id);
} else if ((dl_CarrierFreq_r10>=6150) && (dl_CarrierFreq_r10<=6449)) {
- carrier_freq_local = 832000000 + (dl_CarrierFreq_r10-6150)*100000; //band 20 from 3GPP 36.101 v 10.9 Table 5.7.3-1
- // this is actually for the UL only, but we use it for DL too, since there is no TDD mode for this band
- LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id,
- //eNB->frame
- 0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id);
+ carrier_freq_local = 832000000 + (dl_CarrierFreq_r10-6150)*100000; //band 20 from 3GPP 36.101 v 10.9 Table 5.7.3-1
+ // this is actually for the UL only, but we use it for DL too, since there is no TDD mode for this band
+ LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id,
+ //eNB->frame
+ 0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id);
} else {
- LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %ld of SCell %d for UE %d not supported\n",Mod_id,
- //eNB->frame
- 0,dl_CarrierFreq_r10,CC_id,UE_id);
+ LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %ld of SCell %d for UE %d not supported\n",Mod_id,
+ //eNB->frame
+ 0,dl_CarrierFreq_r10,CC_id,UE_id);
}
if (physicalConfigDedicatedSCell_r10) {
-//#warning " eNB->physicalConfigDedicatedSCell_r10 does not exist in eNB"
- // eNB->physicalConfigDedicatedSCell_r10[UE_id] = physicalConfigDedicatedSCell_r10;
- LOG_I(PHY,"[eNB %d] Frame %d: Configured phyConfigDedicatedSCell with CC_id %d for UE %d\n",Mod_id,
- //eNB->frame
- 0,CC_id,UE_id);
+ //#warning " eNB->physicalConfigDedicatedSCell_r10 does not exist in eNB"
+ // eNB->physicalConfigDedicatedSCell_r10[UE_id] = physicalConfigDedicatedSCell_r10;
+ LOG_I(PHY,"[eNB %d] Frame %d: Configured phyConfigDedicatedSCell with CC_id %d for UE %d\n",Mod_id,
+ //eNB->frame
+ 0,CC_id,UE_id);
} else {
- LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated (CC_id %d, UE %d)\n",Mod_id,
- //eNB->frame
- 0,CC_id,UE_id);
- return;
+ LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated (CC_id %d, UE %d)\n",Mod_id,
+ //eNB->frame
+ 0,CC_id,UE_id);
+ return;
}
-}
+ }
*/
#endif
@@ -1012,10 +1016,13 @@ void phy_config_harq_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
phy_vars_ue->ulsch[eNB_id]->Mlimit = max_harq_tx;
}
+extern uint16_t beta_cqi[16];
+
void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
struct PhysicalConfigDedicated *physicalConfigDedicated )
{
+ static uint8_t first_dedicated_configuration = 0;
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
phy_vars_ue->total_TBS[eNB_id]=0;
@@ -1067,7 +1074,7 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
LOG_D(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index);
LOG_D(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index);
- LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index);
+ LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d => %d)\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index,beta_cqi[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index]);
LOG_D(PHY,"\n");
@@ -1172,7 +1179,7 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
}
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) {
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_setup) {
- // configure PUCCH CQI reporting
+ // configure PUCCH CQI reporting
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex;
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
@@ -1206,17 +1213,21 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
get_cqipmiri_params(phy_vars_ue,eNB_id);
// disable MIB SIB decoding once we are on connected mode
- LOG_I(PHY,"Disabling SIB MIB decoding \n");
- phy_vars_ue->decode_SIB = 0;
- phy_vars_ue->decode_MIB = 0;
+ first_dedicated_configuration ++;
+ if(first_dedicated_configuration > 1)
+ {
+ LOG_I(PHY,"Disable SIB MIB decoding \n");
+ phy_vars_ue->decode_SIB = 0;
+ phy_vars_ue->decode_MIB = 0;
+ }
//phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti;
if(phy_vars_ue->pdcch_vars[0][eNB_id]->crnti == 0x1234)
- phy_vars_ue->pdcch_vars[0][eNB_id]->crnti = phy_vars_ue->pdcch_vars[1][eNB_id]->crnti;
+ phy_vars_ue->pdcch_vars[0][eNB_id]->crnti = phy_vars_ue->pdcch_vars[1][eNB_id]->crnti;
else
- phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti;
+ phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti;
LOG_I(PHY,"C-RNTI %x %x \n", phy_vars_ue->pdcch_vars[0][eNB_id]->crnti,
- phy_vars_ue->pdcch_vars[1][eNB_id]->crnti);
+ phy_vars_ue->pdcch_vars[1][eNB_id]->crnti);
}
@@ -1333,18 +1344,20 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
// create shortcuts
LTE_DL_FRAME_PARMS* const fp = &ue->frame_parms;
LTE_UE_COMMON* const common_vars = &ue->common_vars;
- LTE_UE_PDSCH** const pdsch_vars_th0 = ue->pdsch_vars[0];
- LTE_UE_PDSCH** const pdsch_vars_th1 = ue->pdsch_vars[1];
LTE_UE_PDSCH** const pdsch_vars_SI = ue->pdsch_vars_SI;
LTE_UE_PDSCH** const pdsch_vars_ra = ue->pdsch_vars_ra;
+ LTE_UE_PDSCH** const pdsch_vars_p = ue->pdsch_vars_p;
LTE_UE_PDSCH** const pdsch_vars_mch = ue->pdsch_vars_MCH;
+ LTE_UE_PDSCH* (*pdsch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX+1] = &ue->pdsch_vars;
+ LTE_UE_PDCCH* (*pdcch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX] = &ue->pdcch_vars;
LTE_UE_PBCH** const pbch_vars = ue->pbch_vars;
- LTE_UE_PDCCH** const pdcch_vars_th0 = ue->pdcch_vars[0];
- LTE_UE_PDCCH** const pdcch_vars_th1 = ue->pdcch_vars[1];
LTE_UE_PRACH** const prach_vars = ue->prach_vars;
+
+
int i,j,k,l;
int eNB_id;
+ int th_id;
LOG_D(PHY,"Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx);
LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST);
@@ -1380,6 +1393,7 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
ue->tx_power_dBm[i]=-127;
+
// init TX buffers
common_vars->txdata = (int32_t**)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) );
@@ -1406,145 +1420,167 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
// Channel estimates
for (eNB_id=0; eNB_id<7; eNB_id++) {
- common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
- common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
- common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
- common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
+ for (th_id=0; th_idcommon_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
+ common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
+ }
for (i=0; inb_antennas_rx; i++)
for (j=0; j<4; j++) {
int idx = (j<<1) + i;
- common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
- common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
- common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
- common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
+ for (th_id=0; th_idcommon_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
+ common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
+ }
}
}
// DLSCH
for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) {
- pdsch_vars_th0[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
- pdsch_vars_th1[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
+ for (th_id=0; th_idllr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
- pdsch_vars_th0[eNB_id]->llr_shifts_p = pdsch_vars_th0[eNB_id]->llr_shifts;
- pdsch_vars_th0[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
- pdsch_vars_th0[eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
- pdsch_vars_th0[eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
-
- // thread 0
- pdsch_vars_th1[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
- pdsch_vars_th1[eNB_id]->llr_shifts_p = pdsch_vars_th0[eNB_id]->llr_shifts;
- pdsch_vars_th1[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
- pdsch_vars_th1[eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
- pdsch_vars_th1[eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
-
-
-
-
- for (int i=0; inb_antennas_rx; i++){
- pdsch_vars_th0[eNB_id]->rho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th1[eNB_id]->rho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ for (th_id=0; th_idllr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
+ (*pdsch_vars_th)[th_id][eNB_id]->llr_shifts_p = (*pdsch_vars_th)[0][eNB_id]->llr_shifts;
+ (*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
+ (*pdsch_vars_th)[th_id][eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
+ (*pdsch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
}
- pdsch_vars_th0[eNB_id]->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th1[eNB_id]->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ for (int i=0; inb_antennas_rx; i++){
+ for (th_id=0; th_idrho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ }
+
+ }
+ for (th_id=0; th_iddl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ }
for (i=0; inb_antennas_rx; i++)
for (j=0; j<4; j++) {
const int idx = (j<<1)+i;
const size_t num = 7*2*fp->N_RB_DL*12+4;
- pdsch_vars_th0[eNB_id]->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
- pdsch_vars_th1[eNB_id]->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ for (th_id=0; th_iddl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ }
+
}
-
//const size_t num = 7*2*fp->N_RB_DL*12+4;
for (k=0;k<8;k++) { //harq_pid
for (l=0;l<8;l++) { //round
- pdsch_vars_th0[eNB_id]->rxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th0[eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th0[eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th0[eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
-
- pdsch_vars_th1[eNB_id]->rxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th1[eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th1[eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th1[eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ for (th_id=0; th_idrxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ }
for (int i=0; inb_antennas_rx; i++)
for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++)
const int idx = (j<<1)+i;
- pdsch_vars_th0[eNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th0[eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th0[eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th0[eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ for (th_id=0; th_iddl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ (*pdsch_vars_th)[th_id][eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ }
- pdsch_vars_th1[eNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th1[eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th1[eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th1[eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
}
}
}
phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
+ phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp );
phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
- pdcch_vars_th0[eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
- pdcch_vars_th0[eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
- pdcch_vars_th0[eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
- pdcch_vars_th0[eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 );
-
- pdcch_vars_th0[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdcch_vars_th0[eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdcch_vars_th0[eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
- pdcch_vars_th0[eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdcch_vars_th0[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
-
- pdcch_vars_th1[eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
- pdcch_vars_th1[eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
- pdcch_vars_th1[eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
- pdcch_vars_th1[eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 );
-
- pdcch_vars_th1[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdcch_vars_th1[eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdcch_vars_th1[eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
- pdcch_vars_th1[eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdcch_vars_th1[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ for (th_id=0; th_idllr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ (*pdcch_vars_th)[th_id][eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ (*pdcch_vars_th)[th_id][eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ (*pdcch_vars_th)[th_id][eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 );
+
+ (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+ (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ }
for (i=0; inb_antennas_rx; i++) {
//ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
- pdcch_vars_th0[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) );
- pdcch_vars_th1[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) );
+ for (th_id=0; th_idrho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) );
+ }
for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
int idx = (j<<1)+i;
// size_t num = 7*2*fp->N_RB_DL*12;
size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB
- pdcch_vars_th0[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
- pdcch_vars_th0[eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
- pdcch_vars_th0[eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
- pdcch_vars_th0[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
-
- pdcch_vars_th1[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
- pdcch_vars_th1[eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
- pdcch_vars_th1[eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
- pdcch_vars_th1[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ for (th_id=0; th_idrxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ }
+ }
+ }
+ phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
+ phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
+ phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp );
+ phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
+
+ // 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
+ for (th_id=0; th_idllr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ (*pdcch_vars_th)[th_id][eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ (*pdcch_vars_th)[th_id][eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ (*pdcch_vars_th)[th_id][eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 );
+
+ (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+ (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ }
+
+ for (i=0; inb_antennas_rx; i++) {
+ //ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
+
+ for (th_id=0; th_idrho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) );
+ }
+
+ for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
+ int idx = (j<<1)+i;
+ // size_t num = 7*2*fp->N_RB_DL*12;
+ size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB
+ for (th_id=0; th_idrxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ }
}
}
@@ -1571,17 +1607,19 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
}
// initialization for the last instance of pdsch_vars (used for MU-MIMO)
+ for (th_id=0; th_idllr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
-
- phy_init_lte_ue__PDSCH( pdsch_vars_th1[eNB_id], fp );
- pdsch_vars_th1[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
+ pdsch_vars_p[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
+
+ for (th_id=0; th_idllr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
+ }
+
ue->sinr_CQI_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) );
@@ -1653,7 +1691,7 @@ int phy_init_RU(RU_t *ru) {
ru->common.txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
LOG_I(PHY,"[INIT] common.txdata[%d] = %p (%lu bytes)\n",i,ru->common.txdata[i],
- fp->samples_per_tti*10*sizeof(int32_t));
+ fp->samples_per_tti*10*sizeof(int32_t));
}
for (i=0;inb_rx;i++) {
@@ -1706,8 +1744,11 @@ int phy_init_RU(RU_t *ru) {
}
#endif
}
+
+ AssertFatal(RC.nb_L1_inst <= NUMBER_OF_eNB_MAX,"eNB instances %d > %d\n",
+ RC.nb_L1_inst,NUMBER_OF_eNB_MAX);
- for (i=0; ieNB_list[i]->frame_parms.nb_antenna_ports_eNB || p==5) {
ru->beam_weights[i][p] = (int32_t **)malloc16_clear(ru->nb_tx*sizeof(int32_t*));
@@ -1716,11 +1757,11 @@ int phy_init_RU(RU_t *ru) {
// antenna ports 0-3 are mapped on antennas 0-3
// antenna port 4 is mapped on antenna 0
// antenna ports 5-14 are mapped on all antennas
- if (((i<4) && (i==j)) || ((i==4) && (j==0))) {
+ if (((p<4) && (p==j)) || ((p==4) && (j==0))) {
for (re=0; reofdm_symbol_size; re++)
ru->beam_weights[i][p][j][re] = 0x00007fff;
}
- else if (i>4) {
+ else if (p>4) {
for (re=0; reofdm_symbol_size; re++)
ru->beam_weights[i][p][j][re] = 0x00007fff/ru->nb_tx;
}
@@ -1751,7 +1792,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
#ifdef Rel14
LTE_eNB_PRACH* const prach_vars_br = &eNB->prach_vars_br;
#endif
- int i, eNB_id, UE_id;
+ int i, UE_id;
eNB->total_dlsch_bitrate = 0;
@@ -1843,12 +1884,12 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
#endif
/* number of elements of an array X is computed as sizeof(X) / sizeof(X[0])
- AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->rxsigF) / sizeof(prach_vars->rxsigF[0]),
- "nb_antennas_rx too large");
- for (i=0; inb_antennas_rx; i++) {
- prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( fp->ofdm_symbol_size*12*2*sizeof(int16_t) );
- LOG_D(PHY,"[INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]);
- }*/
+ AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->rxsigF) / sizeof(prach_vars->rxsigF[0]),
+ "nb_antennas_rx too large");
+ for (i=0; inb_antennas_rx; i++) {
+ prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( fp->ofdm_symbol_size*12*2*sizeof(int16_t) );
+ LOG_D(PHY,"[INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]);
+ }*/
for (UE_id=0; UE_idrxdataF_comp[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
pusch_vars[UE_id]->ul_ch_mag[i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
pusch_vars[UE_id]->ul_ch_magb[i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
- }
+ }
pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
} //UE_id
diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c
index d982045c98..188b7237a4 100755
--- a/openair1/PHY/INIT/lte_param_init.c
+++ b/openair1/PHY/INIT/lte_param_init.c
@@ -127,6 +127,9 @@ void lte_param_init(unsigned char N_tx_port_eNB,
UE->perfect_ce = perfect_ce;
+ /* the UE code is multi-thread "aware", we need to setup this array */
+ for (i = 0; i < 10; i++) UE->current_thread_id[i] = i % 2;
+
printf("Done lte_param_init\n");
diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c
index 6aa15d3828..e071a57bc8 100755
--- a/openair1/PHY/INIT/lte_parms.c
+++ b/openair1/PHY/INIT/lte_parms.c
@@ -44,7 +44,11 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
uint8_t log2_osf;
+#if DISABLE_LOG_X
+ printf("Initializing frame parms for N_RB_DL %d, Ncp %d, osf %d\n",frame_parms->N_RB_DL,frame_parms->Ncp,osf);
+#else
LOG_I(PHY,"Initializing frame parms for N_RB_DL %d, Ncp %d, osf %d\n",frame_parms->N_RB_DL,frame_parms->Ncp,osf);
+#endif
if (frame_parms->Ncp==EXTENDED) {
frame_parms->nb_prefix_samples0=512;
diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h
index 20bdbc1f36..e1346bb955 100755
--- a/openair1/PHY/LTE_ESTIMATION/defs.h
+++ b/openair1/PHY/LTE_ESTIMATION/defs.h
@@ -161,7 +161,7 @@ int lte_est_freq_offset(int **dl_ch_estimates,
LTE_DL_FRAME_PARMS *frame_parms,
int l,
int* freq_offset,
- int reset);
+ int reset);
int lte_mbsfn_est_freq_offset(int **dl_ch_estimates,
LTE_DL_FRAME_PARMS *frame_parms,
@@ -180,7 +180,7 @@ This function computes the time domain channel response, finds the peak and adju
void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
PHY_VARS_UE *phy_vars_ue,
module_id_t eNb_id,
- uint8_t subframe,
+ uint8_t subframe,
unsigned char clear,
short coef);
@@ -189,7 +189,8 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
unsigned int subframe_offset,
unsigned char N0_symbol,
unsigned char abstraction_flag,
- uint8_t subframe);
+ unsigned char rank_adaptation,
+ uint8_t subframe);
//! \brief This function performance RSRP/RSCP measurements
void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
@@ -214,7 +215,7 @@ int8_t set_RSRQ_filtered(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,floa
//! Automatic gain control
void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
- uint32_t rx_power_fil_dB,
+ uint32_t rx_power_fil_dB,
unsigned char eNB_id);
int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
@@ -245,7 +246,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id);
void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
- int subframe,
+ int subframe,
module_id_t eNB_id,
unsigned char clear);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index 5d10cbf680..8875b11023 100755
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -40,6 +40,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
{
static int max_pos_fil = 0;
+ static int count_max_pos_ok = 0;
+ static int first_time = 1;
int temp = 0, i, aa, max_val = 0, max_pos = 0;
int diff;
short Re,Im,ncoef;
@@ -58,8 +60,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
temp = 0;
for (aa=0; aanb_antennas_rx; aa++) {
- Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id][aa])[(i<<2)];
- Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)];
+ Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<2)];
+ Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)];
temp += (Re*Re/2) + (Im*Im/2);
}
@@ -78,28 +80,59 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
// do not filter to have proactive timing adjustment
max_pos_fil = max_pos;
- diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
+ if(subframe == 6)
+ {
+ diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
- if ( abs(diff) < SYNCH_HYST )
- ue->rx_offset = 0;
- else
- ue->rx_offset = diff;
+ if ( abs(diff) < SYNCH_HYST )
+ ue->rx_offset = 0;
+ else
+ ue->rx_offset = diff;
- if ( ue->rx_offset < 0 )
- ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES;
+ if(abs(diff)<5)
+ count_max_pos_ok ++;
+ else
+ count_max_pos_ok = 0;
- if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES )
- ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES;
+ if(count_max_pos_ok > 10 && first_time == 1)
+ {
+ first_time = 0;
+ ue->time_sync_cell = 1;
+ if (ue->mac_enabled==1) {
+ LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
+ //mac_resynch();
+ dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id);
+ ue->UE_mode[0] = PRACH;
+ }
+ else {
+ ue->UE_mode[0] = PUSCH;
+ }
+ }
+
+ if ( ue->rx_offset < 0 )
+ ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES;
+
+ if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES )
+ ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES;
-#ifdef DEBUG_PHY
- LOG_D(PHY,"AbsSubframe %d.%d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d) target_pos %d \n",
- ue->proc.proc_rxtx[0].frame_rx,subframe,ue->rx_offset,max_pos,max_pos_fil,temp,(frame_parms->nb_prefix_samples>>3));
-#endif //DEBUG_PHY
-
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
+ #ifdef DEBUG_PHY
+ LOG_D(PHY,"AbsSubframe %d.%d: ThreadId %d diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n",
+ ue->proc.proc_rxtx[ue->current_thread_id[subframe]].frame_rx,
+ subframe,
+ ue->current_thread_id[subframe],
+ diff,
+ ue->rx_offset,
+ clear,
+ max_pos,
+ max_pos_fil,
+ temp,max_val,
+ (frame_parms->nb_prefix_samples>>3));
+ #endif //DEBUG_PHY
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
+ }
}
@@ -188,10 +221,6 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
else
max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15;
-#ifdef DEBUG_PHY
- //LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d\n",mac_xface->frame,max_pos,max_pos_fil2);
-#endif //DEBUG_PHY
-
return(max_pos_fil2);
}
@@ -239,7 +268,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id)
max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15;
//#ifdef DEBUG_PHY
- LOG_I(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,max_pos_fil2,sync_pos);
+ LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,max_pos_fil2,sync_pos);
//#endif //DEBUG_PHY
return(max_pos_fil2-sync_pos);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
index aea0394af2..4e7dbb350f 100755
--- a/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
@@ -51,7 +51,7 @@ int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
int uespec_pilot[300];
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
- LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch[(Ns>>1)&0x1][eNB_id];
+ LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[Ns>>1]][eNB_id];
LTE_DL_UE_HARQ_t *dlsch0_harq;
harq_pid = dlsch_ue[0]->current_harq_pid;
@@ -63,9 +63,9 @@ int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
else
rballoc = dlsch0_harq->rb_alloc_even;
- rxdataF = phy_vars_ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF;
+ rxdataF = phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[Ns>>1]].rxdataF;
- dl_bf_ch_estimates = phy_vars_ue->pdsch_vars[(Ns>>1)&0x1][eNB_id]->dl_bf_ch_estimates;
+ dl_bf_ch_estimates = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[Ns>>1]][eNB_id]->dl_bf_ch_estimates;
beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
index cc1d7a7ebc..8edb66ab4c 100755
--- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
@@ -49,11 +49,13 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
- uint8_t nushift,pilot1,pilot2,pilot3;
- int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset];
- int **dl_ch_estimates_previous=ue->common_vars.common_vars_rx_data_per_thread[((Ns>>1)+1)&0x1].dl_ch_estimates[eNB_offset];
- int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF;
+ uint8_t nushift,pilot0,pilot1,pilot2,pilot3;
+ uint8_t previous_thread_id = ue->current_thread_id[Ns>>1]==0 ? (RX_NB_TH-1):(ue->current_thread_id[Ns>>1]-1);
+ int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset];
+ int **dl_ch_estimates_previous=ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].dl_ch_estimates[eNB_offset];
+ int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF;
+ pilot0 = 0;
if (ue->frame_parms.Ncp == 0) { // normal prefix
pilot1 = 4;
pilot2 = 7;
@@ -92,7 +94,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
k = (nu + nushift)%6;
#ifdef DEBUG_CH
- printf("Channel Estimation : eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d\n",eNB_offset,Nid_cell,ch_offset,ue->frame_parms.ofdm_symbol_size,
+ printf("Channel Estimation : ThreadId %d, eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d\n",ue->current_thread_id[Ns>>1], eNB_offset,Nid_cell,ch_offset,ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,l,Ns,k);
#endif
@@ -796,19 +798,23 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
break;
}
- // do ifft of channel estimate
- for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++)
- for (p=0; pframe_parms.nb_antenna_ports_eNB; p++) {
- if (ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset][(p<<1)+aarx])
- idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset][(p<<1)+aarx][8],
- (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1);
- }
+ if( ((Ns%2) == 0) && (l == pilot0))
+ {
+ // do ifft of channel estimate
+ for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++)
+ for (p=0; pframe_parms.nb_antenna_ports_eNB; p++) {
+ if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx])
+ {
+ //LOG_I(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns>>1], l);
+ idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx][8],
+ (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1);
+ }
+ }
+ }
-#if T_TRACER
- T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(ue->Mod_id),
- T_INT(ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx%1024), T_INT(ue->proc.proc_rxtx[(Ns>>1)&1].subframe_rx),
- T_INT(0), T_BUFFER(&ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates_time[eNB_offset][0][0], 512 * 4));
-#endif
+ T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id),
+ T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].frame_rx%1024), T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].subframe_rx),
+ T_INT(0), T_BUFFER(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][0][0], 512 * 4));
return(0);
}
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c
index 2ce0e45b14..e1ad291eec 100755
--- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c
@@ -44,8 +44,8 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue,
// unsigned int n;
// int i;
- int **dl_ch_estimates=ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0];
- int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF;
+ int **dl_ch_estimates=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[0];
+ int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF;
ch_offset = (l*(ue->frame_parms.ofdm_symbol_size));
symbol_offset = ch_offset;//phy_vars_ue->lte_frame_parms.ofdm_symbol_size*l;
@@ -734,31 +734,31 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue,
// do ifft of channel estimate
for (aa=0; aaframe_parms.nb_antennas_rx*ue->frame_parms.nb_antennas_tx; aa++) {
- if (ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa]) {
+ if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa]) {
switch (ue->frame_parms.N_RB_DL) {
case 6:
- idft128((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
- (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
+ idft128((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8],
+ (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa],
1);
break;
case 25:
- idft512((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
- (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
+ idft512((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8],
+ (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa],
1);
break;
case 50:
- idft1024((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
- (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
+ idft1024((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8],
+ (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa],
1);
break;
case 75:
- idft1536((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
- (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
+ idft1536((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8],
+ (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa],
1);
break;
case 100:
- idft2048((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
- (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
+ idft2048((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8],
+ (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa],
1);
break;
default:
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
index 50f5515642..cd37f19df0 100755
--- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
@@ -34,6 +34,9 @@
//#define DEBUG_MEAS_RRC
//#define DEBUG_MEAS_UE
+//#define DEBUG_RANK_EST
+
+int16_t cond_num_threshold = 0;
#ifdef USER_MODE
void print_shorts(char *s,short *x)
@@ -186,8 +189,9 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
uint16_t Nid_cell = ue->frame_parms.Nid_cell;
uint8_t eNB_offset,nu,l,nushift,k;
uint16_t off;
+ uint8_t previous_thread_id = ue->current_thread_id[subframe]==0 ? (RX_NB_TH-1):(ue->current_thread_id[subframe]-1);
- //uint8_t isPss; // indicate if this is a slot for extracting PSS
+ //uint8_t isPss; // indicate if this is a slot for extracting PSS
//uint8_t isSss; // indicate if this is a slot for extracting SSS
//int32_t pss_ext[4][72]; // contain the extracted 6*12 REs for mapping the PSS
//int32_t sss_ext[4][72]; // contain the extracted 6*12 REs for mapping the SSS
@@ -212,61 +216,61 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
if(ue->frame_parms.frame_type == FDD)
{
- rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)];
- rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
+ 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)];
+ rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
}
else
{
- rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[(subframe+1)&0x1].rxdataF[aarx][(13*ue->frame_parms.ofdm_symbol_size)];
- rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(2*ue->frame_parms.ofdm_symbol_size)];
+ rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].rxdataF[aarx][(13*ue->frame_parms.ofdm_symbol_size)];
+ rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(2*ue->frame_parms.ofdm_symbol_size)];
}
//-ve spectrum from SSS
//+ve spectrum from SSS
- ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69]));
+ ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
- // ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
- // printf("sssp32 %d\n",ue->measurements.n0_power[aarx]);
+ // ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
+ // printf("sssp32 %d\n",ue->measurements.n0_power[aarx]);
//+ve spectrum from PSS
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65]));
- // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
- // printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS
+ // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
+ // printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS
if(ue->frame_parms.frame_type == FDD)
{
- rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
- rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
+ rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
+ rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
}
else
{
- rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[(subframe+1)&0x1].rxdataF[aarx][(14*ue->frame_parms.ofdm_symbol_size)];
- rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(3*ue->frame_parms.ofdm_symbol_size)];
+ rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].rxdataF[aarx][(14*ue->frame_parms.ofdm_symbol_size)];
+ rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(3*ue->frame_parms.ofdm_symbol_size)];
}
- // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
- // printf("pssm36 %d\n",ue->measurements.n0_power[aarx]);
+ // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
+ // printf("pssm36 %d\n",ue->measurements.n0_power[aarx]);
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65]));
-
+
ue->measurements.n0_power[aarx] = (((int32_t)rxF_sss[-70]*rxF_sss[-70])+((int32_t)rxF_sss[-69]*rxF_sss[-69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[-68]*rxF_sss[-68])+((int32_t)rxF_sss[-67]*rxF_sss[-67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[-66]*rxF_sss[-66])+((int32_t)rxF_sss[-65]*rxF_sss[-65]));
- // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
- // printf("pssm32 %d\n",ue->measurements.n0_power[aarx]);
+ // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
+ // printf("pssm32 %d\n",ue->measurements.n0_power[aarx]);
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/12);
ue->measurements.n0_power_tot /*+=*/ = ue->measurements.n0_power[aarx];
- }
+ }
//LOG_I(PHY,"Subframe %d RRC UE MEAS Noise Level %d \n", subframe, ue->measurements.n0_power_tot);
- 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 {
+ 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");
- }
+ }
}
else if ((ue->frame_parms.frame_type == TDD) &&
((subframe == 1) || (subframe == 6))) { // TDD PSS/SSS, compute noise in DTX REs // 2016-09-29 wilson fix incorrect noise power calculation
@@ -277,10 +281,10 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
if (ue->frame_parms.Ncp==NORMAL) {
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe&0x1)].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(ue->current_thread_id[subframe])].rxdataF;
rxF_pss = (int16_t *) &rxdataF[aarx][((pss_symb*(ue->frame_parms.ofdm_symbol_size)))];
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe+1)&0x1].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].rxdataF;
rxF_sss = (int16_t *) &rxdataF[aarx][((sss_symb*(ue->frame_parms.ofdm_symbol_size)))];
//-ve spectrum from SSS
@@ -305,7 +309,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
// printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS
- rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
+ rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
// printf("pssm36 %d\n",ue->measurements.n0_power[aarx]);
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
@@ -315,12 +319,11 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
// printf("pssm32 %d\n",ue->measurements.n0_power[aarx]);
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/12);
ue->measurements.n0_power_tot /*+=*/ = ue->measurements.n0_power[aarx];
- }
+ }
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);
-
//LOG_I(PHY,"Subframe %d RRC UE MEAS Noise Level %d \n", subframe, ue->measurements.n0_power_tot);
}
@@ -352,7 +355,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
//#endif
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
- rxF = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)];
+ rxF = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)];
off = (ue->frame_parms.first_carrier_offset+k)<<1;
if (l==(4-ue->frame_parms.Ncp)) {
@@ -362,8 +365,8 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
// printf("rb %d, off %d : %d\n",rb,off,((((int32_t)rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])));
- // if ((ue->frame_rx&0x3ff) == 0)
- // printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1])));
+ // if ((ue->frame_rx&0x3ff) == 0)
+ // printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1])));
off+=12;
@@ -429,6 +432,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
// if (slot == 0) {
if (eNB_offset == 0)
+
LOG_D(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id,
ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
10*log10(ue->measurements.rssi),
@@ -459,7 +463,8 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
unsigned int subframe_offset,
unsigned char N0_symbol,
unsigned char abstraction_flag,
- uint8_t subframe)
+ unsigned char rank_adaptation,
+ uint8_t subframe)
{
@@ -473,17 +478,17 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
int16x8_t *dl_ch0_128, *dl_ch1_128;
#endif
int *dl_ch0,*dl_ch1;
+
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
int nb_subbands,subband_size,last_subband_size;
int N_RB_DL = frame_parms->N_RB_DL;
+
+
+ int rank_tm3_tm4;
+
+
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
- if (ue->transmission_mode[eNB_id]!=4)
- ue->measurements.rank[eNB_id] = 0;
- else
- ue->measurements.rank[eNB_id] = 1;
- // printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
- // printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
switch (N_RB_DL) {
case 6:
@@ -517,7 +522,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
for (aarx=0; aarxnb_antennas_rx; aarx++) {
for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) {
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
- (signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
+ (signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
(N_RB_DL*12)));
//- ue->measurements.n0_power[aarx];
@@ -544,6 +549,28 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
} //eNB_id
+ eNB_id=0;
+ if (ue->transmission_mode[0]==4 || ue->transmission_mode[0]==3){
+ if (rank_adaptation == 1)
+ rank_tm3_tm4 = rank_estimation_tm3_tm4(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][4],
+ &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][4],
+ &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][4],
+ &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][4],
+ N_RB_DL);
+ else
+ rank_tm3_tm4=1;
+#ifdef DEBUG_RANK_EST
+ printf("rank tm3 or tm4 %d\n", rank_tm3_tm4);
+#endif
+ }
+
+ if (ue->transmission_mode[eNB_id]!=4 && ue->transmission_mode[eNB_id]!=3)
+ ue->measurements.rank[eNB_id] = 0;
+ else
+ ue->measurements.rank[eNB_id] = rank_tm3_tm4;
+ // printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
+ // printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
+
// filter to remove jitter
if (ue->init_averaging == 0) {
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
@@ -552,7 +579,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
(k2*((long long int)(ue->measurements.rx_power_tot[eNB_id]))))>>10);
//LOG_I(PHY,"Noise Power Computation: k1 %d k2 %d n0 avg %d n0 tot %d\n", k1, k2, ue->measurements.n0_power_avg,
- // ue->measurements.n0_power_tot);
+ // ue->measurements.n0_power_tot);
ue->measurements.n0_power_avg = (int)
(((k1*((long long int) (ue->measurements.n0_power_avg))) +
(k2*((long long int) (ue->measurements.n0_power_tot))))>>10);
@@ -572,12 +599,12 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
#ifdef DEBUG_MEAS_UE
LOG_I(PHY,"[eNB %d] Subframe %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
eNB_id,
- subframe,
+ subframe,
ue->measurements.rx_rssi_dBm[eNB_id],
ue->measurements.rx_power_avg_dB[eNB_id],
ue->measurements.wideband_cqi_avg[eNB_id],
ue->measurements.rx_power_avg[eNB_id],
- ue->measurements.n0_power_avg);
+ ue->measurements.n0_power_tot);
#endif
}
@@ -588,8 +615,8 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
// cqi/pmi information
for (aarx=0; aarxnb_antennas_rx; aarx++) {
- dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4];
- dl_ch1 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4];
+ dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
+ dl_ch1 = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
for (subband=0; subbandnb_antennas_rx; aarx++) {
- //printf("aarx=%d", aarx);
+ //printf("aarx=%d", aarx);
// skip the first 4 RE due to interpolation filter length of 5 (not possible to skip 5 due to 128i alignment, must be multiple of 128bit)
#if defined(__x86_64__) || defined(__i386__)
__m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ;
- dl_ch0_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4];
- dl_ch1_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4];
+ dl_ch0_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
+ dl_ch1_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
#elif defined(__arm__)
int32x4_t pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmtmpPMI0b,mmtmpPMI1b;
- dl_ch0_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4];
- dl_ch1_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4];
+ dl_ch0_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
+ dl_ch1_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
#endif
for (subband=0; subbandnb_antennas_rx; aarx++) {
- dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4];
+ dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
for (subband=0; subband<7; subband++) {
@@ -811,3 +838,553 @@ void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id)
LOG_D(PHY,"EMUL UE lte_ue_measurements_emul subframe %d, eNB_id %d\n",subframe,eNB_id);
}
+
+uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the order of channel estimates
+ int *dl_ch_estimates_01,
+ int *dl_ch_estimates_10,
+ int *dl_ch_estimates_11,
+ unsigned short nb_rb)
+{
+
+ int i=0;
+ int rank=0;
+ int N_RB=nb_rb;
+ int *ch00_rank, *ch01_rank, *ch10_rank, *ch11_rank;
+
+ int32_t shift;
+ int avg_0[2];
+ int avg_1[2];
+
+ int count=0;
+
+ /* we need at least alignment to 16 bytes, let's put 32 to be sure
+ * (maybe not necessary but doesn't hurt)
+ */
+ int32_t conjch00_ch01[12*N_RB] __attribute__((aligned(32)));
+ int32_t conjch01_ch00[12*N_RB] __attribute__((aligned(32)));
+ int32_t conjch10_ch11[12*N_RB] __attribute__((aligned(32)));
+ int32_t conjch11_ch10[12*N_RB] __attribute__((aligned(32)));
+ int32_t conjch00_ch00[12*N_RB] __attribute__((aligned(32)));
+ int32_t conjch01_ch01[12*N_RB] __attribute__((aligned(32)));
+ int32_t conjch10_ch10[12*N_RB] __attribute__((aligned(32)));
+ int32_t conjch11_ch11[12*N_RB] __attribute__((aligned(32)));
+ int32_t af_mf_00[12*N_RB] __attribute__((aligned(32)));
+ int32_t af_mf_00_sq[12*N_RB] __attribute__((aligned(32)));
+ int32_t af_mf_01_sq[12*N_RB] __attribute__((aligned(32)));
+ int32_t af_mf_10_sq[12*N_RB] __attribute__((aligned(32)));
+ int32_t af_mf_11_sq[12*N_RB] __attribute__((aligned(32)));
+ int32_t af_mf_01[12*N_RB] __attribute__((aligned(32)));
+ int32_t af_mf_10[12*N_RB] __attribute__((aligned(32)));
+ int32_t af_mf_11[12*N_RB] __attribute__((aligned(32)));
+ int32_t determ_fin[12*N_RB] __attribute__((aligned(32)));
+ int32_t denum_db[12*N_RB] __attribute__((aligned(32)));
+ int32_t numer_fin[12*N_RB] __attribute__((aligned(32)));
+ int32_t numer_db[12*N_RB] __attribute__((aligned(32)));
+ int32_t cond_db[12*N_RB] __attribute__((aligned(32)));
+
+ ch00_rank = dl_ch_estimates_00;
+ ch01_rank = dl_ch_estimates_01;
+ ch10_rank = dl_ch_estimates_10;
+ ch11_rank = dl_ch_estimates_11;
+
+ dlsch_channel_level_TM34_meas(ch00_rank,
+ ch01_rank,
+ ch10_rank,
+ ch11_rank,
+ avg_0,
+ avg_1,
+ N_RB);
+
+ avg_0[0] = (log2_approx(avg_0[0])/2);
+ shift = cmax(avg_0[0],0);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n shift %d \n" , shift);
+ printf("\n conj(ch00)ch01 \n");
+#endif
+
+ conjch0_mult_ch1(ch00_rank,
+ ch01_rank,
+ conjch00_ch01,
+ N_RB,
+ shift); // this is an arbitrary shift to avoid overflow. can be changed.
+
+#ifdef DEBUG_RANK_EST
+ printf("\n conj(ch01)ch00 \n");
+#endif
+
+ conjch0_mult_ch1(ch01_rank,
+ ch00_rank,
+ conjch01_ch00,
+ N_RB,
+ shift);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n conj(ch10)ch11 \n");
+#endif
+
+
+ conjch0_mult_ch1(ch10_rank,
+ ch11_rank,
+ conjch10_ch11,
+ N_RB,
+ shift);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n conj(ch11)ch10 \n");
+#endif
+
+ conjch0_mult_ch1(ch11_rank,
+ ch10_rank,
+ conjch11_ch10,
+ N_RB,
+ shift);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n conj(ch00)ch00 \n");
+#endif
+
+ conjch0_mult_ch1(ch00_rank,
+ ch00_rank,
+ conjch00_ch00,
+ N_RB,
+ shift);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n conj(ch01)ch01 \n");
+#endif
+
+ conjch0_mult_ch1(ch01_rank,
+ ch01_rank,
+ conjch01_ch01,
+ N_RB,
+ shift);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n conj(ch10)ch10 \n");
+#endif
+
+ conjch0_mult_ch1(ch10_rank,
+ ch10_rank,
+ conjch10_ch10,
+ N_RB,
+ shift);
+#ifdef DEBUG_RANK_EST
+ printf("\n conj(ch11)ch11 \n");
+#endif
+
+ conjch0_mult_ch1(ch11_rank,
+ ch11_rank,
+ conjch11_ch11,
+ N_RB,
+ shift);
+
+ construct_HhH_elements(conjch00_ch00,
+ conjch01_ch01,
+ conjch11_ch11,
+ conjch10_ch10,
+ conjch00_ch01,
+ conjch01_ch00,
+ conjch10_ch11,
+ conjch11_ch10,
+ af_mf_00,
+ af_mf_01,
+ af_mf_10,
+ af_mf_11,
+ N_RB);
+#ifdef DEBUG_RANK_EST
+ printf("\n |HhH00|^2 \n");
+#endif
+
+ squared_matrix_element(af_mf_00,
+ af_mf_00_sq,
+ N_RB);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n |HhH01|^2 \n");
+#endif
+
+ squared_matrix_element(af_mf_01,
+ af_mf_01_sq,
+ N_RB);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n |HhH10|^2 \n");
+#endif
+
+ squared_matrix_element(af_mf_10,
+ af_mf_10_sq,
+ N_RB);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n |HhH11|^2 \n");
+#endif
+
+ squared_matrix_element(af_mf_11,
+ af_mf_11_sq,
+ N_RB);
+
+ det_HhH(af_mf_00,
+ af_mf_01,
+ af_mf_10,
+ af_mf_11,
+ determ_fin,
+ N_RB);
+
+ numer(af_mf_00_sq,
+ af_mf_01_sq,
+ af_mf_10_sq,
+ af_mf_11_sq,
+ numer_fin,
+ N_RB);
+
+ for (i=1; i<12*N_RB; i++)
+ {
+ denum_db[i]=dB_fixed(determ_fin[i]);
+ numer_db[i]=dB_fixed(numer_fin[i]);
+ cond_db[i]=(numer_db[i]-denum_db[i]);
+ if (cond_db[i] < cond_num_threshold)
+ count++;
+#ifdef DEBUG_RANK_EST
+ printf("cond_num_threshold =%d \n", cond_num_threshold);
+ printf("i %d numer_db[i] = %d \n", i, numer_db[i]);
+ printf("i %d denum_db[i] = %d \n", i, denum_db[i]);
+ printf("i %d cond_db[i] = %d \n", i, cond_db[i]);
+ printf("i %d counter = %d \n", i, count);
+#endif
+ }
+
+ if (count >= 6*N_RB) // conditional number is lower 10dB in half on more Res Blocks
+ rank=1;
+
+#ifdef DEBUG_RANK_EST
+ printf(" rank = %d \n", rank);
+#endif
+ return(rank);
+}
+
+void conjch0_mult_ch1(int *ch0,
+ int *ch1,
+ int32_t *ch0conj_ch1,
+ unsigned short nb_rb,
+ unsigned char output_shift0)
+{
+ //This function is used to compute multiplications in Hhermitian * H matrix
+ unsigned short rb;
+ __m128i *dl_ch0_128,*dl_ch1_128, *ch0conj_ch1_128, mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
+
+ dl_ch0_128 = (__m128i *)ch0;
+ dl_ch1_128 = (__m128i *)ch1;
+
+ ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+
+ mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
+ mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
+ mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+ mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
+ mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch1_128[0]);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
+ mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+ mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+
+ ch0conj_ch1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n Computing conjugates \n");
+ print_shorts("ch0:",(int16_t*)&dl_ch0_128[0]);
+ print_shorts("ch1:",(int16_t*)&dl_ch1_128[0]);
+ print_shorts("pack:",(int16_t*)&ch0conj_ch1_128[0]);
+#endif
+
+ dl_ch0_128+=1;
+ dl_ch1_128+=1;
+ ch0conj_ch1_128+=1;
+ }
+ _mm_empty();
+ _m_empty();
+}
+
+void construct_HhH_elements(int *ch0conj_ch0, //00_00
+ int *ch1conj_ch1,//01_01
+ int *ch2conj_ch2,//11_11
+ int *ch3conj_ch3,//10_10
+ int *ch0conj_ch1,//00_01
+ int *ch1conj_ch0,//01_00
+ int *ch2conj_ch3,//10_11
+ int *ch3conj_ch2,//11_10
+ int32_t *after_mf_00,
+ int32_t *after_mf_01,
+ int32_t *after_mf_10,
+ int32_t *after_mf_11,
+ unsigned short nb_rb)
+{
+ unsigned short rb;
+ __m128i *ch0conj_ch0_128, *ch1conj_ch1_128, *ch2conj_ch2_128, *ch3conj_ch3_128;
+ __m128i *ch0conj_ch1_128, *ch1conj_ch0_128, *ch2conj_ch3_128, *ch3conj_ch2_128;
+ __m128i *after_mf_00_128, *after_mf_01_128, *after_mf_10_128, *after_mf_11_128;
+
+ ch0conj_ch0_128 = (__m128i *)ch0conj_ch0;
+ ch1conj_ch1_128 = (__m128i *)ch1conj_ch1;
+ ch2conj_ch2_128 = (__m128i *)ch2conj_ch2;
+ ch3conj_ch3_128 = (__m128i *)ch3conj_ch3;
+ ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
+ ch1conj_ch0_128 = (__m128i *)ch1conj_ch0;
+ ch2conj_ch3_128 = (__m128i *)ch2conj_ch3;
+ ch3conj_ch2_128 = (__m128i *)ch3conj_ch2;
+ after_mf_00_128 = (__m128i *)after_mf_00;
+ after_mf_01_128 = (__m128i *)after_mf_01;
+ after_mf_10_128 = (__m128i *)after_mf_10;
+ after_mf_11_128 = (__m128i *)after_mf_11;
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+
+ after_mf_00_128[0] =_mm_adds_epi16(ch0conj_ch0_128[0],ch3conj_ch3_128[0]);// _mm_adds_epi32(ch0conj_ch0_128[0], ch3conj_ch3_128[0]); //00_00 + 10_10
+ after_mf_11_128[0] =_mm_adds_epi16(ch1conj_ch1_128[0], ch2conj_ch2_128[0]); //01_01 + 11_11
+ after_mf_01_128[0] =_mm_adds_epi16(ch0conj_ch1_128[0], ch2conj_ch3_128[0]);//00_01 + 10_11
+ after_mf_10_128[0] =_mm_adds_epi16(ch1conj_ch0_128[0], ch3conj_ch2_128[0]);//01_00 + 11_10
+
+#ifdef DEBUG_RANK_EST
+ printf(" \n construct_HhH_elements \n");
+ print_shorts("ch0conj_ch0_128:",(int16_t*)&ch0conj_ch0_128[0]);
+ print_shorts("ch1conj_ch1_128:",(int16_t*)&ch1conj_ch1_128[0]);
+ print_shorts("ch2conj_ch2_128:",(int16_t*)&ch2conj_ch2_128[0]);
+ print_shorts("ch3conj_ch3_128:",(int16_t*)&ch3conj_ch3_128[0]);
+ print_shorts("ch0conj_ch1_128:",(int16_t*)&ch0conj_ch1_128[0]);
+ print_shorts("ch1conj_ch0_128:",(int16_t*)&ch1conj_ch0_128[0]);
+ print_shorts("ch2conj_ch3_128:",(int16_t*)&ch2conj_ch3_128[0]);
+ print_shorts("ch3conj_ch2_128:",(int16_t*)&ch3conj_ch2_128[0]);
+ print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]);
+ print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]);
+ print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]);
+ print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]);
+#endif
+
+ ch0conj_ch0_128+=1;
+ ch1conj_ch1_128+=1;
+ ch2conj_ch2_128+=1;
+ ch3conj_ch3_128+=1;
+ ch0conj_ch1_128+=1;
+ ch1conj_ch0_128+=1;
+ ch2conj_ch3_128+=1;
+ ch3conj_ch2_128+=1;
+
+ after_mf_00_128+=1;
+ after_mf_01_128+=1;
+ after_mf_10_128+=1;
+ after_mf_11_128+=1;
+ }
+ _mm_empty();
+ _m_empty();
+}
+
+
+void squared_matrix_element(int32_t *Hh_h_00,
+ int32_t *Hh_h_00_sq,
+ unsigned short nb_rb)
+{
+ unsigned short rb;
+ __m128i *Hh_h_00_128,*Hh_h_00_sq_128;
+
+ Hh_h_00_128 = (__m128i *)Hh_h_00;
+ Hh_h_00_sq_128 = (__m128i *)Hh_h_00_sq;
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+
+ Hh_h_00_sq_128[0] = _mm_madd_epi16(Hh_h_00_128[0],Hh_h_00_128[0]);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n Computing squared_matrix_element \n");
+ print_shorts("Hh_h_00_128:",(int16_t*)&Hh_h_00_128[0]);
+ print_ints("Hh_h_00_sq_128:",(int32_t*)&Hh_h_00_sq_128[0]);
+#endif
+
+ Hh_h_00_sq_128+=1;
+ Hh_h_00_128+=1;
+ }
+ _mm_empty();
+ _m_empty();
+}
+
+
+
+void det_HhH(int32_t *after_mf_00,
+ int32_t *after_mf_01,
+ int32_t *after_mf_10,
+ int32_t *after_mf_11,
+ int32_t *det_fin,
+ unsigned short nb_rb)
+
+{
+ unsigned short rb;
+ __m128i *after_mf_00_128,*after_mf_01_128, *after_mf_10_128, *after_mf_11_128, ad_re_128, bc_re_128;
+ __m128i *det_fin_128, det_128;
+
+ after_mf_00_128 = (__m128i *)after_mf_00;
+ after_mf_01_128 = (__m128i *)after_mf_01;
+ after_mf_10_128 = (__m128i *)after_mf_10;
+ after_mf_11_128 = (__m128i *)after_mf_11;
+
+ det_fin_128 = (__m128i *)det_fin;
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+
+ ad_re_128 = _mm_madd_epi16(after_mf_00_128[0],after_mf_11_128[0]);
+ bc_re_128 = _mm_madd_epi16(after_mf_01_128[0],after_mf_01_128[0]);
+ det_128 = _mm_sub_epi32(ad_re_128, bc_re_128);
+ det_fin_128[0] = _mm_abs_epi32(det_128);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n Computing denominator \n");
+ print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]);
+ print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]);
+ print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]);
+ print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]);
+ print_ints("ad_re_128:",(int32_t*)&ad_re_128);
+ print_ints("bc_re_128:",(int32_t*)&bc_re_128);
+ print_ints("det_fin_128:",(int32_t*)&det_fin_128[0]);
+#endif
+
+ det_fin_128+=1;
+ after_mf_00_128+=1;
+ after_mf_01_128+=1;
+ after_mf_10_128+=1;
+ after_mf_11_128+=1;
+ }
+ _mm_empty();
+ _m_empty();
+}
+
+void numer(int32_t *Hh_h_00_sq,
+ int32_t *Hh_h_01_sq,
+ int32_t *Hh_h_10_sq,
+ int32_t *Hh_h_11_sq,
+ int32_t *num_fin,
+ unsigned short nb_rb)
+
+{
+ unsigned short rb;
+ __m128i *h_h_00_sq_128, *h_h_01_sq_128, *h_h_10_sq_128, *h_h_11_sq_128;
+ __m128i *num_fin_128, sq_a_plus_sq_d_128, sq_b_plus_sq_c_128;
+
+ h_h_00_sq_128 = (__m128i *)Hh_h_00_sq;
+ h_h_01_sq_128 = (__m128i *)Hh_h_01_sq;
+ h_h_10_sq_128 = (__m128i *)Hh_h_10_sq;
+ h_h_11_sq_128 = (__m128i *)Hh_h_11_sq;
+
+ num_fin_128 = (__m128i *)num_fin;
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+
+ sq_a_plus_sq_d_128 = _mm_add_epi32(h_h_00_sq_128[0],h_h_11_sq_128[0]);
+ sq_b_plus_sq_c_128 = _mm_add_epi32(h_h_01_sq_128[0],h_h_10_sq_128[0]);
+ num_fin_128[0] = _mm_add_epi32(sq_a_plus_sq_d_128, sq_b_plus_sq_c_128);
+
+#ifdef DEBUG_RANK_EST
+ printf("\n Computing numerator \n");
+ print_ints("h_h_00_sq_128:",(int32_t*)&h_h_00_sq_128[0]);
+ print_ints("h_h_01_sq_128:",(int32_t*)&h_h_01_sq_128[0]);
+ print_ints("h_h_10_sq_128:",(int32_t*)&h_h_10_sq_128[0]);
+ print_ints("h_h_11_sq_128:",(int32_t*)&h_h_11_sq_128[0]);
+ print_shorts("sq_a_plus_sq_d_128:",(int16_t*)&sq_a_plus_sq_d_128);
+ print_shorts("sq_b_plus_sq_c_128:",(int16_t*)&sq_b_plus_sq_c_128);
+ print_shorts("num_fin_128:",(int16_t*)&num_fin_128[0]);
+#endif
+
+ num_fin_128+=1;
+ h_h_00_sq_128+=1;
+ h_h_01_sq_128+=1;
+ h_h_10_sq_128+=1;
+ h_h_11_sq_128+=1;
+ }
+ _mm_empty();
+ _m_empty();
+}
+
+
+
+
+
+void dlsch_channel_level_TM34_meas(int *ch00,
+ int *ch01,
+ int *ch10,
+ int *ch11,
+ int *avg_0,
+ int *avg_1,
+ unsigned short nb_rb)
+{
+
+#if defined(__x86_64__)||defined(__i386__)
+
+ short rb;
+ unsigned char nre=12;
+ __m128i *ch00_128, *ch01_128, *ch10_128, *ch11_128;
+ __m128i avg_0_row0_128D, avg_1_row0_128D, avg_0_row1_128D, avg_1_row1_128D;
+ __m128i ch00_128_tmp, ch01_128_tmp, ch10_128_tmp, ch11_128_tmp;
+
+ avg_0[0] = 0;
+ avg_0[1] = 0;
+ avg_1[0] = 0;
+ avg_1[1] = 0;
+
+ ch00_128 = (__m128i *)ch00;
+ ch01_128 = (__m128i *)ch01;
+ ch10_128 = (__m128i *)ch10;
+ ch11_128 = (__m128i *)ch11;
+
+ avg_0_row0_128D = _mm_setzero_si128();
+ avg_1_row0_128D = _mm_setzero_si128();
+ avg_0_row1_128D = _mm_setzero_si128();
+ avg_1_row1_128D = _mm_setzero_si128();
+
+ for (rb=0; rb<3*nb_rb; rb++) {
+ ch00_128_tmp = _mm_load_si128(&ch00_128[0]);
+ ch01_128_tmp = _mm_load_si128(&ch01_128[0]);
+ ch10_128_tmp = _mm_load_si128(&ch10_128[0]);
+ ch11_128_tmp = _mm_load_si128(&ch11_128[0]);
+
+ avg_0_row0_128D = _mm_add_epi32(avg_0_row0_128D,_mm_madd_epi16(ch00_128_tmp,ch00_128_tmp));
+ avg_1_row0_128D = _mm_add_epi32(avg_1_row0_128D,_mm_madd_epi16(ch01_128_tmp,ch01_128_tmp));
+ avg_0_row1_128D = _mm_add_epi32(avg_0_row1_128D,_mm_madd_epi16(ch10_128_tmp,ch10_128_tmp));
+ avg_1_row1_128D = _mm_add_epi32(avg_1_row1_128D,_mm_madd_epi16(ch11_128_tmp,ch11_128_tmp));
+
+ ch00_128+=1;
+ ch01_128+=1;
+ ch10_128+=1;
+ ch11_128+=1;
+ }
+
+ avg_0[0] = (((int*)&avg_0_row0_128D)[0])/(nb_rb*nre) +
+ (((int*)&avg_0_row0_128D)[1])/(nb_rb*nre) +
+ (((int*)&avg_0_row0_128D)[2])/(nb_rb*nre) +
+ (((int*)&avg_0_row0_128D)[3])/(nb_rb*nre);
+
+ avg_1[0] = (((int*)&avg_1_row0_128D)[0])/(nb_rb*nre) +
+ (((int*)&avg_1_row0_128D)[1])/(nb_rb*nre) +
+ (((int*)&avg_1_row0_128D)[2])/(nb_rb*nre) +
+ (((int*)&avg_1_row0_128D)[3])/(nb_rb*nre);
+
+ avg_0[1] = (((int*)&avg_0_row1_128D)[0])/(nb_rb*nre) +
+ (((int*)&avg_0_row1_128D)[1])/(nb_rb*nre) +
+ (((int*)&avg_0_row1_128D)[2])/(nb_rb*nre) +
+ (((int*)&avg_0_row1_128D)[3])/(nb_rb*nre);
+
+ avg_1[1] = (((int*)&avg_1_row1_128D)[0])/(nb_rb*nre) +
+ (((int*)&avg_1_row1_128D)[1])/(nb_rb*nre) +
+ (((int*)&avg_1_row1_128D)[2])/(nb_rb*nre) +
+ (((int*)&avg_1_row1_128D)[3])/(nb_rb*nre);
+
+ avg_0[0] = avg_0[0] + avg_0[1];
+ avg_1[0] = avg_1[0] + avg_1[1];
+ avg_0[0] = min (avg_0[0], avg_1[0]);
+ avg_1[0] = avg_0[0];
+
+ _mm_empty();
+ _m_empty();
+
+#elif defined(__arm__)
+
+#endif
+}
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
index 17ddd9b554..65423aa9b6 100755
--- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
@@ -302,7 +302,7 @@ int32_t temp_in_ifft_0[2048*2] __attribute__((aligned(32)));
#if T_TRACER
if (aa == 0)
- T(T_ENB_PHY_UL_CHANNEL_ESTIMATE, T_INT(0), T_INT(UE_id),
+ T(T_ENB_PHY_UL_CHANNEL_ESTIMATE, T_INT(0), T_INT(eNB->ulsch[UE_id]->rnti),
T_INT(proc->frame_rx), T_INT(subframe),
T_INT(0), T_BUFFER(ul_ch_estimates_time[0], 512 * 4));
#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index b9576e9c9d..d720a07298 100755
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -414,7 +414,7 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm
for (i=0; i<4; i++) {
wbar[mprime] = llr[tti_offset0+i];
#ifdef DEBUG_DCI_DECODING
- LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset0+i,symbol_offset,re_offset0,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime]));
+// LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset0+i,symbol_offset,re_offset0,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime]));
#endif
mprime++;
re_offset0++;
@@ -430,7 +430,7 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm
for (i=0; i<4; i++) {
wbar[mprime] = llr[tti_offset+i];
#ifdef DEBUG_DCI_DECODING
- LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset+i,symbol_offset,re_offset+i,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime]));
+// LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset+i,symbol_offset,re_offset+i,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime]));
#endif
mprime++;
}
@@ -660,7 +660,7 @@ void pdcch_channel_level(int32_t **dl_ch_estimates_ext,
//clear average level
#if defined(__x86_64__) || defined(__i386__)
avg128P = _mm_setzero_si128();
- dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][frame_parms->N_RB_DL*12];
+ dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][0];
#elif defined(__arm__)
#endif
@@ -1700,55 +1700,55 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
LTE_UE_COMMON *common_vars = &ue->common_vars;
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars[subframe & 0x1];
+ LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[subframe]];
uint8_t log2_maxh,aatx,aarx;
#ifdef MU_RECEIVER
uint8_t eNB_id_i=eNB_id+1;//add 1 to eNB_id to separate from wanted signal, chosen as the B/F'd pilots from the SeNB are shifted by 1
#endif
- int32_t avgs,s;
- uint8_t n_pdcch_symbols = 3; //pdcch_vars[eNB_id]->num_pdcch_symbols;
+ int32_t avgs;
+ uint8_t n_pdcch_symbols;
uint8_t mi = get_mi(frame_parms,subframe);
//printf("In rx_pdcch, subframe %d, eNB_id %d, pdcch_vars %d \n",subframe,eNB_id,pdcch_vars);
-
- for (s=0; scommon_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB
+ pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB
pdcch_vars[eNB_id]->rxdataF_ext,
pdcch_vars[eNB_id]->dl_ch_estimates_ext,
- s,
+ 0,
high_speed_flag,
frame_parms);
#ifdef MU_RECEIVER
- pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB
+ pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB
pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna
pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna
- s,
+ 0,
high_speed_flag,
frame_parms);
#endif //MU_RECEIVER
} else if (frame_parms->nb_antenna_ports_eNB>1) {
- pdcch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
+ pdcch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdcch_vars[eNB_id]->rxdataF_ext,
pdcch_vars[eNB_id]->dl_ch_estimates_ext,
- s,
+ 0,
high_speed_flag,
frame_parms);
} else {
- pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
+ pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdcch_vars[eNB_id]->rxdataF_ext,
pdcch_vars[eNB_id]->dl_ch_estimates_ext,
- s,
+ 0,
high_speed_flag,
frame_parms);
}
- }
+
+ // compute channel level based on ofdm symbol 0
pdcch_channel_level(pdcch_vars[eNB_id]->dl_ch_estimates_ext,
frame_parms,
avgP,
@@ -1761,94 +1761,92 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
avgs = cmax(avgs,avgP[(aarx<<1)+aatx]);
log2_maxh = (log2_approx(avgs)/2) + 5; //+frame_parms->nb_antennas_rx;
-#ifdef DEBUG_PHY
- LOG_I(PHY,"subframe %d: pdcch log2_maxh = %d (%d,%d)\n",subframe,log2_maxh,avgP[0],avgs);
+#ifdef UE_DEBUG_TRACE
+ LOG_D(PHY,"subframe %d: pdcch log2_maxh = %d (%d,%d)\n",subframe,log2_maxh,avgP[0],avgs);
#endif
-#if T_TRACER
- T(T_UE_PHY_PDCCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(subframe),
- T_INT(avgP[0]), T_INT(avgP[1]), T_INT(avgP[2]), T_INT(avgP[3]));
-#endif
- for (s=0; srxdataF_ext,
- pdcch_vars[eNB_id]->dl_ch_estimates_ext,
- pdcch_vars[eNB_id]->rxdataF_comp,
- (aatx>1) ? pdcch_vars[eNB_id]->rho : NULL,
- frame_parms,
- s,
- log2_maxh); // log2_maxh+I0_shift
+ T(T_UE_PHY_PDCCH_ENERGY, T_INT(eNB_id), T_INT(frame%1024), T_INT(subframe),
+ T_INT(avgP[0]), T_INT(avgP[1]), T_INT(avgP[2]), T_INT(avgP[3]));
+
+ // compute LLRs for ofdm symbol 0 only
+ pdcch_channel_compensation(pdcch_vars[eNB_id]->rxdataF_ext,
+ pdcch_vars[eNB_id]->dl_ch_estimates_ext,
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ (aatx>1) ? pdcch_vars[eNB_id]->rho : NULL,
+ frame_parms,
+ 0,
+ log2_maxh); // log2_maxh+I0_shift
#ifdef DEBUG_PHY
- if (subframe==5)
+ if (subframe==5)
write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
#endif
#ifdef MU_RECEIVER
- if (is_secondary_ue) {
+ if (is_secondary_ue) {
//get MF output for interfering stream
pdcch_channel_compensation(pdcch_vars[eNB_id_i]->rxdataF_ext,
- pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
- pdcch_vars[eNB_id_i]->rxdataF_comp,
- (aatx>1) ? pdcch_vars[eNB_id_i]->rho : NULL,
- frame_parms,
- s,
- log2_maxh); // log2_maxh+I0_shift
+ pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
+ pdcch_vars[eNB_id_i]->rxdataF_comp,
+ (aatx>1) ? pdcch_vars[eNB_id_i]->rho : NULL,
+ frame_parms,
+ 0,
+ log2_maxh); // log2_maxh+I0_shift
#ifdef DEBUG_PHY
write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
#endif
pdcch_dual_stream_correlation(frame_parms,
- s,
- pdcch_vars[eNB_id]->dl_ch_estimates_ext,
- pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
- pdcch_vars[eNB_id]->dl_ch_rho_ext,
- log2_maxh);
- }
+ 0,
+ pdcch_vars[eNB_id]->dl_ch_estimates_ext,
+ pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
+ pdcch_vars[eNB_id]->dl_ch_rho_ext,
+ log2_maxh);
+ }
#endif //MU_RECEIVER
- if (frame_parms->nb_antennas_rx > 1) {
+ if (frame_parms->nb_antennas_rx > 1) {
#ifdef MU_RECEIVER
if (is_secondary_ue) {
- pdcch_detection_mrc_i(frame_parms,
- pdcch_vars[eNB_id]->rxdataF_comp,
- pdcch_vars[eNB_id_i]->rxdataF_comp,
- pdcch_vars[eNB_id]->rho,
- pdcch_vars[eNB_id]->dl_ch_rho_ext,
- s);
+ pdcch_detection_mrc_i(frame_parms,
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ pdcch_vars[eNB_id_i]->rxdataF_comp,
+ pdcch_vars[eNB_id]->rho,
+ pdcch_vars[eNB_id]->dl_ch_rho_ext,
+ 0);
#ifdef DEBUG_PHY
- write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
- write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+ write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+ write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
#endif
} else
#endif //MU_RECEIVER
- pdcch_detection_mrc(frame_parms,
- pdcch_vars[eNB_id]->rxdataF_comp,
- s);
+ pdcch_detection_mrc(frame_parms,
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ 0);
+ }
- }
-
- if (mimo_mode == SISO)
- pdcch_siso(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s);
- else
- pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s);
+ if (mimo_mode == SISO)
+ pdcch_siso(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,0);
+ else
+ pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,0);
#ifdef MU_RECEIVER
- if (is_secondary_ue) {
+ if (is_secondary_ue) {
pdcch_qpsk_qpsk_llr(frame_parms,
- pdcch_vars[eNB_id]->rxdataF_comp,
- pdcch_vars[eNB_id_i]->rxdataF_comp,
- pdcch_vars[eNB_id]->dl_ch_rho_ext,
- pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder)
- pdcch_vars[eNB_id]->llr,
- s);
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ pdcch_vars[eNB_id_i]->rxdataF_comp,
+ pdcch_vars[eNB_id]->dl_ch_rho_ext,
+ pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder)
+ pdcch_vars[eNB_id]->llr,
+ 0);
/*
#ifdef DEBUG_PHY
if (subframe==5) {
@@ -1856,22 +1854,21 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
write_output("llr16_seq.m","llr16",&pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
}
#endif*/
- } else {
+ } else {
#endif //MU_RECEIVER
pdcch_llr(frame_parms,
- pdcch_vars[eNB_id]->rxdataF_comp,
- (char *)pdcch_vars[eNB_id]->llr,
- s);
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ (char *)pdcch_vars[eNB_id]->llr,
+ 0);
/*#ifdef DEBUG_PHY
write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
#endif*/
#ifdef MU_RECEIVER
- }
+ }
#endif //MU_RECEIVER
- }
#if T_TRACER
T(T_UE_PHY_PDCCH_IQ, T_INT(frame_parms->N_RB_DL), T_INT(frame_parms->N_RB_DL),
@@ -1879,7 +1876,7 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
T_BUFFER(pdcch_vars[eNB_id]->rxdataF_comp, frame_parms->N_RB_DL*12*n_pdcch_symbols* 4));
#endif
- // decode pcfich here
+ // decode pcfich here and find out pdcch ofdm symbol number
n_pdcch_symbols = rx_pcfich(frame_parms,
subframe,
pdcch_vars[eNB_id],
@@ -1895,6 +1892,147 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
LOG_I(PHY,"demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config);
#endif
+ // process pdcch ofdm symbol 1 and 2 if necessary
+ for (int s=1; scommon_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB
+ pdcch_vars[eNB_id]->rxdataF_ext,
+ pdcch_vars[eNB_id]->dl_ch_estimates_ext,
+ s,
+ high_speed_flag,
+ frame_parms);
+#ifdef MU_RECEIVER
+pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB
+ pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna
+ pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna
+ s,
+ high_speed_flag,
+ frame_parms);
+#endif //MU_RECEIVER
+ } else if (frame_parms->nb_antenna_ports_eNB>1) {
+ pdcch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
+ pdcch_vars[eNB_id]->rxdataF_ext,
+ pdcch_vars[eNB_id]->dl_ch_estimates_ext,
+ s,
+ high_speed_flag,
+ frame_parms);
+ } else {
+ pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
+ pdcch_vars[eNB_id]->rxdataF_ext,
+ pdcch_vars[eNB_id]->dl_ch_estimates_ext,
+ s,
+ high_speed_flag,
+ frame_parms);
+ }
+
+
+ pdcch_channel_compensation(pdcch_vars[eNB_id]->rxdataF_ext,
+ pdcch_vars[eNB_id]->dl_ch_estimates_ext,
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ (aatx>1) ? pdcch_vars[eNB_id]->rho : NULL,
+ frame_parms,
+ s,
+ log2_maxh); // log2_maxh+I0_shift
+
+
+#ifdef DEBUG_PHY
+
+if (subframe==5)
+ write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+
+#endif
+
+#ifdef MU_RECEIVER
+
+if (is_secondary_ue) {
+ //get MF output for interfering stream
+ pdcch_channel_compensation(pdcch_vars[eNB_id_i]->rxdataF_ext,
+ pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
+ pdcch_vars[eNB_id_i]->rxdataF_comp,
+ (aatx>1) ? pdcch_vars[eNB_id_i]->rho : NULL,
+ frame_parms,
+ s,
+ log2_maxh); // log2_maxh+I0_shift
+#ifdef DEBUG_PHY
+write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+#endif
+pdcch_dual_stream_correlation(frame_parms,
+ s,
+ pdcch_vars[eNB_id]->dl_ch_estimates_ext,
+ pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
+ pdcch_vars[eNB_id]->dl_ch_rho_ext,
+ log2_maxh);
+}
+
+#endif //MU_RECEIVER
+
+
+if (frame_parms->nb_antennas_rx > 1) {
+#ifdef MU_RECEIVER
+
+ if (is_secondary_ue) {
+ pdcch_detection_mrc_i(frame_parms,
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ pdcch_vars[eNB_id_i]->rxdataF_comp,
+ pdcch_vars[eNB_id]->rho,
+ pdcch_vars[eNB_id]->dl_ch_rho_ext,
+ s);
+#ifdef DEBUG_PHY
+write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+#endif
+ } else
+#endif //MU_RECEIVER
+ pdcch_detection_mrc(frame_parms,
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ s);
+
+}
+
+if (mimo_mode == SISO)
+ pdcch_siso(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s);
+else
+ pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s);
+
+
+#ifdef MU_RECEIVER
+
+if (is_secondary_ue) {
+ pdcch_qpsk_qpsk_llr(frame_parms,
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ pdcch_vars[eNB_id_i]->rxdataF_comp,
+ pdcch_vars[eNB_id]->dl_ch_rho_ext,
+ pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder)
+ pdcch_vars[eNB_id]->llr,
+ s);
+ /*
+ #ifdef DEBUG_PHY
+ if (subframe==5) {
+ write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
+ write_output("llr16_seq.m","llr16",&pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
+ }
+ #endif*/
+} else {
+#endif //MU_RECEIVER
+ pdcch_llr(frame_parms,
+ pdcch_vars[eNB_id]->rxdataF_comp,
+ (char *)pdcch_vars[eNB_id]->llr,
+ s);
+ /*#ifdef DEBUG_PHY
+ write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
+ #endif*/
+
+#ifdef MU_RECEIVER
+}
+
+#endif //MU_RECEIVER
+
+ }
+
pdcch_demapping(pdcch_vars[eNB_id]->llr,
pdcch_vars[eNB_id]->wbar,
frame_parms,
@@ -2038,15 +2176,18 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci,
}
+
// LOG_I(PHY," dci.c: get_num_pdcch_symbols subframe %d FATAL, illegal numCCE %d (num_dci %d)\n",subframe,numCCE,num_dci);
//for (i=0;i=1; L>>=1) {
@@ -2130,11 +2273,13 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
if (dci_alloc[i].L == (uint8_t)L) {
-#ifdef DEBUG_DCI_ENCODING
- LOG_I(PHY,"Generating DCI %d/%d (nCCE %d) of length %d, aggregation %d (%x)\n",i,num_dci,dci_alloc[i].firstCCE,dci_alloc[i].dci_length,dci_alloc[i].L,
- *(unsigned int*)dci_alloc[i].dci_pdu);
- dump_dci(frame_parms,&dci_alloc[i]);
-#endif
+ //#ifdef DEBUG_DCI_ENCODING
+ if (dci_alloc[i].rnti!=0xFFFF)
+ LOG_I(PHY,"Generating DCI %d/%d (nCCE %d) of length %d, aggregation %d (%x), rnti %x\n",i,num_dci,dci_alloc[i].firstCCE,dci_alloc[i].dci_length,dci_alloc[i].L,
+ *(unsigned int*)dci_alloc[i].dci_pdu,
+ dci_alloc[i].rnti);
+ //dump_dci(frame_parms,&dci_alloc[i]);
+ //#endif
if (dci_alloc[i].firstCCE>=0) {
e_ptr = generate_dci0(dci_alloc[i].dci_pdu,
@@ -2353,6 +2498,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
}
+
void dci_decoding(uint8_t DCI_LENGTH,
uint8_t aggregation_level,
int8_t *e,
@@ -2417,7 +2563,7 @@ void dci_decoding(uint8_t DCI_LENGTH,
}
-static uint8_t dci_decoded_output[2][(MAX_DCI_SIZE_BITS+64)/8];
+static uint8_t dci_decoded_output[RX_NB_TH][(MAX_DCI_SIZE_BITS+64)/8];
uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi)
{
@@ -2556,7 +2702,8 @@ int get_nCCE_offset_l1(int *CCE_table,
search_space_free = 1;
for (l=0; l= nCCE || CCE_table[cce] == 1) {
search_space_free = 0;
break;
}
@@ -2581,6 +2728,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
uint8_t subframe,
DCI_ALLOC_t *dci_alloc,
int16_t eNB_id,
+ uint8_t current_thread_id,
LTE_DL_FRAME_PARMS *frame_parms,
uint8_t mi,
uint16_t si_rnti,
@@ -2706,20 +2854,22 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
if (CCEmap_cand == 0) {
if (do_common == 1)
-
- LOG_D(PHY,"[DCI search - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
+ LOG_D(PHY,"[DCI search nPdcch %d - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",
+ pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
else
- LOG_D(PHY,"[DCI search - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
+ LOG_D(PHY,"[DCI search nPdcch %d - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x) format %d\n",
+ pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask,format_c);
- dci_decoding(sizeof_bits,
+ dci_decoding(sizeof_bits,
L,
&pdcch_vars[eNB_id]->e_rx[CCEind*72],
- &dci_decoded_output[subframe&0x1][0]);
+ &dci_decoded_output[current_thread_id][0]);
/*
for (i=0;i<3+(sizeof_bits>>3);i++)
printf("dci_decoded_output[%d] => %x\n",i,dci_decoded_output[i]);
*/
- crc = (crc16(&dci_decoded_output[subframe&0x1][0],sizeof_bits)>>16) ^ extract_crc(&dci_decoded_output[subframe&0x1][0],sizeof_bits);
+
+ crc = (crc16(&dci_decoded_output[current_thread_id][0],sizeof_bits)>>16) ^ extract_crc(&dci_decoded_output[current_thread_id][0],sizeof_bits);
#ifdef DEBUG_DCI_DECODING
printf("crc =>%x\n",crc);
#endif
@@ -2735,29 +2885,29 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
//printf("DCI FOUND !!! crc =>%x, sizeof_bits %d, sizeof_bytes %d \n",crc, sizeof_bits, sizeof_bytes);
if (sizeof_bytes<=4) {
- dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[subframe&0x1][0];
- dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[subframe&0x1][1];
- dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[subframe&0x1][2];
- dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[subframe&0x1][3];
+ dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[current_thread_id][0];
+ dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[current_thread_id][1];
+ dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[current_thread_id][2];
+ dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[current_thread_id][3];
#ifdef DEBUG_DCI_DECODING
- printf("DCI => %x,%x,%x,%x\n",dci_decoded_output[subframe&0x1][0],
- dci_decoded_output[subframe&0x1][1],
- dci_decoded_output[subframe&0x1][2],
- dci_decoded_output[subframe&0x1][3]);
+ printf("DCI => %x,%x,%x,%x\n",dci_decoded_output[current_thread_id][0],
+ dci_decoded_output[current_thread_id][1],
+ dci_decoded_output[current_thread_id][2],
+ dci_decoded_output[current_thread_id][3]);
#endif
} else {
- dci_alloc[*dci_cnt].dci_pdu[7] = dci_decoded_output[subframe&0x1][0];
- dci_alloc[*dci_cnt].dci_pdu[6] = dci_decoded_output[subframe&0x1][1];
- dci_alloc[*dci_cnt].dci_pdu[5] = dci_decoded_output[subframe&0x1][2];
- dci_alloc[*dci_cnt].dci_pdu[4] = dci_decoded_output[subframe&0x1][3];
- dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[subframe&0x1][4];
- dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[subframe&0x1][5];
- dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[subframe&0x1][6];
- dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[subframe&0x1][7];
+ dci_alloc[*dci_cnt].dci_pdu[7] = dci_decoded_output[current_thread_id][0];
+ dci_alloc[*dci_cnt].dci_pdu[6] = dci_decoded_output[current_thread_id][1];
+ dci_alloc[*dci_cnt].dci_pdu[5] = dci_decoded_output[current_thread_id][2];
+ dci_alloc[*dci_cnt].dci_pdu[4] = dci_decoded_output[current_thread_id][3];
+ dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[current_thread_id][4];
+ dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[current_thread_id][5];
+ dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[current_thread_id][6];
+ dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[current_thread_id][7];
#ifdef DEBUG_DCI_DECODING
printf("DCI => %x,%x,%x,%x,%x,%x,%x,%x\n",
- dci_decoded_output[subframe&0x1][0],dci_decoded_output[subframe&0x1][1],dci_decoded_output[subframe&0x1][2],dci_decoded_output[subframe&0x1][3],
- dci_decoded_output[subframe&0x1][4],dci_decoded_output[subframe&0x1][5],dci_decoded_output[subframe&0x1][6],dci_decoded_output[subframe&0x1][7]);
+ dci_decoded_output[current_thread_id][0],dci_decoded_output[current_thread_id][1],dci_decoded_output[current_thread_id][2],dci_decoded_output[current_thread_id][3],
+ dci_decoded_output[current_thread_id][4],dci_decoded_output[current_thread_id][5],dci_decoded_output[current_thread_id][6],dci_decoded_output[current_thread_id][7]);
#endif
}
@@ -2774,7 +2924,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
*dci_cnt = *dci_cnt+1;
} else if (crc==pdcch_vars[eNB_id]->crnti) {
- if ((mode&UL_DCI)&&(format_c == format0)&&((dci_decoded_output[subframe&0x1][0]&0x80)==0)) {// check if pdu is format 0 or 1A
+ if ((mode&UL_DCI)&&(format_c == format0)&&((dci_decoded_output[current_thread_id][0]&0x80)==0)) {// check if pdu is format 0 or 1A
if (*format0_found == 0) {
dci_alloc[*dci_cnt].format = format0;
*format0_found = 1;
@@ -2796,7 +2946,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
}
}
- LOG_D(PHY,"DCI decoding CRNTI [format: %d, nCCE[subframe: %d]: %d ], AggregationLevel %d \n",format_c, subframe, pdcch_vars[eNB_id]->nCCE[subframe],L2);
+ //LOG_I(PHY,"DCI decoding CRNTI [format: %d, nCCE[subframe: %d]: %d ], AggregationLevel %d \n",format_c, subframe, pdcch_vars[eNB_id]->nCCE[subframe],L2);
// memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes);
@@ -2820,19 +2970,200 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
}
#ifdef DEBUG_DCI_DECODING
- LOG_I(PHY,"[DCI search] Found DCI %d rnti %x Aggregation %d length %d format %s in CCE %d (CCEmap %x)\n",
- *dci_cnt,crc,1<crnti)
- // return;
+ return;
} // rnti match
} // CCEmap_cand == 0
+/*
+ if ( agregationLevel != 0xFF &&
+ (format_c == format0 && m==0 && si_rnti != SI_RNTI))
+ {
+ //Only valid for OAI : Save some processing time when looking for DCI format0. From the log we see the DCI only on candidate 0.
+ return;
+ }
+*/
} // candidate loop
}
+uint16_t dci_CRNTI_decoding_procedure(PHY_VARS_UE *ue,
+ DCI_ALLOC_t *dci_alloc,
+ uint8_t DCIFormat,
+ uint8_t agregationLevel,
+ int16_t eNB_id,
+ uint8_t subframe)
+{
+
+ uint8_t dci_cnt=0,old_dci_cnt=0;
+ uint32_t CCEmap0=0,CCEmap1=0,CCEmap2=0;
+ LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[subframe]];
+ LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ uint8_t mi = get_mi(&ue->frame_parms,subframe);
+ uint16_t ra_rnti=99;
+ uint8_t format0_found=0,format_c_found=0;
+ uint8_t tmode = ue->transmission_mode[eNB_id];
+ uint8_t frame_type = frame_parms->frame_type;
+ uint8_t format0_size_bits=0,format0_size_bytes=0;
+ uint8_t format1_size_bits=0,format1_size_bytes=0;
+ dci_detect_mode_t mode = dci_detect_mode_select(&ue->frame_parms,subframe);
+
+ switch (frame_parms->N_RB_DL) {
+ case 6:
+ if (frame_type == TDD) {
+ format0_size_bits = sizeof_DCI0_1_5MHz_TDD_1_6_t;
+ format0_size_bytes = sizeof(DCI0_1_5MHz_TDD_1_6_t);
+ format1_size_bits = sizeof_DCI1_1_5MHz_TDD_t;
+ format1_size_bytes = sizeof(DCI1_1_5MHz_TDD_t);
+
+ } else {
+ format0_size_bits = sizeof_DCI0_1_5MHz_FDD_t;
+ format0_size_bytes = sizeof(DCI0_1_5MHz_FDD_t);
+ format1_size_bits = sizeof_DCI1_1_5MHz_FDD_t;
+ format1_size_bytes = sizeof(DCI1_1_5MHz_FDD_t);
+ }
+
+ break;
+
+ case 25:
+ default:
+ if (frame_type == TDD) {
+ format0_size_bits = sizeof_DCI0_5MHz_TDD_1_6_t;
+ format0_size_bytes = sizeof(DCI0_5MHz_TDD_1_6_t);
+ format1_size_bits = sizeof_DCI1_5MHz_TDD_t;
+ format1_size_bytes = sizeof(DCI1_5MHz_TDD_t);
+ } else {
+ format0_size_bits = sizeof_DCI0_5MHz_FDD_t;
+ format0_size_bytes = sizeof(DCI0_5MHz_FDD_t);
+ format1_size_bits = sizeof_DCI1_5MHz_FDD_t;
+ format1_size_bytes = sizeof(DCI1_5MHz_FDD_t);
+ }
+
+ break;
+
+ case 50:
+ if (frame_type == TDD) {
+ format0_size_bits = sizeof_DCI0_10MHz_TDD_1_6_t;
+ format0_size_bytes = sizeof(DCI0_10MHz_TDD_1_6_t);
+ format1_size_bits = sizeof_DCI1_10MHz_TDD_t;
+ format1_size_bytes = sizeof(DCI1_10MHz_TDD_t);
+
+ } else {
+ format0_size_bits = sizeof_DCI0_10MHz_FDD_t;
+ format0_size_bytes = sizeof(DCI0_10MHz_FDD_t);
+ format1_size_bits = sizeof_DCI1_10MHz_FDD_t;
+ format1_size_bytes = sizeof(DCI1_10MHz_FDD_t);
+ }
+
+ break;
+
+ case 100:
+ if (frame_type == TDD) {
+ format0_size_bits = sizeof_DCI0_20MHz_TDD_1_6_t;
+ format0_size_bytes = sizeof(DCI0_20MHz_TDD_1_6_t);
+ format1_size_bits = sizeof_DCI1_20MHz_TDD_t;
+ format1_size_bytes = sizeof(DCI1_20MHz_TDD_t);
+ } else {
+ format0_size_bits = sizeof_DCI0_20MHz_FDD_t;
+ format0_size_bytes = sizeof(DCI0_20MHz_FDD_t);
+ format1_size_bits = sizeof_DCI1_20MHz_FDD_t;
+ format1_size_bytes = sizeof(DCI1_20MHz_FDD_t);
+ }
+
+ break;
+ }
+
+ if (ue->prach_resources[eNB_id])
+ ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI;
+
+ // Now check UE_SPEC format0/1A ue_spec search spaces at aggregation 8
+ dci_decoding_procedure0(pdcch_vars,0,mode,
+ subframe,
+ dci_alloc,
+ eNB_id,
+ ue->current_thread_id[subframe],
+ frame_parms,
+ mi,
+ ((ue->decode_SIB == 1) ? SI_RNTI : 0),
+ ra_rnti,
+ P_RNTI,
+ agregationLevel,
+ format1A,
+ format1A,
+ format1A,
+ format0,
+ format0_size_bits,
+ format0_size_bytes,
+ &dci_cnt,
+ &format0_found,
+ &format_c_found,
+ &CCEmap0,
+ &CCEmap1,
+ &CCEmap2);
+
+ if ((CCEmap0==0xffff)||
+ ((format0_found==1)&&(format_c_found==1)))
+ return(dci_cnt);
+
+ if (DCIFormat == 1)
+ {
+ if ((tmode < 3) || (tmode == 7)) {
+ //printf("Crnti decoding frame param agregation %d DCI %d \n",agregationLevel,DCIFormat);
+
+ // Now check UE_SPEC format 1 search spaces at aggregation 1
+
+ //printf("[DCI search] Format 1/1A aggregation 1\n");
+
+ old_dci_cnt=dci_cnt;
+ dci_decoding_procedure0(pdcch_vars,0,mode,subframe,
+ dci_alloc,
+ eNB_id,
+ ue->current_thread_id[subframe],
+ frame_parms,
+ mi,
+ ((ue->decode_SIB == 1) ? SI_RNTI : 0),
+ ra_rnti,
+ P_RNTI,
+ 0,
+ format1A,
+ format1A,
+ format1A,
+ format1,
+ format1_size_bits,
+ format1_size_bytes,
+ &dci_cnt,
+ &format0_found,
+ &format_c_found,
+ &CCEmap0,
+ &CCEmap1,
+ &CCEmap2);
+
+ if ((CCEmap0==0xffff) ||
+ (format_c_found==1))
+ return(dci_cnt);
+
+ if (dci_cnt>old_dci_cnt)
+ return(dci_cnt);
+
+ //printf("Crnti 1 decoding frame param agregation %d DCI %d \n",agregationLevel,DCIFormat);
+
+ }
+ else
+ {
+ AssertFatal(0,"Other Transmission mode not yet coded\n");
+ }
+ }
+ else
+ {
+ AssertFatal(0,"DCI format %d not yet implemented \n",DCIFormat);
+ }
+
+ return(dci_cnt);
+
+}
+
uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
DCI_ALLOC_t *dci_alloc,
int do_common,
@@ -2842,7 +3173,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
uint8_t dci_cnt=0,old_dci_cnt=0;
uint32_t CCEmap0=0,CCEmap1=0,CCEmap2=0;
- LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars[subframe & 0x1];
+ LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[subframe]];
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
uint8_t mi = get_mi(&ue->frame_parms,subframe);
uint16_t ra_rnti=99;
@@ -3061,6 +3392,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
dci_decoding_procedure0(pdcch_vars,1,mode,subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0) ,
@@ -3089,6 +3421,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
dci_decoding_procedure0(pdcch_vars,1,mode,subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3121,6 +3454,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
dci_decoding_procedure0(pdcch_vars,1,mode,subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3149,6 +3483,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
dci_decoding_procedure0(pdcch_vars,1,mode,subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3183,6 +3518,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3206,12 +3542,16 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
((format0_found==1)&&(format_c_found==1)))
return(dci_cnt);
- // printf("[DCI search] Format 0 aggregation 4\n");
+ //printf("[DCI search] Format 0 aggregation 1 dci_cnt %d\n",dci_cnt);
+
+ if (dci_cnt == 0)
+ {
// Now check UE_SPEC format 0 search spaces at aggregation 4
dci_decoding_procedure0(pdcch_vars,0,mode,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3235,16 +3575,18 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
((format0_found==1)&&(format_c_found==1)))
return(dci_cnt);
- if ((CCEmap0==0xffff)||
- ((format0_found==1)&&(format_c_found==1)))
- return(dci_cnt);
- // printf("[DCI search] Format 0 aggregation 2\n");
+ //printf("[DCI search] Format 0 aggregation 2 dci_cnt %d\n",dci_cnt);
+ }
+
+ if (dci_cnt == 0)
+ {
// Now check UE_SPEC format 0 search spaces at aggregation 2
dci_decoding_procedure0(pdcch_vars,0,mode,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3268,12 +3610,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
((format0_found==1)&&(format_c_found==1)))
return(dci_cnt);
- // printf("[DCI search] Format 0 aggregation 4\n");
+ //printf("[DCI search] Format 0 aggregation 4 dci_cnt %d\n",dci_cnt);
+ }
+
+ if (dci_cnt == 0)
+ {
// Now check UE_SPEC format 0 search spaces at aggregation 1
dci_decoding_procedure0(pdcch_vars,0,mode,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3297,9 +3644,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
((format0_found==1)&&(format_c_found==1)))
return(dci_cnt);
+ //printf("[DCI search] Format 0 aggregation 8 dci_cnt %d\n",dci_cnt);
-
-
+ }
// These are for CRNTI based on transmission mode
if ((tmode < 3) || (tmode == 7)) {
// Now check UE_SPEC format 1 search spaces at aggregation 1
@@ -3307,6 +3654,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
dci_decoding_procedure0(pdcch_vars,0,mode,subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3325,6 +3673,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
&CCEmap0,
&CCEmap1,
&CCEmap2);
+ //printf("[DCI search] Format 1 aggregation 1 dci_cnt %d\n",dci_cnt);
if ((CCEmap0==0xffff) ||
(format_c_found==1))
@@ -3338,6 +3687,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
dci_decoding_procedure0(pdcch_vars,0,mode,subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3356,7 +3706,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
&CCEmap0,
&CCEmap1,
&CCEmap2);
-
+ //printf("[DCI search] Format 1 aggregation 2 dci_cnt %d\n",dci_cnt);
if ((CCEmap0==0xffff)||
(format_c_found==1))
@@ -3370,6 +3720,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
dci_decoding_procedure0(pdcch_vars,0,mode,subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3388,6 +3739,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
&CCEmap0,
&CCEmap1,
&CCEmap2);
+ //printf("[DCI search] Format 1 aggregation 4 dci_cnt %d\n",dci_cnt);
if ((CCEmap0==0xffff)||
((format0_found==1)&&(format_c_found==1)))
@@ -3402,6 +3754,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
dci_decoding_procedure0(pdcch_vars,0,mode,subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3420,6 +3773,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
&CCEmap0,
&CCEmap1,
&CCEmap2);
+ //printf("[DCI search] Format 1 aggregation 8 dci_cnt %d\n",dci_cnt);
if ((CCEmap0==0xffff)||
((format0_found==1)&&(format_c_found==1)))
@@ -3439,6 +3793,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3474,6 +3829,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3508,6 +3864,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3543,6 +3900,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3577,6 +3935,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3609,6 +3968,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3641,6 +4001,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3674,6 +4035,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3704,6 +4066,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3737,6 +4100,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3769,6 +4133,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
@@ -3803,6 +4168,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
subframe,
dci_alloc,
eNB_id,
+ ue->current_thread_id[subframe],
frame_parms,
mi,
((ue->decode_SIB == 1) ? SI_RNTI : 0),
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 2a43455e25..01d6381425 100755
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -857,19 +857,18 @@ uint8_t get_transmission_mode(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti)
}
*/
-int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu) {
+void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu) {
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
nfapi_dl_config_dci_dl_pdu_rel8_t *rel8 = &pdu->dci_dl_pdu_rel8;
- int harq_pid;
+
LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
int beamforming_mode = 0;
int UE_id=-1;
int subframe = proc->subframe_tx;
- int RIV_max;
int NPRB;
int TB0_active;
int TB1_active;
@@ -882,7 +881,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
dci_alloc->harq_pid = rel8->harq_process;
dci_alloc->ra_flag = 0;
- LOG_D(PHY,"NFAPI: DCI format %d, nCCE %d, L %d, rnti %x,harq_pid %d\n",
+ LOG_I(PHY,"NFAPI: DCI format %d, nCCE %d, L %d, rnti %x,harq_pid %d\n",
rel8->dci_format,rel8->cce_idx,rel8->aggregation_level,rel8->rnti,rel8->harq_process);
if ((rel8->rnti_type == 2 ) && (rel8->rnti != SI_RNTI) && (rel8->rnti != P_RNTI)) dci_alloc->ra_flag = 1;
@@ -891,19 +890,34 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
AssertFatal(UE_id= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
dlsch0 = eNB->dlsch[UE_id][0];
dlsch1 = eNB->dlsch[UE_id][1];
-
+
+
beamforming_mode = eNB->transmission_mode[(uint8_t)UE_id]<7?0:eNB->transmission_mode[(uint8_t)UE_id];
dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
dlsch0_harq->codeword = 0;
dlsch1_harq = dlsch1->harq_processes[rel8->harq_process];
dlsch1_harq->codeword = 1;
- dlsch0->subframe_tx[subframe] = 1;
+ dlsch0->subframe_tx[subframe] = 1;
+ if ((dlsch0->harq_mask & (1<harq_process)) > 0 ) {
+ if (rel8->new_data_indicator_1 != dlsch0_harq->ndi)
+ dlsch0_harq->round=0;
+ }
+ else { // process is inactive, so activate and set round to 0
+ dlsch0->harq_mask |= (1<harq_process);
+ dlsch0_harq->round=0;
+ }
+ dlsch0_harq->ndi = rel8->new_data_indicator_1;
+
+ LOG_I(PHY,"NFAPI: harq_pid %d harq_mask %x, round %d ndi (%d,%d) \n",rel8->harq_process,dlsch0->harq_mask,dlsch0_harq->round,
+ dlsch0_harq->ndi,rel8->new_data_indicator_1);
switch (rel8->dci_format) {
case NFAPI_DL_DCI_FORMAT_1A:
dci_alloc->format = format1A;
- dlsch0->active = 1;
+ dlsch0->active = 1;
+ if (rel8->rnti == SI_RNTI)
+ dlsch0_harq->round = 0;
switch (fp->N_RB_DL) {
case 6:
@@ -936,7 +950,6 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rel8->resource_block_coding];
dlsch0_harq->vrb_type = rel8->virtual_resource_block_assignment_flag;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rel8->resource_block_coding];//NPRB;
- RIV_max = RIV_max6;
break;
case 25:
if (fp->frame_type == TDD) {
@@ -967,7 +980,6 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rel8->resource_block_coding];
dlsch0_harq->vrb_type = rel8->virtual_resource_block_assignment_flag;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rel8->resource_block_coding];//NPRB;
- RIV_max = RIV_max25;
break;
case 50:
if (fp->frame_type == TDD) {
@@ -999,7 +1011,6 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rel8->resource_block_coding];
dlsch0_harq->vrb_type = rel8->virtual_resource_block_assignment_flag;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rel8->resource_block_coding];//NPRB;
- RIV_max = RIV_max50;
break;
case 100:
if (fp->frame_type == TDD) {
@@ -1033,7 +1044,6 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rel8->resource_block_coding];
dlsch0_harq->vrb_type = rel8->virtual_resource_block_assignment_flag;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rel8->resource_block_coding];//NPRB;
- RIV_max = RIV_max100;
break;
}
@@ -1073,6 +1083,8 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
dci_alloc->format = format1;
dlsch0->active = 1;
+ LOG_D(PHY,"Frame %d, Subframe %d: Programming DLSCH for Format 1 DCI, harq_pid %d\n",proc->frame_tx,subframe,rel8->harq_process);
+
switch (fp->N_RB_DL) {
case 6:
if (fp->frame_type == TDD) {
@@ -1170,10 +1182,8 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
break;
}
- if (rel8->harq_process>=8) {
- LOG_E(PHY,"ERROR: Format 1: harq_pid=%d >= 8\n", rel8->harq_process);
- return(-1);
- }
+ AssertFatal(rel8->harq_process<8,"Format 1: harq_pid=%d >= 8\n", rel8->harq_process);
+
dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
dlsch0_harq->codeword=0;
@@ -1193,9 +1203,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
NPRB = dlsch0_harq->nb_rb;
- if (NPRB==0)
- return(-1);
-
+ AssertFatal(NPRB>0,"NPRB == 0\n");
dlsch0_harq->rvidx = rel8->redundancy_version_1;
@@ -1216,6 +1224,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
if (dlsch0_harq->round == 0) {
dlsch0_harq->status = ACTIVE;
+
// printf("Setting DLSCH process %d to ACTIVE\n",rel8->harq_process);
// MCS and TBS don't change across HARQ rounds
dlsch0_harq->mcs = rel8->mcs_1;
@@ -1224,6 +1233,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
}
+ LOG_D(PHY,"DCI: Set harq_ids[%d] to %d (%p)\n",subframe,rel8->harq_process,dlsch0);
dlsch0->harq_ids[subframe] = rel8->harq_process;
@@ -1364,14 +1374,13 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
break;
}
- if (rel8->harq_process>=8) {
- LOG_E(PHY,"ERROR: Format 2_2A: harq_pid=%d >= 8\n", rel8->harq_process);
- return(-1);
- }
+
+ AssertFatal(rel8->harq_process<8,"Format 2_2A: harq_pid=%d >= 8\n", rel8->harq_process);
// Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
// note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
+
// This must be set as in TM4, does not work properly now.
if (rel8->transport_block_to_codeword_swap_flag == 1) {
dlsch0 = eNB->dlsch[UE_id][1];
@@ -1399,8 +1408,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
fp->N_RB_DL);
dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
- if (dlsch0_harq->nb_rb == 0)
- return(-1);
+ AssertFatal(dlsch0_harq->nb_rb > 0,"nb_rb=0\n");
dlsch0_harq->mcs = rel8->mcs_1;
dlsch1_harq->mcs = rel8->mcs_2;
@@ -1414,15 +1422,18 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
dlsch1_harq->Nl = 1;
dlsch0->active = 1;
dlsch1->active = 1;
-
+ dlsch0->harq_mask |= (1<harq_process);
+ dlsch1->harq_mask |= (1<harq_process);
// check if either TB is disabled (see 36-213 V11.3 Section )
if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
dlsch0->active = 0;
+ dlsch0->harq_mask &= ~(1<harq_process);
}
if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
dlsch1->active = 0;
+ dlsch1->harq_mask &= ~(1<harq_process);
}
// dlsch0_harq->dl_power_off = 0;
@@ -1681,10 +1692,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
}
- if (rel8->harq_process>=8) {
- LOG_E(PHY,"ERROR: Format 2_2A: harq_pid=%d >= 8\n", rel8->harq_process);
- return(-1);
- }
+ AssertFatal(rel8->harq_process>=8, "Format 2_2A: harq_pid=%d >= 8\n", rel8->harq_process);
// Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
@@ -1704,6 +1712,8 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
if (TB0_active && TB1_active && rel8->transport_block_to_codeword_swap_flag==0) {
dlsch0->active = 1;
dlsch1->active = 1;
+ dlsch0->harq_mask |= (1<harq_process);
+ dlsch1->harq_mask |= (1<harq_process);
dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
dlsch1_harq = dlsch1->harq_processes[rel8->harq_process];
dlsch0_harq->mcs = rel8->mcs_1;
@@ -1725,7 +1735,10 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
dlsch1 = eNB->dlsch[UE_id][0];
dlsch0->active = 1;
dlsch1->active = 1;
- dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
+
+ dlsch0->harq_mask |= (1<harq_process);
+ dlsch1->harq_mask |= (1<harq_process);
+
dlsch1_harq = dlsch1->harq_processes[rel8->harq_process];
dlsch0_harq->mcs = rel8->mcs_1;
dlsch1_harq->mcs = rel8->mcs_2;
@@ -1740,6 +1753,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
}
else if (TB0_active && (TB1_active==0)) {
dlsch0->active = 1;
+ dlsch0->harq_mask |= (1<harq_process);
dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
dlsch0_harq->mcs = rel8->mcs_1;
dlsch0_harq->Qm = get_Qm(rel8->mcs_1);
@@ -1754,6 +1768,7 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
}
else if ((TB0_active==0) && TB1_active) {
dlsch1->active = 1;
+ dlsch1->harq_mask |= (1<harq_process);
dlsch1_harq = dlsch1->harq_processes[rel8->harq_process];
dlsch1_harq->mcs = rel8->mcs_2;
dlsch1_harq->Qm = get_Qm(rel8->mcs_2);
@@ -1800,10 +1815,6 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
}
- /*if (dlsch0_harq->nb_rb == 0)
- return(-1);*/
-
-
// assume both TBs are active
if (dlsch0_harq != NULL)
dlsch0_harq->Nl = 1;
@@ -1968,28 +1979,23 @@ int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_
#endif
- // compute DL power control parameters
+#if T_TRACER
+ if (dlsch0->active)
+ T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(proc->frame_tx), T_INT(proc->subframe_tx),
+ T_INT(rel8->rnti), T_INT(rel8->dci_format), T_INT(rel8->harq_process),
+ T_INT(rel8->mcs_1), T_INT(dlsch0_harq->TBS));
+#endif
- if (dlsch0 != NULL){
- computeRhoA_eNB(&eNB->pdsch_config_dedicated[UE_id], dlsch0,dlsch0_harq->dl_power_off, fp->nb_antenna_ports_eNB);
- computeRhoB_eNB(&eNB->pdsch_config_dedicated[UE_id],&(fp->pdsch_config_common),fp->nb_antenna_ports_eNB,dlsch0,dlsch0_harq->dl_power_off);
- }
- if (dlsch1 != NULL){
- computeRhoA_eNB(&eNB->pdsch_config_dedicated[UE_id], dlsch1,dlsch1_harq->dl_power_off, fp->nb_antenna_ports_eNB);
- computeRhoB_eNB(&eNB->pdsch_config_dedicated[UE_id],&(fp->pdsch_config_common),fp->nb_antenna_ports_eNB,dlsch1,dlsch1_harq->dl_power_off);
- }
-
-
}
-int fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu) {
+void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu) {
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
nfapi_dl_config_mpdcch_pdu_rel13_t *rel13 = &pdu->mpdcch_pdu_rel13;
- int harq_pid;
- LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
+
+ LTE_eNB_DLSCH_t *dlsch0=NULL;
LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL;
int UE_id;
int subframe = proc->subframe_tx;
@@ -2196,7 +2202,7 @@ int fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dc
dlsch0_harq->dl_power_off = 1;
dlsch0->active = 1;
-
+ dlsch0->harq_mask |= (1<harq_process);
if (dlsch0_harq->round == 0) {
@@ -2222,1943 +2228,263 @@ int fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dc
}
-int fill_dci_and_ulsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_hi_dci0_dci_pdu *pdu) {
-
- exit(-1);
-}
-
-int generate_eNB_dlsch_params_from_dci(int frame,
- uint8_t subframe,
- void *dci_pdu,
- uint16_t rnti,
- DCI_format_t dci_format,
- LTE_eNB_DLSCH_t **dlsch,
- LTE_DL_FRAME_PARMS *fp,
- PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
- uint16_t si_rnti,
- uint16_t ra_rnti,
- uint16_t p_rnti,
- uint16_t DL_pmi_single,
- uint8_t beamforming_mode)
+void fill_dci0(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,
+ nfapi_hi_dci0_dci_pdu *pdu)
{
-
- uint8_t harq_pid = UINT8_MAX;
- uint32_t rballoc = UINT32_MAX;
- uint32_t RIV_max = 0;
- uint8_t NPRB,tbswap,tpmi=0;
- LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
- uint8_t frame_type=fp->frame_type;
- uint8_t vrb_type=0;
- uint8_t mcs=0,mcs1=0,mcs2=0;
- uint8_t I_mcs = 0;
- uint8_t rv=0,rv1=0,rv2=0;
- uint8_t rah=0;
- uint8_t TPC=0;
- uint8_t TB0_active=0,TB1_active=0;
- LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
-
- // printf("Generate eNB DCI, format %d, rnti %x (pdu %p)\n",dci_format,rnti,dci_pdu);
-
- switch (dci_format) {
-
- case format0:
- return(-1);
- break;
-
- case format1A: // This is DLSCH allocation for control traffic
-
-
-
- dlsch[0]->subframe_tx[subframe] = 1;
-
-
- switch (fp->N_RB_DL) {
- case 6:
- if (frame_type == TDD) {
- vrb_type = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type;
- mcs = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
- rballoc = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- rv = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv;
- TPC = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
- harq_pid = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid;
-
- // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
- } else {
- vrb_type = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type;
- mcs = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs;
- rballoc = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc;
- rv = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv;
- TPC = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC;
- harq_pid = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid;
-
- // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
- }
-
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
- dlsch0_harq->codeword=0;
-
- AssertFatal(vrb_type==LOCALIZED,"Distributed RB allocation not done yet\n");
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
- dlsch0_harq->vrb_type = vrb_type;
- dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB;
- RIV_max = RIV_max6;
-
-
- break;
-
- case 25:
- if (frame_type == TDD) {
- vrb_type = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type;
- mcs = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
- rballoc = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- rv = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv;
- TPC = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
- harq_pid = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid;
-
- // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
- } else {
- vrb_type = ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type;
- mcs = ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs;
- rballoc = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc;
- rv = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv;
- TPC = ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC;
- harq_pid = ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid;
-
- // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
- }
-
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
-
-
- AssertFatal(vrb_type==LOCALIZED,"Distributed RB allocation not done yet\n");
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc];
- dlsch0_harq->vrb_type = vrb_type;
- dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB;
- RIV_max = RIV_max25;
- break;
-
- case 50:
- if (frame_type == TDD) {
- vrb_type = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type;
- mcs = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs;
- rballoc = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- rv = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv;
- TPC = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC;
- harq_pid = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid;
-
- // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
- } else {
- vrb_type = ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type;
- mcs = ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs;
- rballoc = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc;
- rv = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv;
- TPC = ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC;
- harq_pid = ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid;
- //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC);
- }
-
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
- AssertFatal(vrb_type==LOCALIZED,"Distributed RB allocation not done yet\n");
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc];
- dlsch0_harq->vrb_type = vrb_type;
- dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB;
- RIV_max = RIV_max50;
- break;
-
- case 100:
- if (frame_type == TDD) {
- vrb_type = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type;
- mcs = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs;
- rballoc = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- rv = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv;
- TPC = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC;
- harq_pid = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid;
- // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
- } else {
- vrb_type = ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type;
- mcs = ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs;
- rballoc = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc;
- rv = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv;
- TPC = ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC;
- harq_pid = ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid;
- // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
- }
-
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
-
- dlsch0_harq->vrb_type = vrb_type;
- AssertFatal(vrb_type==LOCALIZED,"Distributed RB allocation not done yet\n");
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
- dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
- dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
- dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB;
- RIV_max = RIV_max100;
- break;
-
- default:
- LOG_E(PHY,"Invalid N_RB_D %dL\n", fp->N_RB_DL);
- DevParam (fp->N_RB_DL, 0, 0);
- break;
- }
-
- // harq_pid field is reserved
- if ((rnti==si_rnti) || (rnti==ra_rnti) || (rnti==p_rnti)) { //
- harq_pid=0;
-
- } else {
- if (harq_pid>=8) {
- LOG_E(PHY,"ERROR: Format 1A: harq_pid=%d >= 8\n", harq_pid);
- return(-1);
- }
-
- if (rballoc>RIV_max) {
- LOG_E(PHY,"ERROR: Format 1A: rb_alloc (%x) > RIV_max (%x)\n",rballoc,RIV_max);
- return(-1);
- }
-
- NPRB = dlsch0_harq->nb_rb;
- I_mcs = get_I_TBS(mcs);
- }
-
- if (NPRB==0)
- return(-1);
-
- //printf("NPRB %d, nb_rb %d, ndi %d\n",NPRB,dlsch0_harq->nb_rb,ndi);
- dlsch0_harq->rvidx = rv;
-
- dlsch0_harq->Nl = 1;
- //dlsch0_harq->layer_index = 0;
-
- dlsch0_harq->mimo_mode = (fp->nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
- /*
- if ((rnti!=si_rnti)&&(rnti!=ra_rnti)&&(rnti!=p_rnti)) { //handle toggling for C-RNTI
- if (dlsch0_harq->first_tx == 1) {
- LOG_D(PHY,"First TX for TC-RNTI %x, clearing first_tx flag\n",rnti);
- dlsch0_harq->first_tx=0;
- dlsch0_harq->Ndi = 1;
- }
- else {
- if (ndi == dlsch0_harq->DCINdi)
- dlsch0_harq->Ndi = 0;
- else
- dlsch0_harq->Ndi = 1;
- }
-
- dlsch0_harq->DCINdi=ndi;
- }
- else {
- dlsch0_harq->Ndi = 1;
- }
- */
- dlsch0_harq->dl_power_off = 1;
-
-
-
- dlsch0_harq->mcs = mcs;
- dlsch0_harq->TBS = TBStable[I_mcs][NPRB-1];
-
- dlsch[0]->harq_ids[subframe] = harq_pid;
-
- dlsch[0]->active = 1;
- dlsch0 = dlsch[0];
-
- dlsch[0]->rnti = rnti;
-
- dlsch[0]->harq_ids[subframe] = harq_pid;
-
- if (dlsch0_harq->round == 0)
- dlsch0_harq->status = ACTIVE;
-
- break;
-
- case format1:
-
- switch (fp->N_RB_DL) {
-
- case 6:
- if (frame_type == TDD) {
- mcs = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->mcs;
- rballoc = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rah;
- rv = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rv;
- harq_pid = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->mcs;
- rah = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rah;
- rballoc = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rballoc;
- rv = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rv;
- harq_pid = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 25:
-
- if (frame_type == TDD) {
- mcs = ((DCI1_5MHz_TDD_t *)dci_pdu)->mcs;
- rballoc = ((DCI1_5MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI1_5MHz_TDD_t *)dci_pdu)->rah;
- rv = ((DCI1_5MHz_TDD_t *)dci_pdu)->rv;
- harq_pid = ((DCI1_5MHz_TDD_t *)dci_pdu)->harq_pid;
- LOG_D(PHY,"eNB: subframe %d UE %x, Format1 DCI: ndi %d, harq_pid %d\n",subframe,rnti,((DCI1_5MHz_TDD_t *)dci_pdu)->ndi,harq_pid);
- } else {
- mcs = ((DCI1_5MHz_FDD_t *)dci_pdu)->mcs;
- rah = ((DCI1_5MHz_FDD_t *)dci_pdu)->rah;
- rballoc = ((DCI1_5MHz_FDD_t *)dci_pdu)->rballoc;
- rv = ((DCI1_5MHz_FDD_t *)dci_pdu)->rv;
- harq_pid = ((DCI1_5MHz_FDD_t *)dci_pdu)->harq_pid;
- LOG_D(PHY,"eNB: subframe %d UE %x, Format1 DCI: ndi %d, harq_pid %d\n",subframe,rnti,((DCI1_5MHz_FDD_t *)dci_pdu)->ndi,harq_pid);
-
- }
-
- break;
-
- case 50:
- if (frame_type == TDD) {
- mcs = ((DCI1_10MHz_TDD_t *)dci_pdu)->mcs;
- rballoc = ((DCI1_10MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI1_10MHz_TDD_t *)dci_pdu)->rah;
- rv = ((DCI1_10MHz_TDD_t *)dci_pdu)->rv;
- harq_pid = ((DCI1_10MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs = ((DCI1_10MHz_FDD_t *)dci_pdu)->mcs;
- rah = ((DCI1_10MHz_FDD_t *)dci_pdu)->rah;
- rballoc = ((DCI1_10MHz_FDD_t *)dci_pdu)->rballoc;
- rv = ((DCI1_10MHz_FDD_t *)dci_pdu)->rv;
- harq_pid = ((DCI1_10MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 100:
- if (frame_type == TDD) {
- mcs = ((DCI1_20MHz_TDD_t *)dci_pdu)->mcs;
- rballoc = ((DCI1_20MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI1_20MHz_TDD_t *)dci_pdu)->rah;
- rv = ((DCI1_20MHz_TDD_t *)dci_pdu)->rv;
- harq_pid = ((DCI1_20MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs = ((DCI1_20MHz_FDD_t *)dci_pdu)->mcs;
- rah = ((DCI1_20MHz_FDD_t *)dci_pdu)->rah;
- rballoc = ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc;
- rv = ((DCI1_20MHz_FDD_t *)dci_pdu)->rv;
- harq_pid = ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- }
-
- if (harq_pid>=8) {
- LOG_E(PHY,"ERROR: Format 1: harq_pid=%d >= 8\n", harq_pid);
- return(-1);
- }
-
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
- dlsch0_harq->codeword=0;
-
- // printf("DCI: Setting subframe_tx for subframe %d\n",subframe);
- dlsch[0]->subframe_tx[subframe] = 1;
-
- conv_rballoc(rah,
- rballoc,fp->N_RB_DL,
- dlsch0_harq->rb_alloc);
-
- dlsch0_harq->nb_rb = conv_nprb(rah,
- rballoc,
- fp->N_RB_DL);
-
- NPRB = dlsch0_harq->nb_rb;
-
-
- if (NPRB==0)
- return(-1);
-
-
- dlsch0_harq->rvidx = rv;
-
- dlsch0_harq->Nl = 1;
- // dlsch[0]->layer_index = 0;
- if (beamforming_mode == 0)
- dlsch0_harq->mimo_mode = (fp->nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
- else if (beamforming_mode == 7)
- dlsch0_harq->mimo_mode = TM7;
- else
- LOG_E(PHY,"Invalid beamforming mode %dL\n", beamforming_mode);
-
- dlsch0_harq->dl_power_off = 1;
- /*
- if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) {
- LOG_D(PHY,"First TX for C-RNTI %x, clearing first_tx flag, shouldn't happen!\n",rnti);
- dlsch[0]->harq_processes[harq_pid]->first_tx=0;
- dlsch[0]->harq_processes[harq_pid]->Ndi = 1;
- }
- else {
- LOG_D(PHY,"Checking for Toggled Ndi for C-RNTI %x, old value %d, DCINdi %d\n",rnti,dlsch[0]->harq_processes[harq_pid]->DCINdi,ndi);
- if (ndi == dlsch[0]->harq_processes[harq_pid]->DCINdi)
- dlsch[0]->harq_processes[harq_pid]->Ndi = 0;
- else
- dlsch[0]->harq_processes[harq_pid]->Ndi = 1;
- }
- dlsch[0]->harq_processes[harq_pid]->DCINdi=ndi;
- */
-
- dlsch[0]->active = 1;
-
-
-
- if (dlsch0_harq->round == 0) {
- dlsch0_harq->status = ACTIVE;
- // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
- // MCS and TBS don't change across HARQ rounds
- dlsch0_harq->mcs = mcs;
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][NPRB-1];
-
- }
-
- dlsch[0]->harq_ids[subframe] = harq_pid;
-
-
-
- dlsch0 = dlsch[0];
-
- dlsch[0]->rnti = rnti;
-
-
- break;
-
- case format2: // DL Scheduling assignment for MIMO including closed loop spatial multiplexing
-
- switch (fp->N_RB_DL) {
-
- case 6:
- if (fp->nb_antenna_ports_eNB == 2) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
- }
- } else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,fp->nb_antenna_ports_eNB);
- }
-
- break;
-
- case 25:
- if (fp->nb_antenna_ports_eNB == 2) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
- }
- } else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,fp->nb_antenna_ports_eNB);
- }
-
- break;
-
- case 50:
- if (fp->nb_antenna_ports_eNB == 2) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
- }
- } else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,fp->nb_antenna_ports_eNB);
- }
-
- break;
-
- case 100:
- if (fp->nb_antenna_ports_eNB == 2) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
- }
- } else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,fp->nb_antenna_ports_eNB);
- }
-
- break;
- }
-
-
- if (harq_pid>=8) {
- LOG_E(PHY,"ERROR: Format 2_2A: harq_pid=%d >= 8\n", harq_pid);
- return(-1);
- }
-
-
- // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
- // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
- TB0_active = 1;
- TB1_active = 1;
-
- if ((rv1 == 1) && (mcs1 == 0)) {
- TB0_active=0;
- }
- if ((rv2 == 1) && (mcs2 == 0)) {
- TB1_active=0;
- }
-#ifdef DEBUG_HARQ
- printf("RV0 = %d, RV1 = %d. MCS0 = %d, MCS1=%d\n", rv1, rv2, mcs1, mcs2);
+ uint8_t UE_id;
+
+ AssertFatal((UE_id=find_ulsch(pdu->dci_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No existing UE ULSCH for rnti %x\n",pdu->dci_pdu_rel8.rnti);
+
+ LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
+
+ uint32_t cqi_req = pdu->dci_pdu_rel8.cqi_csi_request;
+ uint32_t dai = pdu->dci_pdu_rel8.dl_assignment_index;
+ uint32_t cshift = pdu->dci_pdu_rel8.cyclic_shift_2_for_drms;
+ uint32_t TPC = pdu->dci_pdu_rel8.tpc;
+ uint32_t mcs = pdu->dci_pdu_rel8.mcs_1;
+ uint32_t hopping = pdu->dci_pdu_rel8.frequency_hopping_enabled_flag;
+ uint32_t rballoc = computeRIV(frame_parms->N_RB_DL,
+ pdu->dci_pdu_rel8.resource_block_start,
+ pdu->dci_pdu_rel8.number_of_resource_block);
+
+ uint32_t ndi = pdu->dci_pdu_rel8.new_data_indication_1;
+
+#ifdef T_TRACER
+ T(T_ENB_PHY_ULSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(proc->subframe_tx),
+ T_INT(pdu->dci_pdu_rel8.rnti), T_INT(((proc->frame_tx*10+proc->subframe_tx+4) % 8) /* TODO: correct harq pid */),
+ T_INT(mcs), T_INT(-1 /* TODO: remove round? */),
+ T_INT(pdu->dci_pdu_rel8.resource_block_start),
+ T_INT(pdu->dci_pdu_rel8.number_of_resource_block),
+ T_INT(-1 /* TODO: get TBS */),
+ T_INT(pdu->dci_pdu_rel8.aggregation_level),
+ T_INT(pdu->dci_pdu_rel8.cce_index));
#endif
- if (TB0_active && TB1_active && tbswap==0) {
- dlsch0=dlsch[0];
- dlsch1=dlsch[1];
- dlsch0->active = 1;
- dlsch1->active = 1;
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
- dlsch0_harq->mcs = mcs1;
- dlsch1_harq->mcs = mcs2;
- dlsch0_harq->rvidx = rv1;
- dlsch1_harq->rvidx = rv2;
- dlsch0_harq->status = ACTIVE;
- dlsch1_harq->status = ACTIVE;
- dlsch0_harq->codeword=0;
- dlsch1_harq->codeword=1;
-#ifdef DEBUG_HARQ
- printf("\n ENB: BOTH ACTIVE\n");
-#endif
- }
- else if (TB0_active && TB1_active && tbswap==1) {
- dlsch0=dlsch[0];
- dlsch1=dlsch[1];
- dlsch0->active = 1;
- dlsch1->active = 1;
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
- dlsch0_harq->mcs = mcs1;
- dlsch1_harq->mcs = mcs2;
- dlsch0_harq->rvidx = rv1;
- dlsch1_harq->rvidx = rv2;
- dlsch0_harq->status = ACTIVE;
- dlsch1_harq->status = ACTIVE;
- dlsch0_harq->codeword=1;
- dlsch1_harq->codeword=0;
- }
- else if (TB0_active && (TB1_active==0)) {
- dlsch0=dlsch[0];
- dlsch0->active = 1;
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch0_harq->mcs = mcs1;
- dlsch0_harq->rvidx = rv1;
- dlsch0_harq->status = ACTIVE;
- dlsch0_harq->codeword = 0;
- dlsch1=NULL;
- dlsch1_harq = NULL;
-#ifdef DEBUG_HARQ
- printf("\n ENB: TB1 is deactivated, retransmit TB0 transmit in TM6\n");
-#endif
- }
- else if ((TB0_active==0) && TB1_active) {
- dlsch1=dlsch[1];
- dlsch1->active = 1;
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
- dlsch1_harq->mcs = mcs2;
- dlsch1_harq->rvidx = rv2;
- dlsch1_harq->status = ACTIVE;
- dlsch1_harq->codeword = 0;
- dlsch0=NULL;
- dlsch0_harq = NULL;
-#ifdef DEBUG_HARQ
- printf("\n ENB: TB0 is deactivated, retransmit TB1 transmit in TM6\n");
-#endif
- }
- if (dlsch0 != NULL){
- dlsch0->subframe_tx[subframe] = 1;
+ void *dci_pdu = (void*)dci_alloc->dci_pdu;
- dlsch0->harq_ids[subframe] = harq_pid;
- }
+ LOG_I(PHY,"Filling DCI0 with cqi %d, mcs %d, hopping %d, rballoc %x (%d,%d) ndi %d TPC %d cshift %d\n",cqi_req,
+ mcs,hopping,rballoc,pdu->dci_pdu_rel8.resource_block_start,pdu->dci_pdu_rel8.number_of_resource_block,
+ ndi,TPC,cshift);
- if (dlsch1_harq != NULL){
- dlsch1->harq_ids[subframe] = harq_pid;
- }
+ dci_alloc->format = format0;
+ dci_alloc->firstCCE = pdu->dci_pdu_rel8.cce_index;
+ dci_alloc->L = pdu->dci_pdu_rel8.aggregation_level;
+ dci_alloc->rnti = pdu->dci_pdu_rel8.rnti;
+ dci_alloc->ra_flag = 0;
-
- if (dlsch0 != NULL ){
- conv_rballoc(rah,
- rballoc,
- fp->N_RB_DL,
- dlsch0_harq->rb_alloc);
-
- dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, fp->N_RB_DL);
-
- if (dlsch1 != NULL){
- dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
- dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
- }
- } else if ((dlsch0 == NULL ) && (dlsch1 != NULL )){
- conv_rballoc(rah,
- rballoc,
- fp->N_RB_DL,
- dlsch1_harq->rb_alloc);
-
- dlsch1_harq->nb_rb = conv_nprb(rah, rballoc, fp->N_RB_DL);
- }
-
-
- /*if (dlsch0_harq->nb_rb == 0)
- return(-1);*/
-
-
- // assume both TBs are active
- if (dlsch0_harq != NULL)
- dlsch0_harq->Nl = 1;
- if (dlsch1_harq != NULL)
- dlsch1_harq->Nl = 1;
-
-
- // check if either TB is disabled (see 36-213 V11.3 Section )
-
- if (fp->nb_antenna_ports_eNB == 2) {
- if ((dlsch0 != NULL) && (dlsch1 != NULL)) { //two CW active
-
- dlsch0_harq->dl_power_off = 1;
- dlsch1_harq->dl_power_off = 1;
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
- switch (tpmi) {
- case 0:
- dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1;
- dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,0,1);
- dlsch1_harq->pmi_alloc = pmi_extend(fp,0,1);
- break;
- case 1:
- dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj;
- dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,1,1);
- dlsch0_harq->pmi_alloc = pmi_extend(fp,1,1);
-
- break;
- case 2: // PUSCH precoding
- dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING;
- dlsch0_harq->pmi_alloc = DL_pmi_single;
- dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING;
- dlsch1_harq->pmi_alloc = DL_pmi_single;
- break;
- default:
- break;
- }
- } else if ((dlsch0 != NULL) && (dlsch1 == NULL)) { // only CW 0 active
- dlsch0_harq->dl_power_off = 1;
- dlsch0_harq->TBS= TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- switch (tpmi) {
- case 0 :
- dlsch0_harq->mimo_mode = ALAMOUTI;
- break;
- case 1:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING11;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,0,0);
- break;
- case 2:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,1,0);
- break;
- case 3:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,2,0);
- break;
- case 4:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,3,0);
- break;
- case 5:
- dlsch0_harq->mimo_mode = PUSCH_PRECODING0;
- dlsch0_harq->pmi_alloc = DL_pmi_single;
- break;
- case 6:
- dlsch0_harq->mimo_mode = PUSCH_PRECODING1;
- dlsch0_harq->pmi_alloc = DL_pmi_single;
- break;
- }
- } else if ((dlsch0 == NULL) && (dlsch1 != NULL)) {
- dlsch1_harq->dl_power_off = 1;
- dlsch1_harq->TBS= TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
- switch (tpmi) {
- case 0 :
- dlsch1_harq->mimo_mode = ALAMOUTI;
- break;
- case 1:
- dlsch1_harq->mimo_mode = UNIFORM_PRECODING11;
- dlsch1_harq->pmi_alloc = pmi_extend(fp,0,0);
- break;
- case 2:
- dlsch1_harq->mimo_mode = UNIFORM_PRECODING1m1;
- dlsch1_harq->pmi_alloc = pmi_extend(fp,1,0);
- break;
- case 3:
- dlsch1_harq->mimo_mode = UNIFORM_PRECODING1j;
- dlsch1_harq->pmi_alloc = pmi_extend(fp,2,0);
- break;
- case 4:
- dlsch1_harq->mimo_mode = UNIFORM_PRECODING1mj;
- dlsch1_harq->pmi_alloc = pmi_extend(fp,3,0);
- break;
- case 5:
- dlsch1_harq->mimo_mode = PUSCH_PRECODING0;
- dlsch1_harq->pmi_alloc = DL_pmi_single;
- break;
- case 6:
- dlsch1_harq->mimo_mode = PUSCH_PRECODING1;
- dlsch1_harq->pmi_alloc = DL_pmi_single;
- break;
- }
- }
-
- } else if (fp->nb_antenna_ports_eNB == 4) {
- // fill in later
- }
-
- // reset HARQ process if this is the first transmission
- /* if (dlsch0_harq->round == 0)
- dlsch0_harq->status = ACTIVE;
-
- if (dlsch1_harq->round == 0)
- dlsch1_harq->status = ACTIVE;*/
- if (dlsch0_harq != NULL)
- dlsch0->rnti = rnti;
- if (dlsch1 != NULL)
- dlsch1->rnti = rnti;
-
- break;
-
- case format2A:
-
- switch (fp->N_RB_DL) {
-
- case 6:
- if (fp->nb_antenna_ports_eNB == 2) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- } else {
- mcs1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
- }
- } else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,fp->nb_antenna_ports_eNB);
- }
-
- break;
-
- case 25:
- if (fp->nb_antenna_ports_eNB == 2) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- } else {
- mcs1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
- }
- } else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,fp->nb_antenna_ports_eNB);
- }
-
- break;
-
- case 50:
- if (fp->nb_antenna_ports_eNB == 2) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- } else {
- mcs1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
- }
- } else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,fp->nb_antenna_ports_eNB);
- }
-
- break;
-
- case 100:
- if (fp->nb_antenna_ports_eNB == 2) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- } else {
- mcs1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
- if (frame_type == TDD) {
- mcs1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
- }
- } else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,fp->nb_antenna_ports_eNB);
- }
-
- break;
- }
-
-
- if (harq_pid>=8) {
- LOG_E(PHY,"ERROR: Format 2_2A: harq_pid=%d >= 8\n", harq_pid);
- return(-1);
- }
-
-
- // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
- // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
- // This must be set as in TM4, does not work properly now.
- if (tbswap == 0) {
- dlsch0 = dlsch[0];
- dlsch1 = dlsch[1];
+ switch (frame_parms->N_RB_DL) {
+ case 6:
+ if (frame_parms->frame_type == TDD) {
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req;
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->dai = dai;
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cshift = cshift;
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC = TPC;
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs = mcs;
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi = ndi;
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc;
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping;
+ ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type = 0;
+ dci_alloc->dci_length = sizeof_DCI0_1_5MHz_TDD_1_6_t;
} else {
- dlsch0 = dlsch[1];
- dlsch1 = dlsch[0];
+ ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req = cqi_req;
+ ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cshift = cshift;
+ ((DCI0_1_5MHz_FDD_t *)dci_pdu)->TPC = TPC;
+ ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs = mcs;
+ ((DCI0_1_5MHz_FDD_t *)dci_pdu)->ndi = ndi;
+ ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc = rballoc;
+ ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping = hopping;
+ ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type = 0;
+ dci_alloc->dci_length = sizeof_DCI0_1_5MHz_FDD_t;
}
-
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
-
- dlsch0->subframe_tx[subframe] = 1;
-
- dlsch0->harq_ids[subframe] = harq_pid;
- dlsch1->harq_ids[subframe] = harq_pid;
- // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
-
-
- conv_rballoc(rah,
- rballoc,
- fp->N_RB_DL,
- dlsch0_harq->rb_alloc);
-
- dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
- dlsch0_harq->nb_rb = conv_nprb(rah,
- rballoc,
- fp->N_RB_DL);
- dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
-
- if (dlsch0_harq->nb_rb == 0)
- return(-1);
-
- dlsch0_harq->mcs = mcs1;
- dlsch1_harq->mcs = mcs2;
- dlsch0_harq->rvidx = rv1;
- dlsch1_harq->rvidx = rv2;
-
- // assume both TBs are active
- dlsch0_harq->Nl = 1;
- dlsch1_harq->Nl = 1;
- dlsch0->active = 1;
- dlsch1->active = 1;
-
-
- // check if either TB is disabled (see 36-213 V11.3 Section )
- if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
- dlsch0->active = 0;
- }
-
- if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
- dlsch1->active = 0;
- }
-
- // dlsch0_harq->dl_power_off = 0;
- // dlsch1_harq->dl_power_off = 0;
-
-
- if (fp->nb_antenna_ports_eNB == 2) {
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
-
- if ((dlsch0->active==1) && (dlsch1->active==1)) {
-
- dlsch0_harq->mimo_mode = LARGE_CDD;
- dlsch1_harq->mimo_mode = LARGE_CDD;
- dlsch0_harq->dl_power_off = 1;
- dlsch1_harq->dl_power_off = 1;
- } else {
- dlsch0_harq->mimo_mode = ALAMOUTI;
- dlsch1_harq->mimo_mode = ALAMOUTI;
- }
- } else if (fp->nb_antenna_ports_eNB == 4) { // 4 antenna case
- if ((dlsch0->active==1) && (dlsch1->active==1)) {
- switch (tpmi) {
- case 0: // one layer per transport block
- dlsch0_harq->mimo_mode = LARGE_CDD;
- dlsch1_harq->mimo_mode = LARGE_CDD;
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- dlsch0_harq->dl_power_off = 1;
- dlsch1_harq->dl_power_off = 1;
- break;
-
- case 1: // one-layers on TB 0, two on TB 1
- dlsch0_harq->mimo_mode = LARGE_CDD;
- dlsch1_harq->mimo_mode = LARGE_CDD;
- dlsch1_harq->Nl = 2;
- dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
- dlsch0_harq->dl_power_off = 1;
- dlsch1_harq->dl_power_off = 1;
- break;
-
- case 2: // two-layers on TB 0, two on TB 1
- dlsch0_harq->mimo_mode = LARGE_CDD;
- dlsch1_harq->mimo_mode = LARGE_CDD;
- dlsch0_harq->Nl = 2;
- dlsch0_harq->dl_power_off = 1;
- dlsch1_harq->dl_power_off = 1;
-
- if (fp->N_RB_DL <= 56) {
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
- dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
- } else {
- LOG_E(PHY,"Add implementation of Table 7.1.7.2.2-1 for two-layer TBS conversion with N_RB_DL > 56\n");
- }
-
- break;
-
- case 3: //
- LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n");
- break;
- }
- } else if (dlsch0->active == 1) {
- switch (tpmi) {
- case 0: // one layer per transport block
- dlsch0_harq->mimo_mode = ALAMOUTI;
- dlsch1_harq->mimo_mode = ALAMOUTI;
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- break;
-
- case 1: // two-layers on TB 0
- dlsch0_harq->mimo_mode = LARGE_CDD;
- dlsch0_harq->Nl = 2;
- dlsch0_harq->dl_power_off = 1;
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
- break;
-
- case 2: // two-layers on TB 0, two on TB 1
- case 3: //
- LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi);
- break;
- }
- } else if (dlsch1->active == 1) {
- switch (tpmi) {
- case 0: // one layer per transport block
- dlsch0_harq->mimo_mode = ALAMOUTI;
- dlsch1_harq->mimo_mode = ALAMOUTI;
- dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
- break;
-
- case 1: // two-layers on TB 0
- dlsch1_harq->mimo_mode = LARGE_CDD;
- dlsch1_harq->Nl = 2;
- dlsch1_harq->dl_power_off = 1;
- dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
- break;
-
- case 2: // two-layers on TB 0, two on TB 1
- case 3: //
- LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi);
- break;
- }
- }
+
+ break;
+
+ case 25:
+ if (frame_parms->frame_type == TDD) {
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req;
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->dai = dai;
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift = cshift;
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->TPC = TPC;
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs = mcs;
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->ndi = ndi;
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc;
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping;
+ ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->type = 0;
+ dci_alloc->dci_length = sizeof_DCI0_5MHz_TDD_1_6_t;
} else {
- LOG_E(PHY,"Illegal number of antennas for eNB %d\n",fp->nb_antenna_ports_eNB);
+ ((DCI0_5MHz_FDD_t *)dci_pdu)->cqi_req = cqi_req;
+ ((DCI0_5MHz_FDD_t *)dci_pdu)->cshift = cshift;
+ ((DCI0_5MHz_FDD_t *)dci_pdu)->TPC = TPC;
+ ((DCI0_5MHz_FDD_t *)dci_pdu)->mcs = mcs;
+ ((DCI0_5MHz_FDD_t *)dci_pdu)->ndi = ndi;
+ ((DCI0_5MHz_FDD_t *)dci_pdu)->rballoc = rballoc;
+ ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping = hopping;
+ ((DCI0_5MHz_FDD_t *)dci_pdu)->type = 0;
+ dci_alloc->dci_length = sizeof_DCI0_5MHz_FDD_t;
}
-
- // reset HARQ process if this is the first transmission
- if ((dlsch0->active==1) && (dlsch0_harq->round == 0))
- dlsch0_harq->status = ACTIVE;
-
- if ((dlsch1->active==1) && (dlsch1_harq->round == 0))
- dlsch1_harq->status = ACTIVE;
-
- dlsch0->rnti = rnti;
- dlsch1->rnti = rnti;
-
-
- // printf("eNB: Format 2A TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS);
-
+
break;
-
- case format2B:
-
- switch (fp->N_RB_DL) {
-
- case 6:
- if (frame_type == TDD) {
- mcs1 = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 25:
- if (frame_type == TDD) {
- mcs1 = ((DCI2B_5MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2B_5MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2B_5MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2B_5MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2B_5MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2B_5MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2B_5MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2B_5MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2B_5MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2B_5MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2B_5MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2B_5MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2B_5MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2B_5MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 50:
- if (frame_type == TDD) {
- mcs1 = ((DCI2B_10MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2B_10MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2B_10MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2B_10MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2B_10MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2B_10MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2B_10MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2B_10MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2B_10MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2B_10MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2B_10MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2B_10MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2B_10MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2B_10MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 100:
- if (frame_type == TDD) {
- mcs1 = ((DCI2B_20MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2B_20MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2B_20MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2B_20MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2B_20MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2B_20MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2B_20MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2B_20MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2B_20MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2B_20MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2B_20MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2B_20MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2B_20MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2B_20MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
- }
-
-
- if (harq_pid>=8) {
- LOG_E(PHY,"ERROR: Format 2_2A: harq_pid=%d >= 8\n", harq_pid);
- return(-1);
- }
-
-
-
- dlsch0 = dlsch[0];
- dlsch1 = dlsch[1];
-
-
- dlsch0->subframe_tx[subframe] = 1;
-
- dlsch0->harq_ids[subframe] = harq_pid;
- dlsch1->harq_ids[subframe] = harq_pid;
- // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
-
-
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
-
- // Needs to be checked
- dlsch0_harq->codeword=0;
- dlsch1_harq->codeword=1;
-
- conv_rballoc(rah,
- rballoc,
- fp->N_RB_DL,
- dlsch0_harq->rb_alloc);
-
- dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
-
- dlsch0_harq->nb_rb = conv_nprb(rah,
- rballoc,
- fp->N_RB_DL);
- dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
-
- dlsch0_harq->mcs = mcs1;
- dlsch1_harq->mcs = mcs2;
- dlsch0_harq->rvidx = rv1;
- dlsch1_harq->rvidx = rv2;
-
- // check if either TB is disabled (see 36-213 V8.6 p. 26)
-
-
- if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0))
- dlsch0_harq->status = DISABLED;
-
- if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0))
- dlsch1_harq->status = DISABLED;
-
- dlsch0_harq->Nl = 1;
-
-
- if (dlsch0_harq->round == 0) {
- dlsch0_harq->status = ACTIVE;
- // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
- }
-
- dlsch0_harq->mcs = mcs1;
-
- if (dlsch0_harq->nb_rb > 0) {
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+
+ case 50:
+ if (frame_parms->frame_type == TDD) {
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req;
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->dai = dai;
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cshift = cshift;
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->TPC = TPC;
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->mcs = mcs;
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->ndi = ndi;
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc;
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping;
+ ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->type = 0;
+ dci_alloc->dci_length = sizeof_DCI0_10MHz_TDD_1_6_t;
} else {
- dlsch0_harq->TBS = 0;
+ ((DCI0_10MHz_FDD_t *)dci_pdu)->cqi_req = cqi_req;
+ ((DCI0_10MHz_FDD_t *)dci_pdu)->cshift = cshift;
+ ((DCI0_10MHz_FDD_t *)dci_pdu)->TPC = TPC;
+ ((DCI0_10MHz_FDD_t *)dci_pdu)->mcs = mcs;
+ ((DCI0_10MHz_FDD_t *)dci_pdu)->ndi = ndi;
+ ((DCI0_10MHz_FDD_t *)dci_pdu)->rballoc = rballoc;
+ ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping = hopping;
+ ((DCI0_10MHz_FDD_t *)dci_pdu)->type = 0;
+ dci_alloc->dci_length = sizeof_DCI0_10MHz_FDD_t;
}
-
- dlsch0->active = 1;
-
- dlsch0->rnti = rnti;
- dlsch1->rnti = rnti;
-
- dlsch0_harq->dl_power_off = 1;
- dlsch1_harq->dl_power_off = 1;
-
+
break;
-
- case format2C:
-
- switch (fp->N_RB_DL) {
-
- case 6:
- if (frame_type == TDD) {
- mcs1 = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 25:
- if (frame_type == TDD) {
- mcs1 = ((DCI2C_5MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2C_5MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2C_5MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2C_5MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2C_5MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2C_5MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2C_5MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2C_5MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2C_5MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2C_5MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2C_5MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2C_5MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2C_5MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2C_5MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 50:
- if (frame_type == TDD) {
- mcs1 = ((DCI2C_10MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2C_10MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2C_10MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2C_10MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2C_10MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2C_10MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2C_10MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2C_10MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2C_10MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2C_10MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2C_10MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2C_10MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2C_10MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2C_10MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 100:
- if (frame_type == TDD) {
- mcs1 = ((DCI2C_20MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2C_20MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2C_20MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2C_20MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2C_20MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2C_20MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2C_20MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2C_20MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2C_20MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2C_20MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2C_20MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2C_20MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2C_20MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2C_20MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
- }
-
-
- if (harq_pid>=8) {
- LOG_E(PHY,"ERROR: Format 2_2A: harq_pid=%d >= 8\n", harq_pid);
- return(-1);
- }
-
-
-
- dlsch0 = dlsch[0];
- dlsch1 = dlsch[1];
-
- dlsch0->subframe_tx[subframe] = 1;
-
- dlsch0->harq_ids[subframe] = harq_pid;
- dlsch1->harq_ids[subframe] = harq_pid;
- // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
-
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
-
- // Needs to be checked
- dlsch0_harq->codeword=0;
- dlsch1_harq->codeword=1;
-
- conv_rballoc(rah,
- rballoc,
- fp->N_RB_DL,
- dlsch0_harq->rb_alloc);
- dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
-
- dlsch0_harq->nb_rb = conv_nprb(rah,
- rballoc,
- fp->N_RB_DL);
- dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
-
- if (dlsch0_harq->nb_rb == 0)
- return(-1);
-
- dlsch0_harq->mcs = mcs1;
- dlsch1_harq->mcs = mcs2;
- dlsch0_harq->rvidx = rv1;
- dlsch1_harq->rvidx = rv2;
-
- // check if either TB is disabled (see 36-213 V8.6 p. 26)
-
-
- if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
- dlsch0->active = 0;
- }
-
- if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
- dlsch1->active = 0;
- }
-
-
-
- if ((dlsch0_harq->round == 0) && (dlsch0->active == 1) ) {
- dlsch0_harq->status = ACTIVE;
- dlsch0_harq->mcs = mcs1;
- }
-
- if ((dlsch1_harq->round == 0) && (dlsch1->active == 1) ) {
- dlsch1_harq->status = ACTIVE;
- dlsch1_harq->mcs = mcs2;
- }
-
- // check TPMI information to compute TBS
- if (fp->nb_antenna_ports_eNB == 2) {
- if (dlsch1->active == 1) { // both TBs are active
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
- } else {
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- }
- } else if (fp->nb_antenna_ports_eNB == 4) {
-
- }
-
- dlsch0->rnti = rnti;
- dlsch1->rnti = rnti;
-
- dlsch0_harq->dl_power_off = 1;
- dlsch1_harq->dl_power_off = 1;
-
- break;
-
- case format2D:
-
- switch (fp->N_RB_DL) {
-
- case 6:
- if (frame_type == TDD) {
- mcs1 = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 25:
- if (frame_type == TDD) {
- mcs1 = ((DCI2D_5MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2D_5MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2D_5MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2D_5MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2D_5MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2D_5MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2D_5MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2D_5MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2D_5MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2D_5MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2D_5MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2D_5MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2D_5MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2D_5MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 50:
- if (frame_type == TDD) {
- mcs1 = ((DCI2D_10MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2D_10MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2D_10MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2D_10MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2D_10MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2D_10MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2D_10MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2D_10MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2D_10MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2D_10MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2D_10MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2D_10MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2D_10MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2D_10MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
-
- case 100:
- if (frame_type == TDD) {
- mcs1 = ((DCI2D_20MHz_TDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2D_20MHz_TDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2D_20MHz_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2D_20MHz_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2D_20MHz_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2D_20MHz_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2D_20MHz_TDD_t *)dci_pdu)->harq_pid;
- } else {
- mcs1 = ((DCI2D_20MHz_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2D_20MHz_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2D_20MHz_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2D_20MHz_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2D_20MHz_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2D_20MHz_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2D_20MHz_FDD_t *)dci_pdu)->harq_pid;
- }
-
- break;
- }
-
-
- if (harq_pid>=8) {
- LOG_E(PHY,"ERROR: Format 2_2A: harq_pid=%d >= 8\n", harq_pid);
- return(-1);
- }
-
-
-
- dlsch0 = dlsch[0];
- dlsch1 = dlsch[1];
-
- dlsch0->subframe_tx[subframe] = 1;
-
- dlsch0->harq_ids[subframe] = harq_pid;
- dlsch1->harq_ids[subframe] = harq_pid;
- // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
-
-
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
-
- // Needs to be checked
- dlsch0_harq->codeword=0;
- dlsch1_harq->codeword=1;
-
- conv_rballoc(rah,
- rballoc,
- fp->N_RB_DL,
- dlsch0_harq->rb_alloc);
- dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
-
- dlsch0_harq->nb_rb = conv_nprb(rah,
- rballoc,
- fp->N_RB_DL);
- dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
-
- dlsch0_harq->mcs = mcs1;
- dlsch1_harq->mcs = mcs2;
- dlsch0_harq->rvidx = rv1;
- dlsch1_harq->rvidx = rv2;
-
- // check if either TB is disabled (see 36-213 V8.6 p. 26)
-
-
- if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0))
- dlsch0_harq->status = DISABLED;
-
- if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0))
- dlsch1_harq->status = DISABLED;
-
- dlsch0_harq->Nl = 1;
-
-
- if (dlsch0_harq->round == 0) {
- dlsch0_harq->status = ACTIVE;
- // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
- }
-
- dlsch0_harq->mcs = mcs1;
-
- if (dlsch0_harq->nb_rb > 0) {
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+
+ case 100:
+ if (frame_parms->frame_type == TDD) {
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req;
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->dai = dai;
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cshift = cshift;
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->TPC = TPC;
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->mcs = mcs;
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->ndi = ndi;
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc;
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping;
+ ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->type = 0;
+ dci_alloc->dci_length = sizeof_DCI0_20MHz_TDD_1_6_t;
} else {
- dlsch0_harq->TBS = 0;
+ ((DCI0_20MHz_FDD_t *)dci_pdu)->cqi_req = cqi_req;
+ ((DCI0_20MHz_FDD_t *)dci_pdu)->cshift = cshift;
+ ((DCI0_20MHz_FDD_t *)dci_pdu)->TPC = TPC;
+ ((DCI0_20MHz_FDD_t *)dci_pdu)->mcs = mcs;
+ ((DCI0_20MHz_FDD_t *)dci_pdu)->ndi = ndi;
+ ((DCI0_20MHz_FDD_t *)dci_pdu)->rballoc = rballoc;
+ ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping = hopping;
+ ((DCI0_20MHz_FDD_t *)dci_pdu)->type = 0;
+ dci_alloc->dci_length = sizeof_DCI0_20MHz_FDD_t;
}
-
- dlsch0->active = 1;
-
- dlsch0->rnti = rnti;
- dlsch1->rnti = rnti;
-
- dlsch0_harq->dl_power_off = 1;
- dlsch1_harq->dl_power_off = 1;
-
- break;
-
-
- case format1E_2A_M10PRB:
-
- harq_pid = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid;
-
- if (harq_pid>=8) {
- LOG_E(PHY,"ERROR: Format 1E_2A_M10PRB: harq_pid=%d >= 8\n", harq_pid);
- return(-1);
- }
-
- /*
- tbswap = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tb_swap;
- if (tbswap == 0) {
- dlsch0 = dlsch[0];
- dlsch1 = dlsch[1];
- }
- else{
- dlsch0 = dlsch[1];
- dlsch1 = dlsch[0];
- }
- */
- dlsch0 = dlsch[0];
- dlsch0->subframe_tx[subframe] = 1;
-
-
- dlsch0->harq_ids[subframe] = harq_pid;
- // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- // Needs to be checked
- dlsch0_harq->codeword=0;
-
- conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
- ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,fp->N_RB_DL,
- dlsch0_harq->rb_alloc);
-
- //dlsch1->rb_alloc[0] = dlsch0->rb_alloc[0];
-
- dlsch0_harq->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
- ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,
- fp->N_RB_DL);
- //dlsch1->nb_rb = dlsch0->nb_rb;
-
- dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
- //dlsch1_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2;
- dlsch0_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv;
- //dlsch1_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2;
-
- // check if either TB is disabled (see 36-213 V8.6 p. 26) --> only for format 2 and 2A
-
- //if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0))
- // dlsch0_harq->status = DISABLED;
-
- //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0))
- // dlsch1_harq->status = DISABLED;
-
- dlsch0_harq->Nl = 1;
-
- //dlsch0->layer_index = tbswap;
- //dlsch1->layer_index = 1-tbswap;
-
- // Fix this
- tpmi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tpmi;
-
- switch (tpmi) {
- case 0 :
- dlsch0_harq->mimo_mode = ALAMOUTI;
+
+ //printf("eNB: rb_alloc (20 MHz dci) %d\n",rballoc);
break;
-
- case 1:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING11;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,0, 0);
-
- break;
-
- case 2:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,1, 0);
-
- break;
-
- case 3:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,2, 0);
-
- break;
-
- case 4:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj;
- dlsch0_harq->pmi_alloc = pmi_extend(fp,3, 0);
- break;
-
- case 5:
- dlsch0_harq->mimo_mode = PUSCH_PRECODING0;
- dlsch0_harq->pmi_alloc = DL_pmi_single;
- break;
-
- case 6:
- dlsch0_harq->mimo_mode = PUSCH_PRECODING1;
- return(-1);
- break;
- }
-
- // printf("Set pmi %x (tpmi %d)\n",dlsch0->pmi_alloc,tpmi);
-
-
- if (fp->nb_antenna_ports_eNB == 1)
- dlsch0_harq->mimo_mode = SISO;
-
- // dlsch0_harq->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
- if (dlsch0_harq->round == 0) {
- dlsch0_harq->status = ACTIVE;
- // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
- }
-
- dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
-
- if (dlsch0_harq->nb_rb > 0) {
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- } else {
- dlsch0_harq->TBS = 0;
- }
-
- dlsch0->active = 1;
-
- dlsch0->rnti = rnti;
- //dlsch1->rnti = rnti;
-
- // dlsch0->dl_power_off = 1;
- dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
- //dlsch1->dl_power_off = 1;
-
- break;
-
+
default:
- LOG_E(PHY,"Unknown DCI format\n");
- return(-1);
+ LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
+ DevParam (frame_parms->N_RB_DL, 0, 0);
break;
}
-
-
- if (dlsch0_harq) {
- dlsch0_harq->frame = frame;
- dlsch0_harq->subframe = subframe;
- }
- if (dlsch1_harq) {
- dlsch1_harq->frame = frame;
- dlsch1_harq->subframe = subframe;
- }
-
-#ifdef DEBUG_DCI
-
- if (dlsch0) {
- printf("dlsch0 eNB: dlsch0 %p\n",dlsch0);
- printf("dlsch0 eNB: rnti %x\n",dlsch0->rnti);
- printf("dlsch0 eNB: NBRB %d\n",dlsch0_harq->nb_rb);
- printf("dlsch0 eNB: rballoc %x\n",dlsch0_harq->rb_alloc[0]);
- printf("dlsch0 eNB: harq_pid %d\n",harq_pid);
- printf("dlsch0 eNB: round %d\n",dlsch0_harq->round);
- printf("dlsch0 eNB: rvidx %d\n",dlsch0_harq->rvidx);
- printf("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB);
- printf("dlsch0 eNB: mcs %d\n",dlsch0_harq->mcs);
- printf("dlsch0 eNB: tpmi %d\n",tpmi);
- printf("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode);
- }
-
- if (dlsch1) {
- printf("dlsch1 eNB: dlsch1 %p\n",dlsch1);
- printf("dlsch1 eNB: rnti %x\n",dlsch1->rnti);
- printf("dlsch1 eNB: NBRB %d\n",dlsch1_harq->nb_rb);
- printf("dlsch1 eNB: rballoc %x\n",dlsch1_harq->rb_alloc[0]);
- printf("dlsch1 eNB: harq_pid %d\n",harq_pid);
- printf("dlsch1 eNB: round %d\n",dlsch1_harq->round);
- printf("dlsch1 eNB: rvidx %d\n",dlsch1_harq->rvidx);
- printf("dlsch1 eNB: TBS %d (NPRB %d)\n",dlsch1_harq->TBS,NPRB);
- printf("dlsch1 eNB: mcs %d\n",dlsch1_harq->mcs);
- printf("dlsch1 eNB: tpmi %d\n",tpmi);
- printf("dlsch1 eNB: mimo_mode %d\n",dlsch1_harq->mimo_mode);
- }
-
-#endif
-
- // compute DL power control parameters
-
- if (dlsch0 != NULL){
- computeRhoA_eNB(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off, fp->nb_antenna_ports_eNB);
- computeRhoB_eNB(pdsch_config_dedicated,&(fp->pdsch_config_common),fp->nb_antenna_ports_eNB,dlsch[0],dlsch0_harq->dl_power_off);
- }
- if (dlsch1 != NULL){
- computeRhoA_eNB(pdsch_config_dedicated, dlsch[1],dlsch1_harq->dl_power_off, fp->nb_antenna_ports_eNB);
- computeRhoB_eNB(pdsch_config_dedicated,&(fp->pdsch_config_common),fp->nb_antenna_ports_eNB,dlsch[1],dlsch1_harq->dl_power_off);
- }
-
-
- return(0);
}
+void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe) {
+
+ uint8_t harq_pid;
+
+ uint8_t UE_id;
+
+ AssertFatal((UE_id=find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No existing UE ULSCH for rnti %x\n",ulsch_pdu->ulsch_pdu_rel8.rnti);
+
+ LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
+ LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
+
+ int use_srs = 0;
+
+ harq_pid = ulsch_pdu->ulsch_pdu_rel8.harq_process_number;
+
+
+ ulsch->harq_processes[harq_pid]->frame = frame;
+ ulsch->harq_processes[harq_pid]->subframe = subframe;
+
+ ulsch->harq_processes[harq_pid]->first_rb = ulsch_pdu->ulsch_pdu_rel8.resource_block_start;
+ ulsch->harq_processes[harq_pid]->nb_rb = ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks;
+
+ AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb>0,"nb_rb = 0\n");
+
+ ulsch->harq_processes[harq_pid]->dci_alloc = 1;
+ ulsch->harq_processes[harq_pid]->rar_alloc = 0;
+ ulsch->harq_processes[harq_pid]->n_DMRS = ulsch_pdu->ulsch_pdu_rel8.cyclic_shift_2_for_drms;
+
+ ulsch->harq_processes[harq_pid]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
+ ulsch->harq_processes[harq_pid]->srs_active = use_srs;
+
+ //Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1)
+ if(ulsch->harq_processes[harq_pid]->n_DMRS == 0)
+ ulsch->harq_processes[harq_pid]->n_DMRS2 = 0;
+ else if(ulsch->harq_processes[harq_pid]->n_DMRS == 1)
+ ulsch->harq_processes[harq_pid]->n_DMRS2 = 6;
+ else if(ulsch->harq_processes[harq_pid]->n_DMRS == 2)
+ ulsch->harq_processes[harq_pid]->n_DMRS2 = 3;
+ else if(ulsch->harq_processes[harq_pid]->n_DMRS == 3)
+ ulsch->harq_processes[harq_pid]->n_DMRS2 = 4;
+ else if(ulsch->harq_processes[harq_pid]->n_DMRS == 4)
+ ulsch->harq_processes[harq_pid]->n_DMRS2 = 2;
+ else if(ulsch->harq_processes[harq_pid]->n_DMRS == 5)
+ ulsch->harq_processes[harq_pid]->n_DMRS2 = 8;
+ else if(ulsch->harq_processes[harq_pid]->n_DMRS == 6)
+ ulsch->harq_processes[harq_pid]->n_DMRS2 = 10;
+ else if(ulsch->harq_processes[harq_pid]->n_DMRS == 7)
+ ulsch->harq_processes[harq_pid]->n_DMRS2 = 9;
+
+
+ LOG_D(PHY,"[eNB %d][PUSCH %d] Programming PUSCH with n_DMRS2 %d (cshift %d) for Frame %d, Subframe %d\n",
+ eNB->Mod_id,harq_pid,ulsch->harq_processes[harq_pid]->n_DMRS2,ulsch->harq_processes[harq_pid]->n_DMRS,
+ frame,subframe);
+
+
+ ulsch->harq_processes[harq_pid]->rvidx = ulsch_pdu->ulsch_pdu_rel8.redundancy_version;
+ ulsch->harq_processes[harq_pid]->Qm = ulsch_pdu->ulsch_pdu_rel8.modulation_type;
+ // Set O_ACK to 0 by default, will be set of DLSCH is scheduled and needs to be
+ ulsch->harq_processes[harq_pid]->O_ACK = 0;
+
+ if ((ulsch->harq_processes[harq_pid]->status == SCH_IDLE) ||
+ (ulsch->harq_processes[harq_pid]->ndi != ulsch_pdu->ulsch_pdu_rel8.new_data_indication)){
+ ulsch->harq_processes[harq_pid]->status = ACTIVE;
+
+ ulsch->harq_processes[harq_pid]->TBS = ulsch_pdu->ulsch_pdu_rel8.size<<3;
+
+ ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks;
+ ulsch->harq_processes[harq_pid]->Nsymb_initial = ulsch->harq_processes[harq_pid]->Nsymb_pusch;
+ ulsch->harq_processes[harq_pid]->round = 0;
+ ulsch->harq_processes[harq_pid]->ndi = ulsch_pdu->ulsch_pdu_rel8.new_data_indication;
+ // note here, the CQI bits need to be kept constant as in initial transmission
+ // set to 0 in initial transmission, and don't touch them during retransmissions
+ // will be set if MAC has activated ULSCH_CQI_RI_PDU or ULSCH_CQI_HARQ_RI_PDU
+ ulsch->harq_processes[harq_pid]->Or1 = 0;
+ ulsch->harq_processes[harq_pid]->Or2 = 0;
+ }
+ else ulsch->harq_processes[harq_pid]->round++;
+
+ ulsch->rnti = ulsch_pdu->ulsch_pdu_rel8.rnti;
+ LOG_I(PHY,"Filling ULSCH %x for Frame %d, Subframe %d : harq_pid %d, first_rb %d, nb_rb %d, rvidx %d, Qm %d, TBS %d, round %d \n",
+ ulsch->rnti,
+ frame,
+ subframe,
+ harq_pid,
+ ulsch->harq_processes[harq_pid]->first_rb,
+ ulsch->harq_processes[harq_pid]->nb_rb,
+ ulsch->harq_processes[harq_pid]->rvidx,
+ ulsch->harq_processes[harq_pid]->Qm,
+ ulsch->harq_processes[harq_pid]->TBS,
+ ulsch->harq_processes[harq_pid]->round);
+
+
+}
+
+
int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
{
-
-
switch (dci->format) {
case format0: // This is an UL SCH allocation so nothing here, inform MAC
@@ -4505,14 +2831,14 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
break;
case 50:
- LOG_I(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
- LOG_I(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
- LOG_I(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
- LOG_I(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
- LOG_I(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
- LOG_I(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
- LOG_I(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
- LOG_I(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
+ LOG_D(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+ LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
+ LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
+ LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
+ LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
+ LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
+ LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
+ LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
break;
case 100:
@@ -6120,6 +4446,7 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format,
LOG_I(PHY,"[DCI-FORMAT-1-1A] TPC %d\n", TPC);
#endif
+
// I- check dci content minimum coherency
if( ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) && harq_pid > 0)
{
@@ -6260,7 +4587,7 @@ int check_dci_format1c_coherency(uint8_t N_RB_DL,
// I- check dci content minimum coherency
- if((rnti!=si_rnti) || (rnti!=p_rnti) || (rnti!=ra_rnti))
+ if((rnti!=si_rnti) && (rnti!=p_rnti) && (rnti!=ra_rnti))
return(0);
switch (N_RB_DL) {
@@ -6371,22 +4698,15 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
}
}
- /*
- if((pdlsch0_harq->round > 0) && (mcs1 != pdlsch0_harq->mcs))
- {
- // DCI false detection
- return(0);
- }*/
-
- if((pdlsch0_harq->round == 0) && (rv1 > 0))
+ if((pdlsch0_harq->round == 0) && (rv1 > 0) && (mcs1 != 0))
{
// DCI false detection
LOG_I(PHY,"bad rv1\n");
return(0);
}
- if((pdlsch1_harq->round == 0) && (rv2 > 0))
+ if((pdlsch1_harq->round == 0) && (rv2 > 0) && (mcs2 != 0))
{
// DCI false detection
LOG_I(PHY,"bad rv2\n");
@@ -6464,10 +4784,70 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
return(1);
}
+void compute_llr_offset(LTE_DL_FRAME_PARMS *frame_parms,
+ LTE_UE_PDCCH *pdcch_vars,
+ LTE_UE_PDSCH *pdsch_vars,
+ LTE_DL_UE_HARQ_t *dlsch0_harq,
+ uint8_t nb_rb_alloc,
+ uint8_t subframe)
+{
+ uint32_t pbch_pss_sss_re;
+ uint32_t crs_re;
+ uint32_t granted_re;
+ uint32_t data_re;
+ uint32_t llr_offset;
+ uint8_t symbol;
+ uint8_t symbol_mod;
+
+ pdsch_vars->llr_offset[pdcch_vars->num_pdcch_symbols] = 0;
+
+ //LOG_I(PHY,"compute_llr_offset: nb RB %d - Qm %d \n", nb_rb_alloc, dlsch0_harq->Qm);
+
+ //dlsch0_harq->rb_alloc_even;
+ //dlsch0_harq->rb_alloc_odd;
+
+ for(symbol=pdcch_vars->num_pdcch_symbols; symbolsymbols_per_tti; symbol++)
+ {
+ symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
+ if((symbol_mod == 0) || symbol_mod == (4-frame_parms->Ncp))
+ {
+ if (frame_parms->nb_antennas_tx == 2)
+ crs_re = 4;
+ else
+ crs_re = 2;
+ }
+ else
+ {
+ crs_re = 0;
+ }
+
+ granted_re = nb_rb_alloc * (12-crs_re);
+ pbch_pss_sss_re = adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,dlsch0_harq->Qm,subframe,symbol);
+ pbch_pss_sss_re = (double)pbch_pss_sss_re * ((double)(12-crs_re)/12);
+ data_re = granted_re - pbch_pss_sss_re;
+ llr_offset = data_re * dlsch0_harq->Qm * 2;
+
+ pdsch_vars->llr_length[symbol] = data_re;
+ if(symbol < (frame_parms->symbols_per_tti-1))
+ pdsch_vars->llr_offset[symbol+1] = pdsch_vars->llr_offset[symbol] + llr_offset;
+
+ //LOG_I(PHY,"Granted Re subframe %d / symbol %d => %d (%d RBs)\n", subframe, symbol_mod, granted_re,dlsch0_harq->nb_rb);
+ //LOG_I(PHY,"Pbch/PSS/SSS Re subframe %d / symbol %d => %d \n", subframe, symbol_mod, pbch_pss_sss_re);
+ //LOG_I(PHY,"CRS Re Per PRB subframe %d / symbol %d => %d \n", subframe, symbol_mod, crs_re);
+ //LOG_I(PHY,"Data Re subframe %d / symbol %d => %d \n", subframe, symbol_mod, data_re);
+
+
+
+ //LOG_I(PHY,"Data Re subframe %d-symbol %d => llr length %d, llr offset %d \n", subframe, symbol,
+ // pdsch_vars->llr_length[symbol], pdsch_vars->llr_offset[symbol]);
+ }
+}
void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
uint8_t N_RB_DL,
DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
LTE_DL_FRAME_PARMS *frame_parms,
+ LTE_UE_PDCCH *pdcch_vars,
+ LTE_UE_PDSCH *pdsch_vars,
uint8_t subframe,
uint16_t rnti,
uint16_t tc_rnti,
@@ -6488,16 +4868,35 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
uint8_t rah = pdci_info_extarcted->rah;
uint8_t dai = pdci_info_extarcted->dai;
- uint8_t NPRB = 0;
+
+ uint8_t NPRB = 0;
+ uint8_t NPRB4TBS = 0;
+ uint8_t nb_rb_alloc = 0;
if(dci_format == format1A)
{
- if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
+ switch (N_RB_DL) {
+ case 6:
+ NPRB = RIV2nb_rb_LUT6[rballoc];
+ break;
+ case 25:
+ NPRB = RIV2nb_rb_LUT25[rballoc];
+ break;
+ case 50:
+ NPRB = RIV2nb_rb_LUT50[rballoc];
+ break;
+ case 100:
+ NPRB = RIV2nb_rb_LUT100[rballoc];
+ break;
+ }
+ if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
{
- NPRB = (TPC&1) + 2;
+ NPRB4TBS = (TPC&1) + 2;
}
- else
+ else
{
+ NPRB4TBS = NPRB;
+ /*
switch (N_RB_DL) {
case 6:
NPRB = RIV2nb_rb_LUT6[rballoc];//NPRB;
@@ -6512,11 +4911,16 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
NPRB = RIV2nb_rb_LUT100[rballoc];//NPRB;
break;
}
+
+ */
+ nb_rb_alloc = NPRB;
}
}
else // format1
{
NPRB = conv_nprb(rah, rballoc, N_RB_DL);
+ NPRB4TBS=NPRB;
+ nb_rb_alloc = NPRB;
}
pdlsch0->current_harq_pid = harq_pid;
@@ -6528,7 +4932,6 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
{
pdlsch0_harq->round = 0;
- pdlsch0_harq->first_tx = 1;
pdlsch0_harq->status = ACTIVE;
}
else //CRNTI
@@ -6540,27 +4943,38 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
rnti,harq_pid,pdlsch0_harq->DCINdi);
}
- // DCI has been toggled or this is the first transmission
- if (ndi1!=pdlsch0_harq->DCINdi)
+ // NDI has been toggled or this is the first transmission
+ if ((ndi1!=pdlsch0_harq->DCINdi) || (pdlsch0_harq->first_tx==1))
{
pdlsch0_harq->round = 0;
- pdlsch0_harq->first_tx = 1;
- pdlsch0_harq->status = ACTIVE;
- }
-
- if( ((ndi1 == pdlsch0_harq->DCINdi) && (pdlsch0_harq->round == 0)) ||
- ((rv1 != 0) && (pdlsch0_harq->round == 0))
- )
- {
- LOG_D(PHY,"skip pdsch decoding and report ack\n");
- // skip pdsch decoding and report ack
- pdlsch0_harq->status = SCH_IDLE;
- pdlsch0->active = 0;
- pdlsch0->harq_ack[subframe].ack = 1;
- pdlsch0->harq_ack[subframe].harq_id = harq_pid;
- pdlsch0->harq_ack[subframe].send_harq_status = 1;
-
pdlsch0_harq->first_tx = 0;
+ pdlsch0_harq->status = ACTIVE;
+
+ }else if (rv1 != 0 )
+ //NDI has not been toggled but rv was increased by eNB: retransmission
+ {
+ if (pdlsch0_harq->status == SCH_IDLE)
+ //packet was actually decoded in previous transmission (ACK was missed by eNB)
+ //However, the round is not a good check as it might have been decoded in a retransmission prior to this one.
+ {
+ LOG_D(PHY,"skip pdsch decoding and report ack\n");
+ // skip pdsch decoding and report ack
+ //pdlsch0_harq->status = SCH_IDLE;
+ pdlsch0->active = 0;
+ pdlsch0->harq_ack[subframe].ack = 1;
+ pdlsch0->harq_ack[subframe].harq_id = harq_pid;
+ pdlsch0->harq_ack[subframe].send_harq_status = 1;
+
+ //pdlsch0_harq->first_tx = 0;
+ }
+ else //normal retransmission
+ {
+ // nothing special to do
+ }
+ }
+ else
+ {
+ pdlsch0_harq->status = ACTIVE;
}
}
@@ -6607,7 +5021,7 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
pdlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc];
pdlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT50_0[rballoc];
pdlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT50_1[rballoc];
- // printf("rballoc: %08x.%08x\n",pdlsch0_harq->rb_alloc_even[0],pdlsch0_harq->rb_alloc_even[1]);
+ printf("rballoc: %08x.%08x\n",pdlsch0_harq->rb_alloc_even[0],pdlsch0_harq->rb_alloc_even[1]);
} else { // DISTRIBUTED
if ((rballoc&(1<<10)) == 0) {
rballoc = rballoc&(~(1<<10));
@@ -6671,25 +5085,33 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
pdlsch0_harq->rb_alloc_odd[2]= pdlsch0_harq->rb_alloc_even[2];
pdlsch0_harq->rb_alloc_odd[3]= pdlsch0_harq->rb_alloc_even[3];
}
-
if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
{
- pdlsch0_harq->TBS = TBStable[mcs1][NPRB-1];
+ pdlsch0_harq->TBS = TBStable[mcs1][NPRB4TBS-1];
pdlsch0_harq->Qm = 2;
}
else
{
if(mcs1 < 29)
{
- pdlsch0_harq->TBS = TBStable[get_I_TBS(mcs1)][NPRB-1];
+ pdlsch0_harq->TBS = TBStable[get_I_TBS(mcs1)][NPRB4TBS-1];
pdlsch0_harq->Qm = get_Qm(mcs1);
}
}
+
+ compute_llr_offset(frame_parms,
+ pdcch_vars,
+ pdsch_vars,
+ pdlsch0_harq,
+ nb_rb_alloc,
+ subframe);
}
void prepare_dl_decoding_format1C(uint8_t N_RB_DL,
DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
LTE_DL_FRAME_PARMS *frame_parms,
+ LTE_UE_PDCCH *pdcch_vars,
+ LTE_UE_PDSCH *pdsch_vars,
uint32_t rnti,
uint32_t si_rnti,
uint32_t ra_rnti,
@@ -6792,6 +5214,14 @@ void prepare_dl_decoding_format1C(uint8_t N_RB_DL,
AssertFatal(0,"Format 1C: Unknown N_RB_DL %d\n",frame_parms->N_RB_DL);
break;
}
+
+ compute_llr_offset(frame_parms,
+ pdcch_vars,
+ pdsch_vars,
+ pdlsch0_harq,
+ pdlsch0_harq->nb_rb,
+ subframe);
+
}
void compute_precoding_info_2cw(uint8_t tpmi, uint8_t tbswap, uint16_t pmi_alloc, LTE_DL_FRAME_PARMS *frame_parms, LTE_DL_UE_HARQ_t *dlsch0_harq, LTE_DL_UE_HARQ_t *dlsch1_harq)
@@ -6820,6 +5250,9 @@ switch (tpmi) {
dlsch1_harq->pmi_alloc = pmi_alloc;
dlsch0_harq->pmi_alloc = pmi_alloc^0x1555;
}
+#ifdef DEBUG_HARQ
+ printf ("\n \n compute_precoding_info_2cw pmi_alloc_new = %d\n", dlsch0_harq->pmi_alloc);
+ #endif
break;
default:
break;
@@ -6851,20 +5284,17 @@ switch (tpmi) {
break;
case 5:
dlsch_harq->mimo_mode = PUSCH_PRECODING0;
- dlsch_harq->pmi_alloc = pmi_alloc;;//pmi_convert(frame_parms,dlsch0->pmi_alloc,0);
- #ifdef DEBUG_HARQ
- printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d\n", dlsch0->pmi_alloc);
- #endif
+ dlsch_harq->pmi_alloc = pmi_alloc;//pmi_convert(frame_parms,dlsch0->pmi_alloc,0);
break;
case 6:
dlsch_harq->mimo_mode = PUSCH_PRECODING1;
- dlsch_harq->pmi_alloc = pmi_alloc;;//pmi_convert(frame_parms,dlsch0->pmi_alloc,1);
- #ifdef DEBUG_HARQ
- printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d\n", dlsch0->pmi_alloc);
- #endif
+ dlsch_harq->pmi_alloc = pmi_alloc;//pmi_convert(frame_parms,dlsch0->pmi_alloc,1);
break;
}
-}
+ #ifdef DEBUG_HARQ
+ printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d with tpmi %d\n", dlsch_harq->pmi_alloc, tpmi);
+ #endif
+ }
void compute_precoding_info_format2A(uint8_t tpmi,
uint8_t nb_antenna_ports_eNB,
@@ -6965,6 +5395,8 @@ void compute_precoding_info_format2A(uint8_t tpmi,
void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
LTE_DL_FRAME_PARMS *frame_parms,
+ LTE_UE_PDCCH *pdcch_vars,
+ LTE_UE_PDSCH *pdsch_vars,
uint16_t rnti,
uint8_t subframe,
LTE_DL_UE_HARQ_t *dlsch0_harq,
@@ -6986,15 +5418,12 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
uint8_t ndi1 = pdci_info_extarcted->ndi1;
uint8_t ndi2 = pdci_info_extarcted->ndi2;
- uint8_t TB0_active = 0;
- uint8_t TB1_active = 0;
+ uint8_t TB0_active = 1;
+ uint8_t TB1_active = 1;
+ // printf("inside prepare pdlsch1->pmi_alloc %d \n",pdlsch1->pmi_alloc);
- // check if either TB is disabled (see 36-213 V8.6 p. 26)
- TB0_active = 1;
- TB1_active = 1;
-
if ((rv1 == 1) && (mcs1 == 0)) {
TB0_active=0;
}
@@ -7041,6 +5470,16 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch1_harq->codeword = 0;
}
+
+ if (!TB0_active && TB1_active){
+ dlsch1_harq->codeword = 0;
+ }
+
+ if (TB0_active && !TB1_active){
+ dlsch0_harq->codeword = 0;
+ }
+
+
if (TB0_active==0) {
dlsch0_harq->status = SCH_IDLE;
pdlsch0->active = 0;
@@ -7054,9 +5493,9 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
pdlsch1->active = 0;
}
-//#ifdef DEBUG_HARQ
+#ifdef DEBUG_HARQ
printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
-//#endif
+#endif
// compute resource allocation
if (TB0_active == 1){
@@ -7111,10 +5550,13 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
{
if ((TB0_active) && (TB1_active)){ //two CW active
compute_precoding_info_2cw(tpmi, tbswap, pdlsch0->pmi_alloc,frame_parms, dlsch0_harq, dlsch1_harq);
+
+ // printf("[DCI UE 1]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
} else if ((TB0_active) && (!TB1_active)) { // only CW 0 active
compute_precoding_info_1cw(tpmi, pdlsch0->pmi_alloc, frame_parms, dlsch0_harq);
} else {
- compute_precoding_info_1cw(tpmi, pdlsch0->pmi_alloc, frame_parms, dlsch1_harq);
+ compute_precoding_info_1cw(tpmi, pdlsch1->pmi_alloc, frame_parms, dlsch1_harq);
+ // printf("I am doing compute_precoding_info_1cw with tpmi %d \n", tpmi);
}
//printf(" UE DCI harq0 MIMO mode = %d\n", dlsch0_harq->mimo_mode);
if ((frame_parms->nb_antenna_ports_eNB == 1) && (TB0_active))
@@ -7129,11 +5571,14 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch0_harq,
dlsch1_harq);
}
-
+ // printf("[DCI UE 2]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
// reset round + compute Qm
if (TB0_active) {
+ // printf("TB0 ndi1 =%d, dlsch0_harq->DCINdi =%d, dlsch0_harq->first_tx = %d\n", ndi1, dlsch0_harq->DCINdi, dlsch0_harq->first_tx);
if ((ndi1!=dlsch0_harq->DCINdi) || (dlsch0_harq->first_tx==1)) {
dlsch0_harq->round = 0;
+ dlsch0_harq->status = ACTIVE;
+ dlsch0_harq->DCINdi = ndi1;
//LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW0 subframe %d (pid %d, round %d)\n",
// subframe,harq_pid,dlsch0_harq->round);
@@ -7141,18 +5586,18 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
LOG_D(PHY,"Format 2 DCI First TX0: Clearing flag\n");
dlsch0_harq->first_tx = 0;
}
- }else{
- if(dlsch0_harq->round == 0) {
-#if 0
+ }
+ /*else if (rv1 != 0 )
+ //NDI has not been toggled but rv was increased by eNB: retransmission
+ {
+ if(dlsch0_harq->status == SCH_IDLE) {
// skip pdsch decoding and report ack
- dlsch0_harq->status = SCH_IDLE;
+ //dlsch0_harq->status = SCH_IDLE;
pdlsch0->active = 0;
pdlsch0->harq_ack[subframe].ack = 1;
pdlsch0->harq_ack[subframe].harq_id = harq_pid;
pdlsch0->harq_ack[subframe].send_harq_status = 1;
-#endif
- }
- }
+ }*/
// if Imcs in [29..31] TBS is assumed to be as determined from DCI transported in the latest
// PDCCH for the same trasport block using Imcs in [0 .. 28]
@@ -7175,27 +5620,33 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch0_harq->Qm = (mcs1-28)<<1;
}
+ // printf("[DCI UE 3]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
+
if (TB1_active) {
+ // printf("TB1 ndi2 =%d, dlsch1_harq->DCINdi =%d, dlsch1_harq->first_tx = %d\n", ndi2, dlsch1_harq->DCINdi, dlsch1_harq->first_tx);
if ((ndi2!=dlsch1_harq->DCINdi) || (dlsch1_harq->first_tx==1)) {
dlsch1_harq->round = 0;
+ dlsch1_harq->status = ACTIVE;
+ dlsch1_harq->DCINdi = ndi2;
//LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW1 subframe %d (pid %d, round %d)\n",
// subframe,harq_pid,dlsch0_harq->round);
if (dlsch1_harq->first_tx==1) {
LOG_D(PHY,"Format 2 DCI First TX1: Clearing flag\n");
dlsch1_harq->first_tx = 0;
}
- }else{
-#if 0
- if(dlsch1_harq->round == 0) {
+ }
+ /*else if (rv1 != 0 )
+ //NDI has not been toggled but rv was increased by eNB: retransmission
+ {
+ if(dlsch1_harq->status == SCH_IDLE) {
// skip pdsch decoding and report ack
- dlsch1_harq->status = SCH_IDLE;
+ //dlsch1_harq->status = SCH_IDLE;
pdlsch1->active = 0;
pdlsch1->harq_ack[subframe].ack = 1;
pdlsch1->harq_ack[subframe].harq_id = harq_pid;
pdlsch1->harq_ack[subframe].send_harq_status = 1;
}
-#endif
- }
+ }*/
// if Imcs in [29..31] TBS is assumed to be as determined from DCI transported in the latest
// PDCCH for the same trasport block using Imcs in [0 .. 28]
@@ -7216,18 +5667,25 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch1_harq->Qm = (mcs2-28)<<1;
}
-//#ifdef DEBUG_HARQ
- printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
-//#endif
- #ifdef DEBUG_HARQ
+ compute_llr_offset(frame_parms,
+ pdcch_vars,
+ pdsch_vars,
+ dlsch0_harq,
+ dlsch0_harq->nb_rb,
+ subframe);
+
+
+ /* #ifdef DEBUG_HARQ
+ printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
+ printf("[DCI UE]: TB0_active %d , TB1_active %d\n", TB0_active, TB1_active);
if (dlsch0 != NULL && dlsch1 != NULL)
printf("[DCI UE] dlsch0_harq status = %d, dlsch1_harq status = %d\n", dlsch0_harq->status, dlsch1_harq->status);
else if (dlsch0 == NULL && dlsch1 != NULL)
printf("[DCI UE] dlsch0_harq NULL dlsch1_harq status = %d\n", dlsch1_harq->status);
else if (dlsch0 != NULL && dlsch1 == NULL)
printf("[DCI UE] dlsch1_harq NULL dlsch0_harq status = %d\n", dlsch0_harq->status);
- #endif
+ #endif*/
}
int generate_ue_dlsch_params_from_dci(int frame,
@@ -7235,6 +5693,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
void *dci_pdu,
uint16_t rnti,
DCI_format_t dci_format,
+ LTE_UE_PDCCH *pdcch_vars,
+ LTE_UE_PDSCH *pdsch_vars,
LTE_UE_DLSCH_t **dlsch,
LTE_DL_FRAME_PARMS *frame_parms,
PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
@@ -7245,12 +5705,12 @@ int generate_ue_dlsch_params_from_dci(int frame,
uint16_t tc_rnti)
{
-
uint8_t harq_pid=0;
uint8_t frame_type=frame_parms->frame_type;
uint8_t tpmi=0;
LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
LTE_DL_UE_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
+
DCI_INFO_EXTRACTED_t dci_info_extarcted;
uint8_t status=0;
@@ -7314,7 +5774,10 @@ int generate_ue_dlsch_params_from_dci(int frame,
&dci_info_extarcted,
dlsch0_harq);
if(status == 0)
+ {
+ printf("bad DCI 1A !!! \n");
return(-1);
+ }
// dci is correct ==> update internal structure and prepare dl decoding
#ifdef DEBUG_DCI
@@ -7324,6 +5787,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
frame_parms->N_RB_DL,
&dci_info_extarcted,
frame_parms,
+ pdcch_vars,
+ pdsch_vars,
subframe,
rnti,
tc_rnti,
@@ -7374,6 +5839,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
prepare_dl_decoding_format1C(frame_parms->N_RB_DL,
&dci_info_extarcted,
frame_parms,
+ pdcch_vars,
+ pdsch_vars,
rnti,
si_rnti,
ra_rnti,
@@ -7415,7 +5882,11 @@ int generate_ue_dlsch_params_from_dci(int frame,
&dci_info_extarcted,
dlsch0_harq);
if(status == 0)
- return(-1);
+ {
+ printf("bad DCI 1 !!! \n");
+ return(-1);
+ }
+
// dci is correct ==> update internal structure and prepare dl decoding
#ifdef DEBUG_DCI
@@ -7425,6 +5896,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
frame_parms->N_RB_DL,
&dci_info_extarcted,
frame_parms,
+ pdcch_vars,
+ pdsch_vars,
subframe,
rnti,
tc_rnti,
@@ -7446,20 +5919,19 @@ int generate_ue_dlsch_params_from_dci(int frame,
dci_pdu,
&dci_info_extarcted);
- // check dci content
- dlsch[0]->active = 0;
- dlsch[1]->active = 0;
- if (dci_info_extarcted.tb_swap == 0) {
+ // check dci content
+ dlsch[0]->active = 1;
+ dlsch[1]->active = 1;
+
dlsch0 = dlsch[0];
dlsch1 = dlsch[1];
- } else {
- dlsch0 = dlsch[1];
- dlsch1 = dlsch[0];
- }
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ dlsch0_harq = dlsch0->harq_processes[dci_info_extarcted.harq_pid];
+ dlsch1_harq = dlsch1->harq_processes[dci_info_extarcted.harq_pid];
+ // printf("before coherency dlsch[1]->pmi_alloc %d\n",dlsch[1]->pmi_alloc);
+ // printf("before coherency dlsch1->pmi_alloc %d\n",dlsch1->pmi_alloc);
+ // printf("before coherency dlsch1_harq->pmi_alloc %d\n",dlsch1_harq->pmi_alloc);
//LOG_I(PHY,"[DCI-format2] check dci content \n");
status = check_dci_format2_2a_coherency(format2,
@@ -7474,18 +5946,20 @@ int generate_ue_dlsch_params_from_dci(int frame,
if(status == 0)
return(-1);
+
// dci is correct ==> update internal structure and prepare dl decoding
//LOG_I(PHY,"[DCI-format2] update internal structure and prepare dl decoding \n");
prepare_dl_decoding_format2_2A(format2,
&dci_info_extarcted,
frame_parms,
+ pdcch_vars,
+ pdsch_vars,
rnti,
subframe,
dlsch0_harq,
dlsch1_harq,
dlsch0,
dlsch1);
-
}
break;
@@ -7533,6 +6007,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
prepare_dl_decoding_format2_2A(format2A,
&dci_info_extarcted,
frame_parms,
+ pdcch_vars,
+ pdsch_vars,
rnti,
subframe,
dlsch0_harq,
@@ -7671,11 +6147,15 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->mimo_mode = SISO;
- if (dlsch0_harq->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) {
+ if ((dlsch0_harq->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) ||
+ (dlsch0_harq->first_tx==1)) {
dlsch0_harq->round = 0;
+ dlsch0_harq->first_tx = 0;
dlsch0_harq->status = ACTIVE;
- } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process,
+ }
+ /*
+ else if (dlsch0_harq->status == SCH_IDLE) { // we got same ndi for a previously decoded process,
// this happens if either another harq process in the same
// is NAK or an ACK was not received
@@ -7685,6 +6165,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0->active = 0;
return(0);
}
+ */
dlsch0_harq->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
@@ -7712,36 +6193,34 @@ int generate_ue_dlsch_params_from_dci(int frame,
break;
}
-
-#ifdef DEBUG_DCI
+#ifdef UE_DEBUG_TRACE
if (dlsch[0] && (dlsch[0]->rnti != 0xffff)) {
- printf("dci_format:%d Abssubframe: %d.%d \n",dci_format,frame%1024,subframe);
- printf("PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti);
- printf("PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb);
- printf("PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc_even[0]);
- printf("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid);
- //printf("PDSCH dlsch0 UE: tpc %d\n",TPC);
- printf("PDSCH dlsch0 UE: g %d\n",dlsch[0]->g_pucch);
- printf("PDSCH dlsch0 UE: round %d\n",dlsch0_harq->round);
- printf("PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi);
- printf("PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx);
- printf("PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS);
- printf("PDSCH dlsch0 UE: mcs %d\n",dlsch0_harq->mcs);
- printf("PDSCH dlsch0 UE: pwr_off %d\n",dlsch0_harq->dl_power_off);
+ LOG_I(PHY,"dci_format:%d Abssubframe: %d.%d \n",dci_format,frame%1024,subframe);
+ LOG_I(PHY,"PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti);
+ LOG_D(PHY,"PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb);
+ LOG_D(PHY,"PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc_even[0]);
+ LOG_I(PHY,"PDSCH dlsch0 UE: harq_pid %d\n",dci_info_extarcted.harq_pid);
+ LOG_I(PHY,"PDSCH dlsch0 UE: g %d\n",dlsch[0]->g_pucch);
+ LOG_D(PHY,"PDSCH dlsch0 UE: round %d\n",dlsch0_harq->round);
+ LOG_D(PHY,"PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi);
+ LOG_D(PHY,"PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx);
+ LOG_D(PHY,"PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS);
+ LOG_D(PHY,"PDSCH dlsch0 UE: mcs %d\n",dlsch0_harq->mcs);
+ LOG_D(PHY,"PDSCH dlsch0 UE: pwr_off %d\n",dlsch0_harq->dl_power_off);
}
#endif
- #if T_TRACER
+#if T_TRACER
if( (dlsch[0]->rnti != si_rnti) && (dlsch[0]->rnti != ra_rnti) && (dlsch[0]->rnti != p_rnti))
{
- T(T_UE_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame%1024), T_INT(subframe), T_INT(0),
- T_INT(dlsch[0]->rnti), T_INT(dci_format),
- T_INT(harq_pid),
- T_INT(dlsch0_harq->mcs),
- T_INT(dlsch0_harq->TBS));
+ T(T_UE_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame%1024), T_INT(subframe),
+ T_INT(dlsch[0]->rnti), T_INT(dci_format),
+ T_INT(harq_pid),
+ T_INT(dlsch0_harq->mcs),
+ T_INT(dlsch0_harq->TBS));
}
- #endif
+#endif
// compute DL power control parameters
@@ -8519,7 +6998,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
uint8_t transmission_mode = ue->transmission_mode[eNB_id];
ANFBmode_t AckNackFBMode;
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
- LTE_UE_DLSCH_t **dlsch = ue->dlsch[subframe&0x1][0];
+ LTE_UE_DLSCH_t **dlsch = ue->dlsch[ue->current_thread_id[subframe]][0];
PHY_MEASUREMENTS *meas = &ue->measurements;
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
// uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
@@ -8574,7 +7053,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ndi = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi;
mcs = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
rballoc = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type;
} else {
cqi_req = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req;
@@ -8583,7 +7062,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ndi = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->ndi;
mcs = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs;
rballoc = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type;
}
@@ -8602,7 +7081,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ndi = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->ndi;
mcs = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
rballoc = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->type;
} else {
cqi_req = ((DCI0_5MHz_FDD_t *)dci_pdu)->cqi_req;
@@ -8611,7 +7090,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ndi = ((DCI0_5MHz_FDD_t *)dci_pdu)->ndi;
mcs = ((DCI0_5MHz_FDD_t *)dci_pdu)->mcs;
rballoc = ((DCI0_5MHz_FDD_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_5MHz_FDD_t *)dci_pdu)->type;
}
@@ -8630,7 +7109,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ndi = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->ndi;
mcs = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->mcs;
rballoc = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->type;
} else {
cqi_req = ((DCI0_10MHz_FDD_t *)dci_pdu)->cqi_req;
@@ -8639,7 +7118,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ndi = ((DCI0_10MHz_FDD_t *)dci_pdu)->ndi;
mcs = ((DCI0_10MHz_FDD_t *)dci_pdu)->mcs;
rballoc = ((DCI0_10MHz_FDD_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_10MHz_FDD_t *)dci_pdu)->type;
}
@@ -8658,7 +7137,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ndi = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->ndi;
mcs = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->mcs;
rballoc = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->type;
} else {
cqi_req = ((DCI0_20MHz_FDD_t *)dci_pdu)->cqi_req;
@@ -8667,7 +7146,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ndi = ((DCI0_20MHz_FDD_t *)dci_pdu)->ndi;
mcs = ((DCI0_20MHz_FDD_t *)dci_pdu)->mcs;
rballoc = ((DCI0_20MHz_FDD_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_20MHz_FDD_t *)dci_pdu)->type;
}
@@ -9326,7 +7805,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
//int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4);
int dl_subframe = subframe;
- if (ue->dlsch[dl_subframe&0x1][eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission
+ if (ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission
ulsch->harq_processes[harq_pid]->O_ACK = 1;
} else {
ulsch->harq_processes[harq_pid]->O_ACK = 0;
@@ -9341,7 +7820,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
if (ulsch->bundling)
ulsch->harq_processes[harq_pid]->O_ACK = (dai == 3)? 0 : 1;
else
- ulsch->harq_processes[harq_pid]->O_ACK = (dai+1)&3;
+ ulsch->harq_processes[harq_pid]->O_ACK = (dai >= 2)? 2 : (dai+1)&3; //(dai+1)&3;
// ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1;
}
@@ -9358,6 +7837,9 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,
ulsch->bundling,
ulsch->harq_processes[harq_pid]->O_ACK);*/
+ LOG_D(PHY,"Setting beta_offset_cqi_times8 to %d, index %d\n",
+ beta_cqi[ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index],
+ ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index);
ulsch->beta_offset_cqi_times8 = beta_cqi[ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index];//18;
ulsch->beta_offset_ri_times8 = beta_ri[ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index];//10;
@@ -9402,35 +7884,35 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
if (ue->ulsch_Msg3_active[eNB_id] == 1)
ue->ulsch_Msg3_active[eNB_id] = 0;
- LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d, ulsch_ue_Msg3_active %d\n",
+ LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d, ulsch_ue_Msg3_active %d, cqi_req %d => O %d\n",
ue->Mod_id,harq_pid,
proc->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb,
- ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx, ue->ulsch_Msg3_active[eNB_id]);
+ ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx, ue->ulsch_Msg3_active[eNB_id],cqi_req,ulsch->O);
// ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
-#ifdef DEBUG_DCI
+#ifdef UE_DEBUG_TRACE
- printf("Format 0 DCI : ulsch (ue): AbsSubframe %d.%d\n",proc->frame_rx%1024,subframe);
- printf("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
- printf("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb);
- printf("Format 0 DCI :ulsch (ue): rballoc %d\n",rballoc);
- printf("Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid);
- printf("Format 0 DCI :ulsch (ue): first_tx %d\n",ulsch->harq_processes[harq_pid]->first_tx);
- printf("Format 0 DCI :ulsch (ue): DCINdi %d\n",ulsch->harq_processes[harq_pid]->DCINdi);
- printf("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round);
- //printf("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS);
- printf("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs);
- //printf("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O);
- //printf("Format 0 DCI :ulsch (ue): cqiReq %d\n",cqi_req);
+ LOG_I(PHY,"Format 0 DCI : ulsch (ue): AbsSubframe %d.%d\n",proc->frame_rx%1024,subframe);
+ LOG_D(PHY,"Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): rballoc %d\n",rballoc);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): first_tx %d\n",ulsch->harq_processes[harq_pid]->first_tx);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): DCINdi %d\n",ulsch->harq_processes[harq_pid]->DCINdi);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round);
+ //LOG_I(PHY,"Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs);
+ //LOG_I(PHY,"Format 0 DCI :ulsch (ue): O %d\n",ulsch->O);
+ //LOG_I(PHY,"Format 0 DCI :ulsch (ue): cqiReq %d\n",cqi_req);
//if (frame_parms->frame_type == TDD)
- // printf("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai);
+ // LOG_I(PHY,"Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai);
//else
- // printf("Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK);
+ // LOG_I(PHY,"Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK);
- printf("Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch);
- printf("Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
- printf("Format 0 DCI :ulsch (ue): phich status %d\n",ulsch->harq_processes[harq_pid]->status);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
+ LOG_D(PHY,"Format 0 DCI :ulsch (ue): phich status %d\n",ulsch->harq_processes[harq_pid]->status);
#else
UNUSED_VARIABLE(dai);
#endif
@@ -9443,6 +7925,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
}
+/*
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
eNB_rxtx_proc_t *proc,
void *dci_pdu,
@@ -9495,7 +7978,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
TPC = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
mcs = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
rballoc = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type;
} else {
cqi_req = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req;
@@ -9503,10 +7986,10 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
TPC = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->TPC;
mcs = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs;
rballoc = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc;
- // hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping;
+ // hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping=hopping;
// type = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type;
}
-
+
RIV_max = RIV_max6;
ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT6[rballoc];
ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT6[rballoc];
@@ -9598,6 +8081,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
break;
}
+
rb_alloc = rballoc;
AssertFatal(rb_alloc>RIV_max,
"Format 0: rb_alloc (%d) > RIV_max (%d)\n",rb_alloc,RIV_max);
@@ -9612,13 +8096,13 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
if (cqi_req == 1) {
- /* 36.213 7.2.1 (release 10) says:
- * "RI is only reported for transmission modes 3 and 4,
- * as well as transmission modes 8 and 9 with PMI/RI reporting"
- * This is for aperiodic reporting.
- * TODO: deal with TM 8&9 correctly when they are implemented.
- * TODO: deal with periodic reporting if we implement it.
- */
+ // 36.213 7.2.1 (release 10) says:
+ // "RI is only reported for transmission modes 3 and 4,
+ // as well as transmission modes 8 and 9 with PMI/RI reporting"
+ // This is for aperiodic reporting.
+ // TODO: deal with TM 8&9 correctly when they are implemented.
+ // TODO: deal with periodic reporting if we implement it.
+ //
if (transmission_mode == 3 || transmission_mode == 4)
ulsch->harq_processes[harq_pid]->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table
else
@@ -10022,13 +8506,13 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
ulsch->harq_processes[harq_pid]->mcs = mcs;
// ulsch->harq_processes[harq_pid]->calibration_flag = 0;
//if (ulsch->harq_processes[harq_pid]->mcs)
- /*
- if (ulsch->harq_processes[harq_pid]->mcs == 29) {
- ulsch->harq_processes[harq_pid]->mcs = 4;
+ //
+ //if (ulsch->harq_processes[harq_pid]->mcs == 29) {
+ //ulsch->harq_processes[harq_pid]->mcs = 4;
// ulsch->harq_processes[harq_pid]->calibration_flag = 1;
// printf("Auto-Calibration (eNB): mcs %d, nb_rb %d\n",ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->nb_rb);
- }
- */
+ //}
+
ulsch->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1];
ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch->harq_processes[harq_pid]->nb_rb;
@@ -10073,14 +8557,14 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
}
}
-
+*/
double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe)
{
uint8_t transmission_mode = ue->transmission_mode[eNB_id];
PHY_MEASUREMENTS *meas = &ue->measurements;
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- int32_t **dl_channel_est = ue->common_vars.common_vars_rx_data_per_thread[subframe &0x1].dl_ch_estimates[eNB_id];
+ int32_t **dl_channel_est = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id];
double *s_dB;
s_dB = ue->sinr_CQI_dB;
// LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h
index 1799b386f9..9a1127b0e7 100755
--- a/openair1/PHY/LTE_TRANSPORT/defs.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs.h
@@ -96,7 +96,7 @@ typedef enum { SEARCH_EXIST=0,
SEARCH_EXIST_OR_FREE} find_type_t;
typedef enum {
- SCH_IDLE,
+ SCH_IDLE=0,
ACTIVE,
CBA_ACTIVE,
DISABLED
@@ -146,6 +146,8 @@ typedef struct {
uint32_t cqi_alloc2;
/// Current Number of RBs
uint16_t nb_rb;
+ /// Current NDI
+ uint8_t ndi;
/// downlink power offset field
uint8_t dl_power_off;
/// start symbold of pdsch
@@ -319,8 +321,8 @@ typedef struct {
uint8_t srs_active;
/// Pointers to 8 HARQ processes for the ULSCH
LTE_UL_UE_HARQ_t *harq_processes[8];
- /// Pointer to CQI data
- uint8_t o[MAX_CQI_BYTES];
+ /// Pointer to CQI data (+1 for 8 bits crc)
+ uint8_t o[1+MAX_CQI_BYTES];
/// Length of CQI data (bits)
uint8_t O;
/// Format of CQI data
@@ -398,14 +400,10 @@ typedef struct {
uint8_t subframe;
/// Frame for reception
uint32_t frame;
- /// Subframe cba scheduling indicator (i.e. CBA Transmission opportunity indicator)
- uint8_t subframe_cba_scheduling_flag;
/// PHICH active flag
uint8_t phich_active;
/// PHICH ACK
uint8_t phich_ACK;
- /// Last TPC command
- uint8_t TPC;
/// First Allocated RB
uint16_t first_rb;
/// First Allocated RB - previous scheduling
@@ -413,7 +411,9 @@ typedef struct {
/// is done after a new scheduling
uint16_t previous_first_rb;
/// Current Number of RBs
- uint16_t nb_rb;
+ uint16_t nb_rb;
+ /// Current Modulation order
+ uint8_t Qm;
/// Transport block size
uint32_t TBS;
/// The payload + CRC size in bits
@@ -466,10 +466,10 @@ typedef struct {
uint8_t Nsymb_pusch;
/// SRS active flag
uint8_t srs_active;
+ /// NDI
+ uint8_t ndi;
/// 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
uint8_t rvidx;
/// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
@@ -513,6 +513,9 @@ typedef enum {
pucch_format1=0,
pucch_format1a,
pucch_format1b,
+ pucch_format1b_csA2,
+ pucch_format1b_csA3,
+ pucch_format1b_csA4,
pucch_format2,
pucch_format2a,
pucch_format2b,
@@ -547,14 +550,26 @@ typedef struct {
uint16_t rnti;
/// Type (SR,HARQ,CQI,HARQ_SR,HARQ_CQI,SR_CQI,HARQ_SR_CQI)
UCI_type_t type;
+ /// SRS active flag
+ uint8_t srs_active;
/// PUCCH format to use
PUCCH_FMT_t pucch_fmt;
- /// antenna indicator
+ /// number of PUCCH antenna ports
+ uint8_t num_antenna_ports;
+ /// number of PUCCH resources
uint8_t num_pucch_resources;
- /// two antenna n1_pucch
- uint16_t n_pucch_1[2];
- /// two antenna n2_pucch
+ /// two antenna n1_pucch 1_0
+ uint16_t n_pucch_1[4][2];
+ /// two antenna n1_pucch 1_0 for SR
+ uint16_t n_pucch_1_0_sr[2];
+ /// two antenna n2_pucch
uint16_t n_pucch_2[2];
+ /// two antenna n3_pucch
+ uint16_t n_pucch_3[2];
+ /// TDD Bundling/multiplexing flag
+ uint8_t tdd_bundling;
+ /// Received Energy
+ uint32_t stat;
#ifdef Rel14
/// non BL/CE, CEmodeA, CEmodeB
UE_type_t ue_type;
@@ -573,7 +588,7 @@ typedef struct {
// Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.
uint8_t Nsrs;
#endif
-} LTE_eNB_UCI_t;
+} LTE_eNB_UCI;
typedef struct {
/// HARQ process mask, indicates which processes are currently active
@@ -847,7 +862,10 @@ typedef enum {
} RX_type_t;
-
+typedef enum {
+ DCI_COMMON_SPACE,
+ DCI_UE_SPACE
+} dci_space_t;
/**@}*/
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index 68f38398c7..383cb1cf8a 100755
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -610,6 +610,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
+
// Add 24-bit crc (polynomial A) to payload
crc = crc24a(a,
A)>>8;
@@ -709,6 +710,9 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
#endif
start_meas(rm_stats);
+#ifdef DEBUG_DLSCH_CODING
+ printf("rvidx in encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
+#endif
r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
G, //G
dlsch->harq_processes[harq_pid]->w[r],
@@ -779,7 +783,9 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
// if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
-
+#ifdef DEBUG_DLSCH_CODING
+ printf("SIC encoding thinks this is a new packet \n");
+#endif
/*
int i;
printf("dlsch (tx): \n");
@@ -886,6 +892,9 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
#endif
start_meas(rm_stats);
+#ifdef DEBUG_DLSCH_CODING
+ printf("rvidx in SIC encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
+#endif
r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
G, //G
dlsch->harq_processes[harq_pid]->w[r],
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
index 35b3bd3e3b..d23a7d7e21 100755
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
@@ -167,10 +167,11 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
uint8_t llr8_flag)
{
-
+#if UE_TIMING_TRACE
time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
time_stats_t *dlsch_deinterleaving_stats=&phy_vars_ue->dlsch_deinterleaving_stats;
+#endif
uint32_t A,E;
uint32_t G;
uint32_t ret,offset;
@@ -271,7 +272,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
return(max_turbo_iterations);
}*/
- /*harq_pid = dlsch->current_harq_pid[subframe&0x1];
+ /*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_turbo_iterations);
@@ -372,7 +373,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? harq_process->F : 0);
#endif
+#if UE_TIMING_TRACE
start_meas(dlsch_rate_unmatching_stats);
+#endif
memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short));
harq_process->RTC[r] = generate_dummy_w(4+(Kr_bytes*8),
(uint8_t*) &dummy_w[r][0],
@@ -390,7 +393,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
harq_process->round);
#endif
-//printf("dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
+#ifdef DEBUG_DLSCH_DECODING
+ printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
+#endif
if (lte_rate_matching_turbo_rx(harq_process->RTC[r],
G,
harq_process->w[r],
@@ -406,12 +411,17 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
harq_process->Nl,
r,
&E)==-1) {
+#if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats);
+#endif
LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
return(dlsch->max_turbo_iterations);
} else
+ {
+#if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats);
-
+#endif
+ }
r_offset += E;
/*
@@ -419,13 +429,16 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
harq_process->d[r],
harq_process->w);
*/
+#if UE_TIMING_TRACE
start_meas(dlsch_deinterleaving_stats);
+#endif
sub_block_deinterleaving_turbo(4+Kr,
&harq_process->d[r][96],
harq_process->w[r]);
+#if UE_TIMING_TRACE
stop_meas(dlsch_deinterleaving_stats);
-
+#endif
#ifdef DEBUG_DLSCH_DECODING
/*
if (r==0) {
@@ -470,8 +483,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
}
-
- start_meas(dlsch_turbo_decoding_stats);
+#if UE_TIMING_TRACE
+ start_meas(dlsch_turbo_decoding_stats);
+#endif
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],
@@ -490,14 +504,17 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
-
+#if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats);
+#endif
}
#else
if ((harq_process->C == 1) ||
((r==harq_process->C-1) && (skipped_last==0))) { // last segment with odd number of segments
- start_meas(dlsch_turbo_decoding_stats);
+#if UE_TIMING_TRACE
+ start_meas(dlsch_turbo_decoding_stats);
+#endif
ret = tc
(&harq_process->d[r][96],
harq_process->c[r],
@@ -514,7 +531,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
+ #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats);
+#endif
// printf("single decode, exit\n");
// exit(-1);
}
@@ -531,7 +550,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
#ifdef DEBUG_DLSCH_DECODING
printf("single decoding segment %d (%p)\n",r-1,&harq_process->d[r-1][96]);
#endif
+#if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats);
+#endif
#ifdef DEBUG_DLSCH_DECODING
printf("double decoding segments %d,%d (%p,%p)\n",r-1,r,&harq_process->d[r-1][96],&harq_process->d[r][96]);
#endif
@@ -572,10 +593,14 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
exit(-1);*/
- stop_meas(dlsch_turbo_decoding_stats);
+#if UE_TIMING_TRACE
+ stop_meas(dlsch_turbo_decoding_stats);
+#endif
}
else { // Kr_last != Kr
+#if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats);
+#endif
ret = tc
(&harq_process->d[r-1][96],
harq_process->c[r-1],
@@ -592,9 +617,12 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
- stop_meas(dlsch_turbo_decoding_stats);
+#if UE_TIMING_TRACE
+ stop_meas(dlsch_turbo_decoding_stats);
start_meas(dlsch_turbo_decoding_stats);
+#endif
+
ret = tc
(&harq_process->d[r][96],
harq_process->c[r],
@@ -611,6 +639,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
+
+#if UE_TIMING_TRACE
+
stop_meas(dlsch_turbo_decoding_stats);
/*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n",
@@ -619,7 +650,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0),
dlsch_deinterleaving_stats->p_time/(cpuf*1000.0),
dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/
-
+#endif
}
}
}
@@ -641,9 +672,10 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
frame_rx_prev = frame_rx_prev%1024;
if (err_flag == 1) {
- //LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
- // phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
-
+#if UE_DEBUG_TRACE
+ LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
+ phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
+#endif
dlsch->harq_ack[subframe].ack = 0;
dlsch->harq_ack[subframe].harq_id = harq_pid;
dlsch->harq_ack[subframe].send_harq_status = 1;
@@ -664,9 +696,10 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
return((1+dlsch->max_turbo_iterations));
} else {
-
- //LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d harq_process->mcs %d harq_process->nb_rb %d\n",
- //phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
+#if UE_DEBUG_TRACE
+ LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d\n",
+ phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
+#endif
harq_process->status = SCH_IDLE;
harq_process->round = 0;
@@ -928,10 +961,9 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break;
case PDSCH: // TB0
- dlsch_ue = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0];
+ dlsch_ue = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0];
harq_pid = dlsch_ue->current_harq_pid;
-
- ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->pdcch_vars[0][(uint32_t)eNB_id]->crnti,RC.eNB[eNB_id2][CC_id]);
+ ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][(uint32_t)eNB_id]->crnti,RC.eNB[eNB_id2][CC_id]);
DevAssert( ue_id != (uint32_t)-1 );
dlsch_eNB = RC.eNB[eNB_id2][CC_id]->dlsch[ue_id][0];
@@ -975,9 +1007,10 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break;
case PDSCH1: { // TB1
- dlsch_ue = phy_vars_ue->dlsch[subframe&0x1][eNB_id][1];
+ dlsch_ue = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1];
harq_pid = dlsch_ue->current_harq_pid;
- int8_t UE_id = find_ue( phy_vars_ue->pdcch_vars[0][eNB_id]->crnti, RC.eNB[eNB_id2][CC_id] );
+ int8_t UE_id = find_ue( phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->crnti, RC.eNB[eNB_id2][CC_id] );
+
DevAssert( UE_id != -1 );
dlsch_eNB = RC.eNB[eNB_id2][CC_id]->dlsch[UE_id][1];
// reset HARQ
@@ -1029,7 +1062,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break;
default:
- dlsch_ue = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0];
+ dlsch_ue = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0];
LOG_E(PHY,"dlsch_decoding_emul: FATAL, unknown DLSCH_id %d\n",dlsch_id);
dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations;
return(1+dlsch_ue->max_turbo_iterations);
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
index 489b6bbfcb..dfd2b2af5f 100755
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
@@ -48,6 +48,7 @@
* default value: 0
*/
int16_t dlsch_demod_shift = 0;
+int16_t interf_unaw_shift = 13;
//#define DEBUG_HARQ
@@ -61,9 +62,6 @@ int16_t dlsch_demod_shift = 0;
// [MCS][i_mod (0,1,2) = (2,4,6)]
unsigned char offset_mumimo_llr_drange_fix=0;
-uint8_t interf_unaw_shift0=0;
-uint8_t interf_unaw_shift1=0;
-uint8_t interf_unaw_shift=0;
//inferference-free case
unsigned char interf_unaw_shift_tm4_mcs[29]={5, 3, 4, 3, 3, 2, 1, 1, 2, 0, 1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 0, 0} ;
@@ -113,10 +111,14 @@ int rx_pdsch(PHY_VARS_UE *ue,
int avg_0[2];
int avg_1[2];
+#if UE_TIMING_TRACE
+ uint8_t slot = 0;
+#endif
+
unsigned char aatx,aarx;
unsigned short nb_rb = 0, round;
- int avgs, rb;
+ int avgs = 0, rb;
LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0;
uint8_t beamforming_mode;
@@ -145,8 +147,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
break;
case PDSCH:
- pdsch_vars = ue->pdsch_vars[subframe&0x1];
- dlsch = ue->dlsch[subframe&0x1][eNB_id];
+ pdsch_vars = ue->pdsch_vars[ue->current_thread_id[subframe]];
+ dlsch = ue->dlsch[ue->current_thread_id[subframe]][eNB_id];
+ //printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status);
LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n",
frame,subframe,symbol,harq_pid,
dlsch[0]->harq_processes[harq_pid]->status,
@@ -158,6 +161,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword;
dlsch0_harq = dlsch[codeword_TB0]->harq_processes[harq_pid];
dlsch1_harq = dlsch[codeword_TB1]->harq_processes[harq_pid];
+#ifdef DEBUG_HARQ
+ printf("[DEMOD] I am assuming both TBs are active\n");
+#endif
}
else if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) &&
(dlsch[1]->harq_processes[harq_pid]->status != ACTIVE) ) {
@@ -165,6 +171,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
dlsch1_harq = NULL;
codeword_TB1 = -1;
+#ifdef DEBUG_HARQ
+ printf("[DEMOD] I am assuming only TB0 is active\n");
+#endif
}
else if ((dlsch[0]->harq_processes[harq_pid]->status != ACTIVE) &&
(dlsch[1]->harq_processes[harq_pid]->status == ACTIVE) ){
@@ -172,6 +181,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
dlsch0_harq = dlsch[1]->harq_processes[harq_pid];
dlsch1_harq = NULL;
codeword_TB0 = -1;
+#ifdef DEBUG_HARQ
+ printf("[DEMOD] I am assuming only TB1 is active, it is in cw %d\n", dlsch0_harq->codeword);
+#endif
}
else {
LOG_E(PHY,"[UE][FATAL] Frame %d subframe %d: no active DLSCH\n",ue->proc.proc_rxtx[0].frame_rx,subframe);
@@ -192,6 +204,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
DevAssert(dlsch0_harq);
round = dlsch0_harq->round;
+ //printf("round = %d\n", round);
if (eNB_id > 2) {
LOG_W(PHY,"dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id);
@@ -231,7 +244,6 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
-
if ((dlsch0_harq->mimo_mode==LARGE_CDD) || ((dlsch0_harq->mimo_mode>=DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->mimo_mode<=DUALSTREAM_PUSCH_PRECODING))) {
DevAssert(dlsch1_harq);
if (eNB_id!=eNB_id_i) {
@@ -240,13 +252,27 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
}
+#if UE_TIMING_TRACE
+ if(symbol > ue->frame_parms.symbols_per_tti>>1)
+ {
+ slot = 1;
+ }
+#endif
+
+#ifdef DEBUG_HARQ
+ printf("Demod dlsch0_harq->pmi_alloc %d\n", dlsch0_harq->pmi_alloc);
+#endif
+
if (frame_parms->nb_antenna_ports_eNB>1 && beamforming_mode==0) {
#ifdef DEBUG_DLSCH_MOD
LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0],dlsch0_harq->rb_alloc_even[0]);
#endif
- nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
+#if UE_TIMING_TRACE
+ start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#endif
+ nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
@@ -266,8 +292,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
if (rx_type >= rx_IC_single_stream) {
if (eNB_id_in_connected_eNB) // we are in TM5
- nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id_i],
+ nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i],
pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
@@ -279,8 +305,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
frame_parms,
dlsch0_harq->mimo_mode);
else
- nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
+ nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
@@ -293,8 +319,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
dlsch0_harq->mimo_mode);
}
} else if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0
- nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
+ nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
@@ -307,8 +333,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
if (rx_type==rx_IC_single_stream) {
if (eNB_id_in_connected_eNB)
- nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id_i],
+ nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i],
pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
@@ -319,8 +345,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
ue->high_speed_flag,
frame_parms);
else
- nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
+ nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
@@ -332,7 +358,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
frame_parms);
}
} else if (beamforming_mode==7) { //else if beamforming_mode == 7
- nb_rb = dlsch_extract_rbs_TM7(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
+ nb_rb = dlsch_extract_rbs_TM7(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
pdsch_vars[eNB_id]->dl_bf_ch_estimates,
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
@@ -353,11 +379,21 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
-#ifdef DEBUG_PHY
- LOG_D(PHY,"[DLSCH] nb_rb %d log2_maxh = %d (%d,%d)\n",nb_rb,pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs);
- LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
+#if UE_TIMING_TRACE
+ stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#if DISABLE_LOG_X
+ printf("[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,subframe,slot,
+ symbol,ue->high_speed_flag,type,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#else
+ LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,subframe,slot,symbol,
+ ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#endif
#endif
+
+#if UE_TIMING_TRACE
+ start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#endif
aatx = frame_parms->nb_antenna_ports_eNB;
aarx = frame_parms->nb_antennas_rx;
@@ -380,6 +416,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
nb_rb);
}
+#if UE_TIMING_TRACE
+ stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#if DISABLE_LOG_X
+ printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#else
+ LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#endif
+#endif
+
+#if UE_TIMING_TRACE
+ start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#endif
if (first_symbol_flag==1) {
if (beamforming_mode==0){
if (dlsch0_harq->mimo_modemimo_mode);
- LOG_D(PHY,"Channel Level TM34 avg_0 %d, avg_1 %d, rx_type %d, rx_standard %d, interf_unaw_shift %d \n", avg_0[0],
- avg_1[0], rx_type, rx_standard, interf_unaw_shift);
+ LOG_D(PHY,"Channel Level TM34 avg_0 %d, avg_1 %d, rx_type %d, rx_standard %d, dlsch_demod_shift %d \n", avg_0[0],
+ avg_1[0], rx_type, rx_standard, dlsch_demod_shift);
if (rx_type>rx_standard) {
avg_0[0] = (log2_approx(avg_0[0])/2) + dlsch_demod_shift;// + 2 ;//+ 4;
avg_1[0] = (log2_approx(avg_1[0])/2) + dlsch_demod_shift;// + 2 ;//+ 4;
pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
- //printf("TM4 I-A log2_maxh0 = %d\n", pdsch_vars[eNB_id]->log2_maxh0);
- //printf("TM4 I-A log2_maxh1 = %d\n", pdsch_vars[eNB_id]->log2_maxh1);
+ // printf("dlsch_demod_shift %d\n", dlsch_demod_shift);
}
else {
avg_0[0] = (log2_approx(avg_0[0])/2) - 13 + interf_unaw_shift;
avg_1[0] = (log2_approx(avg_1[0])/2) - 13 + interf_unaw_shift;
pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
- //printf("TM4 I-UA log2_maxh0 = %d\n", pdsch_vars[eNB_id]->log2_maxh0);
- //printf("TM4 I-UA log2_maxh1 = %d\n", pdsch_vars[eNB_id]->log2_maxh1);
}
}
else if (dlsch0_harq->mimo_modelog2_maxh,
pdsch_vars[eNB_id]->log2_maxh0,
pdsch_vars[eNB_id]->log2_maxh1,
avg[0],avgs);
- LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
+ //LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
#endif
+
+ //wait until pdcch is decoded
+ //proc->channel_level = 1;
}
+ /*
+ uint32_t wait = 0;
+ while(proc->channel_level == 0)
+ {
+ usleep(1);
+ wait++;
+ }
+ */
+
#if T_TRACER
if (type == PDSCH)
{
- T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(subframe),
- T_INT(avg[0]), T_INT(avg[1]), T_INT(avg[2]), T_INT(avg[3]));
+ T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(frame%1024), T_INT(subframe),
+ T_INT(avg[0]), T_INT(avg[1]), T_INT(avg[2]), T_INT(avg[3]));
}
#endif
+#if UE_TIMING_TRACE
+ stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#if DISABLE_LOG_X
+ printf("[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,subframe,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#else
+ LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,subframe,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#endif
+#endif
+
+
+#if UE_TIMING_TRACE
+ start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#endif
// Now channel compensation
if (dlsch0_harq->mimo_moderxdataF_ext,
@@ -677,8 +747,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
measurements); // log2_maxh+I0_shift
}
+#if UE_TIMING_TRACE
+ stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#if DISABLE_LOG_X
+ printf("[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,subframe,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#else
+ LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,subframe,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#endif
+#endif
// MRC
-
+#if UE_TIMING_TRACE
+ start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#endif
if (frame_parms->nb_antennas_rx > 1) {
if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
@@ -746,19 +826,59 @@ int rx_pdsch(PHY_VARS_UE *ue,
//i_mod should have been passed as a parameter
}
+#if UE_TIMING_TRACE
+ stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#if DISABLE_LOG_X
+ printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#else
+ LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#endif
+#endif
+
+#if UE_TIMING_TRACE
+ start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#endif
//printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol);
+ // compute LLRs
+ // -> // compute @pointer where llrs should filled for this ofdm-symbol
+ int8_t *pllr_symbol_cw0;
+ int8_t *pllr_symbol_cw1;
+ uint32_t llr_offset_symbol;
+ llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol];
+ pllr_symbol_cw0 = (int8_t*)pdsch_vars[eNB_id]->llr[0];
+ pllr_symbol_cw1 = (int8_t*)pdsch_vars[eNB_id]->llr[1];
+ pllr_symbol_cw0 += llr_offset_symbol;
+ pllr_symbol_cw1 += llr_offset_symbol;
+
+ /*LOG_I(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x\n",
+ proc->frame_rx, proc->subframe_rx,symbol,
+ nb_rb,dlsch0_harq->Qm,
+ pdsch_vars[eNB_id]->llr_length[symbol],
+ pdsch_vars[eNB_id]->llr_offset[symbol],
+ (int16_t*)pdsch_vars[eNB_id]->llr[0],
+ pllr_symbol);*/
switch (dlsch0_harq->Qm) {
case 2 :
- if ((rx_type==rx_standard) || (codeword_TB0 == -1) || (codeword_TB1 == -1)) {
+ if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
dlsch_qpsk_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[0],
+ (int16_t*)pllr_symbol_cw0,
+ symbol,
+ first_symbol_flag,
+ nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
+ beamforming_mode);
+
+ } else if (codeword_TB0 == -1){
+
+ dlsch_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ (int16_t*)pllr_symbol_cw1,
symbol,
first_symbol_flag,
nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128,
beamforming_mode);
}
else if (rx_type >= rx_IC_single_stream) {
@@ -829,7 +949,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
break;
case 4 :
- if ((rx_type==rx_standard ) || (codeword_TB0 == -1) || (codeword_TB1 == -1)) {
+ if ((rx_type==rx_standard ) || (codeword_TB1 == -1)) {
dlsch_16qam_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->llr[0],
@@ -838,6 +958,15 @@ int rx_pdsch(PHY_VARS_UE *ue,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
pdsch_vars[eNB_id]->llr128,
beamforming_mode);
+ } else if (codeword_TB0 == -1){
+ dlsch_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->llr[1],
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream,
+ beamforming_mode);
}
else if (rx_type >= rx_IC_single_stream) {
if (dlsch1_harq->Qm == 2) {
@@ -913,17 +1042,25 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
break;
case 6 :
- //printf("LLR rx_type %d cw0 %d cw1 %d symbol %d first symbol %d nb_rb %d rballoceven %d sfn %d beamforming_mode %d\n",
- // rx_type,codeword_TB0,codeword_TB1,symbol,first_symbol_flag,nb_rb,dlsch0_harq->rb_alloc_even,subframe,beamforming_mode);
- if ((rx_type==rx_standard) || (codeword_TB0 == -1) || (codeword_TB1 == -1)) {
+ if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
dlsch_64qam_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[0],
+ (int16_t*)pllr_symbol_cw0,
pdsch_vars[eNB_id]->dl_ch_mag0,
pdsch_vars[eNB_id]->dl_ch_magb0,
symbol,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
- pdsch_vars[eNB_id]->llr128,
+ pdsch_vars[eNB_id]->llr_offset[symbol],
+ beamforming_mode);
+ } else if (codeword_TB0 == -1){
+ dlsch_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ (int16_t*)pllr_symbol_cw1,
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_magb0,
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
+ pdsch_vars[eNB_id]->llr_offset[symbol],
beamforming_mode);
}
else if (rx_type >= rx_IC_single_stream) {
@@ -980,10 +1117,10 @@ int rx_pdsch(PHY_VARS_UE *ue,
pdsch_vars[eNB_id]->dl_ch_mag0,
dl_ch_mag_ptr,//i
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->llr[0],
+ (int16_t*)pllr_symbol_cw0,
symbol,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
+ pdsch_vars[eNB_id]->llr_offset[symbol]);
if (rx_type==rx_IC_dual_stream) {
dlsch_64qam_64qam_llr(frame_parms,
rxdataF_comp_ptr,
@@ -991,10 +1128,10 @@ int rx_pdsch(PHY_VARS_UE *ue,
dl_ch_mag_ptr,
pdsch_vars[eNB_id]->dl_ch_mag0,//i
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->llr[1],
+ (int16_t*)pllr_symbol_cw1,
symbol,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
+ pdsch_vars[eNB_id]->llr_offset[symbol]);
}
}
}
@@ -1010,10 +1147,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
if (rx_type==rx_standard) {
dlsch_qpsk_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[0],
+ (int16_t*)pllr_symbol_cw0,
symbol,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128,
beamforming_mode);
}
break;
@@ -1033,12 +1169,12 @@ int rx_pdsch(PHY_VARS_UE *ue,
if (rx_type==rx_standard) {
dlsch_64qam_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[0],
+ (int16_t*)pllr_symbol_cw0,
pdsch_vars[eNB_id]->dl_ch_mag0,
pdsch_vars[eNB_id]->dl_ch_magb0,
symbol,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
- pdsch_vars[eNB_id]->llr128,
+ pdsch_vars[eNB_id]->llr_offset[symbol],
beamforming_mode);
}
break;
@@ -1049,6 +1185,14 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
}
+#if UE_TIMING_TRACE
+ stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
+#if DISABLE_LOG_X
+ printf("[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#else
+ LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
+#endif
+#endif
// Please keep it: useful for debugging
#if 0
if( (symbol == 13) && (subframe==0) && (dlsch0_harq->Qm == 6) /*&& (nb_rb==25)*/)
@@ -1057,12 +1201,12 @@ int rx_pdsch(PHY_VARS_UE *ue,
if(1)
{
#if 1
- write_output("rxdataF0.m" , "rxdataF0", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
- //write_output("rxdataF1.m" , "rxdataF1", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
- write_output("dl_ch_estimates00.m", "dl_ch_estimates00", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0],14*frame_parms->ofdm_symbol_size,1,1);
- //write_output("dl_ch_estimates01.m", "dl_ch_estimates01", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0],14*frame_parms->ofdm_symbol_size,1,1);
- //write_output("dl_ch_estimates10.m", "dl_ch_estimates10", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0],14*frame_parms->ofdm_symbol_size,1,1);
- //write_output("dl_ch_estimates11.m", "dl_ch_estimates11", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0],14*frame_parms->ofdm_symbol_size,1,1);
+ write_output("rxdataF0.m" , "rxdataF0", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
+ //write_output("rxdataF1.m" , "rxdataF1", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
+ write_output("dl_ch_estimates00.m", "dl_ch_estimates00", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0],14*frame_parms->ofdm_symbol_size,1,1);
+ //write_output("dl_ch_estimates01.m", "dl_ch_estimates01", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0],14*frame_parms->ofdm_symbol_size,1,1);
+ //write_output("dl_ch_estimates10.m", "dl_ch_estimates10", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0],14*frame_parms->ofdm_symbol_size,1,1);
+ //write_output("dl_ch_estimates11.m", "dl_ch_estimates11", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("rxdataF_ext00.m" , "rxdataF_ext00", &pdsch_vars[eNB_id]->rxdataF_ext[0][0],14*frame_parms->N_RB_DL*12,1,1);
@@ -1088,16 +1232,13 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
#endif
-#if T_TRACER
- T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(frame%1024),
+ T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(frame%1024),
T_INT(subframe), T_INT(nb_rb),
T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti),
T_BUFFER(&pdsch_vars[eNB_id]->rxdataF_comp0[eNB_id][0],
2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_tti*2));
-#endif
-
- return(0);
+ return 0;
}
//==============================================================================================
@@ -3327,9 +3468,9 @@ void dlsch_scale_channel(int **dl_ch_estimates_ext,
// Determine scaling amplitude based the symbol
-ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
-
- LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d\n",symbol_mod,ch_amp,pilots,nb_rb,frame_parms->Ncp,symbol);
+ ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
+
+ LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d\n",symbol_mod,ch_amp,pilots,nb_rb,frame_parms->Ncp,symbol);
// printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13
@@ -3377,7 +3518,7 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
short rb;
unsigned char aatx,aarx,nre=12,symbol_mod;
- __m128i *dl_ch128, avg128D, coeff128;
+ __m128i *dl_ch128, avg128D;
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
@@ -3388,11 +3529,10 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
else
nre=12;
- double one_over_nb_re = 0.0;
- one_over_nb_re = 1/((double)(nb_rb*nre));
- int16_t one_over_nb_re_q1_15 = (int16_t)(one_over_nb_re * (double)(1<<15) );
- coeff128 = _mm_set_epi16(one_over_nb_re_q1_15,one_over_nb_re_q1_15,one_over_nb_re_q1_15,one_over_nb_re_q1_15,
- one_over_nb_re_q1_15,one_over_nb_re_q1_15,one_over_nb_re_q1_15,one_over_nb_re_q1_15);
+ //nb_rb*nre = y * 2^x
+ int16_t x = factor2(nb_rb*nre);
+ int16_t y = (nb_rb*nre)>>x;
+ //printf("nb_rb*nre = %d = %d * 2^(%d)\n",nb_rb*nre,y,x);
for (aatx=0; aatxnb_antenna_ports_eNB; aatx++)
for (aarx=0; aarxnb_antennas_rx; aarx++) {
@@ -3405,14 +3545,18 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
for (rb=0;rbNcp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) {
dl_ch128+=2;
}
else {
- avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[2], coeff128),15)));
+ avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[2],dl_ch128[2]),x));
+ //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[2], coeff128),15)));
dl_ch128+=3;
}
/*
@@ -3427,7 +3571,7 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
avg[(aatx<<1)+aarx] =(((int32_t*)&avg128D)[0] +
((int32_t*)&avg128D)[1] +
((int32_t*)&avg128D)[2] +
- ((int32_t*)&avg128D)[3]);
+ ((int32_t*)&avg128D)[3])/y;
// printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
}
@@ -4604,7 +4748,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
unsigned char subframe,
uint32_t high_speed_flag,
LTE_DL_FRAME_PARMS *frame_parms,
- MIMO_mode_t mimo_mode) {
+ MIMO_mode_t mimo_mode) {
int prb,nb_rb=0;
int prb_off,prb_off2;
@@ -5894,50 +6038,50 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,unsigned int *c
sprintf(fname,"dlsch%d_rxF_r%d_ext0.m",eNB_id,round);
sprintf(vname,"dl%d_rxF_r%d_ext0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1);
if (ue->frame_parms.nb_antennas_rx >1) {
sprintf(fname,"dlsch%d_rxF_r%d_ext1.m",eNB_id,round);
sprintf(vname,"dl%d_rxF_r%d_ext1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1);
}
sprintf(fname,"dlsch%d_ch_r%d_ext00.m",eNB_id,round);
sprintf(vname,"dl%d_ch_r%d_ext00",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
if (ue->transmission_mode[eNB_id]==7){
sprintf(fname,"dlsch%d_bf_ch_r%d.m",eNB_id,round);
sprintf(vname,"dl%d_bf_ch_r%d",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1);
//write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512,1,1);
sprintf(fname,"dlsch%d_bf_ch_r%d_ext00.m",eNB_id,round);
sprintf(vname,"dl%d_bf_ch_r%d_ext00",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
}
if (ue->frame_parms.nb_antennas_rx == 2) {
sprintf(fname,"dlsch%d_ch_r%d_ext01.m",eNB_id,round);
sprintf(vname,"dl%d_ch_r%d_ext01",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
}
if (ue->frame_parms.nb_antenna_ports_eNB == 2) {
sprintf(fname,"dlsch%d_ch_r%d_ext10.m",eNB_id,round);
sprintf(vname,"dl%d_ch_r%d_ext10",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
if (ue->frame_parms.nb_antennas_rx == 2) {
sprintf(fname,"dlsch%d_ch_r%d_ext11.m",eNB_id,round);
sprintf(vname,"dl%d_ch_r%d_ext11",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
}
}
sprintf(fname,"dlsch%d_rxF_r%d_uespec0.m",eNB_id,round);
sprintf(vname,"dl%d_rxF_r%d_uespec0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1);
/*
write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
@@ -5947,31 +6091,31 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,unsigned int *c
sprintf(fname,"dlsch%d_r%d_rho.m",eNB_id,round);
sprintf(vname,"dl_rho_r%d_%d",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_rho_ext[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
sprintf(fname,"dlsch%d_r%d_rho2.m",eNB_id,round);
sprintf(vname,"dl_rho2_r%d_%d",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1);
sprintf(fname,"dlsch%d_rxF_r%d_comp0.m",eNB_id,round);
sprintf(vname,"dl%d_rxF_r%d_comp0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1);
if (ue->frame_parms.nb_antenna_ports_eNB == 2) {
sprintf(fname,"dlsch%d_rxF_r%d_comp1.m",eNB_id,round);
sprintf(vname,"dl%d_rxF_r%d_comp1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
}
sprintf(fname,"dlsch%d_rxF_r%d_llr.m",eNB_id,round);
sprintf(vname,"dl%d_r%d_llr",eNB_id,round);
- write_output(fname,vname, ue->pdsch_vars[subframe&0x1][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0);
+ write_output(fname,vname, ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0);
sprintf(fname,"dlsch%d_r%d_mag1.m",eNB_id,round);
sprintf(vname,"dl%d_r%d_mag1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1);
sprintf(fname,"dlsch%d_r%d_mag2.m",eNB_id,round);
sprintf(vname,"dl%d_r%d_mag2",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1);
// printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh);
}
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
index ce9afa767f..26c76c5531 100755
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
@@ -636,7 +636,6 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint16_t pbch_pss_sss_adjust,
- int16_t **llr32p,
uint8_t beamforming_mode)
{
@@ -645,12 +644,14 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
int i,len;
uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
+ /*
if (first_symbol_flag==1) {
llr32 = (uint32_t*)dlsch_llr;
} else {
llr32 = (uint32_t*)(*llr32p);
- }
+ }*/
+ llr32 = (uint32_t*)dlsch_llr;
if (!llr32) {
LOG_E(PHY,"dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32);
return(-1);
@@ -672,6 +673,13 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
//printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
+ /*LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / FirstSym %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n",
+ symbol,
+ first_symbol_flag,
+ len,
+ dlsch_llr,
+ llr32);*/
+
//printf("ll32p=%p , dlsch_llr=%p, symbol=%d, flag=%d \n", llr32, dlsch_llr, symbol, first_symbol_flag);
for (i=0; iN_RB_DL*12];
@@ -726,7 +733,7 @@ int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
amp_tmp=0x1fff;//1.5*dlsch0->sqrt_rho_a; already taken into account
if (mod_order_0==6)
- amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation to avoid overflow
+ amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation
pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,2,subframe,symbol);
@@ -933,10 +940,8 @@ void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms,
int32_t **dl_ch_mag,
uint16_t nb_rb,
uint8_t subframe,
- uint32_t rb_alloc,
uint16_t mod_order_0,
- LTE_UE_DLSCH_t *dlsch0
- )
+ uint32_t rb_alloc)
{
int16_t rho_amp_x0[2*frame_parms->N_RB_DL*12];
int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12];
@@ -1043,7 +1048,8 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint16_t pbch_pss_sss_adjust,
- int16_t **llr_save,
+ //int16_t **llr_save,
+ uint32_t llr_offset,
uint8_t beamforming_mode)
{
#if defined(__x86_64__) || defined(__i386__)
@@ -1057,11 +1063,18 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
unsigned char symbol_mod,len_mod4;
short *llr;
int16_t *llr2;
+ int8_t *pllr_symbol;
+ /*
if (first_symbol_flag==1)
llr = dlsch_llr;
else
llr = *llr_save;
+ */
+ llr = dlsch_llr;
+
+ pllr_symbol = (int8_t*)dlsch_llr;
+ pllr_symbol += llr_offset;
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
@@ -1085,6 +1098,15 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
len = (nb_rb*12) - pbch_pss_sss_adjust;
}
+// printf("dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
+
+/* LOG_I(PHY,"dlsch_64qam_llr [symb %d / FirstSym %d / Length %d]: @LLR Buff %x \n",
+ symbol,
+ first_symbol_flag,
+ len,
+ dlsch_llr,
+ pllr_symbol);*/
+
llr2 = llr;
llr += (len*6);
@@ -1179,7 +1201,6 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
}
- *llr_save = llr;
#if defined(__x86_64__) || defined(__i386__)
_mm_empty();
_m_empty();
@@ -1197,10 +1218,8 @@ void dlsch_64qam_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
int32_t **dl_ch_magb,
uint16_t nb_rb,
uint8_t subframe,
- uint32_t rb_alloc,
uint16_t mod_order_0,
- LTE_UE_DLSCH_t *dlsch0
- )
+ uint32_t rb_alloc)
{
int16_t rho_amp_x0[2*frame_parms->N_RB_DL*12];
int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12];
@@ -8772,7 +8791,8 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
+ //int16_t **llr16p,
+ uint32_t llr_offset)
{
int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
@@ -8781,18 +8801,22 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
int16_t *llr16;
+ int8_t *pllr_symbol; // pointer where llrs should filled for this ofdm symbol
int len;
uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
//first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
+ /*if (first_symbol_flag == 1) {
llr16 = (int16_t*)dlsch_llr;
} else {
llr16 = (int16_t*)(*llr16p);
- }
+ }*/
+
+ llr16 = (int16_t*)dlsch_llr;
AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
+
if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
// if symbol has pilots
if (frame_parms->nb_antenna_ports_eNB!=1)
@@ -8806,6 +8830,18 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
len = (nb_rb*12) - pbch_pss_sss_adjust;
}
+ pllr_symbol = (int8_t*)dlsch_llr;
+ pllr_symbol += llr_offset;
+ //printf("dlsch_64qam_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
+ /*LOG_I(PHY,"dlsch_64qam_64qam_llr [symb %d / FirstSym %d / Length %d / LLR Offset %d]: @LLR Buff %x, @LLR Buff(symb) %x, , @Compute LLR Buff(symb) %x \n",
+ symbol,
+ first_symbol_flag,
+ len,
+ llr_offset,
+ (int16_t*)dlsch_llr,
+ llr16,
+ pllr_symbol);*/
+
#ifdef __AVX2__
// Round length up to multiple of 16 words
@@ -8839,6 +8875,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
(int32_t *) rho_256i,
len);
#endif
+
free16(rxF_256i, sizeof(rxF_256i));
free16(rxF_i_256i, sizeof(rxF_i_256i));
free16(ch_mag_256i, sizeof(ch_mag_256i));
@@ -8856,6 +8893,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
#endif
llr16 += (6*len);
- *llr16p = (short *)llr16;
+ //*llr16p = (short *)llr16;
+
return(0);
}
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
index 85e0157827..56175c89d8 100755
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
@@ -123,7 +123,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
}
#ifdef DEBUG_SCRAMBLING
- printf("scrambling: rnti %x, q %d, Ns %d, Nid_cell %d, length %d\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell, G);
+ printf("scrambling: i0 %d rnti %x, q %d, Ns %d, Nid_cell %d, G %d x2 %x\n",dlsch->i0,dlsch->rnti,q,Ns,frame_parms->Nid_cell, G, x2);
#endif
s = lte_gold_scram(&x1, &x2, 1);
@@ -205,7 +205,7 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
x2 = ((Ns>>1)<<9) + frame_parms->Nid_cell_mbsfn; //this is c_init in 36.211 Sec 6.3.1
#ifdef DEBUG_SCRAMBLING
- printf("unscrambling: rnti %x, q %d, Ns %d, Nid_cell %d length %d\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell,G);
+ printf("unscrambling: rnti %x, q %d, Ns %d, Nid_cell %d G %d, x2 %x\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell,G,x2);
#endif
s = lte_gold_scram(&x1, &x2, 1);
diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c
index 170ca4ce76..861a25fabb 100755
--- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c
@@ -87,7 +87,7 @@ int generate_drs_pusch(PHY_VARS_UE *ue,
if (Msc_idx_ptr)
Msc_RS_idx = Msc_idx_ptr - dftsizes;
else {
- printf("generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS);
+ LOG_I(PHY,"generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS);
return(-1);
}
diff --git a/openair1/PHY/LTE_TRANSPORT/extern.h b/openair1/PHY/LTE_TRANSPORT/extern.h
index 88c034e9db..af4dc20df6 100755
--- a/openair1/PHY/LTE_TRANSPORT/extern.h
+++ b/openair1/PHY/LTE_TRANSPORT/extern.h
@@ -23,6 +23,8 @@ extern unsigned int dlsch_tbs25[27][25],TBStable[27][110],TBStable1C[32];
extern unsigned short lte_cqi_eff1024[16];
extern char lte_cqi_snr_dB[15];
extern short conjugate[8],conjugate2[8];
+extern short minus_one[8];
+extern short minus_one[8];
extern short *ul_ref_sigs[30][2][33];
extern short *ul_ref_sigs_rx[30][2][33];
extern unsigned short dftsizes[33];
diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c
index 1c77083deb..6024f859c9 100755
--- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c
@@ -200,14 +200,14 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type) {
if (packet_type > IF4p5_PRACH)
rxF = &prach_rxsigF_br[packet_type - IF4p5_PRACH - 1][0][0];
else
-#else
+#endif
rxF = &prach_rxsigF[0][0];
-#endif
+ AssertFatal(rxF!=NULL,"rxF is null\n");
if (eth->flags == ETH_RAW_IF4p5_MODE) {
- memcpy((void *)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t),
- (void*)rxF,
- PRACH_BLOCK_SIZE_BYTES);
+ memcpy((void *)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t),
+ (void*)rxF,
+ PRACH_BLOCK_SIZE_BYTES);
} else {
memcpy((void *)(tx_buffer_prach + sizeof_IF4p5_header_t),
(void *)rxF,
@@ -335,13 +335,14 @@ void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint
if (*packet_type > IF4p5_PRACH)
rxF = &prach_rxsigF_br[*packet_type - IF4p5_PRACH - 1][0][0];
else
-#else
- rxF = &prach_rxsigF[0][0];
#endif
+ rxF = &prach_rxsigF[0][0];
// FIX: hard coded prach samples length
db_fulllength = PRACH_NUM_SAMPLES;
+ AssertFatal(rxF!=NULL,"rxF is null\n");
+
if (eth->flags == ETH_RAW_IF4p5_MODE) {
memcpy(rxF,
(int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t),
@@ -352,8 +353,8 @@ void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint
PRACH_BLOCK_SIZE_BYTES);
}
- LOG_I(PHY,"PRACH_IF4p5: CC_id %d : frame %d, subframe %d => %d dB\n",ru->idx,*frame,*subframe,
- dB_fixed(signal_energy(&prach_rxsigF[0][0],839)));
+ LOG_D(PHY,"PRACH_IF4p5: CC_id %d : frame %d, subframe %d => %d dB\n",ru->idx,*frame,*subframe,
+ dB_fixed(signal_energy((int*)&prach_rxsigF[0][0],839)));
for (idx=0;idxnum_eNB;idx++) ru->wakeup_prach_eNB(ru->eNB_list[idx],ru,*frame,*subframe);
} else if (*packet_type == IF4p5_PULTICK) {
diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c
index ac4ee1f0c1..72253742e2 100755
--- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c
@@ -139,9 +139,6 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int subframe, uint8_t
for (element_id=0; element_id< spp_eth; element_id++){
j = (uint16_t*) &ru->common.rxdata[i][subframe*fp->samples_per_tti+packet_id*spp_eth+element_id];
data_block[element_id] = ((uint16_t) lin2alaw_if5[*j]) | (lin2alaw_if5[*(j+1)]<<8);
- if (packet_id == 0 && element_id == 0) {
- //printf("(UL_Tx)Ori: %u(%d, %d); ALAW: %u; SF %u\n",eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti+packet_id*spp_eth+element_id],*j,*(j+1),data_block[element_id],subframe);
- }
}
}
clock_gettime( CLOCK_MONOTONIC, &end_comp);
@@ -182,63 +179,115 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int subframe, uint8_t
}
}
} else if (packet_type == IF5_MOBIPASS) {
- uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES;
-
- __m128i *data_block=NULL, *data_block_head=NULL;
+ /* the only difference between mobipass standalone and the other one
+ * is the timestamp in trx_write_func, but let's duplicate anyway
+ * (plus we don't call malloc for the standalone case)
+ */
+ if (ru->if_timing == synch_to_mobipass_standalone) {
+ uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES;
- __m128i *txp128;
- __m128i t0, t1;
+ __m128i *data_block=NULL, *data_block_head=NULL;
+ __m128i *txp128;
+ __m128i t0, t1;
- // tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
- tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
- IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES);
- data_block_head = (__m128i *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t);
-
- header->flags = 0;
- header->fifo_status = 0;
- header->seqno = *seqno;
- header->ack = 0;
- header->word0 = 0;
-
- txp[0] = (void*)&ru->common.txdata[subframe*ru->frame_parms.samples_per_tti];
- txp128 = (__m128i *) txp[0];
-
- for (packet_id=0; packet_idsamples_per_tti/db_fulllength; packet_id++) {
- header->time_stamp = htonl((uint32_t)(proc_timestamp + packet_id*db_fulllength));
- data_block = data_block_head;
-
- for (i=0; i>2; i+=2) {
- t0 = _mm_srai_epi16(*txp128++, 4);
- t1 = _mm_srai_epi16(*txp128++, 4);
-// *data_block++ = _mm_packs_epi16(t0, t1);
- _mm_storeu_si128(data_block++, _mm_packs_epi16(t0, t1));
+ unsigned char _tx_buffer[MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)];
+ tx_buffer=(int32_t *)_tx_buffer;
+
+ IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES);
+ data_block_head = (__m128i *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t);
+
+ header->flags = 0;
+ header->fifo_status = 0;
+ header->seqno = *seqno;
+ header->ack = 0;
+ header->word0 = 0;
+
+ txp[0] = (void*)&ru->common.txdata[0][subframe*ru->frame_parms.samples_per_tti];
+ txp128 = (__m128i *) txp[0];
+
+ for (packet_id=0; packet_idsamples_per_tti/db_fulllength; packet_id++) {
+ header->time_stamp = htonl((uint32_t)(proc_timestamp + packet_id*db_fulllength));
+ data_block = data_block_head;
+
+ for (i=0; i>2; i+=2) {
+ t0 = _mm_srai_epi16(*txp128++, 4);
+ t1 = _mm_srai_epi16(*txp128++, 4);
+ _mm_storeu_si128(data_block++, _mm_packs_epi16(t0, t1));
+ }
+
+ // Write the packet to the fronthaul
+ if ((ru->ifdevice.trx_write_func(&ru->ifdevice,
+ proc_timestamp + packet_id*db_fulllength,
+ (void**)&tx_buffer,
+ db_fulllength,
+ 1,
+ IF5_MOBIPASS)) < 0) {
+ perror("ETHERNET write for IF5_MOBIPASS\n");
+ }
+ header->seqno += 1;
}
+ *seqno = header->seqno;
+ tx_buffer = NULL;
+ } else {
+ uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES;
- // Write the packet to the fronthaul
- if ((ru->ifdevice.trx_write_func(&ru->ifdevice,
- packet_id,
- (void**)&tx_buffer,
- db_fulllength,
- 1,
- IF5_MOBIPASS)) < 0) {
- perror("ETHERNET write for IF5_MOBIPASS\n");
- }
-#ifdef DEBUG_DL_MOBIPASS
- if ((subframe==0)&&(dummy_cnt == 100)) {
- memcpy((void*)&dummy_buffer[packet_id*db_fulllength*2],(void*)data_block_head,db_fulllength*2);
- }
-#endif
- header->seqno += 1;
- }
- *seqno = header->seqno;
+ __m128i *data_block=NULL, *data_block_head=NULL;
+
+ __m128i *txp128;
+ __m128i t0, t1;
+
+ // tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
+ tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
+ IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES);
+ data_block_head = (__m128i *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t);
+
+ header->flags = 0;
+ header->fifo_status = 0;
+ header->seqno = *seqno;
+ header->ack = 0;
+ header->word0 = 0;
+
+ txp[0] = (void*)&ru->common.txdata[0][subframe*ru->frame_parms.samples_per_tti];
+ txp128 = (__m128i *) txp[0];
+
+ for (packet_id=0; packet_idsamples_per_tti/db_fulllength; packet_id++) {
+ header->time_stamp = htonl((uint32_t)(proc_timestamp + packet_id*db_fulllength));
+ data_block = data_block_head;
+
+ for (i=0; i>2; i+=2) {
+ t0 = _mm_srai_epi16(*txp128++, 4);
+ t1 = _mm_srai_epi16(*txp128++, 4);
+// *data_block++ = _mm_packs_epi16(t0, t1);
+ _mm_storeu_si128(data_block++, _mm_packs_epi16(t0, t1));
+ }
+
+ // Write the packet to the fronthaul
+ if ((ru->ifdevice.trx_write_func(&ru->ifdevice,
+ packet_id,
+ (void**)&tx_buffer,
+ db_fulllength,
+ 1,
+ IF5_MOBIPASS)) < 0) {
+ perror("ETHERNET write for IF5_MOBIPASS\n");
+ }
#ifdef DEBUG_DL_MOBIPASS
- uint8_t txe;
- txe = dB_fixed(signal_energy(txp[0],fp->samples_per_tti));
- if (txe > 0){
- LOG_D(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, txe);
- }
+ if ((subframe==0)&&(dummy_cnt == 100)) {
+ memcpy((void*)&dummy_buffer[packet_id*db_fulllength*2],(void*)data_block_head,db_fulllength*2);
+ }
+#endif
+ header->seqno += 1;
+ }
+ *seqno = header->seqno;
+
+#ifdef DEBUG_DL_MOBIPASS
+ uint8_t txe;
+ txe = dB_fixed(signal_energy(txp[0],fp->samples_per_tti));
+ if (txe > 0){
+ LOG_D(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, txe);
+ }
#endif
+ }
} else {
AssertFatal(1==0, "send_IF5 - Unknown packet_type %x", packet_type);
}
@@ -394,93 +443,173 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16
*proc_timestamp = timestamp[0];
} else if (packet_type == IF5_MOBIPASS) {
-
- uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES;
- openair0_timestamp timestamp_mobipass[fp->samples_per_tti/db_fulllength];
+ if (ru->if_timing == synch_to_mobipass_standalone) {
+ uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES;
+ openair0_timestamp timestamp_mobipass[fp->samples_per_tti/db_fulllength];
+ int32_t *rx_buffer=NULL;
+ __m128i *data_block=NULL, *data_block_head=NULL;
+ __m128i *rxp128;
+ __m128i r0;
+
+ unsigned char _rx_buffer[MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)];
+ rx_buffer = (int32_t *)_rx_buffer;
+ data_block_head = (__m128i *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t);
+
+ rxp[0] = (void*)&ru->common.rxdata[0][subframe*ru->frame_parms.samples_per_tti];
+ rxp128 = (__m128i *) (rxp[0]);
+
+ packet_id=0;
+ while(packet_idsamples_per_tti/db_fulllength) {
+ data_block = data_block_head;
+
+ ru->ifdevice.trx_read_func(&ru->ifdevice,
+ ×tamp_mobipass[packet_id],
+ (void**)&rx_buffer,
+ db_fulllength,
+ 1
+ );
+
+ //store rxdata and increase packet_id
+ rxp[0] = (void*)&ru->common.rxdata[0][(subframe*ru->frame_parms.samples_per_tti)+packet_id*db_fulllength];
+ rxp128 = (__m128i *) (rxp[0]);
+ for (i=0; i>2; i+=2) {
+ r0 = _mm_loadu_si128(data_block++);
+ *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4);
+ *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4);
+ }
+ packet_id++;
+ }//end while
+
+ *proc_timestamp = ntohl(timestamp_mobipass[0]);
+ } else {
+
+ uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES;
+ openair0_timestamp timestamp_mobipass[fp->samples_per_tti/db_fulllength];
#ifdef DEBUG_UL_MOBIPASS
- int lower_offset = 0;
- int upper_offset = 70000;
+ int lower_offset = 0;
+ int upper_offset = 70000;
#endif
- int subframe_skip = 0;
- int reset_flag = 0;
- int32_t *rx_buffer=NULL;
- __m128i *data_block=NULL, *data_block_head=NULL;
- __m128i *rxp128;
- __m128i r0;
+ int subframe_skip = 0;
+ int reset_flag = 0;
+ int32_t *rx_buffer=NULL;
+ __m128i *data_block=NULL, *data_block_head=NULL;
+ __m128i *rxp128;
+ __m128i r0;
- //rx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
- rx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
- IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES);
- data_block_head = (__m128i *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t);
-
- rxp[0] = (void*)&ru->common.rxdata[subframe*ru->frame_parms.samples_per_tti];
- rxp128 = (__m128i *) (rxp[0]);
-
- RU_proc_t *proc = &ru->proc;
+ //rx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
+ rx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
+ IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES);
+ data_block_head = (__m128i *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t);
+
+ rxp[0] = (void*)&ru->common.rxdata[0][subframe*ru->frame_parms.samples_per_tti];
+ rxp128 = (__m128i *) (rxp[0]);
+
+ RU_proc_t *proc = &ru->proc;
+/*
+ // while(packet_idsamples_per_tti/db_fulllength) {
+ data_block = data_block_head;
+ eNB->ifdevice.trx_read_func(&eNB->ifdevice,
+ &ts0,
+ (void**)&rx_buffer,
+ db_fulllength,
+ 1
+ );
- packet_id=0;
- while(packet_idsamples_per_tti/db_fulllength) {
- data_block = data_block_head;
+ if ((header->seqno == 1)&&(first_packet==1)) {
+ first_packet = 0; //ignore the packets before synchnorization
+ packet_id = 0;
+ ts_offset = ntohl(ts0);
+ }
+ if (first_packet==0) {
+ packet_cnt++;
+ ts = ntohl(ts0);
+ packet_id = (ts-ts_offset)/db_fulllength;
+ packet_id = packet_id % (fp->samples_per_tti/db_fulllength);
- ru->ifdevice.trx_read_func(&ru->ifdevice,
+ printf("[IF5_tools]packet_id:%d\n", packet_id);
+ // if (ts_stored == 0) {
+ // ts_stored = 1;
+ *proc_timestamp = ntohl(ts - (packet_id*db_fulllength));
+ // }
+ rxp[0] = (void*)&eNB->common_vars.rxdata[0][0][(subframe*eNB->frame_parms.samples_per_tti)+packet_id*db_fulllength];
+ rxp128 = (__m128i *) (rxp[0]);
+
+ for (i=0; i>2; i+=2) {
+ r0 = _mm_loadu_si128(data_block++);
+ *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4);
+ *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4);
+ }
+ }
+ // }//end while
+*/
+
+
+ packet_id=0;
+ while(packet_idsamples_per_tti/db_fulllength) {
+ data_block = data_block_head;
+
+
+ ru->ifdevice.trx_read_func(&ru->ifdevice,
×tamp_mobipass[packet_id],
(void**)&rx_buffer,
db_fulllength,
1
);
#ifdef DEBUG_UL_MOBIPASS
- if (((proc->timestamp_tx + lower_offset) > ntohl(timestamp_mobipass[packet_id])) || ((proc->timestamp_tx + upper_offset) < ntohl(timestamp_mobipass[packet_id]))) {
- //ignore the packet
- subframe_skip_extra = (subframe_skip_extra + 1)%67;
- LOG_D("[Mobipass] ignored packet, id:[%d,%d], proc->timestamp_tx:%llu, proc->timestamp_rx:%llu, seqno:%d\n", packet_id,subframe_skip_extra, proc->timestamp_tx, ntohl(timestamp_mobipass[packet_id]), header->seqno);
- }
+ if (((proc->timestamp_tx + lower_offset) > ntohl(timestamp_mobipass[packet_id])) || ((proc->timestamp_tx + upper_offset) < ntohl(timestamp_mobipass[packet_id]))) {
+ //ignore the packet
+ subframe_skip_extra = (subframe_skip_extra + 1)%67;
+ LOG_D("[Mobipass] ignored packet, id:[%d,%d], proc->timestamp_tx:%llu, proc->timestamp_rx:%llu, seqno:%d\n", packet_id,subframe_skip_extra, proc->timestamp_tx, ntohl(timestamp_mobipass[packet_id]), header->seqno);
+ }
#endif
- //skip SUBFRAME_SKIP_NUM_MOBIPASS additional UL packets
- if ((start_flag == 1) && (subframe_skip < SUBFRAME_SKIP_NUM_MOBIPASS)){
- subframe_skip++;
- offset_cnt = header->seqno;
- } else {
- if ((offset_cnt != header->seqno) && (start_flag == 0) && (proc->first_rx > 3)){
+ //skip SUBFRAME_SKIP_NUM_MOBIPASS additional UL packets
+ if ((start_flag == 1) && (subframe_skip < SUBFRAME_SKIP_NUM_MOBIPASS)){
+ subframe_skip++;
+ offset_cnt = header->seqno;
+ } else {
+ if ((offset_cnt != header->seqno) && (start_flag == 0) && (proc->first_rx > 3)){
#ifdef DEBUG_UL_MOBIPASS
- LOG_D(PHY,"[Mobipass] Reset sequence number, offset_cnt:%d, header->seqno:%d, packet_id:%d\n", offset_cnt, header->seqno, packet_id);
+ LOG_D(PHY,"[Mobipass] Reset sequence number, offset_cnt:%d, header->seqno:%d, packet_id:%d\n", offset_cnt, header->seqno, packet_id);
#endif
- reset_flag=1;
- }
- if ((reset_flag == 1) && (proc->first_rx > 3 ) && (start_flag == 0) && (packet_id == 0)) {
- packet_id = 1;
- reset_flag = 0;
- }
- start_flag = 0;
+ reset_flag=1;
+ }
+ if ((reset_flag == 1) && (proc->first_rx > 3 ) && (start_flag == 0) && (packet_id == 0)) {
+ packet_id = 1;
+ reset_flag = 0;
+ }
+ start_flag = 0;
- //store rxdata and increase packet_id
- rxp[0] = (void*)&ru->common.rxdata[(subframe*ru->frame_parms.samples_per_tti)+packet_id*db_fulllength];
- rxp128 = (__m128i *) (rxp[0]);
- for (i=0; i>2; i+=2) {
- r0 = _mm_loadu_si128(data_block++);
- *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4);
- *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4);
- }
- packet_id++;
- offset_cnt = (header->seqno+1)&255;
- }
- }//end while
-
- *proc_timestamp = ntohl(timestamp_mobipass[0]);
+ //store rxdata and increase packet_id
+ rxp[0] = (void*)&ru->common.rxdata[0][(subframe*ru->frame_parms.samples_per_tti)+packet_id*db_fulllength];
+ rxp128 = (__m128i *) (rxp[0]);
+ for (i=0; i>2; i+=2) {
+ r0 = _mm_loadu_si128(data_block++);
+ *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4);
+ *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4);
+ }
+ packet_id++;
+ offset_cnt = (header->seqno+1)&255;
+ }
+ }//end while
+
+ *proc_timestamp = ntohl(timestamp_mobipass[0]);
#ifdef DEBUG_UL_MOBIPASS
- LOG_I(PHY,"[Mobipass][Recv_MOBIPASS] timestamp: %llu\n ", *proc_timestamp);
- if (ru->idx>0) {
- rxe = dB_fixed(signal_energy(rxp[0],fp->samples_per_tti));
- if (rxe > 0){
- LOG_I(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (*proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, rxe);
-// write_output("rxsigmb.m","rxs",(void*)dummy_buffer_rx, fp->samples_per_tti,1, 5);
-// exit(-1);
+ LOG_I(PHY,"[Mobipass][Recv_MOBIPASS] timestamp: %llu\n ", *proc_timestamp);
+ if (eNB->CC_id>0) {
+ rxe = dB_fixed(signal_energy(rxp[0],fp->samples_per_tti));
+ if (rxe > 0){
+ LOG_I(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (*proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, rxe);
+
+ // write_output("rxsigmb.m","rxs",(void*)dummy_buffer_rx, fp->samples_per_tti,1, 5);
+ // exit(-1);
+ }
+ }
+#endif
+
+
+
}
-}
-#endif
-
-
-
} else {
AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type);
}
diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
index 1a609a618d..ab66c6fc54 100755
--- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c
+++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
@@ -43,13 +43,13 @@ extern openair0_config_t openair0_cfg[];
#define DEBUG_INITIAL_SYNCH
-int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
+int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
{
uint8_t l,pbch_decoded,frame_mod4,pbch_tx_ant,dummy;
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
char phich_resource[6];
-
+
#ifdef DEBUG_INITIAL_SYNCH
LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id,
ue->rx_offset);
@@ -63,7 +63,7 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
ue->rx_offset,
0,
1);
- }
+ }
for (l=0; lsymbols_per_tti/2; l++) {
slot_fep(ue,
@@ -72,7 +72,7 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
ue->rx_offset,
0,
1);
- }
+ }
slot_fep(ue,
0,
2,
@@ -83,9 +83,11 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
lte_ue_measurements(ue,
ue->rx_offset,
0,
- 0,0);
-
-
+ 0,
+ 0,
+ 0);
+
+
if (ue->frame_parms.frame_type == TDD) {
ue_rrc_measurements(ue,
2,
@@ -230,19 +232,17 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
break;
}
- ue->proc.proc_rxtx[0].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
- ue->proc.proc_rxtx[0].frame_rx += frame_mod4;
-
- ue->proc.proc_rxtx[1].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
- ue->proc.proc_rxtx[1].frame_rx += frame_mod4;
+ for(int i=0; iproc.proc_rxtx[i].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
+ ue->proc.proc_rxtx[i].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
#ifndef USER_MODE
- // one frame delay
- ue->proc.proc_rxtx[0].frame_rx ++;
- ue->proc.proc_rxtx[1].frame_rx ++;
+ // one frame delay
+ ue->proc.proc_rxtx[i].frame_rx ++;
#endif
- ue->proc.proc_rxtx[0].frame_tx = ue->proc.proc_rxtx[0].frame_rx;
- ue->proc.proc_rxtx[1].frame_tx = ue->proc.proc_rxtx[1].frame_rx;
+ ue->proc.proc_rxtx[i].frame_tx = ue->proc.proc_rxtx[0].frame_rx;
+ }
#ifdef DEBUG_INITIAL_SYNCH
LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully p %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n",
ue->Mod_id,
@@ -467,13 +467,21 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) )
{
ret=-1;
- LOG_E(HW,"Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
+#if DISABLE_LOG_X
+ printf("Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
+#else
+ LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
+#endif
}
if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters
//#ifdef DEBUG_INITIAL_SYNCH
- LOG_I(PHY,"[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
+#if DISABLE_LOG_X
+ printf("[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
+#else
+ LOG_I(PHY, "[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
+#endif
//#endif
if (ue->UE_scan_carrier == 0) {
@@ -486,6 +494,8 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
ue->common_vars.freq_offset );
#endif
+// send sync status to higher layers later when timing offset converge to target timing
+#if OAISIM
if (ue->mac_enabled==1) {
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
//mac_resynch();
@@ -495,6 +505,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
else {
ue->UE_mode[0] = PUSCH;
}
+#endif
generate_pcfich_reg_mapping(frame_parms);
generate_phich_reg_mapping(frame_parms);
@@ -504,7 +515,8 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
}
- LOG_I(PHY,"[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id,
+#if DISABLE_LOG_X
+ printf("[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id,
ue->proc.proc_rxtx[0].frame_rx,
10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
10*log10(ue->measurements.rssi),
@@ -512,9 +524,9 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
ue->measurements.n0_power_tot_dBm,
10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB,
(10*log10(ue->measurements.rsrq[0])));
-
-
- LOG_I(PHY,"[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n",
+
+
+ printf("[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n",
ue->Mod_id,
ue->proc.proc_rxtx[0].frame_rx,
duplex_string[ue->frame_parms.frame_type],
@@ -524,13 +536,42 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
ue->frame_parms.phich_config_common.phich_duration,
phich_string[ue->frame_parms.phich_config_common.phich_resource],
ue->frame_parms.nb_antenna_ports_eNB);
+#else
+ LOG_I(PHY, "[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id,
+ ue->proc.proc_rxtx[0].frame_rx,
+ 10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
+ 10*log10(ue->measurements.rssi),
+ ue->rx_total_gain_dB,
+ ue->measurements.n0_power_tot_dBm,
+ 10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB,
+ (10*log10(ue->measurements.rsrq[0])));
+
+ LOG_I(PHY, "[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n",
+ ue->Mod_id,
+ ue->proc.proc_rxtx[0].frame_rx,
+ duplex_string[ue->frame_parms.frame_type],
+ prefix_string[ue->frame_parms.Ncp],
+ ue->frame_parms.Nid_cell,
+ ue->frame_parms.N_RB_DL,
+ ue->frame_parms.phich_config_common.phich_duration,
+ phich_string[ue->frame_parms.phich_config_common.phich_resource],
+ ue->frame_parms.nb_antenna_ports_eNB);
+#endif
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
- LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
+# if DISABLE_LOG_X
+ printf("[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
ue->Mod_id,
ue->proc.proc_rxtx[0].frame_rx,
openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset,
ue->common_vars.freq_offset);
+# else
+ LOG_I(PHY, "[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
+ ue->Mod_id,
+ ue->proc.proc_rxtx[0].frame_rx,
+ openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset,
+ ue->common_vars.freq_offset);
+# endif
#endif
} else {
#ifdef DEBUG_INITIAL_SYNC
@@ -561,7 +602,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
for (aarx=0; aarxnb_antennas_rx; aarx++)
rx_power += signal_energy(&ue->common_vars.rxdata[aarx][sync_pos2],
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
-
+
/*
// do a measurement on the full frame
for (aarx=0; aarxnb_antennas_rx; aarx++)
@@ -570,7 +611,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
*/
// we might add a low-pass filter here later
- ue->measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx;
+ ue->measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx;
ue->measurements.rx_power_avg_dB[0] = dB_fixed(ue->measurements.rx_power_avg[0]);
@@ -579,7 +620,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
#endif
#ifndef OAI_USRP
-#ifndef OAI_BLADERF
+#ifndef OAI_BLADERF
#ifndef OAI_LMSSDR
phy_adjust_gain(ue,ue->measurements.rx_power_avg_dB[0],0);
#endif
@@ -590,7 +631,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
else {
#ifndef OAI_USRP
-#ifndef OAI_BLADERF
+#ifndef OAI_BLADERF
#ifndef OAI_LMSSDR
phy_adjust_gain(ue,dB_fixed(ue->measurements.rssi),0);
#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c
index 121f9b8490..dd04a7d119 100755
--- a/openair1/PHY/LTE_TRANSPORT/phich.c
+++ b/openair1/PHY/LTE_TRANSPORT/phich.c
@@ -1078,7 +1078,7 @@ void rx_phich(PHY_VARS_UE *ue,
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
- LTE_UE_PDCCH **pdcch_vars = &ue->pdcch_vars[subframe & 0x1][eNB_id];
+ LTE_UE_PDCCH **pdcch_vars = &ue->pdcch_vars[ue->current_thread_id[subframe]][eNB_id];
// uint8_t HI;
uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,proc->frame_rx,subframe);
@@ -1098,6 +1098,8 @@ void rx_phich(PHY_VARS_UE *ue,
uint8_t NSF_PHICH = 4;
uint8_t pusch_subframe;
+ int8_t delta_PUSCH_acc[4] = {-1,0,1,3};
+
// check if we're expecting a PHICH in this subframe
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
@@ -1379,7 +1381,7 @@ void rx_phich(PHY_VARS_UE *ue,
if (HI16>0) { //NACK
if (ue->ulsch_Msg3_active[eNB_id] == 1) {
- LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received NAK (%d) nseq %d, ngroup %d\n",
+ LOG_I(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received NAK (%d) nseq %d, ngroup %d\n",
ue->Mod_id,harq_pid,
proc->frame_rx,
subframe,
@@ -1387,6 +1389,14 @@ void rx_phich(PHY_VARS_UE *ue,
nseq_PHICH,
ngroup_PHICH);
+ ulsch->f_pusch += delta_PUSCH_acc[ulsch->harq_processes[harq_pid]->TPC];
+
+ LOG_I(PHY,"[PUSCH %d] AbsSubframe %d.%d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n",
+ harq_pid,proc->frame_rx,subframe,ulsch->f_pusch,
+ delta_PUSCH_acc[ulsch->harq_processes[harq_pid]->TPC],
+ ulsch->harq_processes[harq_pid]->TPC);
+
+
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
// ulsch->harq_processes[harq_pid]->Ndi = 0;
ulsch->harq_processes[harq_pid]->round++;
@@ -1399,8 +1409,8 @@ void rx_phich(PHY_VARS_UE *ue,
ue->ulsch_Msg3_active[eNB_id] = 0;
}
} else {
- //#ifdef DEBUG_PHICH
- LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d round %d (Mlimit %d)\n",
+#ifdef UE_DEBUG_TRACE
+ LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d round %d (Mlimit %d)\n",
ue->Mod_id,harq_pid,
proc->frame_rx%1024,
subframe,
@@ -1409,7 +1419,7 @@ void rx_phich(PHY_VARS_UE *ue,
ngroup_PHICH,
ulsch->harq_processes[harq_pid]->round,
ulsch->Mlimit);
- //#endif
+#endif
// ulsch->harq_processes[harq_pid]->Ndi = 0;
ulsch->harq_processes[harq_pid]->round++;
@@ -1442,26 +1452,26 @@ void rx_phich(PHY_VARS_UE *ue,
}
}
#if T_TRACER
- T(T_UE_PHY_ULSCH_UE_NACK, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(subframe), T_INT(ue->Mod_id), T_INT(ulsch->rnti),
+ T(T_UE_PHY_ULSCH_UE_NACK, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(subframe), T_INT(ulsch->rnti),
T_INT(harq_pid));
#endif
} else { //ACK
if (ue->ulsch_Msg3_active[eNB_id] == 1) {
- LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
+ LOG_I(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
ue->Mod_id,harq_pid,
proc->frame_rx,
subframe,
HI16,
nseq_PHICH,ngroup_PHICH);
} else {
- //#ifdef PHICH_DEBUG
- LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
+#ifdef UE_DEBUG_TRACE
+ LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
ue->Mod_id,harq_pid,
proc->frame_rx%1024,
subframe, HI16,
nseq_PHICH,ngroup_PHICH);
- //#endif
+#endif
}
// LOG_I(PHY,"[HARQ-UL harqId: %d] subframe_scheduling_flag = %d \n",harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag);
@@ -1474,13 +1484,14 @@ void rx_phich(PHY_VARS_UE *ue,
//ulsch->harq_processes[8] = ulsch->harq_processes[harq_pid];
- ulsch->harq_processes[harq_pid]->status = SCH_IDLE;
- ulsch->harq_processes[harq_pid]->round = 0;
+ ulsch->harq_processes[harq_pid]->status = SCH_IDLE;
+ ulsch->harq_processes[harq_pid]->round = 0;
+ ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
// inform MAC?
ue->ulsch_Msg3_active[eNB_id] = 0;
#if T_TRACER
- T(T_UE_PHY_ULSCH_UE_ACK, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(subframe), T_INT(ue->Mod_id), T_INT(ulsch->rnti),
+ T(T_UE_PHY_ULSCH_UE_ACK, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(subframe), T_INT(ulsch->rnti),
T_INT(harq_pid));
#endif
@@ -1490,21 +1501,20 @@ void rx_phich(PHY_VARS_UE *ue,
void generate_phich_top(PHY_VARS_eNB *eNB,
eNB_rxtx_proc_t *proc,
- int16_t amp,
- uint8_t sect_id)
+ int16_t amp)
{
LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms;
- LTE_eNB_ULSCH_t **ulsch = eNB->ulsch;
int32_t **txdataF = eNB->common_vars.txdataF;
uint8_t harq_pid;
uint8_t Ngroup_PHICH,ngroup_PHICH,nseq_PHICH;
uint8_t NSF_PHICH = 4;
uint8_t pusch_subframe;
- uint8_t UE_id;
+ uint8_t i;
uint32_t pusch_frame;
int subframe = proc->subframe_tx;
+ phich_config_t *phich;
// compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211
@@ -1520,98 +1530,42 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe);
harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe);
- for (UE_id=0; UE_idrnti>0)) {
- if (ulsch[UE_id]->harq_processes[harq_pid]->phich_active == 1) {
+ for (i=0; iphich_vars[subframe&1].num_hi; i++) {
- LOG_I(PHY,"[eNB][PUSCH %d/%x] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n",
- harq_pid,ulsch[UE_id]->rnti,proc->frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active);
-
- /* the HARQ process may have been reused by a new scheduling, so we use
- * previous values of first_rb and n_DMRS to compute ngroup_PHICH and nseq_PHICH
- */
-
- ngroup_PHICH = (ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb +
- ulsch[UE_id]->harq_processes[harq_pid]->previous_n_DMRS)%Ngroup_PHICH;
-
- if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) {
-
- if ((pusch_subframe == 4) || (pusch_subframe == 9))
- ngroup_PHICH += Ngroup_PHICH;
- }
-
- nseq_PHICH = ((ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb/Ngroup_PHICH) +
- ulsch[UE_id]->harq_processes[harq_pid]->previous_n_DMRS)%(2*NSF_PHICH);
- LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n",
- eNB->Mod_id,harq_pid,proc->frame_tx,
- subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,
- ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
- ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb,
- ulsch[UE_id]->harq_processes[harq_pid]->dci_alloc);
-
- T(T_ENB_PHY_PHICH, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(subframe),
- T_INT(UE_id), T_INT(ulsch[UE_id]->rnti), T_INT(harq_pid),
- T_INT(Ngroup_PHICH), T_INT(NSF_PHICH),
- T_INT(ngroup_PHICH), T_INT(nseq_PHICH),
- T_INT(ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK),
- T_INT(ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb),
- T_INT(ulsch[UE_id]->harq_processes[harq_pid]->previous_n_DMRS));
-
- if (ulsch[UE_id]->Msg3_active == 1) {
- LOG_I(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n",
- eNB->Mod_id,harq_pid,proc->frame_tx,subframe,
- UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
- ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb);
- }
-
- if (eNB->abstraction_flag == 0) {
- generate_phich(frame_parms,
- amp,//amp*2,
- nseq_PHICH,
- ngroup_PHICH,
- ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
- subframe,
- txdataF);
- } else {
- /*
- generate_phich_emul(frame_parms,
- //nseq_PHICH,
- //ngroup_PHICH,
- ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
- subframe);
- */
- }
-
- // if no format0 DCI was transmitted by MAC, prepare the
- // MCS parameters for the retransmission
-
-
- if ((ulsch[UE_id]->harq_processes[harq_pid]->dci_alloc == 0) &&
- (ulsch[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) {
- if (ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) {
- T(T_ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION, T_INT(eNB->Mod_id), T_INT(proc->frame_tx),
- T_INT(subframe), T_INT(UE_id), T_INT(ulsch[UE_id]->rnti), T_INT(harq_pid));
- LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n",
- eNB->Mod_id,harq_pid,proc->frame_tx,subframe);
- // ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
- ulsch[UE_id]->harq_processes[harq_pid]->subframe = (subframe + 4)%10;
- if (subframe>5) ulsch[UE_id]->harq_processes[harq_pid]->frame++;
- ulsch[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch[UE_id]->harq_processes[harq_pid]->round&3];
- ulsch[UE_id]->harq_processes[harq_pid]->O_RI = 0;
- ulsch[UE_id]->harq_processes[harq_pid]->Or2 = 0;
- ulsch[UE_id]->harq_processes[harq_pid]->Or1 = 0;
- ulsch[UE_id]->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi;
-
- } else {
- LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d PHICH ACK (no format0 DCI) Clearing subframe_scheduling_flag, setting round to 0\n",
- eNB->Mod_id,harq_pid,proc->frame_tx,subframe);
- ulsch[UE_id]->harq_processes[harq_pid]->status = SCH_IDLE;
- ulsch[UE_id]->harq_processes[harq_pid]->round=0;
- }
- }
-
- ulsch[UE_id]->harq_processes[harq_pid]->phich_active=0;
- } // phich_active==1
- } //ulsch_ue[UE_id] is non-null
- }// UE loop
+ phich = &eNB->phich_vars[subframe&1].config[i];
+
+ ngroup_PHICH = (phich->first_rb +
+ phich->n_DMRS)%Ngroup_PHICH;
+
+ if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) {
+
+ if ((pusch_subframe == 4) || (pusch_subframe == 9))
+ ngroup_PHICH += Ngroup_PHICH;
+ }
+
+ nseq_PHICH = ((phich->first_rb/Ngroup_PHICH) +
+ phich->n_DMRS)%(2*NSF_PHICH);
+ LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, AMP %d ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d)\n",
+ eNB->Mod_id,harq_pid,proc->frame_tx,
+ subframe,amp,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,
+ phich->hi,
+ phich->first_rb);
+
+ T(T_ENB_PHY_PHICH, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(subframe),
+ T_INT(-1 /* TODO: rnti */), T_INT(harq_pid),
+ T_INT(Ngroup_PHICH), T_INT(NSF_PHICH),
+ T_INT(ngroup_PHICH), T_INT(nseq_PHICH),
+ T_INT(phich->hi),
+ T_INT(phich->first_rb),
+ T_INT(phich->n_DMRS));
+
+ generate_phich(frame_parms,
+ amp,//amp*2,
+ nseq_PHICH,
+ ngroup_PHICH,
+ phich->hi,
+ subframe,
+ txdataF);
+ }// for (i=0; iphich_vars[subframe&1].num_hi; i++) {
+ eNB->phich_vars[subframe&1].num_hi=0;
}
diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c
index 40f157e56b..eb2fa1d843 100755
--- a/openair1/PHY/LTE_TRANSPORT/pmch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pmch.c
@@ -74,7 +74,7 @@ void dump_mch(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,in
write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1);
write_output("mch00_ch0.m","pmch00_ch0",
- &(ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0]),
+ &(ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0]),
ue->frame_parms.ofdm_symbol_size*12,1,1);
write_output("rxsig_mch.m","rxs_mch",
@@ -967,8 +967,8 @@ int rx_pmch(PHY_VARS_UE *ue,
//printf("*********************mch: symbol %d\n",symbol);
- mch_extract_rbs(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
- common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
+ mch_extract_rbs(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
+ common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
symbol,
diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c
index 743c16b2f0..9421efe52d 100755
--- a/openair1/PHY/LTE_TRANSPORT/power_control.c
+++ b/openair1/PHY/LTE_TRANSPORT/power_control.c
@@ -52,7 +52,7 @@ double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
rho_a_dB-=10*log10(2);
if(n_antenna_port==4) // see TS 36.213 Section 5.2
- rho_a_dB=+10*log10(2);
+ rho_a_dB+=10*log10(2);
sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB));
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index 27663c6698..0282b780d9 100755
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -490,13 +490,10 @@ int is_prach_subframe0(LTE_DL_FRAME_PARMS *frame_parms,uint8_t prach_ConfigIndex
//implement Table 5.7.1-2 from 36.211 (Rel-10, p.41)
if ((((frame&1) == 1) && (subframe < 9)) ||
(((frame&1) == 0) && (subframe == 9))) // This is an odd frame, ignore even-only PRACH frames
-
- /*
if (((prach_ConfigIndex&0xf)<3) || // 0,1,2,16,17,18,32,33,34,48,49,50
((prach_ConfigIndex&0x1f)==18) || // 18,50
((prach_ConfigIndex&0xf)==15)) // 15,47
return(0);
- */
switch (prach_ConfigIndex&0x1f) {
case 0:
@@ -1095,9 +1092,9 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
void rx_prach0(PHY_VARS_eNB *eNB,
RU_t *ru,
- int16_t *max_preamble,
- int16_t *max_preamble_energy,
- int16_t *max_preamble_delay,
+ uint16_t *max_preamble,
+ uint16_t *max_preamble_energy,
+ uint16_t *max_preamble_delay,
uint16_t Nf,
uint8_t tdd_mapindex
#ifdef Rel14
@@ -1133,8 +1130,6 @@ void rx_prach0(PHY_VARS_eNB *eNB,
uint16_t d_start=0;
uint16_t numshift=0;
uint16_t *prach_root_sequence_map;
- uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type);
- uint16_t N_ZC = (prach_fmt <4)?839:139;
uint8_t not_found;
int k;
uint16_t u;
@@ -1148,8 +1143,8 @@ void rx_prach0(PHY_VARS_eNB *eNB,
int16_t levdB;
int fft_size,log2_ifft_size;
int16_t prach_ifft_tmp[2048*2] __attribute__((aligned(32)));
- int32_t *prach_ifft;
- int32_t **prach_ifftp;
+ int32_t *prach_ifft=(int32_t*)NULL;
+ int32_t **prach_ifftp=(int32_t **)NULL;
#ifdef Rel14
int prach_ifft_cnt=0;
#endif
@@ -1200,6 +1195,8 @@ void rx_prach0(PHY_VARS_eNB *eNB,
}
int16_t *prach[nb_rx];
+ uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type);
+ uint16_t N_ZC = (prach_fmt <4)?839:139;
if (eNB) {
#ifdef Rel14
@@ -1208,7 +1205,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
frame = eNB->proc.frame_prach_br;
subframe = eNB->proc.subframe_prach_br;
prachF = eNB->prach_vars_br.prachF;
- rxsigF = eNB->prach_vars_br.rxsigF;
+ rxsigF = eNB->prach_vars_br.rxsigF[ce_level];
#ifdef PRACH_DEBUG
if ((frame&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n",
br_flag,ce_level,frame,subframe,
@@ -1225,7 +1222,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
frame = eNB->proc.frame_prach;
subframe = eNB->proc.subframe_prach;
prachF = eNB->prach_vars.prachF;
- rxsigF = eNB->prach_vars.rxsigF;
+ rxsigF = eNB->prach_vars.rxsigF[0];
#ifdef PRACH_DEBUG
if ((frame&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n",
subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex);
@@ -1475,7 +1472,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
return;
} else if (eNB!=NULL) {
- en = dB_fixed(signal_energy(&rxsigF[0][0],840));
+ en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840));
#ifdef PRACH_DEBUG
if ((en > 60)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
#endif
@@ -1686,9 +1683,9 @@ void rx_prach0(PHY_VARS_eNB *eNB,
*max_preamble_energy = levdB;
*max_preamble_delay = ((i*fft_size)>>log2_ifft_size)*update_TA/update_TA2;
*max_preamble = preamble_index;
- //#ifdef PRACH_DEBUG
- if ((en>60) && (br_flag==1)) LOG_I(PHY,"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)\n",frame,subframe,*max_preamble_energy,*max_preamble_delay,*max_preamble,br_flag,ce_level,levdB,lev);
- //#endif
+#ifdef PRACH_DEBUG
+ if ((en>60) && (br_flag==1)) LOG_D(PHY,"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)\n",frame,subframe,*max_preamble_energy,*max_preamble_delay,*max_preamble,br_flag,ce_level,levdB,lev);
+#endif
}
}
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index 867a2877fe..d09e8dc392 100755
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -113,7 +113,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag);
@returns status
*/
int32_t dlsch_encoding(PHY_VARS_eNB *eNB,
- uint8_t *a,
+ uint8_t *a,
uint8_t num_pdcch_symbols,
LTE_eNB_DLSCH_t *dlsch,
int frame,
@@ -158,14 +158,14 @@ int32_t dlsch_encoding_SIC(PHY_VARS_UE *ue,
@returns status
*/
int32_t dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
- uint8_t *a,
- uint8_t num_pdcch_symbols,
- LTE_eNB_DLSCH_t *dlsch,
- int frame,
- uint8_t subframe,
- time_stats_t *rm_stats,
- time_stats_t *te_stats,
- time_stats_t *i_stats);
+ uint8_t *a,
+ uint8_t num_pdcch_symbols,
+ LTE_eNB_DLSCH_t *dlsch,
+ int frame,
+ uint8_t subframe,
+ time_stats_t *rm_stats,
+ time_stats_t *te_stats,
+ time_stats_t *i_stats);
void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB,
uint8_t *DLSCH_pdu,
@@ -264,11 +264,11 @@ int32_t allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
uint32_t *re_allocated,
uint8_t skip_dc,
uint8_t skip_half,
- uint8_t lprime,
- uint8_t mprime,
- uint8_t Ns,
- int *P1_SHIFT,
- int *P2_SHIFT);
+ uint8_t lprime,
+ uint8_t mprime,
+ uint8_t Ns,
+ int *P1_SHIFT,
+ int *P2_SHIFT);
/** \fn int32_t dlsch_modulation(int32_t **txdataF,
@@ -388,7 +388,7 @@ int32_t generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
eNB_rxtx_proc_t *proc,
- int32_t **txdataF,
+ int32_t **txdataF,
int16_t amp);
void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB,
@@ -396,7 +396,7 @@ void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB,
int32_t **txdataF,
int16_t amp,
uint16_t Ntti,
- uint8_t beamforming_mode);
+ uint8_t beamforming_mode);
int32_t generate_pss(int32_t **txdataF,
int16_t amp,
@@ -803,7 +803,8 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
unsigned char first_symbol_flag,
unsigned short nb_rb,
uint16_t pbch_pss_sss_adjust,
- short **llr16p);
+ //short **llr16p,
+ uint32_t llr_offset);
/** \brief This function generates log-likelihood ratios (decoder input) for single-stream QPSK received waveforms.
@@ -824,7 +825,7 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint16_t pbch_pss_sss_adj,
- int16_t **llr128p,
+ //int16_t **llr128p,
uint8_t beamforming_mode);
/**
@@ -842,16 +843,15 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
*/
int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
- int **rxdataF_comp,
- int32_t **sic_buffer,
- int **rho_i,
- short *dlsch_llr,
- uint8_t num_pdcch_symbols,
- uint16_t nb_rb,
- uint8_t subframe,
- uint32_t rb_alloc,
- uint16_t mod_order_0,
- LTE_UE_DLSCH_t *dlsch0);
+ int **rxdataF_comp,
+ int32_t **sic_buffer,
+ int **rho_i,
+ short *dlsch_llr,
+ uint8_t num_pdcch_symbols,
+ uint16_t nb_rb,
+ uint8_t subframe,
+ uint16_t mod_order_0,
+ uint32_t rb_alloc);
void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
int32_t **rxdataF_comp,
@@ -878,30 +878,28 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
*/
void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms,
int32_t **rxdataF_comp,
- int32_t **sic_buffer, //Q15
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t num_pdcch_symbols,
- int32_t **dl_ch_mag,
- uint16_t nb_rb,
- uint8_t subframe,
- uint32_t rb_alloc,
+ int32_t **sic_buffer, //Q15
+ int32_t **rho_i,
+ int16_t *dlsch_llr,
+ uint8_t num_pdcch_symbols,
+ int32_t **dl_ch_mag,
+ uint16_t nb_rb,
+ uint8_t subframe,
uint16_t mod_order_0,
- LTE_UE_DLSCH_t *dlsch0);
+ uint32_t rb_alloc);
void dlsch_64qam_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
int32_t **rxdataF_comp,
- int32_t **sic_buffer, //Q15
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t num_pdcch_symbols,
- int32_t **dl_ch_mag,
- int32_t **dl_ch_magb,
- uint16_t nb_rb,
- uint8_t subframe,
- uint32_t rb_alloc,
+ int32_t **sic_buffer, //Q15
+ int32_t **rho_i,
+ int16_t *dlsch_llr,
+ uint8_t num_pdcch_symbols,
+ int32_t **dl_ch_mag,
+ int32_t **dl_ch_magb,
+ uint16_t nb_rb,
+ uint8_t subframe,
uint16_t mod_order_0,
- LTE_UE_DLSCH_t *dlsch0);
+ uint32_t rb_alloc);
void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
@@ -913,7 +911,8 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint16_t pbch_pss_sss_adjust,
- int16_t **llr_save,
+ //int16_t **llr_save,
+ uint32_t llr_offset,
uint8_t beamforming_mode);
@@ -1171,6 +1170,58 @@ void dlsch_dual_stream_correlationTM34(LTE_DL_FRAME_PARMS *frame_parms,
int **dl_ch_rho_ext,
unsigned char output_shift0,
unsigned char output_shift1);
+//This function is used to compute multiplications in Hhermitian * H matrix
+void conjch0_mult_ch1(int *ch0,
+ int *ch1,
+ int32_t *ch0conj_ch1,
+ unsigned short nb_rb,
+ unsigned char output_shift0);
+
+void construct_HhH_elements(int *ch0conj_ch0,
+ int *ch1conj_ch1,
+ int *ch2conj_ch2,
+ int *ch3conj_ch3,
+ int *ch0conj_ch1,
+ int *ch1conj_ch0,
+ int *ch2conj_ch3,
+ int *ch3conj_ch2,
+ int32_t *after_mf_00,
+ int32_t *after_mf_01,
+ int32_t *after_mf_10,
+ int32_t *after_mf_11,
+ unsigned short nb_rb);
+
+void squared_matrix_element(int32_t *Hh_h_00,
+ int32_t *Hh_h_00_sq,
+ unsigned short nb_rb);
+
+void dlsch_channel_level_TM34_meas(int *ch00,
+ int *ch01,
+ int *ch10,
+ int *ch11,
+ int *avg_0,
+ int *avg_1,
+ unsigned short nb_rb);
+
+void det_HhH(int32_t *after_mf_00,
+ int32_t *after_mf_01,
+ int32_t *after_mf_10,
+ int32_t *after_mf_11,
+ int32_t *det_fin_128,
+ unsigned short nb_rb);
+
+void numer(int32_t *Hh_h_00_sq,
+ int32_t *Hh_h_01_sq,
+ int32_t *Hh_h_10_sq,
+ int32_t *Hh_h_11_sq,
+ int32_t *num_fin,
+ unsigned short nb_rb);
+
+uint8_t rank_estimation_tm3_tm4(int *dl_ch_estimates_00,
+ int *dl_ch_estimates_01,
+ int *dl_ch_estimates_10,
+ int *dl_ch_estimates_11,
+ unsigned short nb_rb);
void dlsch_channel_compensation_TM56(int **rxdataF_ext,
int **dl_ch_estimates_ext,
@@ -1326,7 +1377,7 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
int pss_sss_extract(PHY_VARS_UE *phy_vars_ue,
int32_t pss_ext[4][72],
int32_t sss_ext[4][72],
- uint8_t subframe);
+ uint8_t subframe);
/*! \brief Extract only PSS resource elements
@param phy_vars_ue Pointer to UE variables
@@ -1413,6 +1464,7 @@ void dci_encoding(uint8_t *a,
\param sub_frame_offset subframe offset in frame
@returns Number of PDCCH symbols
*/
+
uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
uint8_t num_dci,
DCI_ALLOC_t *dci_alloc,
@@ -1423,8 +1475,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
uint32_t sub_frame_offset);
uint8_t generate_dci_top_emul(PHY_VARS_eNB *phy_vars_eNB,
- uint8_t num_ue_spec_dci,
- uint8_t num_common_dci,
+ int num_dci,
DCI_ALLOC_t *dci_alloc,
uint8_t subframe);
@@ -1473,6 +1524,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
int16_t eNB_id,
uint8_t subframe);
+uint16_t dci_CRNTI_decoding_procedure(PHY_VARS_UE *ue,
+ DCI_ALLOC_t *dci_alloc,
+ uint8_t DCIFormat,
+ uint8_t agregationLevel,
+ int16_t eNB_id,
+ uint8_t subframe);
uint16_t dci_decoding_procedure_emul(LTE_UE_PDCCH **lte_ue_pdcch_vars,
uint8_t num_ue_spec_dci,
@@ -1599,7 +1656,7 @@ int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue,
*/
int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
- UE_rxtx_proc_t *proc,
+ UE_rxtx_proc_t *proc,
uint8_t eNB_id,
int16_t amp,
uint32_t subframe,
@@ -1647,6 +1704,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
void *dci_pdu,
rnti_t rnti,
DCI_format_t dci_format,
+ LTE_UE_PDCCH *pdcch_vars,
+ LTE_UE_PDSCH *pdsch_vars,
LTE_UE_DLSCH_t **dlsch,
LTE_DL_FRAME_PARMS *frame_parms,
PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
@@ -1656,16 +1715,17 @@ int generate_ue_dlsch_params_from_dci(int frame,
uint8_t beamforming_mode,
uint16_t tc_rnti);
-int fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
+void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
eNB_rxtx_proc_t *proc,
DCI_ALLOC_t *dci_alloc,
nfapi_dl_config_dci_dl_pdu *pdu);
+void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu);
-int fill_dci_and_ulsch(PHY_VARS_eNB *eNB,
- eNB_rxtx_proc_t *proc,
- DCI_ALLOC_t *dci_alloc,
- nfapi_hi_dci0_dci_pdu *pdu);
+void fill_dci0(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,
+ nfapi_hi_dci0_dci_pdu *pdu);
+
+void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe);
int32_t generate_eNB_dlsch_params_from_dci(int frame,
uint8_t subframe,
@@ -1692,7 +1752,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
DCI_format_t dci_format,
PHY_VARS_UE *phy_vars_ue,
UE_rxtx_proc_t *proc,
- uint16_t si_rnti,
+ uint16_t si_rnti,
uint16_t ra_rnti,
uint16_t p_rnti,
uint16_t cba_rnti,
@@ -1700,28 +1760,28 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
uint8_t use_srs);
int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
- UE_rxtx_proc_t *proc,
- uint8_t eNB_id);
+ UE_rxtx_proc_t *proc,
+ uint8_t eNB_id);
double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue,
uint8_t eNB_id,
- uint8_t subframe);
+ uint8_t subframe);
uint8_t sinr2cqi(double sinr,uint8_t trans_mode);
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
- eNB_rxtx_proc_t *proc,
- void *dci_pdu,
+ eNB_rxtx_proc_t *proc,
+ void *dci_pdu,
rnti_t rnti,
- DCI_format_t dci_format,
+ DCI_format_t dci_format,
uint8_t UE_id,
- uint16_t si_rnti,
+ uint16_t si_rnti,
uint16_t ra_rnti,
uint16_t p_rnti,
uint16_t cba_rnti,
uint8_t use_srs);
-void dump_ulsch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id);
+void dump_ulsch(PHY_VARS_eNB *phy_vars_eNB,int frame, int subframe, uint8_t UE_id);
int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci);
@@ -1823,7 +1883,7 @@ int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer,
@returns 0 on success
*/
unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
- eNB_rxtx_proc_t *proc,
+ eNB_rxtx_proc_t *proc,
uint8_t UE_id,
uint8_t control_only_flag,
uint8_t Nbundled,
@@ -1838,9 +1898,9 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
@returns 0 on success
*/
int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,
- int UE_id,
- int harq_pid,
- int llr8_flag);
+ int UE_id,
+ int harq_pid,
+ int llr8_flag);
/*!
\brief Decoding of ULSCH data component from 36-212. This one is single thread.
@@ -1851,19 +1911,18 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,
@returns 0 on success
*/
int ulsch_decoding_data(PHY_VARS_eNB *eNB,
- int UE_id,
- int harq_pid,
- int llr8_flag);
+ int UE_id,
+ int harq_pid,
+ int llr8_flag);
uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB,
eNB_rxtx_proc_t *proc,
- uint8_t UE_index,
+ uint8_t UE_index,
uint16_t *crnti);
void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
eNB_rxtx_proc_t *proc,
- int16_t amp,
- uint8_t sect_id);
+ int16_t amp);
/* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters.
@param phy_vars_ue Pointer to UE variables
@@ -1873,7 +1932,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
*/
void rx_phich(PHY_VARS_UE *phy_vars_ue,
- UE_rxtx_proc_t *proc,
+ UE_rxtx_proc_t *proc,
uint8_t subframe,
uint8_t eNB_id);
@@ -1987,28 +2046,28 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7]);
void generate_pucch1x(int32_t **txdataF,
- LTE_DL_FRAME_PARMS *frame_parms,
- uint8_t ncs_cell[20][7],
- PUCCH_FMT_t fmt,
- PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
- uint16_t n1_pucch,
- uint8_t shortened_format,
- uint8_t *payload,
- int16_t amp,
- uint8_t subframe);
+ LTE_DL_FRAME_PARMS *frame_parms,
+ uint8_t ncs_cell[20][7],
+ PUCCH_FMT_t fmt,
+ PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
+ uint16_t n1_pucch,
+ uint8_t shortened_format,
+ uint8_t *payload,
+ int16_t amp,
+ uint8_t subframe);
void generate_pucch2x(int32_t **txdataF,
- LTE_DL_FRAME_PARMS *fp,
- uint8_t ncs_cell[20][7],
- PUCCH_FMT_t fmt,
- PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
- uint16_t n2_pucch,
- uint8_t *payload,
- int A,
- int B2,
- int16_t amp,
- uint8_t subframe,
- uint16_t rnti);
+ LTE_DL_FRAME_PARMS *fp,
+ uint8_t ncs_cell[20][7],
+ PUCCH_FMT_t fmt,
+ PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
+ uint16_t n2_pucch,
+ uint8_t *payload,
+ int A,
+ int B2,
+ int16_t amp,
+ uint8_t subframe,
+ uint16_t rnti);
void generate_pucch3x(int32_t **txdataF,
LTE_DL_FRAME_PARMS *frame_parms,
@@ -2023,7 +2082,7 @@ void generate_pucch3x(int32_t **txdataF,
uint16_t rnti);
void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
- UE_rxtx_proc_t *proc,
+ UE_rxtx_proc_t *proc,
PUCCH_FMT_t format,
uint8_t ncs1,
uint8_t *pucch_ack_payload,
@@ -2043,11 +2102,11 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
uint8_t pucch1_thres);
int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
- eNB_rxtx_proc_t *proc,
- uint8_t UE_index,
- PUCCH_FMT_t fmt,
- uint8_t n1_pucch_sel,
- uint8_t *payload);
+ eNB_rxtx_proc_t *proc,
+ uint8_t UE_index,
+ PUCCH_FMT_t fmt,
+ uint8_t n1_pucch_sel,
+ uint8_t *payload);
/*!
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c
index 47e60808c3..afa15aba0f 100755
--- a/openair1/PHY/LTE_TRANSPORT/pucch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pucch.c
@@ -506,7 +506,11 @@ void generate_pucch1x(int32_t **txdataF,
}
break;
-
+ case pucch_format1b_csA2:
+ case pucch_format1b_csA3:
+ case pucch_format1b_csA4:
+ AssertFatal(1==0,"PUCCH format 1b_csX not supported yet\n");
+ break;
case pucch_format2:
case pucch_format2a:
case pucch_format2b:
@@ -1171,10 +1175,10 @@ uint16_t pucchfmt3_subCarrierDeMapping( PHY_VARS_eNB *eNB,
if (carrier_offset==frame_parms->ofdm_symbol_size)
carrier_offset = 0;
- #ifdef DEBUG_PUCCH_RX
+ /* #ifdef DEBUG_PUCCH_RX
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d,%d) : (%d,%d)\n",subframe,l,k,carrier_offset,m,
SubCarrierDeMapData[aa][l][k][0],SubCarrierDeMapData[aa][l][k][1]);
- #endif
+ #endif*/
}
}
}
@@ -1786,12 +1790,9 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
LTE_eNB_COMMON *common_vars = &eNB->common_vars;
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
// PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &eNB->pucch_config_dedicated[UE_id];
- int8_t sigma2_dB = eNB->measurements.n0_subband_power_tot_dB[0]-10;
- uint32_t *Po_PUCCH = &(eNB->UE_stats[UE_id].Po_PUCCH);
- int32_t *Po_PUCCH_dBm = &(eNB->UE_stats[UE_id].Po_PUCCH_dBm);
- uint32_t *Po_PUCCH1_below = &(eNB->UE_stats[UE_id].Po_PUCCH1_below);
- uint32_t *Po_PUCCH1_above = &(eNB->UE_stats[UE_id].Po_PUCCH1_above);
- int32_t *Po_PUCCH_update = &(eNB->UE_stats[UE_id].Po_PUCCH_update);
+
+ int8_t sigma2_dB = 20;//eNB->measurements.n0_subband_power_tot_dB[0]-10;
+
uint32_t u,v,n,aa;
uint32_t z[12*14];
int16_t *zptr;
@@ -1806,9 +1807,13 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
int16_t tmp_re,tmp_im,W_re=0,W_im=0;
int16_t *rxptr;
uint32_t symbol_offset;
- int16_t stat_ref_re,stat_ref_im,*cfo,chest_re,chest_im;
+ int16_t stat_ref_re,stat_ref_im,*cfo;
+ int16_t chest0_re[NB_ANTENNAS_RX][12],chest0_im[NB_ANTENNAS_RX][12];
+ int16_t chest1_re[NB_ANTENNAS_RX][12],chest1_im[NB_ANTENNAS_RX][12];
+ int32_t chest_mag;
int32_t stat_re=0,stat_im=0;
uint32_t stat,stat_max=0;
+ uint8_t log2_maxh;
uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift;
uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI;
@@ -1857,25 +1862,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
}
first_call=0;
}
- /*
- switch (frame_parms->N_RB_UL) {
- case 6:
- sigma2_dB -= 8;
- break;
- case 25:
- sigma2_dB -= 14;
- break;
- case 50:
- sigma2_dB -= 17;
- break;
- case 100:
- sigma2_dB -= 20;
- break;
- default:
- sigma2_dB -= 14;
- }
- */
if(fmt!=pucch_format3) { /* PUCCH format3 */
@@ -2074,12 +2061,12 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
rxptr = (int16_t *)&common_vars->rxdataF[aa][symbol_offset];
for (i=0; i<12; i++,j+=2,re_offset++) {
- rxcomp[aa][j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[j])>>15) - ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[1+j])>>15);
- rxcomp[aa][1+j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[1+j])>>15) + ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[j])>>15);
-
if (re_offset==frame_parms->ofdm_symbol_size)
re_offset = 0;
+ rxcomp[aa][j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[j])>>15) - ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[1+j])>>15);
+ rxcomp[aa][1+j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[1+j])>>15) + ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[j])>>15);
+
#ifdef DEBUG_PUCCH_RX
printf("[eNB] PUCCH subframe %d (%d,%d,%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,i,re_offset,m,j,
rxptr[re_offset<<1],rxptr[1+(re_offset<<1)],
@@ -2153,8 +2140,9 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
} //phase
- stat_max *= nsymb; // normalize to energy per symbol
- stat_max /= (frame_parms->N_RB_UL*12); //
+// stat_max *= nsymb; // normalize to energy per symbol
+// stat_max /= (frame_parms->N_RB_UL*12); //
+ stat_max /= (nsymb*12);
#ifdef DEBUG_PUCCH_RX
printf("[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max);
#endif
@@ -2163,11 +2151,12 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements.n0_subband_power_tot_dBm[6],pucch1_thres,phase_max);
#endif
+
eNB->pucch1_stats[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max;
eNB->pucch1_stats_thres[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres;
eNB->pucch1_stats_cnt[UE_id][subframe] = (eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023;
- T(T_ENB_PHY_PUCCH_1_ENERGY, T_INT(eNB->Mod_id), T_INT(UE_id), T_INT(frame), T_INT(subframe),
+ T(T_ENB_PHY_PUCCH_1_ENERGY, T_INT(eNB->Mod_id), T_INT(eNB->uci_vars[UE_id].rnti), T_INT(frame), T_INT(subframe),
T_INT(stat_max), T_INT(sigma2_dB+pucch1_thres));
/*
@@ -2183,15 +2172,10 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
// This is a moving average of the PUCCH1 statistics conditioned on being above or below the threshold
if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {
*payload = 1;
- *Po_PUCCH1_above = ((*Po_PUCCH1_above<<9) + (stat_max<<9)+1024)>>10;
- //LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max);
}
else {
*payload = 0;
- *Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10;
}
- //printf("[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above));
- *Po_PUCCH_update = 1;
if (UE_id==0) {
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_ENERGY,dB_fixed(stat_max));
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_THRES,sigma2_dB+pucch1_thres);
@@ -2202,11 +2186,15 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
LOG_I(PHY,"Doing PUCCH detection for format 1a/1b\n");
#endif
- for (phase=3;phase<4;phase++){ //phase=0; phase<7; phase++) {
+ for (phase=0; phase<7; phase++) {
stat=0;
for (aa=0; aanb_antennas_rx; aa++) {
for (re=0; re<12; re++) {
+
+ // compute received energy first slot, seperately for data and reference
+ // by coherent combining across symbols but not resource elements
+ // Note: assumption is that channel is stationary over symbols in slot after CFO
stat_re=0;
stat_im=0;
stat_ref_re=0;
@@ -2232,17 +2220,23 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
stat_re,stat_im);
#endif
}
+ // this is total energy received, summed over data and reference
+ stat += ((((stat_re*stat_re)) + ((stat_im*stat_im)) +
+ ((stat_ref_re*stat_ref_re)) + ((stat_ref_im*stat_ref_im)))/nsymb);
-
-
+ // now second slot
+ stat_re=0;
+ stat_im=0;
+ stat_ref_re=0;
+ stat_ref_im=0;
for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) {
if ((l2<2) || ((l2>(nsymb>>1) - 3)) ) { // data symbols
stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15);
stat_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15);
} else { //reference_symbols
- stat_ref_re += ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
- stat_ref_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
+ stat_ref_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15);
+ stat_ref_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15);
}
off+=2;
@@ -2282,116 +2276,123 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
stat_re=0;
stat_im=0;
- // printf("PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH);
- *Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1));
- *Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - eNB->rx_total_gain_dB;
- *Po_PUCCH_update = 1;
- /*
- printf("PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n",
- dB_fixed(stat_max),
- pucch1_thres+sigma2_dB,
- pucch1_thres,
- sigma2_dB,
- dB_fixed(*Po_PUCCH));
- */
+
// Do detection now
if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {//
-
- *Po_PUCCH = ((*Po_PUCCH*1023) + stat_max)>>10;
-
chL = (nsymb>>1)-4;
+ chest_mag=0;
+ cfo = (frame_parms->Ncp==0) ? &cfo_pucch_np[14*phase_max] : &cfo_pucch_ep[12*phase_max];
for (aa=0; aanb_antennas_rx; aa++) {
+ // channel estimates first
for (re=0; re<12; re++) {
- chest_re=0;
- chest_im=0;
- cfo = (frame_parms->Ncp==0) ? &cfo_pucch_np[14*phase_max] : &cfo_pucch_ep[12*phase_max];
// channel estimate for first slot
+ chest0_re[aa][re]=0;
+ chest0_im[aa][re]=0;
+ for (l=2; l<(nsymb>>1)-2; l++) {
+ off=(re<<1) + (24*l);
+ chest0_re[aa][re] += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL;
+ chest0_im[aa][re] += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL;
+ }
+
+
+ // channel estimate for second slot
+ chest1_re[aa][re]=0;
+ chest1_im[aa][re]=0;
for (l=2; l<(nsymb>>1)-2; l++) {
- off=(re<<1) + (24*l);
- chest_re += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL;
- chest_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL;
+ off=(re<<1) + (24*l) + (nsymb>>1)*24;
+ chest1_re[aa][re] += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL;
+ chest1_im[aa][re] += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL;
}
+ chest_mag = max(chest_mag,(chest0_re[aa][re]*chest0_re[aa][re]) + (chest0_im[aa][re]*chest0_im[aa][re]));
+ chest_mag = max(chest_mag,(chest1_re[aa][re]*chest1_re[aa][re]) + (chest1_im[aa][re]*chest1_im[aa][re]));
+
+ }
+ }
+ log2_maxh = log2_approx(chest_mag)/2;
+#ifdef DEBUG_PUCCH_RX
+ printf("PUCCH 1A: log2_maxh %d\n",log2_maxh);
+#endif
+ // now do channel matched filter
+ for (aa=0; aanb_antennas_rx; aa++) {
+ for (re=0; re<12; re++) {
#ifdef DEBUG_PUCCH_RX
- printf("[eNB] PUCCH subframe %d l %d re %d chest1 => (%d,%d)\n",subframe,l,re,
- chest_re,chest_im);
+ printf("[eNB] PUCCH subframe %d chest0[%d][%d] => (%d,%d)\n",subframe,aa,re,
+ chest0_re[aa][re],chest0_im[aa][re]);
#endif
-
+ // first slot, left of RS
for (l=0; l<2; l++) {
off=(re<<1) + (24*l);
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
- stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
- stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
+ stat_re += (((tmp_re*chest0_re[aa][re])>>log2_maxh) + ((tmp_im*chest0_im[aa][re])>>log2_maxh));
+ stat_im += (((tmp_re*chest0_im[aa][re])>>log2_maxh) - ((tmp_im*chest0_re[aa][re])>>log2_maxh));
off+=2;
#ifdef DEBUG_PUCCH_RX
- printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
- rxcomp[aa][off],rxcomp[aa][1+off],
- cfo[l<<1],cfo[1+(l<<1)],
- stat_re,stat_im);
+ printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) => (%d,%d)\n",subframe,l,re,
+ rxcomp[aa][off],rxcomp[aa][1+off],
+ cfo[l<<1],cfo[1+(l<<1)],
+ tmp_re,tmp_im,
+ stat_re,stat_im);
#endif
- }
-
+ }
+ // first slot, right of RS
for (l=(nsymb>>1)-2; l<(nsymb>>1); l++) {
off=(re<<1) + (24*l);
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
- stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15)/4);
- stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15)/4);
+ stat_re += (((tmp_re*chest0_re[aa][re])>>log2_maxh) + ((tmp_im*chest0_im[aa][re])>>log2_maxh));
+ stat_im += (((tmp_re*chest0_im[aa][re])>>log2_maxh) - ((tmp_im*chest0_re[aa][re])>>log2_maxh));
off+=2;
#ifdef DEBUG_PUCCH_RX
- printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
- rxcomp[aa][off],rxcomp[aa][1+off],
- cfo[l<<1],cfo[1+(l<<1)],
- stat_re,stat_im);
+ printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) => (%d,%d)\n",subframe,l,re,
+ rxcomp[aa][off],rxcomp[aa][1+off],
+ cfo[l<<1],cfo[1+(l<<1)],
+ tmp_re,tmp_im,
+ stat_re,stat_im);
#endif
- }
-
- chest_re=0;
- chest_im=0;
-
- // channel estimate for second slot
- for (l=2; l<(nsymb>>1)-2; l++) {
- off=(re<<1) + (24*l) + (nsymb>>1)*24;
- chest_re += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL;
- chest_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL;
- }
+ }
+
+
#ifdef DEBUG_PUCCH_RX
- printf("[eNB] PUCCH subframe %d l %d re %d chest2 => (%d,%d)\n",subframe,l,re,
- chest_re,chest_im);
+ printf("[eNB] PUCCH subframe %d chest1[%d][%d] => (%d,%d)\n",subframe,aa,re,
+ chest0_re[aa][re],chest0_im[aa][re]);
#endif
-
+ // second slot, left of RS
for (l=0; l<2; l++) {
- off=(re<<1) + (24*l) + (nsymb>>1)*24;
- tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
- tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
- stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
- stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
+ off=(re<<1) + (24*l) + (nsymb>>1)*24;
+ tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
+ tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
+ stat_re += (((tmp_re*chest1_re[aa][re])>>log2_maxh) + ((tmp_im*chest1_im[aa][re])>>log2_maxh));
+ stat_im += (((tmp_re*chest1_im[aa][re])>>log2_maxh) - ((tmp_im*chest1_re[aa][re])>>log2_maxh));
off+=2;
#ifdef DEBUG_PUCCH_RX
- printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
- rxcomp[aa][off],rxcomp[aa][1+off],
- cfo[l<<1],cfo[1+(l<<1)],
- stat_re,stat_im);
+ printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) => (%d,%d)\n",subframe,l,re,
+ rxcomp[aa][off],rxcomp[aa][1+off],
+ cfo[l<<1],cfo[1+(l<<1)],
+ tmp_re,tmp_im,
+ stat_re,stat_im);
#endif
}
+ // second slot, right of RS
for (l=(nsymb>>1)-2; l<(nsymb>>1)-1; l++) {
off=(re<<1) + (24*l) + (nsymb>>1)*24;
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
- stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
- stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
+ stat_re += (((tmp_re*chest1_re[aa][re])>>log2_maxh) + ((tmp_im*chest1_im[aa][re])>>log2_maxh));
+ stat_im += (((tmp_re*chest1_im[aa][re])>>log2_maxh) - ((tmp_im*chest1_re[aa][re])>>log2_maxh));
off+=2;
#ifdef DEBUG_PUCCH_RX
- printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
- rxcomp[aa][off],rxcomp[aa][1+off],
- cfo[l<<1],cfo[1+(l<<1)],
- stat_re,stat_im);
+ printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) => (%d,%d)\n",subframe,l,re,
+ rxcomp[aa][off],rxcomp[aa][1+off],
+ cfo[l<<1],cfo[1+(l<<1)],
+ tmp_re,tmp_im,
+ stat_re,stat_im);
#endif
}
@@ -2402,31 +2403,31 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
} //re
} // aa
-#ifdef DEBUG_PUCCH_RX
+
LOG_I(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im,
(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe]));
-#endif
-
- eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re);
- eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im);
- eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
+ LOG_I(PHY,"PUCCH 1a/b: subframe %d : sigma2_dB %d, stat_max %d, pucch1_thres %d\n",subframe,sigma2_dB,dB_fixed(stat_max),pucch1_thres);
+
+ eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re);
+ eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im);
+ eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
/* frame not available here - set to -1 for the moment */
- T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(eNB->Mod_id), T_INT(UE_id), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im));
+ T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(eNB->Mod_id), T_INT(eNB->uci_vars[UE_id].rnti), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im));
-
- *payload = (stat_re<0) ? 1 : 0;
+ *payload = (stat_re<0) ? 1 : 2; // 1 == ACK, 2 == NAK
if (fmt==pucch_format1b)
- *(1+payload) = (stat_im<0) ? 1 : 0;
+ *(1+payload) = (stat_im<0) ? 1 : 2;
} else { // insufficient energy on PUCCH so NAK
- *payload = 0;
+ LOG_D(PHY,"PUCCH 1a/b: subframe %d : sigma2_dB %d, stat_max %d, pucch1_thres %d\n",subframe,sigma2_dB,dB_fixed(stat_max),pucch1_thres);
+ *payload = 4; // DTX
((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re);
((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im);
eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
if (fmt==pucch_format1b)
- *(1+payload) = 0;
+ *(1+payload) = 4;
}
} else {
LOG_E(PHY,"[eNB] PUCCH fmt2/2a/2b not supported\n");
@@ -2512,45 +2513,3 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
return((int32_t)stat_max);
}
-
-
-int32_t rx_pucch_emul(PHY_VARS_eNB *eNB,
- eNB_rxtx_proc_t *proc,
- uint8_t UE_index,
- PUCCH_FMT_t fmt,
- uint8_t n1_pucch_sel,
- uint8_t *payload)
-
-{
- uint8_t UE_id;
- uint16_t rnti;
- int subframe = proc->subframe_rx;
- uint8_t CC_id = eNB->CC_id;
-
- rnti = eNB->ulsch[UE_index]->rnti;
-
- for (UE_id=0; UE_idpdcch_vars[subframe & 0x1][0]->crnti)
- break;
- }
-
- if (UE_id==NB_UE_INST) {
- LOG_W(PHY,"rx_pucch_emul: Didn't find UE with rnti %x\n",rnti);
- return(-1);
- }
-
- if (fmt == pucch_format1) {
- payload[0] = PHY_vars_UE_g[UE_id][CC_id]->sr[subframe];
- } else if (fmt == pucch_format1a) {
- payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0];
- } else if (fmt == pucch_format1b) {
- payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0];
- payload[1] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[1];
- } else
- LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",proc->frame_rx);
-
- if (PHY_vars_UE_g[UE_id][CC_id]->pucch_sel[subframe] == n1_pucch_sel)
- return(99);
- else
- return(0);
-}
diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c
index 92f2851a6d..b62e462449 100755
--- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c
@@ -116,7 +116,7 @@ int generate_eNB_ulsch_params_from_rar(PHY_VARS_eNB *eNB,
break;
}
- ulsch_harq->TPC = (rar[3]>>2)&7;//rar->TPC;
+
rballoc = (((uint16_t)(rar[1]&7))<<7)|(rar[2]>>1);
if (rballoc>RIV_max) {
@@ -150,19 +150,19 @@ int generate_eNB_ulsch_params_from_rar(PHY_VARS_eNB *eNB,
ulsch->rnti = rnti;
ulsch->harq_mask = 1<round == 0) {
+ // if (ulsch_harq->round == 0) {
ulsch_harq->status = ACTIVE;
ulsch_harq->rvidx = 0;
- ulsch_harq->mcs = ((rar[2]&1)<<3)|(rar[3]>>5);
- //ulsch_harq->TBS = dlsch_tbs25[ulsch_harq->mcs][ulsch_harq->nb_rb-1];
- ulsch_harq->TBS = TBStable[get_I_TBS_UL(ulsch_harq->mcs)][ulsch_harq->nb_rb-1];
+ uint8_t mcs = ((rar[2]&1)<<3)|(rar[3]>>5);
+ ulsch_harq->TBS = TBStable[get_I_TBS_UL(mcs)][ulsch_harq->nb_rb-1];
+ ulsch_harq->Qm = get_Qm_ul(mcs);
ulsch_harq->Msc_initial = 12*ulsch_harq->nb_rb;
ulsch_harq->Nsymb_initial = 9;
ulsch_harq->round = 0;
- } else {
+ /* } else {
ulsch_harq->rvidx = 0;
ulsch_harq->round++;
- }
+ }*/
ulsch->Msg3_active = 1;
@@ -173,6 +173,7 @@ int generate_eNB_ulsch_params_from_rar(PHY_VARS_eNB *eNB,
&ulsch_harq->frame,
&ulsch_harq->subframe);
+ LOG_I(PHY,"Programming msg3 reception in (%d,%d)\n",ulsch_harq->frame,ulsch_harq->subframe);
use_srs = is_srs_occasion_common(frame_parms,ulsch_harq->frame,ulsch_harq->subframe);
ulsch_harq->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
ulsch_harq->srs_active = use_srs;
@@ -264,15 +265,11 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT[rballoc];
ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT[rballoc];
- if (ulsch->harq_processes[harq_pid]->nb_rb ==0)
- return(-1);
+ AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb >0, "nb_rb == 0\n");
ulsch->power_offset = ue_power_offsets[ulsch->harq_processes[harq_pid]->nb_rb];
- if (ulsch->harq_processes[harq_pid]->nb_rb > 4) {
- LOG_D(PHY,"rar_tools.c: unlikely rb count for RAR grant : nb_rb > 3\n");
- return(-1);
- }
+ AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb <= 6,"unlikely rb count for RAR grant : nb_rb > 6\n");
// ulsch->harq_processes[harq_pid]->Ndi = 1;
if (ulsch->harq_processes[harq_pid]->round == 0)
diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c
index 5eada8bc9c..bb12be9157 100755
--- a/openair1/PHY/LTE_TRANSPORT/sss.c
+++ b/openair1/PHY/LTE_TRANSPORT/sss.c
@@ -160,6 +160,7 @@ int _do_pss_sss_extract(PHY_VARS_UE *ue,
int32_t *pss_rxF,*pss_rxF_ext;
int32_t *sss_rxF,*sss_rxF_ext;
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ uint8_t next_thread_id = ue->current_thread_id[subframe]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[subframe]+1);
int rx_offset = frame_parms->ofdm_symbol_size-3*12;
uint8_t pss_symb,sss_symb;
@@ -173,7 +174,7 @@ int _do_pss_sss_extract(PHY_VARS_UE *ue,
pss_symb = 6-frame_parms->Ncp;
sss_symb = pss_symb-1;
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe&0x1)].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF;
pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))];
sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))];
@@ -183,18 +184,18 @@ int _do_pss_sss_extract(PHY_VARS_UE *ue,
if(subframe==5 || subframe==0)
{
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe&0x1)].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF;
sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))];
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[((subframe+1)&0x1)].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF;
pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))];
}
else if(subframe==6 || subframe==1)
{
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe&0x1)].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF;
pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))];
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe+1)&0x1].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF;
sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))];
}
else
@@ -222,18 +223,18 @@ int _do_pss_sss_extract(PHY_VARS_UE *ue,
{
if(subframe==5 || subframe==0)
{
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe&0x1)].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF;
sss_rxF = &rxdataF[aarx][(1 + (sss_symb*(frame_parms->ofdm_symbol_size)))];
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[((subframe+1)&0x1)].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF;
pss_rxF = &rxdataF[aarx][(1 + (pss_symb*(frame_parms->ofdm_symbol_size)))];
}
else if(subframe==6 || subframe==1)
{
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe&0x1)].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF;
pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))];
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe+1)&0x1].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF;
sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))];
}
else
diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c
index 8b72b4e733..f61749e6ca 100755
--- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c
@@ -232,18 +232,6 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_
stats->DL_pmi_dual = ((HLC_subband_cqi_rank2_2A_1_5MHz *)o)->pmi;
break;
- case HLC_subband_cqi_mcs_CBA:
- if ((*crnti == ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->crnti) && (*crnti !=0)) {
- *access_mode=CBA_ACCESS;
- LOG_N(PHY,"[eNB] UCI for CBA : mcs %d crnti %x\n",
- ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->mcs, ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->crnti);
- } else {
- LOG_D(PHY,"[eNB] UCI for CBA : rnti (enb context %x, rx uci %x) invalid, unknown access\n",
- *crnti, ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->crnti);
- }
-
- break;
-
case unknown_cqi:
default:
LOG_N(PHY,"[eNB][UCI] received unknown uci (rb %d)\n",N_RB_DL);
@@ -318,18 +306,6 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_
stats->DL_pmi_dual = ((HLC_subband_cqi_rank2_2A_5MHz *)o)->pmi;
break;
- case HLC_subband_cqi_mcs_CBA:
- if ((*crnti == ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti) && (*crnti !=0)) {
- *access_mode=CBA_ACCESS;
- LOG_N(PHY,"[eNB] UCI for CBA : mcs %d crnti %x\n",
- ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->mcs, ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti);
- } else {
- LOG_D(PHY,"[eNB] UCI for CBA : rnti (enb context %x, rx uci %x) invalid, unknown access\n",
- *crnti, ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti);
- }
-
- break;
-
case unknown_cqi:
default:
LOG_N(PHY,"[eNB][UCI] received unknown uci (rb %d)\n",N_RB_DL);
@@ -398,18 +374,6 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_
stats->DL_pmi_dual = ((HLC_subband_cqi_rank2_2A_10MHz *)o)->pmi;
break;
- case HLC_subband_cqi_mcs_CBA:
- if ((*crnti == ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->crnti) && (*crnti !=0)) {
- *access_mode=CBA_ACCESS;
- LOG_N(PHY,"[eNB] UCI for CBA : mcs %d crnti %x\n",
- ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->mcs, ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->crnti);
- } else {
- LOG_D(PHY,"[eNB] UCI for CBA : rnti (enb context %x, rx uci %x) invalid, unknown access\n",
- *crnti, ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->crnti);
- }
-
- break;
-
case unknown_cqi:
default:
LOG_N(PHY,"[eNB][UCI] received unknown uci (RB %d)\n",N_RB_DL);
@@ -478,18 +442,6 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_
stats->DL_pmi_dual = ((HLC_subband_cqi_rank2_2A_20MHz *)o)->pmi;
break;
- case HLC_subband_cqi_mcs_CBA:
- if ((*crnti == ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->crnti) && (*crnti !=0)) {
- *access_mode=CBA_ACCESS;
- LOG_N(PHY,"[eNB] UCI for CBA : mcs %d crnti %x\n",
- ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->mcs, ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->crnti);
- } else {
- LOG_D(PHY,"[eNB] UCI for CBA : rnti (enb context %x, rx uci %x) invalid, unknown access\n",
- *crnti, ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->crnti);
- }
-
- break;
-
case unknown_cqi:
default:
LOG_N(PHY,"[eNB][UCI] received unknown uci (RB %d)\n",N_RB_DL);
@@ -750,13 +702,6 @@ void print_CQI(void *o,UCI_format_t uci_format,unsigned char eNB_id,int N_RB_DL)
break;
}
-#endif //DEBUG_UCI
- break;
-
- case HLC_subband_cqi_mcs_CBA:
-#ifdef DEBUG_UCI
- LOG_I(PHY,"[PRINT CQI] hlc_cqi_mcs_CBA : eNB %d, mcs %d\n",eNB_id,((HLC_subband_cqi_mcs_CBA_5MHz *)o)->mcs);
- LOG_I(PHY,"[PRINT CQI] hlc_cqi_mcs_CBA : eNB %d, rnti %x\n",eNB_id,((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti);
#endif //DEBUG_UCI
break;
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
index 52f302ce92..f4d7cee401 100755
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
@@ -262,7 +262,7 @@ uint32_t ulsch_encoding(uint8_t *a,
// fill CQI/PMI information
if (ulsch->O>0) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_IN);
- rnti = ue->pdcch_vars[subframe_rx & 0x1][eNB_id]->crnti;
+ rnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti;
fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff);
LOG_D(PHY,"ULSCH Encoding rnti %x \n", rnti);
@@ -971,7 +971,7 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer,
LTE_UE_DLSCH_t **dlsch = ue->dlsch[0][eNB_id];
PHY_MEASUREMENTS *meas = &ue->measurements;
uint8_t tmode = ue->transmission_mode[eNB_id];
- uint16_t rnti=ue->pdcch_vars[subframe_rx & 0x1][eNB_id]->crnti;
+ uint16_t rnti=ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti;
LOG_D(PHY,"EMUL UE ulsch_encoding for eNB %d,mod_id %d, harq_pid %d rnti %x, ACK(%d,%d) \n",
eNB_id,ue->Mod_id, harq_pid, rnti,ulsch->o_ACK[0],ulsch->o_ACK[1]);
@@ -1005,7 +1005,7 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer,
//UE_transport_info_TB_index[ue->Mod_id]+=ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3;
// navid: currently more than one eNB is not supported in the code
UE_transport_info[ue->Mod_id][ue->CC_id].num_eNB = 1;
- UE_transport_info[ue->Mod_id][ue->CC_id].rnti[0] = ue->pdcch_vars[subframe_rx & 0x1][0]->crnti;
+ UE_transport_info[ue->Mod_id][ue->CC_id].rnti[0] = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][0]->crnti;
UE_transport_info[ue->Mod_id][ue->CC_id].eNB_id[0] = eNB_id;
UE_transport_info[ue->Mod_id][ue->CC_id].harq_pid[0] = harq_pid;
UE_transport_info[ue->Mod_id][ue->CC_id].tbs[0] = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3 ;
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 6ff4fd58fd..da0c50edf9 100755
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -224,9 +224,9 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
int16_t dummy_w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)];
LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
- int Q_m = get_Qm_ul(ulsch_harq->mcs);
+ int Q_m = ulsch_harq->Qm;
int G = ulsch_harq->G;
- uint32_t E;
+ uint32_t E=0;
uint32_t Gp,GpmodC,Nl=1;
uint32_t C = ulsch_harq->C;
@@ -273,8 +273,7 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
else if (Kr_bytes <= 768)
iind = 123 + ((Kr_bytes-256)>>3);
else {
- LOG_E(PHY,"ulsch_decoding: Illegal codeword size %d!!!\n",Kr_bytes);
- return(-1);
+ AssertFatal(1==0,"ulsch_decoding: Illegal codeword size %d!!!\n",Kr_bytes);
}
// This is stolen from rate-matching algorithm to get the value of E
@@ -352,7 +351,7 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
1,
ulsch_harq->rvidx,
(ulsch_harq->round==0)?1:0, // clear
- get_Qm_ul(ulsch_harq->mcs),
+ ulsch_harq->Qm,
1,
r,
&E)==-1) {
@@ -447,7 +446,7 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
int16_t dummy_w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)];
LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
- //int Q_m = get_Qm_ul(ulsch_harq->mcs);
+
int G = ulsch_harq->G;
unsigned int E;
int Cby2;
@@ -571,7 +570,7 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
1,
ulsch_harq->rvidx,
(ulsch_harq->round==0)?1:0, // clear
- get_Qm_ul(ulsch_harq->mcs),
+ ulsch_harq->Qm,
1,
r,
&E)==-1) {
@@ -655,7 +654,7 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
int16_t dummy_w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)];
LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
- //int Q_m = get_Qm_ul(ulsch_harq->mcs);
+
int G = ulsch_harq->G;
unsigned int E;
@@ -736,7 +735,7 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
1,
ulsch_harq->rvidx,
(ulsch_harq->round==0)?1:0, // clear
- get_Qm_ul(ulsch_harq->mcs),
+ ulsch_harq->Qm,
1,
r,
&E)==-1) {
@@ -865,7 +864,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
unsigned int Qprime_ACK,Qprime_RI,len_ACK=0,len_RI=0;
// uint8_t q_ACK[MAX_ACK_PAYLOAD],q_RI[MAX_RI_PAYLOAD];
int metric,metric_new;
- uint8_t o_flip[8];
uint32_t x1, x2, s=0;
int16_t ys,c;
uint32_t wACK_idx;
@@ -907,21 +905,23 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
A = ulsch_harq->TBS;
- Q_m = get_Qm_ul(ulsch_harq->mcs);
+ Q_m = ulsch_harq->Qm;
G = nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch;
-#ifdef DEBUG_ULSCH_DECODING
- printf("ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n",
- frame_parms->Nid_cell,ulsch->rnti,x2,
- ulsch_harq->round,
- ulsch_harq->rvidx,
- ulsch_harq->mcs,
- ulsch_harq->O_RI,
- ulsch_harq->O_ACK,
- G,
- subframe);
-#endif
+ //#ifdef DEBUG_ULSCH_DECODING
+ LOG_I(PHY,"Frame %d, Subframe %d: ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): A %d, round %d, RV %d, O_r1 %d, O_RI %d, O_ACK %d, G %d\n",
+ proc->frame_rx,subframe,
+ frame_parms->Nid_cell,ulsch->rnti,x2,
+ A,
+ ulsch_harq->round,
+ ulsch_harq->rvidx,
+ ulsch_harq->Or1,
+ ulsch_harq->O_RI,
+ ulsch_harq->O_ACK,
+ G);
+
+ //#endif
if (ulsch_harq->round == 0) {
// This is a new packet, so compute quantities regarding segmentation
@@ -952,12 +952,11 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
}
AssertFatal(sumKr>0,
- "[eNB %d] ulsch_decoding.c: FATAL sumKr is 0! (Nid_cell %d, rnti %x, x2 %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n",
+ "[eNB] ulsch_decoding.c: FATAL sumKr is 0! (Nid_cell %d, rnti %x, x2 %x): harq_pid %d round %d, RV %d, O_RI %d, O_ACK %d, G %d, subframe %d\n",
frame_parms->Nid_cell,ulsch->rnti,x2,
harq_pid,
ulsch_harq->round,
ulsch_harq->rvidx,
- ulsch_harq->mcs,
ulsch_harq->O_RI,
ulsch_harq->O_ACK,
G,
@@ -1561,29 +1560,12 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
&ulsch_harq->o_d[96],
&ulsch_harq->o_w[0]);
- memset(o_flip,0,1+((8+ulsch_harq->Or1)/8));
- phy_viterbi_lte_sse2(ulsch_harq->o_d+96,o_flip,8+ulsch_harq->Or1);
+ memset(ulsch_harq->o,0,(7+8+ulsch_harq->Or1) / 8);
+ phy_viterbi_lte_sse2(ulsch_harq->o_d+96,ulsch_harq->o,8+ulsch_harq->Or1);
- if (extract_cqi_crc(o_flip,ulsch_harq->Or1) == (crc8(o_flip,ulsch_harq->Or1)>>24))
+ if (extract_cqi_crc(ulsch_harq->o,ulsch_harq->Or1) == (crc8(ulsch_harq->o,ulsch_harq->Or1)>>24))
ulsch_harq->cqi_crc_status = 1;
- if (ulsch->harq_processes[harq_pid]->Or1<=32) {
- ulsch_harq->o[3] = o_flip[0] ;
- ulsch_harq->o[2] = o_flip[1] ;
- ulsch_harq->o[1] = o_flip[2] ;
- ulsch_harq->o[0] = o_flip[3] ;
- } else {
- ulsch_harq->o[7] = o_flip[0] ;
- ulsch_harq->o[6] = o_flip[1] ;
- ulsch_harq->o[5] = o_flip[2] ;
- ulsch_harq->o[4] = o_flip[3] ;
- ulsch_harq->o[3] = o_flip[4] ;
- ulsch_harq->o[2] = o_flip[5] ;
- ulsch_harq->o[1] = o_flip[6] ;
- ulsch_harq->o[0] = o_flip[7] ;
-
- }
-
#ifdef DEBUG_ULSCH_DECODING
printf("ulsch_decoding: Or1=%d\n",ulsch_harq->Or1);
@@ -1591,9 +1573,9 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
printf("ulsch_decoding: O[%d] %d\n",i,ulsch_harq->o[i]);
if (ulsch_harq->cqi_crc_status == 1)
- printf("RX CQI CRC OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1));
+ printf("RX CQI CRC OK (%x)\n",extract_cqi_crc(ulsch_harq->o,ulsch_harq->Or1));
else
- printf("RX CQI CRC NOT OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1));
+ printf("RX CQI CRC NOT OK (%x)\n",extract_cqi_crc(ulsch_harq->o,ulsch_harq->Or1));
#endif
}
@@ -1996,7 +1978,7 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc,
#endif
for (UE_id=0; UE_idpdcch_vars[subframe & 0x1][0]->crnti)
+ if (rnti == PHY_vars_UE_g[UE_id][CC_id]->pdcch_vars[PHY_vars_UE_g[UE_id][CC_id]->current_thread_id[subframe]][0]->crnti)
break;
}
@@ -2015,41 +1997,6 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc,
} else
*crnti = 0x0;
- // Do abstraction here to determine if packet it in error
- /* if (ulsch_abstraction_MIESM(eNB->sinr_dB_eNB,1, eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, eNB->ulsch[UE_id]->harq_processes[harq_pid]->first_rb) == 1)
- flag = 1;
- else flag = 0;*/
-
-
- /*
- //SINRdbPost = eNB->sinr_dB_eNB;
- mcsPost = eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,
- nrbPost = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb;
- frbPost = eNB->ulsch[UE_id]->harq_processes[harq_pid]->first_rb;
-
-
- if(nrbPost > 0)
- {
- SINRdbPost = eNB->sinr_dB_eNB;
- ULflag1 = 1;
- }
- else
- {
- SINRdbPost = NULL ;
- ULflag1 = 0 ;
- }*/
-
- //
- // write_output("postprocSINR.m","SINReNB",eNB->sinr_dB,301,1,7);
-
-
- //Yazdir buraya her frame icin 300 eNb
- // fprintf(SINRrx,"%e,%e,%e,%e;\n",SINRdbPost);
- //fprintf(SINRrx,"%e\n",SINRdbPost);
-
- // fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
-
- // if (ulsch_abstraction(eNB->sinr_dB,1, eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, eNB->ulsch[UE_id]->harq_processes[harq_pid]->first_rb) == 1) {
if (1) {
LOG_D(PHY,"ulsch_decoding_emul abstraction successful\n");
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index 18f46adf8f..0a7d7b1a21 100755
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1025,381 +1025,16 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext,
-#if defined(__x86_64__) || defined(__i386__)
-__m128i QAM_amp128U_0,QAM_amp128bU_0,QAM_amp128U_1,QAM_amp128bU_1;
-#endif
-void ulsch_channel_compensation_alamouti(int32_t **rxdataF_ext, // For Distributed Alamouti Combining
- int32_t **ul_ch_estimates_ext_0,
- int32_t **ul_ch_estimates_ext_1,
- int32_t **ul_ch_mag_0,
- int32_t **ul_ch_magb_0,
- int32_t **ul_ch_mag_1,
- int32_t **ul_ch_magb_1,
- int32_t **rxdataF_comp_0,
- int32_t **rxdataF_comp_1,
- LTE_DL_FRAME_PARMS *frame_parms,
- uint8_t symbol,
- uint8_t Qm,
- uint16_t nb_rb,
- uint8_t output_shift)
-{
-#if defined(__x86_64__) || defined(__i386__)
- uint16_t rb;
- __m128i *ul_ch128_0,*ul_ch128_1,*ul_ch_mag128_0,*ul_ch_mag128_1,*ul_ch_mag128b_0,*ul_ch_mag128b_1,*rxdataF128,*rxdataF_comp128_0,*rxdataF_comp128_1;
- uint8_t aarx;//,symbol_mod;
- __m128i mmtmpU0,mmtmpU1,mmtmpU2,mmtmpU3;
- // symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
- // printf("comp: symbol %d\n",symbol);
- if (Qm == 4) {
- QAM_amp128U_0 = _mm_set1_epi16(QAM16_n1);
- QAM_amp128U_1 = _mm_set1_epi16(QAM16_n1);
- } else if (Qm == 6) {
- QAM_amp128U_0 = _mm_set1_epi16(QAM64_n1);
- QAM_amp128bU_0 = _mm_set1_epi16(QAM64_n2);
- QAM_amp128U_1 = _mm_set1_epi16(QAM64_n1);
- QAM_amp128bU_1 = _mm_set1_epi16(QAM64_n2);
- }
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
- ul_ch128_0 = (__m128i *)&ul_ch_estimates_ext_0[aarx][symbol*frame_parms->N_RB_DL*12];
- ul_ch_mag128_0 = (__m128i *)&ul_ch_mag_0[aarx][symbol*frame_parms->N_RB_DL*12];
- ul_ch_mag128b_0 = (__m128i *)&ul_ch_magb_0[aarx][symbol*frame_parms->N_RB_DL*12];
- ul_ch128_1 = (__m128i *)&ul_ch_estimates_ext_1[aarx][symbol*frame_parms->N_RB_DL*12];
- ul_ch_mag128_1 = (__m128i *)&ul_ch_mag_1[aarx][symbol*frame_parms->N_RB_DL*12];
- ul_ch_mag128b_1 = (__m128i *)&ul_ch_magb_1[aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128_0 = (__m128i *)&rxdataF_comp_0[aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128_1 = (__m128i *)&rxdataF_comp_1[aarx][symbol*frame_parms->N_RB_DL*12];
- for (rb=0; rb2) {
- // get channel amplitude if not QPSK
-
- mmtmpU0 = _mm_madd_epi16(ul_ch128_0[0],ul_ch128_0[0]);
-
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
-
- mmtmpU1 = _mm_madd_epi16(ul_ch128_0[1],ul_ch128_0[1]);
- mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift);
- mmtmpU0 = _mm_packs_epi32(mmtmpU0,mmtmpU1);
-
- ul_ch_mag128_0[0] = _mm_unpacklo_epi16(mmtmpU0,mmtmpU0);
- ul_ch_mag128b_0[0] = ul_ch_mag128_0[0];
- ul_ch_mag128_0[0] = _mm_mulhi_epi16(ul_ch_mag128_0[0],QAM_amp128U_0);
- ul_ch_mag128_0[0] = _mm_slli_epi16(ul_ch_mag128_0[0],2); // 2 to compensate the scale channel estimate
-
- ul_ch_mag128_0[1] = _mm_unpackhi_epi16(mmtmpU0,mmtmpU0);
- ul_ch_mag128b_0[1] = ul_ch_mag128_0[1];
- ul_ch_mag128_0[1] = _mm_mulhi_epi16(ul_ch_mag128_0[1],QAM_amp128U_0);
- ul_ch_mag128_0[1] = _mm_slli_epi16(ul_ch_mag128_0[1],2); // 2 to scale compensate the scale channel estimate
-
- mmtmpU0 = _mm_madd_epi16(ul_ch128_0[2],ul_ch128_0[2]);
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
- mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0);
-
- ul_ch_mag128_0[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1);
- ul_ch_mag128b_0[2] = ul_ch_mag128_0[2];
-
- ul_ch_mag128_0[2] = _mm_mulhi_epi16(ul_ch_mag128_0[2],QAM_amp128U_0);
- ul_ch_mag128_0[2] = _mm_slli_epi16(ul_ch_mag128_0[2],2); // 2 to scale compensate the scale channel estimat
-
-
- ul_ch_mag128b_0[0] = _mm_mulhi_epi16(ul_ch_mag128b_0[0],QAM_amp128bU_0);
- ul_ch_mag128b_0[0] = _mm_slli_epi16(ul_ch_mag128b_0[0],2); // 2 to scale compensate the scale channel estima
-
-
- ul_ch_mag128b_0[1] = _mm_mulhi_epi16(ul_ch_mag128b_0[1],QAM_amp128bU_0);
- ul_ch_mag128b_0[1] = _mm_slli_epi16(ul_ch_mag128b_0[1],2); // 2 to scale compensate the scale channel estima
-
- ul_ch_mag128b_0[2] = _mm_mulhi_epi16(ul_ch_mag128b_0[2],QAM_amp128bU_0);
- ul_ch_mag128b_0[2] = _mm_slli_epi16(ul_ch_mag128b_0[2],2); // 2 to scale compensate the scale channel estima
-
-
-
-
- mmtmpU0 = _mm_madd_epi16(ul_ch128_1[0],ul_ch128_1[0]);
-
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
-
- mmtmpU1 = _mm_madd_epi16(ul_ch128_1[1],ul_ch128_1[1]);
- mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift);
- mmtmpU0 = _mm_packs_epi32(mmtmpU0,mmtmpU1);
-
- ul_ch_mag128_1[0] = _mm_unpacklo_epi16(mmtmpU0,mmtmpU0);
- ul_ch_mag128b_1[0] = ul_ch_mag128_1[0];
- ul_ch_mag128_1[0] = _mm_mulhi_epi16(ul_ch_mag128_1[0],QAM_amp128U_1);
- ul_ch_mag128_1[0] = _mm_slli_epi16(ul_ch_mag128_1[0],2); // 2 to compensate the scale channel estimate
-
- ul_ch_mag128_1[1] = _mm_unpackhi_epi16(mmtmpU0,mmtmpU0);
- ul_ch_mag128b_1[1] = ul_ch_mag128_1[1];
- ul_ch_mag128_1[1] = _mm_mulhi_epi16(ul_ch_mag128_1[1],QAM_amp128U_1);
- ul_ch_mag128_1[1] = _mm_slli_epi16(ul_ch_mag128_1[1],2); // 2 to scale compensate the scale channel estimate
-
- mmtmpU0 = _mm_madd_epi16(ul_ch128_1[2],ul_ch128_1[2]);
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
- mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0);
-
- ul_ch_mag128_1[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1);
- ul_ch_mag128b_1[2] = ul_ch_mag128_1[2];
-
- ul_ch_mag128_1[2] = _mm_mulhi_epi16(ul_ch_mag128_1[2],QAM_amp128U_0);
- ul_ch_mag128_1[2] = _mm_slli_epi16(ul_ch_mag128_1[2],2); // 2 to scale compensate the scale channel estimat
-
-
- ul_ch_mag128b_1[0] = _mm_mulhi_epi16(ul_ch_mag128b_1[0],QAM_amp128bU_1);
- ul_ch_mag128b_1[0] = _mm_slli_epi16(ul_ch_mag128b_1[0],2); // 2 to scale compensate the scale channel estima
-
-
- ul_ch_mag128b_1[1] = _mm_mulhi_epi16(ul_ch_mag128b_1[1],QAM_amp128bU_1);
- ul_ch_mag128b_1[1] = _mm_slli_epi16(ul_ch_mag128b_1[1],2); // 2 to scale compensate the scale channel estima
-
- ul_ch_mag128b_1[2] = _mm_mulhi_epi16(ul_ch_mag128b_1[2],QAM_amp128bU_1);
- ul_ch_mag128b_1[2] = _mm_slli_epi16(ul_ch_mag128b_1[2],2); // 2 to scale compensate the scale channel estima
- }
-
-
- /************************For Computing (y)*(h0*)********************************************/
-
- // multiply by conjugated channel
- mmtmpU0 = _mm_madd_epi16(ul_ch128_0[0],rxdataF128[0]);
- // print_ints("re",&mmtmpU0);
-
- // mmtmpU0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpU1 = _mm_shufflelo_epi16(ul_ch128_0[0],_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)&conjugate[0]);
- // print_ints("im",&mmtmpU1);
- mmtmpU1 = _mm_madd_epi16(mmtmpU1,rxdataF128[0]);
- // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
- // print_ints("re(shift)",&mmtmpU0);
- mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift);
- // print_ints("im(shift)",&mmtmpU1);
- mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1);
- mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1);
- // print_ints("c0",&mmtmpU2);
- // print_ints("c1",&mmtmpU3);
- rxdataF_comp128_0[0] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
- // print_shorts("rx:",rxdataF128[0]);
- // print_shorts("ch:",ul_ch128_0[0]);
- // print_shorts("pack:",rxdataF_comp128_0[0]);
-
- // multiply by conjugated channel
- mmtmpU0 = _mm_madd_epi16(ul_ch128_0[1],rxdataF128[1]);
- // mmtmpU0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpU1 = _mm_shufflelo_epi16(ul_ch128_0[1],_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)conjugate);
- mmtmpU1 = _mm_madd_epi16(mmtmpU1,rxdataF128[1]);
- // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
- mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift);
- mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1);
- mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1);
-
- rxdataF_comp128_0[1] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
- // print_shorts("rx:",rxdataF128[1]);
- // print_shorts("ch:",ul_ch128_0[1]);
- // print_shorts("pack:",rxdataF_comp128_0[1]);
- // multiply by conjugated channel
- mmtmpU0 = _mm_madd_epi16(ul_ch128_0[2],rxdataF128[2]);
- // mmtmpU0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpU1 = _mm_shufflelo_epi16(ul_ch128_0[2],_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)conjugate);
- mmtmpU1 = _mm_madd_epi16(mmtmpU1,rxdataF128[2]);
- // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
- mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift);
- mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1);
- mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1);
-
- rxdataF_comp128_0[2] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
- // print_shorts("rx:",rxdataF128[2]);
- // print_shorts("ch:",ul_ch128_0[2]);
- // print_shorts("pack:",rxdataF_comp128_0[2]);
-
-
-
-
- /*************************For Computing (y*)*(h1)************************************/
- // multiply by conjugated signal
- mmtmpU0 = _mm_madd_epi16(ul_ch128_1[0],rxdataF128[0]);
- // print_ints("re",&mmtmpU0);
-
- // mmtmpU0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpU1 = _mm_shufflelo_epi16(rxdataF128[0],_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)&conjugate[0]);
- // print_ints("im",&mmtmpU1);
- mmtmpU1 = _mm_madd_epi16(mmtmpU1,ul_ch128_1[0]);
- // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
- // print_ints("re(shift)",&mmtmpU0);
- mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift);
- // print_ints("im(shift)",&mmtmpU1);
- mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1);
- mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1);
- // print_ints("c0",&mmtmpU2);
- // print_ints("c1",&mmtmpU3);
- rxdataF_comp128_1[0] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
- // print_shorts("rx:",rxdataF128[0]);
- // print_shorts("ch_conjugate:",ul_ch128_1[0]);
- // print_shorts("pack:",rxdataF_comp128_1[0]);
-
-
- // multiply by conjugated signal
- mmtmpU0 = _mm_madd_epi16(ul_ch128_1[1],rxdataF128[1]);
- // mmtmpU0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpU1 = _mm_shufflelo_epi16(rxdataF128[1],_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)conjugate);
- mmtmpU1 = _mm_madd_epi16(mmtmpU1,ul_ch128_1[1]);
- // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
- mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift);
- mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1);
- mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1);
-
- rxdataF_comp128_1[1] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
- // print_shorts("rx:",rxdataF128[1]);
- // print_shorts("ch_conjugate:",ul_ch128_1[1]);
- // print_shorts("pack:",rxdataF_comp128_1[1]);
-
-
- // multiply by conjugated signal
- mmtmpU0 = _mm_madd_epi16(ul_ch128_1[2],rxdataF128[2]);
- // mmtmpU0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpU1 = _mm_shufflelo_epi16(rxdataF128[2],_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1));
- mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)conjugate);
- mmtmpU1 = _mm_madd_epi16(mmtmpU1,ul_ch128_1[2]);
- // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
- mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift);
- mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1);
- mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1);
-
- rxdataF_comp128_1[2] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
- // print_shorts("rx:",rxdataF128[2]);
- // print_shorts("ch_conjugate:",ul_ch128_0[2]);
- // print_shorts("pack:",rxdataF_comp128_1[2]);
-
-
-
- ul_ch128_0+=3;
- ul_ch_mag128_0+=3;
- ul_ch_mag128b_0+=3;
- ul_ch128_1+=3;
- ul_ch_mag128_1+=3;
- ul_ch_mag128b_1+=3;
- rxdataF128+=3;
- rxdataF_comp128_0+=3;
- rxdataF_comp128_1+=3;
-
- }
- }
-
-
- _mm_empty();
- _m_empty();
-#endif
-}
-
-
-
-
-void ulsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms,// For Distributed Alamouti Receiver Combining
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_0,
- int32_t **rxdataF_comp_1,
- int32_t **ul_ch_mag,
- int32_t **ul_ch_magb,
- int32_t **ul_ch_mag_0,
- int32_t **ul_ch_magb_0,
- int32_t **ul_ch_mag_1,
- int32_t **ul_ch_magb_1,
- uint8_t symbol,
- uint16_t nb_rb)
-{
-
-#if defined(__x86_64__) || defined(__i386__)
- int16_t *rxF,*rxF0,*rxF1;
- __m128i *ch_mag,*ch_magb,*ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b;
- uint8_t rb,re,aarx;
- int32_t jj=(symbol*frame_parms->N_RB_DL*12);
-
-
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
-
- rxF = (int16_t*)&rxdataF_comp[aarx][jj];
- rxF0 = (int16_t*)&rxdataF_comp_0[aarx][jj]; // Contains (y)*(h0*)
- rxF1 = (int16_t*)&rxdataF_comp_1[aarx][jj]; // Contains (y*)*(h1)
- ch_mag = (__m128i *)&ul_ch_mag[aarx][jj];
- ch_mag0 = (__m128i *)&ul_ch_mag_0[aarx][jj];
- ch_mag1 = (__m128i *)&ul_ch_mag_1[aarx][jj];
- ch_magb = (__m128i *)&ul_ch_magb[aarx][jj];
- ch_mag0b = (__m128i *)&ul_ch_magb_0[aarx][jj];
- ch_mag1b = (__m128i *)&ul_ch_magb_1[aarx][jj];
-
- for (rb=0; rbnb_antennas_rx; aarx++) {
//clear average level
#if defined(__x86_64__) || defined(__i386__)
@@ -1464,8 +1102,7 @@ void ulsch_channel_level(int32_t **drs_ch_estimates_ext,
#endif
}
-int32_t avgU[2];
-int32_t avgU_0[2],avgU_1[2]; // For the Distributed Alamouti Scheme
+
void rx_ulsch(PHY_VARS_eNB *eNB,
eNB_rxtx_proc_t *proc,
@@ -1482,7 +1119,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];
// uint8_t harq_pid = ( ulsch->RRCConnRequest_flag== 0) ? subframe2harq_pid_tdd(frame_parms->tdd_config,subframe) : 0;
@@ -1492,7 +1129,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
int subframe = proc->subframe_rx;
harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe);
- Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs);
+ Qm = ulsch[UE_id]->harq_processes[harq_pid]->Qm;
#ifdef DEBUG_ULSCH
printf("rx_ulsch: harq_pid %d, nb_rb %d first_rb %d\n",harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb);
@@ -1629,7 +1266,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
llrp = (int16_t*)&pusch_vars->llr[0];
- T(T_ENB_PHY_PUSCH_IQ, T_INT(0), T_INT(UE_id), T_INT(proc->frame_rx),
+ T(T_ENB_PHY_PUSCH_IQ, T_INT(0), T_INT(ulsch[UE_id]->rnti), T_INT(proc->frame_rx),
T_INT(subframe), T_INT(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb),
T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti),
T_BUFFER(pusch_vars->rxdataF_comp[0],
@@ -1692,23 +1329,21 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB,
}
- void dump_ulsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id)
-{
+ void dump_ulsch(PHY_VARS_eNB *eNB,int frame,int subframe,uint8_t UE_id) {
uint32_t nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12;
uint8_t harq_pid;
- int subframe = proc->subframe_rx;
- harq_pid = subframe2harq_pid(&eNB->frame_parms,proc->frame_rx,subframe);
+ harq_pid = subframe2harq_pid(&eNB->frame_parms,frame,subframe);
- printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
- eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs),
+ printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, TBS %d, Qm %d, N_symb %d\n",
+ subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
+ eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS,eNB->ulsch[UE_id]->harq_processes[harq_pid]->Qm,
eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch);
//#ifndef OAI_EMU
write_output("/tmp/ulsch_d.m","ulsch_dseq",&eNB->ulsch[UE_id]->harq_processes[harq_pid]->d[0][96],
eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0);
if (eNB->common_vars.rxdata) write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0],eNB->frame_parms.samples_per_tti*10,1,1);
-
if (eNB->frame_parms.nb_antennas_rx>1)
if (eNB->common_vars.rxdata) write_output("/tmp/rxsig1.m","rxs1", &eNB->common_vars.rxdata[1][0],eNB->frame_parms.samples_per_tti*10,1,1);
@@ -1739,7 +1374,7 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB,
write_output("/tmp/ulsch_rxF_comp0.m","ulsch0_rxF_comp0",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
// write_output("ulsch_rxF_comp1.m","ulsch0_rxF_comp1",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",eNB->pusch_vars[UE_id]->llr,
- eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs)
+ eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*eNB->ulsch[UE_id]->harq_processes[harq_pid]->Qm
*eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch,1,0);
write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&eNB->pusch_vars[UE_id]->ul_ch_mag[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
// write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&eNB->pusch_vars[UE_id]->ul_ch_mag[1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
diff --git a/openair1/PHY/LTE_TRANSPORT/vars.h b/openair1/PHY/LTE_TRANSPORT/vars.h
index ba58939878..4845ab6925 100755
--- a/openair1/PHY/LTE_TRANSPORT/vars.h
+++ b/openair1/PHY/LTE_TRANSPORT/vars.h
@@ -59,8 +59,8 @@ char lte_cqi_snr_dB[15] = { -2,
unsigned char ue_power_offsets[25] = {14,11,9,8,7,6,6,5,4,4,4,3,3,3,2,2,2,1,1,1,1,1,0,0,0};
-short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ;
-short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
int qam64_table[8],qam16_table[4];
diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h
index a4625c2570..65bfda2fbf 100755
--- a/openair1/PHY/MODULATION/defs.h
+++ b/openair1/PHY/MODULATION/defs.h
@@ -76,6 +76,17 @@ int slot_fep_ul(RU_t *ru,
unsigned char Ns,
int no_prefix);
+int front_end_fft(PHY_VARS_UE *ue,
+ unsigned char l,
+ unsigned char Ns,
+ int sample_offset,
+ int no_prefix);
+
+int front_end_chanEst(PHY_VARS_UE *ue,
+ unsigned char l,
+ unsigned char Ns,
+ int reset_freq_est);
+
void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms);
void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c
index 3a3b3b4c0d..d97ffbc543 100755
--- a/openair1/PHY/MODULATION/slot_fep.c
+++ b/openair1/PHY/MODULATION/slot_fep.c
@@ -109,7 +109,7 @@ int slot_fep(PHY_VARS_UE *ue,
for (aa=0; aanb_antennas_rx; aa++) {
- memset(&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
+ memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET;
// Align with 256 bit
@@ -127,13 +127,17 @@ int slot_fep(PHY_VARS_UE *ue,
(void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples],
frame_parms->ofdm_symbol_size*sizeof(int));
dft((int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
- start_meas(&ue->rx_dft_stats);
+#if UE_TIMING_TRACE
+ start_meas(&ue->rx_dft_stats);
+#endif
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
+#endif
}
} else {
@@ -150,22 +154,24 @@ int slot_fep(PHY_VARS_UE *ue,
memcpy((void *)&common_vars->rxdata[aa][frame_length_samples],
(void *)&common_vars->rxdata[aa][0],
frame_parms->ofdm_symbol_size*sizeof(int));
-
+#if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats);
+#endif
if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
memcpy((void *)tmp_dft_in,
(void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
frame_parms->ofdm_symbol_size*sizeof(int));
dft((int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
}
-
+#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
+#endif
}
@@ -180,6 +186,236 @@ int slot_fep(PHY_VARS_UE *ue,
if ((l==0) || (l==(4-frame_parms->Ncp))) {
for (aa=0; aanb_antenna_ports_eNB; aa++) {
+#ifdef DEBUG_FEP
+ printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
+#endif
+#if UE_TIMING_TRACE
+ start_meas(&ue->dlsch_channel_estimation_stats);
+#endif
+ lte_dl_channel_estimation(ue,eNB_id,0,
+ Ns,
+ aa,
+ l,
+ symbol);
+#if UE_TIMING_TRACE
+ stop_meas(&ue->dlsch_channel_estimation_stats);
+#endif
+
+ for (i=0; imeasurements.n_adj_cells; i++) {
+ lte_dl_channel_estimation(ue,eNB_id,i+1,
+ Ns,
+ aa,
+ l,
+ symbol);
+ }
+ }
+
+
+ // do frequency offset estimation here!
+ // use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1})
+#ifdef DEBUG_FEP
+ printf("Frequency offset estimation\n");
+#endif
+
+ if (l==(4-frame_parms->Ncp)) {
+
+#if UE_TIMING_TRACE
+ start_meas(&ue->dlsch_freq_offset_estimation_stats);
+#endif
+
+ lte_est_freq_offset(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[0],
+ frame_parms,
+ l,
+ &common_vars->freq_offset,
+ reset_freq_est);
+#if UE_TIMING_TRACE
+ stop_meas(&ue->dlsch_freq_offset_estimation_stats);
+#endif
+
+ }
+ }
+
+ }
+
+#ifdef DEBUG_FEP
+ printf("slot_fep: done\n");
+#endif
+ return(0);
+}
+
+int front_end_fft(PHY_VARS_UE *ue,
+ unsigned char l,
+ unsigned char Ns,
+ int sample_offset,
+ int no_prefix)
+{
+ LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ LTE_UE_COMMON *common_vars = &ue->common_vars;
+ unsigned char aa;
+ unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame
+ unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
+ unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
+ unsigned int subframe_offset;//,subframe_offset_F;
+ unsigned int slot_offset;
+ unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
+ unsigned int rx_offset;
+ uint8_t threadId;
+
+ /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
+ unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
+ LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
+ int uespec_pilot[9][1200];*/
+
+ void (*dft)(int16_t *,int16_t *, int);
+ int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
+
+ switch (frame_parms->ofdm_symbol_size) {
+ case 128:
+ dft = dft128;
+ break;
+
+ case 256:
+ dft = dft256;
+ break;
+
+ case 512:
+ dft = dft512;
+ break;
+
+ case 1024:
+ dft = dft1024;
+ break;
+
+ case 1536:
+ dft = dft1536;
+ break;
+
+ case 2048:
+ dft = dft2048;
+ break;
+
+ default:
+ dft = dft512;
+ break;
+ }
+
+ if (no_prefix) {
+ subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1);
+ slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns%2);
+ } else {
+ subframe_offset = frame_parms->samples_per_tti * (Ns>>1);
+ slot_offset = (frame_parms->samples_per_tti>>1) * (Ns%2);
+ }
+
+ // subframe_offset_F = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1);
+
+
+ if (l<0 || l>=7-frame_parms->Ncp) {
+ printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
+ return(-1);
+ }
+
+ if (Ns<0 || Ns>=20) {
+ printf("slot_fep: Ns must be between 0 and 19\n");
+ return(-1);
+ }
+
+
+
+ threadId = ue->current_thread_id[Ns>>1];
+ for (aa=0; aanb_antennas_rx; aa++) {
+ // change thread index
+ memset(&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
+
+ rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET;
+ // Align with 256 bit
+ // rx_offset = rx_offset&0xfffffff8;
+
+ if (l==0) {
+
+ if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
+ memcpy((short *)&common_vars->rxdata[aa][frame_length_samples],
+ (short *)&common_vars->rxdata[aa][0],
+ frame_parms->ofdm_symbol_size*sizeof(int));
+
+ if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
+ memcpy((void *)tmp_dft_in,
+ (void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples],
+ frame_parms->ofdm_symbol_size*sizeof(int));
+ dft((int16_t *)tmp_dft_in,
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ } else { // use dft input from RX buffer directly
+ start_meas(&ue->rx_dft_stats);
+
+ dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ stop_meas(&ue->rx_dft_stats);
+
+ }
+ } else {
+ rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// +
+ // (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1);
+
+#ifdef DEBUG_FEP
+ // if (ue->frame <100)
+ LOG_I(PHY,"slot_fep: frame %d: slot %d, threadId %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n",
+ ue->proc.proc_rxtx[threadId].frame_rx,Ns, threadId,symbol,
+ nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples);
+#endif
+
+ if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
+ memcpy((void *)&common_vars->rxdata[aa][frame_length_samples],
+ (void *)&common_vars->rxdata[aa][0],
+ frame_parms->ofdm_symbol_size*sizeof(int));
+
+ start_meas(&ue->rx_dft_stats);
+
+ if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
+ memcpy((void *)tmp_dft_in,
+ (void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
+ frame_parms->ofdm_symbol_size*sizeof(int));
+ dft((int16_t *)tmp_dft_in,
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ } else { // use dft input from RX buffer directly
+
+ dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ }
+
+ stop_meas(&ue->rx_dft_stats);
+
+
+ }
+
+ #ifdef DEBUG_FEP
+ // if (ue->frame <100)
+ printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[threadId].frame_rx, symbol,rx_offset);
+ #endif
+ }
+ return(0);
+}
+
+int front_end_chanEst(PHY_VARS_UE *ue,
+ unsigned char l,
+ unsigned char Ns,
+ int reset_freq_est)
+{
+ LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ LTE_UE_COMMON *common_vars = &ue->common_vars;
+ uint8_t eNB_id = 0;//ue_common_vars->eNb_id;
+ unsigned char aa;
+ unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame
+ int i;
+
+ /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
+ unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
+ LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
+ int uespec_pilot[9][1200];*/
+
+ if (ue->perfect_ce == 0) {
+ if ((l==0) || (l==(4-frame_parms->Ncp))) {
+ for (aa=0; aanb_antenna_ports_eNB; aa++) {
+
#ifdef DEBUG_FEP
printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
#endif
@@ -213,16 +449,12 @@ int slot_fep(PHY_VARS_UE *ue,
frame_parms,
l,
&common_vars->freq_offset,
- reset_freq_est);
+ reset_freq_est);
stop_meas(&ue->dlsch_freq_offset_estimation_stats);
}
}
}
-
-#ifdef DEBUG_FEP
- printf("slot_fep: done\n");
-#endif
return(0);
}
diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c
index 471d311182..adcd8cd186 100755
--- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c
+++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c
@@ -109,15 +109,19 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue,
#endif
for (aa=0; aanb_antennas_rx; aa++) {
- memset(&common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*l],0,frame_parms->ofdm_symbol_size*sizeof(int));
+ memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],0,frame_parms->ofdm_symbol_size*sizeof(int));
if (l==0) {
- start_meas(&ue->rx_dft_stats);
+#if UE_TIMING_TRACE
+ start_meas(&ue->rx_dft_stats);
+#endif
dft((int16_t *)&common_vars->rxdata[aa][(sample_offset +
nb_prefix_samples0 +
subframe_offset -
SOFFSET) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
+#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
+#endif
} else {
if ((sample_offset +
(frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) +
@@ -128,14 +132,18 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue,
(short *)&common_vars->rxdata[aa][0],
frame_parms->ofdm_symbol_size*sizeof(int));
+#if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats);
+#endif
dft((int16_t *)&common_vars->rxdata[aa][(sample_offset +
(frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) +
(frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) +
subframe_offset-
SOFFSET) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
+#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
+#endif
}
}
diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c
index cf586dec1a..bbf2950874 100755
--- a/openair1/PHY/MODULATION/slot_fep_ul.c
+++ b/openair1/PHY/MODULATION/slot_fep_ul.c
@@ -35,7 +35,6 @@ int slot_fep_ul(RU_t *ru,
unsigned char aa;
RU_COMMON *common=&ru->common;
LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
- RU_proc_t *proc = &ru->proc;
unsigned char symbol = l+((7-fp->Ncp)*(Ns&1)); ///symbol within sub-frame
unsigned int nb_prefix_samples = (no_prefix ? 0 : fp->nb_prefix_samples);
unsigned int nb_prefix_samples0 = (no_prefix ? 0 : fp->nb_prefix_samples0);
diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h
index 542b8edba5..a90a8b718c 100755
--- a/openair1/PHY/TOOLS/defs.h
+++ b/openair1/PHY/TOOLS/defs.h
@@ -338,6 +338,9 @@ uint8_t log2_approx64(unsigned long long int x);
int16_t invSqrt(int16_t x);
uint32_t angle(struct complex16 perrror);
+/// computes the number of factors 2 in x
+unsigned char factor2(unsigned int x);
+
/*!\fn int32_t phy_phase_compensation_top (uint32_t pilot_type, uint32_t initial_pilot,
uint32_t last_pilot, int32_t ignore_prefix);
Compensate the phase rotation of the RF. WARNING: This function is currently unused. It has not been tested!
diff --git a/openair1/PHY/TOOLS/log2_approx.c b/openair1/PHY/TOOLS/log2_approx.c
index 0317a97d2f..bd4d5d04ab 100755
--- a/openair1/PHY/TOOLS/log2_approx.c
+++ b/openair1/PHY/TOOLS/log2_approx.c
@@ -37,6 +37,26 @@ unsigned char log2_approx(unsigned int x)
return(l2);
}
+unsigned char factor2(unsigned int x)
+{
+
+ int i;
+ unsigned char l2;
+
+ l2=0;
+
+ for (i=0; i<31; i++)
+ if ((x&(1<total_dlsch_bitrate;
int coded_bits_per_codeword = 0;
uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
- int mcs = 0;
+ int Qm = 2;
// choose max MCS to compute coded_bits_per_codeword
if (phy_vars_enb->ulsch[UE_id]!=NULL) {
for (harq_pid=0; harq_pid<3; harq_pid++) {
- mcs = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->mcs,mcs);
+ Qm = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->Qm,Qm);
}
}
- coded_bits_per_codeword = frame_parms->N_RB_UL*12*get_Qm(mcs)*frame_parms->symbols_per_tti;
+ coded_bits_per_codeword = frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti;
chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero
@@ -514,32 +514,32 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
- if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]!=NULL) {
- harq_pid = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid;
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
+ harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid;
if (harq_pid>=8)
return;
- mcs = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->mcs;
+ mcs = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs;
// Button 0
- if(!phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
+ if(!phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
// we are in TM5
fl_show_object(form->button_0);
}
}
- if (phy_vars_ue->pdcch_vars[subframe&0x1][eNB_id]!=NULL) {
- num_pdcch_symbols = phy_vars_ue->pdcch_vars[subframe&0x1][eNB_id]->num_pdcch_symbols;
+ if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) {
+ num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols;
}
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
- if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]!=NULL) {
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
coded_bits_per_codeword = get_G(frame_parms,
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
get_Qm(mcs),
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->Nl,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl,
num_pdcch_symbols,
frame,
subframe,
@@ -563,16 +563,16 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float));
rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata;
- chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id];
- chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id];
+ chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id];
+ chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id];
pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr;
pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
- pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[subframe&0x1][eNB_id]->llr;
- pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[subframe&0x1][eNB_id]->rxdataF_comp[0];
- pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->llr[0]; // stream 0
+ pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr;
+ pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0];
+ pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0
// pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
- pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp0[0];
- pdsch_mag = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag0[0];
+ pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0];
+ pdsch_mag = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0];
// Received signal in time domain of receive antenna 0
if (rxsig_t != NULL) {
diff --git a/openair1/PHY/TOOLS/lte_phy_scope_tm4.c b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c
index 92a0d9f218..e5d667c3c2 100755
--- a/openair1/PHY/TOOLS/lte_phy_scope_tm4.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c
@@ -24,6 +24,7 @@
#include "lte_phy_scope.h"
#define TPUT_WINDOW_LENGTH 100
int otg_enabled;
+int use_sic_receiver=0;
FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
float tput_time_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
@@ -54,6 +55,21 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg)
fl_set_object_color(button, FL_RED, FL_RED);
}
}
+
+static void sic_receiver_on_off( FL_OBJECT *button, long arg)
+{
+
+ if (fl_get_button(button)) {
+ fl_set_object_label(button, "SIC Receiver ON");
+ use_sic_receiver = 1;
+ fl_set_object_color(button, FL_GREEN, FL_GREEN);
+ } else {
+ fl_set_object_label(button, "SIC Receiver OFF");
+ use_sic_receiver = 0;
+ fl_set_object_color(button, FL_RED, FL_RED);
+ }
+}
+
FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
{
FL_OBJECT *obj;
@@ -398,16 +414,17 @@ FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) {
fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX );
fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE );
fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color
+ */
// Generic UE Button
fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
- //openair_daq_vars.use_ia_receiver = 0;
+ //use_sic_receiver = 0;
fl_set_button(fdui->button_0,0);
- fl_set_object_label(fdui->button_0, "IA Receiver OFF");
+ fl_set_object_label(fdui->button_0, "SIC Receiver OFF");
fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
- fl_set_object_callback(fdui->button_0, ia_receiver_on_off, 0 );
+ fl_set_object_callback(fdui->button_0, sic_receiver_on_off, 0 );
fl_hide_object(fdui->button_0);
- */
+
fl_end_form( );
fdui->lte_phy_scope_ue->fdui = fdui;
return fdui;
@@ -448,11 +465,11 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
int mcs1=0;
unsigned char harq_pid = 0;
int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
- if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]!=NULL) {
- harq_pid = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid;
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
+ harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid;
if (harq_pid>=8)
return;
- mcs0 = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->mcs;
+ mcs0 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs;
// Button 0
/*
if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
@@ -461,23 +478,24 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
}
*/
}
- if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]!=NULL) {
- harq_pid = phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->current_harq_pid;
+ fl_show_object(form->button_0);
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) {
+ harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->current_harq_pid;
if (harq_pid>=8)
return;
- mcs1 = phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->harq_processes[harq_pid]->mcs;
+ mcs1 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->mcs;
}
- if (phy_vars_ue->pdcch_vars[subframe&0x1][eNB_id]!=NULL) {
- num_pdcch_symbols = phy_vars_ue->pdcch_vars[subframe&0x1][eNB_id]->num_pdcch_symbols;
+ if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) {
+ num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols;
}
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
- if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]!=NULL) {
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
mod0 = get_Qm(mcs0);
coded_bits_per_codeword0 = get_G(frame_parms,
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
get_Qm(mcs0),
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->Nl,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl,
num_pdcch_symbols,
frame,
subframe,
@@ -486,13 +504,13 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
mod0=0;
}
- if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]!=NULL) {
+ if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) {
mod1 = get_Qm(mcs1);
coded_bits_per_codeword1 = get_G(frame_parms,
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->harq_processes[harq_pid]->nb_rb,
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->nb_rb,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even,
get_Qm(mcs1),
- phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->harq_processes[harq_pid]->Nl,
+ phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->Nl,
num_pdcch_symbols,
frame,
subframe,
@@ -515,23 +533,23 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
llr_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero
bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float));
rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata;
- chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id];
- chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id];
+ chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id];
+ chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id];
pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr;
pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
- pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[subframe&0x1][eNB_id]->llr;
- pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[subframe&0x1][eNB_id]->rxdataF_comp[0];
- pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->llr[0]; // stream 0
- pdsch_llr1 = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->llr[1]; // stream 1
- pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp0[0];
- //pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[subframe&0x1][eNB_id]->rxdataF_ext[0];
- //pdsch_comp1 = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[subframe&0x1][eNB_id]->rxdataF_ext[1];
- pdsch_comp1 = (int16_t*) (phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][0])[0];
+ pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr;
+ pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0];
+ pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0
+ pdsch_llr1 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[1]; // stream 1
+ pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0];
+ //pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0];
+ //pdsch_comp1 = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1];
+ pdsch_comp1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[0][0])[0];
//pdsch_comp1 = (int16_t*) (phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0][0])[0];
- pdsch_mag0 = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag0[0];
- pdsch_mag1 = (int16_t*) (phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag1[0][0])[0];
- pdsch_magb0 = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb0[0];
- pdsch_magb1 = (int16_t*) (phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb1[0][0])[0];
+ pdsch_mag0 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0];
+ pdsch_mag1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag1[0][0])[0];
+ pdsch_magb0 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0];
+ pdsch_magb1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb1[0][0])[0];
fl_freeze_form(form->lte_phy_scope_ue);
// Received signal in time domain of receive antenna 0
if (rxsig_t != NULL) {
@@ -797,4 +815,16 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
for (arx=0;arxtransmission_mode[eNB_id]==3 && phy_vars_ue->transmission_mode[eNB_id]==4){
+ for (int i = 0; i<8; ++i)
+ for (int j = 0; j < 7*2*frame_parms->N_RB_DL*12+4; ++j )
+ phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][0][i][j]=0;
+
+ for (int m=0; mpdsch_vars[subframe&0x1][eNB_id]->llr[0][m]=0;
+ }*/
}
+
+
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 2c1ec60967..b4b6247104 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -80,6 +80,10 @@
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096
+#define RX_NB_TH_MAX 2
+#define RX_NB_TH 2
+
+
//! \brief Allocate \c size bytes of memory on the heap with alignment 16 and zero it afterwards.
//! If no more memory is available, this function will terminate the program with an assertion error.
static inline void* malloc16_clear( size_t size )
@@ -205,8 +209,10 @@ typedef enum {
} node_function_t;
typedef enum {
+
synch_to_ext_device=0, // synch to RF or Ethernet device
- synch_to_other // synch to another source_(timer, other RU)
+ synch_to_other, // synch to another source_(timer, other RU)
+ synch_to_mobipass_standalone // special case for mobipass in standalone mode
} node_timing_t;
#endif
@@ -572,6 +578,32 @@ typedef struct {
pthread_mutex_t mutex_rxtx;
/// scheduling parameters for RXn-TXnp4 thread
struct sched_param sched_param_rxtx;
+
+ /// internal This variable is protected by ref mutex_fep_slot1.
+ //int instance_cnt_slot0_dl_processing;
+ int instance_cnt_slot1_dl_processing;
+ /// pthread descriptor fep_slot1 thread
+ //pthread_t pthread_slot0_dl_processing;
+ pthread_t pthread_slot1_dl_processing;
+ /// pthread attributes for fep_slot1 processing thread
+ // pthread_attr_t attr_slot0_dl_processing;
+ pthread_attr_t attr_slot1_dl_processing;
+ /// condition variable for UE fep_slot1 thread;
+ //pthread_cond_t cond_slot0_dl_processing;
+ pthread_cond_t cond_slot1_dl_processing;
+ /// mutex for UE synch thread
+ //pthread_mutex_t mutex_slot0_dl_processing;
+ pthread_mutex_t mutex_slot1_dl_processing;
+ //
+ uint8_t chan_est_pilot0_slot1_available;
+ uint8_t chan_est_slot1_available;
+ uint8_t llr_slot1_available;
+ uint8_t dci_slot0_available;
+ uint8_t first_symbol_available;
+ //uint8_t channel_level;
+ /// scheduling parameters for fep_slot1 thread
+ struct sched_param sched_param_fep_slot1;
+
int sub_frame_start;
int sub_frame_step;
unsigned long long gotIQs;
@@ -605,7 +637,7 @@ typedef struct {
/// instance count for eNBs
int instance_cnt_eNBs;
/// set of scheduling variables RXn-TXnp4 threads
- UE_rxtx_proc_t proc_rxtx[2];
+ UE_rxtx_proc_t proc_rxtx[RX_NB_TH];
} UE_proc_t;
typedef enum {
@@ -613,7 +645,8 @@ typedef enum {
REMOTE_IF5 =1,
REMOTE_MBP_IF5 =2,
REMOTE_IF4p5 =3,
- MAX_RU_IF_TYPES =4
+ REMOTE_IF1pp =4,
+ MAX_RU_IF_TYPES =5
} RU_if_south_t;
typedef struct RU_t_s{
@@ -698,11 +731,11 @@ typedef struct RU_t_s{
/// function pointer to TX front-end processing routine (PRECODING)
void (*feptx_prec)(struct RU_t_s *ru);
/// function pointer to wakeup routine in lte-enb.
- int (*wakeup_rxtx)(struct PHY_VARS_eNB_s *eNB,int frame_rx,int subframe_rx);
+ int (*wakeup_rxtx)(struct PHY_VARS_eNB_s *eNB, struct RU_t_s *ru);
/// function pointer to wakeup routine in lte-enb.
- int (*wakeup_prach_eNB)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe);
+ void (*wakeup_prach_eNB)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe);
/// function pointer to wakeup routine in lte-enb.
- int (*wakeup_prach_eNB_br)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe);
+ void (*wakeup_prach_eNB_br)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe);
/// function pointer to eNB entry routine
void (*eNB_top)(struct PHY_VARS_eNB_s *eNB, int frame_rx, int subframe_rx, char *string);
/// Timing statistics
@@ -710,7 +743,7 @@ typedef struct RU_t_s{
/// RX and TX buffers for precoder output
RU_COMMON common;
/// beamforming weight vectors per eNB
- int32_t **beam_weights[NUMBER_OF_eNB_MAX][15];
+ int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15];
/// received frequency-domain signal for PRACH (IF4p5 RRU)
int16_t **prach_rxsigF;
@@ -901,6 +934,14 @@ typedef struct PHY_VARS_eNB_s {
nfapi_rx_indication_pdu_t rx_pdu_list[NFAPI_RX_IND_MAX_PDU];
/// NFAPI RX ULSCH CRC information
nfapi_crc_indication_pdu_t crc_pdu_list[NFAPI_CRC_IND_MAX_PDU];
+ /// NFAPI HARQ information
+ nfapi_harq_indication_pdu_t harq_pdu_list[NFAPI_HARQ_IND_MAX_PDU];
+ /// NFAPI SR information
+ nfapi_sr_indication_pdu_t sr_pdu_list[NFAPI_SR_IND_MAX_PDU];
+ /// NFAPI CQI information
+ nfapi_cqi_indication_pdu_t cqi_pdu_list[NFAPI_CQI_IND_MAX_PDU];
+ /// NFAPI CQI information (raw component)
+ nfapi_cqi_indication_raw_pdu_t cqi_raw_pdu_list[NFAPI_CQI_IND_MAX_PDU];
/// NFAPI PRACH information
nfapi_preamble_pdu_t preamble_list[MAX_NUM_RX_PRACH_PREAMBLES];
#ifdef Rel14
@@ -909,13 +950,14 @@ typedef struct PHY_VARS_eNB_s {
#endif
Sched_Rsp_t Sched_INFO;
LTE_eNB_PDCCH pdcch_vars[2];
+ LTE_eNB_PHICH phich_vars[2];
#ifdef Rel14
LTE_eNB_EPDCCH epdcch_vars[2];
LTE_eNB_MPDCCH mpdcch_vars[2];
LTE_eNB_PRACH prach_vars_br;
#endif
LTE_eNB_COMMON common_vars;
- LTE_eNB_UCI_t uci_vars[NUMBER_OF_UE_MAX];
+ LTE_eNB_UCI uci_vars[NUMBER_OF_UE_MAX];
LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX];
LTE_eNB_PBCH pbch;
LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX];
@@ -1148,16 +1190,19 @@ typedef struct {
LTE_DL_FRAME_PARMS frame_parms_before_ho;
LTE_UE_COMMON common_vars;
- LTE_UE_PDSCH *pdsch_vars[2][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
+ // point to the current rxTx thread index
+ uint8_t current_thread_id[10];
+
+ LTE_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
LTE_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1];
LTE_UE_PDSCH *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
- LTE_UE_PDCCH *pdcch_vars[2][NUMBER_OF_CONNECTED_eNB_MAX];
+ LTE_UE_PDCCH *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
- LTE_UE_DLSCH_t *dlsch[2][NUMBER_OF_CONNECTED_eNB_MAX][2]; // two RxTx Threads
+ LTE_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX][2]; // two RxTx Threads
LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX];
@@ -1248,6 +1293,7 @@ typedef struct {
uint8_t decode_MIB;
int rx_offset; /// Timing offset
int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
+ int time_sync_cell;
int timing_advance; ///timing advance signalled from eNB
int hw_timing_advance;
int N_TA_offset; ///timing offset used in TDD
@@ -1314,9 +1360,9 @@ typedef struct {
/// Transmission mode per eNB
uint8_t transmission_mode[NUMBER_OF_CONNECTED_eNB_MAX];
- time_stats_t phy_proc;
+ time_stats_t phy_proc[RX_NB_TH];
time_stats_t phy_proc_tx;
- time_stats_t phy_proc_rx[2];
+ time_stats_t phy_proc_rx[RX_NB_TH];
uint32_t use_ia_receiver;
@@ -1330,8 +1376,13 @@ typedef struct {
time_stats_t ulsch_multiplexing_stats;
time_stats_t generic_stat;
- time_stats_t pdsch_procedures_stat;
- time_stats_t dlsch_procedures_stat;
+ time_stats_t generic_stat_bis[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
+ time_stats_t ue_front_end_stat[RX_NB_TH];
+ time_stats_t ue_front_end_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
+ time_stats_t pdcch_procedures_stat[RX_NB_TH];
+ time_stats_t pdsch_procedures_stat[RX_NB_TH];
+ time_stats_t pdsch_procedures_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
+ time_stats_t dlsch_procedures_stat[RX_NB_TH];
time_stats_t ofdm_demod_stats;
time_stats_t dlsch_rx_pdcch_stats;
@@ -1344,6 +1395,7 @@ typedef struct {
time_stats_t dlsch_turbo_decoding_stats;
time_stats_t dlsch_deinterleaving_stats;
time_stats_t dlsch_llr_stats;
+ time_stats_t dlsch_llr_stats_parallelization[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
time_stats_t dlsch_unscrambling_stats;
time_stats_t dlsch_rate_matching_stats;
time_stats_t dlsch_turbo_encoding_stats;
@@ -1362,10 +1414,13 @@ typedef struct {
openair0_device rfdevice;
} PHY_VARS_UE;
-
-
-
-
+/* this structure is used to pass both UE phy vars and
+ * proc to the function UE_thread_rxn_txnp4
+ */
+struct rx_tx_thread_data {
+ PHY_VARS_UE *UE;
+ UE_rxtx_proc_t *proc;
+};
void exit_fun(const char* s);
diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h
index 0777848892..a661e894f3 100755
--- a/openair1/PHY/impl_defs_lte.h
+++ b/openair1/PHY/impl_defs_lte.h
@@ -39,6 +39,11 @@
//#include "defs.h"
#include "openair2/COMMON/platform_types.h"
+#define RX_NB_TH_MAX 2
+#define RX_NB_TH 2
+
+#define LTE_SLOTS_PER_SUBFRAME 2
+
#define LTE_NUMBER_OF_SUBFRAMES_PER_FRAME 10
#define LTE_SLOTS_PER_FRAME 20
#define LTE_CE_FILTER_LENGTH 5
@@ -350,6 +355,14 @@ typedef struct {
/// SoundingRS-UL-ConfigDedicated Information Element from 36.331 RRC spec
typedef struct {
+ /// This descriptor is active
+ uint8_t active;
+ /// This descriptor's frame
+ uint16_t frame;
+ /// This descriptor's subframe
+ uint8_t subframe;
+ /// rnti
+ uint16_t rnti;
/// 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.
@@ -831,6 +844,16 @@ typedef struct {
DCI_ALLOC_t dci_alloc[32];
} LTE_eNB_PDCCH;
+typedef struct {
+ uint8_t hi;
+ uint8_t first_rb;
+ uint8_t n_DMRS;
+} phich_config_t;
+
+typedef struct {
+ uint8_t num_hi;
+ phich_config_t config[32];
+} LTE_eNB_PHICH;
typedef struct {
uint8_t num_dci;
@@ -936,7 +959,7 @@ typedef struct {
/// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES+2048[
int32_t **rxdata;
- LTE_UE_COMMON_PER_THREAD common_vars_rx_data_per_thread[2];
+ LTE_UE_COMMON_PER_THREAD common_vars_rx_data_per_thread[RX_NB_TH_MAX];
/// holds output of the sync correlator
int32_t *sync_corr;
@@ -1039,6 +1062,10 @@ typedef struct {
//uint32_t *rb_alloc;
//uint8_t Qm[2];
//MIMO_mode_t mimo_mode;
+ // llr offset per ofdm symbol
+ uint32_t llr_offset[14];
+ // llr length per ofdm symbol
+ uint32_t llr_length[14];
} LTE_UE_PDSCH;
typedef struct {
@@ -1139,6 +1166,9 @@ typedef struct {
uint32_t dci_missed;
/// nCCE for PUCCH per subframe
uint8_t nCCE[10];
+ //Check for specific DCIFormat and AgregationLevel
+ uint8_t dciFormat;
+ uint8_t agregationLevel;
} LTE_UE_PDCCH;
#define PBCH_A 24
diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h
index a74813cb8f..7bdb072b96 100755
--- a/openair1/PHY/vars.h
+++ b/openair1/PHY/vars.h
@@ -76,6 +76,7 @@ unsigned int ULSCH_max_consecutive_errors = 20;
int number_of_cards;
+
int flag_LA=0;
int flagMag;
//extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h
index f414e28f63..785e34e3c4 100755
--- a/openair1/SCHED/defs.h
+++ b/openair1/SCHED/defs.h
@@ -43,6 +43,7 @@ enum THREAD_INDEX { OPENAIR_THREAD_INDEX = 0,
#define OPENAIR_THREAD_STACK_SIZE PTHREAD_STACK_MIN //4096 //RTL_PTHREAD_STACK_MIN*6
//#define DLC_THREAD_STACK_SIZE 4096 //DLC stack size
+//#define UE_SLOT_PARALLELISATION
enum openair_SCHED_STATUS {
openair_SCHED_STOPPED=1,
@@ -102,7 +103,7 @@ void phy_procedures_eNB_lte(uint8_t subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t
@param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
@param *phy_vars_rn pointer to RN variables
*/
-void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
+void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
#if defined(Rel10) || defined(Rel14)
/*! \brief Top-level entry routine for relay node procedures when acting as eNB. This proc will make us of the existing eNB procs.
@@ -138,7 +139,13 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t
@param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
@param phy_vars_rn pointer to RN variables
*/
-int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
+int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
+int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
+ uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,
+ relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
+#ifdef UE_SLOT_PARALLELISATION
+void *UE_thread_slot1_dl_processing(void *arg);
+#endif
/*! \brief Scheduling for UE TX procedures in TDD S-subframes.
@param phy_vars_ue Pointer to UE variables on which to act
diff --git a/openair1/SCHED/fapi_l1.c b/openair1/SCHED/fapi_l1.c
new file mode 100644
index 0000000000..ed0ccf3480
--- /dev/null
+++ b/openair1/SCHED/fapi_l1.c
@@ -0,0 +1,730 @@
+/*
+ * 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.0 (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 fapi_l1.c
+ * \brief functions for FAPI L1 interface
+ * \author R. Knopp
+ * \date 2017
+ * \version 0.1
+ * \company Eurecom
+ * \email: knopp@eurecom.fr
+ * \note
+ * \warning
+ */
+
+#include "PHY/defs.h"
+#include "PHY/extern.h"
+#include "SCHED/defs.h"
+#include "SCHED/extern.h"
+#include "nfapi_interface.h"
+#include "fapi_l1.h"
+
+
+
+void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
+ eNB_rxtx_proc_t *proc,
+ nfapi_dl_config_request_pdu_t *dl_config_pdu) {
+
+ int idx = proc->subframe_tx&1;
+ LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[idx];
+ nfapi_dl_config_dci_dl_pdu *pdu = &dl_config_pdu->dci_dl_pdu;
+
+ LOG_D(PHY,"Frame %d, Subframe %d: DCI processing\n",proc->frame_tx,proc->subframe_tx);
+
+ // copy dci configuration into eNB structure
+ fill_dci_and_dlsch(eNB,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],pdu);
+}
+
+
+void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
+ eNB_rxtx_proc_t *proc,
+ nfapi_dl_config_request_pdu_t *dl_config_pdu) {
+
+ int idx = proc->subframe_tx&1;
+ LTE_eNB_MPDCCH *mpdcch_vars = &eNB->mpdcch_vars[idx];
+ nfapi_dl_config_mpdcch_pdu *pdu = &dl_config_pdu->mpdcch_pdu;
+
+ LOG_D(PHY,"Frame %d, Subframe %d: MDCI processing\n",proc->frame_tx,proc->subframe_tx);
+
+ // copy dci configuration into eNB structure
+ fill_mdci_and_dlsch(eNB,proc,&mpdcch_vars->mdci_alloc[mpdcch_vars->num_dci],pdu);
+}
+
+void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
+ nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu){
+
+ int idx = proc->subframe_tx&1;
+ LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[idx];
+ // copy dci configuration in to eNB structure
+ fill_dci0(eNB,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci], &hi_dci0_config_pdu->dci_pdu);
+}
+
+void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
+ nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) {
+
+ LTE_eNB_PHICH *phich = &eNB->phich_vars[proc->subframe_tx&1];
+
+ // copy dci configuration in to eNB structure
+ LOG_D(PHY,"Received HI PDU which value %d (rbstart %d,cshift %d)\n",
+ hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value,
+ hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start,
+ hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms);
+
+ phich->config[phich->num_hi].hi = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value;
+ phich->config[phich->num_hi].first_rb = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start;
+ phich->config[phich->num_hi].n_DMRS = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms;
+ phich->num_hi++;
+ AssertFatal(phich->num_hi<32,"Maximum number of phich reached in subframe\n");
+}
+
+void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
+ nfapi_dl_config_request_pdu_t *dl_config_pdu,
+ uint8_t *sdu) {
+
+ nfapi_dl_config_bch_pdu_rel8_t *rel8 = &dl_config_pdu->bch_pdu.bch_pdu_rel8;
+
+ AssertFatal(rel8->length == 3, "BCH PDU has length %d != 3\n",rel8->length);
+
+ LOG_D(PHY,"bch_pdu: %x,%x,%x\n",sdu[0],sdu[1],sdu[2]);
+ eNB->pbch_pdu[0] = sdu[2];
+ eNB->pbch_pdu[1] = sdu[1];
+ eNB->pbch_pdu[2] = sdu[0];
+
+ // adjust transmit amplitude here based on NFAPI info
+
+}
+
+#ifdef Rel14
+extern uint32_t localRIV2alloc_LUT6[32];
+extern uint32_t localRIV2alloc_LUT25[512];
+extern uint32_t localRIV2alloc_LUT50_0[1600];
+extern uint32_t localRIV2alloc_LUT50_1[1600];
+extern uint32_t localRIV2alloc_LUT100_0[6000];
+extern uint32_t localRIV2alloc_LUT100_1[6000];
+extern uint32_t localRIV2alloc_LUT100_2[6000];
+extern uint32_t localRIV2alloc_LUT100_3[6000];
+#endif
+
+void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
+ nfapi_dl_config_request_pdu_t *dl_config_pdu,
+ uint8_t codeword_index,
+ uint8_t *sdu) {
+
+ nfapi_dl_config_dlsch_pdu_rel8_t *rel8 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8;
+#ifndef Rel8
+ nfapi_dl_config_dlsch_pdu_rel10_t *rel10 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10;
+#endif
+#ifdef Rel14
+ nfapi_dl_config_dlsch_pdu_rel13_t *rel13 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13;
+#endif
+ LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
+ LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
+ int UE_id;
+ int harq_pid;
+
+
+ UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
+ AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
+ AssertFatal(UE_id= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
+
+ dlsch0 = eNB->dlsch[UE_id][0];
+ dlsch1 = eNB->dlsch[UE_id][1];
+
+#ifdef Rel14
+ if ((rel13->pdsch_payload_type < 2) && (rel13->ue_type>0)) dlsch0->harq_ids[proc->subframe_tx] = 0;
+#endif
+
+ harq_pid = dlsch0->harq_ids[proc->subframe_tx];
+ AssertFatal((harq_pid>=0) && (harq_pid<8),"harq_pid %d not in 0...7\n",harq_pid);
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ AssertFatal(dlsch0_harq!=NULL,"dlsch_harq is null\n");
+
+ // compute DL power control parameters
+ eNB->pdsch_config_dedicated[UE_id].p_a = rel8->pa;
+
+ if (dlsch0->active){
+ computeRhoA_eNB(&eNB->pdsch_config_dedicated[UE_id], dlsch0,dlsch0_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
+ computeRhoB_eNB(&eNB->pdsch_config_dedicated[UE_id],&(eNB->frame_parms.pdsch_config_common),eNB->frame_parms.nb_antenna_ports_eNB,dlsch0,dlsch0_harq->dl_power_off);
+ }
+ if (dlsch1->active){
+ computeRhoA_eNB(&eNB->pdsch_config_dedicated[UE_id], dlsch1,dlsch1_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
+ computeRhoB_eNB(&eNB->pdsch_config_dedicated[UE_id],&(eNB->frame_parms.pdsch_config_common),eNB->frame_parms.nb_antenna_ports_eNB,dlsch1,dlsch1_harq->dl_power_off);
+ }
+
+
+ dlsch0_harq->pdsch_start = eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols;
+
+ if (dlsch0_harq->round==0) { //get pointer to SDU if this a new SDU
+ if (rel8->rnti != 0xFFFF) LOG_I(PHY,"NFAPI: frame %d, subframe %d: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d\n",
+ proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid);
+ if (codeword_index == 0) dlsch0_harq->pdu = sdu;
+ else dlsch1_harq->pdu = sdu;
+ }
+ else {
+ if (rel8->rnti != 0xFFFF) LOG_I(PHY,"NFAPI: frame %d, subframe %d: programming dlsch for round %d, rnti %x, UE_id %d, harq_pid %d\n",
+ proc->frame_tx,proc->subframe_tx,dlsch0_harq->round,
+ rel8->rnti,UE_id,harq_pid);
+ }
+
+#ifdef Rel14
+ dlsch0->sib1_br_flag=0;
+
+ if ((rel13->pdsch_payload_type <2) && (rel13->ue_type>0)) { // this is a BR/CE UE and SIB1-BR/SI-BR
+ dlsch0->rnti = 0xFFFF;
+ dlsch0->Kmimo = 1;
+ dlsch0->Mdlharq = 4;
+ dlsch0->Nsoft = 25344;
+ dlsch0->i0 = rel13->initial_transmission_sf_io;
+ dlsch0_harq->pdsch_start = rel10->pdsch_start;
+
+ if (rel13->pdsch_payload_type == 0) dlsch0->sib1_br_flag=1;
+
+ // configure PDSCH
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rel8->resource_block_coding];
+ break;
+ case 15:
+ AssertFatal(1==0,"15 PRBs not supported for now\n");
+ break;
+ case 25:
+ dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rel8->resource_block_coding];
+ break;
+ case 50:
+ dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rel8->resource_block_coding];
+ dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rel8->resource_block_coding];
+ break;
+ case 75:
+ AssertFatal(1==0,"75 PRBs not supported for now\n");
+ break;
+ case 100:
+ dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rel8->resource_block_coding];
+ dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rel8->resource_block_coding];
+ dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rel8->resource_block_coding];
+ dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rel8->resource_block_coding];
+ }
+
+ dlsch0->active = 1;
+
+ dlsch0_harq->nb_rb = 6;
+ dlsch0_harq->vrb_type = LOCALIZED;
+ dlsch0_harq->rvidx = rel8->redundancy_version;
+ dlsch0_harq->Nl = 1;
+ dlsch0_harq->mimo_mode = (eNB->frame_parms.nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
+ dlsch0_harq->dl_power_off = 1;
+ dlsch0_harq->round = 0;
+ dlsch0_harq->status = ACTIVE;
+ dlsch0_harq->TBS = rel8->length<<3;
+ dlsch0_harq->Qm = rel8->modulation;
+ dlsch0_harq->codeword = 0;
+ }
+ else {
+ dlsch0->i0 = 0xFFFF;
+ }
+#endif
+}
+
+uint16_t to_beta_offset_harqack[16]={16,20,25,32,40,50,64,80,101,127,160,248,400,640,1008,8};
+
+void handle_ulsch_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) {
+
+ nfapi_ul_config_ulsch_pdu_rel8_t *rel8 = &ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8;
+
+ LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
+ LTE_UL_eNB_HARQ_t *ulsch_harq;
+ nfapi_ul_config_ulsch_harq_information *harq_information = &ul_config_pdu->ulsch_harq_pdu.harq_information;
+
+ int harq_pid = rel8->harq_process_number;
+ ulsch_harq = ulsch->harq_processes[harq_pid];
+ ulsch_harq->frame = frame;
+ ulsch_harq->subframe = subframe;
+ ulsch_harq->O_ACK = harq_information->harq_information_rel10.harq_size;
+ ulsch->beta_offset_harqack_times8 = to_beta_offset_harqack[harq_information->harq_information_rel10.delta_offset_harq];
+}
+
+uint16_t to_beta_offset_ri[16]={9,13,16,20,25,32,40,50,64,80,101,127,160,0,0,0};
+uint16_t to_beta_offset_cqi[16]={0,0,9,10,11,13,14,16,18,20,23,25,28,32,40,50};
+
+void handle_ulsch_cqi_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) {
+
+ nfapi_ul_config_cqi_ri_information_rel9_t *rel9 = &ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9;
+
+ LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
+ int harq_pid = ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number;
+ LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
+
+ ulsch_harq->frame = frame;
+ ulsch_harq->subframe = subframe;
+ ulsch_harq->O_RI = rel9->aperiodic_cqi_pmi_ri_report.cc[0].ri_size;
+ ulsch_harq->Or1 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0];
+ if (ulsch_harq->O_RI>1) ulsch_harq->Or2 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[1];
+ ulsch->beta_offset_ri_times8 = to_beta_offset_ri[rel9->delta_offset_ri];
+ ulsch->beta_offset_cqi_times8 = to_beta_offset_cqi[rel9->delta_offset_cqi];
+ LOG_I(PHY,"Filling ulsch_cqi_ri information for frame %d, subframe %d : O_RI %d, Or1 %d, beta_offset_cqi_times8 %d (%d)\n",
+ frame,subframe,ulsch_harq->O_RI,ulsch_harq->Or1,ulsch->beta_offset_cqi_times8,
+ rel9->delta_offset_cqi);
+}
+
+void handle_ulsch_cqi_harq_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) {
+
+ nfapi_ul_config_cqi_ri_information_rel9_t *rel9 = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information.cqi_ri_information_rel9;
+
+ LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
+ int harq_pid = ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number;
+ LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
+ nfapi_ul_config_ulsch_harq_information *harq_information = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information;
+
+ ulsch_harq->frame = frame;
+ ulsch_harq->subframe = subframe;
+ ulsch_harq->O_RI = rel9->aperiodic_cqi_pmi_ri_report.cc[0].ri_size;
+ ulsch_harq->Or1 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0];
+ ulsch_harq->O_ACK = harq_information->harq_information_rel10.harq_size;
+
+ if (ulsch_harq->O_RI>1) ulsch_harq->Or2 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[1];
+
+ ulsch->beta_offset_harqack_times8 = to_beta_offset_harqack[harq_information->harq_information_rel10.delta_offset_harq];
+ ulsch->beta_offset_ri_times8 = to_beta_offset_ri[rel9->delta_offset_ri];
+ ulsch->beta_offset_cqi_times8 = to_beta_offset_cqi[rel9->delta_offset_cqi];
+
+}
+
+void handle_uci_harq_information(PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci,nfapi_ul_config_harq_information *harq_information) {
+
+
+ if (eNB->frame_parms.frame_type == FDD) {
+ uci->num_pucch_resources = harq_information->harq_information_rel9_fdd.number_of_pucch_resources;
+
+ LOG_I(PHY,"Programming UCI HARQ mode %d : size %d in (%d,%d)\n",
+ harq_information->harq_information_rel9_fdd.ack_nack_mode,
+ harq_information->harq_information_rel9_fdd.harq_size,
+ uci->frame,uci->subframe);
+
+ if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 0) &&
+ (harq_information->harq_information_rel9_fdd.harq_size == 1)) {
+ uci->pucch_fmt = pucch_format1a;
+ uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
+ uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ }
+ else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 0) &&
+ (harq_information->harq_information_rel9_fdd.harq_size == 2)) {
+ uci->pucch_fmt = pucch_format1b;
+ uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
+ uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ }
+ else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
+ (harq_information->harq_information_rel9_fdd.harq_size == 2)) {
+ uci->pucch_fmt = pucch_format1b_csA2;
+ uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
+ uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
+ uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
+ }
+ else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
+ (harq_information->harq_information_rel9_fdd.harq_size == 3)) {
+ uci->pucch_fmt = pucch_format1b_csA3;
+ uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
+ uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
+ uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
+ uci->n_pucch_1[2][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_2;
+ uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
+ }
+ else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
+ (harq_information->harq_information_rel9_fdd.harq_size == 4)) {
+ uci->pucch_fmt = pucch_format1b_csA4;
+ uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
+ uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
+ uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
+ uci->n_pucch_1[2][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_2;
+ uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
+ }
+ else if (harq_information->harq_information_rel9_fdd.ack_nack_mode == 2) {
+ uci->pucch_fmt = pucch_format3;
+ uci->n_pucch_3[0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
+ uci->n_pucch_3[1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ }
+ else AssertFatal(1==0,"unsupported HARQ mode %d\n",harq_information->harq_information_rel9_fdd.ack_nack_mode);
+ }
+ else { // TDD
+ uci->num_pucch_resources = harq_information->harq_information_rel10_tdd.number_of_pucch_resources;
+
+ if (harq_information->harq_information_rel10_tdd.ack_nack_mode == 0) {//bundling
+
+ uci->pucch_fmt = harq_information->harq_information_rel10_tdd.harq_size==1 ? pucch_format1a : pucch_format1b;
+ uci->tdd_bundling = 1;
+ uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
+ uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ }
+ else if ((harq_information->harq_information_rel10_tdd.ack_nack_mode == 1) && //multiplexing
+ (uci->num_pucch_resources == 1)) {
+ uci->pucch_fmt = harq_information->harq_information_rel10_tdd.harq_size==1 ? pucch_format1a : pucch_format1b;
+ uci->tdd_bundling = 0;
+ uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
+ uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ }
+ else if ((harq_information->harq_information_rel10_tdd.ack_nack_mode == 1) && //multiplexing M>1
+ (uci->num_pucch_resources > 1)) {
+ uci->pucch_fmt = pucch_format1b;
+ uci->tdd_bundling = 0;
+ uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
+ uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ uci->n_pucch_1[1][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_1;
+ uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
+ uci->n_pucch_1[2][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_2;
+ uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
+ uci->n_pucch_1[3][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_3;
+ uci->n_pucch_1[3][1] = harq_information->harq_information_rel11.n_pucch_2_3;
+ }
+ else if (harq_information->harq_information_rel10_tdd.ack_nack_mode == 2) {
+ uci->pucch_fmt = pucch_format3;
+ uci->n_pucch_3[0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
+ uci->n_pucch_3[1] = harq_information->harq_information_rel11.n_pucch_2_0;
+ }
+ else AssertFatal(1==0,"unsupported HARQ mode %d\n",harq_information->harq_information_rel10_tdd.ack_nack_mode);
+ }
+}
+
+void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) {
+ LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];
+
+ uci->frame = frame;
+ uci->subframe = subframe;
+ uci->rnti = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti;
+ uci->type = SR;
+ uci->pucch_fmt = pucch_format1;
+ uci->num_antenna_ports = 1;
+ uci->num_pucch_resources = 1;
+ uci->n_pucch_1_0_sr[0] = ul_config_pdu->uci_sr_pdu.sr_information.sr_information_rel8.pucch_index;
+ uci->srs_active = srs_active;
+ uci->active = 1;
+
+ LOG_I(PHY,"Programming UCI SR rnti %x, pucch1_0 %d for (%d,%d)\n",
+ uci->rnti,uci->n_pucch_1_0_sr[0],frame,subframe);
+
+
+}
+
+
+
+
+void handle_uci_sr_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) {
+
+ LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];
+
+ uci->frame = frame;
+ uci->subframe = subframe;
+ uci->rnti = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti;
+ uci->type = HARQ_SR;
+ uci->num_antenna_ports = 1;
+ uci->num_pucch_resources = 1;
+ uci->n_pucch_1_0_sr[0] = ul_config_pdu->uci_sr_harq_pdu.sr_information.sr_information_rel8.pucch_index;
+ uci->srs_active = srs_active;
+ uci->active = 1;
+
+
+ handle_uci_harq_information(eNB,uci,&ul_config_pdu->uci_sr_harq_pdu.harq_information);
+}
+
+void handle_uci_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) {
+
+ LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];
+
+ LOG_I(PHY,"Frame %d, Subframe %d: Programming UCI_HARQ process (type %d)\n",frame,subframe,HARQ);
+ uci->frame = frame;
+ uci->subframe = subframe;
+ uci->rnti = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti;
+ uci->type = HARQ;
+ uci->srs_active = srs_active;
+ uci->num_antenna_ports = ul_config_pdu->uci_harq_pdu.harq_information.harq_information_rel11.num_ant_ports;
+
+ handle_uci_harq_information(eNB,uci,&ul_config_pdu->uci_harq_pdu.harq_information);
+
+ uci->active=1;
+
+}
+
+
+void handle_srs_pdu(PHY_VARS_eNB *eNB,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) {
+
+ int i;
+
+ for (i=0;isoundingrs_ul_config_dedicated[i].active==1) continue;
+
+ eNB->soundingrs_ul_config_dedicated[i].active = 1;
+ eNB->soundingrs_ul_config_dedicated[i].frame = frame;
+ eNB->soundingrs_ul_config_dedicated[i].subframe = subframe;
+ eNB->soundingrs_ul_config_dedicated[i].rnti = ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti;
+ eNB->soundingrs_ul_config_dedicated[i].srs_Bandwidth = ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth;
+ eNB->soundingrs_ul_config_dedicated[i].srs_HoppingBandwidth = ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth;
+ eNB->soundingrs_ul_config_dedicated[i].freqDomainPosition = ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position;
+ eNB->soundingrs_ul_config_dedicated[i].transmissionComb = ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb;
+ eNB->soundingrs_ul_config_dedicated[i].srs_ConfigIndex = ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs;
+ eNB->soundingrs_ul_config_dedicated[i].cyclicShift = ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift;
+ break;
+ }
+ AssertFatal(iulsch_pdu.ulsch_pdu_rel8;
+
+ int8_t UE_id;
+
+ // check if we have received a dci for this ue and ulsch descriptor is configured
+
+ if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) {
+ AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No existing UE ULSCH for rnti %x\n",rel8->rnti);
+ LOG_D(PHY,"Applying UL config for UE %d, rnti %x for frame %d, subframe %d\n",
+ UE_id,rel8->rnti,frame,subframe);
+
+ fill_ulsch(eNB,&ul_config_pdu->ulsch_pdu,frame,subframe);
+
+ }
+
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) {
+ AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
+
+ fill_ulsch(eNB,&ul_config_pdu->ulsch_harq_pdu.ulsch_pdu,frame,subframe);
+ handle_ulsch_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe);
+
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) {
+ AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,
+ eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
+ fill_ulsch(eNB,&ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu,frame,subframe);
+ handle_ulsch_cqi_ri_pdu(eNB,UE_id,ul_config_pdu,frame,subframe);
+
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE) {
+ AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,
+ eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
+ fill_ulsch(eNB,&ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu,frame,subframe);
+ handle_ulsch_cqi_harq_ri_pdu(eNB,UE_id,ul_config_pdu,frame,subframe);
+ handle_ulsch_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe);
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) {
+ AssertFatal((UE_id = find_uci(ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti,
+ proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No available UE UCI for rnti %x\n",ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti);
+ handle_uci_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE) {
+ AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE not handled yet\n");
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE) {
+ AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE not handled yet\n");
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE) {
+ AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE not handled yet\n");
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE) {
+ AssertFatal((UE_id = find_uci(ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti,
+ proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No available UE UCI for rnti %x\n",ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti);
+ handle_uci_sr_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
+
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE) {
+ AssertFatal((UE_id = find_uci(rel8->rnti,proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
+ "No available UE UCI for rnti %x\n",ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti);
+ handle_uci_sr_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
+ }
+ else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_SRS_PDU_TYPE) {
+ handle_srs_pdu(eNB,ul_config_pdu,frame,subframe);
+ }
+}
+
+
+void schedule_response(Sched_Rsp_t *Sched_INFO) {
+
+ PHY_VARS_eNB *eNB;
+ eNB_rxtx_proc_t *proc;
+ // copy data from L2 interface into L1 structures
+ module_id_t Mod_id = Sched_INFO->module_id;
+ uint8_t CC_id = Sched_INFO->CC_id;
+ nfapi_dl_config_request_t *DL_req = Sched_INFO->DL_req;
+ nfapi_hi_dci0_request_t *HI_DCI0_req = Sched_INFO->HI_DCI0_req;
+ nfapi_ul_config_request_t *UL_req = Sched_INFO->UL_req;
+ nfapi_tx_request_t *TX_req = Sched_INFO->TX_req;
+ frame_t frame = Sched_INFO->frame;
+ sub_frame_t subframe = Sched_INFO->subframe;
+ LTE_DL_FRAME_PARMS *fp;
+ int ul_subframe;
+ int ul_frame;
+ int harq_pid;
+ LTE_UL_eNB_HARQ_t *ulsch_harq;
+
+ AssertFatal(RC.eNB!=NULL,"RC.eNB is null\n");
+ AssertFatal(RC.eNB[Mod_id]!=NULL,"RC.eNB[%d] is null\n",Mod_id);
+ AssertFatal(RC.eNB[Mod_id][CC_id]!=NULL,"RC.eNB[%d][%d] is null\n",Mod_id,CC_id);
+
+ eNB = RC.eNB[Mod_id][CC_id];
+ fp = &eNB->frame_parms;
+ proc = &eNB->proc.proc_rxtx[0];
+ ul_subframe = pdcch_alloc2ul_subframe(fp,subframe);
+ ul_frame = pdcch_alloc2ul_frame(fp,frame,subframe);
+
+ AssertFatal(proc->subframe_tx == subframe, "Current subframe %d != NFAPI subframe %d\n",proc->subframe_tx,subframe);
+ AssertFatal(proc->subframe_tx == subframe, "Current frame %d != NFAPI frame %d\n",proc->frame_tx,frame);
+
+ uint8_t number_dl_pdu = DL_req->dl_config_request_body.number_pdu;
+ uint8_t number_hi_dci0_pdu = HI_DCI0_req->hi_dci0_request_body.number_of_dci+HI_DCI0_req->hi_dci0_request_body.number_of_hi;
+ uint8_t number_ul_pdu = UL_req->ul_config_request_body.number_of_pdus;
+
+
+ nfapi_dl_config_request_pdu_t *dl_config_pdu;
+ nfapi_hi_dci0_request_pdu_t *hi_dci0_req_pdu;
+ nfapi_ul_config_request_pdu_t *ul_config_pdu;
+
+ int i;
+
+ eNB->pdcch_vars[subframe&1].num_pdcch_symbols = DL_req->dl_config_request_body.number_pdcch_ofdm_symbols;
+ eNB->pdcch_vars[subframe&1].num_dci = 0;
+ eNB->phich_vars[subframe&1].num_hi = 0;
+
+ LOG_D(PHY,"NFAPI: Frame %d, Subframe %d: received %d dl_pdu, %d tx_req, %d hi_dci0_config_req, %d UL_config \n",
+ frame,subframe,number_dl_pdu,TX_req->tx_request_body.number_of_pdus,number_hi_dci0_pdu,number_ul_pdu);
+
+
+ if ((subframe_select(fp,ul_subframe)==SF_UL) ||
+ (fp->frame_type == FDD)) {
+ harq_pid = subframe2harq_pid(fp,ul_frame,ul_subframe);
+
+ // clear DCI allocation maps for new subframe
+
+ for (i=0; iulsch[i]) {
+ ulsch_harq = eNB->ulsch[i]->harq_processes[harq_pid];
+ ulsch_harq->dci_alloc=0;
+ ulsch_harq->rar_alloc=0;
+ }
+ }
+ }
+ for (i=0;idl_config_request_body.dl_config_pdu_list[i];
+ LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_config_pdu->pdu_type);
+ switch (dl_config_pdu->pdu_type) {
+ case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
+ handle_nfapi_dci_dl_pdu(eNB,proc,dl_config_pdu);
+ eNB->pdcch_vars[subframe&1].num_dci++;
+ break;
+ case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
+ AssertFatal(dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_indextx_request_body.number_of_pdus,
+ "bch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
+ dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index,
+ TX_req->tx_request_body.number_of_pdus);
+ eNB->pbch_configured=1;
+ handle_nfapi_bch_pdu(eNB,proc,dl_config_pdu,
+ TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index].segments[0].segment_data);
+ break;
+ case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
+ // handle_nfapi_mch_dl_pdu(eNB,dl_config_pdu);
+ break;
+ case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
+ /*
+ AssertFatal(dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_indextx_request_body.number_of_pdus,
+ "dlsch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
+ dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,
+ TX_req->tx_request_body.number_of_pdus);
+ */
+ AssertFatal((dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks<3) &&
+ (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks>0),
+ "dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = %d not in [1,2]\n",
+ dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks);
+ handle_nfapi_dlsch_pdu(eNB,proc,dl_config_pdu,
+ dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks-1,
+ TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data);
+ /*
+ if (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti == eNB->preamble_list[0].preamble_rel8.rnti) {// is RAR pdu
+ LOG_D(PHY,"Frame %d, Subframe %d: Received LTE RAR pdu, programming based on UL Grant\n",frame,subframe);
+ generate_eNB_ulsch_params_from_rar(eNB,
+ TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data,
+ frame,
+ subframe);
+
+ } */
+ break;
+ case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
+ // handle_nfapi_pch_pdu(eNB,dl_config_pdu);
+ break;
+ case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
+ // handle_nfapi_prs_pdu(eNB,dl_config_pdu);
+ break;
+ case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
+ // handle_nfapi_csi_rs_pdu(eNB,dl_config_pdu);
+ break;
+ case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
+ // handle_nfapi_epdcch_pdu(eNB,dl_config_pdu);
+ break;
+ case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
+ handle_nfapi_mpdcch_pdu(eNB,proc,dl_config_pdu);
+ eNB->mpdcch_vars[subframe&1].num_dci++;
+ break;
+ }
+ }
+
+ for (i=0;ihi_dci0_request_body.hi_dci0_pdu_list[i];
+
+ LOG_D(PHY,"NFAPI: hi_dci0_pdu %d : type %d\n",i,hi_dci0_req_pdu->pdu_type);
+
+ switch (hi_dci0_req_pdu->pdu_type) {
+
+
+ case NFAPI_HI_DCI0_DCI_PDU_TYPE:
+ handle_nfapi_hi_dci0_dci_pdu(eNB,proc,hi_dci0_req_pdu);
+ eNB->pdcch_vars[subframe&1].num_dci++;
+ break;
+
+ case NFAPI_HI_DCI0_HI_PDU_TYPE:
+ handle_nfapi_hi_dci0_hi_pdu(eNB,proc,hi_dci0_req_pdu);
+
+ break;
+ }
+ }
+
+ for (i=0;iul_config_request_body.ul_config_pdu_list[i];
+ LOG_D(PHY,"NFAPI: ul_pdu %d : type %d\n",i,ul_config_pdu->pdu_type);
+ AssertFatal(ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE ||
+ ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE ||
+ ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE ||
+ ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE ||
+ ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE ||
+ ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE ||
+ ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE
+ ,
+ "Optional UL_PDU type %d not supported\n",ul_config_pdu->pdu_type);
+ handle_nfapi_ul_pdu(eNB,proc,ul_config_pdu,UL_req->sfn_sf>>4,UL_req->sfn_sf&0xf,UL_req->ul_config_request_body.srs_present);
+ }
+}
diff --git a/openair1/SCHED/fapi_l1.h b/openair1/SCHED/fapi_l1.h
new file mode 100644
index 0000000000..cae9d271c3
--- /dev/null
+++ b/openair1/SCHED/fapi_l1.h
@@ -0,0 +1,72 @@
+/*
+ * 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.0 (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 fapi_l1.h
+ * \brief function prototypes for FAPI L1 interface
+ * \author R. Knopp
+ * \date 2017
+ * \version 0.1
+ * \company Eurecom
+ * \email: knopp@eurecom.fr
+ * \note
+ * \warning
+ */
+
+#include "PHY/defs.h"
+#include "PHY/extern.h"
+#include "SCHED/defs.h"
+#include "SCHED/extern.h"
+#include "nfapi_interface.h"
+
+void fill_uci_harq_indication(PHY_VARS_eNB *eNB,LTE_eNB_UCI *uci,int frame,int subframe,uint8_t *harq_ack,uint8_t tdd_mapping_mode,uint16_t tdd_multiplexing_mask);
+void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,uint16_t rnti, int frame,int subframe,int bundling);
+void fill_ulsch_cqi_indication(PHY_VARS_eNB *eNB,uint16_t frame,uint8_t subframe,LTE_UL_eNB_HARQ_t *ulsch_harq,uint16_t rnti);
+void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,uint32_t stat);
+void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe);
+void fill_crc_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe,uint8_t crc_flag);
+void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu);
+void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu);
+void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
+ nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
+void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
+ nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
+void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
+ nfapi_dl_config_request_pdu_t *dl_config_pdu,
+ uint8_t codeword_index,
+ uint8_t *sdu);
+void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
+ nfapi_ul_config_request_pdu_t *ul_config_pdu,
+ uint16_t frame,uint8_t subframe,uint8_t srs_present);
+
+void handle_ulsch_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe);
+
+void handle_ulsch_cqi_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe);
+
+void handle_uci_harq_information(PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci,nfapi_ul_config_harq_information *harq_information);
+
+void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active);
+
+void handle_uci_sr_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active);
+void handle_uci_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active);
+
+void handle_srs_pdu(PHY_VARS_eNB *eNB,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe);
+
+void schedule_response(Sched_Rsp_t *Sched_INFO);
diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c
index f750253c67..835066748d 100755
--- a/openair1/SCHED/phy_mac_stub.c
+++ b/openair1/SCHED/phy_mac_stub.c
@@ -72,19 +72,19 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
LOG_D(PHY,"frame %d, subframe %d, transmission_mode %d\n",proc->frame_tx,proc->subframe_tx,transmission_mode);
- DCI_pdu->Num_common_dci = 0;
- DCI_pdu->Num_ue_spec_dci=0;
+ DCI_pdu->Num_dci = 0;
switch (subframe) {
case 5:
if ( !(proc->frame_tx&1) ) // SI message on even frame only (SFN mod 2 == 0)
{
- DCI_pdu->Num_common_dci = 1;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].firstCCE = 0;
- DCI_pdu->dci_alloc[0].rnti = SI_RNTI;
- DCI_pdu->dci_alloc[0].format = format1A;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->Num_dci = 1;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].firstCCE = 0;
+ DCI_pdu->dci_alloc[0].rnti = SI_RNTI;
+ DCI_pdu->dci_alloc[0].format = format1A;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].search_space = DCI_COMMON_SPACE;
switch (eNB->frame_parms.N_RB_DL) {
case 6:
@@ -206,12 +206,13 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
}
/*
case 6:
- DCI_pdu->Num_ue_spec_dci = 1;
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1236;
- DCI_pdu->dci_alloc[0].format = format2_2A_M10PRB;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->Num_dci = 1;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1236;
+ DCI_pdu->dci_alloc[0].format = format2_2A_M10PRB;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
DLSCH_alloc_pdu1.rballoc = 0x00ff;
DLSCH_alloc_pdu1.TPC = 0;
@@ -228,12 +229,13 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
default:
case 7:
- DCI_pdu->Num_ue_spec_dci = 1;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].firstCCE = 0;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format1;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->Num_dci = 1;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].firstCCE = 0;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format1;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
if (transmission_mode<3 || transmission_mode == 7) {
//user 1
@@ -459,10 +461,11 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1235;
- DCI_pdu->dci_alloc[1].format = format0;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1235;
+ DCI_pdu->dci_alloc[1].format = format0;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+ DCI_pdu->dci_alloc[1].search_space = DCI_UE_SPACE;
if (eNB->frame_parms.frame_type == FDD) {
switch (eNB->frame_parms.N_RB_DL) {
@@ -601,13 +604,14 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
}
}
} else if (transmission_mode==4) {
- DCI_pdu->Num_ue_spec_dci = 1;
+ DCI_pdu->Num_dci = 1;
// user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_FDD_t;
- DCI_pdu->dci_alloc[0].L = 3;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format2;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_FDD_t;
+ DCI_pdu->dci_alloc[0].L = 3;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format2;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0;
@@ -623,13 +627,14 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0;
} else if (transmission_mode==5) {
- DCI_pdu->Num_ue_spec_dci = 2;
+ DCI_pdu->Num_dci = 2;
// user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[0].L = 3;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[0].L = 3;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
DLSCH_alloc_pdu1E.rv = 0;
@@ -648,11 +653,12 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
//user 2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[1].L = 0;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 0;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+ DCI_pdu->dci_alloc[1].search_space = DCI_UE_SPACE;
//DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs;
//DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28);
//DLSCH_alloc_pdu1E.mcs = (unsigned char) ((eNB->frame%1024)%28);
@@ -669,12 +675,13 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
/*
case 8:
- DCI_pdu->Num_common_dci = 1;
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0xbeef;
- DCI_pdu->dci_alloc[0].format = format1A;
- DCI_pdu->dci_alloc[0].ra_flag = 1;
+ DCI_pdu->Num_dci = 1;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0xbeef;
+ DCI_pdu->dci_alloc[0].format = format1A;
+ DCI_pdu->dci_alloc[0].ra_flag = 1;
+ DCI_pdu->dci_alloc[0].search_space = DCI_COMMON_SPACE;
RA_alloc_pdu.type = 1;
RA_alloc_pdu.vrb_type = 0;
@@ -721,7 +728,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
/*
DCI_pdu->nCCE = 0;
- for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
+ for (i=0; iNum_dci; i++) {
DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
}
*/
@@ -743,20 +750,20 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB)
rand = (rand%4)+5;
*/
- DCI_pdu->Num_common_dci = 0;
- DCI_pdu->Num_ue_spec_dci=0;
+ DCI_pdu->Num_dci = 0;
switch (subframe) {
case 5:
- DCI_pdu->Num_ue_spec_dci = 1;
+ DCI_pdu->Num_dci = 1;
if (transmission_mode<3) {
//user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format1;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format1;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
DLSCH_alloc_pdu.rballoc = eNB->ue_dl_rb_alloc;
DLSCH_alloc_pdu.TPC = 0;
@@ -769,11 +776,12 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB)
/*
//user2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+ DCI_pdu->dci_alloc[1].search_space = DCI_UE_SPACE;
DLSCH_alloc_pdu.rballoc = rballoc2;
DLSCH_alloc_pdu.TPC = 0;
@@ -785,13 +793,14 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB)
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
*/
} else if (transmission_mode==5) {
- DCI_pdu->Num_ue_spec_dci = 2;
+ DCI_pdu->Num_dci = 2;
// user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
DLSCH_alloc_pdu1E.rv = 0;
@@ -806,11 +815,12 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB)
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
//user 2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+ DCI_pdu->dci_alloc[1].search_space = DCI_UE_SPACE;
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
@@ -821,12 +831,13 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB)
break;
case 7:
- DCI_pdu->Num_common_dci = 1;
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0xbeef;
- DCI_pdu->dci_alloc[0].format = format1A;
- DCI_pdu->dci_alloc[0].ra_flag = 1;
+ DCI_pdu->Num_dci = 1;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0xbeef;
+ DCI_pdu->dci_alloc[0].format = format1A;
+ DCI_pdu->dci_alloc[0].ra_flag = 1;
+ DCI_pdu->dci_alloc[0].search_space = DCI_COMMON_SPACE;
RA_alloc_pdu.type = 1;
RA_alloc_pdu.vrb_type = 0;
@@ -841,14 +852,15 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB)
break;
case 9:
- DCI_pdu->Num_ue_spec_dci = 1;
+ DCI_pdu->Num_dci = 1;
//user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format0;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format0;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+ DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE;
UL_alloc_pdu.type = 0;
UL_alloc_pdu.hopping = 0;
@@ -894,7 +906,7 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB)
/*
DCI_pdu->nCCE = 0;
- for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
+ for (i=0; iNum_dci; i++) {
DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
}
*/
diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c
index 7149ae1f03..66e43b6960 100755
--- a/openair1/SCHED/phy_procedures_lte_common.c
+++ b/openair1/SCHED/phy_procedures_lte_common.c
@@ -572,16 +572,16 @@ uint8_t get_reset_ack(LTE_DL_FRAME_PARMS *frame_parms,
case 4:
if (subframe_tx == 2) { // ACK subframes 4, 5 and 0
- subframe_dl0 = 4;
- subframe_dl1 = 5;
- subframe_dl2 = 0;
+ subframe_dl0 = 0;
+ subframe_dl1 = 4;
+ subframe_dl2 = 5;
subframe_ul = 2;
//printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
} else if (subframe_tx == 3) { // ACK subframes 6, 7 8 and 9
- subframe_dl0 = 6;
- subframe_dl1 = 7;
- subframe_dl2 = 8;
- subframe_dl3 = 9;
+ subframe_dl0 = 7;
+ subframe_dl1 = 8;
+ subframe_dl2 = 9;
+ subframe_dl3 = 6;
subframe_ul = 3;
//printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
//printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index f387dd5efb..eea1aca581 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -35,16 +35,7 @@
#include "SCHED/defs.h"
#include "SCHED/extern.h"
#include "nfapi_interface.h"
-
-#include "PHY/LTE_TRANSPORT/if4_tools.h"
-#include "PHY/LTE_TRANSPORT/if5_tools.h"
-
-//#define DEBUG_PHY_PROC (Already defined in cmake)
-//#define DEBUG_ULSCH
-
-#include "LAYER2/MAC/extern.h"
-#include "LAYER2/MAC/defs.h"
-
+#include "fapi_l1.h"
#include "UTIL/LOG/log.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
@@ -60,271 +51,21 @@
#endif
-#if defined(FLEXRAN_AGENT_SB_IF)
-//Agent-related headers
-#include "ENB_APP/flexran_agent_extern.h"
-#include "ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.h"
-#include "LAYER2/MAC/flexran_agent_mac_proto.h"
-#endif
-
-
-#define NS_PER_SLOT 500000
-
-#define PUCCH 1
-
-void exit_fun(const char* s);
-
-extern int exit_openair;
-struct timespec start_fh, start_fh_prev;
-int start_fh_sf, start_fh_prev_sf;
-// Fix per CC openair rf/if device update
-// extern openair0_device openair0;
-
-unsigned char dlsch_input_buffer[2700] __attribute__ ((aligned(32)));
-int eNB_sync_buffer0[640*6] __attribute__ ((aligned(32)));
-int eNB_sync_buffer1[640*6] __attribute__ ((aligned(32)));
-int *eNB_sync_buffer[2] = {eNB_sync_buffer0, eNB_sync_buffer1};
-
-extern uint16_t hundred_times_log10_NPRB[100];
-
-unsigned int max_peak_val;
-int max_sync_pos;
-
-int harq_pid_updated[NUMBER_OF_UE_MAX][8] = {{0}};
-int harq_pid_round[NUMBER_OF_UE_MAX][8] = {{0}};
-
-//DCI_ALLOC_t dci_alloc[8];
-
-uint8_t is_SR_subframe(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id)
-{
-
- const int subframe = proc->subframe_rx;
- const int frame = proc->frame_rx;
-
- LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking for SR TXOp(sr_ConfigIndex %d)\n",
- eNB->Mod_id,eNB->ulsch[UE_id]->rnti,frame,subframe,
- eNB->scheduling_request_config[UE_id].sr_ConfigIndex);
-
- if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 4) { // 5 ms SR period
- if ((subframe%5) == eNB->scheduling_request_config[UE_id].sr_ConfigIndex)
- return(1);
- } else if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 14) { // 10 ms SR period
- if (subframe==(eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5))
- return(1);
- } else if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 34) { // 20 ms SR period
- if ((10*(frame&1)+subframe) == (eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15))
- return(1);
- } else if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 74) { // 40 ms SR period
- if ((10*(frame&3)+subframe) == (eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35))
- return(1);
- } else if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 154) { // 80 ms SR period
- if ((10*(frame&7)+subframe) == (eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75))
- return(1);
- }
-
- return(0);
-}
-
-
-int32_t add_ue(int16_t rnti, PHY_VARS_eNB *eNB)
-{
- uint8_t i;
-
-
- LOG_D(PHY,"[eNB %d/%d] Adding UE with rnti %x\n",
- eNB->Mod_id,
- eNB->CC_id,
- (uint16_t)rnti);
-
- for (i=0; idlsch[i]==NULL) || (eNB->ulsch[i]==NULL)) {
- MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed add ue %"PRIx16" (ENOMEM)", rnti);
- LOG_E(PHY,"Can't add UE, not enough memory allocated\n");
- return(-1);
- } else {
- if (eNB->UE_stats[i].crnti==0) {
- MSC_LOG_EVENT(MSC_PHY_ENB, "0 Add ue %"PRIx16" ", rnti);
- LOG_D(PHY,"UE_id %d associated with rnti %x\n",i, (uint16_t)rnti);
- eNB->dlsch[i][0]->rnti = rnti;
- eNB->ulsch[i]->rnti = rnti;
- eNB->UE_stats[i].crnti = rnti;
-
- eNB->UE_stats[i].Po_PUCCH1_below = 0;
- eNB->UE_stats[i].Po_PUCCH1_above = (int32_t)pow(10.0,.1*(eNB->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+eNB->rx_total_gain_dB));
- eNB->UE_stats[i].Po_PUCCH = (int32_t)pow(10.0,.1*(eNB->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+eNB->rx_total_gain_dB));
- LOG_D(PHY,"Initializing Po_PUCCH: p0_NominalPUCCH %d, gain %d => %d\n",
- eNB->frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
- eNB->rx_total_gain_dB,
- eNB->UE_stats[i].Po_PUCCH);
-
- return(i);
- }
- }
- }
- return(-1);
-}
-
-int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) {
- uint8_t i;
- int CC_id;
- PHY_VARS_eNB *eNB;
-
- for (CC_id=0;CC_iddlsch[i]==NULL) || (eNB->ulsch[i]==NULL)) {
- MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (ENOMEM)", rntiP);
- LOG_E(PHY,"Can't remove UE, not enough memory allocated\n");
- return(-1);
- } else {
- if (eNB->UE_stats[i].crnti==rntiP) {
- MSC_LOG_EVENT(MSC_PHY_ENB, "0 Removed ue %"PRIx16" ", rntiP);
-
- LOG_D(PHY,"eNB %d removing UE %d with rnti %x\n",eNB->Mod_id,i,rntiP);
-
- //LOG_D(PHY,("[PHY] UE_id %d\n",i);
- clean_eNb_dlsch(eNB->dlsch[i][0]);
- clean_eNb_ulsch(eNB->ulsch[i]);
- //eNB->UE_stats[i].crnti = 0;
- memset(&eNB->UE_stats[i],0,sizeof(LTE_eNB_UE_stats));
- // mac_exit_wrapper("Removing UE");
-
-
- return(i);
- }
- }
- }
- }
- MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (not found)", rntiP);
- return(-1);
-}
-
-/*
-int8_t find_next_ue_index(PHY_VARS_eNB *eNB)
-{
- uint8_t i;
-
- for (i=0; iUE_stats[i].crnti==0) {
- (eNB->dlsch[i][0]->rnti==0))
- LOG_D(PHY,"Next free UE id is %d\n",i);
- return(i);
- }
- }
-
- return(-1);
-}
-*/
-
-/*
-int get_ue_active_harq_pid(const uint8_t Mod_id,const uint8_t CC_id,const uint16_t rnti, const int frame, const uint8_t subframe,uint8_t *harq_pid,uint8_t *round,const uint8_t harq_flag)
-{
- LTE_eNB_DLSCH_t *DLSCH_ptr;
- LTE_eNB_ULSCH_t *ULSCH_ptr;
- uint8_t ulsch_subframe,ulsch_frame;
- int i;
- int8_t UE_id = find_ue(rnti,RC.eNB[Mod_id][CC_id]);
-
- if (UE_id==-1) {
- LOG_D(PHY,"Cannot find UE with rnti %x (Mod_id %d, CC_id %d)\n",rnti, Mod_id, CC_id);
- *round=0;
- return(-1);
- }
-
- if ((harq_flag == openair_harq_DL) || (harq_flag == openair_harq_RA)) {// this is a DL request
-
- DLSCH_ptr = RC.eNB[Mod_id][CC_id]->dlsch[(uint32_t)UE_id][0];
-
- if (harq_flag == openair_harq_RA) {
- if (DLSCH_ptr->harq_processes[0] != NULL) {
- *harq_pid = 0;
- *round = DLSCH_ptr->harq_processes[0]->round;
- return 0;
- } else {
- return -1;
- }
- }
-
- // let's go synchronous for the moment - maybe we can change at some point
- i = (frame * 10 + subframe) % 8;
-
- if (DLSCH_ptr->harq_processes[i]->status == ACTIVE) {
- *harq_pid = i;
- *round = DLSCH_ptr->harq_processes[i]->round;
- } else if (DLSCH_ptr->harq_processes[i]->status == SCH_IDLE) {
- *harq_pid = i;
- *round = 0;
- } else {
- printf("%s:%d: bad state for harq process - PLEASE REPORT!!\n", __FILE__, __LINE__);
- abort();
- }
- } else { // This is a UL request
-
- ULSCH_ptr = RC.eNB[Mod_id][CC_id]->ulsch[(uint32_t)UE_id];
- ulsch_subframe = pdcch_alloc2ul_subframe(&RC.eNB[Mod_id][CC_id]->frame_parms,subframe);
- ulsch_frame = pdcch_alloc2ul_frame(&RC.eNB[Mod_id][CC_id]->frame_parms,frame,subframe);
- // Note this is for TDD configuration 3,4,5 only
- *harq_pid = subframe2harq_pid(&RC.eNB[Mod_id][CC_id]->frame_parms,
- ulsch_frame,
- ulsch_subframe);
- *round = ULSCH_ptr->harq_processes[*harq_pid]->round;
- LOG_T(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Checking HARQ, round %d\n",Mod_id,*harq_pid,frame,subframe,*round);
- }
-
- return(0);
-}
-*/
-
-int16_t get_target_pusch_rx_power(const module_id_t module_idP, const uint8_t CC_id)
-{
- return RC.eNB[module_idP][CC_id]->frame_parms.ul_power_control_config_common.p0_NominalPUSCH;
-}
-
-int16_t get_target_pucch_rx_power(const module_id_t module_idP, const uint8_t CC_id)
-{
- return RC.eNB[module_idP][CC_id]->frame_parms.ul_power_control_config_common.p0_NominalPUCCH;
-}
-
-void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type)
-{
- UNUSED(r_type);
- int subframe = proc->subframe_rx;
-
-#ifdef DEBUG_PHY_PROC
- LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_S_RX(%d)\n", eNB->Mod_id,proc->frame_rx, subframe);
-#endif
-
-
- lte_eNB_I0_measurements(eNB,
- subframe,
- 0,
- eNB->first_run_I0_measurements);
-
-}
-
-
-
-#define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15)
-#define AMP_OVER_2 (AMP>>1)
-int QPSK[4]= {AMP_OVER_SQRT2|(AMP_OVER_SQRT2<<16),AMP_OVER_SQRT2|((65536-AMP_OVER_SQRT2)<<16),((65536-AMP_OVER_SQRT2)<<16)|AMP_OVER_SQRT2,((65536-AMP_OVER_SQRT2)<<16)|(65536-AMP_OVER_SQRT2)};
-int QPSK2[4]= {AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),((65536-AMP_OVER_2)<<16)|AMP_OVER_2,((65536-AMP_OVER_2)<<16)|(65536-AMP_OVER_2)};
-
-
-
-unsigned int taus(void);
void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,relaying_type_t r_type) {
#if defined(Rel10) || defined(Rel14)
- MCH_PDU *mch_pduP;
+ MCH_PDU *mch_pduP=NULL;
MCH_PDU mch_pdu;
// uint8_t sync_area=255;
#endif
int subframe = proc->subframe_tx;
+ AssertFatal(1==0,"pmch not tested for the moment, exiting\n");
+
// This is DL-Cell spec pilots in Control region
generate_pilots_slot(eNB,
eNB->common_vars.txdataF,
@@ -344,7 +85,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,rel
switch (r_type) {
case no_relay:
if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0
- LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n",
+ LOG_D(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n",
eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->mcs,
eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
else {
@@ -358,7 +99,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,rel
case multicast_relay:
if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)) {
- LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
+ LOG_D(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
rn->Mod_id,rn->frame, subframe,
mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);
} else if (rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8
@@ -368,7 +109,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,rel
rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
mch_pduP->Pdu_size = (uint16_t) (rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
mch_pduP->mcs = rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs;
- LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
+ LOG_D(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
rn->Mod_id,rn->frame, subframe,subframe%5,
rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size);
} else {
@@ -513,191 +254,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
}
-/*
-void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,const int UE_id) {
- LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
- int frame = proc->frame_tx;
- int subframe = proc->subframe_tx;
-
- // if we have SI_RNTI, configure dlsch parameters and CCE index
- if (dci_alloc->rnti == SI_RNTI) {
- LOG_D(PHY,"Generating dlsch params for SI_RNTI\n");
-
- generate_eNB_dlsch_params_from_dci(frame,
- subframe,
- &dci_alloc->dci_pdu[0],
- dci_alloc->rnti,
- dci_alloc->format,
- &eNB->dlsch_SI,
- fp,
- NULL,
- SI_RNTI,
- 0,
- P_RNTI,
- eNB->UE_stats[0].DL_pmi_single,
- 0);
- LOG_I(PHY,"frame %d, subframe %d : SI with mcs %d\n",frame,subframe,eNB->dlsch_SI->harq_processes[0]->mcs);
-
- eNB->dlsch_SI->nCCE[subframe] = dci_alloc->firstCCE;
-
- LOG_I(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8", aggregation %d\n",eNB->Mod_id,frame,subframe,
- eNB->dlsch_SI->nCCE[subframe],1<L);
-
- } else if (dci_alloc->ra_flag == 1) { // This is format 1A allocation for RA
- // configure dlsch parameters and CCE index
- LOG_D(PHY,"Generating dlsch params for RA_RNTI\n");
-
- generate_eNB_dlsch_params_from_dci(frame,
- subframe,
- &dci_alloc->dci_pdu[0],
- dci_alloc->rnti,
- dci_alloc->format,
- &eNB->dlsch_ra,
- fp,
- NULL,
- SI_RNTI,
- dci_alloc->rnti,
- P_RNTI,
- eNB->UE_stats[0].DL_pmi_single,
- 0);
-
-
- eNB->dlsch_ra->nCCE[subframe] = dci_alloc->firstCCE;
-
- LOG_I(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8" length %d bits\n",eNB->Mod_id,frame,subframe,
- eNB->dlsch_ra->nCCE[subframe],
- dci_alloc->dci_length);
- }
-
- else if ((dci_alloc->format != format0)&&
- (dci_alloc->format != format3)&&
- (dci_alloc->format != format3A)&&
- (dci_alloc->format != format4)){ // this is a normal DLSCH allocation
-
-
-
- if (UE_id>=0) {
- LOG_I(PHY,"Generating dlsch params for RNTI %x\n",dci_alloc->rnti);
-
- generate_eNB_dlsch_params_from_dci(frame,
- subframe,
- &dci_alloc->dci_pdu[0],
- dci_alloc->rnti,
- dci_alloc->format,
- eNB->dlsch[(uint8_t)UE_id],
- fp,
- &eNB->pdsch_config_dedicated[UE_id],
- SI_RNTI,
- 0,
- P_RNTI,
- eNB->UE_stats[(uint8_t)UE_id].DL_pmi_single,
- eNB->transmission_mode[(uint8_t)UE_id]<7?0:eNB->transmission_mode[(uint8_t)UE_id]);
- LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n",
- eNB->Mod_id,dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->current_harq_pid,frame,subframe);
-
-
- T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id),
- T_INT(dci_alloc->rnti), T_INT(dci_alloc->format),
- T_INT(dci_alloc->harq_pid),
- T_INT(eNB->dlsch[(int)UE_id][0]->harq_processes[dci_alloc->harq_pid]->mcs),
- T_INT(eNB->dlsch[(int)UE_id][0]->harq_processes[dci_alloc->harq_pid]->TBS));
-
- eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE;
-
- LOG_I(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8" length %d bits\n",eNB->Mod_id,frame,subframe,
- dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe],dci_alloc->dci_length);
-
- LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n",
- eNB->Mod_id, dci_alloc->rnti,
- frame, subframe,UE_id,
- dci_alloc->format,
- 1<L);
- } else {
- LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n",
- eNB->Mod_id,frame,dci_alloc->rnti);
- }
- }
-
-}
-
-void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,const int UE_id) {
-
- int harq_pid;
- LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
- int frame = proc->frame_tx;
- int subframe = proc->subframe_tx;
-
-// uint16_t srsPeriodicity=0;
-// uint16_t srsOffset=0;
-// uint16_t srsConfigIndex=0;
-// uint16_t do_srs=0;
-
- uint16_t is_srs_pos=0;
-
- LOG_I(PHY,
- "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n",
- eNB->Mod_id,
- subframe2harq_pid(fp,
- pdcch_alloc2ul_frame(fp,frame,subframe),
- pdcch_alloc2ul_subframe(fp,subframe)),
- frame,
- subframe,
- pdcch_alloc2ul_frame(fp,frame,subframe),
- pdcch_alloc2ul_subframe(fp,subframe),
- dci_alloc->rnti,
- dci_alloc->dci_pdu[0],
- 1<L);
-
- is_srs_pos = is_srs_occasion_common(fp,pdcch_alloc2ul_frame(fp,frame,subframe),pdcch_alloc2ul_subframe(fp,subframe));
-
-//if (is_srs_pos && eNB->soundingrs_ul_config_dedicated[UE_id].srsConfigDedicatedSetup) {
-// srsConfigIndex = eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex;
-// compute_srs_pos(fp->frame_type, srsConfigIndex, &srsPeriodicity, &srsOffset);
-// if ((((10*pdcch_alloc2ul_frame(fp,frame,subframe)+pdcch_alloc2ul_subframe(fp,subframe)) % srsPeriodicity) == srsOffset)) {
-// do_srs = 1;
-// }
-// }
-// LOG_D(PHY,"frame %d (%d), subframe %d (%d), UE_id %d: is_srs_pos %d, do_SRS %d, index %d, period %d, offset %d \n",
-// frame,pdcch_alloc2ul_frame(fp,frame,subframe),subframe,pdcch_alloc2ul_subframe(fp,subframe),
-// UE_id,is_srs_pos,do_srs,srsConfigIndex,srsPeriodicity,srsOffset);
-//
-
- generate_eNB_ulsch_params_from_dci(eNB,
- proc,
- &dci_alloc->dci_pdu[0],
- dci_alloc->rnti,
- format0,
- UE_id,
- SI_RNTI,
- 0,
- P_RNTI,
- CBA_RNTI,
- is_srs_pos);
- LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d\n",
- eNB->Mod_id,frame,subframe,dci_alloc->rnti,
- dci_alloc->firstCCE);
-
- // get the hard_pid for this subframe
- harq_pid = subframe2harq_pid(fp,
- pdcch_alloc2ul_frame(fp,frame,subframe),
- pdcch_alloc2ul_subframe(fp,subframe));
-
- AssertFatal(harq_pid!=255,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,frame);
-
- eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-
- T(T_ENB_PHY_ULSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id),
- T_INT(dci_alloc->rnti), T_INT(harq_pid),
- T_INT(eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->mcs),
- T_INT(eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->round),
- T_INT(eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->first_rb),
- T_INT(eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->nb_rb),
- T_INT(eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->TBS),
- T_INT(dci_alloc->L),
- T_INT(dci_alloc->firstCCE));
-}
-*/
void pdsch_procedures(PHY_VARS_eNB *eNB,
eNB_rxtx_proc_t *proc,
@@ -712,9 +269,8 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
LTE_DL_eNB_HARQ_t *dlsch_harq=dlsch->harq_processes[harq_pid];
int input_buffer_length = dlsch_harq->TBS/8;
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
- int i;
- if (frame < 20) {
+ if (frame < 200) {
LOG_D(PHY,
"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", pdsch_start %d, G %d, nb_rb %"PRIu16", rb0 %x, rb1 %x, TBS %"PRIu16", pmi_alloc %"PRIx64", rv %"PRIu8" (round %"PRIu8")\n",
@@ -777,8 +333,9 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
LOG_D(PHY,"Generating DLSCH/PDSCH %d\n",ra_flag);
- // 36-212
+ // 36-212
start_meas(&eNB->dlsch_encoding_stats);
+ AssertFatal(dlsch_harq->pdu!=NULL,"dlsch_harq->pdu == NULL (rnti %x)\n",dlsch->rnti);
eNB->te(eNB,
dlsch_harq->pdu,
dlsch_harq->pdsch_start,
@@ -821,470 +378,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
stop_meas(&eNB->dlsch_modulation_stats);
dlsch->active = 0;
-}
-
-
-void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu);
-void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
- eNB_rxtx_proc_t *proc,
- nfapi_dl_config_request_pdu_t *dl_config_pdu) {
-
- int idx = proc->subframe_tx&1;
- LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[idx];
- nfapi_dl_config_dci_dl_pdu *pdu = &dl_config_pdu->dci_dl_pdu;
-
- LOG_D(PHY,"Frame %d, Subframe %d: DCI processing\n",proc->frame_tx,proc->subframe_tx);
-
- // copy dci configuration into eNB structure
- fill_dci_and_dlsch(eNB,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],pdu);
-}
-
-void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu);
-void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
- eNB_rxtx_proc_t *proc,
- nfapi_dl_config_request_pdu_t *dl_config_pdu) {
-
- int idx = proc->subframe_tx&1;
- LTE_eNB_MPDCCH *mpdcch_vars = &eNB->mpdcch_vars[idx];
- nfapi_dl_config_mpdcch_pdu *pdu = &dl_config_pdu->mpdcch_pdu;
-
- LOG_D(PHY,"Frame %d, Subframe %d: MDCI processing\n",proc->frame_tx,proc->subframe_tx);
-
- // copy dci configuration into eNB structure
- fill_mdci_and_dlsch(eNB,proc,&mpdcch_vars->mdci_alloc[mpdcch_vars->num_dci],pdu);
-}
-
-void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
- nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
-
-void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
- nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) {
-
- int idx = proc->subframe_tx&1;
- LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[idx];
- nfapi_hi_dci0_dci_pdu *pdu = &hi_dci0_config_pdu->dci_pdu;
- // copy dci configuration in to eNB structure
- fill_dci_and_ulsch(eNB,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],pdu);
-}
-
-void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
- nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
-
-
-void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
- nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) {
-
- nfapi_hi_dci0_hi_pdu *pdu = &hi_dci0_config_pdu->hi_pdu;
- // copy dci configuration in to eNB structure
- LOG_D(PHY,"Received HI PDU which value %d (rbstart %d,cshift %d)\n",
- hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value,
- hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start,
- hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms);
-}
-
-handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
- nfapi_dl_config_request_pdu_t *dl_config_pdu,
- uint8_t *sdu) {
-
- nfapi_dl_config_bch_pdu_rel8_t *rel8 = &dl_config_pdu->bch_pdu.bch_pdu_rel8;
-
- AssertFatal(rel8->length == 3, "BCH PDU has length %d != 3\n",rel8->length);
-
- LOG_D(PHY,"bch_pdu: %x,%x,%x\n",sdu[0],sdu[1],sdu[2]);
- eNB->pbch_pdu[0] = sdu[2];
- eNB->pbch_pdu[1] = sdu[1];
- eNB->pbch_pdu[2] = sdu[0];
-
- // adjust transmit amplitude here based on NFAPI info
-
-}
-
-#ifdef Rel14
-extern uint32_t localRIV2alloc_LUT6[32];
-extern uint32_t localRIV2alloc_LUT25[512];
-extern uint32_t localRIV2alloc_LUT50_0[1600];
-extern uint32_t localRIV2alloc_LUT50_1[1600];
-extern uint32_t localRIV2alloc_LUT100_0[6000];
-extern uint32_t localRIV2alloc_LUT100_1[6000];
-extern uint32_t localRIV2alloc_LUT100_2[6000];
-extern uint32_t localRIV2alloc_LUT100_3[6000];
-#endif
-
-handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
- nfapi_dl_config_request_pdu_t *dl_config_pdu,
- uint8_t codeword_index,
- uint8_t *sdu) {
-
- nfapi_dl_config_dlsch_pdu_rel8_t *rel8 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8;
-#ifndef Rel8
- nfapi_dl_config_dlsch_pdu_rel10_t *rel10 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10;
-#endif
-#ifdef Rel14
- nfapi_dl_config_dlsch_pdu_rel13_t *rel13 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13;
-#endif
- LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
- LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
- int UE_id;
- int harq_pid;
-
-
- UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
- AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
- AssertFatal(UE_id= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
-
- dlsch0 = eNB->dlsch[UE_id][0];
- dlsch1 = eNB->dlsch[UE_id][1];
-
-#ifdef Rel14
- if ((rel13->pdsch_payload_type < 2) && (rel13->ue_type>0)) dlsch0->harq_ids[proc->subframe_tx] = 0;
-#endif
-
- harq_pid = dlsch0->harq_ids[proc->subframe_tx];
- AssertFatal((harq_pid>=0) && (harq_pid<8),"harq_pid %d not in 0...7\n",harq_pid);
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
- AssertFatal(dlsch0_harq!=NULL,"dlsch_harq is null\n");
-
- dlsch0_harq->pdsch_start = eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols;
-
- LOG_D(PHY,"NFAPI: frame %d, subframe %d: programming dlsch, rnti %x, UE_id %d, harq_pid %d\n",
- proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid);
- if (codeword_index == 0) dlsch0_harq->pdu = sdu;
- else dlsch1_harq->pdu = sdu;
-
-#ifdef Rel14
- dlsch0->sib1_br_flag=0;
-
- if ((rel13->pdsch_payload_type <2) && (rel13->ue_type>0)) { // this is a BR/CE UE and SIB1-BR/SI-BR
- dlsch0->rnti = 0xFFFF;
- dlsch0->Kmimo = 1;
- dlsch0->Mdlharq = 4;
- dlsch0->Nsoft = 25344;
- dlsch0->i0 = rel13->initial_transmission_sf_io;
- dlsch0_harq->pdsch_start = rel10->pdsch_start;
-
- if (rel13->pdsch_payload_type == 0) dlsch0->sib1_br_flag=1;
-
- // configure PDSCH
- switch (eNB->frame_parms.N_RB_DL) {
- case 6:
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rel8->resource_block_coding];
- break;
- case 15:
- AssertFatal(1==0,"15 PRBs not supported for now\n");
- break;
- case 25:
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rel8->resource_block_coding];
- break;
- case 50:
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rel8->resource_block_coding];
- dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rel8->resource_block_coding];
- break;
- case 75:
- AssertFatal(1==0,"75 PRBs not supported for now\n");
- break;
- case 100:
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rel8->resource_block_coding];
- dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rel8->resource_block_coding];
- dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rel8->resource_block_coding];
- dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rel8->resource_block_coding];
- }
-
- dlsch0->active = 1;
-
- dlsch0_harq->nb_rb = 6;
- dlsch0_harq->vrb_type = LOCALIZED;
- dlsch0_harq->rvidx = rel8->redundancy_version;
- dlsch0_harq->Nl = 1;
- dlsch0_harq->mimo_mode = (eNB->frame_parms.nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
- dlsch0_harq->dl_power_off = 1;
- dlsch0_harq->round = 0;
- dlsch0_harq->status = ACTIVE;
- dlsch0_harq->TBS = rel8->length<<3;
- dlsch0_harq->Qm = rel8->modulation;
- dlsch0_harq->codeword = 0;
- }
- else {
-
- }
-#endif
-}
-
-handle_uci_harq_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,nfapi_ul_config_request_pdu_t *ul_config_pdu) {
-
-}
-
-handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
- nfapi_ul_config_request_pdu_t *ul_config_pdu) {
-
- nfapi_ul_config_ulsch_pdu_rel8_t *rel8 = &ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8;
-
- uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT;
- uint16_t RIV_max;
- uint16_t use_srs=0;
-
- int8_t UE_id;
- LTE_eNB_ULSCH_t *ulsch;
- LTE_UL_eNB_HARQ_t *ulsch_harq;
-
- // check if we have received a dci for this ue and ulsch descriptor is configured
-
- if (ul_config_pdu == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) {
- AssertFatal((UE_id = find_ulsch(rel8->rnti,eNB,SEARCH_EXIST))>=0,
- "No existing UE ULSCH for rnti %x\n",rel8->rnti);
- AssertFatal(eNB->ulsch[UE_id]->harq_mask > 0,
- "ulsch for UE_id %d is not active\n",UE_id);
- LOG_I(PHY,"Applying UL config for UE %d, rnti %x\n",
- UE_id,rel8->rnti);
- /*
-#ifdef Rel14
- nfapi_ul_config_ulsch_pdu_rel13_t *rel13 = &ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13;
- int harq_pid = rel8->harq_process_number;
-
- if (rel13->ue_type > 0) { // This is a BL/CE UE, retrieve PUSCH programming
- ulsch = eNB->ulsch[UE_id];
-
- ulsch_harq = ulsch->harq_processes[harq_pid];
-
- switch (eNB->frame_parms.N_RB_DL) {
- case 6:
- RIV2nb_rb_LUT = &RIV2nb_rb_LUT6[0];
- RIV2first_rb_LUT = &RIV2first_rb_LUT6[0];
- RIV_max = RIV_max6;
- break;
-
- case 25:
- RIV2nb_rb_LUT = &RIV2nb_rb_LUT25[0];
- RIV2first_rb_LUT = &RIV2first_rb_LUT25[0];
- RIV_max = RIV_max25;
- break;
-
- case 50:
- RIV2nb_rb_LUT = &RIV2nb_rb_LUT50[0];
- RIV2first_rb_LUT = &RIV2first_rb_LUT50[0];
- RIV_max = RIV_max50;
- break;
-
- case 100:
- RIV2nb_rb_LUT = &RIV2nb_rb_LUT100[0];
- RIV2first_rb_LUT = &RIV2first_rb_LUT100[0];
- RIV_max = RIV_max100;
- break;
-
- default:
- DevParam(frame_parms->N_RB_DL, harq_pid, 0);
- break;
- }
-
-
- ulsch_harq->first_rb = rel8->resource_block_start;
- ulsch_harq->nb_rb = rel8->number_of_resource_blocks;
- ulsch_harq->O_RI = 0;//1;
- ulsch_harq->Or2 = 0;
- ulsch_harq->Or1 = 0;
- ulsch_harq->O_ACK = 0;//2;
- ulsch->beta_offset_cqi_times8 = 18;
- ulsch->beta_offset_ri_times8 = 10;
- ulsch->beta_offset_harqack_times8 = 16;
-
- ulsch->rnti = rel8->rnti;
- ulsch->harq_mask = 1<round == 0) {
- ulsch_harq->status = ACTIVE;
- ulsch_harq->rvidx = 0;
- //ulsch_harq->TBS = dlsch_tbs25[ulsch_harq->mcs][ulsch_harq->nb_rb-1];
- ulsch_harq->TBS = TBStable[get_I_TBS_UL(ulsch_harq->mcs)][ulsch_harq->nb_rb-1];
- ulsch_harq->Msc_initial = 12*ulsch_harq->nb_rb;
- ulsch_harq->Nsymb_initial = 9;
- ulsch_harq->round = 0;
- } else {
- ulsch_harq->rvidx = 0;
- ulsch_harq->round++;
- }
- use_srs = is_srs_occasion_common(frame_parms,ulsch_harq->frame,ulsch_harq->subframe);
- ulsch_harq->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
- ulsch_harq->srs_active = use_srs;
- }
- #endif
-*/
- }
- else if (ul_config_pdu == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) {
- AssertFatal((UE_id = find_uci(rel8->rnti,proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST))>=0,
- "No existing UE UCI for rnti %x\n",rel8->rnti);
- handle_uci_harq_pdu(eNB,proc,ul_config_pdu);
- }
- else if (ul_config_pdu == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE) {
-
- }
- else if (ul_config_pdu == NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE) {
-
- }
- else if (ul_config_pdu == NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE) {
-
- }
- else if (ul_config_pdu == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE) {
-
- }
- else if (ul_config_pdu == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE) {
-
- }
-
-}
-
-void schedule_response(Sched_Rsp_t *Sched_INFO) {
-
- PHY_VARS_eNB *eNB;
- eNB_rxtx_proc_t *proc;
- // copy data from L2 interface into L1 structures
- module_id_t Mod_id = Sched_INFO->module_id;
- uint8_t CC_id = Sched_INFO->CC_id;
- nfapi_dl_config_request_t *DL_req = Sched_INFO->DL_req;
- nfapi_hi_dci0_request_t *HI_DCI0_req = Sched_INFO->HI_DCI0_req;
- nfapi_ul_config_request_t *UL_req = Sched_INFO->UL_req;
- nfapi_tx_request_t *TX_req = Sched_INFO->TX_req;
- frame_t frame = Sched_INFO->frame;
- sub_frame_t subframe = Sched_INFO->subframe;
- LTE_DL_FRAME_PARMS *fp;
- int ul_subframe;
- int ul_frame;
- int harq_pid;
- LTE_UL_eNB_HARQ_t *ulsch_harq;
-
- AssertFatal(RC.eNB!=NULL,"RC.eNB is null\n");
- AssertFatal(RC.eNB[Mod_id]!=NULL,"RC.eNB[%d] is null\n",Mod_id);
- AssertFatal(RC.eNB[Mod_id][CC_id]!=NULL,"RC.eNB[%d][%d] is null\n",Mod_id,CC_id);
-
- eNB = RC.eNB[Mod_id][CC_id];
- fp = &eNB->frame_parms;
- proc = &eNB->proc.proc_rxtx[0];
- ul_subframe = pdcch_alloc2ul_subframe(fp,subframe);
- ul_frame = pdcch_alloc2ul_frame(fp,frame,subframe);
-
- AssertFatal(proc->subframe_tx == subframe, "Current subframe %d != NFAPI subframe %d\n",proc->subframe_tx,subframe);
- AssertFatal(proc->subframe_tx == subframe, "Current frame %d != NFAPI frame %d\n",proc->frame_tx,frame);
-
- int8_t UE_id;
- uint8_t number_dl_pdu = DL_req->dl_config_request_body.number_pdu;
- uint8_t number_hi_dci0_pdu = HI_DCI0_req->hi_dci0_request_body.number_of_dci+HI_DCI0_req->hi_dci0_request_body.number_of_hi;
- uint8_t number_ul_pdu = UL_req->ul_config_request_body.number_of_pdus;
- uint8_t number_pdsch_rnti = DL_req->dl_config_request_body.number_pdsch_rnti;
- uint8_t transmission_power_pcfich = DL_req->dl_config_request_body.transmission_power_pcfich;
-
-
- nfapi_dl_config_request_pdu_t *dl_config_pdu;
- nfapi_hi_dci0_request_pdu_t *hi_dci0_req_pdu;
- nfapi_ul_config_request_pdu_t *ul_config_pdu;
-
- int i;
-
- eNB->pdcch_vars[subframe&1].num_pdcch_symbols = DL_req->dl_config_request_body.number_pdcch_ofdm_symbols;
- eNB->pdcch_vars[subframe&1].num_dci = 0;
-
-
- LOG_D(PHY,"NFAPI: received %d dl_pdu, %d tx_req, %d hi_dci0_config_req, %d UL_config \n",
- number_dl_pdu,TX_req->tx_request_body.number_of_pdus,number_hi_dci0_pdu,number_ul_pdu);
-
-
- if ((subframe_select(fp,ul_subframe)==SF_UL) ||
- (fp->frame_type == FDD)) {
- harq_pid = subframe2harq_pid(fp,ul_frame,ul_subframe);
-
- // clear DCI allocation maps for new subframe
-
- for (i=0; iulsch[i]) {
- ulsch_harq = eNB->ulsch[i]->harq_processes[harq_pid];
- ulsch_harq->dci_alloc=0;
- ulsch_harq->rar_alloc=0;
- }
- }
- }
- for (i=0;idl_config_request_body.dl_config_pdu_list[i];
- LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_config_pdu->pdu_type);
- switch (dl_config_pdu->pdu_type) {
- case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
- handle_nfapi_dci_dl_pdu(eNB,proc,dl_config_pdu);
- eNB->pdcch_vars[subframe&1].num_dci++;
- break;
- case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
- AssertFatal(dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_indextx_request_body.number_of_pdus,
- "bch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
- dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index,
- TX_req->tx_request_body.number_of_pdus);
- eNB->pbch_configured=1;
- handle_nfapi_bch_pdu(eNB,proc,dl_config_pdu,
- TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index].segments[0].segment_data);
- break;
- case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
- // handle_nfapi_mch_dl_pdu(eNB,dl_config_pdu);
- break;
- case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
- AssertFatal(dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_indextx_request_body.number_of_pdus,
- "dlsch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
- dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,
- TX_req->tx_request_body.number_of_pdus);
- AssertFatal((dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks<3) &&
- (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks>0),
- "dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = %d not in [1,2]\n",
- dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks);
- handle_nfapi_dlsch_pdu(eNB,proc,dl_config_pdu,
- dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks-1,
- TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data);
- if (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti == eNB->preamble_list[0].preamble_rel8.rnti) {// is RAR pdu
- LOG_I(PHY,"Frame %d, Subframe %d: Received LTE RAR pdu, programming based on UL Grant\n");
- generate_eNB_ulsch_params_from_rar(eNB,
- TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data,
- frame,
- subframe);
-
- }
- break;
- case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
- // handle_nfapi_pch_pdu(eNB,dl_config_pdu);
- break;
- case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
- // handle_nfapi_prs_pdu(eNB,dl_config_pdu);
- break;
- case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
- // handle_nfapi_csi_rs_pdu(eNB,dl_config_pdu);
- break;
- case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
- // handle_nfapi_epdcch_pdu(eNB,dl_config_pdu);
- break;
- case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
- handle_nfapi_mpdcch_pdu(eNB,proc,dl_config_pdu);
- eNB->mpdcch_vars[subframe&1].num_dci++;
- break;
- }
- }
-
- for (i=0;ihi_dci0_request_body.hi_dci0_pdu_list[i];
- switch (hi_dci0_req_pdu->pdu_type) {
-
- case NFAPI_HI_DCI0_DCI_PDU_TYPE:
- handle_nfapi_hi_dci0_dci_pdu(eNB,proc,hi_dci0_req_pdu);
- eNB->pdcch_vars[subframe&1].num_dci++;
- break;
-
- case NFAPI_HI_DCI0_HI_PDU_TYPE:
- handle_nfapi_hi_dci0_hi_pdu(eNB,proc,hi_dci0_req_pdu);
- eNB->pdcch_vars[subframe&1].num_dci++;
-
- break;
- }
- }
-
- for (i=0;iul_config_request_body.ul_config_pdu_list[i];
- LOG_I(PHY,"NFAPI: ul_pdu %d : type %d\n",i,ul_config_pdu->pdu_type);
- AssertFatal(ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE ||
- ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE,
- "Optional UL_PDU type %d not supported\n",ul_config_pdu->pdu_type);
- handle_nfapi_ul_pdu(eNB,proc,ul_config_pdu);
- }
+ dlsch_harq->round++;
}
@@ -1298,7 +392,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
UNUSED(rn);
int frame=proc->frame_tx;
int subframe=proc->subframe_tx;
- uint32_t i,j,aa;
+ uint32_t i,aa;
uint8_t harq_pid;
int8_t UE_id=0;
uint8_t num_pdcch_symbols=0;
@@ -1315,41 +409,6 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1);
if (do_meas==1) start_meas(&eNB->phy_proc_tx);
- T(T_ENB_PHY_DL_TICK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe));
-
- /*
- for (i=0; iUE_stats[i].crnti > 0) {
- LOG_I(PHY,"UE %d : rnti %x\n",i,eNB->UE_stats[i].crnti);
- }
- }
- if (eNB->UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) {
- LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n",
- eNB->Mod_id,eNB->CC_id,frame,subframe, i, eNB->UE_stats[i].ulsch_consecutive_errors);
- eNB->UE_stats[i].ulsch_consecutive_errors=0;
- mac_xface->UL_failure_indication(eNB->Mod_id,
- eNB->CC_id,
- frame,
- eNB->UE_stats[i].crnti,
- subframe);
-
- }
-
-
- }
-
-
- // Get scheduling info for next subframe
- // This is called only for the CC_id = 0 and triggers scheduling for all CC_id's
- if (eNB->mac_enabled==1) {
- if (eNB->CC_id == 0) {
- mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,frame,subframe);//,1);
- }
- }
- */
-
// clear the transmit data array for the current subframe
for (aa=0; aanb_antenna_ports_eNB; aa++) {
memset(&eNB->common_vars.txdataF[aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)],
@@ -1410,6 +469,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
}
+
// num_pdcch_symbols = DCI_pdu->num_pdcch_symbols;
num_pdcch_symbols = eNB->pdcch_vars[subframe&1].num_pdcch_symbols;
num_dci = eNB->pdcch_vars[subframe&1].num_dci;
@@ -1422,13 +482,11 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,(frame*10)+subframe);
- // Apply physicalConfigDedicated if needed
- // This is for UEs that have received this IE, which changes these DL and UL configuration, we apply after a delay for the eNodeB UL parameters
- phy_config_dedicated_eNB_step2(eNB);
-
if (num_dci > 0)
LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (num_dci %"PRIu8")\n",eNB->Mod_id,frame, subframe,
num_dci);
+
+
generate_dci_top(num_pdcch_symbols,
num_dci,
@@ -1468,6 +526,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
}
+
else if ((dlsch0)&&
(dlsch0->rnti>0)&&
(dlsch0->active == 0)) {
@@ -1479,494 +538,26 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
- // if we have PHICH to generate
-
- if (is_phich_subframe(fp,subframe))
- {
- generate_phich_top(eNB,
- proc,
- AMP,
- 0);
- }
-
- /*
- if (frame>=10 && subframe>=9) {
- write_output("/tmp/txsigF0.m","txsF0", &eNB->common_vars.txdataF[0][0][0],120*eNB->frame_parms.ofdm_symbol_size,1,1);
- write_output("/tmp/txsigF1.m","txsF1", &eNB->common_vars.txdataF[0][0][0],120*eNB->frame_parms.ofdm_symbol_size,1,1);
- abort();
- }
- */
+ generate_phich_top(eNB,
+ proc,
+ AMP);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0);
if (do_meas==1) stop_meas(&eNB->phy_proc_tx);
}
-void process_Msg3(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id, uint8_t harq_pid)
-{
- // this prepares the demodulation of the first PUSCH of a new user, containing Msg3
- int subframe = proc->subframe_rx;
- int frame = proc->frame_rx;
- LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
- LTE_UL_eNB_HARQ_t *ulsch_harq=ulsch->harq_processes[harq_pid];
-
- LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n",
- eNB->Mod_id,
- frame,subframe,
- UE_id,ulsch->Msg3_active,
- ulsch_harq->subframe,
- ulsch_harq->frame);
-
- ulsch_harq->Msg3_flag = 0;
-
- if ((ulsch->Msg3_active == 1) &&
- (ulsch_harq->subframe == subframe) &&
- (ulsch_harq->frame == (uint32_t)frame)) {
-
- // harq_pid = 0;
-
- ulsch->Msg3_active = 0;
- ulsch_harq->Msg3_flag = 1;
- LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n",
- eNB->Mod_id,
- frame,subframe,UE_id);
- }
-}
-
-
-// This function retrieves the harq_pid of the corresponding DLSCH process
-// and updates the error statistics of the DLSCH based on the received ACK
-// info from UE along with the round index. It also performs the fine-grain
-// rate-adaptation based on the error statistics derived from the ACK/NAK process
-
-void process_HARQ_feedback(uint8_t UE_id,
- PHY_VARS_eNB *eNB,
- eNB_rxtx_proc_t *proc,
- uint8_t pusch_flag,
- uint8_t *pucch_payload,
- uint8_t pucch_sel,
- uint8_t SR_payload)
-{
-
- LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
- uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe;
- LTE_eNB_DLSCH_t *dlsch = eNB->dlsch[(uint32_t)UE_id][0];
- LTE_eNB_UE_stats *ue_stats = &eNB->UE_stats[(uint32_t)UE_id];
- LTE_DL_eNB_HARQ_t *dlsch_harq_proc;
- uint8_t subframe_m4,M,m;
- int mp;
- int all_ACKed=1,nb_alloc=0,nb_ACK=0;
- int frame = proc->frame_rx;
- int subframe = proc->subframe_rx;
- int harq_pid = subframe2harq_pid( fp,frame,subframe);
-
- nfapi_harq_indication_pdu_t *pdu;
-
- if (fp->frame_type == FDD) { //FDD
- subframe_m4 = (subframe<4) ? subframe+6 : subframe-4;
-
- dl_harq_pid[0] = dlsch->harq_ids[subframe_m4];
- M=1;
-
- if (pusch_flag == 1) {
- dlsch_ACK[0] = eNB->ulsch[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0];
- if (dlsch->subframe_tx[subframe_m4]==1)
- LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",eNB->Mod_id,
- frame,dlsch_ACK[0],subframe_m4);
- }
- else {
- dlsch_ACK[0] = pucch_payload[0];
- LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUCCH for subframe %d\n",eNB->Mod_id,
- frame,dlsch_ACK[0],subframe_m4);
- /*
- if (dlsch_ACK[0]==0)
- AssertFatal(0,"Exiting on NAK on PUCCH\n");
- */
- }
-
- // fill ACK/NAK Indication
- pdu = &eNB->UL_INFO.harq_ind.harq_pdu_list[eNB->UL_INFO.harq_ind.number_of_harqs];
- eNB->UL_INFO.harq_ind.number_of_harqs++;
-
-#if defined(MESSAGE_CHART_GENERATOR_PHY)
- MSC_LOG_RX_MESSAGE(
- MSC_PHY_ENB,MSC_PHY_UE,
- NULL,0,
- "%05u:%02u %s received %s rnti %x harq id %u tx SF %u",
- frame,subframe,
- (pusch_flag == 1)?"PUSCH":"PUCCH",
- (dlsch_ACK[0])?"ACK":"NACK",
- dlsch->rnti,
- dl_harq_pid[0],
- subframe_m4
- );
-#endif
- } else { // TDD Handle M=1,2 cases only
-
- M=ul_ACK_subframe2_M(fp,
- subframe);
-
- // Now derive ACK information for TDD
- if (pusch_flag == 1) { // Do PUSCH ACK/NAK first
- // detect missing DAI
- //FK: this code is just a guess
- //RK: not exactly, yes if scheduled from PHICH (i.e. no DCI format 0)
- // otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this,
- // but we have to adapt the code below. For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used
-
- dlsch_ACK[0] = eNB->ulsch[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0];
- dlsch_ACK[1] = (eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling)
- ?eNB->ulsch[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:eNB->ulsch[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1];
- }
-
-
- else { // PUCCH ACK/NAK
- if ((SR_payload == 1)&&(pucch_sel!=2)) { // decode Table 7.3 if multiplexing and SR=1
- nb_ACK = 0;
-
- if (M == 2) {
- if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) // b[0],b[1]
- nb_ACK = 1;
- else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0))
- nb_ACK = 2;
- } else if (M == 3) {
- if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1))
- nb_ACK = 1;
- else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0))
- nb_ACK = 2;
- else if ((pucch_payload[0] == 0) && (pucch_payload[1] == 1))
- nb_ACK = 3;
- }
- } else if (pucch_sel == 2) { // bundling or M=1
- dlsch_ACK[0] = pucch_payload[0];
- dlsch_ACK[1] = pucch_payload[0];
- } else { // multiplexing with no SR, this is table 10.1
- if (M==1)
- dlsch_ACK[0] = pucch_payload[0];
- else if (M==2) {
- if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) ||
- ((pucch_sel == 0) && (pucch_payload[0] == 0) && (pucch_payload[1] == 1)))
- dlsch_ACK[0] = 1;
- else
- dlsch_ACK[0] = 0;
-
- if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) ||
- ((pucch_sel == 1) && (pucch_payload[0] == 0) && (pucch_payload[1] == 0)))
- dlsch_ACK[1] = 1;
- else
- dlsch_ACK[1] = 0;
- }
- }
- }
- }
-
- // handle case where positive SR was transmitted with multiplexing
- if ((SR_payload == 1)&&(pucch_sel!=2)&&(pusch_flag == 0)) {
- nb_alloc = 0;
-
- for (m=0; msubframe_tx[dl_subframe]==1)
- nb_alloc++;
- }
-
- if (nb_alloc == nb_ACK)
- all_ACKed = 1;
- else
- all_ACKed = 0;
- }
-
-
- for (m=0,mp=-1; msubframe_tx[dl_subframe]==1) {
- if (pusch_flag == 1)
- mp++;
- else
- mp = m;
-
- dl_harq_pid[m] = dlsch->harq_ids[dl_subframe];
- harq_pid_updated[UE_id][dl_harq_pid[m]] = 1;
-
- if ((pucch_sel != 2)&&(pusch_flag == 0)) { // multiplexing
- if ((SR_payload == 1)&&(all_ACKed == 1))
- dlsch_ACK[m] = 1;
- else
- dlsch_ACK[m] = 0;
- }
-
- if (dl_harq_pid[m]Mdlharq) {
- dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]];
-#ifdef DEBUG_PHY_PROC
- LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (rv %d, TBS %d)\n",eNB->Mod_id,
- dlsch->rnti,dl_harq_pid[m],dl_subframe,
- dlsch_harq_proc->status,dlsch_harq_proc->round,
- dlsch->harq_processes[dl_harq_pid[m]]->rvidx,
- dlsch->harq_processes[dl_harq_pid[m]]->TBS);
-
- if (dlsch_harq_proc->status==DISABLED)
- LOG_E(PHY,"dlsch_harq_proc is disabled? \n");
-
-#endif
-
- if ((dl_harq_pid[m]Mdlharq) &&
- (dlsch_harq_proc->status == ACTIVE)) {
- // dl_harq_pid of DLSCH is still active
-
- if ( dlsch_ACK[mp]==0) {
- // Received NAK
-#ifdef DEBUG_PHY_PROC
- LOG_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",eNB->Mod_id,
- dlsch->rnti,dl_harq_pid[m],M,m,mp,dlsch_harq_proc->round);
-#endif
-
- T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), T_INT(dlsch->rnti),
- T_INT(dl_harq_pid[m]));
-
- if (dlsch_harq_proc->round == 0)
- ue_stats->dlsch_NAK_round0++;
-
- ue_stats->dlsch_NAK[dl_harq_pid[m]][dlsch_harq_proc->round]++;
-
-
- // then Increment DLSCH round index
- dlsch_harq_proc->round++;
-
-
- if (dlsch_harq_proc->round == dlsch->Mlimit) {
- // This was the last round for DLSCH so reset round and increment l2_error counter
-#ifdef DEBUG_PHY_PROC
- LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",eNB->Mod_id,
- dlsch->rnti,dl_harq_pid[m]);
-#endif
-#if defined(MESSAGE_CHART_GENERATOR_PHY)
- MSC_LOG_EVENT(MSC_PHY_ENB, "0 HARQ DLSCH Failed RNTI %"PRIx16" round %u",
- dlsch->rnti,
- dlsch_harq_proc->round);
-#endif
-
- dlsch_harq_proc->round = 0;
- ue_stats->dlsch_l2_errors[dl_harq_pid[m]]++;
- dlsch_harq_proc->status = SCH_IDLE;
- dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
- }
- } else {
-#ifdef DEBUG_PHY_PROC
- LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",eNB->Mod_id,
- dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
-#endif
-
- T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), T_INT(dlsch->rnti),
- T_INT(dl_harq_pid[m]));
-
- ue_stats->dlsch_ACK[dl_harq_pid[m]][dlsch_harq_proc->round]++;
-
- // Received ACK so set round to 0 and set dlsch_harq_pid IDLE
- dlsch_harq_proc->round = 0;
- dlsch_harq_proc->status = SCH_IDLE;
- dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
-
- ue_stats->total_TBS = ue_stats->total_TBS +
- eNB->dlsch[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
- /*
- ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits +
- eNB->dlsch[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
- */
- }
-
- // Do fine-grain rate-adaptation for DLSCH
- if (ue_stats->dlsch_NAK_round0 > dlsch->error_threshold) {
- if (ue_stats->dlsch_mcs_offset == 1)
- ue_stats->dlsch_mcs_offset=0;
- else
- ue_stats->dlsch_mcs_offset=-1;
- }
-
-#ifdef DEBUG_PHY_PROC
- LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame,
- dlsch_harq_proc->round,dl_harq_pid[m],subframe);
-#endif
- harq_pid_round[UE_id][dl_harq_pid[m]] = dlsch_harq_proc->round;
- // Clear NAK stats and adjust mcs offset
- // after measurement window timer expires
- if (ue_stats->dlsch_sliding_cnt == dlsch->ra_window_size) {
- if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK_round0 < 2))
- ue_stats->dlsch_mcs_offset = 1;
-
- if ((ue_stats->dlsch_mcs_offset == 1) && (ue_stats->dlsch_NAK_round0 > 2))
- ue_stats->dlsch_mcs_offset = 0;
-
- if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK_round0 > 2))
- ue_stats->dlsch_mcs_offset = -1;
-
- if ((ue_stats->dlsch_mcs_offset == -1) && (ue_stats->dlsch_NAK_round0 < 2))
- ue_stats->dlsch_mcs_offset = 0;
-
- ue_stats->dlsch_NAK_round0 = 0;
- ue_stats->dlsch_sliding_cnt = 0;
- }
- }
- }
- }
- }
-}
-
-void get_n1_pucch_eNB(PHY_VARS_eNB *eNB,
- eNB_rxtx_proc_t *proc,
- uint8_t UE_id,
- int16_t *n1_pucch0,
- int16_t *n1_pucch1,
- int16_t *n1_pucch2,
- int16_t *n1_pucch3)
-{
-
- LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms;
- uint8_t nCCE0,nCCE1;
- int sf;
- int frame = proc->frame_rx;
- int subframe = proc->subframe_rx;
-
- if (frame_parms->frame_type == FDD ) {
- sf = (subframe<4) ? (subframe+6) : (subframe-4);
-
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[sf]>0) {
- *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + eNB->dlsch[(uint32_t)UE_id][0]->nCCE[sf];
- *n1_pucch1 = -1;
- } else {
- *n1_pucch0 = -1;
- *n1_pucch1 = -1;
- }
- } else {
-
- switch (frame_parms->tdd_config) {
- case 1: // DL:S:UL:UL:DL:DL:S:UL:UL:DL
- if (subframe == 2) { // ACK subframes 5 and 6
- /* if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[6]>0) {
- nCCE1 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[6];
- *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
- }
- else
- *n1_pucch1 = -1;*/
-
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[5]>0) {
- nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[5];
- *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN;
- } else
- *n1_pucch0 = -1;
-
- *n1_pucch1 = -1;
- } else if (subframe == 3) { // ACK subframe 9
-
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[9]>0) {
- nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[9];
- *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
- } else
- *n1_pucch0 = -1;
-
- *n1_pucch1 = -1;
-
- } else if (subframe == 7) { // ACK subframes 0 and 1
- //harq_ack[0].nCCE;
- //harq_ack[1].nCCE;
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[0]>0) {
- nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[0];
- *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN;
- } else
- *n1_pucch0 = -1;
-
- *n1_pucch1 = -1;
- } else if (subframe == 8) { // ACK subframes 4
- //harq_ack[4].nCCE;
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[4]>0) {
- nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[4];
- *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN;
- } else
- *n1_pucch0 = -1;
-
- *n1_pucch1 = -1;
- } else {
- LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
- eNB->Mod_id,
- frame,
- subframe,frame_parms->tdd_config);
- return;
- }
-
- break;
-
- case 3: // DL:S:UL:UL:UL:DL:DL:DL:DL:DL
- if (subframe == 2) { // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe)
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[6]>0) {
- nCCE1 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[6];
- *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
- } else
- *n1_pucch1 = -1;
-
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[5]>0) {
- nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[5];
- *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN;
- } else
- *n1_pucch0 = -1;
- } else if (subframe == 3) { // ACK subframes 7 and 8
- LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n",
- eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[7],eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[8]);
-
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[8]>0) {
- nCCE1 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[8];
- *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
- LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1);
- } else
- *n1_pucch1 = -1;
-
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[7]>0) {
- nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[7];
- *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
- LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0);
- } else
- *n1_pucch0 = -1;
- } else if (subframe == 4) { // ACK subframes 9 and 0
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[0]>0) {
- nCCE1 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[0];
- *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
- } else
- *n1_pucch1 = -1;
-
- if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[9]>0) {
- nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[9];
- *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
- } else
- *n1_pucch0 = -1;
- } else {
- LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
- eNB->Mod_id,frame,subframe,frame_parms->tdd_config);
- return;
- }
-
- break;
- } // switch tdd_config
-
- // Don't handle the case M>2
- *n1_pucch2 = -1;
- *n1_pucch3 = -1;
- }
-}
void prach_procedures(PHY_VARS_eNB *eNB,
#ifdef Rel14
int br_flag
#endif
) {
-
- LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4];
uint16_t i;
int frame,subframe;
+ LTE_eNB_PRACH *prach_vars=NULL;
+
#ifdef Rel14
if (br_flag==1) {
subframe = eNB->proc.subframe_prach_br;
@@ -1984,11 +575,9 @@ void prach_procedures(PHY_VARS_eNB *eNB,
subframe = eNB->proc.subframe_prach;
frame = eNB->proc.frame_prach;
}
- uint8_t CC_id = eNB->CC_id;
RU_t *ru;
int aa=0;
int ru_aa;
- LTE_eNB_PRACH *prach_vars;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
@@ -1998,12 +587,12 @@ void prach_procedures(PHY_VARS_eNB *eNB,
for (i=0;i