Merge remote-tracking branch 'origin/develop' into enhancement-43-AVX2
Conflicts: cmake_targets/CMakeLists.txt openair1/PHY/MODULATION/ofdm_mod.c openair1/PHY/TOOLS/lte_dfts.c
This commit is contained in:
@@ -0,0 +1,33 @@
|
|||||||
|
job1:
|
||||||
|
script:
|
||||||
|
- echo $PWD
|
||||||
|
- echo $USER
|
||||||
|
- echo $OAI_USER
|
||||||
|
- echo $OAI_EXTRA_ARGS
|
||||||
|
- echo $NFS_SHARE_DIR
|
||||||
|
- echo $EXTERNAL_SHARE_DIR
|
||||||
|
- echo $SHELL
|
||||||
|
- git rev-parse --abbrev-ref HEAD
|
||||||
|
- git_repo=`git config --get remote.origin.url`
|
||||||
|
- git_head=`git rev-parse HEAD`
|
||||||
|
- echo $git_head
|
||||||
|
- tmp=`git show-ref --head | grep $git_head`
|
||||||
|
- tmp=(${tmp///// })
|
||||||
|
- git_branch=${tmp[@]:(-1)}
|
||||||
|
- echo $git_branch
|
||||||
|
- source oaienv
|
||||||
|
- echo $OPENAIR_DIR
|
||||||
|
- NFS_TEST_RESULTS_DIR=$NFS_SHARE_DIR/$git_branch/$git_head
|
||||||
|
- EXTERNAL_SHARE_RESULTS_DIR=$EXTERNAL_SHARE_DIR/$git_branch/$git_head
|
||||||
|
- echo $NFS_TEST_RESULTS_DIR
|
||||||
|
- echo $EXTERNAL_SHARE_RESULTS_DIR
|
||||||
|
- echo $NRUNS_LTE_SOFTMODEM
|
||||||
|
- echo $TIMEOUT_CMD
|
||||||
|
- mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log
|
||||||
|
- python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -c -5GRepo $git_repo -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS $OAI_EXTRA_ARGS -g "$OAI_TEST_CASE_GROUP">& $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log
|
||||||
|
- python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -r -5GRepo $git_repo -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS `echo $OAI_EXTRA_ARGS` -g "$OAI_TEST_CASE_GROUP" --nrun_lte_softmodem $NRUNS_LTE_SOFTMODEM --timeout_cmd $TIMEOUT_CMD >& $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log
|
||||||
|
- mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest.log
|
||||||
|
- mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest_cleanup.log
|
||||||
|
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $NFS_TEST_RESULTS_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$NFS_TEST_RESULTS_DIR
|
||||||
|
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $EXTERNAL_SHARE_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$EXTERNAL_SHARE_DIR
|
||||||
|
- cat $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml
|
||||||
+209
-64
@@ -36,12 +36,16 @@ set (OPENAIR1_DIR ${OPENAIR_DIR}/openair1)
|
|||||||
set (OPENAIR2_DIR ${OPENAIR_DIR}/openair2)
|
set (OPENAIR2_DIR ${OPENAIR_DIR}/openair2)
|
||||||
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||||
set (OPENAIR_TARGETS ${OPENAIR_DIR}/targets)
|
set (OPENAIR_TARGETS ${OPENAIR_DIR}/targets)
|
||||||
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||||
set (OPENAIR_CMAKE ${OPENAIR_DIR}/cmake_targets)
|
set (OPENAIR_CMAKE ${OPENAIR_DIR}/cmake_targets)
|
||||||
set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
|
set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
|
||||||
|
|
||||||
project (OpenAirInterface)
|
project (OpenAirInterface)
|
||||||
|
|
||||||
|
add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m lms7002m)
|
||||||
|
add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR lmsSDR)
|
||||||
|
add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C Si5351C)
|
||||||
|
|
||||||
###########################################
|
###########################################
|
||||||
# macros to define options as there is numerous options in oai
|
# macros to define options as there is numerous options in oai
|
||||||
################################################
|
################################################
|
||||||
@@ -133,9 +137,6 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
|
|||||||
if (CPUINFO MATCHES "avx2")
|
if (CPUINFO MATCHES "avx2")
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
|
||||||
endif()
|
endif()
|
||||||
if (CPUINFO MATCHES "sse4_2")
|
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2 -msse4.2 -fno-tree-vectorize")
|
|
||||||
endif()
|
|
||||||
if (CPUINFO MATCHES "sse4_1")
|
if (CPUINFO MATCHES "sse4_1")
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1")
|
||||||
endif()
|
endif()
|
||||||
@@ -149,8 +150,8 @@ set(C_FLAGS_PROCESSOR " ${C_FLAGS_PROCESSOR} ${CFLAGS_PROCESSOR_USER}")
|
|||||||
Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}")
|
Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}")
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
|
||||||
if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.2")) )
|
if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) )
|
||||||
Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1 -msse4.2. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -msse4.2\" ")
|
Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1\" ")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -162,49 +163,78 @@ set(CMAKE_C_FLAGS
|
|||||||
"${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP"
|
"${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP"
|
||||||
)
|
)
|
||||||
set(CMAKE_CXX_FLAGS
|
set(CMAKE_CXX_FLAGS
|
||||||
"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR}"
|
"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 "
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#########################
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${OPENAIR_TARGETS}/bin")
|
||||||
|
#########################
|
||||||
# set a flag for changes in the source code
|
# set a flag for changes in the source code
|
||||||
# these changes are related to hardcoded path to include .h files
|
# these changes are related to hardcoded path to include .h files
|
||||||
add_definitions(-DCMAKER)
|
add_definitions(-DCMAKER)
|
||||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3")
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3")
|
||||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O3")
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O3")
|
||||||
|
|
||||||
# Below has been put in comment because does not work with
|
|
||||||
# SVN authentication.
|
set(GIT_BRANCH "UNKNOWN")
|
||||||
#
|
set(GIT_COMMIT_HASH "UNKNOWN")
|
||||||
#find_package(Subversion)
|
set(GIT_COMMIT_DATE "UNKNOWN")
|
||||||
#if(SUBVERSION_FOUND)
|
|
||||||
# Subversion_WC_INFO(${OPENAIR_DIR} openair)
|
|
||||||
# set (FIRMWARE_VERSION "${openair_WC_REVISION} - ${openair_WC_LAST_CHANGED_DATE}")
|
find_package(Git)
|
||||||
# Subversion_WC_LOG(${OPENAIR_DIR} Project)
|
if(GIT_FOUND)
|
||||||
#else()
|
message("git found: ${GIT_EXECUTABLE}")
|
||||||
# set (FIRMWARE_VERSION "No svn information")
|
# Get the current working branch
|
||||||
#endif()
|
execute_process(
|
||||||
#add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
|
COMMAND git rev-parse --abbrev-ref HEAD
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE GIT_BRANCH
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
|
||||||
|
# Get the latest abbreviated commit hash of the working branch
|
||||||
|
execute_process(
|
||||||
|
COMMAND git log -1 --format=%h
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
|
||||||
|
# Get the latest commit date of the working branch
|
||||||
|
execute_process(
|
||||||
|
COMMAND git log -1 --format=%cd
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE GIT_COMMIT_DATE
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# Below is a hard-coded info
|
# Below is a hard-coded info
|
||||||
set (FIRMWARE_VERSION "No svn information")
|
set (FIRMWARE_VERSION "No svn information")
|
||||||
add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
|
add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
|
||||||
add_definitions("-DPACKAGE_VERSION=\"${FIRMWARE_VERSION}\"")
|
add_definitions("-DPACKAGE_VERSION=\"Branch: ${GIT_BRANCH} Abrev. Hash: ${GIT_COMMIT_HASH} Date: ${GIT_COMMIT_DATE}\"")
|
||||||
add_definitions("-DPACKAGE_BUGREPORT=\"OpenAirInterface web site\"")
|
add_definitions("-DPACKAGE_BUGREPORT=\"openair4g-devel@lists.eurecom.fr\"")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Debug related options
|
# Debug related options
|
||||||
#########################################
|
#########################################
|
||||||
add_boolean_option(MSG_PRINT False "print debug messages")
|
add_boolean_option(ASN_DEBUG False "ASN1 coder/decoder Debug")
|
||||||
add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
|
add_boolean_option(EMIT_ASN_DEBUG False "ASN1 coder/decoder Debug")
|
||||||
add_boolean_option(XER_PRINT False "print XER Format")
|
add_boolean_option(MSG_PRINT False "print debug messages")
|
||||||
add_boolean_option(RRC_MSG_PRINT False "print RRC messages")
|
add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
|
||||||
add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log")
|
add_boolean_option(XER_PRINT False "print XER Format")
|
||||||
add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
add_boolean_option(RRC_MSG_PRINT False "print RRC messages")
|
||||||
|
add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log")
|
||||||
|
add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||||
add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
|
add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||||
add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||||
add_boolean_option(TEST_OMG False "???")
|
add_boolean_option(TEST_OMG False "???")
|
||||||
add_boolean_option(DEBUG_OMG False "???")
|
add_boolean_option(DEBUG_OMG False "???")
|
||||||
add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
|
add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
|
||||||
add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
|
add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
|
||||||
|
|
||||||
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
|
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
|
||||||
|
|
||||||
@@ -247,6 +277,9 @@ endif (${RTAI})
|
|||||||
set(asn1c_call "${OPENAIR_CMAKE}/tools/generate_asn1")
|
set(asn1c_call "${OPENAIR_CMAKE}/tools/generate_asn1")
|
||||||
set(asn1_generated_dir ${OPENAIR_BIN_DIR})
|
set(asn1_generated_dir ${OPENAIR_BIN_DIR})
|
||||||
|
|
||||||
|
set(protoc_call "${OPENAIR_CMAKE}/tools/generate_protobuf")
|
||||||
|
set(protobuf_generated_dir ${OPENAIR_BIN_DIR})
|
||||||
|
|
||||||
# RRC
|
# RRC
|
||||||
######
|
######
|
||||||
add_list2_option(RRC_ASN1_VERSION "Rel10" "ASN.1 version of RRC interface" "Rel8" "Rel10" "CBA")
|
add_list2_option(RRC_ASN1_VERSION "Rel10" "ASN.1 version of RRC interface" "Rel8" "Rel10" "CBA")
|
||||||
@@ -312,6 +345,7 @@ set(S1AP_OAI_generated
|
|||||||
${S1AP_C_DIR}/s1ap_decoder.c
|
${S1AP_C_DIR}/s1ap_decoder.c
|
||||||
${S1AP_C_DIR}/s1ap_encoder.c
|
${S1AP_C_DIR}/s1ap_encoder.c
|
||||||
${S1AP_C_DIR}/s1ap_xer_print.c
|
${S1AP_C_DIR}/s1ap_xer_print.c
|
||||||
|
${S1AP_C_DIR}/s1ap_compare.c
|
||||||
${S1AP_C_DIR}/s1ap_ies_defs.h
|
${S1AP_C_DIR}/s1ap_ies_defs.h
|
||||||
)
|
)
|
||||||
file(GLOB s1ap_h ${S1AP_C_DIR}/*.h)
|
file(GLOB s1ap_h ${S1AP_C_DIR}/*.h)
|
||||||
@@ -407,8 +441,55 @@ add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4
|
|||||||
add_list1_option(NB_ANTENNAS_TX "2" "Number of antennas in transmission" "1" "2" "4")
|
add_list1_option(NB_ANTENNAS_TX "2" "Number of antennas in transmission" "1" "2" "4")
|
||||||
add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4")
|
add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4")
|
||||||
|
|
||||||
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "False" "EXMIMO" "OAI_USRP" "ETHERNET" "OAI_BLADERF" "CPRIGW")
|
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")
|
||||||
|
|
||||||
|
|
||||||
|
# include RF devices / transport protocols library modules
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/")
|
||||||
|
include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS/")
|
||||||
|
#set (option_HWEXMIMOLIB_lib "-l ")
|
||||||
|
set(HWLIB_EXMIMO_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c
|
||||||
|
)
|
||||||
|
add_library(oai_exmimodevif MODULE ${HWLIB_EXMIMO_SOURCE} )
|
||||||
|
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
|
||||||
|
set (option_HWUSRPLIB_lib "-l uhd")
|
||||||
|
set(HWLIB_USRP_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
|
||||||
|
)
|
||||||
|
add_library(oai_usrpdevif MODULE ${HWLIB_USRP_SOURCE} )
|
||||||
|
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/")
|
||||||
|
set (option_HWBLADERFLIB_lib "-l bladerf")
|
||||||
|
set(HWLIB_BLADERF_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
|
||||||
|
)
|
||||||
|
add_library(oai_bladerfdevif MODULE ${HWLIB_BLADERF_SOURCE} )
|
||||||
|
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/")
|
||||||
|
set (option_HWLMSSDRLIB_lib "-l LMS_SDR -l LMS7002M -l Si5351C")
|
||||||
|
set(HWLIB_LMSSDR_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
|
||||||
|
)
|
||||||
|
add_library(oai_lmssdrdevif MODULE ${HWLIB_LMSSDR_SOURCE} )
|
||||||
|
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/")
|
||||||
|
set(TPLIB_ETHERNET_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c
|
||||||
|
)
|
||||||
|
add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
|
||||||
|
|
||||||
|
|
||||||
|
# RF devices / transport protocols settings
|
||||||
|
######################################################################
|
||||||
if (${RF_BOARD} STREQUAL "EXMIMO")
|
if (${RF_BOARD} STREQUAL "EXMIMO")
|
||||||
set(DRIVER2013)
|
set(DRIVER2013)
|
||||||
include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/")
|
include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/")
|
||||||
@@ -416,6 +497,7 @@ if (${RF_BOARD} STREQUAL "EXMIMO")
|
|||||||
set(HW_SOURCE ${HW_SOURCE}
|
set(HW_SOURCE ${HW_SOURCE}
|
||||||
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
|
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
|
||||||
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c)
|
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c)
|
||||||
|
set(option_HW_lib "-rdynamic -ldl")
|
||||||
|
|
||||||
elseif (${RF_BOARD} STREQUAL "OAI_USRP")
|
elseif (${RF_BOARD} STREQUAL "OAI_USRP")
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
|
include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
|
||||||
@@ -423,8 +505,7 @@ elseif (${RF_BOARD} STREQUAL "OAI_USRP")
|
|||||||
set(HW_SOURCE ${HW_SOURCE}
|
set(HW_SOURCE ${HW_SOURCE}
|
||||||
${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp)
|
${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp)
|
||||||
LINK_DIRECTORIES("/opt/lib")
|
LINK_DIRECTORIES("/opt/lib")
|
||||||
set(option_HW_lib "uhd")
|
set(option_HW_lib "-luhd -rdynamic -ldl")
|
||||||
set(LOWLATENCY False)
|
|
||||||
|
|
||||||
elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
|
elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/")
|
include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/")
|
||||||
@@ -434,26 +515,51 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
|
|||||||
${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
|
${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
|
||||||
)
|
)
|
||||||
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
|
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
|
||||||
set(option_HW_lib "bladeRF")
|
|
||||||
#set(LOWLATENCY False)
|
|
||||||
|
|
||||||
elseif (${RF_BOARD} STREQUAL "ETHERNET")
|
set(option_HW_lib "bladeRF -rdynamic -ldl")
|
||||||
include_directories ("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB")
|
#set(LOWLATENCY False)
|
||||||
set(HW_SOURCE ${HW_SOURCE}
|
|
||||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR")
|
||||||
)
|
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB")
|
||||||
set(LOWLATENCY True)
|
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR")
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m")
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C")
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard")
|
||||||
|
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
|
||||||
|
LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lmsSDR")
|
||||||
|
LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lms7002m")
|
||||||
|
LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/Si5351C")
|
||||||
|
set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp)
|
||||||
|
set(LOWLATENCY False)
|
||||||
|
set(option_HW_lib "-lLMS_SDR -lLMS7002M -lSi5351C -rdynamic -ldl")
|
||||||
|
|
||||||
elseif (${RF_BOARD} STREQUAL "CPRIGW")
|
elseif (${RF_BOARD} STREQUAL "CPRIGW")
|
||||||
set(HW_SOURCE ${HW_SOURCE}
|
set(HW_SOURCE ${HW_SOURCE}
|
||||||
${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/cprigw_lib.c
|
${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/cprigw_lib.c
|
||||||
)
|
)
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/")
|
include_directories("${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/")
|
||||||
set(option_HW_lib "-rdynamic dl")
|
set(option_HW_lib "-rdynamic dl")
|
||||||
|
|
||||||
endif (${RF_BOARD} STREQUAL "EXMIMO")
|
endif (${RF_BOARD} STREQUAL "EXMIMO")
|
||||||
|
|
||||||
|
|
||||||
|
if (${TRANSP_PRO} STREQUAL "ETHERNET")
|
||||||
|
|
||||||
|
include_directories ("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB")
|
||||||
|
set(TRANSPORT_SOURCE ${TRANSPORT_SOURCE}
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c
|
||||||
|
)
|
||||||
|
set(option_TP_lib "-rdynamic -ldl")
|
||||||
|
|
||||||
|
|
||||||
|
endif (${TRANSP_PRO} STREQUAL "ETHERNET")
|
||||||
|
##########################################################
|
||||||
|
|
||||||
include_directories ("${OPENAIR_TARGETS}/ARCH/COMMON")
|
include_directories ("${OPENAIR_TARGETS}/ARCH/COMMON")
|
||||||
|
|
||||||
|
Message("LOWLATENCY flag is ${LOWLATENCY}")
|
||||||
|
|
||||||
##############################################################
|
##############################################################
|
||||||
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
|
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
|
||||||
@@ -476,6 +582,9 @@ add_list_string_option(PACKAGE_NAME "NotDefined" "As per attribute name")
|
|||||||
add_boolean_option(MESSAGE_CHART_GENERATOR False "For generating sequence diagrams")
|
add_boolean_option(MESSAGE_CHART_GENERATOR False "For generating sequence diagrams")
|
||||||
add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams")
|
add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams")
|
||||||
add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams")
|
add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams")
|
||||||
|
|
||||||
|
add_boolean_option(ENB_AGENT True "enable eNB agent to inteface with a SDN contrller")
|
||||||
|
|
||||||
########################
|
########################
|
||||||
# Include order
|
# Include order
|
||||||
##########################
|
##########################
|
||||||
@@ -847,6 +956,7 @@ set(PHY_SRC
|
|||||||
${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
|
${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/lte_init.c
|
${OPENAIR1_DIR}/PHY/INIT/lte_init.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
|
${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
|
||||||
|
${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
|
${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
||||||
@@ -1001,7 +1111,6 @@ add_library(CN_UTILS
|
|||||||
${OPENAIR3_DIR}/UTILS/conversions.c
|
${OPENAIR3_DIR}/UTILS/conversions.c
|
||||||
${OPENAIR3_DIR}/UTILS/enum_string.c
|
${OPENAIR3_DIR}/UTILS/enum_string.c
|
||||||
${OPENAIR3_DIR}/UTILS/log.c
|
${OPENAIR3_DIR}/UTILS/log.c
|
||||||
${OPENAIR3_DIR}/UTILS/mme_config.c
|
|
||||||
${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c
|
${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1342,6 +1451,9 @@ include(FindPkgConfig)
|
|||||||
pkg_search_module(LIBXML2 libxml-2.0 REQUIRED)
|
pkg_search_module(LIBXML2 libxml-2.0 REQUIRED)
|
||||||
include_directories(${LIBXML2_INCLUDE_DIRS})
|
include_directories(${LIBXML2_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
pkg_search_module(LIBXSLT libxslt REQUIRED)
|
||||||
|
include_directories(${LIBXSLT_INCLUDE_DIRS})
|
||||||
|
|
||||||
pkg_search_module(OPENSSL openssl REQUIRED)
|
pkg_search_module(OPENSSL openssl REQUIRED)
|
||||||
include_directories(${OPENSSL_INCLUDE_DIRS})
|
include_directories(${OPENSSL_INCLUDE_DIRS})
|
||||||
|
|
||||||
@@ -1405,10 +1517,11 @@ add_definitions(-DASN1_MINIMUM_VERSION=924)
|
|||||||
|
|
||||||
#################################
|
#################################
|
||||||
# add executables for operation
|
# add executables for operation
|
||||||
#################################""
|
#################################
|
||||||
|
|
||||||
# lte-softmodem is both eNB and UE implementation
|
# lte-softmodem is both eNB and UE implementation
|
||||||
###################################################
|
###################################################
|
||||||
|
|
||||||
add_executable(lte-softmodem
|
add_executable(lte-softmodem
|
||||||
${rrc_h}
|
${rrc_h}
|
||||||
${s1ap_h}
|
${s1ap_h}
|
||||||
@@ -1426,6 +1539,7 @@ add_executable(lte-softmodem
|
|||||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||||
${GTPU_need_ITTI}
|
${GTPU_need_ITTI}
|
||||||
${HW_SOURCE}
|
${HW_SOURCE}
|
||||||
|
${TRANSPORT_SOURCE}
|
||||||
${RTAI_SOURCE}
|
${RTAI_SOURCE}
|
||||||
${XFORMS_SOURCE}
|
${XFORMS_SOURCE}
|
||||||
${XFORMS_SOURCE_SOFTMODEM}
|
${XFORMS_SOURCE_SOFTMODEM}
|
||||||
@@ -1433,13 +1547,14 @@ add_executable(lte-softmodem
|
|||||||
|
|
||||||
target_link_libraries (lte-softmodem
|
target_link_libraries (lte-softmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB}
|
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB}
|
||||||
-Wl,--end-group )
|
-Wl,--end-group )
|
||||||
|
|
||||||
|
|
||||||
target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
|
target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
|
||||||
target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${XFORMS_LIBRARIES} )
|
target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
|
||||||
target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES})
|
target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES})
|
||||||
|
target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES})
|
||||||
|
|
||||||
# lte-softmodem-nos1 is both eNB and UE implementation
|
# lte-softmodem-nos1 is both eNB and UE implementation
|
||||||
###################################################
|
###################################################
|
||||||
@@ -1460,6 +1575,7 @@ add_executable(lte-softmodem-nos1
|
|||||||
#${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
#${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||||
${HW_SOURCE}
|
${HW_SOURCE}
|
||||||
|
${TRANSPORT_SOURCE}
|
||||||
${RTAI_SOURCE}
|
${RTAI_SOURCE}
|
||||||
${XFORMS_SOURCE}
|
${XFORMS_SOURCE}
|
||||||
${XFORMS_SOURCE_SOFTMODEM}
|
${XFORMS_SOURCE_SOFTMODEM}
|
||||||
@@ -1470,38 +1586,43 @@ target_link_libraries (lte-softmodem-nos1
|
|||||||
-Wl,--end-group )
|
-Wl,--end-group )
|
||||||
|
|
||||||
target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES})
|
target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES})
|
||||||
target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${XFORMS_LIBRARIES} )
|
target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
|
||||||
target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES})
|
target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES})
|
||||||
|
target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES})
|
||||||
|
|
||||||
|
|
||||||
# rrh
|
# rrh
|
||||||
################################
|
################################
|
||||||
set(DRIVER2013)
|
#Note: only one RF type (USRP) is currently supported for RRH
|
||||||
|
|
||||||
#Note: only on RF type is currently supported for RRH
|
|
||||||
add_executable(rrh_gw
|
add_executable(rrh_gw
|
||||||
${OPENAIR_TARGETS}/RT/USER/rrh_gw.c
|
${OPENAIR_TARGETS}/RT/USER/rrh_gw.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/eNB_transport_IQ.c
|
${OPENAIR_TARGETS}/RT/USER/eNB_transport_IQ.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/UE_transport_IQ.c
|
${OPENAIR_TARGETS}/RT/USER/UE_transport_IQ.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
|
||||||
${HW_SOURCE}
|
${HW_SOURCE}
|
||||||
|
${TRANSPORT_SOURCE}
|
||||||
)
|
)
|
||||||
# assert and common_lib.h
|
target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti)
|
||||||
target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti ${OPENAIR_TARGETS}/ARCH/COMMON ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ )
|
|
||||||
|
|
||||||
target_link_libraries(rrh_gw
|
target_link_libraries(rrh_gw
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
UTIL LFDS
|
UTIL LFDS
|
||||||
-Wl,--end-group )
|
-Wl,--end-group )
|
||||||
target_link_libraries (rrh_gw rt pthread m )
|
target_link_libraries (rrh_gw rt pthread m )
|
||||||
target_link_libraries (rrh_gw ${option_HW_lib} ${LIBBOOST_LIBRARIES} )
|
target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} )
|
||||||
|
target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES})
|
||||||
|
|
||||||
#Message("-- default_HW_lib=ETHERNET") # only in case of RRH
|
|
||||||
Message("-- option_HW_lib=${option_HW_lib}")
|
Message("-- option_HW_lib=${option_HW_lib}")
|
||||||
Message("-- HW_SOURCE=${HW_SOURCE}")
|
Message("-- HW_SOURCE=${HW_SOURCE}")
|
||||||
|
Message("-- option_TP_lib=${option_TP_lib}")
|
||||||
|
Message("-- TRANSPORT_SOURCE=${TRANSPORT_SOURCE}")
|
||||||
|
|
||||||
|
if (${RF_BOARD} STREQUAL "OAI_LMSSDR")
|
||||||
|
add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C)
|
||||||
|
add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C)
|
||||||
|
add_dependencies(rrh_gw LMS7002M LMS_SDR Si5351C)
|
||||||
|
endif (${RF_BOARD} STREQUAL "OAI_LMSSDR")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# USIM process
|
# USIM process
|
||||||
#################
|
#################
|
||||||
@@ -1552,6 +1673,7 @@ add_executable(oaisim
|
|||||||
${GTPU_need_ITTI}
|
${GTPU_need_ITTI}
|
||||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||||
${HW_SOURCE}
|
${HW_SOURCE}
|
||||||
|
${TRANSPORT_SOURCE}
|
||||||
${XFORMS_SOURCE}
|
${XFORMS_SOURCE}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1563,7 +1685,7 @@ target_link_libraries (oaisim
|
|||||||
-Wl,--end-group )
|
-Wl,--end-group )
|
||||||
|
|
||||||
target_link_libraries (oaisim ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
|
target_link_libraries (oaisim ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
|
||||||
target_link_libraries (oaisim pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib}
|
target_link_libraries (oaisim pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib}
|
||||||
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES})
|
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES})
|
||||||
#Force link with forms, regardless XFORMS option
|
#Force link with forms, regardless XFORMS option
|
||||||
target_link_libraries (oaisim forms)
|
target_link_libraries (oaisim forms)
|
||||||
@@ -1590,6 +1712,7 @@ add_executable(oaisim_nos1
|
|||||||
${OPENAIR2_DIR}/UTIL/OMG/sumo.c
|
${OPENAIR2_DIR}/UTIL/OMG/sumo.c
|
||||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||||
${HW_SOURCE}
|
${HW_SOURCE}
|
||||||
|
${TRANSPORT_SOURCE}
|
||||||
${XFORMS_SOURCE}
|
${XFORMS_SOURCE}
|
||||||
)
|
)
|
||||||
target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER)
|
target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER)
|
||||||
@@ -1599,7 +1722,7 @@ target_link_libraries (oaisim_nos1
|
|||||||
-Wl,--end-group )
|
-Wl,--end-group )
|
||||||
|
|
||||||
target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
|
target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
|
||||||
target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib}
|
target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib}
|
||||||
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES})
|
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES})
|
||||||
#Force link with forms, regardless XFORMS option
|
#Force link with forms, regardless XFORMS option
|
||||||
target_link_libraries (oaisim_nos1 forms)
|
target_link_libraries (oaisim_nos1 forms)
|
||||||
@@ -1622,6 +1745,7 @@ endforeach(myExe)
|
|||||||
|
|
||||||
add_executable(test_epc_generate_scenario
|
add_executable(test_epc_generate_scenario
|
||||||
${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.c
|
${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.h
|
||||||
${OPENAIR2_DIR}/ENB_APP/enb_config.h
|
${OPENAIR2_DIR}/ENB_APP/enb_config.h
|
||||||
${OPENAIR2_DIR}/COMMON/commonDef.h
|
${OPENAIR2_DIR}/COMMON/commonDef.h
|
||||||
${OPENAIR2_DIR}/COMMON/messages_def.h
|
${OPENAIR2_DIR}/COMMON/messages_def.h
|
||||||
@@ -1630,7 +1754,28 @@ add_executable(test_epc_generate_scenario
|
|||||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||||
)
|
)
|
||||||
target_link_libraries (test_epc_generate_scenario
|
target_link_libraries (test_epc_generate_scenario
|
||||||
-Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
-Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(test_epc_play_scenario
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_decode.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_display.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_fsm.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_parse.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_sctp.c
|
||||||
|
${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h
|
||||||
|
${OPENAIR2_DIR}/COMMON/commonDef.h
|
||||||
|
${OPENAIR2_DIR}/COMMON/messages_def.h
|
||||||
|
${OPENAIR2_DIR}/COMMON/messages_types.h
|
||||||
|
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||||
|
)
|
||||||
|
target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
|
||||||
|
target_link_libraries (test_epc_play_scenario
|
||||||
|
-Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,41 +6,50 @@ Obj.# Case# Test# Description
|
|||||||
01 pre-commit test case
|
01 pre-commit test case
|
||||||
01 01 Build OAI
|
01 01 Build OAI
|
||||||
01 01 01 Build oaisim.Rel8
|
01 01 01 Build oaisim.Rel8
|
||||||
01 01 02 Build oaisim.Rel8 + network device driver(nasmesh_fix)
|
01 01 02 Build oaisim.Rel10
|
||||||
01 01 03 Build (lte-softmodem.Rel8.EXMIMO + lte-softmodem.Rel10.EXMIMO + lte-softmodem.Rel10.USRP)
|
01 01 03 Build oaisim_noS1.Rel10
|
||||||
01 01 04 Build (dlsim.Rel10 + ulsim.Rel10 + pucchsim.Rel10 + prachsim.Rel10 + pdcchsim.Rel10 + pbchsim.Rel10 + mbmssim.Rel10
|
01 01 10 Build lte-softmodem_noS1.USRP.Rel10
|
||||||
|
01 01 11 Build lte-softmodem_noS1.EXMIMO.Rel10
|
||||||
|
01 01 12 Build lte-softmodem_noS1.BLADERF.Rel10
|
||||||
|
01 01 13 Build lte-softmodem_noS1.ETHERNET.Rel10
|
||||||
|
01 01 20 Build lte-softmodem.USRP.Rel10
|
||||||
|
01 01 21 Build lte-softmodem.EXMIMO.Rel10
|
||||||
|
01 01 22 Build lte-softmodem.BLADERF.Rel10
|
||||||
|
01 01 23 Build lte-softmodem.ETHERNET.Rel10
|
||||||
|
|
||||||
|
01 01 30 Build (dlsim.Rel10 + ulsim.Rel10 + pucchsim.Rel10 + prachsim.Rel10 + pdcchsim.Rel10 + pbchsim.Rel10 + mbmssim.Rel10
|
||||||
secu_knas_encrypt_eia1.Rel10 secu_kenb.Rel10 aes128_ctr_encrypt.Rel10 aes128_ctr_decrypt.Rel10 secu_knas_encrypt_eea2.Rel10
|
secu_knas_encrypt_eia1.Rel10 secu_kenb.Rel10 aes128_ctr_encrypt.Rel10 aes128_ctr_decrypt.Rel10 secu_knas_encrypt_eea2.Rel10
|
||||||
secu_knas.Rel10 secu_knas_encrypt_eea1.Rel10 kdf.Rel10 aes128_cmac_encrypt.Rel10 secu_knas_encrypt_eia2.Rel10)
|
secu_knas.Rel10 secu_knas_encrypt_eea1.Rel10 kdf.Rel10 aes128_cmac_encrypt.Rel10 secu_knas_encrypt_eia2.Rel10)
|
||||||
01 01 06 Build oaisim.Rel8 + ITTI
|
|
||||||
01 01 07 Build oaisim.Rel10
|
01 01 40 Build RRH Gateway for USRP (Rel 10)
|
||||||
01 01 08 Build oaisim.Rel10 + ITTI
|
01 01 41 Build RRH Gateway for EXMIMO (Rel 10)
|
||||||
01 01 20 Build Nasmesh
|
01 01 42 Build RRH Gateway for BLADERF (Rel 10)
|
||||||
01 01 30 Build RRH Gateway
|
|
||||||
|
|
||||||
|
|
||||||
01 02 Run OAISIM Rel10 (TDD + 5MHz/10MHz/20MHz + TM 1,2,5,6), and check the operation
|
|
||||||
01 02 00 Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2,5,6) and search for errors, segmentation fault or exit
|
01 02 Run OAISIM-NOS1 Rel10 (TDD + 5MHz/10MHz/20MHz + TM 1,2), and check the operation
|
||||||
01 02 01 Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2,5,6) in PHY_ABSTRACTION mode and search for errors
|
01 02 00 Run OAISIM-NOS1 Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit
|
||||||
01 02 02 Run OAISIM Rel10 TDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2,5,6) and search for errors, segmentation fault or exit
|
01 02 01 Run OAISIM-NOS1 Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) in PHY_ABSTRACTION mode and search for errors
|
||||||
01 02 03 Run OAISIM Rel10 TDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2,5,6) in PHY_ABSTRACTION mode and search for errors
|
01 02 02 Run OAISIM-NOS1 Rel10 TDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit
|
||||||
01 02 04 Run OAI Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2,5,6) without PHY_ABSTRACTION mode, ping from from eNB to UE,
|
01 02 03 Run OAISIM-NOS1 Rel10 TDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2) in PHY_ABSTRACTION mode and search for errors
|
||||||
|
01 02 04 Run OAISIM-NOS1 Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) without PHY_ABSTRACTION mode, ping from from eNB to UE,
|
||||||
and for check for no packet losses
|
and for check for no packet losses
|
||||||
01 02 05 Run OAI Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2,5,6) in PHY_ABSTRACTION mode, send ping from from eNB to UE,
|
01 02 05 Run OAISIM-NOS1 Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) in PHY_ABSTRACTION mode, send ping from from eNB to UE,
|
||||||
and check for no packet losses
|
and check for no packet losses
|
||||||
|
|
||||||
01 03 Run OAISIM Rel10 (FDD + 5MHz/10MHz/20MHz + TM 1,2,5,6), and check the operation
|
01 03 Run OAISIM-NOS1 Rel10 (FDD + 5MHz/10MHz/20MHz + TM 1,2), and check the operation
|
||||||
01 03 00 Run OAISIM Rel10 FDD, 1 eNB + 1 UE 1 eNB (5 MHz/10MHz/20MHz), (TM 1,2,5,6) and search for errors, segmentation fault or exit
|
01 03 00 Run OAISIM-NOS1 Rel10 FDD, 1 eNB + 1 UE 1 eNB (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit
|
||||||
01 03 01 Run OAISIM Rel10 FDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2,5,6) in PHY_ABSTRACTION mode and search for errors
|
01 03 01 Run OAISIM-NOS1 Rel10 FDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) in PHY_ABSTRACTION mode and search for errors
|
||||||
01 03 02 Run OAISIM Rel10 FDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2,5,6) and search for errors, segmentation fault or exit
|
01 03 02 Run OAISIM-NOS1 Rel10 FDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit
|
||||||
01 03 03 Run OAISIM Rel10 FDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2,5,6) in PHY_ABSTRACTION mode and search for errors
|
01 03 03 Run OAISIM-NOS1 Rel10 FDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2) in PHY_ABSTRACTION mode and search for errors
|
||||||
01 03 04 Run OAI Rel10 FDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2,5,6) without PHY_ABSTRACTION mode, ping from from eNB to UE,
|
01 03 04 Run OAISIM-NOS1 Rel10 FDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) without PHY_ABSTRACTION mode, ping from from eNB to UE,
|
||||||
and for check for no packet losses
|
and for check for no packet losses
|
||||||
01 03 05 Run OAI Rel10 FDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2,5,6) in PHY_ABSTRACTION mode, send ping from from eNB to UE,
|
01 03 05 Run OAISIM-NOS1 Rel10 FDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) in PHY_ABSTRACTION mode, send ping from from eNB to UE,
|
||||||
and check for no packet losses
|
and check for no packet losses
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
01 04 MBSFN Tests
|
01 04 OAISIM-NOS1 MBSFN Tests
|
||||||
01 04 00 Check if eMBMS procedure is not finished completely, make sure that the SIB13/MCCH have been correclty received by UEs
|
01 04 00 Check if eMBMS procedure is not finished completely, make sure that the SIB13/MCCH have been correclty received by UEs
|
||||||
01 04 01 Check if eMBMS multicast/broadcast data is received, make sure that the SIB13/MCCH/MTCH have been correclty received by UEs
|
01 04 01 Check if eMBMS multicast/broadcast data is received, make sure that the SIB13/MCCH/MTCH have been correclty received by UEs
|
||||||
01 04 02 Check for eMBMS multicast/broadcast data received in fdd mode, make sure that the SIB13/MCCH/MTCH have been correctly
|
01 04 02 Check for eMBMS multicast/broadcast data received in fdd mode, make sure that the SIB13/MCCH/MTCH have been correctly
|
||||||
@@ -88,7 +97,116 @@ Obj.# Case# Test# Description
|
|||||||
01 51 06 mbmssim (TBD)
|
01 51 06 mbmssim (TBD)
|
||||||
|
|
||||||
|
|
||||||
01 55 lte-softmodem tests
|
01 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX, 2TX/2RX
|
||||||
|
01 55 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 55 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 55 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 55 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 55 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 55 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 55 06 Band 7 FDD 5MHz UL Throughput for 300 sec for 2TX/2RX
|
||||||
|
01 55 07 Band 7 FDD 10MHz UL Throughput for 300 sec for 2TX/2RX
|
||||||
|
01 55 08 Band 7 FDD 20MHz UL Throughput for 300 sec for 2TX/2RX
|
||||||
|
01 55 09 Band 7 FDD 5MHz DL Throughput for 300 sec for 2TX/2RX
|
||||||
|
01 55 10 Band 7 FDD 10MHz DL Throughput for 300 sec for 2TX/2RX
|
||||||
|
01 55 11 Band 7 FDD 20MHz DL Throughput for 300 sec for 2TX/2RX
|
||||||
|
|
||||||
|
01 56 lte-softmodem tests with USRP B210 RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE
|
||||||
|
01 56 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 56 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 56 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 56 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 56 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 56 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
01 57 lte-softmodem tests with USRP B210 RF as eNB and OAI EPC (eNB and EPC are on different machines) w/ Bandrich COTS UE
|
||||||
|
01 57 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 57 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 57 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 57 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 57 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 57 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
01 58 lte-softmodem tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for `TX/1RX, 2TX/2RX
|
||||||
|
01 58 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 58 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 58 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 58 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 58 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 58 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
01 59 lte-softmodem tests with USRP X310 RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE
|
||||||
|
|
||||||
|
01 60 lte-softmodem tests with USRP X310 RF as eNB and OAI EPC (eNB and EPC are on different machines) w/ Bandrich COTS UE
|
||||||
|
01 60 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 60 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 60 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 60 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 60 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 60 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
01 61 lte-softmodem tests with EXMIMO RF as eNB and ALU EPC w/ Bandrich COTS UE for `TX/1RX, 2TX/2RX
|
||||||
|
01 61 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 61 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 61 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 61 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 61 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 61 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
01 62 lte-softmodem tests with EXMIMO RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE
|
||||||
|
|
||||||
|
01 63 lte-softmodem tests with EXMIMO RF as eNB and OAI EPC (eNB and EPC are on different machines) w/ Bandrich COTS UE
|
||||||
|
01 63 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 63 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 63 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 63 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 63 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 63 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
01 65 00 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||||
|
01 65 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 65 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 65 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 65 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 65 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 65 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
|
||||||
|
01 70 00 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||||
|
01 70 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 70 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 70 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 70 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 70 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 70 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
|
||||||
|
01 75 00 lte-softmodem + RRH tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||||
|
01 75 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 75 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 75 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 75 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
01 80 00 lte-softmodem + RRH tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||||
|
01 80 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 80 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 80 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 80 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 80 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 80 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
01 85 00 lte-softmodem + RRH tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||||
|
01 85 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 85 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 85 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 85 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 85 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||||
|
|
||||||
|
|
||||||
|
01 64 lte-softmodem-noS1 tests
|
||||||
|
|
||||||
02 Functional test case
|
02 Functional test case
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,351 @@
|
|||||||
|
#******************************************************************************
|
||||||
|
|
||||||
|
# Eurecom OpenAirInterface
|
||||||
|
# Copyright(c) 1999 - 2013 Eurecom
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms and conditions of the GNU General Public License,
|
||||||
|
# version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
# This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
# more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License along with
|
||||||
|
# this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
# The full GNU General Public License is included in this distribution in
|
||||||
|
# the file called "COPYING".
|
||||||
|
|
||||||
|
# Contact Information
|
||||||
|
# Openair Admin: openair_admin@eurecom.fr
|
||||||
|
# Openair Tech : openair_tech@eurecom.fr
|
||||||
|
# Forums : http://forums.eurecom.fsr/openairinterface
|
||||||
|
# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France
|
||||||
|
|
||||||
|
#*****************************************************************************
|
||||||
|
|
||||||
|
# \file core.py
|
||||||
|
# \brief OAI core testing class that provides various primitives to send/recv cmd to openair class searching for patterns and process the responses and tag the test case as passed/failed/skipped
|
||||||
|
# \author Navid Nikaein
|
||||||
|
# \date 2013
|
||||||
|
# \version 0.1
|
||||||
|
# @ingroup _test
|
||||||
|
|
||||||
|
|
||||||
|
import pexpect
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
import string
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
import openair
|
||||||
|
import log
|
||||||
|
|
||||||
|
class core:
|
||||||
|
def __init__(self):
|
||||||
|
self.send_cr = 1
|
||||||
|
self.expect_echo = 0
|
||||||
|
self.expect_response = 1
|
||||||
|
self.flag_errors = 1
|
||||||
|
self.log = None
|
||||||
|
|
||||||
|
def clean(self, obj):
|
||||||
|
if type(obj) is str:
|
||||||
|
return obj
|
||||||
|
else:
|
||||||
|
return repr(obj)
|
||||||
|
|
||||||
|
def mark(self, marker):
|
||||||
|
if self.log:
|
||||||
|
print >> self.log, "\n\n{" + marker + "}\n\n"
|
||||||
|
|
||||||
|
def expected(self, expected, got):
|
||||||
|
return "================================= Failure ===================================\n"+\
|
||||||
|
"_________________________________ Expected __________________________________\n"+\
|
||||||
|
"--->" + expected + "<-\n" +\
|
||||||
|
"_________________________________ Received __________________________________\n"+\
|
||||||
|
"--->" + got + "<-\n" +\
|
||||||
|
"=============================================================================\n"
|
||||||
|
|
||||||
|
def unexpected(self, notexpected, got):
|
||||||
|
return "================================= Failure ===================================\n"+\
|
||||||
|
"__________________________ not expect to find _______________________________\n"+\
|
||||||
|
"---> " + self.clean(notexpected) + "\n" +\
|
||||||
|
"_________________________________ Received___________________________________\n"+\
|
||||||
|
"---> " + self.clean(got) + "\n" +\
|
||||||
|
"=============================================================================\n"
|
||||||
|
|
||||||
|
def failed(self, command, expect,debug):
|
||||||
|
time.sleep(2)
|
||||||
|
ret = "================================= Failure =================================\n"
|
||||||
|
ret +="_________________________________ Sent ____________________________________\n"
|
||||||
|
ret +="---> " + command + "\n"
|
||||||
|
ret +="______________________________Searching for _______________________________\n"
|
||||||
|
ret +="---> " + self.clean(expect) + "\n"
|
||||||
|
if debug >= 1 :
|
||||||
|
ret +="________________________________ Received _________________________________\n"
|
||||||
|
ret +="---> " + self.clean(self.oai.before) + "\n"
|
||||||
|
ret +="_______________________________ Remaining _________________________________\n"
|
||||||
|
ret +="---> " + self.clean(self.oai.after) + "\n"
|
||||||
|
ret +="===========================================================================\n"
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def err(self, command):
|
||||||
|
return "============================ Error received ================================\n"+\
|
||||||
|
"__________________________________ Sent ____________________________________\n"+\
|
||||||
|
'---> ' + command + "\n"+\
|
||||||
|
"_________________________________ Error was ________________________________\n"+\
|
||||||
|
"---> " + self.oai.before + "\n" +\
|
||||||
|
"============================================================================\n"
|
||||||
|
|
||||||
|
|
||||||
|
def wait_quiet(self, timeout=0.5):
|
||||||
|
while 1:
|
||||||
|
try:
|
||||||
|
self.oai.expect(['..*'], timeout=0.5)
|
||||||
|
except pexpect.TIMEOUT, e:
|
||||||
|
return
|
||||||
|
# print '[Flushing ' + self.oai.after + ']'
|
||||||
|
|
||||||
|
# **************************Send*****************************
|
||||||
|
# 1) send a command and return, do not wait
|
||||||
|
# ************************************************************
|
||||||
|
def send_nowait(self, command, sudo=False):
|
||||||
|
rsp1 = self.prompt1
|
||||||
|
rsp2 = self.prompt2
|
||||||
|
if sudo == True:
|
||||||
|
command = 'echo \'' + '' + '\' | sudo -S -E bash -c \' ' + command + '\' '
|
||||||
|
self.wait_quiet()
|
||||||
|
if self.send_cr:
|
||||||
|
log.stats['cmd'] += 1
|
||||||
|
self.oai.sendline(command)
|
||||||
|
else:
|
||||||
|
self.oai.send(command)
|
||||||
|
|
||||||
|
|
||||||
|
# **************************Send*****************************
|
||||||
|
# 1) send a command
|
||||||
|
# 2) wait for a return prompt. Don't capture the response.
|
||||||
|
# 3) Check for error or timeout.
|
||||||
|
# ************************************************************
|
||||||
|
def send(self, command,sudo=False, timeout = 50, rsp1=None, rsp2=None,debug=0):
|
||||||
|
if not rsp1:
|
||||||
|
rsp1 = self.prompt1
|
||||||
|
if not rsp2:
|
||||||
|
rsp2 = self.prompt2
|
||||||
|
self.wait_quiet()
|
||||||
|
if sudo == True:
|
||||||
|
command = 'echo \'' + '' + '\' | sudo -S -E bash -c \' ' + command + '\' '
|
||||||
|
if self.send_cr:
|
||||||
|
log.stats['cmd'] += 1
|
||||||
|
self.oai.sendline(command)
|
||||||
|
else:
|
||||||
|
self.oai.send(command)
|
||||||
|
|
||||||
|
if self.expect_echo:
|
||||||
|
#cmd = self.oai.expect([re.escape(command), pexpect.TIMEOUT], timeout=timeout);
|
||||||
|
cmd = self.oai.expect_exact([command, pexpect.TIMEOUT], timeout=timeout);
|
||||||
|
if cmd != 0:
|
||||||
|
raise log.err(self.failed(command, command,debug))
|
||||||
|
|
||||||
|
if self.expect_response:
|
||||||
|
#index = self.oai.expect([re.escape(rsp1), re.escape(rsp2),'%', pexpect.TIMEOUT], timeout=timeout)
|
||||||
|
index = self.oai.expect_exact([rsp1, rsp2, pexpect.TIMEOUT], timeout=timeout)
|
||||||
|
|
||||||
|
if index == 0 or index == 1:
|
||||||
|
return 'OK'
|
||||||
|
elif index == 2:
|
||||||
|
#self.oai.expect([re.escape(rsp1), re.escape(rsp2), pexpect.TIMEOUT], timeout=timeout)
|
||||||
|
self.oai.expect_exact([rsp1, rsp2, pexpect.TIMEOUT], timeout=timeout)
|
||||||
|
if self.flag_errors:
|
||||||
|
raise log.err(self.err(command))
|
||||||
|
else:
|
||||||
|
return 'OK'
|
||||||
|
else:
|
||||||
|
raise log.err(self.failed(command, rsp1 + ' or ' + rsp2,debug))
|
||||||
|
|
||||||
|
# **************************send_recv*************************
|
||||||
|
# 1) send a command
|
||||||
|
# 2) wait for either rsp1 or rsp2 is found (normally prompts)
|
||||||
|
# 3) return everything seen before that
|
||||||
|
# ************************************************************
|
||||||
|
def send_recv(self, command, sudo=False, timeout=100, rsp1=None, rsp2=None,debug=0):
|
||||||
|
if not rsp1:
|
||||||
|
rsp1 = self.prompt1
|
||||||
|
if not rsp2:
|
||||||
|
rsp2 = self.prompt2
|
||||||
|
self.wait_quiet()
|
||||||
|
if sudo == True:
|
||||||
|
#command = 'echo \'' + self.password + '\' | sudo -S -E ' + command
|
||||||
|
command = 'echo \'' + '' + '\' | sudo -S -E bash -c \' ' + command + '\' '
|
||||||
|
if self.send_cr:
|
||||||
|
log.stats['cmd'] += 1
|
||||||
|
self.oai.sendline(command)
|
||||||
|
else:
|
||||||
|
self.oai.send(command)
|
||||||
|
#index = self.oai.expect([re.escape(rsp1), re.escape(rsp2), pexpect.TIMEOUT], timeout=timeout);
|
||||||
|
index = self.oai.expect_exact([rsp1, rsp2, pexpect.TIMEOUT], timeout=timeout);
|
||||||
|
if index == 0 or index == 1 :
|
||||||
|
return self.oai.before
|
||||||
|
else:
|
||||||
|
print "command = " + command + "rsp1 = " + rsp1 + " rsp2 = " + rsp2 + " index = " + str(index)
|
||||||
|
raise log.err(self.failed(command, rsp1 + ' or ' + rsp2,debug))
|
||||||
|
|
||||||
|
|
||||||
|
# **************************send_expect*************************
|
||||||
|
# 1) send a command, and optionally specify a the time to wait
|
||||||
|
# 2) search for an expected pattern in the response
|
||||||
|
# 3) raise an error if not found
|
||||||
|
# **************************************************************
|
||||||
|
def send_expect(self, command, expect, sudo=False, delay = 50, rsp1=None, rsp2=None,debug=0):
|
||||||
|
if debug :
|
||||||
|
print command
|
||||||
|
print expect
|
||||||
|
print delay
|
||||||
|
rsp = self.send_recv(command, sudo, delay, rsp1, rsp2)
|
||||||
|
#print rsp
|
||||||
|
if (rsp.find(expect) != -1):
|
||||||
|
return 'Ok'
|
||||||
|
|
||||||
|
raise log.err(self.failed(command, expect,debug))
|
||||||
|
|
||||||
|
|
||||||
|
# **************************send_expect_re*************************
|
||||||
|
# 1) send a command, and optionally specify a the time to wait
|
||||||
|
# 2) search for an expected pattern defined by a regular expression in the response
|
||||||
|
# 3) return a error if raise_err flag is set and re not found, otherwise return 'Ok'
|
||||||
|
# *****************************************************************
|
||||||
|
def send_expect_re(self, command, expect, sudo=False, raise_err=1, delay = 50, rsp1=None, rsp2=None,debug=0):
|
||||||
|
rsp = self.send_recv(command, sudo, delay, rsp1, rsp2)
|
||||||
|
# print rsp
|
||||||
|
match = re.compile(expect).search(rsp)
|
||||||
|
if match:
|
||||||
|
return match
|
||||||
|
if raise_err:
|
||||||
|
raise log.err(self.failed(command, expect,debug))
|
||||||
|
else :
|
||||||
|
return None
|
||||||
|
|
||||||
|
# **************************send_expect*************************
|
||||||
|
# 1) send a command, and optionally specify a the time to wait
|
||||||
|
# 2) search for an expected pattern defined by a re in the response
|
||||||
|
# 3) return ok if not found
|
||||||
|
# **************************************************************
|
||||||
|
def send_expect_false(self, command, expect, sudo=False, delay = 5, rsp1=None, rsp2=None,debug=0):
|
||||||
|
rsp = self.send_recv(command, sudo, delay, rsp1, rsp2)
|
||||||
|
# print rsp
|
||||||
|
if (rsp.find(expect) == -1):
|
||||||
|
return 'OK'
|
||||||
|
else:
|
||||||
|
print "command = " + command + "expect = " + expect + "rsp = " + rsp
|
||||||
|
raise log.err(self.failed(command, expect,debug))
|
||||||
|
|
||||||
|
|
||||||
|
# **************************send_wait*************************
|
||||||
|
# 1) send a command, and optionally specify a the time to wait
|
||||||
|
# 2) search for an expected pattern in the response
|
||||||
|
# 3) retry for a numretries if not found
|
||||||
|
# 4) return an error if not found after the numtries
|
||||||
|
# 3) return the response if found
|
||||||
|
# **************************************************************
|
||||||
|
def send_wait(self, command, expect, sudo=False, numretries=3, rsp1=None, rsp2=None,debug=0):
|
||||||
|
timer = 0
|
||||||
|
for i in range(numretries):
|
||||||
|
rsp = self.send_recv(command, sudo, 10, rsp1, rsp2)
|
||||||
|
if (rsp.find(expect) != -1):
|
||||||
|
return rsp;
|
||||||
|
time.sleep(2)
|
||||||
|
timer = timer+2
|
||||||
|
raise log.err(self.failed(command, expect,debug))
|
||||||
|
|
||||||
|
# **************************send_wait_re*************************
|
||||||
|
# 1) send a command, and optionally specify a the time to wait
|
||||||
|
# 2) search for an expected pattern defined by a re in the response
|
||||||
|
# 3) retry for a numretries if not found
|
||||||
|
# 4) return an error if not found after the numtries
|
||||||
|
# 3) return the response if found
|
||||||
|
# **************************************************************
|
||||||
|
def send_wait_re(self, command, expect, sudo=False, numretries=3, rsp1=None, rsp2=None,debug=0):
|
||||||
|
timer = 0
|
||||||
|
for i in range(numretries):
|
||||||
|
rsp = self.send_recv(command,sudo)
|
||||||
|
if re.compile(expect).search(rsp):
|
||||||
|
# print "Found in",i,"attempts"
|
||||||
|
return rsp;
|
||||||
|
time.sleep(2)
|
||||||
|
timer = timer+2
|
||||||
|
raise log.err(self.failed(command, expect,debug))
|
||||||
|
|
||||||
|
# **************************send_wait_false*************************
|
||||||
|
# 1) send a command, and optionally specify a the time to wait
|
||||||
|
# 2) search for an expect pattern in the response
|
||||||
|
# 3) return the response if not found
|
||||||
|
# 4) return an error if the pattern found after the numtries
|
||||||
|
# **************************************************************
|
||||||
|
def send_wait_false(self, command, expect, sudo=False, numretries=3, rsp1=None, rsp2=None,debug=0):
|
||||||
|
timer = 1
|
||||||
|
for i in range(numretries):
|
||||||
|
rsp = self.send_recv(command,sudo)
|
||||||
|
if (rsp.find(expect) == -1):
|
||||||
|
return rsp;
|
||||||
|
time.sleep(2)
|
||||||
|
timer = timer+2
|
||||||
|
raise log.err(self.failed(command, expect,debug))
|
||||||
|
|
||||||
|
# **************************send_wait_false*************************
|
||||||
|
# 1) send a command, and optionally specify a the time to wait
|
||||||
|
# 2) search for an expect pattern defined by a re in the response
|
||||||
|
# 3) return the response if not found
|
||||||
|
# 4) return an error if the pattern found after the numtries
|
||||||
|
# **************************************************************
|
||||||
|
def send_wait_false_re(self, command, expect, sudo=False, numretries=3, rsp1=None, rsp2=None,debug=0):
|
||||||
|
timer = 0
|
||||||
|
for i in range(numretries):
|
||||||
|
rsp = self.send_recv(command,sudo)
|
||||||
|
if not re.compile(expect).search(rsp):
|
||||||
|
return rsp;
|
||||||
|
time.sleep(2)
|
||||||
|
timer = timer+2
|
||||||
|
raise log.err(self.failed(command, expect,debug))
|
||||||
|
|
||||||
|
# **************************find*************************
|
||||||
|
# 1) find an exact pattern in a given string
|
||||||
|
# 2) raise an error if not found
|
||||||
|
# **************************************************************
|
||||||
|
def find(self, string, pattern):
|
||||||
|
word = string.replace(pattern,'*','\*')
|
||||||
|
words = string.replace(word,' ','\s*')
|
||||||
|
if re.search(words,string):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise log.err(string)
|
||||||
|
|
||||||
|
|
||||||
|
# **************************find_false**************************
|
||||||
|
# 1) find an exact pattern in a given string
|
||||||
|
# 2) raise an error if found
|
||||||
|
# **************************************************************
|
||||||
|
def find_false(self, string, pattern):
|
||||||
|
if string.find(pattern) != -1:
|
||||||
|
raise log.err(string)
|
||||||
|
|
||||||
|
# **************************find_re*************************
|
||||||
|
# 1) find an exact re pattern in a given string
|
||||||
|
# 2) raise an error if not found
|
||||||
|
# **************************************************************
|
||||||
|
def find_re(self, string, pattern):
|
||||||
|
if not re.compile(pattern).search(string):
|
||||||
|
raise log.err(string)
|
||||||
|
|
||||||
|
# **************************find_false_re*************************
|
||||||
|
# 1) find an exact re pattern in a given string
|
||||||
|
# 2) raise an error if found
|
||||||
|
# **************************************************************
|
||||||
|
def find_false_re(self, string, pattern):
|
||||||
|
if re.compile(pattern).search(string):
|
||||||
|
raise log.err(string)
|
||||||
|
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
#******************************************************************************
|
||||||
|
|
||||||
|
# Eurecom OpenAirInterface
|
||||||
|
# Copyright(c) 1999 - 2013 Eurecom
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms and conditions of the GNU General Public License,
|
||||||
|
# version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
# This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
# more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License along with
|
||||||
|
# this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
# The full GNU General Public License is included in this distribution in
|
||||||
|
# the file called "COPYING".
|
||||||
|
|
||||||
|
# Contact Information
|
||||||
|
# Openair Admin: openair_admin@eurecom.fr
|
||||||
|
# Openair Tech : openair_tech@eurecom.fr
|
||||||
|
# Forums : http://forums.eurecom.fsr/openairinterface
|
||||||
|
# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France
|
||||||
|
|
||||||
|
#*****************************************************************************
|
||||||
|
|
||||||
|
# \file log.py
|
||||||
|
# \brief provides primitives and defines how the logs and statistics are generated
|
||||||
|
# \author Navid Nikaein
|
||||||
|
# \date 2013
|
||||||
|
# \version 0.1
|
||||||
|
# @ingroup _test
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import time
|
||||||
|
import datetime
|
||||||
|
import array
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
|
||||||
|
debug = False
|
||||||
|
docfile = ''
|
||||||
|
start_time = time.time()
|
||||||
|
testcase_starttime = start_time
|
||||||
|
debug = 0
|
||||||
|
stats = {'passed':0, 'failed':0, 'skipped':0, 'internal_errors':0, 'cmd':0}
|
||||||
|
|
||||||
|
# xml result (jUnit like)
|
||||||
|
xUnitTestsuites = ET.Element( 'testsuites' )
|
||||||
|
xUnitTestsuite = ET.SubElement( xUnitTestsuites, 'testsuite' )
|
||||||
|
xUnitTestsuite.set( 'name', 'OAI' )
|
||||||
|
xUnitTestsuite.set( 'timestamp', datetime.datetime.fromtimestamp(start_time).strftime('%Y-%m-%dT%H:%M:%S') )
|
||||||
|
xUnitTestsuite.set( 'hostname', 'localhost' )
|
||||||
|
#xUnitSystemOut = ET.SubElement( xUnitTestsuite, 'system-out' )
|
||||||
|
|
||||||
|
class bcolors:
|
||||||
|
header = '\033[95m'
|
||||||
|
okblue = '\033[94m'
|
||||||
|
okgreen = '\033[92m'
|
||||||
|
warning = '\033[93m'
|
||||||
|
fail = '\033[91m'
|
||||||
|
normal = '\033[0m'
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
if not sys.stdout.isatty():
|
||||||
|
self.disable()
|
||||||
|
|
||||||
|
def disable(self):
|
||||||
|
self.header = ''
|
||||||
|
self.okblue = ''
|
||||||
|
self.okgreen = ''
|
||||||
|
self.warning = ''
|
||||||
|
self.fail = ''
|
||||||
|
self.normal = ''
|
||||||
|
|
||||||
|
class err(Exception):
|
||||||
|
def __init__(self, value):
|
||||||
|
self.value = value
|
||||||
|
def __str__(self):
|
||||||
|
return repr(self.value)
|
||||||
|
|
||||||
|
def writefile(logfile, message):
|
||||||
|
F_testlog = open(logfile, 'a')
|
||||||
|
F_testlog.write(message + '\n')
|
||||||
|
F_testlog.close()
|
||||||
|
|
||||||
|
|
||||||
|
def sleep(seconds):
|
||||||
|
time.sleep(seconds)
|
||||||
|
|
||||||
|
def start():
|
||||||
|
"""Start the timer for the following testcase."""
|
||||||
|
global testcase_starttime
|
||||||
|
testcase_starttime = time.time()
|
||||||
|
|
||||||
|
def set_debug_level(level):
|
||||||
|
debug = level
|
||||||
|
|
||||||
|
def statistics(logfile):
|
||||||
|
global start_time
|
||||||
|
|
||||||
|
#if stats['passed'] == 0:
|
||||||
|
# print "no test executed...exiting"
|
||||||
|
# sys.exit()
|
||||||
|
|
||||||
|
total_tests = stats['passed'] + stats['failed'] + stats['skipped']
|
||||||
|
total_ex_tests = stats['passed'] + stats['failed']
|
||||||
|
elapsed_time = time.gmtime(time.time() - start_time)
|
||||||
|
print '\n'
|
||||||
|
log_record('info', '===============================================')
|
||||||
|
log_record('info', 'Total tests performed ' + repr(total_tests))
|
||||||
|
log_record('info', 'Tests passed ' + repr(stats['passed']))
|
||||||
|
log_record('info', 'Tests failed ' + repr(stats['failed']))
|
||||||
|
log_record('info', 'Tests skipped ' + repr(stats['skipped']))
|
||||||
|
log_record('info', '')
|
||||||
|
log_record('info', 'Total commands sent ' + repr(stats['cmd']))
|
||||||
|
log_record('info', 'Total elapsed time (h:m:s) ' + time.strftime('%H:%M:%S', elapsed_time))
|
||||||
|
log_record('info', '===============================================')
|
||||||
|
log_record('info', 'Testing pass rate ' + repr((stats['passed'] * 100) / total_tests) + '%')
|
||||||
|
log_record('info', '===============================================')
|
||||||
|
|
||||||
|
writefile(logfile, '\n=====================Results===================')
|
||||||
|
writefile(logfile, 'Total tests performed ' + repr(total_tests))
|
||||||
|
writefile(logfile, 'Tests passed ' + repr(stats['passed']))
|
||||||
|
writefile(logfile, 'Tests failed ' + repr(stats['failed']))
|
||||||
|
writefile(logfile, 'Tests skipped ' + repr(stats['skipped']))
|
||||||
|
writefile(logfile, '')
|
||||||
|
writefile(logfile, 'Total commands sent ' + repr(stats['cmd']))
|
||||||
|
writefile(logfile, 'Total elapsed time (h:m:s) ' + time.strftime('%H:%M:%S', elapsed_time))
|
||||||
|
writefile(logfile, '===============================================')
|
||||||
|
writefile(logfile, 'Testing pass rate ' + repr((stats['passed'] * 100) / total_tests) + '%')
|
||||||
|
writefile(logfile, '===============================================\n')
|
||||||
|
|
||||||
|
xUnitTestsuite.set( 'tests', repr(total_tests) )
|
||||||
|
xUnitTestsuite.set( 'failures', repr(stats['failed']) )
|
||||||
|
xUnitTestsuite.set( 'skipped', repr(stats['skipped']) )
|
||||||
|
xUnitTestsuite.set( 'errors', '0' )
|
||||||
|
time_delta = datetime.datetime.now() - datetime.datetime.fromtimestamp(start_time)
|
||||||
|
xUnitTestsuite.set( 'time', repr(time_delta.total_seconds()) )
|
||||||
|
writefile( logfile + '.xml', ET.tostring( xUnitTestsuites, encoding="utf-8", method="xml" ) )
|
||||||
|
|
||||||
|
def log_record(level, message):
|
||||||
|
ts = time.strftime('%d %b %Y %H:%M')
|
||||||
|
message = ts + ' [' + level + '] ' + message
|
||||||
|
if level == 'passed' :
|
||||||
|
print bcolors.okgreen + message + bcolors.normal
|
||||||
|
elif level == 'failed' :
|
||||||
|
print bcolors.fail + message + bcolors.normal
|
||||||
|
elif level == 'skipped' :
|
||||||
|
print bcolors.warning + message + bcolors.normal
|
||||||
|
else :
|
||||||
|
print message
|
||||||
|
|
||||||
|
def fail(case, testnum, testname, conf, message, diag, output,trace):
|
||||||
|
# report(case, testnum, testname, conf, 'failed', output, diag, message)
|
||||||
|
report(case, testnum, testname, conf, 'failed', output, diag)
|
||||||
|
log_record('failed', case + testnum + ' : ' + testname + ' ('+ conf+')')
|
||||||
|
if message :
|
||||||
|
log_record('failed', "Output follows:\n" + message )
|
||||||
|
if trace :
|
||||||
|
log_record('failed', "trace file can be found in " + trace + "\n" )
|
||||||
|
stats['failed'] += 1
|
||||||
|
|
||||||
|
def failquiet(case, testnum, testname, conf):
|
||||||
|
log_record('failed', case + testnum + ' :' + testname + ' ('+ conf+')')
|
||||||
|
stats['failed'] += 1
|
||||||
|
|
||||||
|
def ok(case, testnum, testname, conf, message, output):
|
||||||
|
report(case, testnum, testname, conf, 'passed', output)
|
||||||
|
log_record('passed', case + testnum + ' : ' + testname + ' ('+ conf+')')
|
||||||
|
if message :
|
||||||
|
print bcolors.okgreen + message + bcolors.normal
|
||||||
|
stats['passed'] += 1
|
||||||
|
|
||||||
|
|
||||||
|
def skip(case, testnum, testname, conf, message=None, diag=None, output=None):
|
||||||
|
log_record('skipped', case + testnum + ' :' + testname + ' ('+ conf+')')
|
||||||
|
report(case, testnum, testname, conf, 'skipped', output, diag)
|
||||||
|
if message :
|
||||||
|
log_record('skipped', "Output follows:\n" + message )
|
||||||
|
if diag :
|
||||||
|
log_record('skipped', "Diagnostic: \n" + diag )
|
||||||
|
stats['skipped'] += 1
|
||||||
|
|
||||||
|
|
||||||
|
def report(case, test, name, conf, status, output, diag=None, desc=None):
|
||||||
|
writefile (output, '[' +status+ '] ' + case + test + ' : ' + name + ' ('+ conf+')')
|
||||||
|
if diag :
|
||||||
|
writefile (output, '-------> ' + diag)
|
||||||
|
if desc:
|
||||||
|
writefile(output, desc)
|
||||||
|
#log_record('report', + case + test + ' documented')
|
||||||
|
e = ET.SubElement( xUnitTestsuite, 'testcase' )
|
||||||
|
e.set( 'name', case + '_' + test + '_' + name )
|
||||||
|
e.set( 'classname', 'shellscript' )
|
||||||
|
e.set( 'time', repr( time.time() - testcase_starttime ) )
|
||||||
|
if status == 'failed':
|
||||||
|
e = ET.SubElement( e, 'failure' )
|
||||||
|
e.set( 'message', 'failed' )
|
||||||
|
e.text = diag
|
||||||
|
if status == 'skipped':
|
||||||
|
e = ET.SubElement( e, 'skipped' )
|
||||||
@@ -0,0 +1,272 @@
|
|||||||
|
#******************************************************************************
|
||||||
|
|
||||||
|
# Eurecom OpenAirInterface
|
||||||
|
# Copyright(c) 1999 - 2013 Eurecom
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms and conditions of the GNU General Public License,
|
||||||
|
# version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
# This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
# more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License along with
|
||||||
|
# this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
# The full GNU General Public License is included in this distribution in
|
||||||
|
# the file called "COPYING".
|
||||||
|
|
||||||
|
# Contact Information
|
||||||
|
# Openair Admin: openair_admin@eurecom.fr
|
||||||
|
# Openair Tech : openair_tech@eurecom.fr
|
||||||
|
# Forums : http://forums.eurecom.fsr/openairinterface
|
||||||
|
# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France
|
||||||
|
|
||||||
|
#*****************************************************************************
|
||||||
|
|
||||||
|
# \file openair.py
|
||||||
|
# \brief class that define the oaisim class and its attributes
|
||||||
|
# \author Navid Nikaein
|
||||||
|
# \date 2013
|
||||||
|
# \version 0.1
|
||||||
|
# @ingroup _test
|
||||||
|
|
||||||
|
import pexpect
|
||||||
|
import pxssh
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
import array
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
import time
|
||||||
|
# import call
|
||||||
|
|
||||||
|
from core import *
|
||||||
|
|
||||||
|
SHELL = '/bin/bash'
|
||||||
|
|
||||||
|
class openair(core):
|
||||||
|
def __init__(self, hostname, address):
|
||||||
|
self.error = '% '
|
||||||
|
self.hostname = hostname
|
||||||
|
self.address = address
|
||||||
|
self.localhost = None
|
||||||
|
core.__init__(self)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def localhost(self):
|
||||||
|
if self.localhost :
|
||||||
|
return self.localhost
|
||||||
|
elif self.hostname in ['localhost', '127.0.0.7', '::1'] :
|
||||||
|
self.localhost = self.hostname
|
||||||
|
return self.localhost
|
||||||
|
|
||||||
|
@localhost.setter
|
||||||
|
def localhost(self,localhost):
|
||||||
|
self.localhost = localhost
|
||||||
|
|
||||||
|
def shcmd(self,cmd,sudo=False):
|
||||||
|
|
||||||
|
if sudo:
|
||||||
|
cmd = "sudo %s" % command
|
||||||
|
|
||||||
|
proc = subprocess.Popen(command, shell=True,
|
||||||
|
stdout = subprocess.PIPE,
|
||||||
|
stderr = subprocess.PIPE)
|
||||||
|
|
||||||
|
stdout, stderr = proc.communicate()
|
||||||
|
return (stdout, stderr)
|
||||||
|
|
||||||
|
def connect(self, username, password, prompt='PEXPECT_OAI'):
|
||||||
|
max_retries=100
|
||||||
|
i=0
|
||||||
|
while i <= max_retries:
|
||||||
|
self.prompt1 = prompt
|
||||||
|
self.prompt2 = prompt
|
||||||
|
self.password = ''
|
||||||
|
i=i+1
|
||||||
|
# WE do not store the password when sending commands for secuirity reasons. The password might be accidentally logged in such cases.
|
||||||
|
#The password is used only to make ssh connections. In case user wants to run programs with sudo, then he/she needs to add following line in /etc/sudoers
|
||||||
|
# your_user_name ALL=(ALL:ALL) NOPASSWD: ALL
|
||||||
|
try:
|
||||||
|
if not username:
|
||||||
|
username = root
|
||||||
|
if not password:
|
||||||
|
password = username
|
||||||
|
self.oai = pxssh.pxssh()
|
||||||
|
self.oai.login(self.address,username,password)
|
||||||
|
self.oai.sendline('PS1='+self.prompt1)
|
||||||
|
self.oai.PROMPT='PEXPECT_OAI'
|
||||||
|
# need to look for twice the string of the prompt
|
||||||
|
self.oai.prompt()
|
||||||
|
self.oai.prompt()
|
||||||
|
self.oai.sendline('uptime')
|
||||||
|
self.oai.prompt()
|
||||||
|
print self.oai.before
|
||||||
|
break
|
||||||
|
except Exception, e:
|
||||||
|
error=''
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + 'address = "'+ self.address +' username = ' + username
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
print "Retrying again in 1 seconds"
|
||||||
|
time.sleep(1)
|
||||||
|
if i==max_retries:
|
||||||
|
print "Fatal Error: Terminating the program now..."
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def connect2(self, username, password, prompt='$'):
|
||||||
|
self.prompt1 = prompt
|
||||||
|
self.prompt2 = prompt
|
||||||
|
self.password = password
|
||||||
|
while 1:
|
||||||
|
try:
|
||||||
|
if not username:
|
||||||
|
username = root
|
||||||
|
if not password:
|
||||||
|
password = username
|
||||||
|
|
||||||
|
self.oai = pexpect.spawn('ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "ConnectionAttempts=1" ' \
|
||||||
|
+ username + '@' + self.address)
|
||||||
|
|
||||||
|
index = self.oai.expect([re.escape(self.prompt1), re.escape(self.prompt2), pexpect.TIMEOUT], timeout=40)
|
||||||
|
if index == 0 :
|
||||||
|
return 'Ok'
|
||||||
|
else :
|
||||||
|
index = self.oai.expect(['password:', pexpect.TIMEOUT], timeout=40)
|
||||||
|
if index == 0 :
|
||||||
|
self.oai.sendline(password)
|
||||||
|
index = self.oai.expect([re.escape(self.prompt1), re.escape(self.prompt2), pexpect.TIMEOUT], timeout=10)
|
||||||
|
if index != 0:
|
||||||
|
print 'ERROR! could not login with SSH.'
|
||||||
|
print 'Expected ' + self.prompt1 + ', received >>>>' + self.oai.before + '<<<<'
|
||||||
|
sys.exit(1)
|
||||||
|
return 'Ok'
|
||||||
|
|
||||||
|
except Exception, e:
|
||||||
|
error=''
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def connect_localshell(self, prompt='$'):
|
||||||
|
self.prompt1 = prompt
|
||||||
|
self.prompt2 = prompt
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
try:
|
||||||
|
# start a shell and use the current environment
|
||||||
|
self.oai = pexpect.spawn('bash --norc --noprofile')
|
||||||
|
|
||||||
|
index = self.oai.expect([re.escape(self.prompt1), re.escape(self.prompt2), pexpect.TIMEOUT], timeout=40)
|
||||||
|
if index == 0 :
|
||||||
|
return 'Ok'
|
||||||
|
else :
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
except Exception, e:
|
||||||
|
error=''
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def disconnect(self):
|
||||||
|
print 'disconnecting the ssh connection to ' + self.address + '\n'
|
||||||
|
self.oai.send('exit')
|
||||||
|
# self.cancel()
|
||||||
|
|
||||||
|
def kill(self, user, pw):
|
||||||
|
try:
|
||||||
|
if user == 'root' :
|
||||||
|
os.system('pkill oaisim oaisim_nos1')
|
||||||
|
os.system('pkill cc1')
|
||||||
|
time.sleep(1)
|
||||||
|
os.system('pkill oaisim oaisim_nos1')
|
||||||
|
else :
|
||||||
|
os.system('echo '+pw+' | sudo -S pkill oaisim oaisim_nos1')
|
||||||
|
os.system('echo '+pw+' | sudo -S pkill cc1')
|
||||||
|
time.sleep(1)
|
||||||
|
os.system('echo '+pw+' | sudo -S pkill oaisim oaisim_nos1')
|
||||||
|
except Exception, e:
|
||||||
|
error=''
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
#sys.exit(1)
|
||||||
|
|
||||||
|
def rm_driver(self,oai,user, pw):
|
||||||
|
try:
|
||||||
|
if user == 'root' :
|
||||||
|
#oai.send_nowait('rmmod nasmesh;')
|
||||||
|
os.system('rmmod nasmesh;')
|
||||||
|
else :
|
||||||
|
oai.send_nowait('echo '+pw+ ' | sudo -S rmmod nasmesh;')
|
||||||
|
#os.system('echo '+pw+ ' | sudo -S rmmod nasmesh;')
|
||||||
|
except Exception, e:
|
||||||
|
error=''
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
#sys.exit(1)
|
||||||
|
|
||||||
|
def driver(self,oai,user,pw):
|
||||||
|
#pwd = oai.send_recv('pwd')
|
||||||
|
oai.send('cd $OPENAIR_TARGETS;')
|
||||||
|
oai.send('cd SIMU/USER;')
|
||||||
|
try:
|
||||||
|
if user == 'root' :
|
||||||
|
oai.send_nowait('insmod ./nasmesh.ko;')
|
||||||
|
else :
|
||||||
|
oai.send('echo '+pw+ ' | sudo -S insmod ./nasmesh.ko;')
|
||||||
|
|
||||||
|
except Exception, e:
|
||||||
|
error=''
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
#sys.exit(1)
|
||||||
|
|
||||||
|
def cleandir (self, logdir,debug) :
|
||||||
|
|
||||||
|
for filename in os.listdir(logdir):
|
||||||
|
filepath = os.path.join(logdir, filename)
|
||||||
|
if debug == 2 :
|
||||||
|
print 'logdir is ' + logdir
|
||||||
|
print 'filepath is ' + filepath
|
||||||
|
try:
|
||||||
|
shutil.rmtree(filepath)
|
||||||
|
except Exception, e:
|
||||||
|
error=''
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
#sys.exit(1)
|
||||||
|
#print 'Could not remove the filepath'+ filepath + ' with error ' + OSError
|
||||||
|
|
||||||
|
def create_dir(self,dirname,debug) :
|
||||||
|
if not os.path.exists(dirname) :
|
||||||
|
try:
|
||||||
|
os.makedirs(dirname,0755)
|
||||||
|
except OSError:
|
||||||
|
# There was an error on creation, so make sure we know about it
|
||||||
|
raise
|
||||||
|
def cpu_freq(self):
|
||||||
|
freq=0
|
||||||
|
proc = subprocess.Popen(["cat","/proc/cpuinfo"],
|
||||||
|
stdout=subprocess.PIPE)
|
||||||
|
out, err = proc.communicate()
|
||||||
|
|
||||||
|
for line in out.split("\n"):
|
||||||
|
if "cpu MHz" in line:
|
||||||
|
freq = float(line.split(":")[1])
|
||||||
|
break
|
||||||
|
|
||||||
|
return freq
|
||||||
@@ -7,12 +7,15 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
source $OPENAIR_DIR/cmake_targets/tools/test_helper
|
source $OPENAIR_DIR/cmake_targets/tools/test_helper
|
||||||
|
|
||||||
#SUDO="sudo -E "
|
|
||||||
|
SUDO="sudo -E -S"
|
||||||
tdir=$OPENAIR_DIR/cmake_targets/autotests
|
tdir=$OPENAIR_DIR/cmake_targets/autotests
|
||||||
rm -fr $tdir/bin $tdir/log
|
rm -fr $tdir/bin
|
||||||
mkdir -p $tdir/bin $tdir/log
|
mkdir -p $tdir/bin
|
||||||
results_file="$tdir/log/results_autotests.xml"
|
results_file="$tdir/log/results_autotests.xml"
|
||||||
|
|
||||||
updated=$(svn st -q $OPENAIR_DIR)
|
updated=$(svn st -q $OPENAIR_DIR)
|
||||||
@@ -36,12 +39,12 @@ cd $tdir
|
|||||||
#\param $12 -> class of the test case (compilation, execution)
|
#\param $12 -> class of the test case (compilation, execution)
|
||||||
#\param $13 -> output of compilation program that needs to be found for test case to pass
|
#\param $13 -> output of compilation program that needs to be found for test case to pass
|
||||||
#\param $14 -> tags to help identify the test case for readability in output xml file
|
#\param $14 -> tags to help identify the test case for readability in output xml file
|
||||||
test_compile() {
|
function test_compile() {
|
||||||
|
|
||||||
xUnit_start
|
xUnit_start
|
||||||
test_case_name=$1
|
test_case_name=$1
|
||||||
log_dir=$tdir/log
|
log_dir=$tdir/log/$test_case_name
|
||||||
log_file=$tdir/log/test.$1.txt
|
log_file=$log_dir/test.$1.log.txt
|
||||||
compile_prog=$2
|
compile_prog=$2
|
||||||
compile_args=$3
|
compile_args=$3
|
||||||
pre_exec_file=$4
|
pre_exec_file=$4
|
||||||
@@ -54,11 +57,18 @@ test_compile() {
|
|||||||
class=${12}
|
class=${12}
|
||||||
compile_prog_out=${13}
|
compile_prog_out=${13}
|
||||||
tags=${14}
|
tags=${14}
|
||||||
build_dir=$tdir/$1/build
|
xmlfile_testcase=$log_dir/test.$1.xml
|
||||||
exec_file=$build_dir/$6
|
#build_dir=$tdir/$1/build
|
||||||
|
#exec_file=$build_dir/$6
|
||||||
|
|
||||||
|
#compile_prog_out=`eval "echo $compile_prog_out"`
|
||||||
|
#echo "compile_prog_out = $compile_prog_out"
|
||||||
|
read -a compile_prog_out_array <<< "$compile_prog_out"
|
||||||
|
|
||||||
#Temporary log file where execution log is stored.
|
#Temporary log file where execution log is stored.
|
||||||
temp_exec_log=$log_dir/temp_log.txt
|
temp_exec_log=$log_dir/temp_log.txt
|
||||||
|
rm -fr $log_dir
|
||||||
|
mkdir -p $log_dir
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -74,44 +84,78 @@ test_compile() {
|
|||||||
compile_prog_array=()
|
compile_prog_array=()
|
||||||
read -a compile_prog_array <<<"$compile_prog"
|
read -a compile_prog_array <<<"$compile_prog"
|
||||||
|
|
||||||
tags_array=()
|
#tags_array=()
|
||||||
read -a tags_array <<<"$tags"
|
#read -a tags_array <<<"$tags"
|
||||||
|
|
||||||
pre_compile_prog_array=()
|
#pre_compile_prog_array=()
|
||||||
readarray -t pre_compile_prog_array <<< "$pre_compile_prog"
|
#readarray -t pre_compile_prog_array <<< "$pre_compile_prog"
|
||||||
|
result=1
|
||||||
|
result_string=""
|
||||||
for (( run_index=1; run_index <= $nruns; run_index++ ))
|
for (( run_index=1; run_index <= $nruns; run_index++ ))
|
||||||
do
|
do
|
||||||
tags_array_index=0
|
|
||||||
for pre_compile_prog_array_index in "${pre_compile_prog_array[@]}"
|
#tags_array_index=0
|
||||||
do
|
#for pre_compile_prog_array_index in "${pre_compile_prog_array[@]}"
|
||||||
|
#do
|
||||||
|
|
||||||
for compile_prog_array_index in "${compile_prog_array[@]}"
|
#for compile_prog_array_index in "${compile_prog_array[@]}"
|
||||||
do
|
#do
|
||||||
echo "Compiling test case $test_case_name.$compile_prog_array_index.${tags_array[$tags_array_index]} Log file = $log_file"
|
echo "Compiling test case $test_case_name.${tags} Log file = $log_file"
|
||||||
echo "<COMPILATION LOG file=$compile_prog_array_index , Run = $run_index>" >> $log_file
|
date=`date`
|
||||||
rm -fr $build_dir
|
echo "<COMPILATION LOG file=$test_case_name.${tags} , Run = $run_index>, Date = $date " >> $log_file
|
||||||
mkdir -p $build_dir
|
#rm -fr $build_dir
|
||||||
cd $build_dir
|
#mkdir -p $build_dir
|
||||||
|
cd $log_dir
|
||||||
{
|
{
|
||||||
eval $pre_compile_prog_array_index
|
uname -a
|
||||||
cmake ..
|
compile_log_dir=`eval echo \"$OPENAIR_DIR/cmake_targets/log/\"`
|
||||||
#rm -fv $exec_file
|
echo "Removing compilation log files in $compile_log_dir"
|
||||||
make -j`nproc` $compile_prog_array_index $compile_args
|
rm -frv $compile_log_dir
|
||||||
|
echo "Executing $compile_prog $compile_prog_args ...."
|
||||||
|
eval $compile_prog $compile_prog_args
|
||||||
|
echo "Copying compilation log files to test case log directory: $log_dir"
|
||||||
|
cp -fvr $OPENAIR_DIR/cmake_targets/log/ $log_dir/compile_log
|
||||||
}>> $log_file 2>&1
|
}>> $log_file 2>&1
|
||||||
echo "</COMPILATION LOG>" >> $log_file 2>&1
|
echo "</COMPILATION LOG>" >> $log_file 2>&1
|
||||||
if [ "$class" == "compilation" ]; then
|
if [ "$class" == "compilation" ]; then
|
||||||
if [ -s "$compile_prog_array_index" ] || [ -s "$compile_prog_out" ] ; then
|
for compile_prog_out_index in ${compile_prog_out_array[@]}
|
||||||
echo_success "$test_case_name.$compile_prog_array_index.${tags_array[$tags_array_index]} compiled"
|
do
|
||||||
xUnit_success "compilation" "$test_case_name.$compile_prog_array_index.${tags_array[$tags_array_index]}" "PASS" "$run_index"
|
if [ -s "$compile_prog_out_index" ]; then
|
||||||
else
|
let "result = result&1"
|
||||||
echo_error "$test_case_name.$exec_prog.${tags_array[$tags_array_index]} compilation failed"
|
|
||||||
xUnit_fail "compilation" "$test_case_name.$compile_prog_array_index.${tags_array[$tags_array_index]}" "FAIL" "$run_index"
|
echo_success "$test_case_name.${tags} RUN = $run_index $compile_prog_out_index = compiled"
|
||||||
|
|
||||||
|
else
|
||||||
|
let "result = result&0"
|
||||||
|
|
||||||
|
echo_error "$test_case_name.${tags} RUN = $run_index $compile_prog_out_index failed"
|
||||||
|
|
||||||
|
fi
|
||||||
|
done #end of for loop compile_prog_out_index
|
||||||
|
if [ "$result" == "1" ]; then
|
||||||
|
result_string=$result_string" Run_$run_index = PASS"
|
||||||
|
else
|
||||||
|
result_string=$result_string" Run_$run_index = FAIL"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
let "tags_array_index++"
|
#let "tags_array_index++"
|
||||||
done # End of for loop compile_prog_array
|
#done # End of for loop compile_prog_array
|
||||||
done # End of for loop (pre_compile_prog_array_index)
|
#done # End of for loop (pre_compile_prog_array_index)
|
||||||
done #End of for loop (run_index)
|
done #End of for loop (run_index)
|
||||||
|
|
||||||
|
|
||||||
|
#If for for some reason upper for loop does not execute, we fail the test case completely
|
||||||
|
if [ "$result_string" == "" ]; then
|
||||||
|
result=0
|
||||||
|
fi
|
||||||
|
if [ "$result" == "1" ]; then
|
||||||
|
echo_success "$test_case_name.${tags} PASSED"
|
||||||
|
xUnit_success "compilation" "$test_case_name.$tags" "PASS" "$result_string" "$xmlfile_testcase"
|
||||||
|
else
|
||||||
|
echo_error "$test_case_name.${tags} FAILED"
|
||||||
|
xUnit_fail "compilation" "$test_case_name.$tags" "FAIL" "$result_string" "$xmlfile_testcase"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -130,12 +174,14 @@ test_compile() {
|
|||||||
#\param $12 -> class of the test case (compilation, execution)
|
#\param $12 -> class of the test case (compilation, execution)
|
||||||
#\param $13 -> output of compilation program that needs to be found for test case to pass
|
#\param $13 -> output of compilation program that needs to be found for test case to pass
|
||||||
#\param $14 -> tags to help identify the test case for readability in output xml file
|
#\param $14 -> tags to help identify the test case for readability in output xml file
|
||||||
|
#\param $15 => password for the user to run certain commands as sudo
|
||||||
|
#\param $16 => test config file params to be modified
|
||||||
|
|
||||||
test_compile_and_run() {
|
function test_compile_and_run() {
|
||||||
xUnit_start
|
xUnit_start
|
||||||
test_case_name=$1
|
test_case_name=$1
|
||||||
log_dir=$tdir/log
|
log_dir=$tdir/log/$test_case_name
|
||||||
log_file=$tdir/log/test.$1.txt
|
log_file=$log_dir/test.$1.log.txt
|
||||||
compile_prog=$2
|
compile_prog=$2
|
||||||
compile_args=$3
|
compile_args=$3
|
||||||
pre_exec_file=$4
|
pre_exec_file=$4
|
||||||
@@ -149,16 +195,22 @@ test_compile_and_run() {
|
|||||||
class=${12}
|
class=${12}
|
||||||
compile_prog_out=${13}
|
compile_prog_out=${13}
|
||||||
tags=${14}
|
tags=${14}
|
||||||
|
mypassword=${15}
|
||||||
|
test_config_file=${16}
|
||||||
|
|
||||||
build_dir=$tdir/$1/build
|
build_dir=$tdir/$1/build
|
||||||
exec_file=$build_dir/$6
|
#exec_file=$build_dir/$6
|
||||||
|
xmlfile_testcase=$log_dir/test.$1.xml
|
||||||
#Temporary log file where execution log is stored.
|
#Temporary log file where execution log is stored.
|
||||||
temp_exec_log=$log_dir/temp_log.txt
|
temp_exec_log=$log_dir/temp_log.txt
|
||||||
|
export OPENAIR_LOGDIR=$log_dir
|
||||||
|
rm -fr $log_dir
|
||||||
|
mkdir -p $log_dir
|
||||||
|
|
||||||
|
rm -fr $OPENAIR_DIR/cmake_targets/log
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
echo "" > $temp_exec_log
|
||||||
|
echo "" > $log_file
|
||||||
#echo "log_dir = $log_dir"
|
#echo "log_dir = $log_dir"
|
||||||
#echo "log_file = $log_file"
|
#echo "log_file = $log_file"
|
||||||
#echo "exec_file = $exec_file"
|
#echo "exec_file = $exec_file"
|
||||||
@@ -168,63 +220,76 @@ test_compile_and_run() {
|
|||||||
#echo "nruns = $nruns"
|
#echo "nruns = $nruns"
|
||||||
echo "class = $class"
|
echo "class = $class"
|
||||||
|
|
||||||
compile_prog_array=()
|
#compile_prog_array=()
|
||||||
read -a compile_prog_array <<<"$compile_prog"
|
#read -a compile_prog_array <<<"$compile_prog"
|
||||||
|
|
||||||
|
#test_config_file=`eval "echo \"$test_config_file\" "`
|
||||||
|
|
||||||
|
#echo "test_config_file = $test_config_file"
|
||||||
|
|
||||||
tags_array=()
|
tags_array=()
|
||||||
read -a tags_array <<<"$tags"
|
read -a tags_array <<<"$tags"
|
||||||
|
|
||||||
main_exec_args_array=()
|
main_exec_args_array=()
|
||||||
readarray -t main_exec_args_array <<< "$exec_args"
|
readarray -t main_exec_args_array <<< "$exec_args"
|
||||||
|
|
||||||
|
|
||||||
|
#for search_expr in "${compile_prog_array[@]}"
|
||||||
|
#do
|
||||||
|
echo "Compiling test case $test_case_name Log file = $log_file"
|
||||||
|
echo "<COMPILATION LOG file=$log_file>" >> $log_file
|
||||||
|
|
||||||
for search_expr in "${compile_prog_array[@]}"
|
#rm -fr $build_dir
|
||||||
do
|
#mkdir -p $build_dir
|
||||||
echo "Compiling test case $test_case_name.$search_expr Log file = $log_file"
|
|
||||||
echo "<COMPILATION LOG file=$search_expr>" >> $log_file
|
|
||||||
|
|
||||||
rm -fr $build_dir
|
cd $log_dir
|
||||||
mkdir -p $build_dir
|
|
||||||
|
|
||||||
cd $build_dir
|
|
||||||
{
|
{
|
||||||
|
uname -a
|
||||||
|
echo "Executing $pre_compile_prog"
|
||||||
eval $pre_compile_prog
|
eval $pre_compile_prog
|
||||||
cmake ..
|
|
||||||
#rm -fv $exec_file
|
if [ "$test_config_file" != "" ]; then
|
||||||
make -j`nproc` $search_expr $compile_args
|
echo "Modifying test_config_file parameters..."
|
||||||
|
echo "$test_config_file" |xargs -L 1 $OPENAIR_DIR/cmake_targets/autotests/tools/search_repl.py
|
||||||
|
fi
|
||||||
|
echo "Executing $compile_prog $compile_args"
|
||||||
|
eval "$compile_prog $compile_args"
|
||||||
|
echo "Copying compilation log files to test case log directory: $log_dir"
|
||||||
|
cp -fvr $OPENAIR_DIR/cmake_targets/log/ $log_dir/compile_log
|
||||||
}>> $log_file 2>&1
|
}>> $log_file 2>&1
|
||||||
echo "</COMPILATION LOG>" >> $log_file 2>&1
|
echo "</COMPILATION LOG>" >> $log_file 2>&1
|
||||||
if [ "$class" == "compilation" ]; then
|
#done
|
||||||
if [ -s "$search_expr" ] ; then
|
|
||||||
echo_success "$test_case_name $search_expr compiled"
|
|
||||||
xUnit_success "compilation" "$test_name.$search_expr" "PASS" 1
|
|
||||||
else
|
|
||||||
echo_error "$test_case_name $exec_prog compilation failed"
|
|
||||||
xUnit_fail "compilation" "$test_name.$search_expr" "FAIL" 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
#process the test case if it is that of execution
|
#process the test case if it is that of execution
|
||||||
if [ "$class" == "execution" ]; then
|
if [ "$class" == "execution" ]; then
|
||||||
tags_array_index=0
|
tags_array_index=0
|
||||||
for main_exec_args_array_index in "${main_exec_args_array[@]}"
|
for main_exec_args_array_index in "${main_exec_args_array[@]}"
|
||||||
do
|
do
|
||||||
for (( run_index=1; run_index <= $nruns; run_index++ ))
|
global_result=1
|
||||||
|
result_string=""
|
||||||
|
|
||||||
|
for (( run_index=1; run_index <= $nruns; run_index++ ))
|
||||||
do
|
do
|
||||||
echo "Executing test case $test_case_name.$main_exec.${tags_array[$tags_array_index]}, Run Index = $run_index, Log file = $log_file"
|
temp_exec_log=$log_dir/test.$test_case_name.${tags_array[$tags_array_index]}.run_$run_index
|
||||||
|
echo "" > $temp_exec_log
|
||||||
|
|
||||||
echo "-----------------------------------------------------------------------------" >> $log_file 2>&1
|
echo "Executing test case $test_case_name.${tags_array[$tags_array_index]}, Run Index = $run_index, Execution Log file = $temp_exec_log"
|
||||||
echo "<EXECUTION LOG Run = $run_index >" >> $log_file 2>&1
|
|
||||||
|
echo "-----------------------------------------------------------------------------" >> $temp_exec_log 2>&1
|
||||||
|
echo "<EXECUTION LOG Test Case = $test_case_name.${tags_array[$tags_array_index]}, Run = $run_index >" >> $temp_exec_log 2>&1
|
||||||
|
|
||||||
if [ -n "$pre_exec_file" ]; then
|
if [ -n "$pre_exec_file" ]; then
|
||||||
{ eval "source $pre_exec_file $pre_exec_args"; } >> $log_file 2>&1
|
{ echo " Executing $pre_exec_file $pre_exec_args "
|
||||||
fi
|
eval " echo '$mypassword' |sudo -S -E $pre_exec_file $pre_exec_args " ; }>> $temp_exec_log 2>&1
|
||||||
echo "Executing $exec_file $main_exec_args_array_index "
|
|
||||||
echo "Executing $exec_file $main_exec_args_array_index " >> $log_file
|
|
||||||
{ eval "$exec_file $main_exec_args_array_index" ;} > $temp_exec_log 2>&1
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
echo "Executing $main_exec $main_exec_args_array_index "
|
||||||
|
echo "Executing $main_exec $main_exec_args_array_index " >> $temp_exec_log
|
||||||
|
{ uname -a ; eval "$main_exec $main_exec_args_array_index" ;} >> $temp_exec_log 2>&1
|
||||||
|
|
||||||
|
echo "</EXECUTION LOG Test Case = $test_case_name.${tags_array[$tags_array_index]}, Run = $run_index >" >> $temp_exec_log 2>&1
|
||||||
cat $temp_exec_log >> $log_file 2>&1
|
cat $temp_exec_log >> $log_file 2>&1
|
||||||
echo "</EXECUTION LOG Test Case = $test_case_name.$main_exec.${tags_array[$tags_array_index]}, Run = $run_index >" >> $log_file 2>&1
|
|
||||||
|
|
||||||
result=1
|
result=1
|
||||||
for search_expr in "${search_expr_array[@]}"
|
for search_expr in "${search_expr_array[@]}"
|
||||||
@@ -241,68 +306,59 @@ test_compile_and_run() {
|
|||||||
let "result = result & 1"
|
let "result = result & 1"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
#If we find a negative search result then there is crash of program and test case is failed even if above condition is true
|
||||||
|
search_result=`grep -iE "$search_expr_negative" $temp_exec_log`
|
||||||
|
if [ -n "$search_result" ]; then
|
||||||
|
result=0
|
||||||
|
fi
|
||||||
|
let "global_result = global_result & result"
|
||||||
|
|
||||||
#echo "result = $result"
|
#echo "result = $result"
|
||||||
|
|
||||||
test_case_result=""
|
#this is a result of this run
|
||||||
|
#test_case_result=""
|
||||||
if [ "$result" -eq "0" ]; then
|
if [ "$result" -eq "0" ]; then
|
||||||
test_case_result="FAIL"
|
result_string=$result_string" Run_$run_index =FAIL"
|
||||||
|
echo_error "$test_case_name.${tags_array[$tags_array_index]} RUN = $run_index Result = FAIL"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$result" -eq "1" ]; then
|
if [ "$result" -eq "1" ]; then
|
||||||
test_case_result="PASS"
|
result_string=$result_string" Run_$run_index =PASS"
|
||||||
|
echo_success "$test_case_name.${tags_array[$tags_array_index]} RUN = $run_index Result = PASS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#If we find a negative search result then there is crash of program and test case is failed even if above condition is true
|
|
||||||
|
|
||||||
search_result=`grep -iE "$search_expr_negative" $temp_exec_log`
|
|
||||||
if [ -n "$search_result" ]; then
|
|
||||||
test_case_result="FAIL"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$test_case_result" == "FAIL" ]; then
|
|
||||||
echo_error "execution $test_case_name.$compile_prog.${tags_array[$tags_array_index]} FAIL $run_index"
|
|
||||||
xUnit_fail "execution" "$test_case_name.$compile_prog.${tags_array[$tags_array_index]}" "FAIL" "$run_index"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$test_case_result" == "PASS" ]; then
|
|
||||||
echo_success "execution $test_case_name.$compile_prog.${tags_array[$tags_array_index]} PASS $run_index"
|
|
||||||
xUnit_success "execution" "$test_case_name.$compile_prog.${tags_array[$tags_array_index]}" "PASS" "$run_index"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
done
|
done #End of for loop (nindex)
|
||||||
|
|
||||||
|
echo " Result String = $result_string"
|
||||||
|
|
||||||
|
if [ "$result_string" == "" ]; then
|
||||||
|
echo_error "execution $test_case_name.$compile_prog.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = FAIL"
|
||||||
|
xUnit_fail "execution" "$test_case_name.${tags_array[$tags_array_index]}" "FAIL" "$result_string" "$xmlfile_testcase"
|
||||||
|
else
|
||||||
|
if [ "$global_result" == "0" ]; then
|
||||||
|
echo_error "execution $test_case_name.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = FAIL"
|
||||||
|
xUnit_fail "execution" "$test_case_name.${tags_array[$tags_array_index]}" "FAIL" "$result_string" "$xmlfile_testcase"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$global_result" == "1" ]; then
|
||||||
|
echo_success "execution $test_case_name.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = PASS "
|
||||||
|
xUnit_success "execution" "$test_case_name.${tags_array[$tags_array_index]}" "PASS" "$result_string" "$xmlfile_testcase"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
let "tags_array_index++"
|
let "tags_array_index++"
|
||||||
done # End of for loop (nindex)
|
done
|
||||||
fi
|
fi
|
||||||
|
rm -fr $build_dir
|
||||||
}
|
}
|
||||||
|
|
||||||
dbin=$OPENAIR_DIR/cmake_targets/autotests/bin
|
dbin=$OPENAIR_DIR/cmake_targets/autotests/bin
|
||||||
dlog=$OPENAIR_DIR/cmake_targets/autotests/log
|
dlog=$OPENAIR_DIR/cmake_targets/autotests/log
|
||||||
|
|
||||||
run_test() {
|
|
||||||
case=case$1; shift
|
|
||||||
cmd=$1; shift
|
|
||||||
expected=$3; shift
|
|
||||||
echo "expected = $expected"
|
|
||||||
exit
|
|
||||||
|
|
||||||
$cmd > $dlog/$case.txt 2>&1
|
function print_help() {
|
||||||
if [ $expected = "true" ] ; then
|
|
||||||
if $* $dlog/$case.txt; then
|
|
||||||
echo_success "test $case, command: $cmd ok"
|
|
||||||
else
|
|
||||||
echo_error "test $case, command: $cmd Failed"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if $* $dlog/$case.txt; then
|
|
||||||
echo_error "test $case, command: $cmd Failed"
|
|
||||||
else
|
|
||||||
echo_success "test $case, command: $cmd ok"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
print_help() {
|
|
||||||
echo_info '
|
echo_info '
|
||||||
This program runs automated test case system for OpenAirInterface
|
This program runs automated test case system for OpenAirInterface
|
||||||
You should have ubuntu 14.xx, updated, and the Linux kernel >= 3.14
|
You should have ubuntu 14.xx, updated, and the Linux kernel >= 3.14
|
||||||
@@ -311,14 +367,20 @@ Options
|
|||||||
This help
|
This help
|
||||||
-g | --run-group
|
-g | --run-group
|
||||||
Run test cases in a group. For example, ./run_exec_autotests "0101* 010102"
|
Run test cases in a group. For example, ./run_exec_autotests "0101* 010102"
|
||||||
|
-p
|
||||||
|
Use password for logging
|
||||||
'
|
'
|
||||||
}
|
}
|
||||||
|
|
||||||
main () {
|
function main () {
|
||||||
RUN_GROUP=0
|
RUN_GROUP=0
|
||||||
|
SET_PASSWORD=0
|
||||||
|
passwd=""
|
||||||
test_case_group=""
|
test_case_group=""
|
||||||
test_case_group_array=()
|
test_case_group_array=()
|
||||||
test_case_array=()
|
test_case_array=()
|
||||||
|
echo_info "Note that the user should be sudoer for executing certain commands, for example loading kernel modules"
|
||||||
|
|
||||||
|
|
||||||
until [ -z "$1" ]
|
until [ -z "$1" ]
|
||||||
do
|
do
|
||||||
@@ -328,6 +390,10 @@ until [ -z "$1" ]
|
|||||||
test_case_group=$2
|
test_case_group=$2
|
||||||
echo_info "Will execute test cases only in group $test_case_group"
|
echo_info "Will execute test cases only in group $test_case_group"
|
||||||
shift 2;;
|
shift 2;;
|
||||||
|
-p)
|
||||||
|
SET_PASSWORD=1
|
||||||
|
passwd=$2
|
||||||
|
shift 2;;
|
||||||
-h | --help)
|
-h | --help)
|
||||||
print_help
|
print_help
|
||||||
exit 1;;
|
exit 1;;
|
||||||
@@ -338,6 +404,21 @@ until [ -z "$1" ]
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ "$SET_PASSWORD" != "1" ]; then
|
||||||
|
read -s -p "Enter Password: " passwd
|
||||||
|
fi
|
||||||
|
|
||||||
|
tmpfile=`mktemp`
|
||||||
|
echo $passwd | $SUDO echo $HOME > $tmpfile
|
||||||
|
tstsudo=`cat $tmpfile`
|
||||||
|
if [ "$tstsudo" != "$HOME" ]; then
|
||||||
|
echo "$USER might not have sudo privileges. Exiting"
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
echo "$USER has sudo privileges"
|
||||||
|
fi
|
||||||
|
echo "tstsudo = $tstsudo"
|
||||||
|
rm -fr $tmpfile
|
||||||
|
|
||||||
xml_conf="$OPENAIR_DIR/cmake_targets/autotests/test_case_list.xml"
|
xml_conf="$OPENAIR_DIR/cmake_targets/autotests/test_case_list.xml"
|
||||||
|
|
||||||
@@ -365,7 +446,8 @@ for search_expr in "${test_case_array[@]}"
|
|||||||
else
|
else
|
||||||
flag_run_test_case=1
|
flag_run_test_case=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
#We skip this test case if it is not in the group list
|
#We skip this test case if it is not in the group list
|
||||||
if [ "$flag_run_test_case" -ne "1" ]; then
|
if [ "$flag_run_test_case" -ne "1" ]; then
|
||||||
continue
|
continue
|
||||||
@@ -386,12 +468,15 @@ for search_expr in "${test_case_array[@]}"
|
|||||||
nruns=`xmlstarlet sel -t -v "/testCaseList/testCase[@id='$search_expr']/nruns" $xml_conf`
|
nruns=`xmlstarlet sel -t -v "/testCaseList/testCase[@id='$search_expr']/nruns" $xml_conf`
|
||||||
compile_prog_out=`xmlstarlet sel -t -v "/testCaseList/testCase[@id='$search_expr']/compile_prog_out" $xml_conf`
|
compile_prog_out=`xmlstarlet sel -t -v "/testCaseList/testCase[@id='$search_expr']/compile_prog_out" $xml_conf`
|
||||||
tags=`xmlstarlet sel -t -v "/testCaseList/testCase[@id='$search_expr']/tags" $xml_conf`
|
tags=`xmlstarlet sel -t -v "/testCaseList/testCase[@id='$search_expr']/tags" $xml_conf`
|
||||||
|
test_config_file=`xmlstarlet sel -t -v "/testCaseList/testCase[@id='$search_expr']/test_config_file" $xml_conf`
|
||||||
|
|
||||||
echo "class = $class"
|
echo "class = $class"
|
||||||
echo "name = $name"
|
echo "name = $name"
|
||||||
echo "Description = $desc"
|
echo "Description = $desc"
|
||||||
echo "pre_compile_prog = $pre_compile_prog"
|
echo "pre_compile_prog = $pre_compile_prog"
|
||||||
echo "compile_prog = $compile_prog"
|
echo "compile_prog = $compile_prog"
|
||||||
|
echo "compile_prog_args = $compile_prog_args"
|
||||||
|
echo "compile_prog_out = $compile_prog_out"
|
||||||
echo "pre_exec = $pre_exec"
|
echo "pre_exec = $pre_exec"
|
||||||
echo "pre_exec_args = $pre_exec_args"
|
echo "pre_exec_args = $pre_exec_args"
|
||||||
echo "main_exec = $main_exec"
|
echo "main_exec = $main_exec"
|
||||||
@@ -401,6 +486,7 @@ for search_expr in "${test_case_array[@]}"
|
|||||||
echo "nruns = $nruns"
|
echo "nruns = $nruns"
|
||||||
|
|
||||||
#eval $pre_exec
|
#eval $pre_exec
|
||||||
|
compile_prog_out=`eval echo \"$compile_prog_out\"`
|
||||||
|
|
||||||
search_array_true=()
|
search_array_true=()
|
||||||
|
|
||||||
@@ -421,9 +507,10 @@ for search_expr in "${test_case_array[@]}"
|
|||||||
if [ "$class" == "compilation" ]; then
|
if [ "$class" == "compilation" ]; then
|
||||||
test_compile "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags"
|
test_compile "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags"
|
||||||
elif [ "$class" == "execution" ]; then
|
elif [ "$class" == "execution" ]; then
|
||||||
test_compile_and_run "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags"
|
echo \'passwd\' | $SUDO killall -q oaisim_nos1
|
||||||
|
test_compile_and_run "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags" "$mypassword" "$test_config_file"
|
||||||
else
|
else
|
||||||
echo "Unexpected class of test case...Exiting...."
|
echo "Unexpected class of test case...Skipping the test case $name ...."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
done
|
done
|
||||||
@@ -432,6 +519,8 @@ for search_expr in "${test_case_array[@]}"
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uname -a
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|
||||||
xUnit_write "$results_file"
|
xUnit_write "$results_file"
|
||||||
|
|||||||
+1555
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+200
@@ -0,0 +1,200 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import time
|
||||||
|
import serial
|
||||||
|
import os
|
||||||
|
from pyroute2 import IPRoute
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import threading
|
||||||
|
import signal
|
||||||
|
import traceback
|
||||||
|
import os
|
||||||
|
import commands
|
||||||
|
|
||||||
|
# configure the serial connections (the parameters differs on the device you are connecting to)
|
||||||
|
#First we find an open port to work with
|
||||||
|
serial_port=''
|
||||||
|
ser=serial.Serial()
|
||||||
|
openair_dir = os.environ.get('OPENAIR_DIR')
|
||||||
|
if openair_dir == None:
|
||||||
|
print "Error getting OPENAIR_DIR environment variable"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
sys.path.append(os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/'))
|
||||||
|
|
||||||
|
from lib_autotest import *
|
||||||
|
|
||||||
|
def find_open_port():
|
||||||
|
global serial_port, ser
|
||||||
|
max_ports=100
|
||||||
|
if os.path.exists(serial_port) == True:
|
||||||
|
return serial_port
|
||||||
|
for port in range(2,100):
|
||||||
|
serial_port = '/dev/ttyUSB'+str(port)
|
||||||
|
if os.path.exists(serial_port) == True:
|
||||||
|
print 'New Serial Port : ' + serial_port
|
||||||
|
break
|
||||||
|
|
||||||
|
ser = serial.Serial(port=serial_port)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#serial_port = '/dev/ttyUSB2'
|
||||||
|
bandrich_ppd_config = os.environ.get('OPENAIR_DIR') + '/cmake_targets/autotests/tools/wdial.bandrich.conf'
|
||||||
|
|
||||||
|
exit_flag=0
|
||||||
|
|
||||||
|
def signal_handler(signal, frame):
|
||||||
|
print('You pressed Ctrl+C!')
|
||||||
|
print('Resetting the UE to detached state')
|
||||||
|
timeout=10
|
||||||
|
exit_flag=1
|
||||||
|
send_command('AT+CGATT=0' , 'OK' , timeout)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, signal_handler)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ser.open()
|
||||||
|
#ser.isOpen()
|
||||||
|
|
||||||
|
class pppThread (threading.Thread):
|
||||||
|
def __init__(self, threadID, name, counter):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.threadID = threadID
|
||||||
|
self.name = name
|
||||||
|
self.counter = counter
|
||||||
|
def run(self):
|
||||||
|
print "Starting " + self.name
|
||||||
|
#Here we keep running pppd thread in indefinite loop as this script terminates sometimes
|
||||||
|
#while 1:
|
||||||
|
while 1:
|
||||||
|
time.sleep(5) #Hard coded, do not reduce this number!
|
||||||
|
print "Starting wvdial now..."
|
||||||
|
print 'exit_flag = ' + str(exit_flag)
|
||||||
|
send_command('AT+CGATT=1','OK', 300)
|
||||||
|
os.system('wvdial -C ' + bandrich_ppd_config + '' )
|
||||||
|
if exit_flag == 1:
|
||||||
|
print "Exit flag set to true. Exiting pppThread now"
|
||||||
|
print "Terminating wvdial now..."
|
||||||
|
|
||||||
|
def send_command (cmd, response, timeout):
|
||||||
|
count=0
|
||||||
|
sleep_duration = 1
|
||||||
|
print 'In function: send_command: cmd = <' + cmd + '> response: <' + response + '> \n'
|
||||||
|
global serial_port, ser
|
||||||
|
while count <= timeout:
|
||||||
|
try:
|
||||||
|
#Sometimes the port does not exist coz of reset in modem.
|
||||||
|
#In that case, we need to search for this port again
|
||||||
|
if os.path.exists(serial_port) == False:
|
||||||
|
find_open_port()
|
||||||
|
ser.write (cmd + '\r\n')
|
||||||
|
out = ''
|
||||||
|
time.sleep(sleep_duration)
|
||||||
|
count = count + sleep_duration
|
||||||
|
while ser.inWaiting() > 0:
|
||||||
|
out += ser.read(1)
|
||||||
|
print 'out = <' + out + '> response = <' + response + '> \n'
|
||||||
|
if re.search(response, out):
|
||||||
|
break
|
||||||
|
except Exception, e:
|
||||||
|
error = ' cmd : ' + cmd + ' response : ' + response
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
|
||||||
|
|
||||||
|
def start_ue () :
|
||||||
|
#print 'Enter your commands below.\r\nInsert "exit" to leave the application.'
|
||||||
|
timeout=60 #timeout in seconds
|
||||||
|
send_command('AT', 'OK' , timeout)
|
||||||
|
send_command('AT+CFUN=1' , 'OK' , timeout)
|
||||||
|
#send_command('AT+CGATT=0' , 'OK' , timeout)
|
||||||
|
send_command('AT+CGATT=1','OK', 300)
|
||||||
|
#os.system('wvdial -C ' + bandrich_ppd_config + ' &' )
|
||||||
|
|
||||||
|
thread_ppp = pppThread(1, "ppp_thread", 1)
|
||||||
|
thread_ppp.start()
|
||||||
|
|
||||||
|
iface='ppp0'
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
time.sleep ( 2)
|
||||||
|
#Now we check if ppp0 interface is up and running
|
||||||
|
try:
|
||||||
|
if exit_flag == 1:
|
||||||
|
break
|
||||||
|
ip = IPRoute()
|
||||||
|
idx = ip.link_lookup(ifname=iface)[0]
|
||||||
|
os.system ('route add ' + gw + ' ppp0')
|
||||||
|
os.system('sleep 5')
|
||||||
|
os.system ('ping ' + gw)
|
||||||
|
break
|
||||||
|
except Exception, e:
|
||||||
|
error = ' Interface ' + iface + 'does not exist...'
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
|
||||||
|
thread_ppp.join()
|
||||||
|
|
||||||
|
def stop_ue():
|
||||||
|
timeout=60
|
||||||
|
os.system('killall wvdial')
|
||||||
|
send_command('AT', 'OK' , timeout)
|
||||||
|
send_command('AT+CGATT=0' , 'OK|ERROR' , timeout)
|
||||||
|
send_command('AT+CFUN=4' , 'OK' , timeout)
|
||||||
|
|
||||||
|
|
||||||
|
#reset the USB BUS of Bandrich UE
|
||||||
|
def reset_ue():
|
||||||
|
stringIdBandrich='BandRich, Inc. 4G LTE adapter'
|
||||||
|
status, out = commands.getstatusoutput('lsusb | grep -i \'' + stringIdBandrich + '\'')
|
||||||
|
if (out == '') :
|
||||||
|
print "Bandrich 4G LTE Adapter not found. Exiting now..."
|
||||||
|
sys.exit()
|
||||||
|
p=re.compile('Bus\s*(\w+)\s*Device\s*(\w+):\s*ID\s*(\w+):(\w+)')
|
||||||
|
res=p.findall(out)
|
||||||
|
BusId=res[0][0]
|
||||||
|
DeviceId=res[0][1]
|
||||||
|
VendorId=res[0][2]
|
||||||
|
ProductId=res[0][3]
|
||||||
|
usb_dir= find_usb_path(VendorId, ProductId)
|
||||||
|
print "Bandrich 4G LTE Adapter found in..." + usb_dir
|
||||||
|
cmd = "sudo sh -c \"echo 0 > " + usb_dir + "/authorized\""
|
||||||
|
os.system(cmd + " ; sleep 15" )
|
||||||
|
cmd = "sudo sh -c \"echo 1 > " + usb_dir + "/authorized\""
|
||||||
|
os.system(cmd + " ; sleep 30" )
|
||||||
|
|
||||||
|
i=1
|
||||||
|
gw='192.172.0.1'
|
||||||
|
while i < len(sys.argv):
|
||||||
|
arg=sys.argv[i]
|
||||||
|
if arg == '--start-ue' :
|
||||||
|
find_open_port()
|
||||||
|
print 'Using Serial port : ' + serial_port
|
||||||
|
start_ue()
|
||||||
|
elif arg == '--stop-ue' :
|
||||||
|
find_open_port()
|
||||||
|
print 'Using Serial port : ' + serial_port
|
||||||
|
stop_ue()
|
||||||
|
elif arg == '--reset-ue' :
|
||||||
|
reset_ue()
|
||||||
|
elif arg == '-gw' :
|
||||||
|
gw = sys.argv[i+1]
|
||||||
|
i=i+1
|
||||||
|
elif arg == '-h' :
|
||||||
|
print "--reset-ue: Reset the UE on USB Bus. Similar to unplugging and plugging the UE"
|
||||||
|
print "--stop-ue: Stop the UE. Send DETACH command"
|
||||||
|
print "--start-ue: Start the UE. Send ATTACH command"
|
||||||
|
print "-gw: Specify the default gw as sometimes the gateway/route arguments are not set properly via wvdial"
|
||||||
|
else :
|
||||||
|
print " Script called with wrong arguments, arg = " + arg
|
||||||
|
sys.exit()
|
||||||
|
i = i +1
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,200 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import time
|
||||||
|
import serial
|
||||||
|
import os
|
||||||
|
from pyroute2 import IPRoute
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import threading
|
||||||
|
import signal
|
||||||
|
import traceback
|
||||||
|
import os
|
||||||
|
import commands
|
||||||
|
|
||||||
|
# configure the serial connections (the parameters differs on the device you are connecting to)
|
||||||
|
#First we find an open port to work with
|
||||||
|
serial_port=''
|
||||||
|
ser=serial.Serial()
|
||||||
|
openair_dir = os.environ.get('OPENAIR_DIR')
|
||||||
|
if openair_dir == None:
|
||||||
|
print "Error getting OPENAIR_DIR environment variable"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
sys.path.append(os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/'))
|
||||||
|
|
||||||
|
from lib_autotest import *
|
||||||
|
|
||||||
|
def find_open_port():
|
||||||
|
global serial_port, ser
|
||||||
|
max_ports=100
|
||||||
|
if os.path.exists(serial_port) == True:
|
||||||
|
return serial_port
|
||||||
|
for port in range(0,100):
|
||||||
|
serial_port = '/dev/ttyUSB'+str(port)
|
||||||
|
if os.path.exists(serial_port) == True:
|
||||||
|
print 'New Serial Port : ' + serial_port
|
||||||
|
break
|
||||||
|
|
||||||
|
ser = serial.Serial(port=serial_port)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#serial_port = '/dev/ttyUSB2'
|
||||||
|
bandrich_ppd_config = os.environ.get('OPENAIR_DIR') + '/cmake_targets/autotests/tools/wdial.bandrich.conf'
|
||||||
|
|
||||||
|
exit_flag=0
|
||||||
|
|
||||||
|
def signal_handler(signal, frame):
|
||||||
|
print('You pressed Ctrl+C!')
|
||||||
|
print('Resetting the UE to detached state')
|
||||||
|
timeout=10
|
||||||
|
exit_flag=1
|
||||||
|
send_command('AT+CGATT=0' , 'OK' , timeout)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, signal_handler)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ser.open()
|
||||||
|
#ser.isOpen()
|
||||||
|
|
||||||
|
class pppThread (threading.Thread):
|
||||||
|
def __init__(self, threadID, name, counter):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.threadID = threadID
|
||||||
|
self.name = name
|
||||||
|
self.counter = counter
|
||||||
|
def run(self):
|
||||||
|
print "Starting " + self.name
|
||||||
|
#Here we keep running pppd thread in indefinite loop as this script terminates sometimes
|
||||||
|
#while 1:
|
||||||
|
while 1:
|
||||||
|
time.sleep(5) #Hard coded, do not reduce this number!
|
||||||
|
print "Starting wvdial now..."
|
||||||
|
print 'exit_flag = ' + str(exit_flag)
|
||||||
|
send_command('AT+CGATT=1','OK', 300)
|
||||||
|
os.system('wvdial -C ' + bandrich_ppd_config + '' )
|
||||||
|
if exit_flag == 1:
|
||||||
|
print "Exit flag set to true. Exiting pppThread now"
|
||||||
|
print "Terminating wvdial now..."
|
||||||
|
|
||||||
|
def send_command (cmd, response, timeout):
|
||||||
|
count=0
|
||||||
|
sleep_duration = 1
|
||||||
|
print 'In function: send_command: cmd = <' + cmd + '> response: <' + response + '> \n'
|
||||||
|
global serial_port, ser
|
||||||
|
while count <= timeout:
|
||||||
|
try:
|
||||||
|
#Sometimes the port does not exist coz of reset in modem.
|
||||||
|
#In that case, we need to search for this port again
|
||||||
|
if os.path.exists(serial_port) == False:
|
||||||
|
find_open_port()
|
||||||
|
ser.write (cmd + '\r\n')
|
||||||
|
out = ''
|
||||||
|
time.sleep(sleep_duration)
|
||||||
|
count = count + sleep_duration
|
||||||
|
while ser.inWaiting() > 0:
|
||||||
|
out += ser.read(1)
|
||||||
|
print 'out = <' + out + '> response = <' + response + '> \n'
|
||||||
|
if re.search(response, out):
|
||||||
|
break
|
||||||
|
except Exception, e:
|
||||||
|
error = ' cmd : ' + cmd + ' response : ' + response
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
|
||||||
|
|
||||||
|
def start_ue () :
|
||||||
|
#print 'Enter your commands below.\r\nInsert "exit" to leave the application.'
|
||||||
|
timeout=60 #timeout in seconds
|
||||||
|
send_command('AT', 'OK' , timeout)
|
||||||
|
#send_command('AT+CFUN=1' , 'OK' , timeout)
|
||||||
|
#send_command('AT+CGATT=0' , 'OK' , timeout)
|
||||||
|
send_command('AT+CGATT=1','OK', 300)
|
||||||
|
#os.system('wvdial -C ' + bandrich_ppd_config + ' &' )
|
||||||
|
|
||||||
|
thread_ppp = pppThread(1, "ppp_thread", 1)
|
||||||
|
thread_ppp.start()
|
||||||
|
|
||||||
|
iface='ppp0'
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
time.sleep ( 2)
|
||||||
|
#Now we check if ppp0 interface is up and running
|
||||||
|
try:
|
||||||
|
if exit_flag == 1:
|
||||||
|
break
|
||||||
|
ip = IPRoute()
|
||||||
|
idx = ip.link_lookup(ifname=iface)[0]
|
||||||
|
os.system ('route add ' + gw + ' ppp0')
|
||||||
|
os.system('sleep 5')
|
||||||
|
os.system ('ping ' + gw)
|
||||||
|
break
|
||||||
|
except Exception, e:
|
||||||
|
error = ' Interface ' + iface + 'does not exist...'
|
||||||
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
error = error + traceback.format_exc()
|
||||||
|
print error
|
||||||
|
|
||||||
|
thread_ppp.join()
|
||||||
|
|
||||||
|
def stop_ue():
|
||||||
|
timeout=60
|
||||||
|
os.system('killall wvdial')
|
||||||
|
send_command('AT', 'OK' , timeout)
|
||||||
|
send_command('AT+CGATT=0' , 'OK|ERROR' , timeout)
|
||||||
|
#send_command('AT+CFUN=4' , 'OK' , timeout)
|
||||||
|
|
||||||
|
|
||||||
|
#reset the USB BUS of Bandrich UE
|
||||||
|
def reset_ue():
|
||||||
|
stringIdBandrich='Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard'
|
||||||
|
status, out = commands.getstatusoutput('lsusb | grep -i \'' + stringIdBandrich + '\'')
|
||||||
|
if (out == '') :
|
||||||
|
print "Bandrich 4G LTE Adapter not found. Exiting now..."
|
||||||
|
sys.exit()
|
||||||
|
p=re.compile('Bus\s*(\w+)\s*Device\s*(\w+):\s*ID\s*(\w+):(\w+)')
|
||||||
|
res=p.findall(out)
|
||||||
|
BusId=res[0][0]
|
||||||
|
DeviceId=res[0][1]
|
||||||
|
VendorId=res[0][2]
|
||||||
|
ProductId=res[0][3]
|
||||||
|
usb_dir= find_usb_path(VendorId, ProductId)
|
||||||
|
print "Bandrich 4G LTE Adapter found in..." + usb_dir
|
||||||
|
cmd = "sudo sh -c \"echo 0 > " + usb_dir + "/authorized\""
|
||||||
|
os.system(cmd + " ; sleep 15" )
|
||||||
|
cmd = "sudo sh -c \"echo 1 > " + usb_dir + "/authorized\""
|
||||||
|
os.system(cmd + " ; sleep 30" )
|
||||||
|
|
||||||
|
i=1
|
||||||
|
gw='192.172.0.1'
|
||||||
|
while i < len(sys.argv):
|
||||||
|
arg=sys.argv[i]
|
||||||
|
if arg == '--start-ue' :
|
||||||
|
find_open_port()
|
||||||
|
print 'Using Serial port : ' + serial_port
|
||||||
|
start_ue()
|
||||||
|
elif arg == '--stop-ue' :
|
||||||
|
find_open_port()
|
||||||
|
print 'Using Serial port : ' + serial_port
|
||||||
|
stop_ue()
|
||||||
|
elif arg == '--reset-ue' :
|
||||||
|
reset_ue()
|
||||||
|
elif arg == '-gw' :
|
||||||
|
gw = sys.argv[i+1]
|
||||||
|
i=i+1
|
||||||
|
elif arg == '-h' :
|
||||||
|
print "--reset-ue: Reset the UE on USB Bus. Similar to unplugging and plugging the UE"
|
||||||
|
print "--stop-ue: Stop the UE. Send DETACH command"
|
||||||
|
print "--start-ue: Start the UE. Send ATTACH command"
|
||||||
|
print "-gw: Specify the default gw as sometimes the gateway/route arguments are not set properly via wvdial"
|
||||||
|
else :
|
||||||
|
print " Script called with wrong arguments, arg = " + arg
|
||||||
|
sys.exit()
|
||||||
|
i = i +1
|
||||||
|
|
||||||
|
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#arg1 idVendor
|
||||||
|
#arg2 idProduct
|
||||||
|
argIdVendor=$1
|
||||||
|
argIdProduct=$2
|
||||||
|
|
||||||
|
echo $1
|
||||||
|
echo $2
|
||||||
|
|
||||||
|
for X in /sys/bus/usb/devices/*; do
|
||||||
|
#echo "$X"
|
||||||
|
idVendor=`cat "$X/idVendor" 2>/dev/null`
|
||||||
|
idProduct=`cat "$X/idProduct" 2>/dev/null`
|
||||||
|
if [ "$argIdVendor" == "$idVendor" ] && [ "$argIdProduct" == "$idProduct" ]
|
||||||
|
then
|
||||||
|
echo "$X"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
Executable
+22
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#arg1 timeout to wait before running the script
|
||||||
|
#arg2 interface
|
||||||
|
#arg3 iperf arguments
|
||||||
|
|
||||||
|
args=($*)
|
||||||
|
timeout=${args[0]}
|
||||||
|
iface=${args[1]}
|
||||||
|
iperf_args=(${args[@]:2})
|
||||||
|
|
||||||
|
#array=${1:-1}
|
||||||
|
echo "args = ${args[@]}"
|
||||||
|
echo "timeout = $timeout"
|
||||||
|
echo "iface = $iface"
|
||||||
|
echo "iperf_args = ${iperf_args[@]}"
|
||||||
|
|
||||||
|
sleep $timeout
|
||||||
|
|
||||||
|
while true; do var=`ifconfig $iface` ;sleep 1; if [ "$var" != "" ]; then break; fi ; done ; sleep 5
|
||||||
|
|
||||||
|
iperf ${iperf_args[@]}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import os
|
||||||
|
from pyroute2 import IPRoute
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import threading
|
||||||
|
import signal
|
||||||
|
import traceback
|
||||||
|
import commands
|
||||||
|
|
||||||
|
def read_file(filename):
|
||||||
|
try:
|
||||||
|
file = open(filename, 'r')
|
||||||
|
return file.read()
|
||||||
|
except Exception, e:
|
||||||
|
# WE just ignore the exception as some files are probably not present
|
||||||
|
#error = ' Filename ' + filename
|
||||||
|
#error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
||||||
|
#error = error + traceback.format_exc()
|
||||||
|
#print error
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def find_usb_path(idVendor, idProduct):
|
||||||
|
for root, dirs, files in os.walk("/sys/bus/usb/devices", topdown=False):
|
||||||
|
for name in dirs:
|
||||||
|
tmpdir= os.path.join(root, name)
|
||||||
|
tmpidVendor = read_file(tmpdir+'/idVendor').replace("\n","")
|
||||||
|
tmpidProduct = read_file(tmpdir+'/idProduct').replace("\n","")
|
||||||
|
if tmpidVendor == idVendor and tmpidProduct == idProduct:
|
||||||
|
return tmpdir
|
||||||
|
return ''
|
||||||
|
|
||||||
Executable
+42
@@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
|
#Arg 1 name of file
|
||||||
|
#Arg 2 keyword
|
||||||
|
#arg 3 replacement text
|
||||||
|
#Note that these should be seperated by spaces
|
||||||
|
if len(sys.argv) != 4:
|
||||||
|
print "search_repl.py: Wrong number of arguments. This program needs 3 arguments. The number of arguments supplied : " + str(sys.argv)
|
||||||
|
sys.exit()
|
||||||
|
filename = os.path.expandvars(sys.argv[1])
|
||||||
|
keyword = sys.argv[2]
|
||||||
|
replacement_text = sys.argv[3]
|
||||||
|
|
||||||
|
|
||||||
|
file = open(filename, 'r')
|
||||||
|
string = file.read()
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
|
||||||
|
if keyword == 'mme_ip_address':
|
||||||
|
replacement_text = keyword + ' = ( { ' + replacement_text + ' } ) ; '
|
||||||
|
string = re.sub(r"mme_ip_address\s*=\s*\(([^\$]+?)\)\s*;", replacement_text, string, re.M)
|
||||||
|
elif keyword == 'IPV4_LIST':
|
||||||
|
replacement_text = keyword + ' = ( ' + replacement_text + ' ) ; '
|
||||||
|
string = re.sub(r"IPV4_LIST\s*=\s*\(([^\$]+?)\)\s*;", replacement_text, string, re.M)
|
||||||
|
elif keyword == 'rrh_gw_config':
|
||||||
|
replacement_text = keyword + ' = ( { ' + replacement_text + ' } ) ; '
|
||||||
|
string = re.sub(r"rrh_gw_config\s*=\s*\(([^\$]+?)\)\s*;", replacement_text, string, re.M)
|
||||||
|
else :
|
||||||
|
replacement_text = keyword + ' = ' + replacement_text + ' ; '
|
||||||
|
string = re.sub(r"%s\s*=\s*([^\$]+?)\s*;" % keyword , replacement_text, string, re.M)
|
||||||
|
#else :
|
||||||
|
# replacement_text = keyword + ' =\"' + replacement_text + '\" ; '
|
||||||
|
# string = re.sub(r"%s\s*=\s*\"([^\$]+?)\"\s*;" % keyword , replacement_text, string, re.M)
|
||||||
|
|
||||||
|
file = open(filename, 'w')
|
||||||
|
file.write(string)
|
||||||
|
file.close()
|
||||||
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
[Dialer Defaults]
|
||||||
|
Modem = /dev/ttyUSB0
|
||||||
|
ISDN = off
|
||||||
|
Modem Type = Analog Modem
|
||||||
|
Baud = 9600
|
||||||
|
Init = ATZ
|
||||||
|
Init2 = AT+CPIN?
|
||||||
|
Init3 = AT+CGREG?
|
||||||
|
Init4 = AT+COPS?
|
||||||
|
Init5 = AT+CSQ
|
||||||
|
Init6 =
|
||||||
|
Init7 = AT+CGATT=1
|
||||||
|
Init8 =
|
||||||
|
Init9 =
|
||||||
|
Phone = *99***1#
|
||||||
|
Phone1 =
|
||||||
|
Phone2 =
|
||||||
|
Phone3 =
|
||||||
|
Phone4 =
|
||||||
|
Dial Prefix =
|
||||||
|
Dial Attempts = 1
|
||||||
|
Dial Command = ATM1L3DT
|
||||||
|
Ask Password = off
|
||||||
|
Password = ''
|
||||||
|
Username = ImaginLab
|
||||||
|
Auto Reconnect = off
|
||||||
|
Abort on Busy = off
|
||||||
|
Carrier Check = on
|
||||||
|
Check Def Route = on
|
||||||
|
Abort on No Dialtone = on
|
||||||
|
Stupid Mode = on
|
||||||
|
Idle Seconds = 0
|
||||||
|
Auto DNS = on
|
||||||
|
;Minimize = off
|
||||||
|
;Dock = off
|
||||||
|
;Do NOT edit this file by hand!
|
||||||
+253
-78
@@ -42,17 +42,22 @@ THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
|
|||||||
source $THIS_SCRIPT_PATH/tools/build_helper
|
source $THIS_SCRIPT_PATH/tools/build_helper
|
||||||
|
|
||||||
MSC_GEN="False"
|
MSC_GEN="False"
|
||||||
XFORMS="False"
|
XFORMS="True"
|
||||||
PRINT_STATS="False"
|
PRINT_STATS="False"
|
||||||
VCD_TIMING="False"
|
VCD_TIMING="False"
|
||||||
|
LOWLATENCY_FLAG_USER="False"
|
||||||
|
FORCE_LOWLATENCY_FLAG_USER=""
|
||||||
REL="Rel10"
|
REL="Rel10"
|
||||||
HW="EXMIMO"
|
HW="None"
|
||||||
|
TP="None"
|
||||||
NOS1=0
|
NOS1=0
|
||||||
EPC=0
|
EPC=0
|
||||||
VERBOSE_COMPILE=0
|
VERBOSE_COMPILE=0
|
||||||
CFLAGS_PROCESSOR_USER=""
|
CFLAGS_PROCESSOR_USER=""
|
||||||
RUN_GROUP=0
|
RUN_GROUP=0
|
||||||
TEST_CASE_GROUP=""
|
TEST_CASE_GROUP=""
|
||||||
|
BUILD_DOXYGEN=0
|
||||||
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
function print_help() {
|
function print_help() {
|
||||||
echo_info '
|
echo_info '
|
||||||
@@ -80,18 +85,19 @@ Options
|
|||||||
Makes the LTE softmodem
|
Makes the LTE softmodem
|
||||||
--UE
|
--UE
|
||||||
Makes the UE specific parts (ue_ip, usim, nvram)
|
Makes the UE specific parts (ue_ip, usim, nvram)
|
||||||
--EPC
|
|
||||||
Makes the EPC (MME-SPGW, HSS)
|
|
||||||
--RRH
|
--RRH
|
||||||
Makes the RRH
|
Makes the RRH
|
||||||
-r | --3gpp-release
|
-r | --3gpp-release
|
||||||
default is Rel10,
|
default is Rel10,
|
||||||
Rel8 limits the implementation to 3GPP Release 8 version
|
Rel8 limits the implementation to 3GPP Release 8 version
|
||||||
-w | --hardware
|
-w | --hardware
|
||||||
EXMIMO (Default), USRP, BLADERF, ETHERNET, None
|
EXMIMO, USRP, BLADERF, ETHERNET, LMSSDR, None (Default)
|
||||||
Adds this RF board support (in external packages installation and in compilation)
|
Adds this RF board support (in external packages installation and in compilation)
|
||||||
|
-t | --transport protocol
|
||||||
|
ETHERNET , None
|
||||||
|
Adds this trasport protocol support in compilation
|
||||||
--oaisim
|
--oaisim
|
||||||
Makes the oaisim simulator. Hardware will be defaulted to "NONE".
|
Makes the oaisim simulator. Hardware will be defaulted to "None".
|
||||||
--phy_simulators
|
--phy_simulators
|
||||||
Makes the unitary tests Layer 1 simulators
|
Makes the unitary tests Layer 1 simulators
|
||||||
--core_simulators
|
--core_simulators
|
||||||
@@ -113,11 +119,16 @@ Options
|
|||||||
Shows detailed compilation instructions in makefile
|
Shows detailed compilation instructions in makefile
|
||||||
--cflags_processor
|
--cflags_processor
|
||||||
Manually Add CFLAGS of processor if they are not detected correctly by script. Only add these flags if you know your processor supports them. Example flags: -msse3 -msse4.1 -msse4.2 -mavx2
|
Manually Add CFLAGS of processor if they are not detected correctly by script. Only add these flags if you know your processor supports them. Example flags: -msse3 -msse4.1 -msse4.2 -mavx2
|
||||||
|
--build-doxygen
|
||||||
|
Builds doxygen based documentation.
|
||||||
|
--disable-deadline
|
||||||
|
Disables deadline scheduler of Linux kernel (>=3.14.x).
|
||||||
|
--enable-deadline
|
||||||
|
Disables deadline scheduler of Linux kernel (>=3.14.x).
|
||||||
Usage (first build):
|
Usage (first build):
|
||||||
oaisim (eNB + UE): ./build_oai -I -g --oaisim -x --install-system-files
|
oaisim (eNB + UE): ./build_oai -I -g --oaisim -x --install-system-files
|
||||||
Eurecom EXMIMO + COTS UE : ./build_oai -I -g --eNB --EPC -x --install-system-files
|
Eurecom EXMIMO + COTS UE : ./build_oai -I -g --eNB -x --install-system-files
|
||||||
NI/ETTUS B201 + COTS UE : ./build_oai -I -g --eNB --EPC -x --install-system-files -w USRP
|
NI/ETTUS B201 + COTS UE : ./build_oai -I -g --eNB -x --install-system-files -w USRP
|
||||||
Usage (Regular):
|
Usage (Regular):
|
||||||
oaisim : ./build_oai --oaisim -x
|
oaisim : ./build_oai --oaisim -x
|
||||||
Eurecom EXMIMO + OAI ENB : ./build_oai --eNB -x
|
Eurecom EXMIMO + OAI ENB : ./build_oai --eNB -x
|
||||||
@@ -159,30 +170,41 @@ function main() {
|
|||||||
UE=1
|
UE=1
|
||||||
echo_info "Will compile UE"
|
echo_info "Will compile UE"
|
||||||
shift;;
|
shift;;
|
||||||
--EPC)
|
|
||||||
EPC=1
|
|
||||||
echo_info "Will compile EPC"
|
|
||||||
shift;;
|
|
||||||
--RRH)
|
--RRH)
|
||||||
RRH=1
|
RRH=1
|
||||||
echo_info "Will compile RRH"
|
echo_info "Will compile RRH"
|
||||||
shift;;
|
shift;;
|
||||||
-r | --3gpp-release)
|
-r | --3gpp-release)
|
||||||
REL=$2
|
REL=$2
|
||||||
echo_info "setting release to: $REL"
|
echo_info "Setting release to: $REL"
|
||||||
shift 2;;
|
shift 2;;
|
||||||
-w | --hardware)
|
-w | --hardware)
|
||||||
HW="$2" #"${i#*=}"
|
HW="$2" #"${i#*=}"
|
||||||
# Use OAI_USRP as the key word USRP is used inside UHD driver
|
# Use OAI_USRP as the key word USRP is used inside UHD driver
|
||||||
if [ "$HW" == "USRP" ] ; then
|
if [ "$HW" != "BLADERF" -a "$HW" != "USRP" -a "$HW" != "LMSSDR" -a "$HW" != "None" -a "$HW" != "EXMIMO" ] ; then
|
||||||
HW="OAI_USRP"
|
echo_fatal "Unknown HW type $HW will exit..."
|
||||||
fi
|
else
|
||||||
if [ "$HW" == "BLADERF" ] ; then
|
if [ "$HW" == "USRP" ] ; then
|
||||||
HW="OAI_BLADERF"
|
HW="OAI_USRP"
|
||||||
fi
|
fi
|
||||||
echo_info "setting hardware to: $HW"
|
if [ "$HW" == "BLADERF" ] ; then
|
||||||
|
HW="OAI_BLADERF"
|
||||||
|
fi
|
||||||
|
if [ "$HW" == "LMSSDR" ] ; then
|
||||||
|
HW="OAI_LMSSDR"
|
||||||
|
fi
|
||||||
|
echo_info "Setting hardware to: $HW"
|
||||||
|
fi
|
||||||
shift 2;;
|
shift 2;;
|
||||||
--oaisim)
|
-t | --transport_protocol)
|
||||||
|
TP="$2" #"${i#*=}"
|
||||||
|
if [ "$TP" != "ETHERNET" -a "$TP" != "None" ] ; then
|
||||||
|
echo_fatal "Unknown TP type $TP will exit..."
|
||||||
|
else
|
||||||
|
echo_info "Setting transport protocol to: $TP"
|
||||||
|
fi
|
||||||
|
shift 2;;
|
||||||
|
--oaisim)
|
||||||
oaisim=1
|
oaisim=1
|
||||||
echo_info "Will compile oaisim and drivers nasmesh, ..."
|
echo_info "Will compile oaisim and drivers nasmesh, ..."
|
||||||
shift;;
|
shift;;
|
||||||
@@ -204,7 +226,7 @@ function main() {
|
|||||||
echo_info "executing test cases only in group: $TEST_CASE_GROUP"
|
echo_info "executing test cases only in group: $TEST_CASE_GROUP"
|
||||||
shift 2;;
|
shift 2;;
|
||||||
-V | --vcd)
|
-V | --vcd)
|
||||||
echo_info "setting gtk-wave output"
|
echo_info "Setting gtk-wave output"
|
||||||
VCD_TIMING=1
|
VCD_TIMING=1
|
||||||
EXE_ARGUMENTS="$EXE_ARGUMENTS -V"
|
EXE_ARGUMENTS="$EXE_ARGUMENTS -V"
|
||||||
shift;;
|
shift;;
|
||||||
@@ -227,8 +249,20 @@ function main() {
|
|||||||
shift;;
|
shift;;
|
||||||
--cflags_processor)
|
--cflags_processor)
|
||||||
CFLAGS_PROCESSOR_USER=$2
|
CFLAGS_PROCESSOR_USER=$2
|
||||||
echo_info "setting CPU FLAGS from USER to: $CFLAGS_PROCESSOR_USER"
|
echo_info "Setting CPU FLAGS from USER to: $CFLAGS_PROCESSOR_USER"
|
||||||
shift 2;;
|
shift 2;;
|
||||||
|
--build-doxygen)
|
||||||
|
BUILD_DOXYGEN=1
|
||||||
|
echo_info "Will build doxygen support"
|
||||||
|
shift;;
|
||||||
|
--disable-deadline)
|
||||||
|
FORCE_LOWLATENCY_FLAG_USER="False"
|
||||||
|
echo_info "Disabling the usage of deadline scheduler"
|
||||||
|
shift 1;;
|
||||||
|
--enable-deadline)
|
||||||
|
FORCE_LOWLATENCY_FLAG_USER="True"
|
||||||
|
echo_info "Enabling the usage of deadline scheduler"
|
||||||
|
shift 1;;
|
||||||
-h | --help)
|
-h | --help)
|
||||||
print_help
|
print_help
|
||||||
exit 1;;
|
exit 1;;
|
||||||
@@ -238,6 +272,64 @@ function main() {
|
|||||||
break;;
|
break;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
#########################################################
|
||||||
|
# check validity of HW and TP parameters for RRH and eNB
|
||||||
|
#########################################################
|
||||||
|
# to be discussed
|
||||||
|
|
||||||
|
if [ "$eNB" = "1" ] ; then
|
||||||
|
if [ "$HW" = "None" -a "$TP" = "None" ] ; then
|
||||||
|
echo_fatal "Define a local radio head (e.g. -w EXMIMO) or a transport protocol (e.g. -t ETHERNET) to communicate with a remote radio head!"
|
||||||
|
fi
|
||||||
|
if [ "$HW" != "None" -a "$TP" != "None" ] ; then
|
||||||
|
echo_fatal "Currently eNB can not support simultaniously local and remote radio heads!!"
|
||||||
|
fi
|
||||||
|
if [ "$HW" = "None" ] ; then
|
||||||
|
echo_info "No radio head has been selected (HW set to $HW)"
|
||||||
|
fi
|
||||||
|
if [ "$TP" = "None" ] ; then
|
||||||
|
echo_info "No transport protocol has been selected (TP set to $TP)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$RRH" = "1" ] ; then
|
||||||
|
if [ "$TP" = "None" ] ; then
|
||||||
|
echo_fatal "A transport protocol (e.g. -t ETHERNET) must be defined!"
|
||||||
|
fi
|
||||||
|
if [ "$HW" = "None" ] ; then
|
||||||
|
echo_info "No radio head has been selected (HW set to $HW)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo_info "RF HW set to $HW"
|
||||||
|
#Now we set flags to enable deadline scheduler settings
|
||||||
|
#By default: USRP: disable,
|
||||||
|
#By default: BLADERF: enable,
|
||||||
|
#By default: EXMIMO: enable
|
||||||
|
if [ "$FORCE_LOWLATENCY_FLAG_USER" = "" ]; then
|
||||||
|
if [ "$HW" = "EXMIMO" ] ; then
|
||||||
|
LOWLATENCY_FLAG_USER="True"
|
||||||
|
elif [ "$HW" = "ETHERNET" ] ; then
|
||||||
|
LOWLATENCY_FLAG_USER="True"
|
||||||
|
elif [ "$HW" = "OAI_USRP" ] ; then
|
||||||
|
LOWLATENCY_FLAG_USER="False"
|
||||||
|
elif [ "$HW" = "OAI_BLADERF" ] ; then
|
||||||
|
LOWLATENCY_FLAG_USER="False"
|
||||||
|
elif [ "$HW" = "OAI_LMSSDR" ] ; then
|
||||||
|
LOWLATENCY_FLAG_USER="False"
|
||||||
|
elif [ "$HW" = "None" ] ; then
|
||||||
|
LOWLATENCY_FLAG_USER="False"
|
||||||
|
else
|
||||||
|
echo_error "Unknown HW type $HW. Exiting now..."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
LOWLATENCY_FLAG_USER=$FORCE_LOWLATENCY_FLAG_USER
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo_info "Flags for Deadline scheduler: $LOWLATENCY_FLAG_USER"
|
||||||
|
|
||||||
|
|
||||||
############################################
|
############################################
|
||||||
# setting and printing OAI envs, we should check here
|
# setting and printing OAI envs, we should check here
|
||||||
@@ -277,7 +369,7 @@ function main() {
|
|||||||
check_install_usrp_uhd_driver
|
check_install_usrp_uhd_driver
|
||||||
fi
|
fi
|
||||||
if [ "$HW" == "OAI_BLADERF" ] ; then
|
if [ "$HW" == "OAI_BLADERF" ] ; then
|
||||||
echo_info "installing packages for BALDERF support"
|
echo_info "installing packages for BLADERF support"
|
||||||
check_install_bladerf_driver
|
check_install_bladerf_driver
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -288,9 +380,11 @@ function main() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$oaisim" = "1" ] ; then
|
if [ "$oaisim" = "1" ] ; then
|
||||||
if [ "$HW" != "ETHERNET" ] ; then
|
#to be discussed
|
||||||
HW="NONE"
|
# there is no RF device and no transport protocol
|
||||||
fi
|
HW="None"
|
||||||
|
TP="None"
|
||||||
|
|
||||||
if [ "$XFORMS" == "True" ] ; then
|
if [ "$XFORMS" == "True" ] ; then
|
||||||
PRINT_STATS="True"
|
PRINT_STATS="True"
|
||||||
fi
|
fi
|
||||||
@@ -324,7 +418,9 @@ function main() {
|
|||||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||||
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
|
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
|
||||||
echo "set(PACKAGE_NAME \"${lte_exec}\")" >> $cmake_file
|
echo "set ( TRANSP_PRO \"${TP}\")" >> $cmake_file
|
||||||
|
echo "set(PACKAGE_NAME \"${lte_exec}\")" >> $cmake_file
|
||||||
|
echo "set (LOWLATENCY \"${LOWLATENCY_FLAG_USER}\" )" >>$cmake_file
|
||||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||||
cd $DIR/$lte_build_dir/build
|
cd $DIR/$lte_build_dir/build
|
||||||
cmake ..
|
cmake ..
|
||||||
@@ -416,7 +512,7 @@ function main() {
|
|||||||
|
|
||||||
# EXMIMO drivers & firmware loader
|
# EXMIMO drivers & firmware loader
|
||||||
###############
|
###############
|
||||||
if [ "$HW" = "EXMIMO" -a "$EPC" = "0" ] ; then
|
if [ "$HW" = "EXMIMO" ] ; then
|
||||||
|
|
||||||
echo_info "Compiling Express MIMO 2 board drivers"
|
echo_info "Compiling Express MIMO 2 board drivers"
|
||||||
compilations \
|
compilations \
|
||||||
@@ -529,67 +625,146 @@ function main() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# RRH compilation
|
# RRH compilation
|
||||||
##################
|
#####################
|
||||||
if [ "$RRH" = "1" ] ; then
|
if [ "$RRH" = "1" ] ; then
|
||||||
echo_info "Compiling RRH"
|
|
||||||
if [ $HW == "ETHERNET" ] ; then
|
|
||||||
echo_info "RF frontend for RRH is not defined. This mode is used for testing (loopback)."
|
|
||||||
elif [ $HW != "EXMIMO" -a $HW != "OAI_USRP" -a $HW != "OAI_BLADERF" ] ; then
|
|
||||||
echo_fatal "Hardware not defined ($HW)"
|
|
||||||
fi
|
|
||||||
cmake_file=$DIR/rrh_gw/CMakeLists.txt
|
|
||||||
echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file
|
|
||||||
echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
|
||||||
echo "set(ENABLE_ITTI False )" >> $cmake_file
|
|
||||||
echo "set(RF_BOARD \"${HW}\")" >> $cmake_file
|
|
||||||
echo 'set(PACKAGE_NAME "\"rrh_gw\"")' >> $cmake_file
|
|
||||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
|
||||||
|
|
||||||
[ "$CLEAN" = "1" ] && rm -rf $DIR/rrh_gw/build
|
rrh_exec=rrh_gw
|
||||||
mkdir -p $DIR/rrh_gw/build
|
rrh_build_dir=rrh_gw
|
||||||
cd $DIR/rrh_gw/build
|
|
||||||
cmake ..
|
echo_info "Compiling $rrh_exec ..."
|
||||||
compilations \
|
|
||||||
rrh_gw rrh_gw \
|
[ "$CLEAN" = "1" ] && rm -rf $DIR/rrh_gw/build
|
||||||
rrh_gw $dbin/rrh_gw
|
mkdir -p $DIR/$rrh_build_dir/build
|
||||||
fi
|
cmake_file=$DIR/$rrh_build_dir/CMakeLists.txt
|
||||||
|
echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file
|
||||||
|
echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||||
|
echo "set(ENABLE_ITTI False )" >> $cmake_file
|
||||||
|
echo "set(RF_BOARD \"${HW}\")" >> $cmake_file
|
||||||
|
echo "set(TRANSP_PRO \"${TP}\")" >> $cmake_file
|
||||||
|
echo 'set(PACKAGE_NAME "\"rrh_gw\"")' >> $cmake_file
|
||||||
|
echo "set (LOWLATENCY \"${LOWLATENCY_FLAG_USER}\" )" >>$cmake_file
|
||||||
|
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||||
|
cd $DIR/$rrh_build_dir/build
|
||||||
|
cmake ..
|
||||||
|
compilations \
|
||||||
|
rrh_gw rrh_gw \
|
||||||
|
rrh_gw $dbin/rrh_gw
|
||||||
|
|
||||||
# EPC compilation
|
|
||||||
##################
|
|
||||||
if [ "$EPC" = "1" ] ; then
|
|
||||||
echo_info "Compiling EPC"
|
|
||||||
# Example HSS and EPC run on the same host
|
|
||||||
if [ "$CLEAN" = "1" ]; then
|
|
||||||
$OPENAIR_DIR/cmake_targets/tools/build_epc --clean --debug --transport-tcp-only --transport-prefer-tcp --s6a-server
|
|
||||||
$OPENAIR_DIR/cmake_targets/tools/build_hss --clean --debug --transport-tcp-only --transport-prefer-tcp --fqdn `hostname --fqdn` --connect-to-mme `hostname --fqdn`
|
|
||||||
else
|
|
||||||
$OPENAIR_DIR/cmake_targets/tools/build_epc --debug --transport-tcp-only --transport-prefer-tcp --s6a-server
|
|
||||||
$OPENAIR_DIR/cmake_targets/tools/build_hss --debug --transport-tcp-only --transport-prefer-tcp --fqdn `hostname --fqdn` --connect-to-mme `hostname --fqdn`
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if [ "$INSTALL_SYSTEM_FILES" = "1" ] ;then
|
|
||||||
# if [ -f $dbin/hss.conf ] ; then
|
|
||||||
# sed -e 's/ *= */=/' $dbin/hss.conf > $dconf/hss.conf.nospace
|
|
||||||
# source $dconf/hss.conf.nospace
|
|
||||||
# rm -f $dconf/hss.conf.nospace
|
|
||||||
# create_hss_database root linux "$MYSQL_user" "$MYSQL_pass" "$MYSQL_db"
|
|
||||||
# else
|
|
||||||
# echo_warning "not created HSS database: config not found"
|
|
||||||
# fi
|
|
||||||
# fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# build RF device and transport protocol libraries
|
||||||
|
#####################################
|
||||||
|
if [ "$eNB" = "1" -o "$RRH" = "1" ] ; then
|
||||||
|
|
||||||
|
if [ "$eNB" = "1" ] ; then
|
||||||
|
build_dir=$lte_build_dir
|
||||||
|
else
|
||||||
|
build_dir=$rrh_build_dir
|
||||||
|
fi
|
||||||
|
|
||||||
|
# build RF device libraries (currently EXMIMO is not complied with the rest of HW targets)
|
||||||
|
if [ "$HW" != "None" ] ; then
|
||||||
|
rm -f liboai_device.so
|
||||||
|
rm -f $dbin/liboai_device.so
|
||||||
|
|
||||||
|
|
||||||
|
# link liboai_device.so with the selected RF device library
|
||||||
|
if [ "$HW" == "EXMIMO" ] ; then
|
||||||
|
|
||||||
|
#add exmimo compilation
|
||||||
|
#TODO EXMIMO library support
|
||||||
|
|
||||||
|
echo_info "liboai_device.so is linked to EXMIMO device library"
|
||||||
|
elif [ "$HW" == "OAI_USRP" ] ; then
|
||||||
|
if [ -d "/usr/include/uhd" ] ; then
|
||||||
|
compilations \
|
||||||
|
$build_dir oai_usrpdevif \
|
||||||
|
liboai_usrpdevif.so $dbin/liboai_usrpdevif.so.$REL
|
||||||
|
fi
|
||||||
|
|
||||||
|
ln -s liboai_usrpdevif.so liboai_device.so
|
||||||
|
ln -s $dbin/liboai_usrpdevif.so.$REL $dbin/liboai_device.so
|
||||||
|
echo_info "liboai_device.so is linked to USRP device library"
|
||||||
|
elif [ "$HW" == "OAI_BLADERF" ] ; then
|
||||||
|
if [ -f "/usr/include/libbladeRF.h" ] ; then
|
||||||
|
compilations \
|
||||||
|
$build_dir oai_bladerfdevif \
|
||||||
|
liboai_bladerfdevif.so $dbin/liboai_bladerfdevif.so.$REL
|
||||||
|
fi
|
||||||
|
|
||||||
|
ln -s liboai_bladerfdevif.so liboai_device.so
|
||||||
|
ln -s $dbin/liboai_bladerfdevif.so.$REL $dbin/liboai_device.so
|
||||||
|
echo_info "liboai_device.so is linked to BLADERF device library"
|
||||||
|
elif [ "$HW" == "OAI_LMSSDR" ] ; then
|
||||||
|
# if [ -f "/usr/include/libbladeRF.h" ] ; then
|
||||||
|
compilations \
|
||||||
|
$build_dir oai_lmssdrdevif \
|
||||||
|
liboai_lmssdrdevif.so $dbin/liboai_lmssdrdevif.so.$REL
|
||||||
|
# fi
|
||||||
|
|
||||||
|
ln -s liboai_lmssdrdevif.so liboai_device.so
|
||||||
|
ln -s $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so
|
||||||
|
echo_info "liboai_device.so is linked to LMSSDR device library"
|
||||||
|
else
|
||||||
|
echo_info "liboai_device.so is not linked to any device library"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# build trasport protocol libraries (currently only ETHERNET is available)
|
||||||
|
if [ "$TP" != "None" ] ; then
|
||||||
|
rm -f liboai_transpro.so
|
||||||
|
rm -f $dbin/liboai_transpro.so
|
||||||
|
|
||||||
|
if [ "$TP" == "ETHERNET" ] ; then
|
||||||
|
compilations \
|
||||||
|
$build_dir oai_eth_transpro \
|
||||||
|
liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
|
||||||
|
ln -s liboai_eth_transpro.so liboai_transpro.so
|
||||||
|
ln -s $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
|
||||||
|
echo_info "liboai_transpro.so is linked with ETHERNET library"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Doxygen Support
|
||||||
|
#####################
|
||||||
|
if [ "$BUILD_DOXYGEN" = "1" ] ;then
|
||||||
|
doxygen_log=$OPENAIR_DIR/cmake_targets/log/doxygen.log
|
||||||
|
echo_info "Building doxygen based documentation. The documentation file is located here: $OPENAIR_DIR/targets/DOCS/html/index.html"
|
||||||
|
echo_info "Doxygen Generation log is located here: $doxygen_log"
|
||||||
|
echo_info "Generating doxygen files....please wait"
|
||||||
|
(
|
||||||
|
[ "$CLEAN" = "1" ] && rm -rf $OPENAIR_DIR/cmake_targets/doxygen/build
|
||||||
|
mkdir -p $OPENAIR_DIR/cmake_targets/doxygen/build
|
||||||
|
cd $OPENAIR_DIR/cmake_targets/doxygen/build
|
||||||
|
cmake ..
|
||||||
|
make doc
|
||||||
|
) >& $doxygen_log
|
||||||
|
fi
|
||||||
|
|
||||||
# Auto-tests
|
# Auto-tests
|
||||||
#####################
|
#####################
|
||||||
if [ "$OAI_TEST" = "1" ]; then
|
if [ "$OAI_TEST" = "1" ]; then
|
||||||
echo_info "10. Running OAI pre commit tests (pre-ci) ..."
|
echo_info "10. Running OAI pre commit tests (pre-ci) ..."
|
||||||
|
echo_error "These scripts ASSUME that user is in /etc/sudoers and can execute commands without PASSWORD prompt"
|
||||||
|
echo_error "Add the following lines in /etc/sudoers file to make your __user_name__ sudo without password prompt"
|
||||||
|
echo_error " __your_user_name__ ALL = (ALL:ALL) NOPASSWD: ALL"
|
||||||
|
echo_error " __your_user_name__ ALL = (ALL) NOPASSWD: ALL "
|
||||||
|
echo_info "The log file for the autotest script for debugging is located here: $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log "
|
||||||
|
echo_info "The results of autotests results is located here: $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml "
|
||||||
|
echo_info "You can hit CTRL-C any time to terminate the autotests..."
|
||||||
|
echo "Current User Name: $USER"
|
||||||
|
read -s -p "Enter Password: " mypassword
|
||||||
|
echo -e "\n"
|
||||||
rm -fr $OPENAIR_DIR/cmake_targets/autotests/log
|
rm -fr $OPENAIR_DIR/cmake_targets/autotests/log
|
||||||
mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log
|
mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log
|
||||||
if [ "$RUN_GROUP" -eq "1" ]; then
|
if [ "$RUN_GROUP" -eq "1" ]; then
|
||||||
$SUDO $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -g "$TEST_CASE_GROUP"
|
$OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -g "$TEST_CASE_GROUP" -p $mypassword >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log &
|
||||||
else
|
else
|
||||||
$SUDO $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash
|
$OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -p $mypassword >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log &
|
||||||
fi
|
fi
|
||||||
|
wait
|
||||||
else
|
else
|
||||||
echo_info "10. Bypassing the Tests ..."
|
echo_info "10. Bypassing the Tests ..."
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
|
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
|
||||||
|
set ( ASN_DEBUG False)
|
||||||
set ( ADDR_CONF False )
|
set ( ADDR_CONF False )
|
||||||
set ( DEBUG_OMG False )
|
set ( DEBUG_OMG False )
|
||||||
set ( DISABLE_XER_PRINT False )
|
set ( DISABLE_XER_PRINT False )
|
||||||
set ( DRIVER2013 True )
|
set ( DRIVER2013 True )
|
||||||
set ( EMOS False )
|
set ( EMOS False )
|
||||||
|
set ( EMIT_ASN_DEBUG False )
|
||||||
set ( ENABLE_FXP True )
|
set ( ENABLE_FXP True )
|
||||||
set ( ENABLE_ITTI True )
|
set ( ENABLE_ITTI True )
|
||||||
set ( ENABLE_NAS_UE_LOGGING True )
|
set ( ENABLE_NAS_UE_LOGGING True )
|
||||||
@@ -47,9 +49,9 @@ set ( OAI_EMU False )
|
|||||||
set ( OAISIM False )
|
set ( OAISIM False )
|
||||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
|
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
|
||||||
set ( OAI_NW_DRIVER_USE_NETLINK True )
|
set ( OAI_NW_DRIVER_USE_NETLINK True )
|
||||||
set ( OPENAIR1 False )
|
set ( OPENAIR1 True )
|
||||||
set ( OPENAIR2 False )
|
set ( OPENAIR2 True )
|
||||||
set ( OPENAIR_LTE F )
|
set ( OPENAIR_LTE True )
|
||||||
set ( PACKAGE_NAME "epc_test" )
|
set ( PACKAGE_NAME "epc_test" )
|
||||||
set ( PBS_SIM False )
|
set ( PBS_SIM False )
|
||||||
set ( PDCP_USE_NETLINK True )
|
set ( PDCP_USE_NETLINK True )
|
||||||
@@ -74,4 +76,4 @@ set ( SMBV False )
|
|||||||
set ( TEST_OMG False )
|
set ( TEST_OMG False )
|
||||||
set ( USE_MME "R10" )
|
set ( USE_MME "R10" )
|
||||||
set ( USER_MODE True )
|
set ( USER_MODE True )
|
||||||
set ( XER_PRINT False )
|
set ( XER_PRINT True )
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8)
|
|||||||
set(PACKAGE_NAME "unitary_tests_simulators")
|
set(PACKAGE_NAME "unitary_tests_simulators")
|
||||||
set(PHYSIM True)
|
set(PHYSIM True)
|
||||||
set(RF_BOARD None)
|
set(RF_BOARD None)
|
||||||
set(XFORMS False)
|
set(XFORMS True)
|
||||||
|
|
||||||
set(DEBUG_PHY False)
|
set(DEBUG_PHY False)
|
||||||
set(MU_RECIEVER False)
|
set(MU_RECIEVER False)
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
set(ENABLE_VCD_FIFO False )
|
|
||||||
set(ENABLE_ITTI False )
|
|
||||||
set(RF_BOARD "ETHERNET")
|
|
||||||
set(PACKAGE_NAME "\"rrh_gw\"")
|
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
|
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
################################################################################
|
################################################################################
|
||||||
# file build_helper
|
# file build_helper
|
||||||
# brief
|
# brief
|
||||||
# author Laurent Thomas
|
# authors Laurent Thomas, Lionel GAUTHIER
|
||||||
#
|
#
|
||||||
#######################################
|
#######################################
|
||||||
SUDO='sudo -E'
|
SUDO='sudo -E'
|
||||||
@@ -111,7 +111,12 @@ compilations() {
|
|||||||
cd $OPENAIR_DIR/cmake_targets/$1/build
|
cd $OPENAIR_DIR/cmake_targets/$1/build
|
||||||
{
|
{
|
||||||
rm -f $3
|
rm -f $3
|
||||||
make -j`nproc` $2 VERBOSE=$VERBOSE_COMPILE
|
if [ "$VERBOSE_COMPILE" == "1" ]; then
|
||||||
|
make -j`nproc` $2 VERBOSE=$VERBOSE_COMPILE
|
||||||
|
else
|
||||||
|
make -j`nproc` $2
|
||||||
|
fi
|
||||||
|
|
||||||
} > $dlog/$2.$REL.txt 2>&1
|
} > $dlog/$2.$REL.txt 2>&1
|
||||||
echo_info "Log file for compilation has been written to: $dlog/$2.$REL.txt"
|
echo_info "Log file for compilation has been written to: $dlog/$2.$REL.txt"
|
||||||
if [ -s $3 ] ; then
|
if [ -s $3 ] ; then
|
||||||
@@ -158,19 +163,24 @@ install_gnutls_from_source(){
|
|||||||
|
|
||||||
|
|
||||||
check_install_usrp_uhd_driver(){
|
check_install_usrp_uhd_driver(){
|
||||||
|
#first we remove old installation
|
||||||
|
$SUDO apt-get remove uhd libuhd-dev libuhd003 uhd-host -y
|
||||||
v=$(lsb_release -cs)
|
v=$(lsb_release -cs)
|
||||||
$SUDO apt-add-repository "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
|
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
|
||||||
|
#The new USRP repository
|
||||||
|
$SUDO add-apt-repository ppa:ettusresearch/uhd -y
|
||||||
$SUDO apt-get update
|
$SUDO apt-get update
|
||||||
$SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev
|
$SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev
|
||||||
$SUDO apt-get -y install -t `lsb_release -cs` uhd --force-yes
|
$SUDO apt-get -y install libuhd-dev libuhd003 uhd-host
|
||||||
|
$SUDO uhd_images_downloader
|
||||||
}
|
}
|
||||||
check_install_bladerf_driver(){
|
check_install_bladerf_driver(){
|
||||||
$SUDO add-apt-repository -y ppa:bladerf/bladerf
|
$SUDO add-apt-repository -y ppa:bladerf/bladerf
|
||||||
$SUDO apt-get update
|
$SUDO apt-get update
|
||||||
$SUDO apt-get install -y bladerf libbladerf-dev
|
$SUDO apt-get install -y bladerf libbladerf-dev
|
||||||
$SUDO apt-get install bladerf-firmware-fx3
|
$SUDO apt-get install -y bladerf-firmware-fx3
|
||||||
$SUDO apt-get install bladerf-fpga-hostedx40
|
$SUDO apt-get install -y bladerf-fpga-hostedx40
|
||||||
bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
|
$SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
|
||||||
}
|
}
|
||||||
|
|
||||||
check_install_additional_tools (){
|
check_install_additional_tools (){
|
||||||
@@ -183,7 +193,6 @@ check_install_additional_tools (){
|
|||||||
libboost-all-dev \
|
libboost-all-dev \
|
||||||
libpthread-stubs0-dev \
|
libpthread-stubs0-dev \
|
||||||
openvpn \
|
openvpn \
|
||||||
phpmyadmin \
|
|
||||||
pkg-config \
|
pkg-config \
|
||||||
python-dev \
|
python-dev \
|
||||||
python-pexpect \
|
python-pexpect \
|
||||||
@@ -194,27 +203,27 @@ check_install_additional_tools (){
|
|||||||
unzip \
|
unzip \
|
||||||
valgrind \
|
valgrind \
|
||||||
vlan \
|
vlan \
|
||||||
ctags
|
ctags \
|
||||||
|
ntpdate
|
||||||
}
|
}
|
||||||
|
|
||||||
check_install_oai_software() {
|
check_install_oai_software() {
|
||||||
|
|
||||||
$SUDO apt-get update
|
$SUDO apt-get update
|
||||||
$SUDO apt-get install -y \
|
$SUDO apt-get install -y \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
bison \
|
bison \
|
||||||
build-essential \
|
build-essential \
|
||||||
cmake \
|
cmake \
|
||||||
cmake-curses-gui \
|
cmake-curses-gui \
|
||||||
doxygen \
|
doxygen \
|
||||||
doxygen-gui\
|
doxygen-gui \
|
||||||
texlive-latex-base\
|
texlive-latex-base \
|
||||||
ethtool \
|
ethtool \
|
||||||
flex \
|
flex \
|
||||||
gccxml \
|
gccxml \
|
||||||
gdb \
|
gdb \
|
||||||
git \
|
git \
|
||||||
graphviz \
|
graphviz \
|
||||||
gtkwave \
|
gtkwave \
|
||||||
guile-2.0-dev \
|
guile-2.0-dev \
|
||||||
@@ -233,7 +242,7 @@ check_install_oai_software() {
|
|||||||
libgmp-dev \
|
libgmp-dev \
|
||||||
libgtk-3-dev \
|
libgtk-3-dev \
|
||||||
libidn2-0-dev \
|
libidn2-0-dev \
|
||||||
libidn11-dev \
|
libidn11-dev \
|
||||||
libmysqlclient-dev \
|
libmysqlclient-dev \
|
||||||
liboctave-dev \
|
liboctave-dev \
|
||||||
libpgm-5.1 \
|
libpgm-5.1 \
|
||||||
@@ -255,7 +264,14 @@ check_install_oai_software() {
|
|||||||
openssl \
|
openssl \
|
||||||
python \
|
python \
|
||||||
subversion \
|
subversion \
|
||||||
xmlstarlet
|
xmlstarlet \
|
||||||
|
python-pip \
|
||||||
|
pydb \
|
||||||
|
wvdial \
|
||||||
|
python-numpy \
|
||||||
|
sshpass \
|
||||||
|
libxslt1-dev
|
||||||
|
|
||||||
$SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
|
$SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
|
||||||
if [ `lsb_release -rs` = '12.04' ] ; then
|
if [ `lsb_release -rs` = '12.04' ] ; then
|
||||||
install_nettle_from_source
|
install_nettle_from_source
|
||||||
@@ -263,10 +279,18 @@ check_install_oai_software() {
|
|||||||
else
|
else
|
||||||
$SUDO apt-get install -y libgnutls-dev nettle-dev nettle-bin
|
$SUDO apt-get install -y libgnutls-dev nettle-dev nettle-bin
|
||||||
fi
|
fi
|
||||||
|
$SUDO pip install paramiko
|
||||||
|
$SUDO pip install pyroute2
|
||||||
install_asn1c_from_source
|
install_asn1c_from_source
|
||||||
|
$SUDO rm -fr /opt/ssh
|
||||||
|
$SUDO git clone https://gist.github.com/2190472.git /opt/ssh
|
||||||
}
|
}
|
||||||
|
|
||||||
install_asn1c_from_source(){
|
install_asn1c_from_source(){
|
||||||
|
asn1_install_dir=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt
|
||||||
|
echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_dir "
|
||||||
|
(
|
||||||
|
$SUDO rm -rf /tmp/asn1c-r1516
|
||||||
mkdir -p /tmp/asn1c-r1516
|
mkdir -p /tmp/asn1c-r1516
|
||||||
cd /tmp/asn1c-r1516
|
cd /tmp/asn1c-r1516
|
||||||
rm -rf /tmp/asn1c-r1516/*
|
rm -rf /tmp/asn1c-r1516/*
|
||||||
@@ -274,9 +298,11 @@ install_asn1c_from_source(){
|
|||||||
patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0 >> /tmp/log_compile_asn1c
|
patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0 >> /tmp/log_compile_asn1c
|
||||||
patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0 >> /tmp/log_compile_asn1c
|
patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0 >> /tmp/log_compile_asn1c
|
||||||
patch -p0 < $OPENAIR_DIR/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0 >> /tmp/log_compile_asn1c
|
patch -p0 < $OPENAIR_DIR/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0 >> /tmp/log_compile_asn1c
|
||||||
|
patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 >> /tmp/log_compile_asn1c
|
||||||
./configure
|
./configure
|
||||||
make > /tmp/log_compile_asn1c 2>&1
|
make -j`nproc`
|
||||||
$SUDO make install
|
$SUDO make install
|
||||||
|
) > $asn1_install_dir 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
#################################################
|
#################################################
|
||||||
@@ -302,7 +328,6 @@ install_nas_tools() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
# set_openair_env
|
# set_openair_env
|
||||||
###############################
|
###############################
|
||||||
@@ -319,3 +344,60 @@ set_openair_env(){
|
|||||||
export OPENAIR_TARGETS=$openair_path/targets
|
export OPENAIR_TARGETS=$openair_path/targets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Function to killall the subprocesses when Ctrl-C Key is hit
|
||||||
|
###############################
|
||||||
|
function handle_ctrl_c(){
|
||||||
|
CURPID=$$
|
||||||
|
ppid=$$
|
||||||
|
arraycounter=1
|
||||||
|
echo_info "** Trapped CTRL-C. Killing all subprocesses now..."
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
FORLOOP=FALSE
|
||||||
|
# Get all the child process id
|
||||||
|
for i in `ps -ef| awk '$3 == '$ppid' { print $2 }'`
|
||||||
|
do
|
||||||
|
if [ $i -ne $CURPID ] ; then
|
||||||
|
procid[$arraycounter]=$i
|
||||||
|
arraycounter=`expr $arraycounter + 1`
|
||||||
|
ppid=$i
|
||||||
|
FORLOOP=TRUE
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ "$FORLOOP" = "FALSE" ] ; then
|
||||||
|
arraycounter=`expr $arraycounter - 1`
|
||||||
|
## We want to kill child process id first and then parent id's
|
||||||
|
while [ $arraycounter -ne 0 ]
|
||||||
|
do
|
||||||
|
echo "first we send ctrl-c to program"
|
||||||
|
$SUDO kill -INT "${procid[$arraycounter]}"
|
||||||
|
sleep 5
|
||||||
|
echo "Now we force kill if that didn't work"
|
||||||
|
$SUDO kill -9 "${procid[$arraycounter]}" >/dev/null
|
||||||
|
arraycounter=`expr $arraycounter - 1`
|
||||||
|
done
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# get from http://www.linuxjournal.com/content/validating-ip-address-bash-script
|
||||||
|
validate_ip() {
|
||||||
|
|
||||||
|
local ip=$1
|
||||||
|
local stat=1
|
||||||
|
|
||||||
|
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||||
|
OIFS=$IFS
|
||||||
|
IFS='.'
|
||||||
|
ip=($ip)
|
||||||
|
IFS=$OIFS
|
||||||
|
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
|
||||||
|
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
|
||||||
|
stat=$?
|
||||||
|
fi
|
||||||
|
|
||||||
|
return $stat
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
# Contact Information
|
# Contact Information
|
||||||
# OpenAirInterface Admin: openair_admin@eurecom.fr
|
# OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||||
# OpenAirInterface Tech : openair_tech@eurecom.fr
|
# OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||||
# OpenAirInterface Dev : openair4g-devel@eurecom.fr
|
# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
||||||
#
|
#
|
||||||
# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||||
#
|
#
|
||||||
@@ -121,6 +121,7 @@ function main()
|
|||||||
echo "Cleaning TEST_EPC"
|
echo "Cleaning TEST_EPC"
|
||||||
fi
|
fi
|
||||||
rm -f $OPENAIR_DIR/targets/bin/test_epc_generate_scenario
|
rm -f $OPENAIR_DIR/targets/bin/test_epc_generate_scenario
|
||||||
|
rm -f $OPENAIR_DIR/targets/bin/test_epc_play_scenario
|
||||||
rm -Rf build 2>&1
|
rm -Rf build 2>&1
|
||||||
mkdir -m 777 -p -v build
|
mkdir -m 777 -p -v build
|
||||||
fi
|
fi
|
||||||
@@ -140,6 +141,13 @@ function main()
|
|||||||
compilations \
|
compilations \
|
||||||
epc_test test_epc_generate_scenario \
|
epc_test test_epc_generate_scenario \
|
||||||
test_epc_generate_scenario $dbin/test_epc_generate_scenario
|
test_epc_generate_scenario $dbin/test_epc_generate_scenario
|
||||||
|
|
||||||
|
compilations \
|
||||||
|
epc_test test_epc_play_scenario \
|
||||||
|
test_epc_play_scenario $dbin/test_epc_play_scenario
|
||||||
|
|
||||||
|
$SUDO cp -upv test_epc_generate_scenario /usr/local/bin
|
||||||
|
$SUDO cp -upv test_epc_play_scenario /usr/local/bin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
n=oarf_get_num_detected_cards;
|
||||||
|
for i=n-1:0
|
||||||
|
oarf_stop(i);
|
||||||
|
end
|
||||||
Regular → Executable
@@ -68,7 +68,7 @@ declare MAX_RATE=1000
|
|||||||
|
|
||||||
# set paths to the required binaries and check if the required binaries are available
|
# set paths to the required binaries and check if the required binaries are available
|
||||||
ENB_CONFIG=$OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf
|
ENB_CONFIG=$OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf
|
||||||
OAISIM_EXEC=$OPENAIR_DIR/targets/bin/oaisim_nos1
|
OAISIM_EXEC=$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
|
||||||
BYPASSE_ITTI=0
|
BYPASSE_ITTI=0
|
||||||
OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
|
OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
|
||||||
PS2PDF="ps2pdf"
|
PS2PDF="ps2pdf"
|
||||||
@@ -301,8 +301,8 @@ oaisim_otg_stats(){
|
|||||||
sync
|
sync
|
||||||
|
|
||||||
if [ ! -f $OAISIM_EXEC ]; then
|
if [ ! -f $OAISIM_EXEC ]; then
|
||||||
echo_info "3.1 compiling OAISIM ($OPENAIR_TARGETS/cmake_targets/build_oai --oaisim -c)"
|
echo_info "3.1 compiling OAISIM ($OPENAIR_DIR/cmake_targets/build_oai --oaisim -c --noS1)"
|
||||||
($OPENAIR_TARGETS/cmake_targets/build_oai --oaisim -c >> results/perf_log.txt 2>&1 )
|
($OPENAIR_DIR/cmake_targets/build_oai --oaisim -c --noS1 >> results/perf_log.txt 2>&1 )
|
||||||
build_stats=$?
|
build_stats=$?
|
||||||
if [ $build_stats != 0 ] ; then
|
if [ $build_stats != 0 ] ; then
|
||||||
echo_error "$OAISIM_EXEC cannot be built, check results/perf_log.txt file"
|
echo_error "$OAISIM_EXEC cannot be built, check results/perf_log.txt file"
|
||||||
|
|||||||
@@ -29,9 +29,9 @@
|
|||||||
################################################################################
|
################################################################################
|
||||||
# file run_enb_s1_usrp
|
# file run_enb_s1_usrp
|
||||||
# brief run script for eNB USRP.
|
# brief run script for eNB USRP.
|
||||||
# author Lionel GAUTHIER
|
# author Lionel GAUTHIER and Navid Nikaein
|
||||||
# company Eurecom
|
# company Eurecom
|
||||||
# email: lionel.gauthier@eurecom.fr
|
# email: lionel.gauthier@eurecom.fr and navid.nikaein@eurecom.fr
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
@@ -56,6 +56,8 @@ function help()
|
|||||||
echo_error "Mandatory arguments to long options are mandatory for short options too."
|
echo_error "Mandatory arguments to long options are mandatory for short options too."
|
||||||
echo_error " -g, --gdb Run with GDB."
|
echo_error " -g, --gdb Run with GDB."
|
||||||
echo_error " -h, --help Print this help."
|
echo_error " -h, --help Print this help."
|
||||||
|
echo_error " -e, --ulsch-max-errors num-errs maximum allowed number of uplink errors"
|
||||||
|
echo_error " -f, --rf-config-file filename RF specific configuration file"
|
||||||
echo_error " -K, --itti-dump-file filename ITTI dump file containing all ITTI events occuring during EPC runtime.(can omit file name if last argument)"
|
echo_error " -K, --itti-dump-file filename ITTI dump file containing all ITTI events occuring during EPC runtime.(can omit file name if last argument)"
|
||||||
echo_error " -M, --target-dl-mcs mcs Downlink target MCS."
|
echo_error " -M, --target-dl-mcs mcs Downlink target MCS."
|
||||||
echo_error " -m, --mscgen directory Generate mscgen output files in a directory"
|
echo_error " -m, --mscgen directory Generate mscgen output files in a directory"
|
||||||
@@ -137,7 +139,27 @@ function main()
|
|||||||
shift;
|
shift;
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
-K | --itti-dump-file)
|
-e | --ulsch-max-errors)
|
||||||
|
ulsch_max_errors=$2
|
||||||
|
echo "setting --ulsch-max-errors to $ulsch_max_errors"
|
||||||
|
exe_arguments="$exe_arguments --ulsch-max-errors=$ulsch_max_errors"
|
||||||
|
shift 2;
|
||||||
|
;;
|
||||||
|
-f | --rf-config-file)
|
||||||
|
rf_config_file=$2
|
||||||
|
# can omit file name if last arg on the line
|
||||||
|
if [ "x$rf_config_file" = "x" ]; then
|
||||||
|
rf_config_file=null
|
||||||
|
shift 1;
|
||||||
|
else
|
||||||
|
shift 2;
|
||||||
|
fi
|
||||||
|
if [ "$rf_config_file" != "null" ]; then
|
||||||
|
echo "setting --rf-config-file to $rf_config_file"
|
||||||
|
exe_arguments="$exe_arguments --rf-config-file=$rf_config_file"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
-K | --itti-dump-file)
|
||||||
itti_dump_file=$2
|
itti_dump_file=$2
|
||||||
# can omit file name if last arg on the line
|
# can omit file name if last arg on the line
|
||||||
if [ "x$itti_dump_file" = "x" ]; then
|
if [ "x$itti_dump_file" = "x" ]; then
|
||||||
|
|||||||
Executable
+46
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import time
|
||||||
|
import serial
|
||||||
|
import os
|
||||||
|
from pyroute2 import IPRoute
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import threading
|
||||||
|
import signal
|
||||||
|
import traceback
|
||||||
|
import commands
|
||||||
|
|
||||||
|
if os.environ.get('OPENAIR_DIR') == None:
|
||||||
|
print "Error getting OPENAIR_DIR environment variable"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
sys.path.append(os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/'))
|
||||||
|
|
||||||
|
from lib_autotest import *
|
||||||
|
|
||||||
|
def reset_bladerf():
|
||||||
|
stringIdBladeRF='OpenMoko, Inc'
|
||||||
|
status, out = commands.getstatusoutput('lsusb | grep -i \'' + stringIdBladeRF + '\'')
|
||||||
|
if (out == '') :
|
||||||
|
print "BladeRF not found. Exiting now..."
|
||||||
|
sys.exit()
|
||||||
|
p=re.compile('Bus\s*(\w+)\s*Device\s*(\w+):\s*ID\s*(\w+):(\w+)')
|
||||||
|
res=p.findall(out)
|
||||||
|
BusId=res[0][0]
|
||||||
|
DeviceId=res[0][1]
|
||||||
|
VendorId=res[0][2]
|
||||||
|
ProductId=res[0][3]
|
||||||
|
usb_dir= find_usb_path(VendorId, ProductId)
|
||||||
|
print "BladeRF Found in directory..." + usb_dir
|
||||||
|
cmd = "sudo sh -c \"echo 0 > " + usb_dir + "/authorized\""
|
||||||
|
os.system(cmd + " ; sleep 5" )
|
||||||
|
cmd = "sudo sh -c \"echo 1 > " + usb_dir + "/authorized\""
|
||||||
|
os.system(cmd + " ; sleep 5" )
|
||||||
|
|
||||||
|
os.system ('sudo -E bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img')
|
||||||
|
|
||||||
|
print "Resettting BladeRF..."
|
||||||
|
|
||||||
|
reset_bladerf()
|
||||||
|
|
||||||
|
os.system ("dmesg|tail")
|
||||||
Executable
+17
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "This script stops exmimo2 as it might be transmitting signal by itself if lte-softmodem terminates incorrectly"
|
||||||
|
|
||||||
|
if [ "$OPENAIR_DIR" == "" ]; then
|
||||||
|
echo "Is the OPENAIR_DIR path set correctly? Exiting now"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches'
|
||||||
|
|
||||||
|
#load the module
|
||||||
|
sudo -E $OPENAIR_DIR/cmake_targets/tools/init_exmimo2
|
||||||
|
|
||||||
|
#now we stop the card from transmitting anything
|
||||||
|
cd $OPENAIR_DIR/targets/bin
|
||||||
|
sudo -E octave -H --no-gui $OPENAIR_DIR/cmake_targets/tools/exmimo_stop_octave.m
|
||||||
|
|
||||||
@@ -24,15 +24,18 @@ xUnit_start() {
|
|||||||
# \param $1 classname
|
# \param $1 classname
|
||||||
# \param $2 testcase name
|
# \param $2 testcase name
|
||||||
# \param $3 testcase result
|
# \param $3 testcase result
|
||||||
# \param $4 run index
|
# \param $4 run result
|
||||||
|
# \param $5 XML file local to test case for storing its own results
|
||||||
xUnit_fail() {
|
xUnit_fail() {
|
||||||
class=$1
|
class=$1
|
||||||
test_case=$2
|
test_case=$2
|
||||||
result=$3
|
result=$3
|
||||||
run_index=$4
|
run_result=$4
|
||||||
|
xmlfile_testcase=$5
|
||||||
currtime=$(date +%s.%N)
|
currtime=$(date +%s.%N)
|
||||||
time=$(echo "$currtime - $XUNIT_START" | bc -l)
|
time=$(echo "$currtime - $XUNIT_START" | bc -l)
|
||||||
xml="<testcase classname='$class' name='$test_case' run='$run_index' time='$time' RESULT='$result'></testcase>"
|
xml="<testcase classname='$class' name='$test_case' Run_result='$run_result' time='$time s' RESULT='$result'></testcase>"
|
||||||
|
echo -e $xml >> $xmlfile_testcase
|
||||||
XUNIT_TESTCASES_XML="$XUNIT_TESTCASES_XML \n$xml"
|
XUNIT_TESTCASES_XML="$XUNIT_TESTCASES_XML \n$xml"
|
||||||
XUNIT_FAILED=$((XUNIT_FAILED+1))
|
XUNIT_FAILED=$((XUNIT_FAILED+1))
|
||||||
}
|
}
|
||||||
@@ -43,15 +46,18 @@ xUnit_fail() {
|
|||||||
# \param $1 classname
|
# \param $1 classname
|
||||||
# \param $2 testcase name
|
# \param $2 testcase name
|
||||||
# \param $3 testcase result
|
# \param $3 testcase result
|
||||||
# \param $4 run index
|
# \param $4 run result
|
||||||
|
# \param $5 XML file local to test case for storing its own results
|
||||||
xUnit_success() {
|
xUnit_success() {
|
||||||
class=$1
|
class=$1
|
||||||
test_case=$2
|
test_case=$2
|
||||||
result=$3
|
result=$3
|
||||||
run_index=$4
|
run_result=$4
|
||||||
|
xmlfile_testcase=$5
|
||||||
currtime=$(date +%s.%N)
|
currtime=$(date +%s.%N)
|
||||||
time=$(echo "$currtime - $XUNIT_START" | bc -l)
|
time=$(echo "$currtime - $XUNIT_START" | bc -l)
|
||||||
xml="<testcase classname='$class' name='$test_case' run='$run_index' time='$time' RESULT='$result'></testcase>"
|
xml="<testcase classname='$class' name='$test_case' Run_result='$run_result' time='$time s' RESULT='$result'></testcase>"
|
||||||
|
echo -e $xml >> $xmlfile_testcase
|
||||||
XUNIT_TESTCASES_XML="$XUNIT_TESTCASES_XML \n$xml"
|
XUNIT_TESTCASES_XML="$XUNIT_TESTCASES_XML \n$xml"
|
||||||
XUNIT_SUCCESS=$((XUNIT_SUCCESS+1))
|
XUNIT_SUCCESS=$((XUNIT_SUCCESS+1))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ export OPENAIR1_DIR=$OPENAIR_HOME/openair1
|
|||||||
export OPENAIR2_DIR=$OPENAIR_HOME/openair2
|
export OPENAIR2_DIR=$OPENAIR_HOME/openair2
|
||||||
export OPENAIR3_DIR=$OPENAIR_HOME/openair3
|
export OPENAIR3_DIR=$OPENAIR_HOME/openair3
|
||||||
export OPENAIR_TARGETS=$OPENAIR_HOME/targets
|
export OPENAIR_TARGETS=$OPENAIR_HOME/targets
|
||||||
export OPENAIRITS_DIR=$OPENAIR_HOME/openairITS
|
|
||||||
|
export PATH=$PATH:$OPENAIR_TARGETS/bin
|
||||||
|
|
||||||
alias oai='cd $OPENAIR_HOME'
|
alias oai='cd $OPENAIR_HOME'
|
||||||
alias oai0='cd $OPENAIR0_DIR'
|
alias oai0='cd $OPENAIR0_DIR'
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
#include "PHY/defs.h"
|
#include "PHY/defs.h"
|
||||||
|
#include "assertions.h"
|
||||||
|
|
||||||
//#define cmin(a,b) ((a)<(b) ? (a) : (b))
|
//#define cmin(a,b) ((a)<(b) ? (a) : (b))
|
||||||
|
|
||||||
@@ -515,16 +516,14 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC,
|
|||||||
// if (rvidx==3)
|
// if (rvidx==3)
|
||||||
// for (cnt=0;cnt<Ncb;cnt++)
|
// for (cnt=0;cnt<Ncb;cnt++)
|
||||||
// counter_buffer[rvidx][cnt]=0;
|
// counter_buffer[rvidx][cnt]=0;
|
||||||
if (Ncb<(3*(RTC<<5))) {
|
AssertFatal(Ncb>=(3*RTC<<5),"Exiting, RM condition (Ncb %d, Nir/C %d, Nsoft %d, Kw %d\n",Ncb,Nir/C,Nsoft,3*(RTC<<5));
|
||||||
msg("Exiting, RM condition (Nir %d, Nsoft %d, Kw %d\n",Nir,Nsoft,3*(RTC<<5));
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
Gp = G/Nl/Qm;
|
Gp = G/Nl/Qm;
|
||||||
GpmodC = Gp%C;
|
GpmodC = Gp%C;
|
||||||
|
|
||||||
#ifdef RM_DEBUG
|
#ifdef RM_DEBUG
|
||||||
printf("lte_rate_matching_turbo: Kw %d, rvidx %d, G %d, Qm %d, Nl%d, r %d\n",3*(RTC<<5),rvidx, G, Qm,Nl,r);
|
printf("lte_rate_matching_turbo: Ncb %d, Kw %d, Nir/C %d, rvidx %d, G %d, Qm %d, Nl%d, r %d\n",Ncb,3*(RTC<<5),Nir/C,rvidx, G, Qm,Nl,r);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (r < (C-(GpmodC)))
|
if (r < (C-(GpmodC)))
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <execinfo.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include "SIMULATION/TOOLS/defs.h"
|
||||||
|
#include "PHY/types.h"
|
||||||
|
#include "PHY/defs.h"
|
||||||
|
#include "PHY/extern.h"
|
||||||
|
|
||||||
|
extern PHY_VARS_eNB *PHY_vars_eNB;
|
||||||
|
extern PHY_VARS_UE *PHY_vars_UE;
|
||||||
|
|
||||||
|
void lte_param_init(unsigned char N_tx,
|
||||||
|
unsigned char N_rx,
|
||||||
|
unsigned char transmission_mode,
|
||||||
|
uint8_t extended_prefix_flag,
|
||||||
|
frame_t frame_type,
|
||||||
|
uint16_t Nid_cell,
|
||||||
|
uint8_t tdd_config,
|
||||||
|
uint8_t N_RB_DL,
|
||||||
|
uint8_t threequarter_fs,
|
||||||
|
uint8_t osf,
|
||||||
|
uint32_t perfect_ce)
|
||||||
|
{
|
||||||
|
|
||||||
|
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
|
||||||
|
printf("Start lte_param_init\n");
|
||||||
|
PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
|
||||||
|
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
||||||
|
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
||||||
|
mac_xface = malloc(sizeof(MAC_xface));
|
||||||
|
|
||||||
|
srand(0);
|
||||||
|
randominit(0);
|
||||||
|
set_taus_seed(0);
|
||||||
|
|
||||||
|
lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms);
|
||||||
|
|
||||||
|
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
||||||
|
lte_frame_parms->N_RB_UL = N_RB_DL;
|
||||||
|
lte_frame_parms->threequarter_fs = threequarter_fs;
|
||||||
|
lte_frame_parms->Ncp = extended_prefix_flag;
|
||||||
|
lte_frame_parms->Nid_cell = Nid_cell;
|
||||||
|
lte_frame_parms->nushift = Nid_cell%6;
|
||||||
|
lte_frame_parms->nb_antennas_tx = N_tx;
|
||||||
|
lte_frame_parms->nb_antennas_rx = N_rx;
|
||||||
|
lte_frame_parms->nb_antennas_tx_eNB = N_tx;
|
||||||
|
lte_frame_parms->phich_config_common.phich_resource = one;
|
||||||
|
lte_frame_parms->tdd_config = tdd_config;
|
||||||
|
lte_frame_parms->frame_type = frame_type;
|
||||||
|
// lte_frame_parms->Csrs = 2;
|
||||||
|
// lte_frame_parms->Bsrs = 0;
|
||||||
|
// lte_frame_parms->kTC = 0;44
|
||||||
|
// lte_frame_parms->n_RRC = 0;
|
||||||
|
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
||||||
|
|
||||||
|
init_frame_parms(lte_frame_parms,osf);
|
||||||
|
|
||||||
|
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
||||||
|
|
||||||
|
// phy_init_top(lte_frame_parms); //allocation
|
||||||
|
|
||||||
|
PHY_vars_UE->is_secondary_ue = 0;
|
||||||
|
PHY_vars_UE->lte_frame_parms = *lte_frame_parms;
|
||||||
|
PHY_vars_eNB->lte_frame_parms = *lte_frame_parms;
|
||||||
|
|
||||||
|
phy_init_lte_top(lte_frame_parms);
|
||||||
|
dump_frame_parms(lte_frame_parms);
|
||||||
|
|
||||||
|
PHY_vars_UE->PHY_measurements.n_adj_cells=0;
|
||||||
|
PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1;
|
||||||
|
PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2;
|
||||||
|
|
||||||
|
for (i=0; i<3; i++)
|
||||||
|
lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i);
|
||||||
|
|
||||||
|
phy_init_lte_ue(PHY_vars_UE,1,0);
|
||||||
|
phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
|
||||||
|
|
||||||
|
generate_pcfich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
|
||||||
|
generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
|
||||||
|
|
||||||
|
// DL power control init
|
||||||
|
if (transmission_mode == 1) {
|
||||||
|
PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||||
|
((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 0;
|
||||||
|
PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||||
|
((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 0;
|
||||||
|
} else { // rho_a = rhob
|
||||||
|
PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||||
|
((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 1;
|
||||||
|
PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||||
|
((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
PHY_vars_UE->perfect_ce = perfect_ce;
|
||||||
|
|
||||||
|
printf("Done lte_param_init\n");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -68,33 +68,57 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
msg("Illegal oversampling %d\n",osf);
|
printf("Illegal oversampling %d\n",osf);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (frame_parms->N_RB_DL) {
|
switch (frame_parms->N_RB_DL) {
|
||||||
|
|
||||||
case 100:
|
case 100:
|
||||||
if (osf>1) {
|
if (osf>1) {
|
||||||
msg("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL);
|
printf("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
frame_parms->ofdm_symbol_size = 2048;
|
if (frame_parms->threequarter_fs) {
|
||||||
frame_parms->log2_symbol_size = 11;
|
frame_parms->ofdm_symbol_size = 1536;
|
||||||
frame_parms->samples_per_tti = 30720;
|
frame_parms->samples_per_tti = 23040;
|
||||||
frame_parms->first_carrier_offset = 2048-600;
|
frame_parms->first_carrier_offset = 1536-600;
|
||||||
|
frame_parms->nb_prefix_samples=(frame_parms->nb_prefix_samples*3)>>2;
|
||||||
|
frame_parms->nb_prefix_samples0=(frame_parms->nb_prefix_samples0*3)>>2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
frame_parms->ofdm_symbol_size = 2048;
|
||||||
|
frame_parms->samples_per_tti = 30720;
|
||||||
|
frame_parms->first_carrier_offset = 2048-600;
|
||||||
|
}
|
||||||
|
frame_parms->N_RBGS = 4;
|
||||||
|
frame_parms->N_RBG = 25;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 75:
|
||||||
|
if (osf>1) {
|
||||||
|
printf("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
frame_parms->ofdm_symbol_size = 1536;
|
||||||
|
frame_parms->samples_per_tti = 23040;
|
||||||
|
frame_parms->first_carrier_offset = 1536-450;
|
||||||
|
frame_parms->nb_prefix_samples=(frame_parms->nb_prefix_samples*3)>>2;
|
||||||
|
frame_parms->nb_prefix_samples0=(frame_parms->nb_prefix_samples0*3)>>2;
|
||||||
frame_parms->N_RBGS = 4;
|
frame_parms->N_RBGS = 4;
|
||||||
frame_parms->N_RBG = 25;
|
frame_parms->N_RBG = 25;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50:
|
case 50:
|
||||||
if (osf>1) {
|
if (osf>1) {
|
||||||
msg("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL);
|
printf("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
frame_parms->ofdm_symbol_size = 1024*osf;
|
frame_parms->ofdm_symbol_size = 1024*osf;
|
||||||
frame_parms->log2_symbol_size = 10+log2_osf;
|
|
||||||
frame_parms->samples_per_tti = 15360*osf;
|
frame_parms->samples_per_tti = 15360*osf;
|
||||||
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 300;
|
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 300;
|
||||||
frame_parms->nb_prefix_samples>>=(1-log2_osf);
|
frame_parms->nb_prefix_samples>>=(1-log2_osf);
|
||||||
@@ -105,13 +129,13 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
|||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
if (osf>2) {
|
if (osf>2) {
|
||||||
msg("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL);
|
printf("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
frame_parms->ofdm_symbol_size = 512*osf;
|
frame_parms->ofdm_symbol_size = 512*osf;
|
||||||
|
|
||||||
frame_parms->log2_symbol_size = 9+log2_osf;
|
|
||||||
frame_parms->samples_per_tti = 7680*osf;
|
frame_parms->samples_per_tti = 7680*osf;
|
||||||
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 150;
|
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 150;
|
||||||
frame_parms->nb_prefix_samples>>=(2-log2_osf);
|
frame_parms->nb_prefix_samples>>=(2-log2_osf);
|
||||||
@@ -124,7 +148,6 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
|||||||
|
|
||||||
case 15:
|
case 15:
|
||||||
frame_parms->ofdm_symbol_size = 256*osf;
|
frame_parms->ofdm_symbol_size = 256*osf;
|
||||||
frame_parms->log2_symbol_size = 8+log2_osf;
|
|
||||||
frame_parms->samples_per_tti = 3840*osf;
|
frame_parms->samples_per_tti = 3840*osf;
|
||||||
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 90;
|
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 90;
|
||||||
frame_parms->nb_prefix_samples>>=(3-log2_osf);
|
frame_parms->nb_prefix_samples>>=(3-log2_osf);
|
||||||
@@ -135,7 +158,6 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
|||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
frame_parms->ofdm_symbol_size = 128*osf;
|
frame_parms->ofdm_symbol_size = 128*osf;
|
||||||
frame_parms->log2_symbol_size = 7+log2_osf;
|
|
||||||
frame_parms->samples_per_tti = 1920*osf;
|
frame_parms->samples_per_tti = 1920*osf;
|
||||||
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 36;
|
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 36;
|
||||||
frame_parms->nb_prefix_samples>>=(4-log2_osf);
|
frame_parms->nb_prefix_samples>>=(4-log2_osf);
|
||||||
@@ -145,7 +167,7 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
msg("init_frame_parms: Error: Number of resource blocks (N_RB_DL %d) undefined, frame_parms = %p \n",frame_parms->N_RB_DL, frame_parms);
|
printf("init_frame_parms: Error: Number of resource blocks (N_RB_DL %d) undefined, frame_parms = %p \n",frame_parms->N_RB_DL, frame_parms);
|
||||||
return(-1);
|
return(-1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -159,23 +181,22 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
|||||||
|
|
||||||
void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms)
|
void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms)
|
||||||
{
|
{
|
||||||
msg("frame_parms->N_RB_DL=%d\n",frame_parms->N_RB_DL);
|
printf("frame_parms->N_RB_DL=%d\n",frame_parms->N_RB_DL);
|
||||||
msg("frame_parms->N_RB_UL=%d\n",frame_parms->N_RB_UL);
|
printf("frame_parms->N_RB_UL=%d\n",frame_parms->N_RB_UL);
|
||||||
msg("frame_parms->Nid_cell=%d\n",frame_parms->Nid_cell);
|
printf("frame_parms->Nid_cell=%d\n",frame_parms->Nid_cell);
|
||||||
msg("frame_parms->Ncp=%d\n",frame_parms->Ncp);
|
printf("frame_parms->Ncp=%d\n",frame_parms->Ncp);
|
||||||
msg("frame_parms->Ncp_UL=%d\n",frame_parms->Ncp_UL);
|
printf("frame_parms->Ncp_UL=%d\n",frame_parms->Ncp_UL);
|
||||||
msg("frame_parms->nushift=%d\n",frame_parms->nushift);
|
printf("frame_parms->nushift=%d\n",frame_parms->nushift);
|
||||||
msg("frame_parms->frame_type=%d\n",frame_parms->frame_type);
|
printf("frame_parms->frame_type=%d\n",frame_parms->frame_type);
|
||||||
msg("frame_parms->tdd_config=%d\n",frame_parms->tdd_config);
|
printf("frame_parms->tdd_config=%d\n",frame_parms->tdd_config);
|
||||||
msg("frame_parms->tdd_config_S=%d\n",frame_parms->tdd_config_S);
|
printf("frame_parms->tdd_config_S=%d\n",frame_parms->tdd_config_S);
|
||||||
msg("frame_parms->mode1_flag=%d\n",frame_parms->mode1_flag);
|
printf("frame_parms->mode1_flag=%d\n",frame_parms->mode1_flag);
|
||||||
msg("frame_parms->nb_antennas_tx=%d\n",frame_parms->nb_antennas_tx);
|
printf("frame_parms->nb_antennas_tx=%d\n",frame_parms->nb_antennas_tx);
|
||||||
msg("frame_parms->nb_antennas_rx=%d\n",frame_parms->nb_antennas_rx);
|
printf("frame_parms->nb_antennas_rx=%d\n",frame_parms->nb_antennas_rx);
|
||||||
msg("frame_parms->ofdm_symbol_size=%d\n",frame_parms->ofdm_symbol_size);
|
printf("frame_parms->ofdm_symbol_size=%d\n",frame_parms->ofdm_symbol_size);
|
||||||
msg("frame_parms->log2_symbol_size=%d\n",frame_parms->log2_symbol_size);
|
printf("frame_parms->nb_prefix_samples=%d\n",frame_parms->nb_prefix_samples);
|
||||||
msg("frame_parms->nb_prefix_samples=%d\n",frame_parms->nb_prefix_samples);
|
printf("frame_parms->nb_prefix_samples0=%d\n",frame_parms->nb_prefix_samples0);
|
||||||
msg("frame_parms->nb_prefix_samples0=%d\n",frame_parms->nb_prefix_samples0);
|
printf("frame_parms->first_carrier_offset=%d\n",frame_parms->first_carrier_offset);
|
||||||
msg("frame_parms->first_carrier_offset=%d\n",frame_parms->first_carrier_offset);
|
printf("frame_parms->samples_per_tti=%d\n",frame_parms->samples_per_tti);
|
||||||
msg("frame_parms->samples_per_tti=%d\n",frame_parms->samples_per_tti);
|
printf("frame_parms->symbols_per_tti=%d\n",frame_parms->symbols_per_tti);
|
||||||
msg("frame_parms->symbols_per_tti=%d\n",frame_parms->symbols_per_tti);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,23 +38,16 @@ extern int card;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id)
|
phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
uint16_t rx_power_fil_dB;
|
|
||||||
#ifdef EXMIMO
|
#ifdef EXMIMO
|
||||||
exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
|
exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
#endif
|
#endif
|
||||||
int rssi;
|
|
||||||
|
|
||||||
rssi = dB_fixed(phy_vars_ue->PHY_measurements.rssi);
|
|
||||||
|
|
||||||
if (rssi>0) rx_power_fil_dB = rssi;
|
|
||||||
else rx_power_fil_dB = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id];
|
|
||||||
|
|
||||||
LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n",
|
LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n",
|
||||||
rssi,
|
rx_power_fil_dB,
|
||||||
phy_vars_ue->PHY_measurements.rssi,
|
phy_vars_ue->PHY_measurements.rssi,
|
||||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]
|
phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -213,6 +213,7 @@ int8_t set_RSRQ_filtered(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,floa
|
|||||||
|
|
||||||
//! Automatic gain control
|
//! Automatic gain control
|
||||||
void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
|
void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
|
||||||
|
uint32_t rx_power_fil_dB,
|
||||||
unsigned char eNB_id);
|
unsigned char eNB_id);
|
||||||
|
|
||||||
int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
@@ -243,15 +244,16 @@ 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,uint8_t subframe);
|
int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id,uint8_t subframe);
|
||||||
|
|
||||||
void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
|
int subframe,
|
||||||
module_id_t eNB_id,
|
module_id_t eNB_id,
|
||||||
unsigned char clear);
|
unsigned char clear);
|
||||||
|
|
||||||
void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *phy_vars_eNb,
|
void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
uint8_t sect_id);
|
uint8_t sect_id);
|
||||||
|
|
||||||
|
|
||||||
void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNBy,
|
||||||
module_id_t eNB_id,
|
module_id_t eNB_id,
|
||||||
module_id_t UE_id,
|
module_id_t UE_id,
|
||||||
unsigned char init_averaging);
|
unsigned char init_averaging);
|
||||||
|
|||||||
@@ -710,24 +710,28 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
|||||||
|
|
||||||
void (*idft)(int16_t *,int16_t *, int);
|
void (*idft)(int16_t *,int16_t *, int);
|
||||||
|
|
||||||
switch (phy_vars_ue->lte_frame_parms.log2_symbol_size) {
|
switch (phy_vars_ue->lte_frame_parms.ofdm_symbol_size) {
|
||||||
case 7:
|
case 128:
|
||||||
idft = idft128;
|
idft = idft128;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 256:
|
||||||
idft = idft256;
|
idft = idft256;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 512:
|
||||||
idft = idft512;
|
idft = idft512;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 1024:
|
||||||
idft = idft1024;
|
idft = idft1024;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 1536:
|
||||||
|
idft = idft1536;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2048:
|
||||||
idft = idft2048;
|
idft = idft2048;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -39,57 +39,36 @@
|
|||||||
int32_t rx_power_avg_eNB[3][3];
|
int32_t rx_power_avg_eNB[3][3];
|
||||||
|
|
||||||
|
|
||||||
void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
|
int subframe,
|
||||||
unsigned char eNB_id,
|
unsigned char eNB_id,
|
||||||
unsigned char clear)
|
unsigned char clear)
|
||||||
{
|
{
|
||||||
|
|
||||||
LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNb->lte_eNB_common_vars;
|
LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars;
|
||||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNb->lte_frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||||
PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNb->PHY_measurements_eNB[eNB_id];
|
PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNB->PHY_measurements_eNB[eNB_id];
|
||||||
|
int32_t *rb_mask = phy_vars_eNB->rb_mask_ul;
|
||||||
|
|
||||||
uint32_t aarx,rx_power_correction;
|
uint32_t aarx,rx_power_correction;
|
||||||
uint32_t rb;
|
uint32_t rb;
|
||||||
int32_t *ul_ch;
|
int32_t *ul_ch;
|
||||||
int32_t n0_power_tot;
|
int32_t n0_power_tot;
|
||||||
|
int len;
|
||||||
|
int offset;
|
||||||
|
int Nsymb = (frame_parms->Ncp==NORMAL)?14:12;
|
||||||
// noise measurements
|
// noise measurements
|
||||||
// for the moment we measure the noise on the 7th OFDM symbol (in S subframe)
|
// for the moment we measure the noise on the 7th OFDM symbol (in S subframe)
|
||||||
|
|
||||||
phy_measurements->n0_power_tot = 0;
|
phy_measurements->n0_power_tot = 0;
|
||||||
|
|
||||||
/* printf("rxdataF0 %p, rxdataF1 %p\n",
|
|
||||||
(&eNB_common_vars->rxdataF[0][0][(frame_parms->ofdm_symbol_size + frame_parms->first_carrier_offset)<<1 ]),
|
|
||||||
(&eNB_common_vars->rxdataF[0][1][(frame_parms->ofdm_symbol_size + frame_parms->first_carrier_offset)<<1 ]));
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
for (i=0;i<512;i++)
|
|
||||||
printf("sector 0 antenna 0 : %d,%d\n",((short *)&eNB_common_vars->rxdataF[0][0][(19*frame_parms->ofdm_symbol_size)<<1])[i<<1],
|
|
||||||
((short *)&eNB_common_vars->rxdataF[0][0][(19*frame_parms->ofdm_symbol_size)<<1])[1+(i<<1)]);
|
|
||||||
|
|
||||||
for (i=0;i<12;i++)
|
|
||||||
// printf("sector 0 antenna 1 : %d,%d\n",((short *)&eNB_common_vars->rxdataF[0][1][(19*frame_parms->ofdm_symbol_size)<<1])[i<<1],
|
|
||||||
((short *)&eNB_common_vars->rxdataF[0][1][(19*frame_parms->ofdm_symbol_size)<<1])[1+(i<<1)]);
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( (frame_parms->ofdm_symbol_size == 128) ||
|
|
||||||
(frame_parms->ofdm_symbol_size == 512) )
|
|
||||||
rx_power_correction = 2;
|
|
||||||
else
|
|
||||||
rx_power_correction = 1;
|
|
||||||
|
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
if (clear == 1)
|
if (clear == 1)
|
||||||
phy_measurements->n0_power[aarx]=0;
|
phy_measurements->n0_power[aarx]=0;
|
||||||
|
|
||||||
#ifdef USER_MODE
|
|
||||||
phy_measurements->n0_power[aarx] = ((k1*signal_energy(&eNB_common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size],
|
phy_measurements->n0_power[aarx] = ((k1*signal_energy(&eNB_common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size],
|
||||||
frame_parms->ofdm_symbol_size)) + k2*phy_measurements->n0_power[aarx])>>10;
|
frame_parms->ofdm_symbol_size)) + k2*phy_measurements->n0_power[aarx])>>10;
|
||||||
#else
|
|
||||||
phy_measurements->n0_power[aarx] = ((k1*signal_energy(&eNB_common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size],
|
|
||||||
frame_parms->ofdm_symbol_size))+k2*phy_measurements->n0_power[aarx])>>10;
|
|
||||||
#endif
|
|
||||||
phy_measurements->n0_power[aarx] = (phy_measurements->n0_power[aarx] * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size);
|
phy_measurements->n0_power[aarx] = (phy_measurements->n0_power[aarx] * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size);
|
||||||
phy_measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_measurements->n0_power[aarx]);
|
phy_measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_measurements->n0_power[aarx]);
|
||||||
phy_measurements->n0_power_tot += phy_measurements->n0_power[aarx];
|
phy_measurements->n0_power_tot += phy_measurements->n0_power[aarx];
|
||||||
@@ -97,52 +76,49 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
|||||||
|
|
||||||
phy_measurements->n0_power_tot_dB = (unsigned short) dB_fixed(phy_measurements->n0_power_tot);
|
phy_measurements->n0_power_tot_dB = (unsigned short) dB_fixed(phy_measurements->n0_power_tot);
|
||||||
|
|
||||||
phy_measurements->n0_power_tot_dBm = phy_measurements->n0_power_tot_dB - phy_vars_eNb->rx_total_gain_eNB_dB;
|
phy_measurements->n0_power_tot_dBm = phy_measurements->n0_power_tot_dB - phy_vars_eNB->rx_total_gain_eNB_dB;
|
||||||
// printf("n0_power %d\n",phy_measurements->n0_power_tot_dB);
|
// printf("n0_power %d\n",phy_measurements->n0_power_tot_dB);
|
||||||
|
|
||||||
|
|
||||||
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
||||||
|
|
||||||
n0_power_tot=0;
|
n0_power_tot=0;
|
||||||
|
if ((rb_mask[rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe
|
||||||
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
// select the 7th symbol in an uplink subframe
|
||||||
|
offset = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
||||||
|
offset += (7*frame_parms->ofdm_symbol_size);//(((Nsymb*subframe)+7)*frame_parms->ofdm_symbol_size);
|
||||||
|
ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][offset];
|
||||||
|
len = 12;
|
||||||
|
// just do first half of middle PRB for odd number of PRBs
|
||||||
|
if (((frame_parms->N_RB_UL&1) == 1) &&
|
||||||
|
(rb==(frame_parms->N_RB_UL>>1))) {
|
||||||
|
len=6;
|
||||||
|
}
|
||||||
|
if (clear == 1)
|
||||||
|
phy_measurements->n0_subband_power[aarx][rb]=0;
|
||||||
|
|
||||||
|
AssertFatal(ul_ch, "RX signal buffer (freq) problem");
|
||||||
|
|
||||||
|
|
||||||
if (rb < 12)
|
phy_measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len);
|
||||||
// ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][((19*(frame_parms->ofdm_symbol_size)) + frame_parms->first_carrier_offset + (rb*12))<<1];
|
//((k1*(signal_energy_nodc(ul_ch,len)))
|
||||||
ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][((7*frame_parms->ofdm_symbol_size) + frame_parms->first_carrier_offset + (rb*12))<<1];
|
// + (k2*phy_measurements->n0_subband_power[aarx][rb]));
|
||||||
else if (rb>12)
|
|
||||||
ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][((7*frame_parms->ofdm_symbol_size) + 6 + (rb-13)*12)<<1];
|
phy_measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(phy_measurements->n0_subband_power[aarx][rb]);
|
||||||
else {
|
// printf("subframe %d (%d): eNb %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len),
|
||||||
ul_ch = NULL;
|
// phy_measurements->n0_subband_power_dB[aarx][rb]);
|
||||||
}
|
n0_power_tot += phy_measurements->n0_subband_power[aarx][rb];
|
||||||
|
|
||||||
if (clear == 1)
|
|
||||||
phy_measurements->n0_subband_power[aarx][rb]=0;
|
|
||||||
|
|
||||||
if (ul_ch) {
|
|
||||||
// for (i=0;i<24;i+=2)
|
|
||||||
// printf("re %d => %d\n",i/2,ul_ch[i]);
|
|
||||||
phy_measurements->n0_subband_power[aarx][rb] = ((k1*(signal_energy_nodc(ul_ch,
|
|
||||||
24))*rx_power_correction) + (k2*phy_measurements->n0_subband_power[aarx][rb]))>>11; // 11 and 24 to compensate for repeated signal format
|
|
||||||
|
|
||||||
phy_measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(phy_measurements->n0_subband_power[aarx][rb]);
|
|
||||||
// printf("eNb %d, aarx %d, rb %d : energy %d (%d dB)\n",eNB_id,aarx,rb,signal_energy_nodc(ul_ch,24), phy_measurements->n0_subband_power_dB[aarx][rb]);
|
|
||||||
n0_power_tot += phy_measurements->n0_subband_power[aarx][rb];
|
|
||||||
} else {
|
|
||||||
phy_measurements->n0_subband_power[aarx][rb] = 1;
|
|
||||||
phy_measurements->n0_subband_power_dB[aarx][rb] = -99;
|
|
||||||
n0_power_tot = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
phy_measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot);
|
||||||
|
phy_measurements->n0_subband_power_tot_dBm[rb] = phy_measurements->n0_subband_power_tot_dB[rb] - phy_vars_eNB->rx_total_gain_eNB_dB - dB_fixed(frame_parms->N_RB_UL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
phy_measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot);
|
|
||||||
phy_measurements->n0_subband_power_tot_dBm[rb] = phy_measurements->n0_subband_power_tot_dB[rb] - phy_vars_eNb->rx_total_gain_eNB_dB - 14;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
||||||
unsigned char eNB_id,
|
unsigned char eNB_id,
|
||||||
unsigned char UE_id,
|
unsigned char UE_id,
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com
|
|||||||
{
|
{
|
||||||
|
|
||||||
int i,k;
|
int i,k;
|
||||||
//unsigned short ds = frame_parms->log2_symbol_size - 7;
|
|
||||||
|
|
||||||
sync_corr_ue0 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti);
|
sync_corr_ue0 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti);
|
||||||
sync_corr_ue1 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti);
|
sync_corr_ue1 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti);
|
||||||
@@ -184,13 +183,6 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com
|
|||||||
LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL);
|
LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
frame_parms->twiddle_ifft, /// complex twiddle factors
|
|
||||||
frame_parms->rev, /// bit reversed permutation vector
|
|
||||||
frame_parms->log2_symbol_size,/// log2(FFT_SIZE)
|
|
||||||
(frame_parms->log2_symbol_size/2),
|
|
||||||
0); /// 0 - input is in complex Q1.15 format, 1 - input is in complex redundant Q1.15 format)
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i=0; i<frame_parms->ofdm_symbol_size; i++)
|
for (i=0; i<frame_parms->ofdm_symbol_size; i++)
|
||||||
((int32_t*)primary_synch0_time)[i] = sync_tmp[i];
|
((int32_t*)primary_synch0_time)[i] = sync_tmp[i];
|
||||||
@@ -491,13 +483,10 @@ int lte_sync_time(int **rxdata, ///rx data in time domain
|
|||||||
|
|
||||||
*eNB_id = sync_source;
|
*eNB_id = sync_source;
|
||||||
|
|
||||||
|
LOG_D(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val,dB_fixed(peak_val)/2);
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_PHY
|
#ifdef DEBUG_PHY
|
||||||
msg("[PHY][UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d\n",
|
|
||||||
sync_source,peak_pos,peak_val);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (debug_cnt == 0) {
|
if (debug_cnt == 0) {
|
||||||
write_output("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2);
|
write_output("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2);
|
||||||
write_output("sync_corr1_ue.m","synccorr1",sync_corr_ue1,2*length,1,2);
|
write_output("sync_corr1_ue.m","synccorr1",sync_corr_ue1,2*length,1,2);
|
||||||
|
|||||||
@@ -432,7 +432,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
in_fft_ptr_0 = &temp_in_fft_0[0];
|
in_fft_ptr_0 = &temp_in_fft_0[0];
|
||||||
in_fft_ptr_1 = &temp_in_fft_1[0];
|
in_fft_ptr_1 = &temp_in_fft_1[0];
|
||||||
|
|
||||||
for(j=0; j<(1<<(frame_parms->log2_symbol_size))/12; j++) {
|
for(j=0; j<(frame_parms->ofdm_symbol_size)/12; j++) {
|
||||||
if (j>19) {
|
if (j>19) {
|
||||||
((int16_t*)in_fft_ptr_0)[-40+(2*j)] = ((int16_t*)temp_out_ifft_0)[-80+(2*j)]*rx_power_correction;
|
((int16_t*)in_fft_ptr_0)[-40+(2*j)] = ((int16_t*)temp_out_ifft_0)[-80+(2*j)]*rx_power_correction;
|
||||||
((int16_t*)in_fft_ptr_0)[-40+(2*j)+1] = ((int16_t*)temp_out_ifft_0)[-80+(2*j+1)]*rx_power_correction;
|
((int16_t*)in_fft_ptr_0)[-40+(2*j)+1] = ((int16_t*)temp_out_ifft_0)[-80+(2*j+1)]*rx_power_correction;
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
else if ((p==1) && (l>0))
|
else if ((p==1) && (l>0))
|
||||||
nu = 0;
|
nu = 0;
|
||||||
else {
|
else {
|
||||||
msg("lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l);
|
printf("lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,9 +94,9 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||||
//output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
//output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
||||||
#ifdef DEBUG_DL_CELL_SPEC
|
#ifdef DEBUG_DL_CELL_SPEC
|
||||||
msg("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
|
printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
|
||||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||||
msg("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
printf("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mprime++;
|
mprime++;
|
||||||
@@ -151,7 +151,7 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
else if ((p==1) && (l>0))
|
else if ((p==1) && (l>0))
|
||||||
nu = 0;
|
nu = 0;
|
||||||
else {
|
else {
|
||||||
msg("lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l);
|
printf("lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,9 +177,9 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||||
//output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
//output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
||||||
#ifdef DEBUG_DL_CELL_SPEC
|
#ifdef DEBUG_DL_CELL_SPEC
|
||||||
msg("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
|
printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
|
||||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||||
msg("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
printf("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mprime++;
|
mprime++;
|
||||||
|
|||||||
@@ -1,31 +1,3 @@
|
|||||||
/*******************************************************************************
|
|
||||||
OpenAirInterface
|
|
||||||
Copyright(c) 1999 - 2014 Eurecom
|
|
||||||
|
|
||||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
|
|
||||||
OpenAirInterface is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenAirInterface.The full GNU General Public License is
|
|
||||||
included in this distribution in the file called "COPYING". If not,
|
|
||||||
see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Contact Information
|
|
||||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
|
||||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
|
||||||
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
|
||||||
|
|
||||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
|
||||||
|
|
||||||
*******************************************************************************/
|
|
||||||
short primary_synch0[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0};
|
short primary_synch0[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
short primary_synch1[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,-8086,-24020,-22288,2448,32675,-26120,19784,27073,18458,-16384,28377,25100,21062,-29523,14217,-7292,31945,-13477,-29868,-24020,-22288,27073,18458,25100,21062,-16384,-28378,2448,-32676,-26120,19784,-29523,-14218,-7292,31945,-31754,-8086,-16384,28377,-16384,-28378,-31754,-8086,31311,-9659,27073,-18459,-26120,19784,-29523,14217,32767,-1,25100,21062,2448,-32676,31311,-9659,31311,-9659,2448,-32676,25100,21062,32767,0,-29523,14217,-26120,19784,27073,-18459,31311,-9659,-31754,-8086,-16384,-28378,-16384,28377,-31754,-8086,-7292,31945,-29523,-14218,-26120,19784,2448,-32676,-16384,-28378,25100,21062,27073,18458,-24020,-22288,-13477,-29868,-7292,31945,-29523,14217,25100,21062,-16384,28377,27073,18458,-26120,19784,2448,32675,-24020,-22288,-31754,-8086,32767,0,0,0,0,0,0,0,0,0,0,0};
|
short primary_synch1[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,-8086,-24020,-22288,2448,32675,-26120,19784,27073,18458,-16384,28377,25100,21062,-29523,14217,-7292,31945,-13477,-29868,-24020,-22288,27073,18458,25100,21062,-16384,-28378,2448,-32676,-26120,19784,-29523,-14218,-7292,31945,-31754,-8086,-16384,28377,-16384,-28378,-31754,-8086,31311,-9659,27073,-18459,-26120,19784,-29523,14217,32767,-1,25100,21062,2448,-32676,31311,-9659,31311,-9659,2448,-32676,25100,21062,32767,0,-29523,14217,-26120,19784,27073,-18459,31311,-9659,-31754,-8086,-16384,-28378,-16384,28377,-31754,-8086,-7292,31945,-29523,-14218,-26120,19784,2448,-32676,-16384,-28378,25100,21062,27073,18458,-24020,-22288,-13477,-29868,-7292,31945,-29523,14217,25100,21062,-16384,28377,27073,18458,-26120,19784,2448,32675,-24020,-22288,-31754,-8086,32767,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
short primary_synch2[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,8085,-24020,22287,2448,-32676,-26120,-19785,27073,-18459,-16384,-28378,25100,-21063,-29523,-14218,-7292,-31946,-13477,29867,-24020,22287,27073,-18459,25100,-21063,-16384,28377,2448,32675,-26120,-19785,-29523,14217,-7292,-31946,-31754,8085,-16384,-28378,-16384,28377,-31754,8085,31311,9658,27073,18458,-26120,-19785,-29523,-14218,32767,0,25100,-21063,2448,32675,31311,9658,31311,9658,2448,32675,25100,-21063,32767,0,-29523,-14218,-26120,-19785,27073,18458,31311,9658,-31754,8085,-16384,28377,-16384,-28378,-31754,8085,-7292,-31946,-29523,14217,-26120,-19785,2448,32675,-16384,28377,25100,-21063,27073,-18459,-24020,22287,-13477,29867,-7292,-31946,-29523,-14218,25100,-21063,-16384,-28378,27073,-18459,-26120,-19785,2448,-32676,-24020,22287,-31754,8085,32767,-1,0,0,0,0,0,0,0,0,0,0};
|
short primary_synch2[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,8085,-24020,22287,2448,-32676,-26120,-19785,27073,-18459,-16384,-28378,25100,-21063,-29523,-14218,-7292,-31946,-13477,29867,-24020,22287,27073,-18459,25100,-21063,-16384,28377,2448,32675,-26120,-19785,-29523,14217,-7292,-31946,-31754,8085,-16384,-28378,-16384,28377,-31754,8085,31311,9658,27073,18458,-26120,-19785,-29523,-14218,32767,0,25100,-21063,2448,32675,31311,9658,31311,9658,2448,32675,25100,-21063,32767,0,-29523,-14218,-26120,-19785,27073,18458,31311,9658,-31754,8085,-16384,28377,-16384,-28378,-31754,8085,-7292,-31946,-29523,14217,-26120,-19785,2448,32675,-16384,28377,25100,-21063,27073,-18459,-24020,22287,-13477,29867,-7292,-31946,-29523,-14218,25100,-21063,-16384,-28378,27073,-18459,-26120,-19785,2448,-32676,-24020,22287,-31754,8085,32767,-1,0,0,0,0,0,0,0,0,0,0};
|
||||||
|
|||||||
@@ -2108,14 +2108,14 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
|||||||
if (dci_alloc[i].L == (uint8_t)L) {
|
if (dci_alloc[i].L == (uint8_t)L) {
|
||||||
|
|
||||||
#ifdef DEBUG_DCI_ENCODING
|
#ifdef DEBUG_DCI_ENCODING
|
||||||
LOG_I(PHY,"Generating common DCI %d/%d (nCCE %d) of length %d, aggregation %d (%x)\n",i,num_common_dci,dci_alloc[i].nCCE,dci_alloc[i].dci_length,1<<dci_alloc[i].L,
|
LOG_I(PHY,"Generating common DCI %d/%d (nCCE %d) of length %d, aggregation %d (%x)\n",i,num_common_dci,dci_alloc[i].firstCCE,dci_alloc[i].dci_length,1<<dci_alloc[i].L,
|
||||||
*(unsigned int*)dci_alloc[i].dci_pdu);
|
*(unsigned int*)dci_alloc[i].dci_pdu);
|
||||||
dump_dci(frame_parms,&dci_alloc[i]);
|
dump_dci(frame_parms,&dci_alloc[i]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (dci_alloc[i].nCCE>=0) {
|
if (dci_alloc[i].firstCCE>=0) {
|
||||||
e_ptr = generate_dci0(dci_alloc[i].dci_pdu,
|
e_ptr = generate_dci0(dci_alloc[i].dci_pdu,
|
||||||
e+(72*dci_alloc[i].nCCE),
|
e+(72*dci_alloc[i].firstCCE),
|
||||||
dci_alloc[i].dci_length,
|
dci_alloc[i].dci_length,
|
||||||
dci_alloc[i].L,
|
dci_alloc[i].L,
|
||||||
dci_alloc[i].rnti);
|
dci_alloc[i].rnti);
|
||||||
@@ -2133,9 +2133,9 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
|||||||
dump_dci(frame_parms,&dci_alloc[i]);
|
dump_dci(frame_parms,&dci_alloc[i]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (dci_alloc[i].nCCE >= 0) {
|
if (dci_alloc[i].firstCCE >= 0) {
|
||||||
e_ptr = generate_dci0(dci_alloc[i].dci_pdu,
|
e_ptr = generate_dci0(dci_alloc[i].dci_pdu,
|
||||||
e+(72*dci_alloc[i].nCCE),
|
e+(72*dci_alloc[i].firstCCE),
|
||||||
dci_alloc[i].dci_length,
|
dci_alloc[i].dci_length,
|
||||||
dci_alloc[i].L,
|
dci_alloc[i].L,
|
||||||
dci_alloc[i].rnti);
|
dci_alloc[i].rnti);
|
||||||
@@ -2537,13 +2537,116 @@ uint16_t get_nquad(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uin
|
|||||||
return(Nreg - 4 - (3*Ngroup_PHICH));
|
return(Nreg - 4 - (3*Ngroup_PHICH));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t get_nCCE_max(uint8_t Mod_id,uint8_t CC_id)
|
uint16_t get_nCCE_mac(uint8_t Mod_id,uint8_t CC_id,int num_pdcch_symbols,int subframe)
|
||||||
{
|
{
|
||||||
|
|
||||||
// check for eNB only !
|
// check for eNB only !
|
||||||
return(get_nCCE(3,&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,1)); // 5, 15,21
|
return(get_nCCE(num_pdcch_symbols,
|
||||||
|
&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,
|
||||||
|
get_mi(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int get_nCCE_offset_l1(int *CCE_table,
|
||||||
|
const unsigned char L,
|
||||||
|
const int nCCE,
|
||||||
|
const int common_dci,
|
||||||
|
const unsigned short rnti,
|
||||||
|
const unsigned char subframe)
|
||||||
|
{
|
||||||
|
|
||||||
|
int search_space_free,m,nb_candidates = 0,l,i;
|
||||||
|
unsigned int Yk;
|
||||||
|
/*
|
||||||
|
printf("CCE Allocation: ");
|
||||||
|
for (i=0;i<nCCE;i++)
|
||||||
|
printf("%d.",CCE_table[i]);
|
||||||
|
printf("\n");
|
||||||
|
*/
|
||||||
|
if (common_dci == 1) {
|
||||||
|
// check CCE(0 ... L-1)
|
||||||
|
nb_candidates = (L==4) ? 4 : 2;
|
||||||
|
nb_candidates = min(nb_candidates,nCCE/L);
|
||||||
|
|
||||||
|
// printf("Common DCI nb_candidates %d, L %d\n",nb_candidates,L);
|
||||||
|
|
||||||
|
for (m = nb_candidates-1 ; m >=0 ; m--) {
|
||||||
|
|
||||||
|
search_space_free = 1;
|
||||||
|
for (l=0; l<L; l++) {
|
||||||
|
|
||||||
|
// printf("CCE_table[%d] %d\n",(m*L)+l,CCE_table[(m*L)+l]);
|
||||||
|
if (CCE_table[(m*L) + l] == 1) {
|
||||||
|
search_space_free = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search_space_free == 1) {
|
||||||
|
|
||||||
|
// printf("returning %d\n",m*L);
|
||||||
|
|
||||||
|
for (l=0; l<L; l++)
|
||||||
|
CCE_table[(m*L)+l]=1;
|
||||||
|
return(m*L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
} else { // Find first available in ue specific search space
|
||||||
|
// according to procedure in Section 9.1.1 of 36.213 (v. 8.6)
|
||||||
|
// compute Yk
|
||||||
|
Yk = (unsigned int)rnti;
|
||||||
|
|
||||||
|
for (i=0; i<=subframe; i++)
|
||||||
|
Yk = (Yk*39827)%65537;
|
||||||
|
|
||||||
|
Yk = Yk % (nCCE/L);
|
||||||
|
|
||||||
|
|
||||||
|
switch (L) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
nb_candidates = 6;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
case 8:
|
||||||
|
nb_candidates = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DevParam(L, nCCE, rnti);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(MAC,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates);
|
||||||
|
|
||||||
|
for (m = 0 ; m < nb_candidates ; m++) {
|
||||||
|
search_space_free = 1;
|
||||||
|
|
||||||
|
for (l=0; l<L; l++) {
|
||||||
|
if (CCE_table[(((Yk+m)%(nCCE/L))*L) + l] == 1) {
|
||||||
|
search_space_free = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search_space_free == 1) {
|
||||||
|
for (l=0; l<L; l++)
|
||||||
|
CCE_table[(((Yk+m)%(nCCE/L))*L)+l]=1;
|
||||||
|
|
||||||
|
return(((Yk+m)%(nCCE/L))*L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,
|
void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,
|
||||||
int do_common,
|
int do_common,
|
||||||
uint8_t subframe,
|
uint8_t subframe,
|
||||||
@@ -2691,7 +2794,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,
|
|||||||
dci_alloc[*dci_cnt].dci_length = sizeof_bits;
|
dci_alloc[*dci_cnt].dci_length = sizeof_bits;
|
||||||
dci_alloc[*dci_cnt].rnti = crc;
|
dci_alloc[*dci_cnt].rnti = crc;
|
||||||
dci_alloc[*dci_cnt].L = L;
|
dci_alloc[*dci_cnt].L = L;
|
||||||
dci_alloc[*dci_cnt].nCCE = CCEind;
|
dci_alloc[*dci_cnt].firstCCE = CCEind;
|
||||||
|
|
||||||
if (sizeof_bytes<=4) {
|
if (sizeof_bytes<=4) {
|
||||||
dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[0];
|
dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[0];
|
||||||
|
|||||||
@@ -453,7 +453,7 @@ uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
|
uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
|
||||||
|
|
||||||
int offset;
|
int offset;
|
||||||
|
|
||||||
@@ -926,10 +926,15 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
// printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
|
// 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 = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
|
||||||
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
|
if (vrb_type==LOCALIZED) {
|
||||||
|
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_E(PHY,"Distributed RB allocation not done yet\n");
|
||||||
|
mac_xface->macphy_exit("exiting");
|
||||||
|
}
|
||||||
dlsch0_harq->vrb_type = vrb_type;
|
dlsch0_harq->vrb_type = vrb_type;
|
||||||
dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB;
|
dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB;
|
||||||
RIV_max = RIV_max6;
|
RIV_max = RIV_max6;
|
||||||
@@ -960,7 +965,14 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
|
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
|
||||||
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc];
|
|
||||||
|
if (vrb_type==LOCALIZED) {
|
||||||
|
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_E(PHY,"Distributed RB allocation not done yet\n");
|
||||||
|
mac_xface->macphy_exit("exiting");
|
||||||
|
}
|
||||||
dlsch0_harq->vrb_type = vrb_type;
|
dlsch0_harq->vrb_type = vrb_type;
|
||||||
dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB;
|
dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB;
|
||||||
RIV_max = RIV_max25;
|
RIV_max = RIV_max25;
|
||||||
@@ -987,9 +999,16 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
}
|
}
|
||||||
|
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
if (vrb_type==LOCALIZED) {
|
||||||
|
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc];
|
||||||
|
dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_E(PHY,"Distributed RB allocation not done yet\n");
|
||||||
|
mac_xface->macphy_exit("exiting");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
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->vrb_type = vrb_type;
|
||||||
dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB;
|
dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB;
|
||||||
RIV_max = RIV_max50;
|
RIV_max = RIV_max50;
|
||||||
@@ -1017,10 +1036,17 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
|
||||||
dlsch0_harq->vrb_type = vrb_type;
|
dlsch0_harq->vrb_type = vrb_type;
|
||||||
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
|
if (vrb_type==LOCALIZED) {
|
||||||
dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
|
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
|
||||||
dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
|
dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
|
||||||
dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
|
dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
|
||||||
|
dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_E(PHY,"Distributed RB allocation not done yet\n");
|
||||||
|
mac_xface->macphy_exit("exiting");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB;
|
dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB;
|
||||||
@@ -1102,8 +1128,12 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
|
|
||||||
dlsch[0]->harq_ids[subframe] = harq_pid;
|
dlsch[0]->harq_ids[subframe] = harq_pid;
|
||||||
|
|
||||||
if (dlsch0_harq->round == 0)
|
if (dlsch0_harq->round == 0) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch0_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch[0], harq_pid);
|
||||||
dlsch0_harq->status = ACTIVE;
|
dlsch0_harq->status = ACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1237,6 +1267,9 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
|
|
||||||
|
|
||||||
if (dlsch0_harq->round == 0) {
|
if (dlsch0_harq->round == 0) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch0_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch[0], harq_pid);
|
||||||
dlsch0_harq->status = ACTIVE;
|
dlsch0_harq->status = ACTIVE;
|
||||||
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
||||||
// MCS and TBS don't change across HARQ rounds
|
// MCS and TBS don't change across HARQ rounds
|
||||||
@@ -1605,10 +1638,16 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
|
|
||||||
// reset HARQ process if this is the first transmission
|
// reset HARQ process if this is the first transmission
|
||||||
if (dlsch0_harq->round == 0) {
|
if (dlsch0_harq->round == 0) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch0_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch0, harq_pid);
|
||||||
dlsch0_harq->status = ACTIVE;
|
dlsch0_harq->status = ACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dlsch1_harq->round == 0) {
|
if (dlsch1_harq->round == 0) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch1_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch1, harq_pid);
|
||||||
dlsch1_harq->status = ACTIVE;
|
dlsch1_harq->status = ACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1986,10 +2025,16 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
|
|
||||||
// reset HARQ process if this is the first transmission
|
// reset HARQ process if this is the first transmission
|
||||||
if ((dlsch0->active==1) && (dlsch0_harq->round == 0)) {
|
if ((dlsch0->active==1) && (dlsch0_harq->round == 0)) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch0_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch0, harq_pid);
|
||||||
dlsch0_harq->status = ACTIVE;
|
dlsch0_harq->status = ACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((dlsch1->active==1) && (dlsch1_harq->round == 0)) {
|
if ((dlsch1->active==1) && (dlsch1_harq->round == 0)) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch1_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch1, harq_pid);
|
||||||
dlsch1_harq->status = ACTIVE;
|
dlsch1_harq->status = ACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2131,16 +2176,23 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
// check if either TB is disabled (see 36-213 V8.6 p. 26)
|
// check if either TB is disabled (see 36-213 V8.6 p. 26)
|
||||||
|
|
||||||
|
|
||||||
if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0))
|
if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
|
||||||
|
LOG_W(PHY, "what to do with respect to remove_harq_pid_from_freelist?\n");
|
||||||
dlsch0_harq->status = DISABLED;
|
dlsch0_harq->status = DISABLED;
|
||||||
|
}
|
||||||
|
|
||||||
if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0))
|
if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
|
||||||
|
LOG_W(PHY, "what to do with respect to remove_harq_pid_from_freelist?\n");
|
||||||
dlsch1_harq->status = DISABLED;
|
dlsch1_harq->status = DISABLED;
|
||||||
|
}
|
||||||
|
|
||||||
dlsch0_harq->Nl = 1;
|
dlsch0_harq->Nl = 1;
|
||||||
|
|
||||||
|
|
||||||
if (dlsch0_harq->round == 0) {
|
if (dlsch0_harq->round == 0) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch0_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch0, harq_pid);
|
||||||
dlsch0_harq->status = ACTIVE;
|
dlsch0_harq->status = ACTIVE;
|
||||||
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
||||||
}
|
}
|
||||||
@@ -2305,11 +2357,17 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
|
|
||||||
|
|
||||||
if ((dlsch0_harq->round == 0) && (dlsch0->active == 1) ) {
|
if ((dlsch0_harq->round == 0) && (dlsch0->active == 1) ) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch0_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch0, harq_pid);
|
||||||
dlsch0_harq->status = ACTIVE;
|
dlsch0_harq->status = ACTIVE;
|
||||||
dlsch0_harq->mcs = mcs1;
|
dlsch0_harq->mcs = mcs1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((dlsch1_harq->round == 0) && (dlsch1->active == 1) ) {
|
if ((dlsch1_harq->round == 0) && (dlsch1->active == 1) ) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch1_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch1, harq_pid);
|
||||||
dlsch1_harq->status = ACTIVE;
|
dlsch1_harq->status = ACTIVE;
|
||||||
dlsch1_harq->mcs = mcs2;
|
dlsch1_harq->mcs = mcs2;
|
||||||
}
|
}
|
||||||
@@ -2473,6 +2531,9 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
|
|
||||||
|
|
||||||
if (dlsch0_harq->round == 0) {
|
if (dlsch0_harq->round == 0) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch0_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch0, harq_pid);
|
||||||
dlsch0_harq->status = ACTIVE;
|
dlsch0_harq->status = ACTIVE;
|
||||||
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
||||||
}
|
}
|
||||||
@@ -2602,6 +2663,9 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
|
|
||||||
// dlsch0_harq->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
|
// dlsch0_harq->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
|
||||||
if (dlsch0_harq->round == 0) {
|
if (dlsch0_harq->round == 0) {
|
||||||
|
/* necessary test? */
|
||||||
|
if (dlsch0_harq->status == SCH_IDLE)
|
||||||
|
remove_harq_pid_from_freelist(dlsch0, harq_pid);
|
||||||
dlsch0_harq->status = ACTIVE;
|
dlsch0_harq->status = ACTIVE;
|
||||||
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
||||||
}
|
}
|
||||||
@@ -2644,17 +2708,17 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
|||||||
#ifdef DEBUG_DCI
|
#ifdef DEBUG_DCI
|
||||||
|
|
||||||
if (dlsch0) {
|
if (dlsch0) {
|
||||||
msg("dlsch0 eNB: dlsch0 %p\n",dlsch0);
|
printf("dlsch0 eNB: dlsch0 %p\n",dlsch0);
|
||||||
msg("dlsch0 eNB: rnti %x\n",dlsch0->rnti);
|
printf("dlsch0 eNB: rnti %x\n",dlsch0->rnti);
|
||||||
msg("dlsch0 eNB: NBRB %d\n",dlsch0_harq->nb_rb);
|
printf("dlsch0 eNB: NBRB %d\n",dlsch0_harq->nb_rb);
|
||||||
msg("dlsch0 eNB: rballoc %x\n",dlsch0_harq->rb_alloc[0]);
|
printf("dlsch0 eNB: rballoc %x\n",dlsch0_harq->rb_alloc[0]);
|
||||||
msg("dlsch0 eNB: harq_pid %d\n",harq_pid);
|
printf("dlsch0 eNB: harq_pid %d\n",harq_pid);
|
||||||
msg("dlsch0 eNB: round %d\n",dlsch0_harq->round);
|
printf("dlsch0 eNB: round %d\n",dlsch0_harq->round);
|
||||||
msg("dlsch0 eNB: rvidx %d\n",dlsch0_harq->rvidx);
|
printf("dlsch0 eNB: rvidx %d\n",dlsch0_harq->rvidx);
|
||||||
msg("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB);
|
printf("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB);
|
||||||
msg("dlsch0 eNB: mcs %d\n",dlsch0_harq->mcs);
|
printf("dlsch0 eNB: mcs %d\n",dlsch0_harq->mcs);
|
||||||
msg("dlsch0 eNB: tpmi %d\n",tpmi);
|
printf("dlsch0 eNB: tpmi %d\n",tpmi);
|
||||||
msg("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode);
|
printf("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -5511,15 +5575,15 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
|||||||
#ifdef DEBUG_DCI
|
#ifdef DEBUG_DCI
|
||||||
|
|
||||||
if (dlsch[0]) {
|
if (dlsch[0]) {
|
||||||
msg("PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti);
|
printf("PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti);
|
||||||
msg("PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb);
|
printf("PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb);
|
||||||
msg("PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc[0]);
|
printf("PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc_even[0]);
|
||||||
msg("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid);
|
printf("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid);
|
||||||
msg("PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi);
|
printf("PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi);
|
||||||
msg("PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx);
|
printf("PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx);
|
||||||
msg("PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS);
|
printf("PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS);
|
||||||
msg("PDSCH dlsch0 UE: mcs %d\n",dlsch0_harq->mcs);
|
printf("PDSCH dlsch0 UE: mcs %d\n",dlsch0_harq->mcs);
|
||||||
msg("PDSCH dlsch0 UE: pwr_off %d\n",dlsch0_harq->dl_power_off);
|
printf("PDSCH dlsch0 UE: pwr_off %d\n",dlsch0_harq->dl_power_off);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -258,6 +258,13 @@ typedef struct {
|
|||||||
uint8_t error_threshold;
|
uint8_t error_threshold;
|
||||||
/// Pointers to 8 HARQ processes for the DLSCH
|
/// Pointers to 8 HARQ processes for the DLSCH
|
||||||
LTE_DL_eNB_HARQ_t *harq_processes[8];
|
LTE_DL_eNB_HARQ_t *harq_processes[8];
|
||||||
|
/// circular list of free harq PIDs (the oldest come first)
|
||||||
|
/// (10 is arbitrary value, must be > to max number of DL HARQ processes in LTE)
|
||||||
|
int harq_pid_freelist[10];
|
||||||
|
/// the head position of the free list (if list is free then head=tail)
|
||||||
|
int head_freelist;
|
||||||
|
/// the tail position of the free list
|
||||||
|
int tail_freelist;
|
||||||
/// Number of soft channel bits
|
/// Number of soft channel bits
|
||||||
uint32_t G;
|
uint32_t G;
|
||||||
/// Codebook index for this dlsch (0,1,2,3)
|
/// Codebook index for this dlsch (0,1,2,3)
|
||||||
@@ -266,6 +273,8 @@ typedef struct {
|
|||||||
uint8_t Mdlharq;
|
uint8_t Mdlharq;
|
||||||
/// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
|
/// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
|
||||||
uint8_t Kmimo;
|
uint8_t Kmimo;
|
||||||
|
/// Nsoft parameter related to UE Category
|
||||||
|
uint32_t Nsoft;
|
||||||
/// amplitude of PDSCH (compared to RS) in symbols without pilots
|
/// amplitude of PDSCH (compared to RS) in symbols without pilots
|
||||||
int16_t sqrt_rho_a;
|
int16_t sqrt_rho_a;
|
||||||
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
|
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
|
||||||
@@ -576,13 +585,13 @@ typedef struct {
|
|||||||
/// UL RSSI per receive antenna
|
/// UL RSSI per receive antenna
|
||||||
int32_t UL_rssi[NB_ANTENNAS_RX];
|
int32_t UL_rssi[NB_ANTENNAS_RX];
|
||||||
/// PUCCH1a/b power (digital linear)
|
/// PUCCH1a/b power (digital linear)
|
||||||
int32_t Po_PUCCH;
|
uint32_t Po_PUCCH;
|
||||||
/// PUCCH1a/b power (dBm)
|
/// PUCCH1a/b power (dBm)
|
||||||
int32_t Po_PUCCH_dBm;
|
int32_t Po_PUCCH_dBm;
|
||||||
/// PUCCH1 power (digital linear), conditioned on below threshold
|
/// PUCCH1 power (digital linear), conditioned on below threshold
|
||||||
int32_t Po_PUCCH1_below;
|
uint32_t Po_PUCCH1_below;
|
||||||
/// PUCCH1 power (digital linear), conditioned on above threshold
|
/// PUCCH1 power (digital linear), conditioned on above threshold
|
||||||
int32_t Po_PUCCH1_above;
|
uint32_t Po_PUCCH1_above;
|
||||||
/// Indicator that Po_PUCCH has been updated by PHY
|
/// Indicator that Po_PUCCH has been updated by PHY
|
||||||
int32_t Po_PUCCH_update;
|
int32_t Po_PUCCH_update;
|
||||||
/// DL Wideband CQI index (2 TBs)
|
/// DL Wideband CQI index (2 TBs)
|
||||||
@@ -693,6 +702,8 @@ typedef struct {
|
|||||||
uint8_t Mdlharq;
|
uint8_t Mdlharq;
|
||||||
/// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
|
/// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
|
||||||
uint8_t Kmimo;
|
uint8_t Kmimo;
|
||||||
|
/// Nsoft parameter related to UE Category
|
||||||
|
uint32_t Nsoft;
|
||||||
/// Maximum number of Turbo iterations
|
/// Maximum number of Turbo iterations
|
||||||
uint8_t max_turbo_iterations;
|
uint8_t max_turbo_iterations;
|
||||||
/// accumulated tx power adjustment for PUCCH
|
/// accumulated tx power adjustment for PUCCH
|
||||||
@@ -737,7 +748,7 @@ typedef struct {
|
|||||||
/// Aggregation level
|
/// Aggregation level
|
||||||
uint8_t L;
|
uint8_t L;
|
||||||
/// Position of first CCE of the dci
|
/// Position of first CCE of the dci
|
||||||
int nCCE;
|
int firstCCE;
|
||||||
/// flag to indicate that this is a RA response
|
/// flag to indicate that this is a RA response
|
||||||
boolean_t ra_flag;
|
boolean_t ra_flag;
|
||||||
/// rnti
|
/// rnti
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigned char N_RB_DL, uint8_t abstraction_flag)
|
LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag)
|
||||||
{
|
{
|
||||||
|
|
||||||
LTE_eNB_DLSCH_t *dlsch;
|
LTE_eNB_DLSCH_t *dlsch;
|
||||||
@@ -148,10 +148,14 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne
|
|||||||
bzero(dlsch,sizeof(LTE_eNB_DLSCH_t));
|
bzero(dlsch,sizeof(LTE_eNB_DLSCH_t));
|
||||||
dlsch->Kmimo = Kmimo;
|
dlsch->Kmimo = Kmimo;
|
||||||
dlsch->Mdlharq = Mdlharq;
|
dlsch->Mdlharq = Mdlharq;
|
||||||
|
dlsch->Nsoft = Nsoft;
|
||||||
|
|
||||||
for (i=0; i<10; i++)
|
for (i=0; i<10; i++)
|
||||||
dlsch->harq_ids[i] = Mdlharq;
|
dlsch->harq_ids[i] = Mdlharq;
|
||||||
|
|
||||||
|
dlsch->head_freelist = 0;
|
||||||
|
dlsch->tail_freelist = 0;
|
||||||
|
|
||||||
for (i=0; i<Mdlharq; i++) {
|
for (i=0; i<Mdlharq; i++) {
|
||||||
dlsch->harq_processes[i] = (LTE_DL_eNB_HARQ_t *)malloc16(sizeof(LTE_DL_eNB_HARQ_t));
|
dlsch->harq_processes[i] = (LTE_DL_eNB_HARQ_t *)malloc16(sizeof(LTE_DL_eNB_HARQ_t));
|
||||||
LOG_T(PHY, "Required mem size %d (bw scaling %d), dlsch->harq_processes[%d] %p\n",
|
LOG_T(PHY, "Required mem size %d (bw scaling %d), dlsch->harq_processes[%d] %p\n",
|
||||||
@@ -192,6 +196,8 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne
|
|||||||
msg("Can't get harq_p %d\n",i);
|
msg("Can't get harq_p %d\n",i);
|
||||||
exit_flag=3;
|
exit_flag=3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
put_harq_pid_in_freelist(dlsch, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exit_flag==0) {
|
if (exit_flag==0) {
|
||||||
@@ -395,7 +401,7 @@ int dlsch_encoding(unsigned char *a,
|
|||||||
dlsch->harq_processes[harq_pid]->w[r],
|
dlsch->harq_processes[harq_pid]->w[r],
|
||||||
dlsch->harq_processes[harq_pid]->e+r_offset,
|
dlsch->harq_processes[harq_pid]->e+r_offset,
|
||||||
dlsch->harq_processes[harq_pid]->C, // C
|
dlsch->harq_processes[harq_pid]->C, // C
|
||||||
NSOFT, // Nsoft,
|
dlsch->Nsoft, // Nsoft,
|
||||||
dlsch->Mdlharq,
|
dlsch->Mdlharq,
|
||||||
dlsch->Kmimo,
|
dlsch->Kmimo,
|
||||||
dlsch->harq_processes[harq_pid]->rvidx,
|
dlsch->harq_processes[harq_pid]->rvidx,
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag)
|
LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag)
|
||||||
{
|
{
|
||||||
|
|
||||||
LTE_UE_DLSCH_t *dlsch;
|
LTE_UE_DLSCH_t *dlsch;
|
||||||
@@ -113,6 +113,7 @@ LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t max_turbo_ite
|
|||||||
memset(dlsch,0,sizeof(LTE_UE_DLSCH_t));
|
memset(dlsch,0,sizeof(LTE_UE_DLSCH_t));
|
||||||
dlsch->Kmimo = Kmimo;
|
dlsch->Kmimo = Kmimo;
|
||||||
dlsch->Mdlharq = Mdlharq;
|
dlsch->Mdlharq = Mdlharq;
|
||||||
|
dlsch->Nsoft = Nsoft;
|
||||||
dlsch->max_turbo_iterations = max_turbo_iterations;
|
dlsch->max_turbo_iterations = max_turbo_iterations;
|
||||||
|
|
||||||
for (i=0; i<Mdlharq; i++) {
|
for (i=0; i<Mdlharq; i++) {
|
||||||
@@ -385,7 +386,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
|||||||
(uint8_t*)&dummy_w[r][0],
|
(uint8_t*)&dummy_w[r][0],
|
||||||
dlsch_llr+r_offset,
|
dlsch_llr+r_offset,
|
||||||
harq_process->C,
|
harq_process->C,
|
||||||
NSOFT,
|
dlsch->Nsoft,
|
||||||
dlsch->Mdlharq,
|
dlsch->Mdlharq,
|
||||||
dlsch->Kmimo,
|
dlsch->Kmimo,
|
||||||
harq_process->rvidx,
|
harq_process->rvidx,
|
||||||
|
|||||||
@@ -662,14 +662,16 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
|
if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
|
||||||
if (frame_parms->mode1_flag==0)
|
if (frame_parms->mode1_flag==0)
|
||||||
len = (nb_rb*8)- (2*pbch_pss_sss_adjust/3);
|
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
||||||
else
|
else
|
||||||
len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
|
len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
|
||||||
} else {
|
} else {
|
||||||
len = (nb_rb*12) - pbch_pss_sss_adjust;
|
len = (nb_rb*12) - pbch_pss_sss_adjust;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 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);
|
// 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);
|
||||||
|
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
*llr32 = *rxF;
|
*llr32 = *rxF;
|
||||||
// printf("llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]);
|
// printf("llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]);
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
#include "gain_control.h"
|
#include "gain_control.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OAI_USRP) || defined(EXMIMO)
|
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
|
||||||
#include "common_lib.h"
|
#include "common_lib.h"
|
||||||
extern openair0_config_t openair0_cfg[];
|
extern openair0_config_t openair0_cfg[];
|
||||||
#endif
|
#endif
|
||||||
@@ -280,7 +280,6 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
|||||||
uint8_t flip_fdd_ncp,flip_fdd_ecp,flip_tdd_ncp,flip_tdd_ecp;
|
uint8_t flip_fdd_ncp,flip_fdd_ecp,flip_tdd_ncp,flip_tdd_ecp;
|
||||||
// uint16_t Nid_cell_fdd_ncp=0,Nid_cell_fdd_ecp=0,Nid_cell_tdd_ncp=0,Nid_cell_tdd_ecp=0;
|
// uint16_t Nid_cell_fdd_ncp=0,Nid_cell_fdd_ecp=0,Nid_cell_tdd_ncp=0,Nid_cell_tdd_ecp=0;
|
||||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||||
int i;
|
|
||||||
int ret=-1;
|
int ret=-1;
|
||||||
int aarx,rx_power=0;
|
int aarx,rx_power=0;
|
||||||
/*#ifdef OAI_USRP
|
/*#ifdef OAI_USRP
|
||||||
@@ -291,17 +290,10 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
|||||||
frame_parms->Ncp=NORMAL;
|
frame_parms->Ncp=NORMAL;
|
||||||
frame_parms->frame_type=FDD;
|
frame_parms->frame_type=FDD;
|
||||||
init_frame_parms(frame_parms,1);
|
init_frame_parms(frame_parms,1);
|
||||||
|
/*
|
||||||
// write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||||
|
exit(-1);
|
||||||
/*#ifdef OAI_USRP
|
*/
|
||||||
for (aarx = 0; aarx<frame_parms->nb_antennas_rx;aarx++) {
|
|
||||||
rxdata128 = (__m128i*)phy_vars_ue->lte_ue_common_vars.rxdata[aarx];
|
|
||||||
for (i=0; i<(frame_parms->samples_per_tti*10)>>2; i++) {
|
|
||||||
rxdata128[i] = _mm_srai_epi16(rxdata128[i],4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif*/
|
|
||||||
sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata,
|
sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
(int *)&phy_vars_ue->lte_ue_common_vars.eNb_id);
|
(int *)&phy_vars_ue->lte_ue_common_vars.eNb_id);
|
||||||
@@ -316,30 +308,6 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
|||||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id);
|
LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
|
|
||||||
rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][sync_pos2],
|
|
||||||
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
|
|
||||||
|
|
||||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(rx_power/frame_parms->nb_antennas_rx);
|
|
||||||
|
|
||||||
#ifdef DEBUG_INITIAL_SYNCH
|
|
||||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef EXMIMO
|
|
||||||
|
|
||||||
if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
|
|
||||||
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
|
|
||||||
//phy_adjust_gain(phy_vars_ue,0);
|
|
||||||
gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
|
|
||||||
|
|
||||||
#else
|
|
||||||
#ifndef OAI_USRP
|
|
||||||
phy_adjust_gain(phy_vars_ue,0);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// SSS detection
|
// SSS detection
|
||||||
|
|
||||||
// PSS is hypothesized in last symbol of first slot in Frame
|
// PSS is hypothesized in last symbol of first slot in Frame
|
||||||
@@ -528,20 +496,20 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (phy_vars_ue->UE_scan_carrier == 0) {
|
if (phy_vars_ue->UE_scan_carrier == 0) {
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled==1) {
|
||||||
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id);
|
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id);
|
||||||
//mac_resynch();
|
//mac_resynch();
|
||||||
mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id);
|
mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id);
|
||||||
#endif //OPENAIR2
|
phy_vars_ue->UE_mode[0] = PRACH;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
phy_vars_ue->UE_mode[0] = PUSCH;
|
||||||
|
}
|
||||||
|
|
||||||
generate_pcfich_reg_mapping(frame_parms);
|
generate_pcfich_reg_mapping(frame_parms);
|
||||||
generate_phich_reg_mapping(frame_parms);
|
generate_phich_reg_mapping(frame_parms);
|
||||||
// init_prach625(frame_parms);
|
// init_prach625(frame_parms);
|
||||||
#ifndef OPENAIR2
|
|
||||||
phy_vars_ue->UE_mode[0] = PUSCH;
|
|
||||||
#else
|
|
||||||
phy_vars_ue->UE_mode[0] = PRACH;
|
|
||||||
#endif
|
|
||||||
//phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors=0;
|
//phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors=0;
|
||||||
phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq=0;
|
phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq=0;
|
||||||
//phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=0;
|
//phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=0;
|
||||||
@@ -567,7 +535,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
|||||||
phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration,
|
phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration,
|
||||||
phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource],
|
phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource],
|
||||||
phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB);
|
phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB);
|
||||||
#if defined(OAI_USRP) || defined(EXMIMO)
|
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
|
||||||
LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
|
LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
|
||||||
phy_vars_ue->Mod_id,
|
phy_vars_ue->Mod_id,
|
||||||
phy_vars_ue->frame_rx,
|
phy_vars_ue->frame_rx,
|
||||||
@@ -595,6 +563,65 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// gain control
|
||||||
|
if (ret!=0) { //we are not synched, so we cannot use rssi measurement (which is based on channel estimates)
|
||||||
|
rx_power = 0;
|
||||||
|
|
||||||
|
// do a measurement on the best guess of the PSS
|
||||||
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
|
||||||
|
rx_power += signal_energy(&phy_vars_ue->lte_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; aarx<frame_parms->nb_antennas_rx; aarx++)
|
||||||
|
rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][0],
|
||||||
|
frame_parms->samples_per_tti*10);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// we might add a low-pass filter here later
|
||||||
|
phy_vars_ue->PHY_measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx;
|
||||||
|
|
||||||
|
phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(phy_vars_ue->PHY_measurements.rx_power_avg[0]);
|
||||||
|
|
||||||
|
#ifdef DEBUG_INITIAL_SYNCH
|
||||||
|
LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef EXMIMO
|
||||||
|
if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
|
||||||
|
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
|
||||||
|
//phy_adjust_gain(phy_vars_ue,0);
|
||||||
|
gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
|
||||||
|
|
||||||
|
#else
|
||||||
|
#ifndef OAI_USRP
|
||||||
|
#ifndef OAI_BLADERF
|
||||||
|
#ifndef OAI_LMSSDR
|
||||||
|
phy_adjust_gain(phy_vars_ue,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef EXMIMO
|
||||||
|
if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
|
||||||
|
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
|
||||||
|
//phy_adjust_gain(phy_vars_ue,0);
|
||||||
|
gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
|
||||||
|
|
||||||
|
#else
|
||||||
|
#ifndef OAI_USRP
|
||||||
|
#ifndef OAI_BLADERF
|
||||||
|
#ifndef OAI_LMSSDR
|
||||||
|
phy_adjust_gain(phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// exit_fun("debug exit");
|
// exit_fun("debug exit");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
|
extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
|
||||||
#if defined(OAI_USRP) || defined(EXMIMO)
|
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
#include "common_lib.h"
|
#include "common_lib.h"
|
||||||
extern openair0_config_t openair0_cfg[];
|
extern openair0_config_t openair0_cfg[];
|
||||||
#endif
|
#endif
|
||||||
@@ -67,11 +67,12 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
|
|||||||
|
|
||||||
if ((mode == normal_txrx) || (mode == no_L2_connect)) {
|
if ((mode == normal_txrx) || (mode == no_L2_connect)) {
|
||||||
len += sprintf(&buffer[len], "[UE_PROC] UE %d, RNTI %x\n",phy_vars_ue->Mod_id, phy_vars_ue->lte_ue_pdcch_vars[0]->crnti);
|
len += sprintf(&buffer[len], "[UE_PROC] UE %d, RNTI %x\n",phy_vars_ue->Mod_id, phy_vars_ue->lte_ue_pdcch_vars[0]->crnti);
|
||||||
len += sprintf(&buffer[len],"[UE PROC] RSRP[0] %.2f dBm/RE, RSSI %.2f dBm, RSRQ[0] %.2f dB, N0 %d dBm/RE\n",
|
len += sprintf(&buffer[len],"[UE PROC] RSRP[0] %.2f dBm/RE, RSSI %.2f dBm, RSRQ[0] %.2f dB, N0 %d dBm/RE (NF %.1f dB)\n",
|
||||||
10*log10(phy_vars_ue->PHY_measurements.rsrp[0])-phy_vars_ue->rx_total_gain_dB,
|
10*log10(phy_vars_ue->PHY_measurements.rsrp[0])-phy_vars_ue->rx_total_gain_dB,
|
||||||
10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB,
|
10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB,
|
||||||
10*log10(phy_vars_ue->PHY_measurements.rsrq[0]),
|
10*log10(phy_vars_ue->PHY_measurements.rsrq[0]),
|
||||||
phy_vars_ue->PHY_measurements.n0_power_tot_dBm);
|
phy_vars_ue->PHY_measurements.n0_power_tot_dBm,
|
||||||
|
(double)phy_vars_ue->PHY_measurements.n0_power_tot_dBm+132.24);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
len += sprintf(&buffer[len],
|
len += sprintf(&buffer[len],
|
||||||
@@ -96,20 +97,20 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
|
|||||||
#ifdef EXMIMO
|
#ifdef EXMIMO
|
||||||
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",phy_vars_ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]);
|
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",phy_vars_ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]);
|
||||||
#endif
|
#endif
|
||||||
#ifdef OAI_USRP
|
#if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB);
|
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB);
|
||||||
#endif
|
#endif
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset);
|
len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset);
|
||||||
#endif
|
#endif
|
||||||
len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]);
|
len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]);
|
||||||
len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance);
|
len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance);
|
||||||
if (phy_vars_ue->UE_mode[0]==PUSCH) {
|
if (phy_vars_ue->UE_mode[0]==PUSCH) {
|
||||||
len += sprintf(&buffer[len], "[UE PROC] Po_PUSCH = %d dBm (PL %d dB, Po_NOMINAL_PUSCH %d dBm, PHR %d dB)\n",
|
len += sprintf(&buffer[len], "[UE PROC] Po_PUSCH = %d dBm (PL %d dB, Po_NOMINAL_PUSCH %d dBm, PHR %d dB)\n",
|
||||||
PHY_vars_UE_g[0][0]->ulsch_ue[0]->Po_PUSCH,
|
phy_vars_ue->ulsch_ue[0]->Po_PUSCH,
|
||||||
get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0),
|
get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0),
|
||||||
mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0),
|
phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH,
|
||||||
PHY_vars_UE_g[0][0]->ulsch_ue[0]->PHR);
|
phy_vars_ue->ulsch_ue[0]->PHR);
|
||||||
len += sprintf(&buffer[len], "[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)\n",
|
len += sprintf(&buffer[len], "[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)\n",
|
||||||
get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0)+
|
get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0)+
|
||||||
phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+
|
phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+
|
||||||
@@ -573,12 +574,16 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length)
|
|||||||
phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[0],
|
phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[0],
|
||||||
phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[1]);
|
phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[1]);
|
||||||
|
|
||||||
len += sprintf(&buffer[len],"[eNB PROC] Subband I0: ");
|
len += sprintf(&buffer[len],"[eNB PROC] PRB I0 (%X.%X.%X.%X): ",
|
||||||
|
phy_vars_eNB->rb_mask_ul[0],
|
||||||
for (i=0; i<25; i++)
|
phy_vars_eNB->rb_mask_ul[1],phy_vars_eNB->rb_mask_ul[2],phy_vars_eNB->rb_mask_ul[3]);
|
||||||
len += sprintf(&buffer[len],"%2d ",
|
|
||||||
phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dB[i]);
|
|
||||||
|
|
||||||
|
for (i=0; i<phy_vars_eNB->lte_frame_parms.N_RB_UL; i++) {
|
||||||
|
len += sprintf(&buffer[len],"%4d ",
|
||||||
|
phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dBm[i]);
|
||||||
|
if ((i>0) && ((i%25) == 0))
|
||||||
|
len += sprintf(&buffer[len],"\n");
|
||||||
|
}
|
||||||
len += sprintf(&buffer[len],"\n");
|
len += sprintf(&buffer[len],"\n");
|
||||||
len += sprintf(&buffer[len],"\n[eNB PROC] PERFORMANCE PARAMETERS\n");
|
len += sprintf(&buffer[len],"\n[eNB PROC] PERFORMANCE PARAMETERS\n");
|
||||||
/*
|
/*
|
||||||
@@ -634,11 +639,10 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length)
|
|||||||
dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->ulsch_power[1]),
|
dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->ulsch_power[1]),
|
||||||
phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[0],
|
phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[0],
|
||||||
phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[1],
|
phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[1],
|
||||||
dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH)-phy_vars_eNB->rx_total_gain_eNB_dB,
|
dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB,
|
||||||
phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
|
phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
|
||||||
dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below)-phy_vars_eNB->rx_total_gain_eNB_dB,
|
dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB,
|
||||||
dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above)-phy_vars_eNB->rx_total_gain_eNB_dB,
|
PUCCH1_THRES+phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm-dB_fixed(phy_vars_eNB->lte_frame_parms.N_RB_UL),
|
||||||
PUCCH1_THRES+phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm, //-dB_fixed(phy_vars_eNB->lte_frame_parms.N_RB_UL),
|
|
||||||
phy_vars_eNB->eNB_UE_stats[UE_id].sector);
|
phy_vars_eNB->eNB_UE_stats[UE_id].sector);
|
||||||
|
|
||||||
for(i=0; i<8; i++)
|
for(i=0; i<8; i++)
|
||||||
|
|||||||
@@ -56,15 +56,16 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
|||||||
|
|
||||||
void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch, uint8_t abstraction_flag);
|
void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch, uint8_t abstraction_flag);
|
||||||
|
|
||||||
/** \fn new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t abstraction_flag)
|
/** \fn new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag)
|
||||||
\brief This function allocates structures for a particular DLSCH at eNB
|
\brief This function allocates structures for a particular DLSCH at eNB
|
||||||
@returns Pointer to DLSCH to be removed
|
@returns Pointer to DLSCH to be removed
|
||||||
@param Kmimo Kmimo factor from 36-212/36-213
|
@param Kmimo Kmimo factor from 36-212/36-213
|
||||||
@param Mdlharq Maximum number of HARQ rounds (36-212/36-213)
|
@param Mdlharq Maximum number of HARQ rounds (36-212/36-213)
|
||||||
|
@param Nsoft Soft-LLR buffer size from UE-Category
|
||||||
@params N_RB_DL total number of resource blocks (determine the operating BW)
|
@params N_RB_DL total number of resource blocks (determine the operating BW)
|
||||||
@param abstraction_flag Flag to indicate abstracted interface
|
@param abstraction_flag Flag to indicate abstracted interface
|
||||||
*/
|
*/
|
||||||
LTE_eNB_DLSCH_t *new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t N_RB_DL, uint8_t abstraction_flag);
|
LTE_eNB_DLSCH_t *new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t N_RB_DL, uint8_t abstraction_flag);
|
||||||
|
|
||||||
/** \fn free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
|
/** \fn free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
|
||||||
\brief This function frees memory allocated for a particular DLSCH at UE
|
\brief This function frees memory allocated for a particular DLSCH at UE
|
||||||
@@ -72,11 +73,16 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t N_RB_DL, ui
|
|||||||
*/
|
*/
|
||||||
void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch);
|
void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch);
|
||||||
|
|
||||||
LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t Mdlharq,uint8_t max_turbo_iterations,uint8_t N_RB_UL, uint8_t abstraction_flag);
|
/** \fn new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag)
|
||||||
|
\brief This function allocates structures for a particular DLSCH at eNB
|
||||||
LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag);
|
@returns Pointer to DLSCH to be removed
|
||||||
|
@param Kmimo Kmimo factor from 36-212/36-213
|
||||||
LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char Mdlharq,unsigned char N_RB_UL, uint8_t abstraction_flag);
|
@param Mdlharq Maximum number of HARQ rounds (36-212/36-213)
|
||||||
|
@param Nsoft Soft-LLR buffer size from UE-Category
|
||||||
|
@params N_RB_DL total number of resource blocks (determine the operating BW)
|
||||||
|
@param abstraction_flag Flag to indicate abstracted interface
|
||||||
|
*/
|
||||||
|
LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag);
|
||||||
|
|
||||||
|
|
||||||
void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch, uint8_t abstraction_flag);
|
void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch, uint8_t abstraction_flag);
|
||||||
@@ -1233,11 +1239,20 @@ uint32_t get_TBS_DL(uint8_t mcs, uint16_t nb_rb);
|
|||||||
uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb);
|
uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb);
|
||||||
|
|
||||||
/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
|
/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
|
||||||
|
@param N_RB_DL number of PRB on DL
|
||||||
|
@param indicator for even/odd slot
|
||||||
|
@param vrb vrb index
|
||||||
|
@param Ngap Gap indicator
|
||||||
|
*/
|
||||||
|
uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap);
|
||||||
|
|
||||||
|
/* \brief Return prb for a given vrb index
|
||||||
@param vrb_type VRB type (0=localized,1=distributed)
|
@param vrb_type VRB type (0=localized,1=distributed)
|
||||||
@param rb_alloc_dci rballoc field from DCI
|
@param rb_alloc_dci rballoc field from DCI
|
||||||
*/
|
*/
|
||||||
uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci);
|
uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci);
|
||||||
|
|
||||||
|
|
||||||
/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
|
/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
|
||||||
@returns Transmission mode (1-7)
|
@returns Transmission mode (1-7)
|
||||||
*/
|
*/
|
||||||
@@ -1577,6 +1592,12 @@ uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs);
|
|||||||
|
|
||||||
uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi);
|
uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi);
|
||||||
|
|
||||||
|
int get_nCCE_offset_l1(int *CCE_table,
|
||||||
|
const unsigned char L,
|
||||||
|
const int nCCE,
|
||||||
|
const int common_dci,
|
||||||
|
const unsigned short rnti,
|
||||||
|
const unsigned char subframe);
|
||||||
|
|
||||||
uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi);
|
uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi);
|
||||||
|
|
||||||
@@ -1584,7 +1605,7 @@ uint16_t get_nquad(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uin
|
|||||||
|
|
||||||
uint8_t get_mi(LTE_DL_FRAME_PARMS *frame,uint8_t subframe);
|
uint8_t get_mi(LTE_DL_FRAME_PARMS *frame,uint8_t subframe);
|
||||||
|
|
||||||
uint16_t get_nCCE_max(uint8_t Mod_id,uint8_t CC_id);
|
uint16_t get_nCCE_mac(uint8_t Mod_id,uint8_t CC_id,int num_pdcch_symbols,int subframe);
|
||||||
|
|
||||||
uint8_t get_num_pdcch_symbols(uint8_t num_dci,DCI_ALLOC_t *dci_alloc,LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
|
uint8_t get_num_pdcch_symbols(uint8_t num_dci,DCI_ALLOC_t *dci_alloc,LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
|
||||||
|
|
||||||
@@ -1637,22 +1658,22 @@ void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
|||||||
uint8_t subframe);
|
uint8_t subframe);
|
||||||
|
|
||||||
|
|
||||||
int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
PUCCH_FMT_t fmt,
|
PUCCH_FMT_t fmt,
|
||||||
uint8_t UE_id,
|
uint8_t UE_id,
|
||||||
uint16_t n1_pucch,
|
uint16_t n1_pucch,
|
||||||
uint16_t n2_pucch,
|
uint16_t n2_pucch,
|
||||||
uint8_t shortened_format,
|
uint8_t shortened_format,
|
||||||
uint8_t *payload,
|
uint8_t *payload,
|
||||||
uint8_t subframe,
|
uint8_t subframe,
|
||||||
uint8_t pucch1_thres);
|
uint8_t pucch1_thres);
|
||||||
|
|
||||||
int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
uint8_t UE_index,
|
uint8_t UE_index,
|
||||||
PUCCH_FMT_t fmt,
|
PUCCH_FMT_t fmt,
|
||||||
uint8_t n1_pucch_sel,
|
uint8_t n1_pucch_sel,
|
||||||
uint8_t *payload,
|
uint8_t *payload,
|
||||||
uint8_t subframe);
|
uint8_t subframe);
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -430,15 +430,15 @@ void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
PUCCH_FMT_t fmt,
|
PUCCH_FMT_t fmt,
|
||||||
uint8_t UE_id,
|
uint8_t UE_id,
|
||||||
uint16_t n1_pucch,
|
uint16_t n1_pucch,
|
||||||
uint16_t n2_pucch,
|
uint16_t n2_pucch,
|
||||||
uint8_t shortened_format,
|
uint8_t shortened_format,
|
||||||
uint8_t *payload,
|
uint8_t *payload,
|
||||||
uint8_t subframe,
|
uint8_t subframe,
|
||||||
uint8_t pucch1_thres)
|
uint8_t pucch1_thres)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -446,11 +446,11 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars;
|
LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars;
|
||||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||||
// PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &phy_vars_eNB->pucch_config_dedicated[UE_id];
|
// PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &phy_vars_eNB->pucch_config_dedicated[UE_id];
|
||||||
int8_t sigma2_dB = phy_vars_eNB->PHY_measurements_eNB[0].n0_power_dB[0];
|
int8_t sigma2_dB = phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dB[6];
|
||||||
int32_t *Po_PUCCH = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH);
|
uint32_t *Po_PUCCH = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH);
|
||||||
int32_t *Po_PUCCH_dBm = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_dBm);
|
int32_t *Po_PUCCH_dBm = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_dBm);
|
||||||
int32_t *Po_PUCCH1_below = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below);
|
uint32_t *Po_PUCCH1_below = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below);
|
||||||
int32_t *Po_PUCCH1_above = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above);
|
uint32_t *Po_PUCCH1_above = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above);
|
||||||
int32_t *Po_PUCCH_update = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_update);
|
int32_t *Po_PUCCH_update = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_update);
|
||||||
uint32_t u,v,n,aa;
|
uint32_t u,v,n,aa;
|
||||||
uint32_t z[12*14];
|
uint32_t z[12*14];
|
||||||
@@ -468,7 +468,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
uint32_t symbol_offset;
|
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,chest_re,chest_im;
|
||||||
int32_t stat_re=0,stat_im=0;
|
int32_t stat_re=0,stat_im=0;
|
||||||
int32_t stat,stat_max=0;
|
uint32_t stat,stat_max=0;
|
||||||
|
|
||||||
uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift;
|
uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift;
|
||||||
uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI;
|
uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI;
|
||||||
@@ -478,6 +478,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30;
|
uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30;
|
||||||
uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
|
uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
|
||||||
uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
||||||
|
int chL;
|
||||||
|
|
||||||
if (first_call == 1) {
|
if (first_call == 1) {
|
||||||
for (i=0;i<10;i++) {
|
for (i=0;i<10;i++) {
|
||||||
@@ -508,6 +509,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) {
|
if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) {
|
||||||
LOG_E(PHY,"[eNB] rx_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift);
|
LOG_E(PHY,"[eNB] rx_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift);
|
||||||
return(-1);
|
return(-1);
|
||||||
@@ -737,30 +739,35 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
cfo = (frame_parms->Ncp==0) ? &cfo_pucch_np[14*phase] : &cfo_pucch_ep[12*phase];
|
cfo = (frame_parms->Ncp==0) ? &cfo_pucch_np[14*phase] : &cfo_pucch_ep[12*phase];
|
||||||
|
|
||||||
for (l=0; l<(nsymb>>1); l++) {
|
for (l=0; l<(nsymb>>1); l++) {
|
||||||
stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
|
stat_re += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/nsymb;
|
||||||
stat_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
|
stat_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/nsymb;
|
||||||
off+=2;
|
off+=2;
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) , stat %d\n",subframe,phase,l,re,
|
||||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||||
cfo[l<<1],cfo[1+(l<<1)],
|
cfo[l<<1],cfo[1+(l<<1)],
|
||||||
stat_re,stat_im);
|
stat_re,stat_im,stat);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) {
|
for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) {
|
||||||
stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15);
|
stat_re += (((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15))/nsymb;
|
||||||
stat_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(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))/nsymb;
|
||||||
off+=2;
|
off+=2;
|
||||||
|
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l2,re,
|
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d), stat %d\n",subframe,phase,l2,re,
|
||||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||||
cfo[l2<<1],cfo[1+(l2<<1)],
|
cfo[l2<<1],cfo[1+(l2<<1)],
|
||||||
stat_re,stat_im);
|
stat_re,stat_im,stat);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
stat += (stat_re*stat_re) + (stat_im*stat_im);
|
stat += ((stat_re*stat_re) + (stat_im*stat_im));
|
||||||
|
|
||||||
} //re
|
} //re
|
||||||
} // aa
|
} // aa
|
||||||
|
|
||||||
@@ -772,16 +779,18 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
|
|
||||||
} //phase
|
} //phase
|
||||||
|
|
||||||
stat_max /= (nsymb*12); // normalize to energy per symbol and RE
|
stat_max *= nsymb; // normalize to energy per symbol
|
||||||
|
stat_max /= (frame_parms->N_RB_UL*12); //
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max);
|
LOG_D(PHY,"[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"[eNB] PUCCH fmt0: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max);
|
LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,phase_max);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max;
|
phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max;
|
||||||
|
phy_vars_eNB->pucch1_stats_thres[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres;
|
||||||
phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023;
|
phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -798,13 +807,13 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {
|
if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {
|
||||||
*payload = 1;
|
*payload = 1;
|
||||||
*Po_PUCCH1_above = ((*Po_PUCCH1_above<<9) + (stat_max<<9)+1024)>>10;
|
*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,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*payload = 0;
|
*payload = 0;
|
||||||
*Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10;
|
*Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10;
|
||||||
}
|
}
|
||||||
LOG_D(PHY,"[eNB] PUCCH fmt0: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above));
|
LOG_D(PHY,"[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,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above));
|
||||||
*Po_PUCCH_update = 1;
|
*Po_PUCCH_update = 1;
|
||||||
|
|
||||||
} else if ((fmt == pucch_format1a)||(fmt == pucch_format1b)) {
|
} else if ((fmt == pucch_format1a)||(fmt == pucch_format1b)) {
|
||||||
@@ -813,7 +822,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
LOG_I(PHY,"Doing PUCCH detection for format 1a/1b\n");
|
LOG_I(PHY,"Doing PUCCH detection for format 1a/1b\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (phase=0; phase<7; phase++) {
|
for (phase=3;phase<4;phase++){ //phase=0; phase<7; phase++) {
|
||||||
stat=0;
|
stat=0;
|
||||||
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||||
@@ -844,6 +853,9 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) {
|
for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) {
|
||||||
if ((l2<2) || ((l2>(nsymb>>1) - 3)) ) { // data symbols
|
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_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15);
|
||||||
@@ -863,34 +875,36 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stat += (((stat_re*stat_re)) + ((stat_im*stat_im)) +
|
|
||||||
((stat_ref_re*stat_ref_re)) + ((stat_ref_im*stat_ref_im)));
|
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat);
|
LOG_D(PHY,"aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
stat += ((((stat_re*stat_re)) + ((stat_im*stat_im)) +
|
||||||
|
((stat_ref_re*stat_ref_re)) + ((stat_ref_im*stat_ref_im)))/nsymb);
|
||||||
|
|
||||||
|
|
||||||
} //re
|
} //re
|
||||||
} // aa
|
} // aa
|
||||||
|
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_I(PHY,"phase %d : stat %d\n",phase,stat);
|
LOG_I(PHY,"Format 1A: phase %d : stat %d\n",phase,stat);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (stat>stat_max) {
|
if (stat>stat_max) {
|
||||||
stat_max = stat;
|
stat_max = stat;
|
||||||
phase_max = phase;
|
phase_max = phase;
|
||||||
}
|
}
|
||||||
} //phase
|
} //phase
|
||||||
|
|
||||||
stat_max/=(nsymb*12); //normalize to energy per symbol and RE
|
stat_max/=(12); //normalize to energy per symbol and RE
|
||||||
#ifdef DEBUG_PUCCH_RX
|
//#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, phase_max : %d\n",stat_max,phase_max);
|
LOG_D(PHY,"[eNB] PUCCH fmt1a/b: stat_max : %d, phase_max : %d\n",stat_max,phase_max);
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
stat_re=0;
|
stat_re=0;
|
||||||
stat_im=0;
|
stat_im=0;
|
||||||
LOG_D(PHY,"PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH);
|
LOG_D(PHY,"PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH);
|
||||||
*Po_PUCCH = ((*Po_PUCCH<<9) + (stat_max<<9)+1024)>>10;
|
*Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1));
|
||||||
*Po_PUCCH_dBm = dB_fixed(*Po_PUCCH) - phy_vars_eNB->rx_total_gain_eNB_dB;
|
*Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - phy_vars_eNB->rx_total_gain_eNB_dB;
|
||||||
*Po_PUCCH_update = 1;
|
*Po_PUCCH_update = 1;
|
||||||
|
|
||||||
LOG_D(PHY,"PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n",
|
LOG_D(PHY,"PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n",
|
||||||
@@ -906,6 +920,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
|
|
||||||
*Po_PUCCH = ((*Po_PUCCH*1023) + stat_max)>>10;
|
*Po_PUCCH = ((*Po_PUCCH*1023) + stat_max)>>10;
|
||||||
|
|
||||||
|
chL = (nsymb>>1)-4;
|
||||||
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||||
for (re=0; re<12; re++) {
|
for (re=0; re<12; re++) {
|
||||||
chest_re=0;
|
chest_re=0;
|
||||||
@@ -915,8 +931,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
// channel estimate for first slot
|
// channel estimate for first slot
|
||||||
for (l=2; l<(nsymb>>1)-2; l++) {
|
for (l=2; l<(nsymb>>1)-2; l++) {
|
||||||
off=(re<<1) + (24*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);
|
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);
|
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
|
#ifdef DEBUG_PUCCH_RX
|
||||||
@@ -928,8 +944,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
off=(re<<1) + (24*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_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);
|
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);
|
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);
|
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||||
off+=2;
|
off+=2;
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||||
@@ -943,8 +959,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
off=(re<<1) + (24*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_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);
|
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);
|
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);
|
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15)/4);
|
||||||
off+=2;
|
off+=2;
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||||
@@ -960,8 +976,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
// channel estimate for second slot
|
// channel estimate for second slot
|
||||||
for (l=2; l<(nsymb>>1)-2; l++) {
|
for (l=2; l<(nsymb>>1)-2; l++) {
|
||||||
off=(re<<1) + (24*l) + (nsymb>>1)*24;
|
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);
|
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);
|
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
|
#ifdef DEBUG_PUCCH_RX
|
||||||
@@ -973,8 +989,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
off=(re<<1) + (24*l) + (nsymb>>1)*24;
|
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_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);
|
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);
|
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);
|
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||||
off+=2;
|
off+=2;
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||||
@@ -988,8 +1004,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
off=(re<<1) + (24*l) + (nsymb>>1)*24;
|
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_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);
|
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)>>9) + ((tmp_im*chest_im)>>9);
|
stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
|
||||||
stat_im += ((tmp_re*chest_im)>>9) - ((tmp_im*chest_re)>>9);
|
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||||
off+=2;
|
off+=2;
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||||
@@ -1007,20 +1023,27 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
} // aa
|
} // aa
|
||||||
|
|
||||||
#ifdef DEBUG_PUCCH_RX
|
#ifdef DEBUG_PUCCH_RX
|
||||||
LOG_D(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im,
|
LOG_I(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im,
|
||||||
(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]));
|
(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe])])[0] = stat_re;
|
|
||||||
((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe])])[1] = stat_im;
|
|
||||||
phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
|
|
||||||
|
|
||||||
|
phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re);
|
||||||
|
phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im);
|
||||||
|
phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*payload = (stat_re<0) ? 1 : 0;
|
*payload = (stat_re<0) ? 1 : 0;
|
||||||
|
|
||||||
if (fmt==pucch_format1b)
|
if (fmt==pucch_format1b)
|
||||||
*(1+payload) = (stat_im<0) ? 1 : 0;
|
*(1+payload) = (stat_im<0) ? 1 : 0;
|
||||||
} else { // insufficient energy on PUCCH so NAK
|
} else { // insufficient energy on PUCCH so NAK
|
||||||
*payload = 0;
|
*payload = 0;
|
||||||
|
((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re);
|
||||||
|
((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im);
|
||||||
|
phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
|
||||||
|
|
||||||
|
*payload = (stat_re<0) ? 1 : 0;
|
||||||
|
|
||||||
if (fmt==pucch_format1b)
|
if (fmt==pucch_format1b)
|
||||||
*(1+payload) = 0;
|
*(1+payload) = 0;
|
||||||
@@ -1054,7 +1077,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (UE_id==NB_UE_INST) {
|
if (UE_id==NB_UE_INST) {
|
||||||
LOG_E(PHY,"rx_pucch_emul: FATAL, didn't find UE with rnti %x\n",rnti);
|
LOG_W(PHY,"rx_pucch_emul: Didn't find UE with rnti %x\n",rnti);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1657,8 +1657,15 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i=0; i<frame_parms->nb_antennas_rx; i++) {
|
for (i=0; i<frame_parms->nb_antennas_rx; i++) {
|
||||||
|
/*
|
||||||
eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
|
eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
|
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||||
|
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12);
|
||||||
|
|
||||||
#ifdef LOCALIZATION
|
#ifdef LOCALIZATION
|
||||||
eNB_pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t));
|
eNB_pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t));
|
||||||
eNB_pusch_vars->active_subcarrier = subcarrier_energy(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
|
eNB_pusch_vars->active_subcarrier = subcarrier_energy(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||||
|
|||||||
@@ -34,12 +34,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\fn void PHY_ofdm_mod(int *input,int *output,unsigned char log2fftsize,unsigned char nb_symbols,unsigned short nb_prefix_samples,Extension_t etype)
|
\fn void PHY_ofdm_mod(int *input,int *output,int fftsize,unsigned char nb_symbols,unsigned short nb_prefix_samples,Extension_t etype)
|
||||||
This function performs OFDM modulation with cyclic extension or zero-padding.
|
This function performs OFDM modulation with cyclic extension or zero-padding.
|
||||||
|
|
||||||
@param input The sequence input samples in the frequency-domain. This is a concatenation of the input symbols in SIMD redundant format
|
@param input The sequence input samples in the frequency-domain. This is a concatenation of the input symbols in SIMD redundant format
|
||||||
@param output The time-domain output signal
|
@param output The time-domain output signal
|
||||||
@param log2fftsize Base-2 logarithm of the OFDM symbol size (\f$N_d\f$)
|
@param fftsize size of OFDM symbol size (\f$N_d\f$)
|
||||||
@param nb_symbols The number of OFDM symbols in the block
|
@param nb_symbols The number of OFDM symbols in the block
|
||||||
@param nb_prefix_samples The number of prefix/suffix/zero samples
|
@param nb_prefix_samples The number of prefix/suffix/zero samples
|
||||||
@param etype Type of extension (CYCLIC_PREFIX,CYCLIC_SUFFIX,ZEROS)
|
@param etype Type of extension (CYCLIC_PREFIX,CYCLIC_SUFFIX,ZEROS)
|
||||||
@@ -47,7 +47,7 @@ This function performs OFDM modulation with cyclic extension or zero-padding.
|
|||||||
*/
|
*/
|
||||||
void PHY_ofdm_mod(int *input,
|
void PHY_ofdm_mod(int *input,
|
||||||
int *output,
|
int *output,
|
||||||
unsigned char log2fftsize,
|
int fftsize,
|
||||||
unsigned char nb_symbols,
|
unsigned char nb_symbols,
|
||||||
unsigned short nb_prefix_samples,
|
unsigned short nb_prefix_samples,
|
||||||
Extension_t etype
|
Extension_t etype
|
||||||
|
|||||||
@@ -61,9 +61,9 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA
|
|||||||
txdata+(i*(frame_parms->samples_per_tti>>1)));
|
txdata+(i*(frame_parms->samples_per_tti>>1)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PHY_ofdm_mod(txdataF+(i*NUMBER_OF_OFDM_CARRIERS*frame_parms->symbols_per_tti>>1), // input
|
PHY_ofdm_mod(txdataF+(i*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti>>1), // input
|
||||||
txdata+(i*frame_parms->samples_per_tti>>1), // output
|
txdata+(i*frame_parms->samples_per_tti>>1), // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
1, // number of symbols
|
1, // number of symbols
|
||||||
frame_parms->nb_prefix_samples0, // number of prefix samples
|
frame_parms->nb_prefix_samples0, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -71,9 +71,9 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA
|
|||||||
printf("slot i %d (txdata offset %d)\n",i,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(i*frame_parms->samples_per_tti>>1));
|
printf("slot i %d (txdata offset %d)\n",i,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(i*frame_parms->samples_per_tti>>1));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PHY_ofdm_mod(txdataF+NUMBER_OF_OFDM_CARRIERS+(i*NUMBER_OF_OFDM_CARRIERS*(frame_parms->symbols_per_tti>>1)), // input
|
PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size+(i*frame_parms->ofdm_symbol_size*(frame_parms->symbols_per_tti>>1)), // input
|
||||||
txdata+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(i*(frame_parms->samples_per_tti>>1)), // output
|
txdata+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(i*(frame_parms->samples_per_tti>>1)), // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
(short_offset==1) ? 1 :(frame_parms->symbols_per_tti>>1)-1,//6, // number of symbols
|
(short_offset==1) ? 1 :(frame_parms->symbols_per_tti>>1)-1,//6, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -84,7 +84,7 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA
|
|||||||
|
|
||||||
void PHY_ofdm_mod(int *input, /// pointer to complex input
|
void PHY_ofdm_mod(int *input, /// pointer to complex input
|
||||||
int *output, /// pointer to complex output
|
int *output, /// pointer to complex output
|
||||||
unsigned char log2fftsize, /// log2(FFT_SIZE)
|
int fftsize, /// FFT_SIZE
|
||||||
unsigned char nb_symbols, /// number of OFDM symbols
|
unsigned char nb_symbols, /// number of OFDM symbols
|
||||||
unsigned short nb_prefix_samples, /// cyclic prefix length
|
unsigned short nb_prefix_samples, /// cyclic prefix length
|
||||||
Extension_t etype /// type of extension
|
Extension_t etype /// type of extension
|
||||||
@@ -100,24 +100,28 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
int *temp_ptr=(int*)0;
|
int *temp_ptr=(int*)0;
|
||||||
void (*idft)(int16_t *,int16_t *, int);
|
void (*idft)(int16_t *,int16_t *, int);
|
||||||
|
|
||||||
switch (log2fftsize) {
|
switch (fftsize) {
|
||||||
case 7:
|
case 128:
|
||||||
idft = idft128;
|
idft = idft128;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 256:
|
||||||
idft = idft256;
|
idft = idft256;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 512:
|
||||||
idft = idft512;
|
idft = idft512;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 1024:
|
||||||
idft = idft1024;
|
idft = idft1024;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 1536:
|
||||||
|
idft = idft1536;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2048:
|
||||||
idft = idft2048;
|
idft = idft2048;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -127,8 +131,8 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_OFDM_MOD
|
#ifdef DEBUG_OFDM_MOD
|
||||||
msg("[PHY] OFDM mod (size %d,prefix %d) Symbols %d, input %p, output %p\n",
|
printf("[PHY] OFDM mod (size %d,prefix %d) Symbols %d, input %p, output %p\n",
|
||||||
1<<log2fftsize,nb_prefix_samples,nb_symbols,input,output);
|
fftsize,nb_prefix_samples,nb_symbols,input,output);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -136,49 +140,45 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
for (i=0; i<nb_symbols; i++) {
|
for (i=0; i<nb_symbols; i++) {
|
||||||
|
|
||||||
#ifdef DEBUG_OFDM_MOD
|
#ifdef DEBUG_OFDM_MOD
|
||||||
msg("[PHY] symbol %d/%d (%p,%p -> %p)\n",i,nb_symbols,input,&input[i<<log2fftsize],&output[(i<<log2fftsize) + ((i)*nb_prefix_samples)]);
|
printf("[PHY] symbol %d/%d offset %d (%p,%p -> %p)\n",i,nb_symbols,i*fftsize+(i*nb_prefix_samples),input,&input[i*fftsize],&output[(i*fftsize) + ((i)*nb_prefix_samples)]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __AVX2__
|
#ifndef __AVX2__
|
||||||
// handle 128-bit alignment for 128-bit SIMD (SSE4,NEON,AltiVEC)
|
// handle 128-bit alignment for 128-bit SIMD (SSE4,NEON,AltiVEC)
|
||||||
idft((int16_t *)&input[i<<log2fftsize],
|
idft((int16_t *)&input[i<<log2fftsize],
|
||||||
(log2fftsize==7) ? (int16_t *)temp : (int16_t *)&output[(i<<log2fftsize) + ((1+i)*nb_prefix_samples)],
|
(fftsize==128) ? (int16_t *)temp : (int16_t *)&output[(i*fftsize) + ((1+i)*nb_prefix_samples)],
|
||||||
1);
|
1);
|
||||||
#else
|
#else
|
||||||
// on AVX2 need 256-bit alignment
|
// on AVX2 need 256-bit alignment
|
||||||
idft((int16_t *)&input[i<<log2fftsize],
|
idft((int16_t *)&input[i<<log2fftsize],
|
||||||
(log2fftsize<=9) ? (int16_t *)temp : (int16_t *)&output[(i<<log2fftsize) + ((1+i)*nb_prefix_samples)],
|
(fftsize<=512) ? (int16_t *)temp : (int16_t *)&output[(i*fftsize) + ((1+i)*nb_prefix_samples)],
|
||||||
1);
|
1);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Copy to frame buffer with Cyclic Extension
|
// Copy to frame buffer with Cyclic Extension
|
||||||
// Note: will have to adjust for synchronization offset!
|
// Note: will have to adjust for synchronization offset!
|
||||||
|
|
||||||
switch (etype) {
|
switch (etype) {
|
||||||
case CYCLIC_PREFIX:
|
case CYCLIC_PREFIX:
|
||||||
output_ptr = &output[(i<<log2fftsize) + ((1+i)*nb_prefix_samples)];
|
output_ptr = &output[(i*fftsize) + ((1+i)*nb_prefix_samples)];
|
||||||
temp_ptr = (int *)temp;
|
temp_ptr = (int *)temp;
|
||||||
|
|
||||||
|
|
||||||
// msg("Doing cyclic prefix method\n");
|
// msg("Doing cyclic prefix method\n");
|
||||||
|
|
||||||
#ifndef __AVX2__
|
#ifndef __AVX2__
|
||||||
if (log2fftsize==7)
|
if (fftsize==128)
|
||||||
#else
|
#else
|
||||||
if (log2fftsize<=9)
|
if (fftsize<=512)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
for (j=0; j<((1<<log2fftsize)) ; j++) {
|
for (j=0; j<fftsize ; j++) {
|
||||||
output_ptr[j] = temp_ptr[j];
|
output_ptr[j] = temp_ptr[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
j=fftsize;
|
||||||
|
|
||||||
|
|
||||||
j=(1<<log2fftsize);
|
|
||||||
|
|
||||||
for (k=-1; k>=-nb_prefix_samples; k--) {
|
for (k=-1; k>=-nb_prefix_samples; k--) {
|
||||||
output_ptr[k] = output_ptr[--j];
|
output_ptr[k] = output_ptr[--j];
|
||||||
@@ -189,19 +189,19 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
case CYCLIC_SUFFIX:
|
case CYCLIC_SUFFIX:
|
||||||
|
|
||||||
|
|
||||||
output_ptr = &output[(i<<log2fftsize)+ (i*nb_prefix_samples)];
|
output_ptr = &output[(i*fftsize)+ (i*nb_prefix_samples)];
|
||||||
|
|
||||||
temp_ptr = (int *)temp;
|
temp_ptr = (int *)temp;
|
||||||
|
|
||||||
// msg("Doing cyclic suffix method\n");
|
// msg("Doing cyclic suffix method\n");
|
||||||
|
|
||||||
for (j=0; j<(1<<log2fftsize) ; j++) {
|
for (j=0; j<fftsize ; j++) {
|
||||||
output_ptr[j] = temp_ptr[2*j];
|
output_ptr[j] = temp_ptr[2*j];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (j=0; j<nb_prefix_samples; j++)
|
for (j=0; j<nb_prefix_samples; j++)
|
||||||
output_ptr[(1<<log2fftsize)+j] = output_ptr[j];
|
output_ptr[fftsize+j] = output_ptr[j];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -212,11 +212,11 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
case NONE:
|
case NONE:
|
||||||
|
|
||||||
// msg("NO EXTENSION!\n");
|
// msg("NO EXTENSION!\n");
|
||||||
output_ptr = &output[(i<<log2fftsize)];
|
output_ptr = &output[fftsize];
|
||||||
|
|
||||||
temp_ptr = (int *)temp;
|
temp_ptr = (int *)temp;
|
||||||
|
|
||||||
for (j=0; j<(1<<log2fftsize) ; j++) {
|
for (j=0; j<fftsize ; j++) {
|
||||||
output_ptr[j] = temp_ptr[2*j];
|
output_ptr[j] = temp_ptr[2*j];
|
||||||
|
|
||||||
|
|
||||||
@@ -233,14 +233,7 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
printf("input %p, output %p, log2fftsize %d, nsymb %d\n",input,output,log2fftsize,nb_symbols);
|
|
||||||
for (i=0;i<16;i++)
|
|
||||||
printf("%d %d\n",((short *)input)[i<<1],((short *)input)[1+(i<<1)]);
|
|
||||||
printf("------\n");
|
|
||||||
for (i=0;i<16;i++)
|
|
||||||
printf("%d %d\n",((short *)output)[i<<1],((short *)output)[1+(i<<1)]);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -258,7 +251,7 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t
|
|||||||
LOG_D(PHY,"Frame %d, subframe %d: Doing MBSFN modulation (slot_offset %d)\n",frame,next_slot>>1,slot_offset);
|
LOG_D(PHY,"Frame %d, subframe %d: Doing MBSFN modulation (slot_offset %d)\n",frame,next_slot>>1,slot_offset);
|
||||||
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
||||||
&txdata[aa][slot_offset], // output
|
&txdata[aa][slot_offset], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
12, // number of symbols
|
12, // number of symbols
|
||||||
frame_parms->ofdm_symbol_size>>2, // number of prefix samples
|
frame_parms->ofdm_symbol_size>>2, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -266,7 +259,7 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t
|
|||||||
if (frame_parms->Ncp == EXTENDED)
|
if (frame_parms->Ncp == EXTENDED)
|
||||||
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
||||||
&txdata[aa][slot_offset], // output
|
&txdata[aa][slot_offset], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
2, // number of symbols
|
2, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -282,7 +275,7 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t
|
|||||||
if (frame_parms->Ncp == EXTENDED)
|
if (frame_parms->Ncp == EXTENDED)
|
||||||
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
||||||
&txdata[aa][slot_offset], // output
|
&txdata[aa][slot_offset], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
6, // number of symbols
|
6, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
|
|||||||
@@ -58,24 +58,28 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
|||||||
void (*dft)(int16_t *,int16_t *, int);
|
void (*dft)(int16_t *,int16_t *, int);
|
||||||
int tmp_dft_in[2048]; // This is for misalignment issues for 6 and 15 PRBs
|
int tmp_dft_in[2048]; // This is for misalignment issues for 6 and 15 PRBs
|
||||||
|
|
||||||
switch (frame_parms->log2_symbol_size) {
|
switch (frame_parms->ofdm_symbol_size) {
|
||||||
case 7:
|
case 128:
|
||||||
dft = dft128;
|
dft = dft128;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 256:
|
||||||
dft = dft256;
|
dft = dft256;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 512:
|
||||||
dft = dft512;
|
dft = dft512;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 1024:
|
||||||
dft = dft1024;
|
dft = dft1024;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 1536:
|
||||||
|
dft = dft1536;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2048:
|
||||||
dft = dft2048;
|
dft = dft2048;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -54,25 +54,29 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
|
|||||||
unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
|
unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
|
||||||
void (*dft)(int16_t *,int16_t *, int);
|
void (*dft)(int16_t *,int16_t *, int);
|
||||||
|
|
||||||
switch (frame_parms->log2_symbol_size) {
|
switch (frame_parms->ofdm_symbol_size) {
|
||||||
|
|
||||||
case 7:
|
case 128:
|
||||||
dft = dft128;
|
dft = dft128;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 256:
|
||||||
dft = dft256;
|
dft = dft256;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 512:
|
||||||
dft = dft512;
|
dft = dft512;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 1024:
|
||||||
dft = dft1024;
|
dft = dft1024;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 1536:
|
||||||
|
dft = dft1536;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2048:
|
||||||
dft = dft2048;
|
dft = dft2048;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -50,24 +50,28 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
void (*dft)(int16_t *,int16_t *, int);
|
void (*dft)(int16_t *,int16_t *, int);
|
||||||
|
|
||||||
switch (frame_parms->log2_symbol_size) {
|
switch (frame_parms->ofdm_symbol_size) {
|
||||||
case 7:
|
case 128:
|
||||||
dft = dft128;
|
dft = dft128;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 256:
|
||||||
dft = dft256;
|
dft = dft256;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 512:
|
||||||
dft = dft512;
|
dft = dft512;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 1024:
|
||||||
dft = dft1024;
|
dft = dft1024;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 1536:
|
||||||
|
dft = dft1536;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2048:
|
||||||
dft = dft2048;
|
dft = dft2048;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -115,11 +115,11 @@ int32_t dot_product(int16_t *x,
|
|||||||
// convert back to integer
|
// convert back to integer
|
||||||
result = _mm_cvtsi64_si32(mmtmp7);
|
result = _mm_cvtsi64_si32(mmtmp7);
|
||||||
|
|
||||||
return(result);
|
|
||||||
|
|
||||||
_mm_empty();
|
_mm_empty();
|
||||||
_m_empty();
|
_m_empty();
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
int16x4_t *x_128=(int16x4_t*)x;
|
int16x4_t *x_128=(int16x4_t*)x;
|
||||||
int16x4_t *y_128=(int16x4_t*)y;
|
int16x4_t *y_128=(int16x4_t*)y;
|
||||||
|
|||||||
@@ -1,200 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
OpenAirInterface
|
|
||||||
Copyright(c) 1999 - 2014 Eurecom
|
|
||||||
|
|
||||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
|
|
||||||
OpenAirInterface is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenAirInterface.The full GNU General Public License is
|
|
||||||
included in this distribution in the file called "COPYING". If not,
|
|
||||||
see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Contact Information
|
|
||||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
|
||||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
|
||||||
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
|
||||||
|
|
||||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
|
||||||
|
|
||||||
*******************************************************************************/
|
|
||||||
#include "defs.h"
|
|
||||||
|
|
||||||
int mult_cpx_matrix_h(short *x1[2][2],
|
|
||||||
short *x2[2][2],
|
|
||||||
short *y[2][2],
|
|
||||||
unsigned int N,
|
|
||||||
unsigned short output_shift,
|
|
||||||
short hermitian)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (hermitian) {
|
|
||||||
// this computes x1^H*x2 and stores it in y
|
|
||||||
mult_cpx_vector_h(x2[0][0],x1[0][0],y[0][0],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x2[0][1],x1[0][1],y[0][0],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x2[0][0],x1[1][0],y[1][0],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x2[0][1],x1[1][1],y[1][0],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x2[1][0],x1[0][0],y[0][1],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x2[1][1],x1[0][1],y[0][1],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x2[1][0],x1[1][0],y[1][1],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x2[1][1],x1[1][1],y[1][1],N,output_shift,1);
|
|
||||||
} else {
|
|
||||||
// this computes x1*x2^H and stores it in y
|
|
||||||
mult_cpx_vector_h(x1[0][0],x2[0][0],y[0][0],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x1[0][1],x2[0][1],y[0][0],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x1[0][0],x2[1][0],y[0][1],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x1[0][1],x2[1][1],y[0][1],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x1[1][0],x2[0][0],y[1][0],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x1[1][1],x2[0][1],y[1][0],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x1[1][0],x2[1][0],y[1][1],N,output_shift,1);
|
|
||||||
mult_cpx_vector_h(x1[1][1],x2[1][1],y[1][1],N,output_shift,1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int mult_cpx_matrix_vector(int *x1[2][2],
|
|
||||||
int *x2[2],
|
|
||||||
int *y[2],
|
|
||||||
unsigned int N,
|
|
||||||
unsigned short output_shift)
|
|
||||||
{
|
|
||||||
|
|
||||||
Zero_Buffer(y[0],N*8);
|
|
||||||
Zero_Buffer(y[1],N*8);
|
|
||||||
|
|
||||||
// this computes x1*x2 and stores it in y (32 bit)
|
|
||||||
mult_cpx_vector_add32((short*)x2[0],(short*)x1[0][0],(short*)y[0],N);
|
|
||||||
mult_cpx_vector_add32((short*)x2[1],(short*)x1[0][1],(short*)y[0],N);
|
|
||||||
mult_cpx_vector_add32((short*)x2[0],(short*)x1[1][0],(short*)y[1],N);
|
|
||||||
mult_cpx_vector_add32((short*)x2[1],(short*)x1[1][1],(short*)y[1],N);
|
|
||||||
|
|
||||||
// shift and pack
|
|
||||||
shift_and_pack((short*)y[0],N,output_shift);
|
|
||||||
shift_and_pack((short*)y[1],N,output_shift);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAIN_MM
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
main ()
|
|
||||||
{
|
|
||||||
short x1_00[256] __attribute__((aligned(16)));
|
|
||||||
short x1_10[256] __attribute__((aligned(16)));
|
|
||||||
short x1_01[256] __attribute__((aligned(16)));
|
|
||||||
short x1_11[256] __attribute__((aligned(16)));
|
|
||||||
short x2_0[256] __attribute__((aligned(16)));
|
|
||||||
short x2_1[256] __attribute__((aligned(16)));
|
|
||||||
short y_0[256] __attribute__((aligned(16)));
|
|
||||||
short y_1[256] __attribute__((aligned(16)));
|
|
||||||
|
|
||||||
int *x1[2][2];
|
|
||||||
int *x2[2];
|
|
||||||
int *y[2];
|
|
||||||
int i,m,n;
|
|
||||||
|
|
||||||
x1[0][0] = (int*)x1_00;
|
|
||||||
x1[0][1] = (int*)x1_01;
|
|
||||||
x1[1][0] = (int*)x1_10;
|
|
||||||
x1[1][1] = (int*)x1_11;
|
|
||||||
x2[0] = (int*)x2_0;
|
|
||||||
x2[1] = (int*)x2_1;
|
|
||||||
y[0] = (int*)y_0;
|
|
||||||
y[1] = (int*)y_1;
|
|
||||||
|
|
||||||
for(m=0; m<2; m++) {
|
|
||||||
for(n=0; n<2; n++) {
|
|
||||||
for(i=0; i<256; i+=4) {
|
|
||||||
((short*)x1[m][n])[i] = ((short) rand())/4;
|
|
||||||
((short*)x1[m][n])[i+1] = ((short) rand())/4;
|
|
||||||
((short*)x1[m][n])[i+2] = -((short*)x1[m][n])[i+1];
|
|
||||||
((short*)x1[m][n])[i+3] = ((short*)x1[m][n])[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0; i<256; i+=4) {
|
|
||||||
((short*)x2[m])[i] = ((short) rand())/4;
|
|
||||||
((short*)x2[m])[i+1] = ((short) rand())/4;
|
|
||||||
((short*)x2[m])[i+2] = ((short*)x2[m])[i];
|
|
||||||
((short*)x2[m])[i+3] = ((short*)x2[m])[i+1];
|
|
||||||
}
|
|
||||||
|
|
||||||
Zero_Buffer(y[m],512);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
input[0] = 100;
|
|
||||||
input[1] = 200;
|
|
||||||
input[2] = -200;
|
|
||||||
input[3] = 100;
|
|
||||||
input[4] = 1000;
|
|
||||||
input[5] = 2000;
|
|
||||||
input[6] = -2000;
|
|
||||||
input[7] = 1000;
|
|
||||||
input[8] = 100;
|
|
||||||
input[9] = 200;
|
|
||||||
input[10] = -200;
|
|
||||||
input[11] = 100;
|
|
||||||
input[12] = 1000;
|
|
||||||
input[13] = 2000;
|
|
||||||
input[14] = -2000;
|
|
||||||
input[15] = 1000;
|
|
||||||
|
|
||||||
input2[0] = 2;
|
|
||||||
input2[1] = 1;
|
|
||||||
input2[2] = 2;
|
|
||||||
input2[3] = 1;
|
|
||||||
input2[4] = 20;
|
|
||||||
input2[5] = 10;
|
|
||||||
input2[6] = 20;
|
|
||||||
input2[7] = 10;
|
|
||||||
input2[8] = 2;
|
|
||||||
input2[9] = 1;
|
|
||||||
input2[10] = 2;
|
|
||||||
input2[11] = 1;
|
|
||||||
input2[12] = 2000;
|
|
||||||
input2[13] = 1000;
|
|
||||||
input2[14] = 2000;
|
|
||||||
input2[15] = 1000;
|
|
||||||
|
|
||||||
x1[0][0] = (int*)input;
|
|
||||||
x1[0][1] = (int*)input;
|
|
||||||
x1[1][0] = (int*)input;
|
|
||||||
x1[1][1] = (int*)input;
|
|
||||||
|
|
||||||
x2[0] = (int*)input2;
|
|
||||||
x2[1] = (int*)input2;
|
|
||||||
|
|
||||||
y[0] = (int*)output;
|
|
||||||
y[1] = (int*)output2;
|
|
||||||
*/
|
|
||||||
|
|
||||||
mult_cpx_matrix_vector(x1,x2,y,64,15);
|
|
||||||
|
|
||||||
//mult_cpx_vector_add32(x2[0],x1[0][0],y[0],64);
|
|
||||||
|
|
||||||
for (i=0; i<128; i+=2)
|
|
||||||
printf("i=%d, x1 = [%d+1i*%d %d+1i*%d; %d+1i*%d %d+1i*%d]; x2 = [%d+1i*%d; %d+1i*%d]; y = [%d+1i*%d; %d+1i*%d]; y_m= round(x1*x2./pow2(15)); y-y_m \n",
|
|
||||||
i,
|
|
||||||
((short*)x1[0][0])[2*i], ((short*)x1[0][0])[2*i+2],
|
|
||||||
((short*)x1[0][1])[2*i], ((short*)x1[0][1])[2*i+2],
|
|
||||||
((short*)x1[1][0])[2*i], ((short*)x1[1][0])[2*i+2],
|
|
||||||
((short*)x1[1][1])[2*i], ((short*)x1[1][1])[2*i+2],
|
|
||||||
((short*)x2[0])[2*i], ((short*)x2[0])[2*i+1],
|
|
||||||
((short*)x2[1])[2*i], ((short*)x2[1])[2*i+1],
|
|
||||||
((short*)y[0])[2*i], ((short*)y[0])[2*i+1],
|
|
||||||
((short*)y[1])[2*i], ((short*)y[1])[2*i+1]);
|
|
||||||
|
|
||||||
//((int*)y[0])[i], ((int*)y[0])[i+1],
|
|
||||||
//((int*)y[1])[i], ((int*)y[1])[i+1]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -50,7 +50,7 @@ int mult_cpx_conj_vector(int16_t *x1,
|
|||||||
uint32_t N,
|
uint32_t N,
|
||||||
int output_shift)
|
int output_shift)
|
||||||
{
|
{
|
||||||
// Multiply elementwise two complex vectors of N elements with repeated formatted output
|
// Multiply elementwise the complex conjugate of x1 with x2.
|
||||||
// x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
// x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||||
// We assume x1 with a dinamic of 15 bit maximum
|
// We assume x1 with a dinamic of 15 bit maximum
|
||||||
//
|
//
|
||||||
@@ -90,7 +90,7 @@ int mult_cpx_conj_vector(int16_t *x1,
|
|||||||
tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1));
|
tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1));
|
||||||
tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1));
|
tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1));
|
||||||
tmp_im = _mm_sign_epi16(tmp_im,*(__m128i*)&conjug[0]);
|
tmp_im = _mm_sign_epi16(tmp_im,*(__m128i*)&conjug[0]);
|
||||||
tmp_im = _mm_madd_epi16(tmp_im,*x1_128);
|
tmp_im = _mm_madd_epi16(tmp_im,*x2_128);
|
||||||
tmp_re = _mm_srai_epi32(tmp_re,output_shift);
|
tmp_re = _mm_srai_epi32(tmp_re,output_shift);
|
||||||
tmp_im = _mm_srai_epi32(tmp_im,output_shift);
|
tmp_im = _mm_srai_epi32(tmp_im,output_shift);
|
||||||
tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im);
|
tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im);
|
||||||
@@ -130,3 +130,4 @@ int mult_cpx_conj_vector(int16_t *x1,
|
|||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,366 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
OpenAirInterface
|
|
||||||
Copyright(c) 1999 - 2014 Eurecom
|
|
||||||
|
|
||||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
|
|
||||||
OpenAirInterface is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenAirInterface.The full GNU General Public License is
|
|
||||||
included in this distribution in the file called "COPYING". If not,
|
|
||||||
see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Contact Information
|
|
||||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
|
||||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
|
||||||
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
|
||||||
|
|
||||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
|
||||||
|
|
||||||
*******************************************************************************/
|
|
||||||
#include "defs.h"
|
|
||||||
|
|
||||||
static __m128i shift __attribute__ ((aligned(16)));
|
|
||||||
|
|
||||||
|
|
||||||
int mult_cpx_vector_h(short *x1,
|
|
||||||
short *x2,
|
|
||||||
short *y,
|
|
||||||
unsigned int N,
|
|
||||||
unsigned short output_shift,
|
|
||||||
short sign)
|
|
||||||
{
|
|
||||||
// Multiply elementwise the complex vector x1 with the complex conjugate of the complex vecotr x2 of N elements and adds it to the vector y.
|
|
||||||
// x1 - input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
// We assume x1 with a dinamic of 15 bit maximum
|
|
||||||
//
|
|
||||||
// x2 - input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
// We assume x2 with a dinamic of 14 bit maximum
|
|
||||||
//
|
|
||||||
// y - output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
//
|
|
||||||
// N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
|
|
||||||
//
|
|
||||||
// log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0)
|
|
||||||
// WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
// sign - +1..add, -1..substract
|
|
||||||
|
|
||||||
unsigned int i; // loop counter
|
|
||||||
|
|
||||||
register __m128i m0,m1,m2;
|
|
||||||
|
|
||||||
short *temps;
|
|
||||||
int *tempd;
|
|
||||||
|
|
||||||
__m128i *x1_128;
|
|
||||||
__m128i *x2_128;
|
|
||||||
__m128i *y_128;
|
|
||||||
__m128i mask;
|
|
||||||
|
|
||||||
__m128i temp;
|
|
||||||
|
|
||||||
shift = _mm_cvtsi32_si128(output_shift);
|
|
||||||
x1_128 = (__m128i *)&x1[0];
|
|
||||||
x2_128 = (__m128i *)&x2[0];
|
|
||||||
y_128 = (__m128i *)&y[0];
|
|
||||||
|
|
||||||
if (sign == -1)
|
|
||||||
mask = (__m128i) _mm_set_epi16 (-1,1,-1,-1,-1,1,-1,-1);
|
|
||||||
else
|
|
||||||
mask = (__m128i) _mm_set_epi16 (1,-1,1,1,1,-1,1,1);
|
|
||||||
|
|
||||||
// we compute 2*4 cpx multiply for each loop
|
|
||||||
for(i=0; i<(N>>3); i++) {
|
|
||||||
|
|
||||||
// printf("i=%d\n",i);
|
|
||||||
|
|
||||||
// unroll 1
|
|
||||||
// temps = (short *)x1_128;
|
|
||||||
// printf("x1 : %d,%d,%d,%d,%d,%d,%d,%d\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
|
|
||||||
m1 = x1_128[0];
|
|
||||||
m2 = x2_128[0];
|
|
||||||
|
|
||||||
// temps = (short *)&x2_128[0];
|
|
||||||
// printf("x2 : %x,%x,%x,%x,%x,%x,%x,%x\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
|
|
||||||
|
|
||||||
// bring x2 in conjugate form
|
|
||||||
// the first two instructions might be replaced with a single one in SSE3
|
|
||||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_mullo_epi16(m2, mask);
|
|
||||||
|
|
||||||
// temp = m2;
|
|
||||||
// temps = (short *)&temp;
|
|
||||||
// printf("x2 conj : %x,%x,%x,%x,%x,%x,%x,%x\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
|
|
||||||
|
|
||||||
m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
|
|
||||||
|
|
||||||
// temp = m0;
|
|
||||||
|
|
||||||
// tempd = &temp;
|
|
||||||
// printf("m0 : %d,%d,%d,%d\n",tempd[0],tempd[1],tempd[2],tempd[3]);
|
|
||||||
|
|
||||||
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
|
|
||||||
|
|
||||||
// temp = m0;
|
|
||||||
|
|
||||||
// tempd = (int *)&temp;
|
|
||||||
// printf("m0 : %d,%d,%d,%d\n",tempd[0],tempd[1],tempd[2],tempd[3]);
|
|
||||||
|
|
||||||
m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
|
||||||
m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
|
||||||
|
|
||||||
y_128[0] = _mm_add_epi16(m0,y_128[0]);
|
|
||||||
|
|
||||||
// temps = (short *)&y_128[0];
|
|
||||||
// printf("y0 : %d,%d,%d,%d,%d,%d,%d,%d\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
|
|
||||||
|
|
||||||
// unroll 2
|
|
||||||
m1 = x1_128[1];
|
|
||||||
m2 = x2_128[1];
|
|
||||||
|
|
||||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_mullo_epi16(m2, mask);
|
|
||||||
|
|
||||||
m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
|
|
||||||
|
|
||||||
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
|
|
||||||
|
|
||||||
m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
|
||||||
m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
|
||||||
|
|
||||||
y_128[1] = _mm_add_epi16(m0,y_128[1]);
|
|
||||||
|
|
||||||
// unroll 3
|
|
||||||
m1 = x1_128[2];
|
|
||||||
m2 = x2_128[2];
|
|
||||||
|
|
||||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_mullo_epi16(m2, mask);
|
|
||||||
|
|
||||||
m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
|
|
||||||
|
|
||||||
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
|
|
||||||
|
|
||||||
m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
|
||||||
m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
|
||||||
|
|
||||||
y_128[2] = _mm_add_epi16(m0,y_128[2]);
|
|
||||||
|
|
||||||
|
|
||||||
// unroll 4
|
|
||||||
m1 = x1_128[3];
|
|
||||||
m2 = x2_128[3];
|
|
||||||
|
|
||||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_mullo_epi16(m2, mask);
|
|
||||||
|
|
||||||
m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
|
|
||||||
|
|
||||||
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
|
|
||||||
|
|
||||||
m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
|
||||||
m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
|
|
||||||
|
|
||||||
y_128[3] = _mm_add_epi16(m0,y_128[3]);
|
|
||||||
|
|
||||||
x1_128+=4;
|
|
||||||
x2_128+=4;
|
|
||||||
y_128 +=4;
|
|
||||||
// printf("x1_128 = %p, x2_128 =%p, y_128=%p\n",x1_128,x2_128,y_128);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
_mm_empty();
|
|
||||||
_m_empty();
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mult_cpx_vector_h_add32(short *x1,
|
|
||||||
short *x2,
|
|
||||||
short *y,
|
|
||||||
unsigned int N,
|
|
||||||
short sign)
|
|
||||||
{
|
|
||||||
// Multiply elementwise the complex vector x1 with the complex conjugate of the complex vecotr x2 of N elements and adds it to the vector y.
|
|
||||||
// x1 - input 1 in 16bit format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
// We assume x1 with a dinamic of 15 bit maximum
|
|
||||||
//
|
|
||||||
// x2 - input 2 in 16bit format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
// We assume x2 with a dinamic of 14 bit maximum
|
|
||||||
//
|
|
||||||
// y - output in 32bit format |Re0 Im0|,......,|Re(N-1) Im(N-1)|
|
|
||||||
//
|
|
||||||
// N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
|
|
||||||
//
|
|
||||||
// sign - +1..add, -1..substract
|
|
||||||
|
|
||||||
unsigned int i; // loop counter
|
|
||||||
|
|
||||||
register __m128i m0,m1,m2;
|
|
||||||
|
|
||||||
short *temps;
|
|
||||||
int *tempd;
|
|
||||||
|
|
||||||
__m128i *x1_128;
|
|
||||||
__m128i *x2_128;
|
|
||||||
__m128i *y_128;
|
|
||||||
__m128i mask;
|
|
||||||
|
|
||||||
__m128i temp;
|
|
||||||
|
|
||||||
x1_128 = (__m128i *)&x1[0];
|
|
||||||
x2_128 = (__m128i *)&x2[0];
|
|
||||||
y_128 = (__m128i *)&y[0];
|
|
||||||
|
|
||||||
if (sign == -1)
|
|
||||||
mask = (__m128i) _mm_set_epi16 (-1,1,-1,-1,-1,1,-1,-1);
|
|
||||||
else
|
|
||||||
mask = (__m128i) _mm_set_epi16 (1,-1,1,1,1,-1,1,1);
|
|
||||||
|
|
||||||
// we compute 2*4 cpx multiply for each loop
|
|
||||||
for(i=0; i<(N>>3); i++) {
|
|
||||||
|
|
||||||
m1 = x1_128[0];
|
|
||||||
m2 = x2_128[0];
|
|
||||||
|
|
||||||
// bring x2 in conjugate form
|
|
||||||
// the first two instructions might be replaced with a single one in SSE3
|
|
||||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_mullo_epi16(m2, mask);
|
|
||||||
|
|
||||||
m0 = _mm_madd_epi16(m1,m2); // 1- compute x1[0]*x2[0], result is 32bit
|
|
||||||
|
|
||||||
y_128[0] = _mm_add_epi32(m0,y_128[0]);
|
|
||||||
|
|
||||||
// unroll 2
|
|
||||||
m1 = x1_128[1];
|
|
||||||
m2 = x2_128[1];
|
|
||||||
|
|
||||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_mullo_epi16(m2, mask);
|
|
||||||
|
|
||||||
m0 = _mm_madd_epi16(m1,m2);
|
|
||||||
|
|
||||||
y_128[1] = _mm_add_epi32(m0,y_128[1]);
|
|
||||||
|
|
||||||
// unroll 3
|
|
||||||
m1 = x1_128[2];
|
|
||||||
m2 = x2_128[2];
|
|
||||||
|
|
||||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_mullo_epi16(m2, mask);
|
|
||||||
|
|
||||||
m0 = _mm_madd_epi16(m1,m2);
|
|
||||||
|
|
||||||
y_128[2] = _mm_add_epi32(m0,y_128[2]);
|
|
||||||
|
|
||||||
|
|
||||||
// unroll 4
|
|
||||||
m1 = x1_128[3];
|
|
||||||
m2 = x2_128[3];
|
|
||||||
|
|
||||||
m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
|
|
||||||
m2 = _mm_mullo_epi16(m2, mask);
|
|
||||||
|
|
||||||
m0 = _mm_madd_epi16(m1,m2);
|
|
||||||
|
|
||||||
y_128[3] = _mm_add_epi32(m0,y_128[3]);
|
|
||||||
|
|
||||||
x1_128+=4;
|
|
||||||
x2_128+=4;
|
|
||||||
y_128 +=4;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
_mm_empty();
|
|
||||||
_m_empty();
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAIN
|
|
||||||
#define L 16
|
|
||||||
|
|
||||||
main ()
|
|
||||||
{
|
|
||||||
|
|
||||||
short input[256] __attribute__((aligned(16)));
|
|
||||||
short input2[256] __attribute__((aligned(16)));
|
|
||||||
short output[256] __attribute__((aligned(16)));
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
Zero_Buffer(output,256*2);
|
|
||||||
|
|
||||||
for (i=0; i<16; i+=2)
|
|
||||||
printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
|
|
||||||
|
|
||||||
input[0] = 100;
|
|
||||||
input[1] = 200;
|
|
||||||
input[2] = 100;
|
|
||||||
input[3] = 200;
|
|
||||||
input[4] = 1234;
|
|
||||||
input[5] = -1234;
|
|
||||||
input[6] = 1234;
|
|
||||||
input[7] = -1234;
|
|
||||||
input[8] = 100;
|
|
||||||
input[9] = 200;
|
|
||||||
input[10] = 100;
|
|
||||||
input[11] = 200;
|
|
||||||
input[12] = 1000;
|
|
||||||
input[13] = 2000;
|
|
||||||
input[14] = 1000;
|
|
||||||
input[15] = 2000;
|
|
||||||
|
|
||||||
input2[0] = 1;
|
|
||||||
input2[1] = 2;
|
|
||||||
input2[2] = 1;
|
|
||||||
input2[3] = 2;
|
|
||||||
input2[4] = 10;
|
|
||||||
input2[5] = 20;
|
|
||||||
input2[6] = 10;
|
|
||||||
input2[7] = 20;
|
|
||||||
input2[8] = 1;
|
|
||||||
input2[9] = 2;
|
|
||||||
input2[10] = 1;
|
|
||||||
input2[11] = 2;
|
|
||||||
input2[12] = 1000;
|
|
||||||
input2[13] = 2000;
|
|
||||||
input2[14] = 1000;
|
|
||||||
input2[15] = 2000;
|
|
||||||
|
|
||||||
|
|
||||||
mult_cpx_vector_h(input2,input2,output,8,0,1);
|
|
||||||
|
|
||||||
for (i=0; i<16; i+=2)
|
|
||||||
printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
|
|
||||||
|
|
||||||
Zero_Buffer(output,256*2);
|
|
||||||
mult_cpx_vector_h(input2,input2,output,8,0,-1);
|
|
||||||
|
|
||||||
for (i=0; i<16; i+=2)
|
|
||||||
printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //MAIN
|
|
||||||
+26
-182
@@ -64,6 +64,8 @@ struct complex32 {
|
|||||||
int32_t i;
|
int32_t i;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//cmult_sv.h
|
||||||
|
|
||||||
/*!\fn void multadd_real_vector_complex_scalar(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
|
/*!\fn void multadd_real_vector_complex_scalar(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
|
||||||
This function performs componentwise multiplication and accumulation of a complex scalar and a real vector.
|
This function performs componentwise multiplication and accumulation of a complex scalar and a real vector.
|
||||||
@param x Vector input (Q1.15)
|
@param x Vector input (Q1.15)
|
||||||
@@ -95,192 +97,14 @@ void multadd_complex_vector_real_scalar(int16_t *x,
|
|||||||
uint8_t zero_flag,
|
uint8_t zero_flag,
|
||||||
uint32_t N);
|
uint32_t N);
|
||||||
|
|
||||||
|
int rotate_cpx_vector(int16_t *x,
|
||||||
/*!\fn int32_t mult_cpx_vector(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
int16_t *alpha,
|
||||||
This function performs optimized componentwise multiplication of two Q1.15 vectors in repeated format.
|
|
||||||
|
|
||||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
|
||||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param N Length of Vector WARNING: N must be a multiple of 8 (4x loop unrolling and two complex multiplies per cycle)
|
|
||||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
|
|
||||||
The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
|
|
||||||
*/
|
|
||||||
int32_t mult_cpx_vector(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift);
|
|
||||||
|
|
||||||
/*!\fn int32_t mult_cpx_vector_norep(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
|
||||||
This function performs optimized componentwise multiplication of two Q1.15 vectors with normal formatted output.
|
|
||||||
|
|
||||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
|
||||||
@param y Output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
|
||||||
@param N Length of Vector WARNING: N must be a multiple of 8 (4x loop unrolling and two complex multiplies per cycle)
|
|
||||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
|
|
||||||
The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
|
|
||||||
*/
|
|
||||||
int32_t mult_cpx_vector_norep(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift);
|
|
||||||
|
|
||||||
|
|
||||||
/*!\fn int32_t mult_cpx_vector_norep2(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
|
||||||
This function performs optimized componentwise multiplication of two Q1.15 vectors with normal formatted output.
|
|
||||||
|
|
||||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
|
||||||
@param y Output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
|
||||||
@param N Length of Vector WARNING: N must be a multiple of 8 (no unrolling and two complex multiplies per cycle)
|
|
||||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
|
|
||||||
The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
|
|
||||||
*/
|
|
||||||
int32_t mult_cpx_vector_norep2(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift);
|
|
||||||
|
|
||||||
int32_t mult_cpx_vector_norep_conj(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift);
|
|
||||||
|
|
||||||
int32_t mult_cpx_vector_norep_conj2(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift);
|
|
||||||
|
|
||||||
/*!\fn int32_t mult_cpx_vector2(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
|
||||||
This function performs optimized componentwise multiplication of two Q1.15 vectors.
|
|
||||||
|
|
||||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
|
||||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param N Length of Vector WARNING: N must be a multiple of 2 (2 complex multiplies per cycle)
|
|
||||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
|
|
||||||
The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
|
|
||||||
*/
|
|
||||||
int32_t mult_cpx_vector2(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift);
|
|
||||||
|
|
||||||
/*!\fn int32_t mult_cpx_vector_add(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
|
|
||||||
This function performs optimized componentwise multiplication of two Q1.15 vectors. The output IS ADDED TO y. WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
|
|
||||||
|
|
||||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
|
||||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param N Length of Vector WARNING: N>=4
|
|
||||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
|
|
||||||
The function implemented is : \f$\mathbf{y} += \mathbf{x_1}\odot\mathbf{x_2}\f$
|
|
||||||
*/
|
|
||||||
|
|
||||||
int32_t mult_cpx_vector_add(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift);
|
|
||||||
|
|
||||||
|
|
||||||
int32_t mult_cpx_vector_h_add32(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int16_t sign);
|
|
||||||
|
|
||||||
int32_t mult_cpx_vector_add32(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N);
|
|
||||||
|
|
||||||
int32_t mult_vector32(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
int16_t *y,
|
||||||
uint32_t N);
|
uint32_t N,
|
||||||
|
uint16_t output_shift);
|
||||||
int32_t mult_vector32_scalar(int16_t *x1,
|
|
||||||
int32_t x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N);
|
|
||||||
|
|
||||||
int32_t mult_cpx_vector32_conj(int16_t *x,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N);
|
|
||||||
|
|
||||||
int32_t mult_cpx_vector32_real(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N);
|
|
||||||
|
|
||||||
int32_t shift_and_pack(int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift);
|
|
||||||
|
|
||||||
/*!\fn int32_t mult_cpx_vector_h(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift,int16_t sign)
|
|
||||||
This function performs optimized componentwise multiplication of the vector x1 with the conjugate of the vector x2. The output IS ADDED TO y. WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
|
|
||||||
|
|
||||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param x2 Input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param N Length of Vector (complex samples) WARNING: N>=4
|
|
||||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
@param sign +1..add, -1..substract
|
|
||||||
|
|
||||||
The function implemented is : \f$\mathbf{y} = \mathbf{y} + \mathbf{x_1}\odot\mathbf{x_2}^*\f$
|
|
||||||
*/
|
|
||||||
int32_t mult_cpx_vector_h(int16_t *x1,
|
|
||||||
int16_t *x2,
|
|
||||||
int16_t *y,
|
|
||||||
uint32_t N,
|
|
||||||
int32_t output_shift,
|
|
||||||
int16_t sign);
|
|
||||||
|
|
||||||
/*!\fn int32_t mult_cpx_matrix_h(int16_t *x1[2][2],int16_t *x2[2][2],int16_t *y[2][2],uint32_t N,uint16_t output_shift,int16_t hermitian)
|
|
||||||
This function performs optimized componentwise matrix multiplication of the 2x2 matrices x1 with the 2x2 matrices x2. The output IS ADDED TO y (i.e. make sure y is initilized correctly). WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
|
|
||||||
|
|
||||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param x2 Input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param N Length of Vector (complex samples) WARNING: N>=4
|
|
||||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
@param hermitian if !=0 the hermitian transpose is returned (i.e. A^H*B instead of A*B^H)
|
|
||||||
*/
|
|
||||||
int32_t mult_cpx_matrix_h(int16_t *x1[2][2],
|
|
||||||
int16_t *x2[2][2],
|
|
||||||
int16_t *y[2][2],
|
|
||||||
uint32_t N,
|
|
||||||
uint16_t output_shift,
|
|
||||||
int16_t hermitian);
|
|
||||||
|
|
||||||
|
|
||||||
/*!\fn int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],int32_t *x2[2],int32_t *y[2],uint32_t N,uint16_t output_shift)
|
|
||||||
This function performs optimized componentwise matrix-vector multiplication of the 2x2 matrices x1 with the 2x1 vectors x2. The output IS ADDED TO y (i.e. make sure y is initilized correctly). WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
|
|
||||||
|
|
||||||
@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
|
|
||||||
@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
|
|
||||||
@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| WARNING: y must be different for x2
|
|
||||||
@param N Length of Vector (complex samples) WARNING: N>=4
|
|
||||||
@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
|
|
||||||
*/
|
|
||||||
int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],
|
|
||||||
int32_t *x2[2],
|
|
||||||
int32_t *y[2],
|
|
||||||
uint32_t N,
|
|
||||||
uint16_t output_shift);
|
|
||||||
|
|
||||||
/*!\fn void init_fft(uint16_t size,uint8_t logsize,uint16_t *rev)
|
/*!\fn void init_fft(uint16_t size,uint8_t logsize,uint16_t *rev)
|
||||||
\brief Initialize the FFT engine for a given size
|
\brief Initialize the FFT engine for a given size
|
||||||
@@ -289,6 +113,25 @@ int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],
|
|||||||
@param rev Pointer to bit-reversal permutation array
|
@param rev Pointer to bit-reversal permutation array
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//cmult_vv.c
|
||||||
|
/*!
|
||||||
|
Multiply elementwise the complex conjugate of x1 with x2.
|
||||||
|
@param x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||||
|
We assume x1 with a dinamic of 15 bit maximum
|
||||||
|
@param x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||||
|
We assume x2 with a dinamic of 14 bit maximum
|
||||||
|
@param y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
|
||||||
|
@param N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
|
||||||
|
@param output_shift - shift to be applied to generate output
|
||||||
|
*/
|
||||||
|
|
||||||
|
int mult_cpx_conj_vector(int16_t *x1,
|
||||||
|
int16_t *x2,
|
||||||
|
int16_t *y,
|
||||||
|
uint32_t N,
|
||||||
|
int output_shift);
|
||||||
|
|
||||||
|
// lte_dfts.c
|
||||||
void init_fft(uint16_t size,
|
void init_fft(uint16_t size,
|
||||||
uint8_t logsize,
|
uint8_t logsize,
|
||||||
uint16_t *rev);
|
uint16_t *rev);
|
||||||
@@ -355,6 +198,7 @@ int32_t rotate_cpx_vector(int16_t *x,
|
|||||||
uint16_t output_shift);
|
uint16_t output_shift);
|
||||||
|
|
||||||
|
|
||||||
|
//cadd_sv.c
|
||||||
|
|
||||||
/*!\fn int32_t add_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
|
/*!\fn int32_t add_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
|
||||||
This function performs componentwise addition of a vector with a complex scalar.
|
This function performs componentwise addition of a vector with a complex scalar.
|
||||||
|
|||||||
@@ -45,8 +45,10 @@
|
|||||||
#define debug_msg
|
#define debug_msg
|
||||||
#define ONE_OVER_SQRT2_Q15 23170
|
#define ONE_OVER_SQRT2_Q15 23170
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ONE_OVER_SQRT3_Q15 18919
|
||||||
|
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
|
|
||||||
@@ -94,7 +96,7 @@ static inline void cmacc(__m128i a,__m128i b, __m128i *re32, __m128i *im32)
|
|||||||
cmac_tmp = _mm_sign_epi16(b,*(__m128i*)reflip);
|
cmac_tmp = _mm_sign_epi16(b,*(__m128i*)reflip);
|
||||||
// cmac_tmp = _mm_shufflelo_epi16(b,_MM_SHUFFLE(2,3,0,1));
|
// cmac_tmp = _mm_shufflelo_epi16(b,_MM_SHUFFLE(2,3,0,1));
|
||||||
// cmac_tmp = _mm_shufflehi_epi16(cmac_tmp,_MM_SHUFFLE(2,3,0,1));
|
// cmac_tmp = _mm_shufflehi_epi16(cmac_tmp,_MM_SHUFFLE(2,3,0,1));
|
||||||
cmac_tmp = _mm_shuffle_epi8(b,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2));
|
cmac_tmp = _mm_shuffle_epi8(cmac_tmp,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2));
|
||||||
cmac_tmp_im32 = _mm_madd_epi16(cmac_tmp,a);
|
cmac_tmp_im32 = _mm_madd_epi16(cmac_tmp,a);
|
||||||
|
|
||||||
*re32 = _mm_add_epi32(*re32,cmac_tmp_re32);
|
*re32 = _mm_add_epi32(*re32,cmac_tmp_re32);
|
||||||
@@ -5312,6 +5314,8 @@ void idft1536(int16_t *input, int16_t *output)
|
|||||||
int i,i2,j;
|
int i,i2,j;
|
||||||
uint32_t tmp[3][512 ]__attribute__((aligned(32)));
|
uint32_t tmp[3][512 ]__attribute__((aligned(32)));
|
||||||
uint32_t tmpo[3][512] __attribute__((aligned(32)));
|
uint32_t tmpo[3][512] __attribute__((aligned(32)));
|
||||||
|
simd_q15_t *y128p=(simd_q15_t*)output;
|
||||||
|
simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15);
|
||||||
|
|
||||||
for (i=0,j=0; i<512; i++) {
|
for (i=0,j=0; i<512; i++) {
|
||||||
tmp[0][i] = ((uint32_t *)input)[j++];
|
tmp[0][i] = ((uint32_t *)input)[j++];
|
||||||
@@ -5322,17 +5326,6 @@ void idft1536(int16_t *input, int16_t *output)
|
|||||||
idft512((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
|
idft512((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
|
||||||
idft512((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
|
idft512((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
|
||||||
idft512((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
|
idft512((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
|
||||||
/*
|
|
||||||
for (i=1; i<512; i++) {
|
|
||||||
tmpo[0][i] = tmpo[0][i<<1];
|
|
||||||
tmpo[1][i] = tmpo[1][i<<1];
|
|
||||||
tmpo[2][i] = tmpo[2][i<<1];
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// write_output("in.m","in",input,6144,1,1);
|
|
||||||
// write_output("out0.m","o0",tmpo[0],2048,1,1);
|
|
||||||
// write_output("out1.m","o1",tmpo[1],2048,1,1);
|
|
||||||
// write_output("out2.m","o2",tmpo[2],2048,1,1);
|
|
||||||
|
|
||||||
for (i=0,i2=0; i<1024; i+=8,i2+=4) {
|
for (i=0,i2=0; i<1024; i+=8,i2+=4) {
|
||||||
ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]),
|
ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]),
|
||||||
@@ -5341,6 +5334,26 @@ void idft1536(int16_t *input, int16_t *output)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (i=0; i<24; i++) {
|
||||||
|
y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128);
|
||||||
|
y128p+=16;
|
||||||
|
}
|
||||||
|
|
||||||
_mm_empty();
|
_mm_empty();
|
||||||
_m_empty();
|
_m_empty();
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
|
|||||||
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
|
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
|
||||||
fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
|
fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
|
||||||
fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
|
fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
|
||||||
fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
|
fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
|
||||||
|
|
||||||
// Time-domain channel response
|
// Time-domain channel response
|
||||||
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
|
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
|
||||||
@@ -119,7 +119,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
|
|||||||
fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
|
fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
|
||||||
|
|
||||||
// I/Q PUCCH comp (format 1)
|
// I/Q PUCCH comp (format 1)
|
||||||
fdui->pucch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 480, 240, 100, "PUCCH I/Q of MF Output" );
|
fdui->pucch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 480, 240, 100, "PUCCH1 Energy (SR)" );
|
||||||
fl_set_object_boxtype( fdui->pucch_comp1, FL_EMBOSSED_BOX );
|
fl_set_object_boxtype( fdui->pucch_comp1, FL_EMBOSSED_BOX );
|
||||||
fl_set_object_color( fdui->pucch_comp1, FL_BLACK, FL_YELLOW );
|
fl_set_object_color( fdui->pucch_comp1, FL_BLACK, FL_YELLOW );
|
||||||
fl_set_object_lcolor( fdui->pucch_comp1, FL_WHITE ); // Label color
|
fl_set_object_lcolor( fdui->pucch_comp1, FL_WHITE ); // Label color
|
||||||
@@ -160,7 +160,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
|||||||
int UE_id)
|
int UE_id)
|
||||||
{
|
{
|
||||||
int eNB_id = 0;
|
int eNB_id = 0;
|
||||||
int i,arx,atx,ind,k;
|
int i,i2,arx,atx,ind,k;
|
||||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->lte_frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->lte_frame_parms;
|
||||||
int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
|
int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
|
||||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
|
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||||
@@ -171,15 +171,17 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
|||||||
int16_t *pusch_llr;
|
int16_t *pusch_llr;
|
||||||
int16_t *pusch_comp;
|
int16_t *pusch_comp;
|
||||||
int32_t *pucch1_comp;
|
int32_t *pucch1_comp;
|
||||||
int16_t *pucch1ab_comp;
|
int32_t *pucch1_thres;
|
||||||
|
int32_t *pucch1ab_comp;
|
||||||
float Re,Im,ymax;
|
float Re,Im,ymax;
|
||||||
float *llr, *bit;
|
float *llr, *bit;
|
||||||
float I[nsymb_ce*2], Q[nsymb_ce*2];
|
float I[nsymb_ce*2], Q[nsymb_ce*2];
|
||||||
float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240];
|
float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
|
||||||
float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
|
float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
|
||||||
float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
|
float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
|
||||||
float *chest_f_abs;
|
float *chest_f_abs;
|
||||||
float time[FRAME_LENGTH_COMPLEX_SAMPLES];
|
float time[FRAME_LENGTH_COMPLEX_SAMPLES];
|
||||||
|
float time2[2048];
|
||||||
float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
|
float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
|
||||||
int frame = phy_vars_enb->proc[0].frame_tx;
|
int frame = phy_vars_enb->proc[0].frame_tx;
|
||||||
uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate;
|
uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate;
|
||||||
@@ -206,7 +208,8 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
|||||||
pusch_llr = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->llr;
|
pusch_llr = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->llr;
|
||||||
pusch_comp = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id][0];
|
pusch_comp = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id][0];
|
||||||
pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id];
|
pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id];
|
||||||
pucch1ab_comp = (int16_t*) phy_vars_enb->pucch1ab_stats[UE_id];
|
pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id];
|
||||||
|
pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id];
|
||||||
|
|
||||||
// Received signal in time domain of receive antenna 0
|
// Received signal in time domain of receive antenna 0
|
||||||
if (rxsig_t != NULL) {
|
if (rxsig_t != NULL) {
|
||||||
@@ -236,19 +239,21 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
|||||||
|
|
||||||
if (chest_t[0] !=NULL) {
|
if (chest_t[0] !=NULL) {
|
||||||
for (i=0; i<(frame_parms->ofdm_symbol_size); i++) {
|
for (i=0; i<(frame_parms->ofdm_symbol_size); i++) {
|
||||||
chest_t_abs[0][i] = 10*log10((float) (chest_t[0][2*i]*chest_t[0][2*i]+chest_t[0][2*i+1]*chest_t[0][2*i+1]));
|
i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
|
||||||
|
time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
|
||||||
|
chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1]));
|
||||||
|
|
||||||
if (chest_t_abs[0][i] > ymax)
|
if (chest_t_abs[0][i] > ymax)
|
||||||
ymax = chest_t_abs[0][i];
|
ymax = chest_t_abs[0][i];
|
||||||
}
|
}
|
||||||
|
|
||||||
fl_set_xyplot_data(form->chest_t,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size),"","","");
|
fl_set_xyplot_data(form->chest_t,time2,chest_t_abs[0],(frame_parms->ofdm_symbol_size),"","","");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (arx=1; arx<nb_antennas_rx; arx++) {
|
for (arx=1; arx<nb_antennas_rx; arx++) {
|
||||||
if (chest_t[arx] !=NULL) {
|
if (chest_t[arx] !=NULL) {
|
||||||
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
|
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
|
||||||
chest_t_abs[arx][i] = 10*log10((float) (chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
|
chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
|
||||||
|
|
||||||
if (chest_t_abs[arx][i] > ymax)
|
if (chest_t_abs[arx][i] > ymax)
|
||||||
ymax = chest_t_abs[arx][i];
|
ymax = chest_t_abs[arx][i];
|
||||||
@@ -337,16 +342,20 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
|||||||
// PUSCH I/Q of MF Output
|
// PUSCH I/Q of MF Output
|
||||||
if (pucch1ab_comp!=NULL) {
|
if (pucch1ab_comp!=NULL) {
|
||||||
for (ind=0; ind<10240; ind++) {
|
for (ind=0; ind<10240; ind++) {
|
||||||
I_pucch[ind] = pucch1ab_comp[2*ind];
|
|
||||||
Q_pucch[ind] = pucch1ab_comp[2*ind+1];
|
I_pucch[ind] = (float)pucch1ab_comp[2*(ind)];
|
||||||
|
Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1];
|
||||||
A_pucch[ind] = 10*log10(pucch1_comp[ind]);
|
A_pucch[ind] = 10*log10(pucch1_comp[ind]);
|
||||||
B_pucch[ind] = ind;
|
B_pucch[ind] = ind;
|
||||||
|
C_pucch[ind] = (float)pucch1_thres[ind];
|
||||||
}
|
}
|
||||||
fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","","");
|
fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","","");
|
||||||
fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","","");
|
fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","","");
|
||||||
fl_set_xyplot_xbounds(form->pucch_comp,-200,200);
|
fl_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED);
|
||||||
fl_set_xyplot_ybounds(form->pucch_comp,-100,100);
|
fl_set_xyplot_ybounds(form->pucch_comp,-5000,5000);
|
||||||
fl_set_xyplot_ybounds(form->pucch_comp1,10,40);
|
fl_set_xyplot_xbounds(form->pucch_comp,-5000,5000);
|
||||||
|
|
||||||
|
fl_set_xyplot_ybounds(form->pucch_comp1,20,80);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -387,7 +396,7 @@ FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void )
|
|||||||
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
|
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
|
||||||
fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
|
fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
|
||||||
fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
|
fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
|
||||||
fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
|
fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
|
||||||
|
|
||||||
// Time-domain channel response
|
// Time-domain channel response
|
||||||
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
|
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
|
||||||
@@ -710,13 +719,13 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
|||||||
|
|
||||||
// PDSCH LLRs
|
// PDSCH LLRs
|
||||||
if (pdsch_llr != NULL) {
|
if (pdsch_llr != NULL) {
|
||||||
for (i=0; i<coded_bits_per_codeword/4; i++) {
|
for (i=0; i<coded_bits_per_codeword; i++) {
|
||||||
llr[i] = (float) pdsch_llr[4*i];
|
llr[i] = (float) pdsch_llr[i];
|
||||||
bit[i] = (float) i;
|
bit[i] = (float) i;
|
||||||
}
|
}
|
||||||
|
|
||||||
fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword/4);
|
fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
|
||||||
fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword/4,"","","");
|
fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","","");
|
||||||
}
|
}
|
||||||
|
|
||||||
// PDSCH I/Q of MF Output
|
// PDSCH I/Q of MF Output
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ int32_t signal_energy(int32_t *input,uint32_t length)
|
|||||||
for (i=0; i<length>>1; i++) {
|
for (i=0; i<length>>1; i++) {
|
||||||
|
|
||||||
tmpE = vqaddq_s32(tmpE,vshrq_n_s32(vmull_s16(*in,*in),shift));
|
tmpE = vqaddq_s32(tmpE,vshrq_n_s32(vmull_s16(*in,*in),shift));
|
||||||
tmpDC = vaddw_s16(tmpDC,vshr_n_s16(*in++,shift_DC));
|
//tmpDC = vaddw_s16(tmpDC,vshr_n_s16(*in++,shift_DC));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,9 @@
|
|||||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
#ifndef __TIME_MEAS_DEFS__H__
|
||||||
|
#define __TIME_MEAS_DEFS__H__
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -148,3 +151,4 @@ static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts)
|
|||||||
dst_ts->max=src_ts->max;
|
dst_ts->max=src_ts->max;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
+18
-2
@@ -76,6 +76,13 @@
|
|||||||
#define openair_free(y,x) free((y))
|
#define openair_free(y,x) free((y))
|
||||||
#define PAGE_SIZE 4096
|
#define PAGE_SIZE 4096
|
||||||
|
|
||||||
|
//#ifdef SHRLIBDEV
|
||||||
|
//extern int rxrescale;
|
||||||
|
//#define RX_IQRESCALELEN rxrescale
|
||||||
|
//#else
|
||||||
|
//#define RX_IQRESCALELEN 15
|
||||||
|
//#endif
|
||||||
|
|
||||||
//! \brief Allocate \c size bytes of memory on the heap with alignment 16 and zero it afterwards.
|
//! \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.
|
//! If no more memory is available, this function will terminate the program with an assertion error.
|
||||||
static inline void* malloc16_clear( size_t size )
|
static inline void* malloc16_clear( size_t size )
|
||||||
@@ -271,6 +278,9 @@ typedef struct PHY_VARS_eNB_s {
|
|||||||
int **dl_precoder_SeNB[3];
|
int **dl_precoder_SeNB[3];
|
||||||
char log2_maxp; /// holds the maximum channel/precoder coefficient
|
char log2_maxp; /// holds the maximum channel/precoder coefficient
|
||||||
|
|
||||||
|
/// if ==0 enables phy only test mode
|
||||||
|
int mac_enabled;
|
||||||
|
|
||||||
/// For emulation only (used by UE abstraction to retrieve DCI)
|
/// For emulation only (used by UE abstraction to retrieve DCI)
|
||||||
uint8_t num_common_dci[2]; // num_dci in even/odd subframes
|
uint8_t num_common_dci[2]; // num_dci in even/odd subframes
|
||||||
uint8_t num_ue_spec_dci[2]; // num_dci in even/odd subframes
|
uint8_t num_ue_spec_dci[2]; // num_dci in even/odd subframes
|
||||||
@@ -313,6 +323,8 @@ typedef struct PHY_VARS_eNB_s {
|
|||||||
struct PhysicalConfigDedicated *physicalConfigDedicated[NUMBER_OF_UE_MAX];
|
struct PhysicalConfigDedicated *physicalConfigDedicated[NUMBER_OF_UE_MAX];
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t rb_mask_ul[4];
|
||||||
|
|
||||||
/// Information regarding TM5
|
/// Information regarding TM5
|
||||||
MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];
|
MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];
|
||||||
|
|
||||||
@@ -374,12 +386,13 @@ typedef struct PHY_VARS_eNB_s {
|
|||||||
#ifdef LOCALIZATION
|
#ifdef LOCALIZATION
|
||||||
/// time state for localization
|
/// time state for localization
|
||||||
time_stats_t localization_stats;
|
time_stats_t localization_stats;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10];
|
int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10];
|
||||||
int32_t pucch1_stats[NUMBER_OF_UE_MAX][10*1024];
|
int32_t pucch1_stats[NUMBER_OF_UE_MAX][10*1024];
|
||||||
|
int32_t pucch1_stats_thres[NUMBER_OF_UE_MAX][10*1024];
|
||||||
int32_t pucch1ab_stats_cnt[NUMBER_OF_UE_MAX][10];
|
int32_t pucch1ab_stats_cnt[NUMBER_OF_UE_MAX][10];
|
||||||
int32_t pucch1ab_stats[NUMBER_OF_UE_MAX][10*1024];
|
int32_t pucch1ab_stats[NUMBER_OF_UE_MAX][2*10*1024];
|
||||||
|
|
||||||
#if ENABLE_RAL
|
#if ENABLE_RAL
|
||||||
hash_table_t *ral_thresholds_timed;
|
hash_table_t *ral_thresholds_timed;
|
||||||
@@ -569,6 +582,9 @@ typedef struct {
|
|||||||
/// holds the maximum channel/precoder coefficient
|
/// holds the maximum channel/precoder coefficient
|
||||||
char log2_maxp;
|
char log2_maxp;
|
||||||
|
|
||||||
|
/// if ==0 enables phy only test mode
|
||||||
|
int mac_enabled;
|
||||||
|
|
||||||
/// Flag to initialize averaging of PHY measurements
|
/// Flag to initialize averaging of PHY measurements
|
||||||
int init_averaging;
|
int init_averaging;
|
||||||
|
|
||||||
|
|||||||
@@ -516,10 +516,10 @@ typedef struct {
|
|||||||
uint8_t dual_tx;
|
uint8_t dual_tx;
|
||||||
/// flag to indicate SISO transmission
|
/// flag to indicate SISO transmission
|
||||||
uint8_t mode1_flag;
|
uint8_t mode1_flag;
|
||||||
|
/// Indicator that 20 MHz channel uses 3/4 sampling frequency
|
||||||
|
uint8_t threequarter_fs;
|
||||||
/// Size of FFT
|
/// Size of FFT
|
||||||
uint16_t ofdm_symbol_size;
|
uint16_t ofdm_symbol_size;
|
||||||
/// log2(Size of FFT)
|
|
||||||
uint8_t log2_symbol_size;
|
|
||||||
/// Number of prefix samples in all but first symbol of slot
|
/// Number of prefix samples in all but first symbol of slot
|
||||||
uint16_t nb_prefix_samples;
|
uint16_t nb_prefix_samples;
|
||||||
/// Number of prefix samples in first symbol of slot
|
/// Number of prefix samples in first symbol of slot
|
||||||
|
|||||||
@@ -44,7 +44,14 @@
|
|||||||
/** @defgroup _ref_implementation_ OpenAirInterface LTE Implementation
|
/** @defgroup _ref_implementation_ OpenAirInterface LTE Implementation
|
||||||
* @{
|
* @{
|
||||||
|
|
||||||
* @defgroup _PHY_RF_INTERFACE_ Generic PHY - RF Interface
|
* @defgroup _PHY_RF_INTERFACE_ PHY - RF Interface
|
||||||
|
* @ingroup _PHY_RF_INTERFACE_
|
||||||
|
* @{
|
||||||
|
* @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface
|
||||||
|
* @defgroup _USRP_PHY_RF_INTERFACE_ PHY - USRP RF Interface
|
||||||
|
* @defgroup _BLADERF_PHY_RF_INTERFACE_ PHY - BLADERF RF Interface
|
||||||
|
* @}
|
||||||
|
*
|
||||||
* @ingroup _ref_implementation_
|
* @ingroup _ref_implementation_
|
||||||
* @{
|
* @{
|
||||||
* This module is responsible for defining the generic interface between PHY and RF Target
|
* This module is responsible for defining the generic interface between PHY and RF Target
|
||||||
@@ -117,7 +124,6 @@
|
|||||||
*/
|
*/
|
||||||
#define NUMBER_OF_OFDM_CARRIERS (frame_parms->ofdm_symbol_size)
|
#define NUMBER_OF_OFDM_CARRIERS (frame_parms->ofdm_symbol_size)
|
||||||
#define NUMBER_OF_SYMBOLS_PER_FRAME (frame_parms->symbols_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)
|
#define NUMBER_OF_SYMBOLS_PER_FRAME (frame_parms->symbols_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)
|
||||||
#define LOG2_NUMBER_OF_OFDM_CARRIERS (frame_parms->log2_symbol_size)
|
|
||||||
#define NUMBER_OF_USEFUL_CARRIERS (12*frame_parms->N_RB_DL)
|
#define NUMBER_OF_USEFUL_CARRIERS (12*frame_parms->N_RB_DL)
|
||||||
#define NUMBER_OF_ZERO_CARRIERS (NUMBER_OF_OFDM_CARRIERS-NUMBER_OF_USEFUL_CARRIERS)
|
#define NUMBER_OF_ZERO_CARRIERS (NUMBER_OF_OFDM_CARRIERS-NUMBER_OF_USEFUL_CARRIERS)
|
||||||
#define NUMBER_OF_USEFUL_CARRIERS_BYTES (NUMBER_OF_USEFUL_CARRIERS>>2)
|
#define NUMBER_OF_USEFUL_CARRIERS_BYTES (NUMBER_OF_USEFUL_CARRIERS>>2)
|
||||||
@@ -340,13 +346,12 @@ typedef struct {
|
|||||||
#define NUMBER_OF_SUBBANDS_MAX 13
|
#define NUMBER_OF_SUBBANDS_MAX 13
|
||||||
#define NUMBER_OF_HARQ_PID_MAX 8
|
#define NUMBER_OF_HARQ_PID_MAX 8
|
||||||
|
|
||||||
#if defined(CBMIMO1) || defined(EXMIMO) || defined(OAI_USRP)
|
|
||||||
#define MAX_FRAME_NUMBER 0x400
|
#define MAX_FRAME_NUMBER 0x400
|
||||||
|
#if defined(CBMIMO1) || defined(EXMIMO) || defined(OAI_USRP)
|
||||||
#define NUMBER_OF_eNB_MAX 1
|
#define NUMBER_OF_eNB_MAX 1
|
||||||
#define NUMBER_OF_UE_MAX 4
|
#define NUMBER_OF_UE_MAX 4
|
||||||
#define NUMBER_OF_CONNECTED_eNB_MAX 3
|
#define NUMBER_OF_CONNECTED_eNB_MAX 3
|
||||||
#else
|
#else
|
||||||
#define MAX_FRAME_NUMBER 0xFFFF
|
|
||||||
#ifdef LARGE_SCALE
|
#ifdef LARGE_SCALE
|
||||||
#define NUMBER_OF_eNB_MAX 2
|
#define NUMBER_OF_eNB_MAX 2
|
||||||
#define NUMBER_OF_UE_MAX 120
|
#define NUMBER_OF_UE_MAX 120
|
||||||
@@ -471,13 +476,13 @@ typedef struct {
|
|||||||
//! estimated avg noise power (dB)
|
//! estimated avg noise power (dB)
|
||||||
short n0_power_tot_dBm;
|
short n0_power_tot_dBm;
|
||||||
//! estimated avg noise power per RB per RX ant (lin)
|
//! estimated avg noise power per RB per RX ant (lin)
|
||||||
unsigned short n0_subband_power[NB_ANTENNAS_RX][25];
|
unsigned short n0_subband_power[NB_ANTENNAS_RX][100];
|
||||||
//! estimated avg noise power per RB per RX ant (dB)
|
//! estimated avg noise power per RB per RX ant (dB)
|
||||||
unsigned short n0_subband_power_dB[NB_ANTENNAS_RX][25];
|
unsigned short n0_subband_power_dB[NB_ANTENNAS_RX][100];
|
||||||
//! estimated avg noise power per RB (dB)
|
//! estimated avg noise power per RB (dB)
|
||||||
short n0_subband_power_tot_dB[25];
|
short n0_subband_power_tot_dB[100];
|
||||||
//! estimated avg noise power per RB (dBm)
|
//! estimated avg noise power per RB (dBm)
|
||||||
short n0_subband_power_tot_dBm[25];
|
short n0_subband_power_tot_dBm[100];
|
||||||
// eNB measurements (per user)
|
// eNB measurements (per user)
|
||||||
//! estimated received spatial signal power (linear)
|
//! estimated received spatial signal power (linear)
|
||||||
unsigned int rx_spatial_power[NUMBER_OF_UE_MAX][2][2];
|
unsigned int rx_spatial_power[NUMBER_OF_UE_MAX][2][2];
|
||||||
@@ -497,13 +502,13 @@ typedef struct {
|
|||||||
/// Wideband CQI (sum of all RX antennas, in dB)
|
/// Wideband CQI (sum of all RX antennas, in dB)
|
||||||
char wideband_cqi_tot[NUMBER_OF_UE_MAX];
|
char wideband_cqi_tot[NUMBER_OF_UE_MAX];
|
||||||
/// Subband CQI per RX antenna and RB (= SINR)
|
/// Subband CQI per RX antenna and RB (= SINR)
|
||||||
int subband_cqi[NUMBER_OF_UE_MAX][NB_ANTENNAS_RX][25];
|
int subband_cqi[NUMBER_OF_UE_MAX][NB_ANTENNAS_RX][100];
|
||||||
/// Total Subband CQI and RB (= SINR)
|
/// Total Subband CQI and RB (= SINR)
|
||||||
int subband_cqi_tot[NUMBER_OF_UE_MAX][25];
|
int subband_cqi_tot[NUMBER_OF_UE_MAX][100];
|
||||||
/// Subband CQI in dB and RB (= SINR dB)
|
/// Subband CQI in dB and RB (= SINR dB)
|
||||||
int subband_cqi_dB[NUMBER_OF_UE_MAX][NB_ANTENNAS_RX][25];
|
int subband_cqi_dB[NUMBER_OF_UE_MAX][NB_ANTENNAS_RX][100];
|
||||||
/// Total Subband CQI and RB
|
/// Total Subband CQI and RB
|
||||||
int subband_cqi_tot_dB[NUMBER_OF_UE_MAX][25];
|
int subband_cqi_tot_dB[NUMBER_OF_UE_MAX][100];
|
||||||
|
|
||||||
} PHY_MEASUREMENTS_eNB;
|
} PHY_MEASUREMENTS_eNB;
|
||||||
|
|
||||||
|
|||||||
@@ -399,8 +399,9 @@ uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, ui
|
|||||||
|
|
||||||
uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1);
|
uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1);
|
||||||
|
|
||||||
int get_nCCE_offset(unsigned char L, int nCCE, int common_dci, unsigned short rnti, unsigned char subframe);
|
|
||||||
|
|
||||||
|
void put_harq_pid_in_freelist(LTE_eNB_DLSCH_t *DLSCH_ptr, int harq_pid);
|
||||||
|
void remove_harq_pid_from_freelist(LTE_eNB_DLSCH_t *DLSCH_ptr, int harq_pid);
|
||||||
|
|
||||||
int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
||||||
int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
||||||
|
|||||||
@@ -0,0 +1,756 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
OpenAirInterface
|
||||||
|
Copyright(c) 1999 - 2014 Eurecom
|
||||||
|
|
||||||
|
OpenAirInterface is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
|
||||||
|
OpenAirInterface is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenAirInterface.The full GNU General Public License is
|
||||||
|
included in this distribution in the file called "COPYING". If not,
|
||||||
|
see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Contact Information
|
||||||
|
OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||||
|
OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||||
|
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
||||||
|
|
||||||
|
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||||
|
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
/*! \file phy_mac_stub.c
|
||||||
|
* \brief stimulates the phy without mac
|
||||||
|
* \author R. Knopp, F. Kaltenberger, N. Nikaein
|
||||||
|
* \date 2011
|
||||||
|
* \version 0.1
|
||||||
|
* \company Eurecom
|
||||||
|
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr
|
||||||
|
* \note
|
||||||
|
* \warning
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PHY/defs.h"
|
||||||
|
#include "PHY/extern.h"
|
||||||
|
#include "MAC_INTERFACE/defs.h"
|
||||||
|
#include "MAC_INTERFACE/extern.h"
|
||||||
|
#include "SCHED/defs.h"
|
||||||
|
#include "SCHED/extern.h"
|
||||||
|
#include "LAYER2/MAC/extern.h"
|
||||||
|
|
||||||
|
#ifdef EMOS
|
||||||
|
#include "SCHED/phy_procedures_emos.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB)
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
|
||||||
|
uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
|
||||||
|
|
||||||
|
uint32_t rballoc = 0x7FFF;
|
||||||
|
uint32_t rballoc2 = 0x000F;
|
||||||
|
int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
|
||||||
|
|
||||||
|
LTE_eNB_DLSCH_t *DLSCH_ptr = phy_vars_eNB->dlsch_eNB[0][0];
|
||||||
|
|
||||||
|
/*
|
||||||
|
uint32_t rand = taus();
|
||||||
|
if ((subframe==8) || (subframe==9) || (subframe==0))
|
||||||
|
rand = (rand%5)+5;
|
||||||
|
else
|
||||||
|
rand = (rand%4)+5;
|
||||||
|
*/
|
||||||
|
uint32_t bcch_pdu;
|
||||||
|
uint64_t dlsch_pdu;
|
||||||
|
|
||||||
|
DCI_pdu->Num_common_dci = 0;
|
||||||
|
DCI_pdu->Num_ue_spec_dci=0;
|
||||||
|
|
||||||
|
switch (subframe) {
|
||||||
|
case 5:
|
||||||
|
DCI_pdu->Num_common_dci = 1;
|
||||||
|
DCI_pdu->dci_alloc[0].L = 2;
|
||||||
|
DCI_pdu->dci_alloc[0].rnti = SI_RNTI;
|
||||||
|
DCI_pdu->dci_alloc[0].format = format1A;
|
||||||
|
DCI_pdu->dci_alloc[0].ra_flag = 0;
|
||||||
|
|
||||||
|
switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
|
||||||
|
case 6:
|
||||||
|
if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t));
|
||||||
|
} else {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 25:
|
||||||
|
default:
|
||||||
|
if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
|
||||||
|
((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
|
||||||
|
} else {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 50:
|
||||||
|
if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
|
||||||
|
((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t));
|
||||||
|
} else {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 100:
|
||||||
|
if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_FDD_t;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
|
||||||
|
((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t));
|
||||||
|
} else {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break; //subframe switch
|
||||||
|
|
||||||
|
/*
|
||||||
|
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;
|
||||||
|
|
||||||
|
DLSCH_alloc_pdu1.rballoc = 0x00ff;
|
||||||
|
DLSCH_alloc_pdu1.TPC = 0;
|
||||||
|
DLSCH_alloc_pdu1.dai = 0;
|
||||||
|
DLSCH_alloc_pdu1.harq_pid = 0;
|
||||||
|
DLSCH_alloc_pdu1.tb_swap = 0;
|
||||||
|
DLSCH_alloc_pdu1.mcs1 = 0;
|
||||||
|
DLSCH_alloc_pdu1.ndi1 = 1;
|
||||||
|
DLSCH_alloc_pdu1.rv1 = 0;
|
||||||
|
DLSCH_alloc_pdu1.tpmi = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t));
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
|
||||||
|
default:
|
||||||
|
case 7:
|
||||||
|
DCI_pdu->Num_ue_spec_dci = 1;
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (transmission_mode<3) {
|
||||||
|
//user 1
|
||||||
|
switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
|
||||||
|
case 25:
|
||||||
|
if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t;
|
||||||
|
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
//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;
|
||||||
|
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
|
||||||
|
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
|
||||||
|
|
||||||
|
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
|
||||||
|
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
//((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
|
||||||
|
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
//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;
|
||||||
|
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
|
||||||
|
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 50:
|
||||||
|
|
||||||
|
if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_FDD_t;
|
||||||
|
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
//((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
//user2
|
||||||
|
DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_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;
|
||||||
|
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
|
||||||
|
//((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t));
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_TDD_t;
|
||||||
|
|
||||||
|
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
|
||||||
|
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
//((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
|
||||||
|
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
//user2
|
||||||
|
DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_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;
|
||||||
|
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
|
||||||
|
//((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
|
||||||
|
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 100:
|
||||||
|
if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t;
|
||||||
|
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
//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;
|
||||||
|
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
|
||||||
|
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
|
||||||
|
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_20MHz_TDD_t;
|
||||||
|
|
||||||
|
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
|
||||||
|
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
//((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
|
||||||
|
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
//user2
|
||||||
|
DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_20MHz_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;
|
||||||
|
|
||||||
|
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
|
||||||
|
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
|
||||||
|
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0;
|
||||||
|
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
|
||||||
|
//((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
|
||||||
|
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
|
||||||
|
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (transmission_mode==4) {
|
||||||
|
DCI_pdu->Num_ue_spec_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;
|
||||||
|
|
||||||
|
((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;
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0;
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0;
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0;
|
||||||
|
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = openair_daq_vars.ue_dl_rb_alloc;
|
||||||
|
((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;
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
|
||||||
|
DLSCH_alloc_pdu1E.rv = 0;
|
||||||
|
DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
//DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
|
||||||
|
//DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28);
|
||||||
|
DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
//DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
|
||||||
|
phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
|
||||||
|
DLSCH_alloc_pdu1E.harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
|
||||||
|
DLSCH_alloc_pdu1E.dai = 0;
|
||||||
|
DLSCH_alloc_pdu1E.TPC = 0;
|
||||||
|
DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc;
|
||||||
|
DLSCH_alloc_pdu1E.rah = 0;
|
||||||
|
DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present
|
||||||
|
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;
|
||||||
|
//DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
//DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28);
|
||||||
|
//DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
|
||||||
|
DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28);
|
||||||
|
phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
|
||||||
|
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
|
||||||
|
|
||||||
|
// set the precoder of the second UE orthogonal to the first
|
||||||
|
phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555);
|
||||||
|
}
|
||||||
|
|
||||||
|
break; //subframe switch
|
||||||
|
|
||||||
|
/*
|
||||||
|
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;
|
||||||
|
|
||||||
|
RA_alloc_pdu.type = 1;
|
||||||
|
RA_alloc_pdu.vrb_type = 0;
|
||||||
|
RA_alloc_pdu.rballoc = computeRIV(25,12,3);
|
||||||
|
RA_alloc_pdu.ndi = 1;
|
||||||
|
RA_alloc_pdu.rv = 1;
|
||||||
|
RA_alloc_pdu.mcs = 4;
|
||||||
|
RA_alloc_pdu.harq_pid = 0;
|
||||||
|
RA_alloc_pdu.TPC = 1;
|
||||||
|
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
case 9:
|
||||||
|
DCI_pdu->Num_ue_spec_dci = 1;
|
||||||
|
|
||||||
|
//user 1
|
||||||
|
if (phy_vars_eNB->lte_frame_parms.frame_type == FDD)
|
||||||
|
DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_FDD_t ;
|
||||||
|
else
|
||||||
|
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;
|
||||||
|
|
||||||
|
UL_alloc_pdu.type = 0;
|
||||||
|
UL_alloc_pdu.hopping = 0;
|
||||||
|
UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb);
|
||||||
|
UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
|
||||||
|
UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
UL_alloc_pdu.TPC = 0;
|
||||||
|
UL_alloc_pdu.cshift = 0;
|
||||||
|
UL_alloc_pdu.dai = 0;
|
||||||
|
UL_alloc_pdu.cqi_req = 1;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
|
||||||
|
*/
|
||||||
|
// user 2
|
||||||
|
/*
|
||||||
|
DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
|
||||||
|
DCI_pdu->dci_alloc[1].L = 2;
|
||||||
|
DCI_pdu->dci_alloc[1].rnti = 0x1236;
|
||||||
|
DCI_pdu->dci_alloc[1].format = format0;
|
||||||
|
DCI_pdu->dci_alloc[1].ra_flag = 0;
|
||||||
|
|
||||||
|
UL_alloc_pdu.type = 0;
|
||||||
|
UL_alloc_pdu.hopping = 0;
|
||||||
|
if (cooperation_flag==0)
|
||||||
|
UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
|
||||||
|
else
|
||||||
|
UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
|
||||||
|
UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
|
||||||
|
UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
|
||||||
|
UL_alloc_pdu.TPC = 0;
|
||||||
|
if ((cooperation_flag==0) || (cooperation_flag==1))
|
||||||
|
UL_alloc_pdu.cshift = 0;
|
||||||
|
else
|
||||||
|
UL_alloc_pdu.cshift = 1;
|
||||||
|
UL_alloc_pdu.dai = 0;
|
||||||
|
UL_alloc_pdu.cqi_req = 1;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*default:
|
||||||
|
break;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
DCI_pdu->nCCE = 0;
|
||||||
|
|
||||||
|
for (i=0; i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
|
||||||
|
DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB)
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
|
||||||
|
uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
|
||||||
|
|
||||||
|
//uint32_t rballoc = 0x00F0;
|
||||||
|
//uint32_t rballoc2 = 0x000F;
|
||||||
|
/*
|
||||||
|
uint32_t rand = taus();
|
||||||
|
if ((subframe==8) || (subframe==9) || (subframe==0))
|
||||||
|
rand = (rand%5)+5;
|
||||||
|
else
|
||||||
|
rand = (rand%4)+5;
|
||||||
|
*/
|
||||||
|
|
||||||
|
DCI_pdu->Num_common_dci = 0;
|
||||||
|
DCI_pdu->Num_ue_spec_dci=0;
|
||||||
|
|
||||||
|
switch (subframe) {
|
||||||
|
case 5:
|
||||||
|
DCI_pdu->Num_ue_spec_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;
|
||||||
|
|
||||||
|
DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc;
|
||||||
|
DLSCH_alloc_pdu.TPC = 0;
|
||||||
|
DLSCH_alloc_pdu.dai = 0;
|
||||||
|
DLSCH_alloc_pdu.harq_pid = 1;
|
||||||
|
DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
DLSCH_alloc_pdu.ndi = 1;
|
||||||
|
DLSCH_alloc_pdu.rv = 0;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
//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;
|
||||||
|
|
||||||
|
DLSCH_alloc_pdu.rballoc = rballoc2;
|
||||||
|
DLSCH_alloc_pdu.TPC = 0;
|
||||||
|
DLSCH_alloc_pdu.dai = 0;
|
||||||
|
DLSCH_alloc_pdu.harq_pid = 1;
|
||||||
|
DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
DLSCH_alloc_pdu.ndi = 1;
|
||||||
|
DLSCH_alloc_pdu.rv = 0;
|
||||||
|
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;
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
|
||||||
|
DLSCH_alloc_pdu1E.rv = 0;
|
||||||
|
DLSCH_alloc_pdu1E.ndi = 1;
|
||||||
|
DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
|
||||||
|
DLSCH_alloc_pdu1E.harq_pid = 1;
|
||||||
|
DLSCH_alloc_pdu1E.dai = 0;
|
||||||
|
DLSCH_alloc_pdu1E.TPC = 0;
|
||||||
|
DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc;
|
||||||
|
DLSCH_alloc_pdu1E.rah = 0;
|
||||||
|
DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present
|
||||||
|
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;
|
||||||
|
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
|
||||||
|
|
||||||
|
// set the precoder of the second UE orthogonal to the first
|
||||||
|
phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
RA_alloc_pdu.type = 1;
|
||||||
|
RA_alloc_pdu.vrb_type = 0;
|
||||||
|
RA_alloc_pdu.rballoc = computeRIV(25,12,3);
|
||||||
|
RA_alloc_pdu.ndi = 1;
|
||||||
|
RA_alloc_pdu.rv = 1;
|
||||||
|
RA_alloc_pdu.mcs = 4;
|
||||||
|
RA_alloc_pdu.harq_pid = 0;
|
||||||
|
RA_alloc_pdu.TPC = 1;
|
||||||
|
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
DCI_pdu->Num_ue_spec_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;
|
||||||
|
|
||||||
|
UL_alloc_pdu.type = 0;
|
||||||
|
UL_alloc_pdu.hopping = 0;
|
||||||
|
UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
|
||||||
|
UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
|
||||||
|
UL_alloc_pdu.ndi = 1;
|
||||||
|
UL_alloc_pdu.TPC = 0;
|
||||||
|
UL_alloc_pdu.cshift = 0;
|
||||||
|
UL_alloc_pdu.dai = 0;
|
||||||
|
UL_alloc_pdu.cqi_req = 1;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
//user 2
|
||||||
|
DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
|
||||||
|
DCI_pdu->dci_alloc[1].L = 2;
|
||||||
|
DCI_pdu->dci_alloc[1].rnti = 0x1236;
|
||||||
|
DCI_pdu->dci_alloc[1].format = format0;
|
||||||
|
DCI_pdu->dci_alloc[1].ra_flag = 0;
|
||||||
|
|
||||||
|
UL_alloc_pdu.type = 0;
|
||||||
|
UL_alloc_pdu.hopping = 0;
|
||||||
|
if (cooperation_flag==0)
|
||||||
|
UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
|
||||||
|
else
|
||||||
|
UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
|
||||||
|
UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
|
||||||
|
UL_alloc_pdu.ndi = 1;
|
||||||
|
UL_alloc_pdu.TPC = 0;
|
||||||
|
if ((cooperation_flag==0) || (cooperation_flag==1))
|
||||||
|
UL_alloc_pdu.cshift = 0;
|
||||||
|
else
|
||||||
|
UL_alloc_pdu.cshift = 1;
|
||||||
|
UL_alloc_pdu.dai = 0;
|
||||||
|
UL_alloc_pdu.cqi_req = 1;
|
||||||
|
memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
DCI_pdu->nCCE = 0;
|
||||||
|
|
||||||
|
for (i=0; i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
|
||||||
|
DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -405,8 +405,8 @@ uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
if (harq_ack[0].send_harq_status == 1)
|
if (harq_ack[0].send_harq_status == 1)
|
||||||
o_ACK[1] = harq_ack[0].ack;
|
o_ACK[1] = harq_ack[0].ack;
|
||||||
} else if (harq_ack[8].send_harq_status == 1)
|
} else if (harq_ack[0].send_harq_status == 1)
|
||||||
o_ACK[0] = harq_ack[8].ack;
|
o_ACK[0] = harq_ack[0].ack;
|
||||||
|
|
||||||
status = harq_ack[9].send_harq_status + (harq_ack[0].send_harq_status<<1);
|
status = harq_ack[9].send_harq_status + (harq_ack[0].send_harq_status<<1);
|
||||||
//printf("Subframe 4, TDD config 3: harq_ack[9] = %d,harq_ack[0] = %d\n",harq_ack[9].ack,harq_ack[0].ack);
|
//printf("Subframe 4, TDD config 3: harq_ack[9] = %d,harq_ack[0] = %d\n",harq_ack[9].ack,harq_ack[0].ack);
|
||||||
|
|||||||
+308
-1040
File diff suppressed because it is too large
Load Diff
@@ -59,20 +59,15 @@ extern int card;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define DEBUG_PHY_PROC
|
#define DEBUG_PHY_PROC
|
||||||
#define UE_TX_POWER (-10)
|
|
||||||
|
|
||||||
//#ifdef OPENAIR2
|
|
||||||
#ifndef PUCCH
|
#ifndef PUCCH
|
||||||
#define PUCCH
|
#define PUCCH
|
||||||
#endif
|
#endif
|
||||||
//#endif
|
|
||||||
|
|
||||||
//#ifdef OPENAIR2
|
|
||||||
#include "LAYER2/MAC/extern.h"
|
#include "LAYER2/MAC/extern.h"
|
||||||
#include "LAYER2/MAC/defs.h"
|
#include "LAYER2/MAC/defs.h"
|
||||||
#include "UTIL/LOG/log.h"
|
#include "UTIL/LOG/log.h"
|
||||||
//#endif
|
|
||||||
|
|
||||||
#ifdef EMOS
|
#ifdef EMOS
|
||||||
fifo_dump_emos_UE emos_dump_UE;
|
fifo_dump_emos_UE emos_dump_UE;
|
||||||
@@ -87,9 +82,6 @@ fifo_dump_emos_UE emos_dump_UE;
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef OPENAIR2
|
|
||||||
//#define DIAG_PHY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DLSCH_RB_ALLOC 0x1fbf // skip DC RB (total 23/25 RBs)
|
#define DLSCH_RB_ALLOC 0x1fbf // skip DC RB (total 23/25 RBs)
|
||||||
#define DLSCH_RB_ALLOC_12 0x0aaa // skip DC RB (total 23/25 RBs)
|
#define DLSCH_RB_ALLOC_12 0x0aaa // skip DC RB (total 23/25 RBs)
|
||||||
@@ -121,7 +113,7 @@ extern int rx_sig_fifo;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
extern uint32_t downlink_frequency[MAX_NUM_CCs][4];
|
extern uint32_t downlink_frequency[MAX_NUM_CCs][4];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -168,7 +160,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
|
|||||||
1,
|
1,
|
||||||
phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
|
phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
|
||||||
phy_vars_ue->frame_rx,subframe);
|
phy_vars_ue->frame_rx,subframe);
|
||||||
LOG_I(PHY,"[UE %d] Dumping dlsch_SI : ofdm_symbol_size %d, nsymb %d, nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n",
|
LOG_D(PHY,"[UE %d] Dumping dlsch_SI : ofdm_symbol_size %d, nsymb %d, nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n",
|
||||||
phy_vars_ue->Mod_id,
|
phy_vars_ue->Mod_id,
|
||||||
phy_vars_ue->lte_frame_parms.ofdm_symbol_size,
|
phy_vars_ue->lte_frame_parms.ofdm_symbol_size,
|
||||||
nsymb,
|
nsymb,
|
||||||
@@ -197,7 +189,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
//unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162};
|
//unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162};
|
||||||
/*
|
/*
|
||||||
unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL)
|
unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL)
|
||||||
@@ -454,7 +446,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue,
|
|||||||
|
|
||||||
if (frame_parms->frame_type == FDD ) { // FDD
|
if (frame_parms->frame_type == FDD ) { // FDD
|
||||||
sf = (subframe<4)? subframe+6 : subframe-4;
|
sf = (subframe<4)? subframe+6 : subframe-4;
|
||||||
printf("n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
|
LOG_D(PHY,"n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
|
||||||
|
|
||||||
if (SR == 0)
|
if (SR == 0)
|
||||||
return(frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
|
return(frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
|
||||||
@@ -642,16 +634,12 @@ void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
|
int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
|
||||||
#ifndef OPENAIR2
|
|
||||||
PRACH_RESOURCES_t prach_resources_local;
|
PRACH_RESOURCES_t prach_resources_local;
|
||||||
#endif
|
|
||||||
|
|
||||||
void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type)
|
void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifndef OPENAIR2
|
|
||||||
int i;
|
int i;
|
||||||
#endif
|
|
||||||
uint16_t first_rb, nb_rb;
|
uint16_t first_rb, nb_rb;
|
||||||
uint8_t harq_pid;
|
uint8_t harq_pid;
|
||||||
unsigned int input_buffer_length;
|
unsigned int input_buffer_length;
|
||||||
@@ -669,7 +657,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
uint8_t ack_status=0;
|
uint8_t ack_status=0;
|
||||||
int8_t Po_PUCCH;
|
int8_t Po_PUCCH;
|
||||||
int32_t ulsch_start=0;
|
int32_t ulsch_start=0;
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
int overflow=0;
|
int overflow=0;
|
||||||
int k,l;
|
int k,l;
|
||||||
#endif
|
#endif
|
||||||
@@ -724,8 +712,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
subframe_tx);
|
subframe_tx);
|
||||||
|
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled == 1) {
|
||||||
|
|
||||||
if ((phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) &&
|
if ((phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) &&
|
||||||
(phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id] == frame_tx) &&
|
(phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id] == frame_tx) &&
|
||||||
(phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3
|
(phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3
|
||||||
@@ -756,8 +743,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
|
|
||||||
Msg3_flag=0;
|
Msg3_flag=0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
|
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
|
||||||
|
|
||||||
@@ -856,19 +842,17 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
#endif
|
#endif
|
||||||
stop_meas(&phy_vars_ue->ulsch_encoding_stats);
|
stop_meas(&phy_vars_ue->ulsch_encoding_stats);
|
||||||
|
|
||||||
|
if (phy_vars_ue->mac_enabled == 1) {
|
||||||
#ifdef OPENAIR2
|
// signal MAC that Msg3 was sent
|
||||||
// signal MAC that Msg3 was sent
|
mac_xface->Msg3_transmitted(Mod_id,
|
||||||
mac_xface->Msg3_transmitted(Mod_id,
|
CC_id,
|
||||||
CC_id,
|
frame_tx,
|
||||||
frame_tx,
|
eNB_id);
|
||||||
eNB_id);
|
}
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8;
|
input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8;
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled==1) {
|
||||||
|
|
||||||
// LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id);
|
// LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id);
|
||||||
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) {
|
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) {
|
||||||
//if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
|
//if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
|
||||||
@@ -905,7 +889,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
LOG_T(PHY,"\n");
|
LOG_T(PHY,"\n");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#else //OPENAIR2
|
}
|
||||||
|
else {
|
||||||
// the following lines were necessary for the calibration in CROWN
|
// the following lines were necessary for the calibration in CROWN
|
||||||
/*
|
/*
|
||||||
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
|
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
|
||||||
@@ -928,8 +913,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
for (i=0;i<input_buffer_length;i++)
|
for (i=0;i<input_buffer_length;i++)
|
||||||
ulsch_input_buffer[i]= i;
|
ulsch_input_buffer[i]= i;
|
||||||
*/
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
#endif //OPENAIR2
|
|
||||||
start_meas(&phy_vars_ue->ulsch_encoding_stats);
|
start_meas(&phy_vars_ue->ulsch_encoding_stats);
|
||||||
|
|
||||||
if (abstraction_flag==0) {
|
if (abstraction_flag==0) {
|
||||||
@@ -961,15 +946,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (abstraction_flag == 0) {
|
if (abstraction_flag == 0) {
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled==1) {
|
||||||
pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag);
|
pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag);
|
||||||
phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH;
|
phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH;
|
||||||
#else
|
}
|
||||||
phy_vars_ue->tx_power_dBm = UE_TX_POWER;
|
else {
|
||||||
#endif
|
phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm;
|
||||||
|
}
|
||||||
phy_vars_ue->tx_total_RE = nb_rb*12;
|
phy_vars_ue->tx_total_RE = nb_rb*12;
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
tx_amp = get_tx_amp(phy_vars_ue->tx_power_dBm,
|
tx_amp = get_tx_amp(phy_vars_ue->tx_power_dBm,
|
||||||
phy_vars_ue->tx_power_max_dBm,
|
phy_vars_ue->tx_power_max_dBm,
|
||||||
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
||||||
@@ -1023,17 +1009,19 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
if (is_SR_TXOp(phy_vars_ue,eNB_id,subframe_tx)==1) {
|
if (is_SR_TXOp(phy_vars_ue,eNB_id,subframe_tx)==1) {
|
||||||
LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n",
|
LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n",
|
||||||
Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx);
|
Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx);
|
||||||
#ifdef OPENAIR2
|
|
||||||
SR_payload = mac_xface->ue_get_SR(Mod_id,
|
|
||||||
CC_id,
|
|
||||||
frame_tx,
|
|
||||||
eNB_id,
|
|
||||||
phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
|
|
||||||
subframe_tx); // subframe used for meas gap
|
|
||||||
#else
|
|
||||||
SR_payload = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
if (phy_vars_ue->mac_enabled==1) {
|
||||||
|
SR_payload = mac_xface->ue_get_SR(Mod_id,
|
||||||
|
CC_id,
|
||||||
|
frame_tx,
|
||||||
|
eNB_id,
|
||||||
|
phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
|
||||||
|
subframe_tx); // subframe used for meas gap
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SR_payload = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (SR_payload>0) {
|
if (SR_payload>0) {
|
||||||
generate_ul_signal = 1;
|
generate_ul_signal = 1;
|
||||||
LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n",
|
LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n",
|
||||||
@@ -1041,8 +1029,9 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
} else {
|
} else {
|
||||||
phy_vars_ue->sr[subframe_tx]=0;
|
phy_vars_ue->sr[subframe_tx]=0;
|
||||||
}
|
}
|
||||||
} else
|
} else {
|
||||||
SR_payload=0;
|
SR_payload=0;
|
||||||
|
}
|
||||||
|
|
||||||
if (get_ack(&phy_vars_ue->lte_frame_parms,
|
if (get_ack(&phy_vars_ue->lte_frame_parms,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack,
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack,
|
||||||
@@ -1057,15 +1046,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
pucch_ack_payload,
|
pucch_ack_payload,
|
||||||
SR_payload);
|
SR_payload);
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled == 1) {
|
||||||
Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format);
|
Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format);
|
||||||
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
}
|
||||||
#else
|
else {
|
||||||
phy_vars_ue->tx_power_dBm = UE_TX_POWER;
|
Po_PUCCH = phy_vars_ue->tx_power_max_dBm;
|
||||||
#endif
|
}
|
||||||
|
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
||||||
phy_vars_ue->tx_total_RE = 12;
|
phy_vars_ue->tx_total_RE = 12;
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
tx_amp = get_tx_amp(Po_PUCCH,
|
tx_amp = get_tx_amp(Po_PUCCH,
|
||||||
phy_vars_ue->tx_power_max_dBm,
|
phy_vars_ue->tx_power_max_dBm,
|
||||||
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
||||||
@@ -1120,15 +1110,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
}
|
}
|
||||||
} else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC
|
} else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled == 1) {
|
||||||
Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1);
|
Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1);
|
||||||
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
}
|
||||||
#else
|
else {
|
||||||
phy_vars_ue->tx_power_dBm = UE_TX_POWER;
|
Po_PUCCH = phy_vars_ue->tx_power_max_dBm;
|
||||||
#endif
|
}
|
||||||
|
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
||||||
phy_vars_ue->tx_total_RE = 12;
|
phy_vars_ue->tx_total_RE = 12;
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
tx_amp = get_tx_amp(Po_PUCCH,
|
tx_amp = get_tx_amp(Po_PUCCH,
|
||||||
phy_vars_ue->tx_power_max_dBm,
|
phy_vars_ue->tx_power_max_dBm,
|
||||||
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
||||||
@@ -1230,7 +1221,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
if (abstraction_flag == 0) {
|
if (abstraction_flag == 0) {
|
||||||
nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
|
nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP) //this is the EXPRESS MIMO case
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case
|
||||||
ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
|
ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
|
||||||
openair_daq_vars.timing_advance-
|
openair_daq_vars.timing_advance-
|
||||||
phy_vars_ue->timing_advance-
|
phy_vars_ue->timing_advance-
|
||||||
@@ -1257,18 +1248,18 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
|
PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
dummy_tx_buffer,
|
dummy_tx_buffer,
|
||||||
#else
|
#else
|
||||||
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
|
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
|
||||||
#endif
|
#endif
|
||||||
frame_parms->log2_symbol_size,
|
frame_parms->ofdm_symbol_size,
|
||||||
nsymb,
|
nsymb,
|
||||||
frame_parms->nb_prefix_samples,
|
frame_parms->nb_prefix_samples,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
else
|
else
|
||||||
normal_prefix_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
|
normal_prefix_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
dummy_tx_buffer,
|
dummy_tx_buffer,
|
||||||
#else
|
#else
|
||||||
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
|
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
|
||||||
@@ -1289,7 +1280,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
#ifndef OFDMA_ULSCH
|
#ifndef OFDMA_ULSCH
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,0);
|
apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,0);
|
||||||
apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,1);
|
apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,1);
|
||||||
#else
|
#else
|
||||||
@@ -1304,7 +1295,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
*/
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
overflow = ulsch_start - 9*frame_parms->samples_per_tti;
|
overflow = ulsch_start - 9*frame_parms->samples_per_tti;
|
||||||
|
|
||||||
//if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow);
|
//if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow);
|
||||||
@@ -1345,30 +1336,23 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
// }// slot_tx is even
|
// }// slot_tx is even
|
||||||
// else { // slot_tx is odd, do the PRACH here
|
// else { // slot_tx is odd, do the PRACH here
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
|
||||||
|
|
||||||
if ((phy_vars_ue->UE_mode[eNB_id] == PRACH) && (phy_vars_ue->lte_frame_parms.prach_config_common.prach_Config_enabled==1)) {
|
if ((phy_vars_ue->UE_mode[eNB_id] == PRACH) && (phy_vars_ue->lte_frame_parms.prach_config_common.prach_Config_enabled==1)) {
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
if (1) {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// check if we have PRACH opportunity
|
// check if we have PRACH opportunity
|
||||||
if (is_prach_subframe(&phy_vars_ue->lte_frame_parms,frame_tx,subframe_tx)) {
|
if (is_prach_subframe(&phy_vars_ue->lte_frame_parms,frame_tx,subframe_tx)) {
|
||||||
phy_vars_ue->generate_prach=0;
|
phy_vars_ue->generate_prach=0;
|
||||||
#ifdef OPENAIR2
|
|
||||||
|
|
||||||
// ask L2 for RACH transport
|
if (phy_vars_ue->mac_enabled==1){
|
||||||
if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
|
// ask L2 for RACH transport
|
||||||
phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id,
|
if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
|
||||||
CC_id,
|
phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id,
|
||||||
frame_tx,
|
CC_id,
|
||||||
eNB_id,
|
frame_tx,
|
||||||
subframe_tx);
|
eNB_id,
|
||||||
// LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon);
|
subframe_tx);
|
||||||
}
|
// LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon);
|
||||||
#endif
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (phy_vars_ue->prach_resources[eNB_id]!=NULL) {
|
if (phy_vars_ue->prach_resources[eNB_id]!=NULL) {
|
||||||
|
|
||||||
@@ -1391,20 +1375,17 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index,
|
phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index,
|
||||||
phy_vars_ue->prach_resources[eNB_id]->ra_RNTI);
|
phy_vars_ue->prach_resources[eNB_id]->ra_RNTI);
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if ((phy_vars_ue->mac_enabled==1) && (mode != calib_prach_tx)) {
|
||||||
if (mode != calib_prach_tx)
|
|
||||||
phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id);
|
phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm;
|
phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm;
|
||||||
phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;
|
phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
phy_vars_ue->tx_power_dBm = UE_TX_POWER;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
phy_vars_ue->tx_total_RE = 96;
|
phy_vars_ue->tx_total_RE = 96;
|
||||||
|
|
||||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm,
|
phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm,
|
||||||
phy_vars_ue->tx_power_max_dBm,
|
phy_vars_ue->tx_power_max_dBm,
|
||||||
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
phy_vars_ue->lte_frame_parms.N_RB_UL,
|
||||||
@@ -1431,12 +1412,12 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
|||||||
} else {
|
} else {
|
||||||
UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1;
|
UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1;
|
||||||
UE_transport_info[Mod_id][CC_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex;
|
UE_transport_info[Mod_id][CC_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex;
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled==1){
|
||||||
mac_xface->Msg1_transmitted(Mod_id,
|
mac_xface->Msg1_transmitted(Mod_id,
|
||||||
CC_id,
|
CC_id,
|
||||||
frame_tx,
|
frame_tx,
|
||||||
eNB_id);
|
eNB_id);
|
||||||
#endif
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n",
|
LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n",
|
||||||
@@ -1549,11 +1530,15 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t
|
|||||||
if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
|
if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
|
||||||
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
|
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
|
||||||
if (phy_vars_ue->frame_rx%100==0)
|
if (phy_vars_ue->frame_rx%100==0)
|
||||||
gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id],0);
|
gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#ifndef OAI_USRP
|
#ifndef OAI_USRP
|
||||||
phy_adjust_gain (phy_vars_ue,0);
|
#ifndef OAI_BLADERF
|
||||||
|
#ifndef OAI_LMSSDR
|
||||||
|
phy_adjust_gain (phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT);
|
||||||
@@ -1818,11 +1803,11 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
|
|||||||
frame_tx += ((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]&0xfc));
|
frame_tx += ((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]&0xfc));
|
||||||
frame_tx += pbch_phase;
|
frame_tx += pbch_phase;
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled==1) {
|
||||||
mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id,
|
mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id,
|
||||||
phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0);
|
phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0);
|
||||||
#endif
|
}
|
||||||
|
|
||||||
#ifdef EMOS
|
#ifdef EMOS
|
||||||
//emos_dump_UE.frame_tx = frame_tx;
|
//emos_dump_UE.frame_tx = frame_tx;
|
||||||
//emos_dump_UE.mimo_mode = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1];
|
//emos_dump_UE.mimo_mode = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1];
|
||||||
@@ -1902,16 +1887,15 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
|
|||||||
phy_vars_ue->Mod_id,frame_rx, slot_rx);
|
phy_vars_ue->Mod_id,frame_rx, slot_rx);
|
||||||
phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq++;
|
phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq++;
|
||||||
phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors++;
|
phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors++;
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled == 1) {
|
||||||
mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id);
|
mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id);
|
||||||
#else
|
}
|
||||||
|
else{
|
||||||
if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) {
|
if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) {
|
||||||
LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n");
|
LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n");
|
||||||
mac_xface->macphy_exit("More that 100 consecutive PBCH errors!");
|
mac_xface->macphy_exit("More that 100 consecutive PBCH errors!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frame_rx % 100 == 0) {
|
if (frame_rx % 100 == 0) {
|
||||||
@@ -2061,9 +2045,9 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_PHY_PROC
|
//#ifdef DEBUG_PHY_PROC
|
||||||
LOG_D(PHY,"[UE %d] Frame %d, slot %d, Mode %s: DCI found %i\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,mode_string[phy_vars_ue->UE_mode[eNB_id]],dci_cnt);
|
LOG_D(PHY,"[UE %d] Frame %d, slot %d, Mode %s: DCI found %i\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,mode_string[phy_vars_ue->UE_mode[eNB_id]],dci_cnt);
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received += dci_cnt;
|
phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received += dci_cnt;
|
||||||
/*
|
/*
|
||||||
@@ -2101,9 +2085,9 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
|
|||||||
|
|
||||||
#ifdef DEBUG_PHY_PROC
|
#ifdef DEBUG_PHY_PROC
|
||||||
|
|
||||||
if (subframe_rx == 9) { //( frame_rx % 100 == 0) {
|
if ( frame_rx % 100 == 0) {
|
||||||
LOG_D(PHY,"frame %d, subframe %d, rnti %x: dci %d/%d\n",frame_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,i,dci_cnt);
|
LOG_D(PHY,"frame %d, subframe %d, rnti %x: dci %d/%d\n",frame_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,i,dci_cnt);
|
||||||
//dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
|
dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -2412,9 +2396,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
int eNB_id_i = 1;
|
int eNB_id_i = 1;
|
||||||
uint8_t dual_stream_UE = 0;
|
uint8_t dual_stream_UE = 0;
|
||||||
#endif
|
#endif
|
||||||
#ifndef OPENAIR2
|
|
||||||
uint8_t *rar;
|
uint8_t *rar;
|
||||||
#endif
|
|
||||||
int pmch_flag=0;
|
int pmch_flag=0;
|
||||||
uint8_t sync_area=255;
|
uint8_t sync_area=255;
|
||||||
int pmch_mcs=-1;
|
int pmch_mcs=-1;
|
||||||
@@ -2423,9 +2405,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
int slot_rx = phy_vars_ue->slot_rx;
|
int slot_rx = phy_vars_ue->slot_rx;
|
||||||
int subframe_rx = slot_rx>>1;
|
int subframe_rx = slot_rx>>1;
|
||||||
int subframe_prev = (subframe_rx+9)%10;
|
int subframe_prev = (subframe_rx+9)%10;
|
||||||
#ifdef OPENAIR2
|
|
||||||
int CC_id = phy_vars_ue->CC_id;
|
int CC_id = phy_vars_ue->CC_id;
|
||||||
#endif
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
@@ -2444,7 +2424,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
else
|
else
|
||||||
openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3;
|
openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3;
|
||||||
|
|
||||||
LOG_I(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n",
|
LOG_D(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n",
|
||||||
frame_rx,
|
frame_rx,
|
||||||
openair_daq_vars.use_ia_receiver,
|
openair_daq_vars.use_ia_receiver,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs,
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs,
|
||||||
@@ -2622,13 +2602,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
|
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0;
|
phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0;
|
||||||
|
|
||||||
#ifdef DEBUG_PHY_PROC
|
//#ifdef DEBUG_PHY_PROC
|
||||||
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n",
|
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n",
|
||||||
phy_vars_ue->Mod_id,
|
phy_vars_ue->Mod_id,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
||||||
harq_pid,
|
harq_pid,
|
||||||
(subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev);
|
(subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev);
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
if (phy_vars_ue->dlsch_ue[eNB_id][0]) {
|
if (phy_vars_ue->dlsch_ue[eNB_id][0]) {
|
||||||
if (abstraction_flag == 0) {
|
if (abstraction_flag == 0) {
|
||||||
@@ -2674,17 +2654,12 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) {
|
if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) {
|
||||||
phy_vars_ue->dlsch_errors[eNB_id]++;
|
phy_vars_ue->dlsch_errors[eNB_id]++;
|
||||||
|
|
||||||
#ifdef DEBUG_PHY_PROC
|
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n",
|
||||||
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d)\n",
|
|
||||||
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
||||||
harq_pid,frame_rx,subframe_prev,
|
harq_pid,frame_rx,subframe_prev,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
|
||||||
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
|
||||||
// if (abstraction_flag ==0 )
|
|
||||||
//dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid);
|
|
||||||
//mac_xface->macphy_exit("");
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
|
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
|
||||||
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
||||||
@@ -2703,14 +2678,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
LOG_T(PHY,"\n");
|
LOG_T(PHY,"\n");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled == 1) {
|
||||||
mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
|
mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
|
||||||
CC_id,
|
CC_id,
|
||||||
frame_rx,
|
frame_rx,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b,
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3,
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3,
|
||||||
eNB_id);
|
eNB_id);
|
||||||
#endif
|
}
|
||||||
phy_vars_ue->total_TBS[eNB_id] = phy_vars_ue->total_TBS[eNB_id] +
|
phy_vars_ue->total_TBS[eNB_id] = phy_vars_ue->total_TBS[eNB_id] +
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
|
||||||
phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_TBS[eNB_id] +
|
phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_TBS[eNB_id] +
|
||||||
@@ -2799,7 +2774,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
frame_rx,subframe_prev);
|
frame_rx,subframe_prev);
|
||||||
|
|
||||||
#ifdef DEBUG_PHY_PROC
|
#ifdef DEBUG_PHY_PROC
|
||||||
LOG_I(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
|
LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
|
||||||
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
|
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
|
||||||
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G,
|
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G,
|
||||||
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS,
|
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS,
|
||||||
@@ -2847,7 +2822,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
if (ret == (1+phy_vars_ue->dlsch_ue_SI[eNB_id]->max_turbo_iterations)) {
|
if (ret == (1+phy_vars_ue->dlsch_ue_SI[eNB_id]->max_turbo_iterations)) {
|
||||||
phy_vars_ue->dlsch_SI_errors[eNB_id]++;
|
phy_vars_ue->dlsch_SI_errors[eNB_id]++;
|
||||||
#ifdef DEBUG_PHY_PROC
|
#ifdef DEBUG_PHY_PROC
|
||||||
LOG_I(PHY,"[UE %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n",
|
LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n",
|
||||||
phy_vars_ue->Mod_id,
|
phy_vars_ue->Mod_id,
|
||||||
frame_rx,
|
frame_rx,
|
||||||
subframe_prev,
|
subframe_prev,
|
||||||
@@ -2880,24 +2855,20 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
|
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled == 1) {
|
||||||
/*
|
/*
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
for (i=0;i<phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++)
|
for (i=0;i<phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++)
|
||||||
printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]);
|
printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
*/
|
*/
|
||||||
mac_xface->ue_decode_si(phy_vars_ue->Mod_id,
|
mac_xface->ue_decode_si(phy_vars_ue->Mod_id,
|
||||||
CC_id,
|
CC_id,
|
||||||
frame_rx,
|
frame_rx,
|
||||||
eNB_id,
|
eNB_id,
|
||||||
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b,
|
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b,
|
||||||
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3);
|
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3);
|
||||||
/*
|
}
|
||||||
if ((frame_rx % 160) < 10)
|
|
||||||
printf("sending SI to L2 in frame %d\n",frame_rx);
|
|
||||||
*/
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3013,8 +2984,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
subframe_prev, phy_vars_ue->UE_mode[eNB_id]);
|
subframe_prev, phy_vars_ue->UE_mode[eNB_id]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled == 1) {
|
||||||
|
|
||||||
if ((phy_vars_ue->UE_mode[eNB_id] != PUSCH) && (phy_vars_ue->prach_resources[eNB_id]->Msg3!=NULL)) {
|
if ((phy_vars_ue->UE_mode[eNB_id] != PUSCH) && (phy_vars_ue->prach_resources[eNB_id]->Msg3!=NULL)) {
|
||||||
LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n",
|
LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n",
|
||||||
phy_vars_ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0),
|
phy_vars_ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0),
|
||||||
@@ -3071,14 +3041,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex);
|
phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex);
|
||||||
}
|
}
|
||||||
} // mode != PUSCH
|
} // mode != PUSCH
|
||||||
|
}
|
||||||
#else //OPENAIR2
|
else {
|
||||||
|
rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1;
|
||||||
rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1;
|
timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
|
||||||
timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
|
//timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0];
|
||||||
//timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0];
|
process_timing_advance_rar(phy_vars_ue,timing_advance);
|
||||||
process_timing_advance_rar(phy_vars_ue,timing_advance);
|
}
|
||||||
#endif
|
|
||||||
} //ret <= MAX_ITERATIONS
|
} //ret <= MAX_ITERATIONS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3280,7 +3249,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&phy_vars_ue->lte_frame_parms)) {
|
if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&phy_vars_ue->lte_frame_parms)) {
|
||||||
LOG_I(PHY,"ue calling pmch subframe ..\n ");
|
LOG_D(PHY,"ue calling pmch subframe ..\n ");
|
||||||
|
|
||||||
if ((slot_rx%2)==1) {
|
if ((slot_rx%2)==1) {
|
||||||
LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n",
|
LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n",
|
||||||
@@ -3428,7 +3397,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
|||||||
phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct
|
phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct
|
||||||
phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS;
|
phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS;
|
||||||
phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->mcs;
|
phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->mcs;
|
||||||
LOG_I(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n",
|
LOG_D(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n",
|
||||||
phy_vars_ue->Mod_id, frame_rx,subframe_rx,sync_area,
|
phy_vars_ue->Mod_id, frame_rx,subframe_rx,sync_area,
|
||||||
phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs,
|
phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs,
|
||||||
phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3);
|
phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3);
|
||||||
@@ -3630,24 +3599,21 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr
|
|||||||
int CC_id =0;
|
int CC_id =0;
|
||||||
#endif
|
#endif
|
||||||
int frame_rx = phy_vars_ue->frame_rx;
|
int frame_rx = phy_vars_ue->frame_rx;
|
||||||
#ifdef OPENAIR2
|
|
||||||
int frame_tx = phy_vars_ue->frame_tx;
|
int frame_tx = phy_vars_ue->frame_tx;
|
||||||
#endif
|
|
||||||
int slot_rx = phy_vars_ue->slot_rx;
|
int slot_rx = phy_vars_ue->slot_rx;
|
||||||
int slot_tx = phy_vars_ue->slot_tx;
|
int slot_tx = phy_vars_ue->slot_tx;
|
||||||
int subframe_tx = slot_tx>>1;
|
int subframe_tx = slot_tx>>1;
|
||||||
int subframe_rx = slot_rx>>1;
|
int subframe_rx = slot_rx>>1;
|
||||||
#undef DEBUG_PHY_PROC
|
#undef DEBUG_PHY_PROC
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
|
||||||
UE_L2_STATE_t ret;
|
UE_L2_STATE_t ret;
|
||||||
#endif
|
|
||||||
#ifndef OPENAIR2
|
if (phy_vars_ue->mac_enabled == 0) {
|
||||||
phy_vars_ue->UE_mode[eNB_id]=PUSCH;
|
phy_vars_ue->UE_mode[eNB_id]=PUSCH;
|
||||||
phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local;
|
phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local;
|
||||||
prach_resources_local.ra_RNTI = 0xbeef;
|
prach_resources_local.ra_RNTI = 0xbeef;
|
||||||
prach_resources_local.ra_PreambleIndex = 0;
|
prach_resources_local.ra_PreambleIndex = 0;
|
||||||
#endif
|
}
|
||||||
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1);
|
||||||
@@ -3846,16 +3812,14 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr
|
|||||||
phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
|
phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
if (phy_vars_ue->mac_enabled==1) {
|
||||||
|
if (slot_rx%2==0) {
|
||||||
if (slot_rx%2==0) {
|
ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id,
|
||||||
|
frame_tx,
|
||||||
ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id,
|
subframe_rx,
|
||||||
frame_tx,
|
subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx),
|
||||||
subframe_rx,
|
eNB_id,
|
||||||
subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx),
|
0/*FIXME CC_id*/);
|
||||||
eNB_id,
|
|
||||||
0/*FIXME CC_id*/);
|
|
||||||
|
|
||||||
if (ret == CONNECTION_LOST) {
|
if (ret == CONNECTION_LOST) {
|
||||||
LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",phy_vars_ue->Mod_id,
|
LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",phy_vars_ue->Mod_id,
|
||||||
@@ -3874,11 +3838,7 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr
|
|||||||
phy_vars_ue->UE_mode[eNB_id] = PRACH;
|
phy_vars_ue->UE_mode[eNB_id] = PRACH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// if (last_slot == 19)
|
|
||||||
// phy_vars_ue->frame++;
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0);
|
||||||
stop_meas(&phy_vars_ue->phy_proc);
|
stop_meas(&phy_vars_ue->phy_proc);
|
||||||
|
|||||||
+206
-252
@@ -61,25 +61,7 @@
|
|||||||
extern unsigned int dlsch_tbs25[27][25],TBStable[27][110];
|
extern unsigned int dlsch_tbs25[27][25],TBStable[27][110];
|
||||||
extern unsigned char offset_mumimo_llr_drange_fix;
|
extern unsigned char offset_mumimo_llr_drange_fix;
|
||||||
|
|
||||||
#ifdef XFORMS
|
|
||||||
#include "PHY/TOOLS/lte_phy_scope.h"
|
#include "PHY/TOOLS/lte_phy_scope.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//#define AWGN
|
|
||||||
//#define NO_DCI
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//#define ABSTRACTION
|
|
||||||
|
|
||||||
/*
|
|
||||||
#define RBmask0 0x00fc00fc
|
|
||||||
#define RBmask1 0x0
|
|
||||||
#define RBmask2 0x0
|
|
||||||
#define RBmask3 0x0
|
|
||||||
*/
|
|
||||||
|
|
||||||
PHY_VARS_eNB *PHY_vars_eNB;
|
PHY_VARS_eNB *PHY_vars_eNB;
|
||||||
PHY_VARS_UE *PHY_vars_UE;
|
PHY_VARS_UE *PHY_vars_UE;
|
||||||
@@ -107,88 +89,6 @@ void handler(int sig)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,uint8_t extended_prefix_flag,uint8_t fdd_flag, uint16_t Nid_cell,uint8_t tdd_config,uint8_t N_RB_DL,
|
|
||||||
uint8_t osf,uint32_t perfect_ce)
|
|
||||||
{
|
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
|
|
||||||
printf("Start lte_param_init\n");
|
|
||||||
PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
|
||||||
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
|
||||||
mac_xface = malloc(sizeof(MAC_xface));
|
|
||||||
|
|
||||||
srand(0);
|
|
||||||
randominit(0);
|
|
||||||
set_taus_seed(0);
|
|
||||||
|
|
||||||
lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms);
|
|
||||||
|
|
||||||
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
|
||||||
lte_frame_parms->N_RB_UL = N_RB_DL;
|
|
||||||
lte_frame_parms->Ncp = extended_prefix_flag;
|
|
||||||
lte_frame_parms->Nid_cell = Nid_cell;
|
|
||||||
lte_frame_parms->nushift = Nid_cell%6;
|
|
||||||
lte_frame_parms->nb_antennas_tx = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_rx = N_rx;
|
|
||||||
lte_frame_parms->nb_antennas_tx_eNB = N_tx;
|
|
||||||
lte_frame_parms->phich_config_common.phich_resource = one;
|
|
||||||
lte_frame_parms->tdd_config = tdd_config;
|
|
||||||
lte_frame_parms->frame_type = (fdd_flag==1)?0 : 1;
|
|
||||||
// lte_frame_parms->Csrs = 2;
|
|
||||||
// lte_frame_parms->Bsrs = 0;
|
|
||||||
// lte_frame_parms->kTC = 0;44
|
|
||||||
// lte_frame_parms->n_RRC = 0;
|
|
||||||
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
|
||||||
|
|
||||||
init_frame_parms(lte_frame_parms,osf);
|
|
||||||
|
|
||||||
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
|
||||||
|
|
||||||
// phy_init_top(lte_frame_parms); //allocation
|
|
||||||
|
|
||||||
PHY_vars_UE->is_secondary_ue = 0;
|
|
||||||
PHY_vars_UE->lte_frame_parms = *lte_frame_parms;
|
|
||||||
PHY_vars_eNB->lte_frame_parms = *lte_frame_parms;
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
dump_frame_parms(lte_frame_parms);
|
|
||||||
|
|
||||||
PHY_vars_UE->PHY_measurements.n_adj_cells=0;
|
|
||||||
PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1;
|
|
||||||
PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2;
|
|
||||||
|
|
||||||
for (i=0; i<3; i++)
|
|
||||||
lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i);
|
|
||||||
|
|
||||||
phy_init_lte_ue(PHY_vars_UE,1,0);
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
|
|
||||||
|
|
||||||
generate_pcfich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
|
|
||||||
generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
|
|
||||||
|
|
||||||
// DL power control init
|
|
||||||
if (transmission_mode == 1) {
|
|
||||||
PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
|
||||||
((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 0;
|
|
||||||
PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
|
||||||
((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 0;
|
|
||||||
} else { // rho_a = rhob
|
|
||||||
PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
|
||||||
((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 1;
|
|
||||||
PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
|
||||||
((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PHY_vars_UE->perfect_ce = perfect_ce;
|
|
||||||
|
|
||||||
printf("Done lte_param_init\n");
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_2A[2];
|
//DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_2A[2];
|
||||||
@@ -214,7 +114,7 @@ void do_OFDM_mod_l(mod_sym_t **txdataF, int32_t **txdata, uint16_t next_slot, LT
|
|||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
||||||
&txdata[aa][slot_offset], // output
|
&txdata[aa][slot_offset], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
6, // number of symbols
|
6, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -266,15 +166,15 @@ int main(int argc, char **argv)
|
|||||||
unsigned int ret;
|
unsigned int ret;
|
||||||
unsigned int coded_bits_per_codeword=0,nsymb,dci_cnt,tbs=0;
|
unsigned int coded_bits_per_codeword=0,nsymb,dci_cnt,tbs=0;
|
||||||
|
|
||||||
unsigned int tx_lev=0,tx_lev_dB=0,trials,errs[4]= {0,0,0,0},errs2[4]= {0,0,0,0},round_trials[4]= {0,0,0,0},dci_errors=0,dlsch_active=0,num_layers;
|
unsigned int tx_lev=0,tx_lev_dB=0,trials,errs[4]= {0,0,0,0},errs2[4]= {0,0,0,0},round_trials[4]= {0,0,0,0},dci_errors=0,dlsch_active=0;//,num_layers;
|
||||||
int re_allocated;
|
int re_allocated;
|
||||||
char fname[32],vname[32];
|
char fname[32],vname[32];
|
||||||
FILE *bler_fd;
|
FILE *bler_fd;
|
||||||
char bler_fname[256];
|
char bler_fname[256];
|
||||||
FILE *time_meas_fd;
|
FILE *time_meas_fd;
|
||||||
char time_meas_fname[256];
|
char time_meas_fname[256];
|
||||||
FILE *tikz_fd;
|
// FILE *tikz_fd;
|
||||||
char tikz_fname[256];
|
// char tikz_fname[256];
|
||||||
|
|
||||||
FILE *input_trch_fd=NULL;
|
FILE *input_trch_fd=NULL;
|
||||||
unsigned char input_trch_file=0;
|
unsigned char input_trch_file=0;
|
||||||
@@ -300,7 +200,7 @@ int main(int argc, char **argv)
|
|||||||
uint8_t rx_sample_offset = 0;
|
uint8_t rx_sample_offset = 0;
|
||||||
//char stats_buffer[4096];
|
//char stats_buffer[4096];
|
||||||
//int len;
|
//int len;
|
||||||
uint8_t num_rounds = 4,fix_rounds=0;
|
uint8_t num_rounds = 4;//,fix_rounds=0;
|
||||||
uint8_t subframe=7;
|
uint8_t subframe=7;
|
||||||
int u;
|
int u;
|
||||||
int n=0;
|
int n=0;
|
||||||
@@ -314,15 +214,14 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// void *data;
|
// void *data;
|
||||||
// int ii;
|
// int ii;
|
||||||
int bler;
|
// int bler;
|
||||||
double blerr[4],uncoded_ber,avg_ber;
|
double blerr[4],uncoded_ber;//,avg_ber;
|
||||||
short *uncoded_ber_bit=NULL;
|
short *uncoded_ber_bit=NULL;
|
||||||
uint8_t N_RB_DL=25,osf=1;
|
uint8_t N_RB_DL=25,osf=1;
|
||||||
uint8_t fdd_flag = 0;
|
frame_t frame_type = FDD;
|
||||||
#ifdef XFORMS
|
int xforms=0;
|
||||||
FD_lte_phy_scope_ue *form_ue;
|
FD_lte_phy_scope_ue *form_ue;
|
||||||
char title[255];
|
char title[255];
|
||||||
#endif
|
|
||||||
uint32_t DLSCH_RB_ALLOC = 0x1fff;
|
uint32_t DLSCH_RB_ALLOC = 0x1fff;
|
||||||
int numCCE=0;
|
int numCCE=0;
|
||||||
int dci_length_bytes=0,dci_length=0;
|
int dci_length_bytes=0,dci_length=0;
|
||||||
@@ -330,7 +229,7 @@ int main(int argc, char **argv)
|
|||||||
int common_flag=0,TPC=0;
|
int common_flag=0,TPC=0;
|
||||||
|
|
||||||
double cpu_freq_GHz;
|
double cpu_freq_GHz;
|
||||||
time_stats_t ts;//,sts,usts;
|
// time_stats_t ts;//,sts,usts;
|
||||||
int avg_iter,iter_trials;
|
int avg_iter,iter_trials;
|
||||||
int rballocset=0;
|
int rballocset=0;
|
||||||
int print_perf=0;
|
int print_perf=0;
|
||||||
@@ -344,15 +243,24 @@ int main(int argc, char **argv)
|
|||||||
int TB0_active = 1;
|
int TB0_active = 1;
|
||||||
uint32_t perfect_ce = 0;
|
uint32_t perfect_ce = 0;
|
||||||
|
|
||||||
LTE_DL_UE_HARQ_t *dlsch0_ue_harq;
|
// LTE_DL_UE_HARQ_t *dlsch0_ue_harq;
|
||||||
LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq;
|
// LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq;
|
||||||
uint8_t Kmimo;
|
uint8_t Kmimo;
|
||||||
FILE *proc_fd = NULL;
|
uint8_t ue_category=4;
|
||||||
char buf[64];
|
uint32_t Nsoft;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int CCE_table[800];
|
||||||
|
|
||||||
|
int threequarter_fs=0;
|
||||||
|
|
||||||
opp_enabled=1; // to enable the time meas
|
opp_enabled=1; // to enable the time meas
|
||||||
|
|
||||||
#if defined(__arm__)
|
#if defined(__arm__)
|
||||||
|
FILE *proc_fd = NULL;
|
||||||
|
char buf[64];
|
||||||
|
|
||||||
proc_fd = fopen("/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq", "r");
|
proc_fd = fopen("/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq", "r");
|
||||||
if(!proc_fd)
|
if(!proc_fd)
|
||||||
printf("cannot open /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq");
|
printf("cannot open /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq");
|
||||||
@@ -375,16 +283,20 @@ int main(int argc, char **argv)
|
|||||||
// default parameters
|
// default parameters
|
||||||
n_frames = 1000;
|
n_frames = 1000;
|
||||||
snr0 = 0;
|
snr0 = 0;
|
||||||
num_layers = 1;
|
// num_layers = 1;
|
||||||
perfect_ce = 0;
|
perfect_ce = 0;
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "ahdpZDe:m:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:Y")) != -1) {
|
while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:XY")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'a':
|
case 'a':
|
||||||
awgn_flag = 1;
|
awgn_flag = 1;
|
||||||
channel_model = AWGN;
|
channel_model = AWGN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'A':
|
||||||
|
abstx = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'b':
|
case 'b':
|
||||||
tdd_config=atoi(optarg);
|
tdd_config=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
@@ -393,10 +305,59 @@ int main(int argc, char **argv)
|
|||||||
N_RB_DL=atoi(optarg);
|
N_RB_DL=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'c':
|
||||||
|
num_pdcch_symbols=atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'C':
|
||||||
|
Nid_cell = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
dci_flag = 1;
|
dci_flag = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'D':
|
||||||
|
frame_type=TDD;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'e':
|
||||||
|
num_rounds=1;
|
||||||
|
common_flag = 1;
|
||||||
|
TPC = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'E':
|
||||||
|
threequarter_fs=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'f':
|
||||||
|
input_snr_step= atof(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'F':
|
||||||
|
forgetting_factor = atof(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
input_fd = fopen(optarg,"r");
|
||||||
|
input_file=1;
|
||||||
|
dci_flag = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'I':
|
||||||
|
input_trch_fd = fopen(optarg,"r");
|
||||||
|
input_trch_file=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'L':
|
||||||
|
llr8_flag=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'l':
|
||||||
|
offset_mumimo_llr_drange_fix=atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
mcs1 = atoi(optarg);
|
mcs1 = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
@@ -405,6 +366,11 @@ int main(int argc, char **argv)
|
|||||||
mcs2 = atoi(optarg);
|
mcs2 = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'O':
|
||||||
|
test_perf=atoi(optarg);
|
||||||
|
//print_perf =1;
|
||||||
|
break;
|
||||||
|
|
||||||
case 't':
|
case 't':
|
||||||
mcs_i = atoi(optarg);
|
mcs_i = atoi(optarg);
|
||||||
i_mod = get_Qm(mcs_i);
|
i_mod = get_Qm(mcs_i);
|
||||||
@@ -414,27 +380,16 @@ int main(int argc, char **argv)
|
|||||||
n_frames = atoi(optarg);
|
n_frames = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'C':
|
|
||||||
Nid_cell = atoi(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'o':
|
case 'o':
|
||||||
rx_sample_offset = atoi(optarg);
|
rx_sample_offset = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'D':
|
|
||||||
fdd_flag = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
DLSCH_RB_ALLOC = atoi(optarg);
|
DLSCH_RB_ALLOC = atoi(optarg);
|
||||||
rballocset = 1;
|
rballocset = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'F':
|
|
||||||
forgetting_factor = atof(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
snr0 = atof(optarg);
|
snr0 = atof(optarg);
|
||||||
break;
|
break;
|
||||||
@@ -443,13 +398,6 @@ int main(int argc, char **argv)
|
|||||||
snr_int = atof(optarg);
|
snr_int = atof(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'f':
|
|
||||||
input_snr_step= atof(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'A':
|
|
||||||
abstx = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'N':
|
case 'N':
|
||||||
n_ch_rlz= atof(optarg);
|
n_ch_rlz= atof(optarg);
|
||||||
@@ -459,10 +407,6 @@ int main(int argc, char **argv)
|
|||||||
extended_prefix_flag=1;
|
extended_prefix_flag=1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c':
|
|
||||||
num_pdcch_symbols=atoi(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'g':
|
case 'g':
|
||||||
memcpy(channel_model_input,optarg,10);
|
memcpy(channel_model_input,optarg,10);
|
||||||
|
|
||||||
@@ -522,70 +466,12 @@ int main(int argc, char **argv)
|
|||||||
case 'N':
|
case 'N':
|
||||||
channel_model=AWGN;
|
channel_model=AWGN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
msg("Unsupported channel model!\n");
|
msg("Unsupported channel model!\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'x':
|
|
||||||
transmission_mode=atoi(optarg);
|
|
||||||
|
|
||||||
if ((transmission_mode!=1) &&
|
|
||||||
(transmission_mode!=2) &&
|
|
||||||
(transmission_mode!=3) &&
|
|
||||||
(transmission_mode!=4) &&
|
|
||||||
(transmission_mode!=5) &&
|
|
||||||
(transmission_mode!=6)) {
|
|
||||||
msg("Unsupported transmission mode %d\n",transmission_mode);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (transmission_mode>1) {
|
|
||||||
n_tx = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'y':
|
|
||||||
n_tx=atoi(optarg);
|
|
||||||
|
|
||||||
if ((n_tx==0) || (n_tx>2)) {
|
|
||||||
msg("Unsupported number of tx antennas %d\n",n_tx);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'z':
|
|
||||||
n_rx=atoi(optarg);
|
|
||||||
|
|
||||||
if ((n_rx==0) || (n_rx>2)) {
|
|
||||||
msg("Unsupported number of rx antennas %d\n",n_rx);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'I':
|
|
||||||
input_trch_fd = fopen(optarg,"r");
|
|
||||||
input_trch_file=1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'i':
|
|
||||||
input_fd = fopen(optarg,"r");
|
|
||||||
input_file=1;
|
|
||||||
dci_flag = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'e':
|
|
||||||
num_rounds=1;
|
|
||||||
common_flag = 1;
|
|
||||||
TPC = atoi(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'R':
|
case 'R':
|
||||||
num_rounds=atoi(optarg);
|
num_rounds=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
@@ -623,26 +509,58 @@ int main(int argc, char **argv)
|
|||||||
print_perf=1;
|
print_perf=1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'L':
|
case 'x':
|
||||||
llr8_flag=1;
|
transmission_mode=atoi(optarg);
|
||||||
|
|
||||||
|
if ((transmission_mode!=1) &&
|
||||||
|
(transmission_mode!=2) &&
|
||||||
|
(transmission_mode!=3) &&
|
||||||
|
(transmission_mode!=4) &&
|
||||||
|
(transmission_mode!=5) &&
|
||||||
|
(transmission_mode!=6)) {
|
||||||
|
msg("Unsupported transmission mode %d\n",transmission_mode);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transmission_mode>1) {
|
||||||
|
n_tx = 2;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'l':
|
case 'y':
|
||||||
offset_mumimo_llr_drange_fix=atoi(optarg);
|
n_tx=atoi(optarg);
|
||||||
|
|
||||||
|
if ((n_tx==0) || (n_tx>2)) {
|
||||||
|
msg("Unsupported number of tx antennas %d\n",n_tx);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'O':
|
case 'X':
|
||||||
test_perf=atoi(optarg);
|
xforms=1;
|
||||||
//print_perf =1;
|
break;
|
||||||
|
|
||||||
|
case 'Y':
|
||||||
|
perfect_ce=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'z':
|
||||||
|
n_rx=atoi(optarg);
|
||||||
|
|
||||||
|
if ((n_rx==0) || (n_rx>2)) {
|
||||||
|
msg("Unsupported number of rx antennas %d\n",n_rx);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'Z':
|
case 'Z':
|
||||||
dump_table=1;
|
dump_table=1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'Y':
|
|
||||||
perfect_ce=1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
@@ -703,28 +621,39 @@ int main(int argc, char **argv)
|
|||||||
if ((transmission_mode > 1) && (n_tx != 2))
|
if ((transmission_mode > 1) && (n_tx != 2))
|
||||||
printf("n_tx must be >1 for transmission_mode %d\n",transmission_mode);
|
printf("n_tx must be >1 for transmission_mode %d\n",transmission_mode);
|
||||||
|
|
||||||
#ifdef XFORMS
|
if (xforms==1) {
|
||||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||||
form_ue = create_lte_phy_scope_ue();
|
form_ue = create_lte_phy_scope_ue();
|
||||||
sprintf (title, "LTE PHY SCOPE eNB");
|
sprintf (title, "LTE PHY SCOPE eNB");
|
||||||
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
||||||
|
|
||||||
if (!dual_stream_UE==0) {
|
if (!dual_stream_UE==0) {
|
||||||
openair_daq_vars.use_ia_receiver = 1;
|
openair_daq_vars.use_ia_receiver = 1;
|
||||||
fl_set_button(form_ue->button_0,1);
|
fl_set_button(form_ue->button_0,1);
|
||||||
fl_set_object_label(form_ue->button_0, "IA Receiver ON");
|
fl_set_object_label(form_ue->button_0, "IA Receiver ON");
|
||||||
fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN);
|
fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (transmission_mode==5) {
|
if (transmission_mode==5) {
|
||||||
n_users = 2;
|
n_users = 2;
|
||||||
printf("dual_stream_UE=%d\n", dual_stream_UE);
|
printf("dual_stream_UE=%d\n", dual_stream_UE);
|
||||||
}
|
}
|
||||||
|
|
||||||
lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,fdd_flag,Nid_cell,tdd_config,N_RB_DL,osf,perfect_ce);
|
lte_param_init(n_tx,
|
||||||
|
n_rx,
|
||||||
|
transmission_mode,
|
||||||
|
extended_prefix_flag,
|
||||||
|
frame_type,
|
||||||
|
Nid_cell,
|
||||||
|
tdd_config,
|
||||||
|
N_RB_DL,
|
||||||
|
threequarter_fs,
|
||||||
|
osf,
|
||||||
|
perfect_ce);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
eNB_id_i = PHY_vars_UE->n_connected_eNB;
|
eNB_id_i = PHY_vars_UE->n_connected_eNB;
|
||||||
|
|
||||||
printf("Setting mcs1 = %d\n",mcs1);
|
printf("Setting mcs1 = %d\n",mcs1);
|
||||||
@@ -985,10 +914,27 @@ int main(int argc, char **argv)
|
|||||||
else
|
else
|
||||||
Kmimo=1;
|
Kmimo=1;
|
||||||
|
|
||||||
|
switch (ue_category) {
|
||||||
|
case 1:
|
||||||
|
Nsoft = 250368;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
Nsoft = 1237248;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
Nsoft = 1827072;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Unsupported UE category %d\n",ue_category);
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
for (k=0; k<n_users; k++) {
|
for (k=0; k<n_users; k++) {
|
||||||
// Create transport channel structures for 2 transport blocks (MIMO)
|
// Create transport channel structures for 2 transport blocks (MIMO)
|
||||||
for (i=0; i<2; i++) {
|
for (i=0; i<2; i++) {
|
||||||
PHY_vars_eNB->dlsch_eNB[k][i] = new_eNB_dlsch(Kmimo,8,N_RB_DL,0);
|
PHY_vars_eNB->dlsch_eNB[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0);
|
||||||
|
|
||||||
if (!PHY_vars_eNB->dlsch_eNB[k][i]) {
|
if (!PHY_vars_eNB->dlsch_eNB[k][i]) {
|
||||||
printf("Can't get eNB dlsch structures\n");
|
printf("Can't get eNB dlsch structures\n");
|
||||||
@@ -1000,7 +946,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<2; i++) {
|
for (i=0; i<2; i++) {
|
||||||
PHY_vars_UE->dlsch_ue[0][i] = new_ue_dlsch(Kmimo,8,MAX_TURBO_ITERATIONS,N_RB_DL,0);
|
PHY_vars_UE->dlsch_ue[0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
|
||||||
|
|
||||||
if (!PHY_vars_UE->dlsch_ue[0][i]) {
|
if (!PHY_vars_UE->dlsch_ue[0][i]) {
|
||||||
printf("Can't get ue dlsch structures\n");
|
printf("Can't get ue dlsch structures\n");
|
||||||
@@ -1011,7 +957,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// structure for SIC at UE
|
// structure for SIC at UE
|
||||||
PHY_vars_UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,N_RB_DL,0);
|
PHY_vars_UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0);
|
||||||
|
|
||||||
if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
|
if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
|
||||||
|
|
||||||
@@ -1298,7 +1244,7 @@ int main(int argc, char **argv)
|
|||||||
dci_alloc[num_dci].L = 1;
|
dci_alloc[num_dci].L = 1;
|
||||||
dci_alloc[num_dci].rnti = SI_RNTI;
|
dci_alloc[num_dci].rnti = SI_RNTI;
|
||||||
dci_alloc[num_dci].format = format1A;
|
dci_alloc[num_dci].format = format1A;
|
||||||
dci_alloc[num_dci].nCCE = 0;
|
dci_alloc[num_dci].firstCCE = 0;
|
||||||
dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
|
dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
|
||||||
|
|
||||||
printf("Generating dlsch params for user %d\n",k);
|
printf("Generating dlsch params for user %d\n",k);
|
||||||
@@ -1605,7 +1551,7 @@ int main(int argc, char **argv)
|
|||||||
dci_alloc[num_dci].L = 1;
|
dci_alloc[num_dci].L = 1;
|
||||||
dci_alloc[num_dci].rnti = SI_RNTI;
|
dci_alloc[num_dci].rnti = SI_RNTI;
|
||||||
dci_alloc[num_dci].format = format1A;
|
dci_alloc[num_dci].format = format1A;
|
||||||
dci_alloc[num_dci].nCCE = 0;
|
dci_alloc[num_dci].firstCCE = 0;
|
||||||
dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
|
dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
|
||||||
|
|
||||||
printf("Generating dlsch params for user %d\n",k);
|
printf("Generating dlsch params for user %d\n",k);
|
||||||
@@ -1913,7 +1859,7 @@ int main(int argc, char **argv)
|
|||||||
dci_alloc[num_dci].L = 1;
|
dci_alloc[num_dci].L = 1;
|
||||||
dci_alloc[num_dci].rnti = SI_RNTI;
|
dci_alloc[num_dci].rnti = SI_RNTI;
|
||||||
dci_alloc[num_dci].format = format1A;
|
dci_alloc[num_dci].format = format1A;
|
||||||
dci_alloc[num_dci].nCCE = 0;
|
dci_alloc[num_dci].firstCCE = 0;
|
||||||
dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
|
dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
|
||||||
|
|
||||||
printf("Generating dlsch params for user %d\n",k);
|
printf("Generating dlsch params for user %d\n",k);
|
||||||
@@ -1944,7 +1890,7 @@ int main(int argc, char **argv)
|
|||||||
dci_alloc[num_dci].L = 1;
|
dci_alloc[num_dci].L = 1;
|
||||||
dci_alloc[num_dci].rnti = n_rnti+k;
|
dci_alloc[num_dci].rnti = n_rnti+k;
|
||||||
dci_alloc[num_dci].format = format1E_2A_M10PRB;
|
dci_alloc[num_dci].format = format1E_2A_M10PRB;
|
||||||
dci_alloc[num_dci].nCCE = 4*k;
|
dci_alloc[num_dci].firstCCE = 4*k;
|
||||||
printf("Generating dlsch params for user %d\n",k);
|
printf("Generating dlsch params for user %d\n",k);
|
||||||
generate_eNB_dlsch_params_from_dci(0,
|
generate_eNB_dlsch_params_from_dci(0,
|
||||||
subframe,
|
subframe,
|
||||||
@@ -1989,17 +1935,20 @@ int main(int argc, char **argv)
|
|||||||
if (n_frames==1) printf("%d\n",numCCE);
|
if (n_frames==1) printf("%d\n",numCCE);
|
||||||
|
|
||||||
// apply RNTI-based nCCE allocation
|
// apply RNTI-based nCCE allocation
|
||||||
|
memset(CCE_table,0,800*sizeof(int));
|
||||||
|
|
||||||
for (i=num_common_dci; i<num_dci; i++) {
|
for (i=num_common_dci; i<num_dci; i++) {
|
||||||
|
|
||||||
dci_alloc[i].nCCE = get_nCCE_offset(1<<dci_alloc[i].L,
|
dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table,
|
||||||
numCCE,
|
1<<dci_alloc[i].L,
|
||||||
(dci_alloc[i].rnti==SI_RNTI)? 1 : 0,
|
numCCE,
|
||||||
dci_alloc[i].rnti,
|
(dci_alloc[i].rnti==SI_RNTI)? 1 : 0,
|
||||||
subframe);
|
dci_alloc[i].rnti,
|
||||||
|
subframe);
|
||||||
|
|
||||||
if (n_frames==1)
|
if (n_frames==1)
|
||||||
printf("dci %d: rnti %x, format %d : nCCE %d/%d\n",i,dci_alloc[i].rnti, dci_alloc[i].format,
|
printf("dci %d: rnti %x, format %d : nCCE %d/%d\n",i,dci_alloc[i].rnti, dci_alloc[i].format,
|
||||||
dci_alloc[i].nCCE,numCCE);
|
dci_alloc[i].firstCCE,numCCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (k=0; k<n_users; k++) {
|
for (k=0; k<n_users; k++) {
|
||||||
@@ -2082,7 +2031,7 @@ int main(int argc, char **argv)
|
|||||||
round_trials[3] = 0;
|
round_trials[3] = 0;
|
||||||
|
|
||||||
dci_errors=0;
|
dci_errors=0;
|
||||||
avg_ber = 0;
|
// avg_ber = 0;
|
||||||
|
|
||||||
round=0;
|
round=0;
|
||||||
avg_iter = 0;
|
avg_iter = 0;
|
||||||
@@ -2553,7 +2502,7 @@ PMI_FEEDBACK:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci,
|
num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci,
|
||||||
num_common_dci,
|
num_common_dci,
|
||||||
dci_alloc,
|
dci_alloc,
|
||||||
@@ -2562,7 +2511,7 @@ PMI_FEEDBACK:
|
|||||||
&PHY_vars_eNB->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
|
PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
|
||||||
subframe);
|
subframe);
|
||||||
|
|
||||||
if (num_pdcch_symbols_2 > num_pdcch_symbols) {
|
if (num_pdcch_symbols_2 > num_pdcch_symbols) {
|
||||||
msg("Error: given num_pdcch_symbols not big enough (%d > %d)\n",num_pdcch_symbols_2,num_pdcch_symbols);
|
msg("Error: given num_pdcch_symbols not big enough (%d > %d)\n",num_pdcch_symbols_2,num_pdcch_symbols);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
@@ -2667,13 +2616,15 @@ PMI_FEEDBACK:
|
|||||||
}
|
}
|
||||||
|
|
||||||
start_meas(&PHY_vars_eNB->dlsch_modulation_stats);
|
start_meas(&PHY_vars_eNB->dlsch_modulation_stats);
|
||||||
|
|
||||||
re_allocated = dlsch_modulation(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
|
re_allocated = dlsch_modulation(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
|
||||||
AMP,
|
AMP,
|
||||||
subframe,
|
subframe,
|
||||||
&PHY_vars_eNB->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
num_pdcch_symbols,
|
num_pdcch_symbols,
|
||||||
PHY_vars_eNB->dlsch_eNB[k][0],
|
PHY_vars_eNB->dlsch_eNB[k][0],
|
||||||
PHY_vars_eNB->dlsch_eNB[k][1]);
|
PHY_vars_eNB->dlsch_eNB[k][1]);
|
||||||
|
|
||||||
stop_meas(&PHY_vars_eNB->dlsch_modulation_stats);
|
stop_meas(&PHY_vars_eNB->dlsch_modulation_stats);
|
||||||
/*
|
/*
|
||||||
if (trials==0 && round==0)
|
if (trials==0 && round==0)
|
||||||
@@ -2791,8 +2742,16 @@ PMI_FEEDBACK:
|
|||||||
random_channel(eNB2UE[2],0);
|
random_channel(eNB2UE[2],0);
|
||||||
random_channel(eNB2UE[3],0);
|
random_channel(eNB2UE[3],0);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
if (PHY_vars_UE->perfect_ce==1) {
|
||||||
|
// fill in perfect channel estimates
|
||||||
|
freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1);
|
||||||
|
/*
|
||||||
|
write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8);
|
||||||
|
write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1,1,8);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(abstx) {
|
if(abstx) {
|
||||||
if (trials==0 && round==0) {
|
if (trials==0 && round==0) {
|
||||||
@@ -2938,11 +2897,6 @@ PMI_FEEDBACK:
|
|||||||
|
|
||||||
if (PHY_vars_UE->perfect_ce==1) {
|
if (PHY_vars_UE->perfect_ce==1) {
|
||||||
if (awgn_flag==0) {
|
if (awgn_flag==0) {
|
||||||
// fill in perfect channel estimates
|
|
||||||
freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1);
|
|
||||||
|
|
||||||
//write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8);
|
|
||||||
//write_output("channelF.m","chF",desc1->chF[0],nb_samples,1,8);
|
|
||||||
for(k=0; k<NUMBER_OF_eNB_MAX; k++) {
|
for(k=0; k<NUMBER_OF_eNB_MAX; k++) {
|
||||||
for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
@@ -3526,13 +3480,13 @@ PMI_FEEDBACK:
|
|||||||
// PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round++;
|
// PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round++;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef XFORMS
|
if (xforms==1) {
|
||||||
phy_scope_UE(form_ue,
|
phy_scope_UE(form_ue,
|
||||||
PHY_vars_UE,
|
PHY_vars_UE,
|
||||||
eNB_id,
|
eNB_id,
|
||||||
0,// UE_id
|
0,// UE_id
|
||||||
subframe);
|
subframe);
|
||||||
#endif
|
}
|
||||||
|
|
||||||
} //round
|
} //round
|
||||||
|
|
||||||
|
|||||||
@@ -47,8 +47,7 @@
|
|||||||
#include "LAYER2/MAC/vars.h"
|
#include "LAYER2/MAC/vars.h"
|
||||||
|
|
||||||
#ifdef XFORMS
|
#ifdef XFORMS
|
||||||
#include <forms.h>
|
#include "PHY/TOOLS/lte_phy_scope.h"
|
||||||
#include "../../USERSPACE_TOOLS/SCOPE/lte_scope.h"
|
|
||||||
#endif //XFORMS
|
#endif //XFORMS
|
||||||
|
|
||||||
|
|
||||||
@@ -174,16 +173,19 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
lte_frame_type_t frame_type = FDD;
|
lte_frame_type_t frame_type = FDD;
|
||||||
|
|
||||||
|
uint32_t Nsoft = 1827072;
|
||||||
|
|
||||||
|
/*
|
||||||
#ifdef XFORMS
|
#ifdef XFORMS
|
||||||
FD_lte_scope *form_dl;
|
FD_lte_phy_scope_ue *form_ue;
|
||||||
char title[255];
|
char title[255];
|
||||||
|
|
||||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||||
form_dl = create_form_lte_scope();
|
form_ue = create_lte_phy_scope_ue();
|
||||||
sprintf (title, "LTE DL SCOPE UE");
|
sprintf (title, "LTE DL SCOPE UE");
|
||||||
fl_show_form (form_dl->lte_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
||||||
#endif
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
logInit();
|
logInit();
|
||||||
number_of_cards = 1;
|
number_of_cards = 1;
|
||||||
@@ -383,14 +385,14 @@ int main(int argc, char **argv)
|
|||||||
0);
|
0);
|
||||||
|
|
||||||
// Create transport channel structures for 2 transport blocks (MIMO)
|
// Create transport channel structures for 2 transport blocks (MIMO)
|
||||||
PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,N_RB_DL,0);
|
PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0);
|
||||||
|
|
||||||
if (!PHY_vars_eNB->dlsch_eNB_MCH) {
|
if (!PHY_vars_eNB->dlsch_eNB_MCH) {
|
||||||
printf("Can't get eNB dlsch structures\n");
|
printf("Can't get eNB dlsch structures\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0);
|
PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0);
|
||||||
|
|
||||||
PHY_vars_eNB->lte_frame_parms.num_MBSFN_config = 1;
|
PHY_vars_eNB->lte_frame_parms.num_MBSFN_config = 1;
|
||||||
PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0;
|
PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0;
|
||||||
@@ -457,7 +459,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0], // input,
|
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0], // input,
|
||||||
txdata[0], // output
|
txdata[0], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
|
|||||||
@@ -53,87 +53,11 @@
|
|||||||
|
|
||||||
#include "OCG_vars.h"
|
#include "OCG_vars.h"
|
||||||
|
|
||||||
PHY_VARS_eNB *PHY_vars_eNb,*PHY_vars_eNb1,*PHY_vars_eNb2;
|
PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2;
|
||||||
PHY_VARS_UE *PHY_vars_UE;
|
PHY_VARS_UE *PHY_vars_UE;
|
||||||
|
|
||||||
#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
|
#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
|
||||||
|
|
||||||
void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,unsigned char extended_prefix_flag,unsigned char frame_type, uint16_t Nid_cell,uint8_t N_RB_DL,uint8_t osf)
|
|
||||||
{
|
|
||||||
|
|
||||||
// unsigned int ind;
|
|
||||||
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
printf("Start lte_param_init\n");
|
|
||||||
PHY_vars_eNb = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
PHY_vars_eNb1 = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
PHY_vars_eNb2 = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
|
|
||||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
|
||||||
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
|
||||||
mac_xface = malloc(sizeof(MAC_xface));
|
|
||||||
|
|
||||||
randominit(0);
|
|
||||||
set_taus_seed(0);
|
|
||||||
|
|
||||||
lte_frame_parms = &(PHY_vars_eNb->lte_frame_parms);
|
|
||||||
|
|
||||||
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
|
||||||
lte_frame_parms->N_RB_UL = N_RB_DL;
|
|
||||||
lte_frame_parms->Ncp = extended_prefix_flag;
|
|
||||||
lte_frame_parms->Nid_cell = Nid_cell;
|
|
||||||
lte_frame_parms->nushift = Nid_cell%6;
|
|
||||||
lte_frame_parms->nb_antennas_tx = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_tx_eNB = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_rx = N_rx;
|
|
||||||
// lte_frame_parms->Csrs = 2;
|
|
||||||
// lte_frame_parms->Bsrs = 0;
|
|
||||||
// lte_frame_parms->kTC = 0;
|
|
||||||
// lte_frame_parms->n_RRC = 0;
|
|
||||||
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
|
||||||
lte_frame_parms->tdd_config = 3;
|
|
||||||
lte_frame_parms->frame_type = frame_type;
|
|
||||||
init_frame_parms(lte_frame_parms,osf);
|
|
||||||
|
|
||||||
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
|
||||||
|
|
||||||
PHY_vars_UE->lte_frame_parms = *lte_frame_parms;
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
PHY_vars_UE->PHY_measurements.n_adj_cells=2;
|
|
||||||
PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1;
|
|
||||||
PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2;
|
|
||||||
|
|
||||||
for (i=0; i<3; i++)
|
|
||||||
lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i);
|
|
||||||
|
|
||||||
phy_init_lte_ue(PHY_vars_UE,1,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNb,0,0,0);
|
|
||||||
|
|
||||||
memcpy((void*)&PHY_vars_eNb1->lte_frame_parms,(void*)&PHY_vars_eNb->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
|
||||||
PHY_vars_eNb1->lte_frame_parms.Nid_cell=Nid_cell+1;
|
|
||||||
PHY_vars_eNb1->lte_frame_parms.nushift=(Nid_cell+1)%6;
|
|
||||||
PHY_vars_eNb1->Mod_id=1;
|
|
||||||
|
|
||||||
memcpy((void*)&PHY_vars_eNb2->lte_frame_parms,(void*)&PHY_vars_eNb->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
|
||||||
PHY_vars_eNb2->lte_frame_parms.Nid_cell=Nid_cell+2;
|
|
||||||
PHY_vars_eNb2->lte_frame_parms.nushift=(Nid_cell+2)%6;
|
|
||||||
PHY_vars_eNb2->Mod_id=2;
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNb1,0,0,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNb2,0,0,0);
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
printf("Done lte_param_init\n");
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
mod_sym_t *dummybuf[4];
|
mod_sym_t *dummybuf[4];
|
||||||
mod_sym_t dummy0[2048*14];
|
mod_sym_t dummy0[2048*14];
|
||||||
mod_sym_t dummy1[2048*14];
|
mod_sym_t dummy1[2048*14];
|
||||||
@@ -420,6 +344,28 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,N_RB_DL,osf);
|
lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,N_RB_DL,osf);
|
||||||
|
|
||||||
|
PHY_vars_eNB1 = malloc(sizeof(PHY_VARS_eNB));
|
||||||
|
PHY_vars_eNB2 = malloc(sizeof(PHY_VARS_eNB));
|
||||||
|
PHY_vars_UE->PHY_measurements.n_adj_cells=2;
|
||||||
|
PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1;
|
||||||
|
PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2;
|
||||||
|
|
||||||
|
for (i=0; i<3; i++)
|
||||||
|
lte_gold(&PHY_vars_eNB->lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i);
|
||||||
|
|
||||||
|
memcpy((void*)&PHY_vars_eNB1->lte_frame_parms,(void*)&PHY_vars_eNB->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
||||||
|
PHY_vars_eNB1->lte_frame_parms.Nid_cell=Nid_cell+1;
|
||||||
|
PHY_vars_eNB1->lte_frame_parms.nushift=(Nid_cell+1)%6;
|
||||||
|
PHY_vars_eNB1->Mod_id=1;
|
||||||
|
|
||||||
|
memcpy((void*)&PHY_vars_eNB2->lte_frame_parms,(void*)&PHY_vars_eNB->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
||||||
|
PHY_vars_eNB2->lte_frame_parms.Nid_cell=Nid_cell+2;
|
||||||
|
PHY_vars_eNB2->lte_frame_parms.nushift=(Nid_cell+2)%6;
|
||||||
|
PHY_vars_eNB2->Mod_id=2;
|
||||||
|
|
||||||
|
phy_init_lte_eNB(PHY_vars_eNB1,0,0,0);
|
||||||
|
phy_init_lte_eNB(PHY_vars_eNB2,0,0,0);
|
||||||
|
|
||||||
#ifdef XFORMS
|
#ifdef XFORMS
|
||||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||||
form_ue = create_lte_phy_scope_ue();
|
form_ue = create_lte_phy_scope_ue();
|
||||||
@@ -436,13 +382,13 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
|
printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
|
||||||
|
|
||||||
frame_parms = &PHY_vars_eNb->lte_frame_parms;
|
frame_parms = &PHY_vars_eNB->lte_frame_parms;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
txdata = PHY_vars_eNb->lte_eNB_common_vars.txdata[0];
|
txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[0];
|
||||||
txdata1 = PHY_vars_eNb1->lte_eNB_common_vars.txdata[0];
|
txdata1 = PHY_vars_eNB1->lte_eNB_common_vars.txdata[0];
|
||||||
txdata2 = PHY_vars_eNb2->lte_eNB_common_vars.txdata[0];
|
txdata2 = PHY_vars_eNB2->lte_eNB_common_vars.txdata[0];
|
||||||
|
|
||||||
|
|
||||||
s_re = malloc(2*sizeof(double*));
|
s_re = malloc(2*sizeof(double*));
|
||||||
@@ -463,8 +409,8 @@ int main(int argc, char **argv)
|
|||||||
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, interf (%d,%d)\n",NUMBER_OF_OFDM_CARRIERS,
|
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, interf (%d,%d)\n",NUMBER_OF_OFDM_CARRIERS,
|
||||||
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,interf1,interf2);
|
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,interf1,interf2);
|
||||||
|
|
||||||
printf("PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
|
printf("PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
|
||||||
PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0]);
|
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0]);
|
||||||
|
|
||||||
|
|
||||||
DLSCH_alloc_pdu2.rah = 0;
|
DLSCH_alloc_pdu2.rah = 0;
|
||||||
@@ -479,31 +425,31 @@ int main(int argc, char **argv)
|
|||||||
// Forget second codeword
|
// Forget second codeword
|
||||||
DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding
|
DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding
|
||||||
|
|
||||||
eNB2UE = new_channel_desc_scm(PHY_vars_eNb->lte_frame_parms.nb_antennas_tx,
|
eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||||
channel_model,
|
channel_model,
|
||||||
N_RB2sampling_rate(PHY_vars_eNb->lte_frame_parms.N_RB_DL),
|
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||||
N_RB2channel_bandwidth(PHY_vars_eNb->lte_frame_parms.N_RB_DL),
|
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if (interf1>-20)
|
if (interf1>-20)
|
||||||
eNB2UE1 = new_channel_desc_scm(PHY_vars_eNb->lte_frame_parms.nb_antennas_tx,
|
eNB2UE1 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||||
channel_model,
|
channel_model,
|
||||||
N_RB2sampling_rate(PHY_vars_eNb->lte_frame_parms.N_RB_DL),
|
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||||
N_RB2channel_bandwidth(PHY_vars_eNb->lte_frame_parms.N_RB_DL),
|
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if (interf2>-20)
|
if (interf2>-20)
|
||||||
eNB2UE2 = new_channel_desc_scm(PHY_vars_eNb->lte_frame_parms.nb_antennas_tx,
|
eNB2UE2 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||||
channel_model,
|
channel_model,
|
||||||
N_RB2sampling_rate(PHY_vars_eNb->lte_frame_parms.N_RB_DL),
|
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||||
N_RB2channel_bandwidth(PHY_vars_eNb->lte_frame_parms.N_RB_DL),
|
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||||
0,
|
0,
|
||||||
8,
|
8,
|
||||||
0);
|
0);
|
||||||
@@ -567,47 +513,47 @@ int main(int argc, char **argv)
|
|||||||
pbch_pdu[1]=1;
|
pbch_pdu[1]=1;
|
||||||
pbch_pdu[2]=0;
|
pbch_pdu[2]=0;
|
||||||
|
|
||||||
if (PHY_vars_eNb->lte_frame_parms.frame_type == 0) {
|
if (PHY_vars_eNB->lte_frame_parms.frame_type == 0) {
|
||||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||||
0);
|
0);
|
||||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||||
0);
|
0);
|
||||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||||
10);
|
10);
|
||||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||||
10);
|
10);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||||
1);
|
1);
|
||||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
2,
|
2,
|
||||||
2);
|
2);
|
||||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||||
11);
|
11);
|
||||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
2,
|
2,
|
||||||
12);
|
12);
|
||||||
|
|
||||||
@@ -626,11 +572,11 @@ int main(int argc, char **argv)
|
|||||||
dci_alloc[1].rnti = 0x1234;
|
dci_alloc[1].rnti = 0x1234;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
printf("Generating PBCH for mode1_flag = %d\n", PHY_vars_eNb->lte_frame_parms.mode1_flag);
|
printf("Generating PBCH for mode1_flag = %d\n", PHY_vars_eNB->lte_frame_parms.mode1_flag);
|
||||||
|
|
||||||
|
|
||||||
generate_pilots(PHY_vars_eNb,
|
generate_pilots(PHY_vars_eNB,
|
||||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||||
|
|
||||||
@@ -641,8 +587,8 @@ int main(int argc, char **argv)
|
|||||||
dci_alloc,
|
dci_alloc,
|
||||||
0,
|
0,
|
||||||
1024,
|
1024,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
0);
|
0);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -657,47 +603,47 @@ int main(int argc, char **argv)
|
|||||||
dummybuf[1] = dummy1;
|
dummybuf[1] = dummy1;
|
||||||
dummybuf[2] = dummy2;
|
dummybuf[2] = dummy2;
|
||||||
dummybuf[3] = dummy3;
|
dummybuf[3] = dummy3;
|
||||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||||
(mod_sym_t**)dummybuf,
|
(mod_sym_t**)dummybuf,
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
pbch_pdu,
|
pbch_pdu,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
pbch_pdu,
|
pbch_pdu,
|
||||||
pbch_phase);
|
pbch_phase);
|
||||||
/*
|
/*
|
||||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
pbch_pdu,
|
pbch_pdu,
|
||||||
1);
|
1);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (interf1>-20) {
|
if (interf1>-20) {
|
||||||
/*
|
/*
|
||||||
generate_pss(PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb1->lte_frame_parms,
|
&PHY_vars_eNB1->lte_frame_parms,
|
||||||
(PHY_vars_eNb1->lte_frame_parms.Ncp==0)?6:5,
|
(PHY_vars_eNB1->lte_frame_parms.Ncp==0)?6:5,
|
||||||
0);
|
0);
|
||||||
*/
|
*/
|
||||||
generate_pilots(PHY_vars_eNb1,
|
generate_pilots(PHY_vars_eNB1,
|
||||||
PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||||
|
|
||||||
|
|
||||||
generate_pbch(&PHY_vars_eNb1->lte_eNB_pbch,
|
generate_pbch(&PHY_vars_eNB1->lte_eNB_pbch,
|
||||||
PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb1->lte_frame_parms,
|
&PHY_vars_eNB1->lte_frame_parms,
|
||||||
pbch_pdu,
|
pbch_pdu,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
@@ -705,26 +651,26 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (interf2>-20) {
|
if (interf2>-20) {
|
||||||
/*
|
/*
|
||||||
generate_pss(PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb2->lte_frame_parms,
|
&PHY_vars_eNB2->lte_frame_parms,
|
||||||
(PHY_vars_eNb2->lte_frame_parms.Ncp==0)?6:5,
|
(PHY_vars_eNB2->lte_frame_parms.Ncp==0)?6:5,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
generate_pilots(PHY_vars_eNb2,
|
generate_pilots(PHY_vars_eNB2,
|
||||||
PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||||
|
|
||||||
|
|
||||||
generate_pbch(&PHY_vars_eNb2->lte_eNB_pbch,
|
generate_pbch(&PHY_vars_eNB2->lte_eNB_pbch,
|
||||||
PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb2->lte_frame_parms,
|
&PHY_vars_eNB2->lte_frame_parms,
|
||||||
pbch_pdu,
|
pbch_pdu,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
@@ -733,10 +679,10 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// write_output("pilotsF.m","rsF",txdataF[0],lte_frame_parms->ofdm_symbol_size,1,1);
|
// write_output("pilotsF.m","rsF",txdataF[0],lte_frame_parms->ofdm_symbol_size,1,1);
|
||||||
|
|
||||||
write_output("txsigF0.m","txsF0", PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
|
|
||||||
if (PHY_vars_eNb->lte_frame_parms.nb_antennas_tx>1)
|
if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)
|
||||||
write_output("txsigF1.m","txsF1", PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
|
|
||||||
tx_lev = 0;
|
tx_lev = 0;
|
||||||
tx_lev1 = 0;
|
tx_lev1 = 0;
|
||||||
@@ -745,16 +691,16 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_tx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
|
||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][aa], // input,
|
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa], // input,
|
||||||
txdata[aa], // output
|
txdata[aa], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
else {
|
else {
|
||||||
normal_prefix_mod(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][aa],
|
normal_prefix_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa],
|
||||||
txdata[aa],
|
txdata[aa],
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb,
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb,
|
||||||
frame_parms);
|
frame_parms);
|
||||||
@@ -765,17 +711,17 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (interf1>-20) {
|
if (interf1>-20) {
|
||||||
for (aa=0; aa<PHY_vars_eNb1->lte_frame_parms.nb_antennas_tx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB1->lte_frame_parms.nb_antennas_tx; aa++) {
|
||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][aa], // input,
|
PHY_ofdm_mod(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][aa], // input,
|
||||||
PHY_vars_eNb1->lte_eNB_common_vars.txdata[0][aa], // output
|
PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][aa], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
2*nsymb, // number of symbols
|
2*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
else {
|
else {
|
||||||
normal_prefix_mod(PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][aa],
|
normal_prefix_mod(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][aa],
|
||||||
PHY_vars_eNb1->lte_eNB_common_vars.txdata[0][aa],
|
PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][aa],
|
||||||
2*nsymb,
|
2*nsymb,
|
||||||
frame_parms);
|
frame_parms);
|
||||||
}
|
}
|
||||||
@@ -784,24 +730,24 @@ int main(int argc, char **argv)
|
|||||||
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
|
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
write_output("txsigF0_1.m","txsF0_1", PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
write_output("txsigF0_1.m","txsF0_1", PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
|
|
||||||
if (PHY_vars_eNb1->lte_frame_parms.nb_antennas_tx>1)
|
if (PHY_vars_eNB1->lte_frame_parms.nb_antennas_tx>1)
|
||||||
write_output("txsigF1_1.m","txsF1_1", PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
write_output("txsigF1_1.m","txsF1_1", PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (interf2>-20) {
|
if (interf2>-20) {
|
||||||
for (aa=0; aa<PHY_vars_eNb2->lte_frame_parms.nb_antennas_tx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB2->lte_frame_parms.nb_antennas_tx; aa++) {
|
||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0][aa], // input,
|
PHY_ofdm_mod(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][aa], // input,
|
||||||
PHY_vars_eNb2->lte_eNB_common_vars.txdata[0][aa], // output
|
PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][aa], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
2*nsymb, // number of symbols
|
2*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
else {
|
else {
|
||||||
normal_prefix_mod(PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0][aa],
|
normal_prefix_mod(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][aa],
|
||||||
PHY_vars_eNb2->lte_eNB_common_vars.txdata[0][aa],
|
PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][aa],
|
||||||
2*nsymb,
|
2*nsymb,
|
||||||
frame_parms);
|
frame_parms);
|
||||||
}
|
}
|
||||||
@@ -810,10 +756,10 @@ int main(int argc, char **argv)
|
|||||||
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
|
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
write_output("txsigF0_2.m","txsF0_2", PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
write_output("txsigF0_2.m","txsF0_2", PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
|
|
||||||
if (PHY_vars_eNb2->lte_frame_parms.nb_antennas_tx>1)
|
if (PHY_vars_eNB2->lte_frame_parms.nb_antennas_tx>1)
|
||||||
write_output("txsigF1_2.m","txsF1_2", PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
write_output("txsigF1_2.m","txsF1_2", PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
// tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
||||||
@@ -823,15 +769,15 @@ int main(int argc, char **argv)
|
|||||||
if (frame_parms->nb_antennas_tx>1)
|
if (frame_parms->nb_antennas_tx>1)
|
||||||
write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
||||||
|
|
||||||
write_output("txsig0_1.m","txs0_1", PHY_vars_eNb1->lte_eNB_common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
write_output("txsig0_1.m","txs0_1", PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
||||||
|
|
||||||
if (frame_parms->nb_antennas_tx>1)
|
if (frame_parms->nb_antennas_tx>1)
|
||||||
write_output("txsig1_1.m","txs1_1", PHY_vars_eNb1->lte_eNB_common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
write_output("txsig1_1.m","txs1_1", PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
||||||
|
|
||||||
write_output("txsig0_2.m","txs0_2", PHY_vars_eNb2->lte_eNB_common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
write_output("txsig0_2.m","txs0_2", PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
||||||
|
|
||||||
if (frame_parms->nb_antennas_tx>1)
|
if (frame_parms->nb_antennas_tx>1)
|
||||||
write_output("txsig1_2.m","txs1_2", PHY_vars_eNb2->lte_eNB_common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
write_output("txsig1_2.m","txs1_2", PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
||||||
} else { //read in from file
|
} else { //read in from file
|
||||||
i=0;
|
i=0;
|
||||||
|
|
||||||
@@ -864,7 +810,7 @@ int main(int argc, char **argv)
|
|||||||
// multipath channel
|
// multipath channel
|
||||||
|
|
||||||
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
||||||
for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_tx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
|
||||||
s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
||||||
s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
|
s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
|
||||||
|
|
||||||
@@ -925,7 +871,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNb->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR;
|
sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR;
|
||||||
|
|
||||||
if (n_frames==1)
|
if (n_frames==1)
|
||||||
printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,%f,%f\n",sigma2_dB,SNR,
|
printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,%f,%f\n",sigma2_dB,SNR,
|
||||||
@@ -947,7 +893,7 @@ int main(int argc, char **argv)
|
|||||||
for (n_trials=0; n_trials<ntrials; n_trials++) {
|
for (n_trials=0; n_trials<ntrials; n_trials++) {
|
||||||
//printf("n_trial %d\n",n_trials);
|
//printf("n_trial %d\n",n_trials);
|
||||||
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
||||||
for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_rx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
|
||||||
if (n_trials==0) {
|
if (n_trials==0) {
|
||||||
r_re[aa][i] += (pow(10.0,.05*interf1)*r_re1[aa][i] + pow(10.0,.05*interf2)*r_re2[aa][i]);
|
r_re[aa][i] += (pow(10.0,.05*interf1)*r_re1[aa][i] + pow(10.0,.05*interf2)*r_re2[aa][i]);
|
||||||
r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]);
|
r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]);
|
||||||
@@ -983,14 +929,14 @@ int main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
for (l=0; l<PHY_vars_eNb->lte_frame_parms.symbols_per_tti; l++) {
|
for (l=0; l<PHY_vars_eNB->lte_frame_parms.symbols_per_tti; l++) {
|
||||||
|
|
||||||
// subframe_offset = (l/PHY_vars_eNb->lte_frame_parms.symbols_per_tti)*PHY_vars_eNb->lte_frame_parms.samples_per_tti;
|
// subframe_offset = (l/PHY_vars_eNB->lte_frame_parms.symbols_per_tti)*PHY_vars_eNB->lte_frame_parms.samples_per_tti;
|
||||||
// printf("subframe_offset = %d\n",subframe_offset);
|
// printf("subframe_offset = %d\n",subframe_offset);
|
||||||
|
|
||||||
slot_fep(PHY_vars_UE,
|
slot_fep(PHY_vars_UE,
|
||||||
l%(PHY_vars_eNb->lte_frame_parms.symbols_per_tti/2),
|
l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2),
|
||||||
l/(PHY_vars_eNb->lte_frame_parms.symbols_per_tti/2),
|
l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2),
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0);
|
0);
|
||||||
@@ -1026,7 +972,7 @@ int main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
if (l==((PHY_vars_eNb->lte_frame_parms.Ncp==0)?4:3)) {
|
if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?4:3)) {
|
||||||
//sprintf(fname,"dl_ch00_%d.m",l);
|
//sprintf(fname,"dl_ch00_%d.m",l);
|
||||||
//sprintf(vname,"dl_ch00_%d",l);
|
//sprintf(vname,"dl_ch00_%d",l);
|
||||||
//write_output(fname,vname,&(lte_ue_common_vars->dl_ch_estimates[0][lte_frame_parms->ofdm_symbol_size*(l%6)]),lte_frame_parms->ofdm_symbol_size,1,1);
|
//write_output(fname,vname,&(lte_ue_common_vars->dl_ch_estimates[0][lte_frame_parms->ofdm_symbol_size*(l%6)]),lte_frame_parms->ofdm_symbol_size,1,1);
|
||||||
@@ -1038,7 +984,7 @@ int main(int argc, char **argv)
|
|||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (l==((PHY_vars_eNb->lte_frame_parms.Ncp==0)?10:9)) {
|
if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?10:9)) {
|
||||||
|
|
||||||
for (frame_mod4=0; frame_mod4<4; frame_mod4++) {
|
for (frame_mod4=0; frame_mod4<4; frame_mod4++) {
|
||||||
pbch_tx_ant = rx_pbch(&PHY_vars_UE->lte_ue_common_vars,
|
pbch_tx_ant = rx_pbch(&PHY_vars_UE->lte_ue_common_vars,
|
||||||
@@ -1059,7 +1005,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
pbch_tx_ant = rx_pbch(&PHY_vars_UE->lte_ue_common_vars,
|
pbch_tx_ant = rx_pbch(&PHY_vars_UE->lte_ue_common_vars,
|
||||||
PHY_vars_UE->lte_ue_pbch_vars[0],
|
PHY_vars_UE->lte_ue_pbch_vars[0],
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
0,
|
0,
|
||||||
ALAMOUTI,
|
ALAMOUTI,
|
||||||
PHY_vars_UE->high_speed_flag,
|
PHY_vars_UE->high_speed_flag,
|
||||||
@@ -1119,10 +1065,10 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (n_frames==1) {
|
if (n_frames==1) {
|
||||||
|
|
||||||
write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNb->lte_frame_parms.ofdm_symbol_size),1,1);
|
write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1);
|
||||||
|
|
||||||
if (n_tx==2)
|
if (n_tx==2)
|
||||||
write_output("H10.m","h10",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNb->lte_frame_parms.ofdm_symbol_size),1,1);
|
write_output("H10.m","h10",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1);
|
||||||
|
|
||||||
write_output("rxsig0.m","rxs0", PHY_vars_UE->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
write_output("rxsig0.m","rxs0", PHY_vars_UE->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
||||||
write_output("rxsigF0.m","rxsF0", PHY_vars_UE->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1);
|
write_output("rxsigF0.m","rxsF0", PHY_vars_UE->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1);
|
||||||
|
|||||||
@@ -56,107 +56,15 @@ PHY_VARS_UE *PHY_vars_UE;
|
|||||||
|
|
||||||
#define UL_RB_ALLOC 0x1ff;
|
#define UL_RB_ALLOC 0x1ff;
|
||||||
#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2)
|
#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2)
|
||||||
#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
|
#define DLSCH_RB_ALLOC ((uint16_t)0x1fbf) // igore DC component,RB13
|
||||||
|
|
||||||
void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,unsigned char extended_prefix_flag,uint16_t Nid_cell,uint8_t tdd_config,uint8_t N_RB_DL,
|
|
||||||
lte_frame_type_t frame_type,uint8_t osf,uint32_t perfect_ce)
|
|
||||||
{
|
|
||||||
|
|
||||||
unsigned int i;
|
|
||||||
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
|
||||||
|
|
||||||
printf("Start lte_param_init (Nid_cell %d, extended_prefix %d, transmission_mode %d, N_tx %d, N_rx %d)\n",
|
|
||||||
Nid_cell, extended_prefix_flag,transmission_mode,N_tx,N_rx);
|
|
||||||
PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
PHY_vars_eNB1 = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
PHY_vars_eNB2 = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
|
|
||||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
|
||||||
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
|
||||||
mac_xface = malloc(sizeof(MAC_xface));
|
|
||||||
|
|
||||||
randominit(0);
|
|
||||||
set_taus_seed(0);
|
|
||||||
|
|
||||||
lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms);
|
|
||||||
|
|
||||||
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
|
||||||
lte_frame_parms->N_RB_UL = N_RB_DL;
|
|
||||||
lte_frame_parms->Ncp = extended_prefix_flag;
|
|
||||||
lte_frame_parms->Nid_cell = Nid_cell;
|
|
||||||
lte_frame_parms->nushift = Nid_cell%6;
|
|
||||||
lte_frame_parms->nb_antennas_tx_eNB = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_tx = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_rx = N_rx;
|
|
||||||
lte_frame_parms->phich_config_common.phich_resource = one; //half
|
|
||||||
lte_frame_parms->tdd_config = tdd_config;
|
|
||||||
lte_frame_parms->frame_type = frame_type;
|
|
||||||
|
|
||||||
// lte_frame_parms->Csrs = 2;
|
|
||||||
// lte_frame_parms->Bsrs = 0;
|
|
||||||
// lte_frame_parms->kTC = 0;
|
|
||||||
// lte_frame_parms->n_RRC = 0;
|
|
||||||
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
|
||||||
|
|
||||||
init_frame_parms(lte_frame_parms,osf);
|
|
||||||
|
|
||||||
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
|
||||||
|
|
||||||
|
|
||||||
memcpy(&PHY_vars_UE->lte_frame_parms,lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
|
||||||
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
phy_init_lte_ue(PHY_vars_UE,1,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
|
|
||||||
|
|
||||||
memcpy((void*)&PHY_vars_eNB1->lte_frame_parms,(void*)&PHY_vars_eNB->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
|
||||||
PHY_vars_eNB1->lte_frame_parms.nushift=(Nid_cell+1)%6;
|
|
||||||
PHY_vars_eNB1->lte_frame_parms.Nid_cell=Nid_cell+1;
|
|
||||||
|
|
||||||
memcpy((void*)&PHY_vars_eNB2->lte_frame_parms,(void*)&PHY_vars_eNB->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
|
||||||
PHY_vars_eNB2->lte_frame_parms.nushift=(Nid_cell+2)%6;
|
|
||||||
PHY_vars_eNB2->lte_frame_parms.Nid_cell=Nid_cell+2;
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNB1,0,0,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNB2,0,0,0);
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
PHY_vars_UE->PHY_measurements.n_adj_cells=2;
|
|
||||||
PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1;
|
|
||||||
PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2;
|
|
||||||
PHY_vars_UE->perfect_ce = perfect_ce;
|
|
||||||
|
|
||||||
for (i=0; i<3; i++)
|
|
||||||
lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i);
|
|
||||||
|
|
||||||
generate_pcfich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
|
|
||||||
generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
|
|
||||||
|
|
||||||
printf("Done lte_param_init\n");
|
|
||||||
|
|
||||||
CCCH_alloc_pdu.type = 1;
|
|
||||||
CCCH_alloc_pdu.vrb_type = 0;
|
|
||||||
CCCH_alloc_pdu.rballoc = CCCH_RB_ALLOC;
|
|
||||||
CCCH_alloc_pdu.ndi = 1;
|
|
||||||
CCCH_alloc_pdu.mcs = 1;
|
|
||||||
CCCH_alloc_pdu.harq_pid = 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DCI_PDU DCI_pdu;
|
DCI_PDU DCI_pdu;
|
||||||
|
|
||||||
DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2Lcommon, uint8_t format_selector, uint32_t rnti)
|
DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2Lcommon, uint8_t format_selector, uint32_t rnti)
|
||||||
{
|
{
|
||||||
uint8_t BCCH_alloc_pdu[8];
|
uint32_t BCCH_alloc_pdu[2];
|
||||||
uint8_t DLSCH_alloc_pdu[8];
|
uint32_t DLSCH_alloc_pdu[2];
|
||||||
uint8_t UL_alloc_pdu[8];
|
uint32_t UL_alloc_pdu[2];
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
int dci_length_bytes,dci_length;
|
int dci_length_bytes,dci_length;
|
||||||
@@ -462,31 +370,35 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2
|
|||||||
DCI_pdu.dci_alloc[0].ra_flag = 0;
|
DCI_pdu.dci_alloc[0].ra_flag = 0;
|
||||||
memcpy((void*)&DCI_pdu.dci_alloc[0].dci_pdu[0], &BCCH_alloc_pdu[0], BCCH_pdu_size_bytes);
|
memcpy((void*)&DCI_pdu.dci_alloc[0].dci_pdu[0], &BCCH_alloc_pdu[0], BCCH_pdu_size_bytes);
|
||||||
DCI_pdu.Num_common_dci++;
|
DCI_pdu.Num_common_dci++;
|
||||||
/*
|
if (lte_frame_parms->N_RB_DL >= 25) {
|
||||||
// add ue specific dci
|
// add ue specific dci
|
||||||
DCI_pdu.dci_alloc[1].dci_length = dci_length;
|
DCI_pdu.dci_alloc[1].dci_length = dci_length;
|
||||||
DCI_pdu.dci_alloc[1].L = log2L;
|
DCI_pdu.dci_alloc[1].L = log2L;
|
||||||
DCI_pdu.dci_alloc[1].rnti = rnti;
|
DCI_pdu.dci_alloc[1].rnti = rnti;
|
||||||
DCI_pdu.dci_alloc[1].format = format1;
|
DCI_pdu.dci_alloc[1].format = format1;
|
||||||
DCI_pdu.dci_alloc[1].ra_flag = 0;
|
DCI_pdu.dci_alloc[1].ra_flag = 0;
|
||||||
memcpy((void*)&DCI_pdu.dci_alloc[1].dci_pdu[0], &DLSCH_alloc_pdu[0], dci_length_bytes);
|
memcpy((void*)&DCI_pdu.dci_alloc[1].dci_pdu[0], &DLSCH_alloc_pdu[0], dci_length_bytes);
|
||||||
DCI_pdu.Num_ue_spec_dci++;
|
DCI_pdu.Num_ue_spec_dci++;
|
||||||
|
|
||||||
|
if (lte_frame_parms->N_RB_DL >= 50) {
|
||||||
|
DCI_pdu.dci_alloc[2].dci_length = UL_pdu_size_bits;
|
||||||
|
DCI_pdu.dci_alloc[2].L = log2L;
|
||||||
|
DCI_pdu.dci_alloc[2].rnti = rnti;
|
||||||
|
DCI_pdu.dci_alloc[2].format = format0;
|
||||||
|
DCI_pdu.dci_alloc[2].ra_flag = 0;
|
||||||
|
memcpy((void*)&DCI_pdu.dci_alloc[0].dci_pdu[0], &UL_alloc_pdu[0], UL_pdu_size_bytes);
|
||||||
|
DCI_pdu.Num_ue_spec_dci++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DCI_pdu.dci_alloc[0].dci_length = UL_pdu_size_bits;
|
|
||||||
DCI_pdu.dci_alloc[0].L = log2L;
|
|
||||||
DCI_pdu.dci_alloc[0].rnti = rnti;
|
|
||||||
DCI_pdu.dci_alloc[0].format = format0;
|
|
||||||
DCI_pdu.dci_alloc[0].ra_flag = 0;
|
|
||||||
memcpy((void*)&DCI_pdu.dci_alloc[0].dci_pdu[0], &UL_alloc_pdu[0], UL_pdu_size_bytes);
|
|
||||||
DCI_pdu.Num_ue_spec_dci++;
|
|
||||||
*/
|
|
||||||
DCI_pdu.nCCE = 0;
|
DCI_pdu.nCCE = 0;
|
||||||
|
|
||||||
for (i=0; i<DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci; i++) {
|
for (i=0; i<DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci; i++) {
|
||||||
DCI_pdu.nCCE += (1<<(DCI_pdu.dci_alloc[i].L));
|
DCI_pdu.nCCE += (1<<(DCI_pdu.dci_alloc[i].L));
|
||||||
}
|
}
|
||||||
|
|
||||||
return(&DCI_pdu);
|
return(&DCI_pdu);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -523,10 +435,8 @@ int main(int argc, char **argv)
|
|||||||
uint8_t dci_cnt=0;
|
uint8_t dci_cnt=0;
|
||||||
LTE_DL_FRAME_PARMS *frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms;
|
||||||
uint8_t log2L=2, log2Lcommon=2, format_selector=0;
|
uint8_t log2L=2, log2Lcommon=2, format_selector=0;
|
||||||
uint8_t numCCE,nCCE_max,common_active=0,ul_active=0,dl_active=0;
|
uint8_t numCCE,common_active=0,ul_active=0,dl_active=0;
|
||||||
uint32_t rv;
|
|
||||||
|
|
||||||
DCI_format_t format = format1;
|
|
||||||
uint32_t n_trials_common=0,n_trials_ul=0,n_trials_dl=0,false_detection_cnt=0;
|
uint32_t n_trials_common=0,n_trials_ul=0,n_trials_dl=0,false_detection_cnt=0;
|
||||||
uint8_t common_rx,ul_rx,dl_rx;
|
uint8_t common_rx,ul_rx,dl_rx;
|
||||||
uint8_t tdd_config=3;
|
uint8_t tdd_config=3;
|
||||||
@@ -540,19 +450,19 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
DCI_ALLOC_t dci_alloc_rx[8];
|
DCI_ALLOC_t dci_alloc_rx[8];
|
||||||
|
|
||||||
void* dlsch_pdu = NULL;
|
int ret;
|
||||||
// int ret;
|
|
||||||
|
|
||||||
uint8_t harq_pid;
|
uint8_t harq_pid;
|
||||||
uint8_t phich_ACK;
|
uint8_t phich_ACK;
|
||||||
|
|
||||||
uint8_t num_phich_interf = 0;
|
uint8_t num_phich_interf = 0;
|
||||||
lte_frame_type_t frame_type=TDD;
|
lte_frame_type_t frame_type=TDD;
|
||||||
int re_offset;
|
// int re_offset;
|
||||||
uint32_t *txptr;
|
// uint32_t *txptr;
|
||||||
int aarx;
|
int aarx;
|
||||||
int k;
|
int k;
|
||||||
uint32_t perfect_ce = 0;
|
uint32_t perfect_ce = 0;
|
||||||
|
int CCE_table[800];
|
||||||
|
|
||||||
number_of_cards = 1;
|
number_of_cards = 1;
|
||||||
openair_daq_vars.rx_rf_mode = 1;
|
openair_daq_vars.rx_rf_mode = 1;
|
||||||
@@ -798,9 +708,10 @@ int main(int argc, char **argv)
|
|||||||
n_rx,
|
n_rx,
|
||||||
transmission_mode,
|
transmission_mode,
|
||||||
extended_prefix_flag,
|
extended_prefix_flag,
|
||||||
|
frame_type,
|
||||||
Nid_cell,
|
Nid_cell,
|
||||||
tdd_config,
|
tdd_config,
|
||||||
N_RB_DL,frame_type,
|
N_RB_DL,
|
||||||
osf,
|
osf,
|
||||||
perfect_ce);
|
perfect_ce);
|
||||||
|
|
||||||
@@ -876,7 +787,7 @@ int main(int argc, char **argv)
|
|||||||
i=0;
|
i=0;
|
||||||
|
|
||||||
while (!feof(input_fd)) {
|
while (!feof(input_fd)) {
|
||||||
fscanf(input_fd,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2);
|
ret=fscanf(input_fd,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2);
|
||||||
|
|
||||||
if ((i%4)==0) {
|
if ((i%4)==0) {
|
||||||
((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL));
|
((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL));
|
||||||
@@ -903,7 +814,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
PHY_vars_UE->UE_mode[0] = PUSCH;
|
PHY_vars_UE->UE_mode[0] = PUSCH;
|
||||||
|
|
||||||
nCCE_max = get_nCCE(3,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,0));
|
// nCCE_max = get_nCCE(3,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,0));
|
||||||
//printf("nCCE_max %d\n",nCCE_max);
|
//printf("nCCE_max %d\n",nCCE_max);
|
||||||
|
|
||||||
//printf("num_phich interferers %d\n",num_phich_interf);
|
//printf("num_phich interferers %d\n",num_phich_interf);
|
||||||
@@ -955,55 +866,62 @@ int main(int argc, char **argv)
|
|||||||
numCCE=0;
|
numCCE=0;
|
||||||
n_trials_common++;
|
n_trials_common++;
|
||||||
common_active = 1;
|
common_active = 1;
|
||||||
n_trials_ul++;
|
if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 50) {
|
||||||
ul_active = 1;
|
n_trials_ul++;
|
||||||
n_trials_dl++;
|
ul_active = 1;
|
||||||
dl_active = 1;
|
}
|
||||||
|
if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 25) {
|
||||||
|
n_trials_dl++;
|
||||||
|
dl_active = 1;
|
||||||
|
}
|
||||||
|
|
||||||
init_nCCE_table();
|
|
||||||
num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci,
|
num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci,
|
||||||
DCI_pdu.dci_alloc, frame_parms, subframe);
|
DCI_pdu.dci_alloc, frame_parms, subframe);
|
||||||
DCI_pdu.nCCE = get_nCCE(num_pdcch_symbols,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,subframe));
|
numCCE = get_nCCE(num_pdcch_symbols,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,subframe));
|
||||||
|
|
||||||
if (n_frames==1) {
|
if (n_frames==1) {
|
||||||
printf("num_dci %d, num_pddch_symbols %d, nCCE %d\n",
|
printf("num_dci %d, num_pddch_symbols %d, nCCE %d\n",
|
||||||
DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci,
|
DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci,
|
||||||
num_pdcch_symbols,
|
num_pdcch_symbols,numCCE);
|
||||||
DCI_pdu.nCCE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply RNTI-based nCCE allocation
|
// apply RNTI-based nCCE allocation
|
||||||
|
memset(CCE_table,0,800*sizeof(int));
|
||||||
|
|
||||||
for (i = 0; i < DCI_pdu.Num_common_dci + DCI_pdu.Num_ue_spec_dci; i++) {
|
for (i = 0; i < DCI_pdu.Num_common_dci + DCI_pdu.Num_ue_spec_dci; i++) {
|
||||||
// SI RNTI
|
// SI RNTI
|
||||||
if (DCI_pdu.dci_alloc[i].rnti == SI_RNTI) {
|
if (DCI_pdu.dci_alloc[i].rnti == SI_RNTI) {
|
||||||
DCI_pdu.dci_alloc[i].nCCE = get_nCCE_offset(1<<DCI_pdu.dci_alloc[i].L,
|
DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table,
|
||||||
DCI_pdu.nCCE,
|
1<<DCI_pdu.dci_alloc[i].L,
|
||||||
1,
|
numCCE,
|
||||||
SI_RNTI,
|
1,
|
||||||
subframe);
|
SI_RNTI,
|
||||||
|
subframe);
|
||||||
}
|
}
|
||||||
// RA RNTI
|
// RA RNTI
|
||||||
else if (DCI_pdu.dci_alloc[i].ra_flag == 1) {
|
else if (DCI_pdu.dci_alloc[i].ra_flag == 1) {
|
||||||
DCI_pdu.dci_alloc[i].nCCE = get_nCCE_offset(1<<DCI_pdu.dci_alloc[i].L,
|
DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table,
|
||||||
DCI_pdu.nCCE,
|
1<<DCI_pdu.dci_alloc[i].L,
|
||||||
1,
|
numCCE,
|
||||||
DCI_pdu.dci_alloc[i].rnti,
|
1,
|
||||||
subframe);
|
DCI_pdu.dci_alloc[i].rnti,
|
||||||
|
subframe);
|
||||||
}
|
}
|
||||||
// C RNTI
|
// C RNTI
|
||||||
else {
|
else {
|
||||||
DCI_pdu.dci_alloc[i].nCCE = get_nCCE_offset(1<<DCI_pdu.dci_alloc[i].L,
|
DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table,
|
||||||
DCI_pdu.nCCE,
|
1<<DCI_pdu.dci_alloc[i].L,
|
||||||
0,
|
numCCE,
|
||||||
DCI_pdu.dci_alloc[i].rnti,
|
0,
|
||||||
subframe);
|
DCI_pdu.dci_alloc[i].rnti,
|
||||||
|
subframe);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n_frames==1)
|
if (n_frames==1)
|
||||||
printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i,DCI_pdu.dci_alloc[i].rnti, DCI_pdu.dci_alloc[i].format,
|
printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i,DCI_pdu.dci_alloc[i].rnti, DCI_pdu.dci_alloc[i].format,
|
||||||
DCI_pdu.dci_alloc[i].L, DCI_pdu.dci_alloc[i].nCCE, DCI_pdu.nCCE, DCI_pdu.dci_alloc[i].dci_length);
|
DCI_pdu.dci_alloc[i].L, DCI_pdu.dci_alloc[i].firstCCE, numCCE, DCI_pdu.dci_alloc[i].dci_length);
|
||||||
|
|
||||||
if (DCI_pdu.dci_alloc[i].nCCE==-1)
|
if (DCI_pdu.dci_alloc[i].firstCCE==-1)
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1037,7 +955,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
generate_phich_top(PHY_vars_eNB,
|
generate_phich_top(PHY_vars_eNB,
|
||||||
subframe,AMP,0,0);
|
subframe,AMP,0,0);
|
||||||
/*
|
|
||||||
// generate 3 interfering PHICH
|
// generate 3 interfering PHICH
|
||||||
if (num_phich_interf>0) {
|
if (num_phich_interf>0) {
|
||||||
PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 4;
|
PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 4;
|
||||||
@@ -1064,7 +982,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 0;
|
PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 0;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// write_output("pilotsF.m","rsF",txdataF[0],lte_PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
|
// write_output("pilotsF.m","rsF",txdataF[0],lte_PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
|
||||||
@@ -1084,7 +1002,7 @@ int main(int argc, char **argv)
|
|||||||
if (PHY_vars_eNB->lte_frame_parms.Ncp == 1)
|
if (PHY_vars_eNB->lte_frame_parms.Ncp == 1)
|
||||||
PHY_ofdm_mod(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], // input,
|
PHY_ofdm_mod(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], // input,
|
||||||
&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], // output
|
&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], // output
|
||||||
PHY_vars_eNB->lte_frame_parms.log2_symbol_size, // log2_fft_size
|
PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,
|
||||||
2*nsymb, // number of symbols
|
2*nsymb, // number of symbols
|
||||||
PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -1244,7 +1162,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
for (i = 0; i < dci_cnt; i++)
|
for (i = 0; i < dci_cnt; i++)
|
||||||
printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i, dci_alloc_rx[i].rnti, dci_alloc_rx[i].format,
|
printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i, dci_alloc_rx[i].rnti, dci_alloc_rx[i].format,
|
||||||
dci_alloc_rx[i].L, dci_alloc_rx[i].nCCE, numCCE, dci_alloc_rx[i].dci_length);
|
dci_alloc_rx[i].L, dci_alloc_rx[i].firstCCE, numCCE, dci_alloc_rx[i].dci_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<dci_cnt; i++) {
|
for (i=0; i<dci_cnt; i++) {
|
||||||
@@ -1319,8 +1237,8 @@ int main(int argc, char **argv)
|
|||||||
} //trials
|
} //trials
|
||||||
|
|
||||||
printf("SNR %f : n_errors_common = %d/%d (%e)\n", SNR,n_errors_common,n_trials_common,(double)n_errors_common/n_trials_common);
|
printf("SNR %f : n_errors_common = %d/%d (%e)\n", SNR,n_errors_common,n_trials_common,(double)n_errors_common/n_trials_common);
|
||||||
printf("SNR %f : n_errors_ul = %d/%d (%e)\n", SNR,n_errors_ul,n_trials_ul,(double)n_errors_ul/n_trials_ul);
|
if (ul_active==1) printf("SNR %f : n_errors_ul = %d/%d (%e)\n", SNR,n_errors_ul,n_trials_ul,(double)n_errors_ul/n_trials_ul);
|
||||||
printf("SNR %f : n_errors_dl = %d/%d (%e)\n", SNR,n_errors_dl,n_trials_dl,(double)n_errors_dl/n_trials_dl);
|
if (dl_active==1) printf("SNR %f : n_errors_dl = %d/%d (%e)\n", SNR,n_errors_dl,n_trials_dl,(double)n_errors_dl/n_trials_dl);
|
||||||
printf("SNR %f : n_errors_cfi = %d/%d (%e)\n", SNR,n_errors_cfi,trial,(double)n_errors_cfi/trial);
|
printf("SNR %f : n_errors_cfi = %d/%d (%e)\n", SNR,n_errors_cfi,trial,(double)n_errors_cfi/trial);
|
||||||
printf("SNR %f : n_errors_hi = %d/%d (%e)\n", SNR,n_errors_hi,trial,(double)n_errors_hi/trial);
|
printf("SNR %f : n_errors_hi = %d/%d (%e)\n", SNR,n_errors_hi,trial,(double)n_errors_hi/trial);
|
||||||
|
|
||||||
|
|||||||
@@ -56,58 +56,6 @@ PHY_VARS_UE *PHY_vars_UE;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,unsigned char extended_prefix_flag,uint16_t Nid_cell,uint8_t N_RB_DL,uint8_t osf)
|
|
||||||
{
|
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
|
||||||
|
|
||||||
printf("Start lte_param_init\n");
|
|
||||||
PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
|
|
||||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
|
||||||
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
|
||||||
mac_xface = malloc(sizeof(MAC_xface));
|
|
||||||
|
|
||||||
randominit(0);
|
|
||||||
set_taus_seed(0);
|
|
||||||
|
|
||||||
lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms);
|
|
||||||
|
|
||||||
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
|
||||||
lte_frame_parms->N_RB_UL = N_RB_DL;
|
|
||||||
lte_frame_parms->Ncp = extended_prefix_flag;
|
|
||||||
lte_frame_parms->Nid_cell = Nid_cell;
|
|
||||||
lte_frame_parms->nushift = 0;
|
|
||||||
lte_frame_parms->nb_antennas_tx = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_rx = N_rx;
|
|
||||||
// lte_frame_parms->Csrs = 2;
|
|
||||||
// lte_frame_parms->Bsrs = 0;
|
|
||||||
// lte_frame_parms->kTC = 0;
|
|
||||||
// lte_frame_parms->n_RRC = 0;
|
|
||||||
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
|
||||||
lte_frame_parms->tdd_config = 1;
|
|
||||||
lte_frame_parms->frame_type = 1;
|
|
||||||
init_frame_parms(lte_frame_parms,osf);
|
|
||||||
|
|
||||||
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
|
||||||
|
|
||||||
|
|
||||||
PHY_vars_UE->lte_frame_parms = *lte_frame_parms;
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
phy_init_lte_ue(PHY_vars_UE,1,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
printf("Done lte_param_init\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
extern uint16_t prach_root_sequence_map0_3[838];
|
extern uint16_t prach_root_sequence_map0_3[838];
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
@@ -370,7 +318,16 @@ int main(int argc, char **argv)
|
|||||||
if (transmission_mode==2)
|
if (transmission_mode==2)
|
||||||
n_tx=2;
|
n_tx=2;
|
||||||
|
|
||||||
lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,Nid_cell,N_RB_DL,osf);
|
lte_param_init(n_tx,
|
||||||
|
n_rx,
|
||||||
|
transmission_mode,
|
||||||
|
extended_prefix_flag,
|
||||||
|
FDD,
|
||||||
|
Nid_cell,
|
||||||
|
3,
|
||||||
|
N_RB_DL,
|
||||||
|
osf,
|
||||||
|
0);
|
||||||
|
|
||||||
|
|
||||||
if (snr1set==0) {
|
if (snr1set==0) {
|
||||||
|
|||||||
@@ -58,60 +58,6 @@ PHY_VARS_UE *PHY_vars_UE;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,unsigned char extended_prefix_flag,uint16_t Nid_cell,uint8_t N_RB_DL,uint8_t osf)
|
|
||||||
{
|
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
|
||||||
|
|
||||||
printf("Start lte_param_init\n");
|
|
||||||
PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
|
|
||||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
|
||||||
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
|
||||||
mac_xface = malloc(sizeof(MAC_xface));
|
|
||||||
|
|
||||||
randominit(0);
|
|
||||||
set_taus_seed(0);
|
|
||||||
|
|
||||||
lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms);
|
|
||||||
|
|
||||||
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
|
||||||
lte_frame_parms->N_RB_UL = N_RB_DL;
|
|
||||||
lte_frame_parms->Ncp = extended_prefix_flag;
|
|
||||||
lte_frame_parms->Nid_cell = Nid_cell;
|
|
||||||
lte_frame_parms->nushift = 0;
|
|
||||||
lte_frame_parms->nb_antennas_tx = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_rx = N_rx;
|
|
||||||
// lte_frame_parms->Csrs = 2;
|
|
||||||
// lte_frame_parms->Bsrs = 0;
|
|
||||||
// lte_frame_parms->kTC = 0;
|
|
||||||
// lte_frame_parms->n_RRC = 0;
|
|
||||||
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
|
||||||
lte_frame_parms->tdd_config = 3;
|
|
||||||
lte_frame_parms->frame_type = 0;
|
|
||||||
init_frame_parms(lte_frame_parms,osf);
|
|
||||||
|
|
||||||
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
|
||||||
|
|
||||||
// phy_init_top(lte_frame_parms); //allocation
|
|
||||||
|
|
||||||
PHY_vars_UE->lte_frame_parms = *lte_frame_parms;
|
|
||||||
|
|
||||||
|
|
||||||
phy_init_lte_ue(PHY_vars_UE,1,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
printf("Done lte_param_init\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -246,7 +192,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
msg("Unsupported channel model!\n");
|
printf("Unsupported channel model!\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,13 +204,13 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
snr0 = atof(optarg);
|
snr0 = atof(optarg);
|
||||||
msg("Setting SNR0 to %f\n",snr0);
|
printf("Setting SNR0 to %f\n",snr0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'S':
|
case 'S':
|
||||||
snr1 = atof(optarg);
|
snr1 = atof(optarg);
|
||||||
snr1set=1;
|
snr1set=1;
|
||||||
msg("Setting SNR1 to %f\n",snr1);
|
printf("Setting SNR1 to %f\n",snr1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
@@ -287,7 +233,7 @@ int main(int argc, char **argv)
|
|||||||
if ((transmission_mode!=1) &&
|
if ((transmission_mode!=1) &&
|
||||||
(transmission_mode!=2) &&
|
(transmission_mode!=2) &&
|
||||||
(transmission_mode!=6)) {
|
(transmission_mode!=6)) {
|
||||||
msg("Unsupported transmission mode %d\n",transmission_mode);
|
printf("Unsupported transmission mode %d\n",transmission_mode);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,7 +243,7 @@ int main(int argc, char **argv)
|
|||||||
n_tx=atoi(optarg);
|
n_tx=atoi(optarg);
|
||||||
|
|
||||||
if ((n_tx==0) || (n_tx>2)) {
|
if ((n_tx==0) || (n_tx>2)) {
|
||||||
msg("Unsupported number of tx antennas %d\n",n_tx);
|
printf("Unsupported number of tx antennas %d\n",n_tx);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,7 +253,7 @@ int main(int argc, char **argv)
|
|||||||
n_rx=atoi(optarg);
|
n_rx=atoi(optarg);
|
||||||
|
|
||||||
if ((n_rx==0) || (n_rx>2)) {
|
if ((n_rx==0) || (n_rx>2)) {
|
||||||
msg("Unsupported number of rx antennas %d\n",n_rx);
|
printf("Unsupported number of rx antennas %d\n",n_rx);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,7 +314,16 @@ int main(int argc, char **argv)
|
|||||||
if (transmission_mode==2)
|
if (transmission_mode==2)
|
||||||
n_tx=2;
|
n_tx=2;
|
||||||
|
|
||||||
lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,Nid_cell,N_RB_DL,osf);
|
lte_param_init(n_tx,
|
||||||
|
n_rx,
|
||||||
|
transmission_mode,
|
||||||
|
extended_prefix_flag,
|
||||||
|
Nid_cell,
|
||||||
|
FDD,
|
||||||
|
3,
|
||||||
|
N_RB_DL,
|
||||||
|
osf,
|
||||||
|
0);
|
||||||
|
|
||||||
|
|
||||||
if (snr1set==0) {
|
if (snr1set==0) {
|
||||||
@@ -412,7 +367,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
msg("[SIM] Using SCM/101\n");
|
printf("[SIM] Using SCM/101\n");
|
||||||
UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||||
channel_model,
|
channel_model,
|
||||||
@@ -424,7 +379,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
if (UE2eNB==NULL) {
|
if (UE2eNB==NULL) {
|
||||||
msg("Problem generating channel model. Exiting.\n");
|
printf("Problem generating channel model. Exiting.\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,7 +407,7 @@ int main(int argc, char **argv)
|
|||||||
PHY_vars_UE->lte_frame_parms.pucch_config_common.nRB_CQI = 0;
|
PHY_vars_UE->lte_frame_parms.pucch_config_common.nRB_CQI = 0;
|
||||||
PHY_vars_UE->lte_frame_parms.pucch_config_common.nCS_AN = 0;
|
PHY_vars_UE->lte_frame_parms.pucch_config_common.nCS_AN = 0;
|
||||||
|
|
||||||
pucch_payload = 1;
|
pucch_payload = 0;
|
||||||
|
|
||||||
generate_pucch(PHY_vars_UE->lte_ue_common_vars.txdataF,
|
generate_pucch(PHY_vars_UE->lte_ue_common_vars.txdataF,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
@@ -473,7 +428,7 @@ int main(int argc, char **argv)
|
|||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(txdataF2[aa], // input
|
PHY_ofdm_mod(txdataF2[aa], // input
|
||||||
txdata[aa], // output
|
txdata[aa], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
2*nsymb, // number of symbols
|
2*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -496,7 +451,7 @@ int main(int argc, char **argv)
|
|||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input,
|
PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input,
|
||||||
&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], // output
|
&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
nsymb, // number of symbols
|
nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -595,9 +550,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lte_eNB_I0_measurements(PHY_vars_eNB,
|
|
||||||
0,
|
|
||||||
1);
|
|
||||||
|
|
||||||
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
||||||
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
|
||||||
@@ -645,6 +598,10 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// if (sig == 1)
|
// if (sig == 1)
|
||||||
// printf("*");
|
// printf("*");
|
||||||
|
lte_eNB_I0_measurements(PHY_vars_eNB,
|
||||||
|
subframe,
|
||||||
|
0,
|
||||||
|
1);
|
||||||
PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(12*NB_RB)));
|
PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(12*NB_RB)));
|
||||||
stat = rx_pucch(PHY_vars_eNB,
|
stat = rx_pucch(PHY_vars_eNB,
|
||||||
pucch_format,
|
pucch_format,
|
||||||
|
|||||||
@@ -56,94 +56,11 @@
|
|||||||
#define BW 20.0
|
#define BW 20.0
|
||||||
|
|
||||||
|
|
||||||
PHY_VARS_eNB *PHY_vars_eNb,*PHY_vars_eNb1,*PHY_vars_eNb2;
|
PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2;
|
||||||
PHY_VARS_UE *PHY_vars_UE;
|
PHY_VARS_UE *PHY_vars_UE;
|
||||||
|
|
||||||
#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
|
#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
|
||||||
|
|
||||||
void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,unsigned char extended_prefix_flag,unsigned char frame_type, uint16_t Nid_cell,uint8_t N_RB_DL,uint8_t osf)
|
|
||||||
{
|
|
||||||
|
|
||||||
// unsigned int ind;
|
|
||||||
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
printf("Start lte_param_init\n");
|
|
||||||
PHY_vars_eNb = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
PHY_vars_eNb1 = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
PHY_vars_eNb2 = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
|
|
||||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
|
||||||
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
|
||||||
mac_xface = malloc(sizeof(MAC_xface));
|
|
||||||
|
|
||||||
randominit(0);
|
|
||||||
set_taus_seed(0);
|
|
||||||
|
|
||||||
lte_frame_parms = &(PHY_vars_eNb->lte_frame_parms);
|
|
||||||
|
|
||||||
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
|
||||||
lte_frame_parms->N_RB_UL = N_RB_DL;
|
|
||||||
lte_frame_parms->Ncp = extended_prefix_flag;
|
|
||||||
lte_frame_parms->Nid_cell = Nid_cell;
|
|
||||||
lte_frame_parms->nushift = Nid_cell%6;
|
|
||||||
lte_frame_parms->nb_antennas_tx = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_tx_eNB = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_rx = N_rx;
|
|
||||||
// lte_frame_parms->Csrs = 2;
|
|
||||||
// lte_frame_parms->Bsrs = 0;
|
|
||||||
// lte_frame_parms->kTC = 0;
|
|
||||||
// lte_frame_parms->n_RRC = 0;
|
|
||||||
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
|
||||||
lte_frame_parms->tdd_config = 3;
|
|
||||||
lte_frame_parms->frame_type = frame_type;
|
|
||||||
init_frame_parms(lte_frame_parms,osf);
|
|
||||||
|
|
||||||
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
|
||||||
|
|
||||||
|
|
||||||
PHY_vars_UE->lte_frame_parms = *lte_frame_parms;
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
PHY_vars_UE->PHY_measurements.n_adj_cells=2;
|
|
||||||
PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1;
|
|
||||||
PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2;
|
|
||||||
|
|
||||||
for (i=0; i<3; i++)
|
|
||||||
lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i);
|
|
||||||
|
|
||||||
phy_init_lte_ue(PHY_vars_UE,1,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNb,0,0,0);
|
|
||||||
|
|
||||||
for (i=0; i<10; i++) {
|
|
||||||
PHY_vars_UE->scan_info[0].amp[0][i] = 0;
|
|
||||||
PHY_vars_UE->scan_info[0].amp[1][i] = 0;
|
|
||||||
PHY_vars_UE->scan_info[0].amp[2][i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy((void*)&PHY_vars_eNb1->lte_frame_parms,(void*)&PHY_vars_eNb->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
|
||||||
PHY_vars_eNb1->lte_frame_parms.Nid_cell=Nid_cell+1;
|
|
||||||
PHY_vars_eNb1->lte_frame_parms.nushift=(Nid_cell+1)%6;
|
|
||||||
PHY_vars_eNb1->Mod_id=1;
|
|
||||||
|
|
||||||
memcpy((void*)&PHY_vars_eNb2->lte_frame_parms,(void*)&PHY_vars_eNb->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
|
||||||
PHY_vars_eNb2->lte_frame_parms.Nid_cell=Nid_cell+2;
|
|
||||||
PHY_vars_eNb2->lte_frame_parms.nushift=(Nid_cell+2)%6;
|
|
||||||
PHY_vars_eNb2->Mod_id=2;
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNb1,0,0,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNb2,0,0,0);
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
printf("Done lte_param_init\n");
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
mod_sym_t *dummybuf[4];
|
mod_sym_t *dummybuf[4];
|
||||||
mod_sym_t dummy0[2048*14];
|
mod_sym_t dummy0[2048*14];
|
||||||
mod_sym_t dummy1[2048*14];
|
mod_sym_t dummy1[2048*14];
|
||||||
@@ -404,7 +321,16 @@ int main(int argc, char **argv)
|
|||||||
if (transmission_mode>=2)
|
if (transmission_mode>=2)
|
||||||
n_tx=2;
|
n_tx=2;
|
||||||
|
|
||||||
lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,N_RB_DL,osf);
|
lte_param_init(n_tx,
|
||||||
|
n_rx,
|
||||||
|
transmission_mode,
|
||||||
|
extended_prefix_flag,
|
||||||
|
frame_type,
|
||||||
|
Nid_cell,
|
||||||
|
3,
|
||||||
|
N_RB_DL,
|
||||||
|
osf,
|
||||||
|
0);
|
||||||
|
|
||||||
#ifdef XFORMS
|
#ifdef XFORMS
|
||||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||||
@@ -422,13 +348,13 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
|
printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
|
||||||
|
|
||||||
frame_parms = &PHY_vars_eNb->lte_frame_parms;
|
frame_parms = &PHY_vars_eNB->lte_frame_parms;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
txdata = PHY_vars_eNb->lte_eNB_common_vars.txdata[0];
|
txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[0];
|
||||||
txdata1 = PHY_vars_eNb1->lte_eNB_common_vars.txdata[0];
|
txdata1 = PHY_vars_eNB1->lte_eNB_common_vars.txdata[0];
|
||||||
txdata2 = PHY_vars_eNb2->lte_eNB_common_vars.txdata[0];
|
txdata2 = PHY_vars_eNB2->lte_eNB_common_vars.txdata[0];
|
||||||
|
|
||||||
|
|
||||||
s_re = malloc(2*sizeof(double*));
|
s_re = malloc(2*sizeof(double*));
|
||||||
@@ -449,8 +375,8 @@ int main(int argc, char **argv)
|
|||||||
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS,
|
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS,
|
||||||
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb);
|
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb);
|
||||||
|
|
||||||
printf("PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
|
printf("PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
|
||||||
PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0]);
|
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0]);
|
||||||
|
|
||||||
|
|
||||||
DLSCH_alloc_pdu2.rah = 0;
|
DLSCH_alloc_pdu2.rah = 0;
|
||||||
@@ -465,13 +391,14 @@ int main(int argc, char **argv)
|
|||||||
// Forget second codeword
|
// Forget second codeword
|
||||||
DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding
|
DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding
|
||||||
|
|
||||||
eNB2UE = new_channel_desc_scm(PHY_vars_eNb->lte_frame_parms.nb_antennas_tx,
|
eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||||
channel_model,
|
channel_model,
|
||||||
BW,
|
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||||
0,
|
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||||
0,
|
0,
|
||||||
0);
|
0,
|
||||||
|
0);
|
||||||
|
|
||||||
|
|
||||||
if (eNB2UE==NULL) {
|
if (eNB2UE==NULL) {
|
||||||
@@ -512,51 +439,51 @@ int main(int argc, char **argv)
|
|||||||
pbch_pdu[1]=1;
|
pbch_pdu[1]=1;
|
||||||
pbch_pdu[2]=0;
|
pbch_pdu[2]=0;
|
||||||
|
|
||||||
if (PHY_vars_eNb->lte_frame_parms.frame_type == FDD) {
|
if (PHY_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==NORMAL) ? 6 : 5,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5,
|
||||||
0);
|
0);
|
||||||
/*
|
/*
|
||||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||||
0);*/
|
0);*/
|
||||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||||
10);
|
10);
|
||||||
/*
|
/*
|
||||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||||
10);
|
10);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||||
1);
|
1);
|
||||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
2,
|
2,
|
||||||
2);
|
2);
|
||||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||||
11);
|
11);
|
||||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
2,
|
2,
|
||||||
12);
|
12);
|
||||||
|
|
||||||
@@ -565,8 +492,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
generate_pilots(PHY_vars_eNb,
|
generate_pilots(PHY_vars_eNB,
|
||||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||||
|
|
||||||
@@ -577,8 +504,8 @@ int main(int argc, char **argv)
|
|||||||
dci_alloc,
|
dci_alloc,
|
||||||
0,
|
0,
|
||||||
1024,
|
1024,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
0);
|
0);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -593,25 +520,25 @@ int main(int argc, char **argv)
|
|||||||
dummybuf[1] = dummy1;
|
dummybuf[1] = dummy1;
|
||||||
dummybuf[2] = dummy2;
|
dummybuf[2] = dummy2;
|
||||||
dummybuf[3] = dummy3;
|
dummybuf[3] = dummy3;
|
||||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||||
(mod_sym_t**)dummybuf,
|
(mod_sym_t**)dummybuf,
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
pbch_pdu,
|
pbch_pdu,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||||
AMP,
|
AMP,
|
||||||
&PHY_vars_eNb->lte_frame_parms,
|
&PHY_vars_eNB->lte_frame_parms,
|
||||||
pbch_pdu,
|
pbch_pdu,
|
||||||
pbch_phase);
|
pbch_phase);
|
||||||
*/
|
*/
|
||||||
write_output("txsigF0.m","txsF0", PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
|
|
||||||
if (PHY_vars_eNb->lte_frame_parms.nb_antennas_tx>1)
|
if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)
|
||||||
write_output("txsigF1.m","txsF1", PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
|
|
||||||
tx_lev = 0;
|
tx_lev = 0;
|
||||||
tx_lev1 = 0;
|
tx_lev1 = 0;
|
||||||
@@ -620,16 +547,16 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_tx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
|
||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][aa], // input,
|
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa], // input,
|
||||||
txdata[aa], // output
|
txdata[aa], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size,
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
else {
|
else {
|
||||||
normal_prefix_mod(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][aa],
|
normal_prefix_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa],
|
||||||
txdata[aa],
|
txdata[aa],
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb,
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb,
|
||||||
frame_parms);
|
frame_parms);
|
||||||
@@ -648,7 +575,7 @@ int main(int argc, char **argv)
|
|||||||
// multipath channel
|
// multipath channel
|
||||||
|
|
||||||
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
||||||
for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_tx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
|
||||||
s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
||||||
s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
|
s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
|
||||||
}
|
}
|
||||||
@@ -667,7 +594,7 @@ int main(int argc, char **argv)
|
|||||||
multipath_channel(eNB2UE,s_re,s_im,r_re,r_im,
|
multipath_channel(eNB2UE,s_re,s_im,r_re,r_im,
|
||||||
2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0);
|
2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0);
|
||||||
|
|
||||||
sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNb->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR;
|
sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR;
|
||||||
|
|
||||||
if (n_frames==1)
|
if (n_frames==1)
|
||||||
printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,%f,%f\n",sigma2_dB,SNR,
|
printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,%f,%f\n",sigma2_dB,SNR,
|
||||||
@@ -689,7 +616,7 @@ int main(int argc, char **argv)
|
|||||||
for (n_trials=0; n_trials<ntrials; n_trials++) {
|
for (n_trials=0; n_trials<ntrials; n_trials++) {
|
||||||
//printf("n_trial %d\n",n_trials);
|
//printf("n_trial %d\n",n_trials);
|
||||||
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
|
||||||
for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_rx; aa++) {
|
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
|
||||||
((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||||
((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1189,7 +1189,7 @@ int main(int argc, char **argv)
|
|||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(txdataF2[aa], // input
|
PHY_ofdm_mod(txdataF2[aa], // input
|
||||||
txdata[aa], // output
|
txdata[aa], // output
|
||||||
PHY_vars_eNB->lte_frame_parms.log2_symbol_size, // log2_fft_size
|
PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size, // log2_fft_size
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||||
PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
||||||
PHY_vars_eNB->lte_frame_parms.twiddle_ifft, // IFFT twiddle factors
|
PHY_vars_eNB->lte_frame_parms.twiddle_ifft, // IFFT twiddle factors
|
||||||
@@ -1218,7 +1218,7 @@ int main(int argc, char **argv)
|
|||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa], // input,
|
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa], // input,
|
||||||
txdata[aa], // output
|
txdata[aa], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size, // log2_fft_size
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
||||||
@@ -1240,7 +1240,7 @@ int main(int argc, char **argv)
|
|||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[eNb_id][aa], // input,
|
PHY_ofdm_mod(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[eNb_id][aa], // input,
|
||||||
PHY_vars_eNB1->lte_eNB_common_vars.txdata[eNb_id][aa], // output
|
PHY_vars_eNB1->lte_eNB_common_vars.txdata[eNb_id][aa], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size, // log2_fft_size
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
||||||
@@ -1260,7 +1260,7 @@ int main(int argc, char **argv)
|
|||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[eNb_id][aa], // input,
|
PHY_ofdm_mod(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[eNb_id][aa], // input,
|
||||||
PHY_vars_eNB2->lte_eNB_common_vars.txdata[eNb_id][aa], // output
|
PHY_vars_eNB2->lte_eNB_common_vars.txdata[eNb_id][aa], // output
|
||||||
frame_parms->log2_symbol_size, // log2_fft_size
|
frame_parms->ofdm_symbol_size, // log2_fft_size
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||||
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
||||||
|
|||||||
@@ -52,9 +52,7 @@
|
|||||||
#include "LAYER2/MAC/vars.h"
|
#include "LAYER2/MAC/vars.h"
|
||||||
#include "OCG_vars.h"
|
#include "OCG_vars.h"
|
||||||
|
|
||||||
#ifdef XFORMS
|
|
||||||
#include "PHY/TOOLS/lte_phy_scope.h"
|
#include "PHY/TOOLS/lte_phy_scope.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
extern unsigned short dftsizes[33];
|
extern unsigned short dftsizes[33];
|
||||||
extern short *ul_ref_sigs[30][2][33];
|
extern short *ul_ref_sigs[30][2][33];
|
||||||
@@ -74,12 +72,9 @@ node_desc_t *ue_data[NUMBER_OF_UE_MAX];
|
|||||||
extern uint16_t beta_ack[16],beta_ri[16],beta_cqi[16];
|
extern uint16_t beta_ack[16],beta_ri[16],beta_cqi[16];
|
||||||
//extern char* namepointer_chMag ;
|
//extern char* namepointer_chMag ;
|
||||||
|
|
||||||
|
int xforms=0;
|
||||||
|
|
||||||
#ifdef XFORMS
|
|
||||||
FD_lte_phy_scope_enb *form_enb;
|
FD_lte_phy_scope_enb *form_enb;
|
||||||
char title[255];
|
char title[255];
|
||||||
#endif
|
|
||||||
|
|
||||||
/*the following parameters are used to control the processing times*/
|
/*the following parameters are used to control the processing times*/
|
||||||
double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */
|
double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */
|
||||||
@@ -89,60 +84,6 @@ double t_rx_min = 1000000000; /*!< \brief initial min process time for tx */
|
|||||||
int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
|
int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
|
||||||
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
|
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
|
||||||
|
|
||||||
void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,uint8_t extended_prefix_flag,uint8_t N_RB_DL,uint8_t frame_type,uint8_t tdd_config,uint8_t osf)
|
|
||||||
{
|
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
|
||||||
|
|
||||||
printf("Start lte_param_init\n");
|
|
||||||
PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
|
|
||||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
|
||||||
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
|
||||||
mac_xface = malloc(sizeof(MAC_xface));
|
|
||||||
|
|
||||||
randominit(0);
|
|
||||||
set_taus_seed(0);
|
|
||||||
|
|
||||||
lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms);
|
|
||||||
|
|
||||||
lte_frame_parms->frame_type = frame_type;
|
|
||||||
lte_frame_parms->tdd_config = tdd_config;
|
|
||||||
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
|
||||||
lte_frame_parms->N_RB_UL = N_RB_DL;
|
|
||||||
lte_frame_parms->Ncp = extended_prefix_flag;
|
|
||||||
lte_frame_parms->Ncp_UL = extended_prefix_flag;
|
|
||||||
lte_frame_parms->Nid_cell = 10;
|
|
||||||
lte_frame_parms->nushift = 0;
|
|
||||||
lte_frame_parms->nb_antennas_tx = N_tx;
|
|
||||||
lte_frame_parms->nb_antennas_rx = N_rx;
|
|
||||||
// lte_frame_parms->Csrs = 2;
|
|
||||||
// lte_frame_parms->Bsrs = 0;
|
|
||||||
// lte_frame_parms->kTC = 0;
|
|
||||||
// lte_frame_parms->n_RRC = 0;
|
|
||||||
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
|
||||||
lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0
|
|
||||||
|
|
||||||
init_frame_parms(lte_frame_parms,osf);
|
|
||||||
|
|
||||||
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
|
||||||
|
|
||||||
|
|
||||||
PHY_vars_UE->lte_frame_parms = *lte_frame_parms;
|
|
||||||
|
|
||||||
phy_init_lte_top(lte_frame_parms);
|
|
||||||
|
|
||||||
phy_init_lte_ue(PHY_vars_UE,1,0);
|
|
||||||
|
|
||||||
phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
|
|
||||||
|
|
||||||
printf("Done lte_param_init\n");
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -151,7 +92,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
int aarx,aatx;
|
int aarx,aatx;
|
||||||
double channelx,channely;
|
double channelx,channely;
|
||||||
double sigma2, sigma2_dB=10,SNR,SNR2,snr0=-2.0,snr1,SNRmeas,rate,saving_bler;
|
double sigma2, sigma2_dB=10,SNR,SNR2,snr0=-2.0,snr1,SNRmeas,rate,saving_bler=0;
|
||||||
double input_snr_step=.2,snr_int=30;
|
double input_snr_step=.2,snr_int=30;
|
||||||
double blerr;
|
double blerr;
|
||||||
|
|
||||||
@@ -180,7 +121,7 @@ int main(int argc, char **argv)
|
|||||||
unsigned int coded_bits_per_codeword,nsymb;
|
unsigned int coded_bits_per_codeword,nsymb;
|
||||||
int subframe=3;
|
int subframe=3;
|
||||||
unsigned int tx_lev=0,tx_lev_dB,trials,errs[4]= {0,0,0,0},round_trials[4]= {0,0,0,0};
|
unsigned int tx_lev=0,tx_lev_dB,trials,errs[4]= {0,0,0,0},round_trials[4]= {0,0,0,0};
|
||||||
uint8_t transmission_mode=1,n_rx=1,n_tx=1;
|
uint8_t transmission_mode=1,n_rx=1;
|
||||||
|
|
||||||
FILE *bler_fd=NULL;
|
FILE *bler_fd=NULL;
|
||||||
char bler_fname[512];
|
char bler_fname[512];
|
||||||
@@ -248,6 +189,7 @@ int main(int argc, char **argv)
|
|||||||
int nb_rb_set = 0;
|
int nb_rb_set = 0;
|
||||||
int sf;
|
int sf;
|
||||||
|
|
||||||
|
int threequarter_fs=0;
|
||||||
opp_enabled=1; // to enable the time meas
|
opp_enabled=1; // to enable the time meas
|
||||||
|
|
||||||
cpu_freq_GHz = (double)get_cpu_freq_GHz();
|
cpu_freq_GHz = (double)get_cpu_freq_GHz();
|
||||||
@@ -257,7 +199,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
logInit();
|
logInit();
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "hapZbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) {
|
while ((c = getopt (argc, argv, "hapZEbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:LF")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'a':
|
case 'a':
|
||||||
channel_model = AWGN;
|
channel_model = AWGN;
|
||||||
@@ -395,10 +337,6 @@ int main(int argc, char **argv)
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transmission_mode>1) {
|
|
||||||
n_tx = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'y':
|
case 'y':
|
||||||
@@ -431,6 +369,10 @@ int main(int argc, char **argv)
|
|||||||
cyclic_shift = atoi(optarg);
|
cyclic_shift = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'E':
|
||||||
|
threequarter_fs=1;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'N':
|
case 'N':
|
||||||
N0 = atoi(optarg);
|
N0 = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
@@ -507,6 +449,10 @@ int main(int argc, char **argv)
|
|||||||
max_turbo_iterations=atoi(optarg);
|
max_turbo_iterations=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'F':
|
||||||
|
xforms=1;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'Z':
|
case 'Z':
|
||||||
dump_table = 1;
|
dump_table = 1;
|
||||||
break;
|
break;
|
||||||
@@ -520,7 +466,17 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lte_param_init(1,n_rx,1,extended_prefix_flag,N_RB_DL,frame_type,tdd_config,osf);
|
lte_param_init(1,
|
||||||
|
n_rx,
|
||||||
|
1,
|
||||||
|
extended_prefix_flag,
|
||||||
|
frame_type,
|
||||||
|
0,
|
||||||
|
tdd_config,
|
||||||
|
N_RB_DL,
|
||||||
|
threequarter_fs,
|
||||||
|
osf,
|
||||||
|
0);
|
||||||
|
|
||||||
if (nb_rb_set == 0)
|
if (nb_rb_set == 0)
|
||||||
nb_rb = PHY_vars_eNB->lte_frame_parms.N_RB_UL;
|
nb_rb = PHY_vars_eNB->lte_frame_parms.N_RB_UL;
|
||||||
@@ -564,6 +520,10 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
sprintf(bler_fname,"ULbler_mcs%d_nrb%d_ChannelModel%d_nsim%d.csv",mcs,nb_rb,chMod,n_frames);
|
sprintf(bler_fname,"ULbler_mcs%d_nrb%d_ChannelModel%d_nsim%d.csv",mcs,nb_rb,chMod,n_frames);
|
||||||
bler_fd = fopen(bler_fname,"w");
|
bler_fd = fopen(bler_fname,"w");
|
||||||
|
if (bler_fd==NULL) {
|
||||||
|
fprintf(stderr,"Problem creating file %s\n",bler_fname);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(bler_fd,"#SNR;mcs;nb_rb;TBS;rate;errors[0];trials[0];errors[1];trials[1];errors[2];trials[2];errors[3];trials[3]\n");
|
fprintf(bler_fd,"#SNR;mcs;nb_rb;TBS;rate;errors[0];trials[0];errors[1];trials[1];errors[2];trials[2];errors[3];trials[3]\n");
|
||||||
|
|
||||||
@@ -572,13 +532,16 @@ int main(int argc, char **argv)
|
|||||||
hostname[1023] = '\0';
|
hostname[1023] = '\0';
|
||||||
gethostname(hostname, 1023);
|
gethostname(hostname, 1023);
|
||||||
printf("Hostname: %s\n", hostname);
|
printf("Hostname: %s\n", hostname);
|
||||||
char dirname[FILENAME_MAX];
|
//char dirname[FILENAME_MAX];
|
||||||
sprintf(dirname, "%s//SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname);
|
//sprintf(dirname, "%s//SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname);
|
||||||
mkdir(dirname, 0777);
|
//mkdir(dirname, 0777);
|
||||||
sprintf(time_meas_fname,"%s/time_meas_prb%d_mcs%d_antrx%d_channel%s_tx%d.csv",
|
sprintf(time_meas_fname,"time_meas_prb%d_mcs%d_antrx%d_channel%s_tx%d.csv",
|
||||||
dirname,
|
|
||||||
N_RB_DL,mcs,n_rx,channel_model_input,transmission_mode);
|
N_RB_DL,mcs,n_rx,channel_model_input,transmission_mode);
|
||||||
time_meas_fd = fopen(time_meas_fname,"w");
|
time_meas_fd = fopen(time_meas_fname,"w");
|
||||||
|
if (time_meas_fd==NULL) {
|
||||||
|
fprintf(stderr,"Cannot create file %s!\n",time_meas_fname);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -630,12 +593,12 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef XFORMS
|
if (xforms==1) {
|
||||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||||
form_enb = create_lte_phy_scope_enb();
|
form_enb = create_lte_phy_scope_enb();
|
||||||
sprintf (title, "LTE PHY SCOPE eNB");
|
sprintf (title, "LTE PHY SCOPE eNB");
|
||||||
fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
||||||
#endif
|
}
|
||||||
|
|
||||||
PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = 14;
|
PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = 14;
|
||||||
|
|
||||||
@@ -683,8 +646,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// Create transport channel structures for 2 transport blocks (MIMO)
|
// Create transport channel structures for 2 transport blocks (MIMO)
|
||||||
for (i=0; i<2; i++) {
|
for (i=0; i<2; i++) {
|
||||||
PHY_vars_eNB->dlsch_eNB[0][i] = new_eNB_dlsch(1,8,N_RB_DL,0);
|
PHY_vars_eNB->dlsch_eNB[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0);
|
||||||
PHY_vars_UE->dlsch_ue[0][i] = new_ue_dlsch(1,8,MAX_TURBO_ITERATIONS,N_RB_DL,0);
|
PHY_vars_UE->dlsch_ue[0][i] = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
|
||||||
|
|
||||||
if (!PHY_vars_eNB->dlsch_eNB[0][i]) {
|
if (!PHY_vars_eNB->dlsch_eNB[0][i]) {
|
||||||
printf("Can't get eNB dlsch structures\n");
|
printf("Can't get eNB dlsch structures\n");
|
||||||
@@ -699,7 +662,7 @@ int main(int argc, char **argv)
|
|||||||
PHY_vars_eNB->dlsch_eNB[0][i]->rnti = 14;
|
PHY_vars_eNB->dlsch_eNB[0][i]->rnti = 14;
|
||||||
PHY_vars_UE->dlsch_ue[0][i]->rnti = 14;
|
PHY_vars_UE->dlsch_ue[0][i]->rnti = 14;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (PHY_vars_eNB->lte_frame_parms.N_RB_UL) {
|
switch (PHY_vars_eNB->lte_frame_parms.N_RB_UL) {
|
||||||
@@ -887,11 +850,11 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
harq_pid = subframe2harq_pid(&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->frame_tx,subframe);
|
harq_pid = subframe2harq_pid(&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->frame_tx,subframe);
|
||||||
|
input_buffer_length = PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/8;
|
||||||
|
input_buffer = (unsigned char *)malloc(input_buffer_length+4);
|
||||||
// printf("UL frame %d/subframe %d, harq_pid %d\n",PHY_vars_UE->frame,subframe,harq_pid);
|
// printf("UL frame %d/subframe %d, harq_pid %d\n",PHY_vars_UE->frame,subframe,harq_pid);
|
||||||
if (input_fdUL == NULL) {
|
if (input_fdUL == NULL) {
|
||||||
input_buffer_length = PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/8;
|
|
||||||
input_buffer = (unsigned char *)malloc(input_buffer_length+4);
|
|
||||||
|
|
||||||
if (n_frames == 1) {
|
if (n_frames == 1) {
|
||||||
trch_out_fdUL= fopen("ulsch_trchUL.txt","w");
|
trch_out_fdUL= fopen("ulsch_trchUL.txt","w");
|
||||||
@@ -913,7 +876,7 @@ int main(int argc, char **argv)
|
|||||||
i=0;
|
i=0;
|
||||||
|
|
||||||
while (!feof(input_fdUL)) {
|
while (!feof(input_fdUL)) {
|
||||||
fscanf(input_fdUL,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2);
|
ret=fscanf(input_fdUL,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2);
|
||||||
|
|
||||||
if ((i%4)==0) {
|
if ((i%4)==0) {
|
||||||
((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL));
|
((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL));
|
||||||
@@ -1102,7 +1065,7 @@ int main(int argc, char **argv)
|
|||||||
if (frame_parms->Ncp == 1)
|
if (frame_parms->Ncp == 1)
|
||||||
PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input
|
PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input
|
||||||
&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], // output
|
&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], // output
|
||||||
PHY_vars_UE->lte_frame_parms.log2_symbol_size, // log2_fft_size
|
PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,
|
||||||
nsymb, // number of symbols
|
nsymb, // number of symbols
|
||||||
PHY_vars_UE->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
PHY_vars_UE->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
@@ -1243,6 +1206,7 @@ int main(int argc, char **argv)
|
|||||||
start_meas(&PHY_vars_eNB->phy_proc_rx);
|
start_meas(&PHY_vars_eNB->phy_proc_rx);
|
||||||
start_meas(&PHY_vars_eNB->ofdm_demod_stats);
|
start_meas(&PHY_vars_eNB->ofdm_demod_stats);
|
||||||
lte_eNB_I0_measurements(PHY_vars_eNB,
|
lte_eNB_I0_measurements(PHY_vars_eNB,
|
||||||
|
subframe,
|
||||||
0,
|
0,
|
||||||
1);
|
1);
|
||||||
|
|
||||||
@@ -1389,9 +1353,9 @@ int main(int argc, char **argv)
|
|||||||
if ((errs[0]>=100) && (trials>(n_frames/2)))
|
if ((errs[0]>=100) && (trials>(n_frames/2)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef XFORMS
|
if (xforms==1)
|
||||||
phy_scope_eNB(form_enb,PHY_vars_eNB,0);
|
phy_scope_eNB(form_enb,PHY_vars_eNB,0);
|
||||||
#endif
|
|
||||||
/*calculate the total processing time for each packet, get the max, min, and number of packets that exceed t>3000us*/
|
/*calculate the total processing time for each packet, get the max, min, and number of packets that exceed t>3000us*/
|
||||||
|
|
||||||
double t_tx = (double)PHY_vars_UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0;
|
double t_tx = (double)PHY_vars_UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ double **cos_lut=NULL,**sin_lut=NULL;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
int init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -54,15 +54,17 @@ void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
|||||||
int16_t f;
|
int16_t f;
|
||||||
uint8_t l;
|
uint8_t l;
|
||||||
|
|
||||||
|
if ((n_samples&1)==0) {
|
||||||
|
fprintf(stderr, "freq_channel_init: n_samples has to be odd\n");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
cos_lut = (double **)malloc(n_samples*sizeof(double*));
|
cos_lut = (double **)malloc(n_samples*sizeof(double*));
|
||||||
sin_lut = (double **)malloc(n_samples*sizeof(double*));
|
sin_lut = (double **)malloc(n_samples*sizeof(double*));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
delta_f = nb_rb*180000/(n_samples-1);
|
delta_f = nb_rb*180000/(n_samples-1);
|
||||||
|
|
||||||
for (f=-(n_samples>>1); f<(n_samples>>1); f++) {
|
for (f=-(n_samples>>1); f<=(n_samples>>1); f++) {
|
||||||
freq=delta_f*(double)f*1e-6;// due to the fact that delays is in mus
|
freq=delta_f*(double)f*1e-6;// due to the fact that delays is in mus
|
||||||
|
|
||||||
cos_lut[f+(n_samples>>1)] = (double *)malloc((int)desc->nb_taps*sizeof(double));
|
cos_lut[f+(n_samples>>1)] = (double *)malloc((int)desc->nb_taps*sizeof(double));
|
||||||
@@ -81,9 +83,11 @@ void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -93,22 +97,32 @@ void freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
|||||||
static int freq_channel_init=0;
|
static int freq_channel_init=0;
|
||||||
static int n_samples_max=0;
|
static int n_samples_max=0;
|
||||||
|
|
||||||
// printf("no of samples:%d,",n_samples);
|
// do some error checking
|
||||||
|
// n_samples has to be a odd number because we assume the spectrum is symmetric around the DC and includes the DC
|
||||||
|
if ((n_samples&1)==0) {
|
||||||
|
fprintf(stderr, "freq_channel: n_samples has to be odd\n");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
// printf("no of taps:%d,",(int)desc->nb_taps);
|
// printf("no of taps:%d,",(int)desc->nb_taps);
|
||||||
|
|
||||||
if (freq_channel_init == 0) {
|
if (freq_channel_init == 0) {
|
||||||
// we are initializing the lut for the largets possible n_samples=12*nb_rb+1
|
// we are initializing the lut for the largets possible n_samples=12*nb_rb+1
|
||||||
// if called with n_samples<12*nb_rb+1, we decimate the lut
|
// if called with n_samples<12*nb_rb+1, we decimate the lut
|
||||||
n_samples_max=12*nb_rb+1;
|
n_samples_max=12*nb_rb+1;
|
||||||
init_freq_channel(desc,nb_rb,n_samples_max);
|
if (init_freq_channel(desc,nb_rb,n_samples_max)==0)
|
||||||
freq_channel_init=1;
|
freq_channel_init=1;
|
||||||
|
else
|
||||||
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
d=n_samples_max/n_samples;
|
d=(n_samples_max-1)/(n_samples-1);
|
||||||
|
|
||||||
|
//printf("no_samples=%d, n_samples_max=%d, d=%d\n",n_samples,n_samples_max,d);
|
||||||
|
|
||||||
start_meas(&desc->interp_freq);
|
start_meas(&desc->interp_freq);
|
||||||
|
|
||||||
for (f=-n_samples_max/2,f2=-n_samples/2; f<n_samples_max/2; f+=d,f2++) {
|
for (f=-n_samples_max/2,f2=-n_samples/2; f<=n_samples_max/2; f+=d,f2++) {
|
||||||
clut = cos_lut[n_samples_max/2+f];
|
clut = cos_lut[n_samples_max/2+f];
|
||||||
slut = sin_lut[n_samples_max/2+f];
|
slut = sin_lut[n_samples_max/2+f];
|
||||||
|
|
||||||
@@ -129,6 +143,8 @@ void freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&desc->interp_freq);
|
stop_meas(&desc->interp_freq);
|
||||||
|
|
||||||
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
double compute_pbch_sinr(channel_desc_t *desc,
|
double compute_pbch_sinr(channel_desc_t *desc,
|
||||||
|
|||||||
@@ -354,8 +354,8 @@ int gauss(unsigned int *gauss_LUT,unsigned char Nbits);
|
|||||||
double gaussdouble(double,double);
|
double gaussdouble(double,double);
|
||||||
void randominit(unsigned int seed_init);
|
void randominit(unsigned int seed_init);
|
||||||
double uniformrandom(void);
|
double uniformrandom(void);
|
||||||
void freq_channel(channel_desc_t *desc,uint16_t nb_rb, int16_t n_samples);
|
int freq_channel(channel_desc_t *desc,uint16_t nb_rb, int16_t n_samples);
|
||||||
void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples);
|
int init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples);
|
||||||
uint8_t multipath_channel_nosigconv(channel_desc_t *desc);
|
uint8_t multipath_channel_nosigconv(channel_desc_t *desc);
|
||||||
void multipath_tv_channel(channel_desc_t *desc,
|
void multipath_tv_channel(channel_desc_t *desc,
|
||||||
double **tx_sig_re,
|
double **tx_sig_re,
|
||||||
|
|||||||
@@ -48,7 +48,19 @@ Description Contains global common definitions
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
typedef signed char boolean_t;
|
||||||
|
|
||||||
|
#if !defined(TRUE)
|
||||||
|
#define TRUE (boolean_t)0x01
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(FALSE)
|
||||||
|
#define FALSE (boolean_t)0x00
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BOOL_NOT(b) (b^TRUE)
|
||||||
|
|
||||||
#define NAS_UE_ID_FMT "0x%06x"
|
#define NAS_UE_ID_FMT "0x%06x"
|
||||||
|
|
||||||
@@ -59,13 +71,6 @@ Description Contains global common definitions
|
|||||||
#define RETURNok (0)
|
#define RETURNok (0)
|
||||||
#define RETURNerror (-1)
|
#define RETURNerror (-1)
|
||||||
|
|
||||||
#ifndef FALSE
|
|
||||||
#define FALSE (0)
|
|
||||||
#endif
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE (1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name of the environment variable which defines the default directory
|
* Name of the environment variable which defines the default directory
|
||||||
* where the NAS application is executed and where are located files
|
* where the NAS application is executed and where are located files
|
||||||
|
|||||||
@@ -163,7 +163,13 @@ typedef uint32_t mbms_session_id_t;
|
|||||||
typedef uint16_t mbms_service_id_t;
|
typedef uint16_t mbms_service_id_t;
|
||||||
typedef uint16_t rnti_t;
|
typedef uint16_t rnti_t;
|
||||||
typedef uint8_t rrc_enb_index_t;
|
typedef uint8_t rrc_enb_index_t;
|
||||||
|
typedef uint8_t mme_code_t;
|
||||||
|
typedef uint32_t m_tmsi_t;
|
||||||
|
|
||||||
|
//Random UE identity length = 40 bits
|
||||||
|
#if ! defined(NOT_A_RANDOM_UE_IDENTITY)
|
||||||
|
#define NOT_A_RANDOM_UE_IDENTITY (uint64_t)0xFFFFFFFF
|
||||||
|
#endif
|
||||||
#if ! defined(NOT_A_RNTI)
|
#if ! defined(NOT_A_RNTI)
|
||||||
#define NOT_A_RNTI (rnti_t)0
|
#define NOT_A_RNTI (rnti_t)0
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ typedef struct net_ip_address_s {
|
|||||||
unsigned ipv4:1;
|
unsigned ipv4:1;
|
||||||
unsigned ipv6:1;
|
unsigned ipv6:1;
|
||||||
char ipv4_address[16];
|
char ipv4_address[16];
|
||||||
char ipv6_address[40];
|
char ipv6_address[46];
|
||||||
} net_ip_address_t;
|
} net_ip_address_t;
|
||||||
|
|
||||||
typedef uint64_t bitrate_t;
|
typedef uint64_t bitrate_t;
|
||||||
|
|||||||
@@ -170,6 +170,18 @@
|
|||||||
#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U"
|
#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U"
|
||||||
#define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U"
|
#define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U"
|
||||||
|
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_CONFIG "rrh_gw_config"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_LOCAL_IF_NAME "local_if_name"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_LOCAL_ADDRESS "local_address"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_REMOTE_ADDRESS "remote_address"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT "local_port"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT "remote_port"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_ACTIVE "rrh_gw_active"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE "tr_preference"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE "rf_preference"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT "iq_txshift"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_TX_SAMPLE_ADVANCE "tx_sample_advance"
|
||||||
|
#define ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE "tx_scheduling_advance"
|
||||||
|
|
||||||
#define ENB_CONFIG_STRING_ASN1_VERBOSITY "Asn1_verbosity"
|
#define ENB_CONFIG_STRING_ASN1_VERBOSITY "Asn1_verbosity"
|
||||||
#define ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE "none"
|
#define ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE "none"
|
||||||
@@ -253,7 +265,7 @@ static const eutra_band_t eutra_bands[] = {
|
|||||||
|
|
||||||
Enb_properties_array_t enb_properties;
|
Enb_properties_array_t enb_properties;
|
||||||
|
|
||||||
static void enb_config_display(void)
|
void enb_config_display(void)
|
||||||
{
|
{
|
||||||
int i,j;
|
int i,j;
|
||||||
|
|
||||||
@@ -274,6 +286,34 @@ static void enb_config_display(void)
|
|||||||
} else {
|
} else {
|
||||||
printf( "\tMNC: \t%02"PRIu16":\n",enb_properties.properties[i]->mnc);
|
printf( "\tMNC: \t%02"PRIu16":\n",enb_properties.properties[i]->mnc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (j=0; j< enb_properties.properties[i]->nb_rrh_gw; j++) {
|
||||||
|
if (enb_properties.properties[i]->rrh_gw_config[j].active == 1 ){
|
||||||
|
printf( "\n\tRRH GW %d config for eNB %u:\n\n", j, i);
|
||||||
|
printf( "\tinterface name : \t%s:\n",enb_properties.properties[i]->rrh_gw_if_name);
|
||||||
|
printf( "\tlocal address : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].local_address);
|
||||||
|
printf( "\tlocal port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].local_port);
|
||||||
|
printf( "\tremote address : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_address);
|
||||||
|
printf( "\tremote port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_port);
|
||||||
|
printf( "\ttx_scheduling_advance :\t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_scheduling_advance);
|
||||||
|
printf( "\ttx_sample_advance : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_sample_advance);
|
||||||
|
printf( "\tiq_txshift : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].iq_txshift);
|
||||||
|
printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : "UDP");
|
||||||
|
if (enb_properties.properties[i]->rrh_gw_config[j].exmimo == 1) {
|
||||||
|
printf( "\tRF target : \tEXMIMO:\n\n");
|
||||||
|
} else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_b200 == 1) {
|
||||||
|
printf( "\tRF target : \tUSRP_B200:\n\n");
|
||||||
|
} else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_x300 == 1) {
|
||||||
|
printf( "\tRF target : \tUSRP_X300:\n\n");
|
||||||
|
} else if (enb_properties.properties[i]->rrh_gw_config[j].bladerf == 1) {
|
||||||
|
printf( "\tRF target : \tBLADERF:\n\n");
|
||||||
|
} else if (enb_properties.properties[i]->rrh_gw_config[j].lmssdr == 1) {
|
||||||
|
printf( "\tRF target : \tLMSSDR:\n\n");
|
||||||
|
} else {
|
||||||
|
printf( "\tRF target : \tNONE:\n\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (j=0; j< enb_properties.properties[i]->nb_cc; j++) {
|
for (j=0; j< enb_properties.properties[i]->nb_cc; j++) {
|
||||||
printf( "\teutra band for CC %d: \t%"PRId16":\n",j,enb_properties.properties[i]->eutra_band[j]);
|
printf( "\teutra band for CC %d: \t%"PRId16":\n",j,enb_properties.properties[i]->eutra_band[j]);
|
||||||
@@ -455,15 +495,18 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
|
|||||||
config_setting_t *setting_srb1 = NULL;
|
config_setting_t *setting_srb1 = NULL;
|
||||||
config_setting_t *setting_mme_addresses = NULL;
|
config_setting_t *setting_mme_addresses = NULL;
|
||||||
config_setting_t *setting_mme_address = NULL;
|
config_setting_t *setting_mme_address = NULL;
|
||||||
|
config_setting_t *setting_rrh_gws = NULL;
|
||||||
|
config_setting_t *setting_rrh_gw = NULL;
|
||||||
config_setting_t *setting_enb = NULL;
|
config_setting_t *setting_enb = NULL;
|
||||||
config_setting_t *setting_otg = NULL;
|
config_setting_t *setting_otg = NULL;
|
||||||
config_setting_t *subsetting_otg = NULL;
|
config_setting_t *subsetting_otg = NULL;
|
||||||
int num_enb_properties = 0;
|
int num_enb_properties = 0;
|
||||||
int enb_properties_index = 0;
|
int enb_properties_index = 0;
|
||||||
int num_enbs = 0;
|
int num_enbs = 0;
|
||||||
int num_mme_address = 0;
|
int num_mme_address = 0;
|
||||||
int num_otg_elements =0;
|
int num_rrh_gw = 0;
|
||||||
int num_component_carriers =0;
|
int num_otg_elements = 0;
|
||||||
|
int num_component_carriers = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int j = 0;
|
int j = 0;
|
||||||
int parse_errors = 0;
|
int parse_errors = 0;
|
||||||
@@ -558,10 +601,21 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
|
|||||||
|
|
||||||
libconfig_int my_int;
|
libconfig_int my_int;
|
||||||
|
|
||||||
|
|
||||||
|
char* if_name = NULL;
|
||||||
char* ipv4 = NULL;
|
char* ipv4 = NULL;
|
||||||
|
char* ipv4_remote = NULL;
|
||||||
char* ipv6 = NULL;
|
char* ipv6 = NULL;
|
||||||
char* active = NULL;
|
char* active = NULL;
|
||||||
char* preference = NULL;
|
char* preference = NULL;
|
||||||
|
|
||||||
|
char* tr_preference = NULL;
|
||||||
|
char* rf_preference = NULL;
|
||||||
|
libconfig_int tx_scheduling_advance = 0;
|
||||||
|
libconfig_int tx_sample_advance = 0;
|
||||||
|
libconfig_int iq_txshift = 0;
|
||||||
|
libconfig_int local_port = 0;
|
||||||
|
libconfig_int remote_port = 0;
|
||||||
const char* active_enb[MAX_ENB];
|
const char* active_enb[MAX_ENB];
|
||||||
char* enb_interface_name_for_S1U = NULL;
|
char* enb_interface_name_for_S1U = NULL;
|
||||||
char* enb_ipv4_address_for_S1U = NULL;
|
char* enb_ipv4_address_for_S1U = NULL;
|
||||||
@@ -965,7 +1019,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
|
|||||||
|
|
||||||
enb_properties.properties[enb_properties_index]->prach_zero_correlation[j] =prach_zero_correlation;
|
enb_properties.properties[enb_properties_index]->prach_zero_correlation[j] =prach_zero_correlation;
|
||||||
|
|
||||||
if ((prach_zero_correlation <0) || (prach_zero_correlation > 63))
|
if ((prach_zero_correlation <0) || (prach_zero_correlation > 15))
|
||||||
AssertError (0, parse_errors ++,
|
AssertError (0, parse_errors ++,
|
||||||
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n",
|
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n",
|
||||||
lib_config_file_name_pP, i, prach_zero_correlation);
|
lib_config_file_name_pP, i, prach_zero_correlation);
|
||||||
@@ -2136,6 +2190,97 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
|
|||||||
enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1;
|
enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// RRH Config
|
||||||
|
setting_rrh_gws = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_RRH_GW_CONFIG);
|
||||||
|
if ( setting_rrh_gws != NULL) {
|
||||||
|
num_rrh_gw = config_setting_length(setting_rrh_gws);
|
||||||
|
enb_properties.properties[enb_properties_index]->nb_rrh_gw = 0;
|
||||||
|
|
||||||
|
for (j = 0; j < num_rrh_gw; j++) {
|
||||||
|
setting_rrh_gw = config_setting_get_elem(setting_rrh_gws, j);
|
||||||
|
|
||||||
|
if ( !(
|
||||||
|
config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_LOCAL_IF_NAME, (const char **)&if_name)
|
||||||
|
&& config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_LOCAL_ADDRESS, (const char **)&ipv4)
|
||||||
|
&& config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_REMOTE_ADDRESS , (const char **)&ipv4_remote)
|
||||||
|
&& config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT, &local_port)
|
||||||
|
&& config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT, &remote_port)
|
||||||
|
&& config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_ACTIVE, (const char **)&active)
|
||||||
|
&& config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE, (const char **)&tr_preference)
|
||||||
|
&& config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE, (const char **)&rf_preference)
|
||||||
|
&& config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT, &iq_txshift)
|
||||||
|
&& config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SAMPLE_ADVANCE, &tx_sample_advance)
|
||||||
|
&& config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE, &tx_scheduling_advance)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
AssertError (0, parse_errors ++,
|
||||||
|
"Failed to parse eNB configuration file %s, %u th enb %u the RRH GW address !\n",
|
||||||
|
lib_config_file_name_pP, i, j);
|
||||||
|
continue; // FIXME will prevent segfaults below, not sure what happens at function exit...
|
||||||
|
}
|
||||||
|
|
||||||
|
enb_properties.properties[enb_properties_index]->nb_rrh_gw += 1;
|
||||||
|
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_if_name = strdup(if_name);
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_address = strdup(ipv4);
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_address = strdup(ipv4_remote);
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port = local_port;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_port = remote_port;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].iq_txshift = iq_txshift;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_sample_advance = tx_sample_advance;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_scheduling_advance= tx_scheduling_advance;
|
||||||
|
|
||||||
|
if (strcmp(active, "yes") == 0) {
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].active = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(tr_preference, "udp") == 0) {
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1;
|
||||||
|
} else if (strcmp(tr_preference, "raw") == 0) {
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1;
|
||||||
|
} else {//if (strcmp(preference, "no") == 0)
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(rf_preference, "exmimo") == 0) {
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 1;
|
||||||
|
} else if (strcmp(rf_preference, "usrp_b200") == 0) {
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 1;
|
||||||
|
} else if (strcmp(rf_preference, "usrp_x300") == 0) {
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 1;
|
||||||
|
} else if (strcmp(rf_preference, "bladerf") == 0) {
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 1;
|
||||||
|
} else if (strcmp(rf_preference, "bladerf") == 0) {
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 1;
|
||||||
|
} else {//if (strcmp(preference, "no") == 0)
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 1;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 1;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 1;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 1;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
enb_properties.properties[enb_properties_index]->nb_rrh_gw = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_if_name = "none";
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_address = "0.0.0.0";
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_address = "0.0.0.0";
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port= 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_port= 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].active = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_scheduling_advance = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_sample_advance = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].iq_txshift = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 0;
|
||||||
|
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// SCTP SETTING
|
// SCTP SETTING
|
||||||
enb_properties.properties[enb_properties_index]->sctp_out_streams = SCTP_OUT_STREAMS;
|
enb_properties.properties[enb_properties_index]->sctp_out_streams = SCTP_OUT_STREAMS;
|
||||||
|
|||||||
@@ -78,6 +78,24 @@ typedef struct mme_ip_address_s {
|
|||||||
char *ipv6_address;
|
char *ipv6_address;
|
||||||
} mme_ip_address_t;
|
} mme_ip_address_t;
|
||||||
|
|
||||||
|
typedef struct rrh_gw_config_s {
|
||||||
|
unsigned udp:1;
|
||||||
|
unsigned raw:1;
|
||||||
|
unsigned active:1;
|
||||||
|
char *local_address;
|
||||||
|
char *remote_address;
|
||||||
|
uint16_t local_port;
|
||||||
|
uint16_t remote_port;
|
||||||
|
int tx_scheduling_advance;
|
||||||
|
int tx_sample_advance;
|
||||||
|
int iq_txshift;
|
||||||
|
unsigned exmimo:1;
|
||||||
|
unsigned usrp_b200:1;
|
||||||
|
unsigned usrp_x300:1;
|
||||||
|
unsigned bladerf:1;
|
||||||
|
unsigned lmssdr:1;
|
||||||
|
} rrh_gw_config_t;
|
||||||
|
|
||||||
typedef struct Enb_properties_s {
|
typedef struct Enb_properties_s {
|
||||||
/* Unique eNB_id to identify the eNB within EPC.
|
/* Unique eNB_id to identify the eNB within EPC.
|
||||||
* For macro eNB ids this field should be 20 bits long.
|
* For macro eNB ids this field should be 20 bits long.
|
||||||
@@ -203,6 +221,13 @@ typedef struct Enb_properties_s {
|
|||||||
char *enb_interface_name_for_S1_MME;
|
char *enb_interface_name_for_S1_MME;
|
||||||
in_addr_t enb_ipv4_address_for_S1_MME;
|
in_addr_t enb_ipv4_address_for_S1_MME;
|
||||||
|
|
||||||
|
|
||||||
|
/* Nb of RRH to connect to */
|
||||||
|
uint8_t nb_rrh_gw;
|
||||||
|
char *rrh_gw_if_name;
|
||||||
|
/* List of MME to connect to */
|
||||||
|
rrh_gw_config_t rrh_gw_config[4];
|
||||||
|
|
||||||
// otg config
|
// otg config
|
||||||
/* Nb of OTG elements */
|
/* Nb of OTG elements */
|
||||||
uint8_t num_otg_elements;
|
uint8_t num_otg_elements;
|
||||||
@@ -239,6 +264,7 @@ typedef struct Enb_properties_array_s {
|
|||||||
Enb_properties_t *properties[MAX_ENB];
|
Enb_properties_t *properties[MAX_ENB];
|
||||||
} Enb_properties_array_t;
|
} Enb_properties_array_t;
|
||||||
|
|
||||||
|
void enb_config_display(void);
|
||||||
const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP);
|
const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP);
|
||||||
|
|
||||||
const Enb_properties_array_t *enb_config_get(void);
|
const Enb_properties_array_t *enb_config_get(void);
|
||||||
|
|||||||
@@ -251,7 +251,8 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t Num_ue_spec_dci ;
|
uint8_t Num_ue_spec_dci ;
|
||||||
uint8_t Num_common_dci ;
|
uint8_t Num_common_dci ;
|
||||||
unsigned int nCCE;
|
uint32_t nCCE;
|
||||||
|
uint32_t num_pdcch_symbols;
|
||||||
DCI_ALLOC_t dci_alloc[NUM_DCI_MAX] ;
|
DCI_ALLOC_t dci_alloc[NUM_DCI_MAX] ;
|
||||||
} DCI_PDU;
|
} DCI_PDU;
|
||||||
/*! \brief CCCH payload */
|
/*! \brief CCCH payload */
|
||||||
@@ -735,7 +736,8 @@ typedef struct {
|
|||||||
uint8_t dl_pow_off[MAX_NUM_CCs];
|
uint8_t dl_pow_off[MAX_NUM_CCs];
|
||||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs];
|
uint16_t pre_nb_available_rbs[MAX_NUM_CCs];
|
||||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][N_RBG_MAX];
|
unsigned char rballoc_sub_UE[MAX_NUM_CCs][N_RBG_MAX];
|
||||||
|
uint16_t ta_timer;
|
||||||
|
int16_t ta_update;
|
||||||
} UE_sched_ctrl;
|
} UE_sched_ctrl;
|
||||||
/*! \brief eNB template for the Random access information */
|
/*! \brief eNB template for the Random access information */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -765,8 +767,6 @@ typedef struct {
|
|||||||
uint8_t Msg3_subframe;
|
uint8_t Msg3_subframe;
|
||||||
/// Flag to indicate the eNB should generate Msg4 upon reception of SDU from RRC. This is triggered by first ULSCH reception at eNB for new user.
|
/// Flag to indicate the eNB should generate Msg4 upon reception of SDU from RRC. This is triggered by first ULSCH reception at eNB for new user.
|
||||||
uint8_t generate_Msg4;
|
uint8_t generate_Msg4;
|
||||||
/// Flag to indicate the eNB should generate the DCI for Msg4, after getting the SDU from RRC.
|
|
||||||
uint8_t generate_Msg4_dci;
|
|
||||||
/// Flag to indicate that eNB is waiting for ACK that UE has received Msg3.
|
/// Flag to indicate that eNB is waiting for ACK that UE has received Msg3.
|
||||||
uint8_t wait_ack_Msg4;
|
uint8_t wait_ack_Msg4;
|
||||||
/// UE RNTI allocated during RAR
|
/// UE RNTI allocated during RAR
|
||||||
@@ -835,8 +835,8 @@ typedef struct {
|
|||||||
/// Outgoing CCCH pdu for PHY
|
/// Outgoing CCCH pdu for PHY
|
||||||
CCCH_PDU CCCH_pdu;
|
CCCH_PDU CCCH_pdu;
|
||||||
RA_TEMPLATE RA_template[NB_RA_PROC_MAX];
|
RA_TEMPLATE RA_template[NB_RA_PROC_MAX];
|
||||||
/// BCCH active flag
|
/// VRB map for common channels
|
||||||
uint8_t bcch_active;
|
uint8_t vrb_map[100];
|
||||||
/// MBSFN SubframeConfig
|
/// MBSFN SubframeConfig
|
||||||
struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8];
|
struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8];
|
||||||
/// number of subframe allocation pattern available for MBSFN sync area
|
/// number of subframe allocation pattern available for MBSFN sync area
|
||||||
@@ -883,9 +883,11 @@ typedef struct {
|
|||||||
/// Common cell resources
|
/// Common cell resources
|
||||||
COMMON_channels_t common_channels[MAX_NUM_CCs];
|
COMMON_channels_t common_channels[MAX_NUM_CCs];
|
||||||
UE_list_t UE_list;
|
UE_list_t UE_list;
|
||||||
|
|
||||||
///subband bitmap configuration
|
///subband bitmap configuration
|
||||||
SBMAP_CONF sbmap_conf;
|
SBMAP_CONF sbmap_conf;
|
||||||
|
/// CCE table used to build DCI scheduling information
|
||||||
|
int CCE_table[MAX_NUM_CCs][800];
|
||||||
/// active flag for Other lcid
|
/// active flag for Other lcid
|
||||||
// uint8_t lcid_active[NB_RB_MAX];
|
// uint8_t lcid_active[NB_RB_MAX];
|
||||||
/// eNB stats
|
/// eNB stats
|
||||||
|
|||||||
@@ -77,13 +77,13 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP) //, int calibration_flag) {
|
void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP) //, int calibration_flag) {
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned int nprb[MAX_NUM_CCs];
|
|
||||||
unsigned int nCCE[MAX_NUM_CCs];
|
|
||||||
int mbsfn_status[MAX_NUM_CCs];
|
int mbsfn_status[MAX_NUM_CCs];
|
||||||
uint32_t RBalloc[MAX_NUM_CCs];
|
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
#ifdef EXMIMO
|
#ifdef EXMIMO
|
||||||
int ret;
|
int ret;
|
||||||
@@ -106,10 +106,11 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
|
|
||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
DCI_pdu[CC_id] = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
|
DCI_pdu[CC_id] = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
|
||||||
nCCE[CC_id]=0;
|
DCI_pdu[CC_id]->nCCE=0;
|
||||||
nprb[CC_id]=0;
|
DCI_pdu[CC_id]->num_pdcch_symbols=1;
|
||||||
RBalloc[CC_id]=0;
|
|
||||||
mbsfn_status[CC_id]=0;
|
mbsfn_status[CC_id]=0;
|
||||||
|
// clear vrb_map
|
||||||
|
memset(eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map,0,100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// refresh UE list based on UEs dropped by PHY in previous subframe
|
// refresh UE list based on UEs dropped by PHY in previous subframe
|
||||||
@@ -186,7 +187,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
DCI_pdu[CC_id]->Num_common_dci = 0;
|
DCI_pdu[CC_id]->Num_common_dci = 0;
|
||||||
DCI_pdu[CC_id]->Num_ue_spec_dci = 0;
|
DCI_pdu[CC_id]->Num_ue_spec_dci = 0;
|
||||||
eNB_mac_inst[module_idP].common_channels[CC_id].bcch_active = 0;
|
|
||||||
|
|
||||||
#ifdef Rel10
|
#ifdef Rel10
|
||||||
eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0;
|
eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0;
|
||||||
@@ -194,6 +195,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
|
|
||||||
eNB_mac_inst[module_idP].frame = frameP;
|
eNB_mac_inst[module_idP].frame = frameP;
|
||||||
eNB_mac_inst[module_idP].subframe = subframeP;
|
eNB_mac_inst[module_idP].subframe = subframeP;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (subframeP%5 == 0)
|
//if (subframeP%5 == 0)
|
||||||
@@ -238,19 +241,20 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
// Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6)
|
// Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6)
|
||||||
// Schedule Normal DLSCH
|
// Schedule Normal DLSCH
|
||||||
|
|
||||||
schedule_RA(module_idP,frameP,subframeP,2,nprb,nCCE);
|
|
||||||
|
schedule_RA(module_idP,frameP,subframeP,2);
|
||||||
|
|
||||||
|
|
||||||
if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD
|
if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,0,4,nCCE);//,calibration_flag);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag);
|
||||||
} else if ((mac_xface->lte_frame_parms->tdd_config == TDD) || //TDD
|
} else if ((mac_xface->lte_frame_parms->tdd_config == TDD) || //TDD
|
||||||
(mac_xface->lte_frame_parms->tdd_config == 3) ||
|
(mac_xface->lte_frame_parms->tdd_config == 3) ||
|
||||||
(mac_xface->lte_frame_parms->tdd_config == 6)) {
|
(mac_xface->lte_frame_parms->tdd_config == 6)) {
|
||||||
//schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4,nCCE);//,calibration_flag);
|
//schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
// schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -262,22 +266,22 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
switch (mac_xface->lte_frame_parms->tdd_config) {
|
switch (mac_xface->lte_frame_parms->tdd_config) {
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { //FDD
|
} else { //FDD
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,1,5);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,1,5,nCCE);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -287,9 +291,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
// TDD, nothing
|
// TDD, nothing
|
||||||
// FDD, normal UL/DLSCH
|
// FDD, normal UL/DLSCH
|
||||||
if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD
|
if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,2,6);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,2,6,nCCE);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -302,22 +306,22 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
if (mac_xface->lte_frame_parms->frame_type == TDD) {
|
if (mac_xface->lte_frame_parms->frame_type == TDD) {
|
||||||
switch (mac_xface->lte_frame_parms->tdd_config) {
|
switch (mac_xface->lte_frame_parms->tdd_config) {
|
||||||
case 2:
|
case 2:
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
|
||||||
|
|
||||||
// no break here!
|
// no break here!
|
||||||
case 5:
|
case 5:
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { //FDD
|
} else { //FDD
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,3,7,nCCE);
|
|
||||||
|
|
||||||
|
schedule_ulsch(module_idP,frameP,cooperation_flag,3,7);
|
||||||
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -330,8 +334,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
if (mac_xface->lte_frame_parms->frame_type == 1) { // TDD
|
if (mac_xface->lte_frame_parms->frame_type == 1) { // TDD
|
||||||
switch (mac_xface->lte_frame_parms->tdd_config) {
|
switch (mac_xface->lte_frame_parms->tdd_config) {
|
||||||
case 1:
|
case 1:
|
||||||
// schedule_RA(module_idP,frameP,subframeP,nprb,nCCE);
|
// schedule_RA(module_idP,frameP,subframeP);
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
|
||||||
|
|
||||||
// no break here!
|
// no break here!
|
||||||
case 2:
|
case 2:
|
||||||
@@ -341,8 +345,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
|
|
||||||
// no break here!
|
// no break here!
|
||||||
case 5:
|
case 5:
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -350,11 +355,11 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD
|
if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD
|
||||||
// schedule_RA(module_idP,frameP, subframeP, 0, nprb, nCCE);
|
|
||||||
// schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8, nCCE);
|
|
||||||
schedule_ue_spec(module_idP, frameP, subframeP, nprb, nCCE, mbsfn_status);
|
|
||||||
fill_DLSCH_dci(module_idP, frameP, subframeP, RBalloc, 1, mbsfn_status);
|
|
||||||
|
|
||||||
|
// schedule_RA(module_idP,frameP, subframeP, 0);
|
||||||
|
schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8);
|
||||||
|
schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status);
|
||||||
|
fill_DLSCH_dci(module_idP, frameP, subframeP, mbsfn_status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -365,21 +370,21 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
// TDD Config 0,6 ULSCH for subframes 9,3 resp.
|
// TDD Config 0,6 ULSCH for subframes 9,3 resp.
|
||||||
// TDD normal DLSCH
|
// TDD normal DLSCH
|
||||||
// FDD normal UL/DLSCH
|
// FDD normal UL/DLSCH
|
||||||
schedule_SI(module_idP,frameP,nprb,nCCE);
|
schedule_SI(module_idP,frameP,subframeP);
|
||||||
|
|
||||||
//schedule_RA(module_idP,frameP,subframeP,5,nprb,nCCE);
|
//schedule_RA(module_idP,frameP,subframeP,5);
|
||||||
if (mac_xface->lte_frame_parms->frame_type == FDD) {
|
if (mac_xface->lte_frame_parms->frame_type == FDD) {
|
||||||
schedule_RA(module_idP,frameP,subframeP,1,nprb,nCCE);
|
schedule_RA(module_idP,frameP,subframeP,1);
|
||||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,5,9,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,5,9);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status);
|
||||||
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
} else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0
|
} else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0
|
||||||
(mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
|
(mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
|
||||||
//schedule_ulsch(module_idP,cooperation_flag,subframeP,nCCE);
|
//schedule_ulsch(module_idP,cooperation_flag,subframeP);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
} else {
|
} else {
|
||||||
//schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -395,36 +400,36 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
|
||||||
// schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
// schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
|
||||||
// schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
// schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
schedule_RA(module_idP,frameP,subframeP,2,nprb,nCCE);
|
schedule_RA(module_idP,frameP,subframeP,2);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { //FDD
|
} else { //FDD
|
||||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,6,0,nCCE);
|
// schedule_ulsch(module_idP,frameP,cooperation_flag,6,0);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -437,23 +442,23 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
switch (mac_xface->lte_frame_parms->tdd_config) {
|
switch (mac_xface->lte_frame_parms->tdd_config) {
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
schedule_RA(module_idP,frameP,subframeP,3,nprb,nCCE); // 3 = Msg3 subframeP, not
|
schedule_RA(module_idP,frameP,subframeP,3); // 3 = Msg3 subframeP, not
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { //FDD
|
} else { //FDD
|
||||||
//schedule_ulsch(module_idP,frameP,cooperation_flag,7,1,nCCE);
|
//schedule_ulsch(module_idP,frameP,cooperation_flag,7,1);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -470,19 +475,19 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
case 4:
|
case 4:
|
||||||
case 5:
|
case 5:
|
||||||
|
|
||||||
// schedule_RA(module_idP,subframeP,nprb,nCCE);
|
// schedule_RA(module_idP,subframeP);
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { //FDD
|
} else { //FDD
|
||||||
//schedule_ulsch(module_idP,frameP,cooperation_flag,8,2,nCCE);
|
//schedule_ulsch(module_idP,frameP,cooperation_flag,8,2);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -493,51 +498,53 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
if (mac_xface->lte_frame_parms->frame_type == TDD) {
|
if (mac_xface->lte_frame_parms->frame_type == TDD) {
|
||||||
switch (mac_xface->lte_frame_parms->tdd_config) {
|
switch (mac_xface->lte_frame_parms->tdd_config) {
|
||||||
case 1:
|
case 1:
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
|
||||||
schedule_RA(module_idP,frameP,subframeP,7,nprb,nCCE); // 7 = Msg3 subframeP, not
|
schedule_RA(module_idP,frameP,subframeP,7); // 7 = Msg3 subframeP, not
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4,nCCE);
|
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);
|
||||||
//schedule_RA(module_idP,frameP,subframeP,nprb,nCCE);
|
//schedule_RA(module_idP,frameP,subframeP);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
case 5:
|
case 5:
|
||||||
//schedule_RA(module_idP,frameP,subframeP,nprb,nCCE);
|
//schedule_RA(module_idP,frameP,subframeP);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { //FDD
|
} else { //FDD
|
||||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,9,3,nCCE);
|
// schedule_ulsch(module_idP,frameP,cooperation_flag,9,3);
|
||||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
LOG_D(MAC,"FrameP %d, subframeP %d : Scheduling CCEs\n",frameP,subframeP);
|
||||||
DCI_pdu[CC_id]->nCCE = nCCE[CC_id];
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_D(MAC,"frameP %d, subframeP %d nCCE %d\n",frameP,subframeP,nCCE[0]);
|
// Allocate CCEs for good after scheduling is done
|
||||||
|
for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
|
||||||
|
allocate_CCEs(module_idP,CC_id,subframeP,0);
|
||||||
|
|
||||||
|
LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
|
||||||
|
|
||||||
stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
|
stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
|
||||||
|
|||||||
@@ -68,7 +68,8 @@
|
|||||||
|
|
||||||
#include "SIMULATION/TOOLS/defs.h" // for taus
|
#include "SIMULATION/TOOLS/defs.h" // for taus
|
||||||
|
|
||||||
void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,unsigned char Msg3_subframe,unsigned int *nprb,unsigned int *nCCE)
|
|
||||||
|
void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,unsigned char Msg3_subframe)
|
||||||
{
|
{
|
||||||
|
|
||||||
int CC_id;
|
int CC_id;
|
||||||
@@ -76,34 +77,195 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
|
|||||||
|
|
||||||
|
|
||||||
RA_TEMPLATE *RA_template;
|
RA_TEMPLATE *RA_template;
|
||||||
unsigned char i;//,harq_pid,round;
|
unsigned char i,harq_pid,round;
|
||||||
int16_t rrc_sdu_length;
|
int16_t rrc_sdu_length;
|
||||||
unsigned char lcid,offset;
|
unsigned char lcid,offset;
|
||||||
module_id_t UE_id= UE_INDEX_INVALID;
|
module_id_t UE_id= UE_INDEX_INVALID;
|
||||||
unsigned short TBsize = -1;
|
unsigned short TBsize = -1;
|
||||||
unsigned short msg4_padding,msg4_post_padding,msg4_header;
|
unsigned short msg4_padding,msg4_post_padding,msg4_header;
|
||||||
|
uint8_t *vrb_map;
|
||||||
|
int first_rb;
|
||||||
|
int rballoc[MAX_NUM_CCs];
|
||||||
|
DCI_PDU *DCI_pdu;
|
||||||
|
|
||||||
start_meas(&eNB->schedule_ra);
|
start_meas(&eNB->schedule_ra);
|
||||||
|
|
||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
|
|
||||||
RA_template = (RA_TEMPLATE *)&eNB->common_channels[CC_id].RA_template[0];
|
|
||||||
|
vrb_map = eNB->common_channels[CC_id].vrb_map;
|
||||||
|
DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu;
|
||||||
|
|
||||||
for (i=0; i<NB_RA_PROC_MAX; i++) {
|
for (i=0; i<NB_RA_PROC_MAX; i++) {
|
||||||
|
|
||||||
if (RA_template[i].RA_active == TRUE) {
|
RA_template = (RA_TEMPLATE *)&eNB->common_channels[CC_id].RA_template[i];
|
||||||
|
|
||||||
|
if (RA_template->RA_active == TRUE) {
|
||||||
|
|
||||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d RA %d is active (generate RAR %d, generate_Msg4 %d, wait_ack_Msg4 %d, rnti %x)\n",
|
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d RA %d is active (generate RAR %d, generate_Msg4 %d, wait_ack_Msg4 %d, rnti %x)\n",
|
||||||
module_idP,CC_id,i,RA_template[i].generate_rar,RA_template[i].generate_Msg4,RA_template[i].wait_ack_Msg4, RA_template[i].rnti);
|
module_idP,CC_id,i,RA_template->generate_rar,RA_template->generate_Msg4,RA_template->wait_ack_Msg4, RA_template->rnti);
|
||||||
|
|
||||||
if (RA_template[i].generate_rar == 1) {
|
if (RA_template->generate_rar == 1) {
|
||||||
nprb[CC_id]= nprb[CC_id] + 3;
|
|
||||||
nCCE[CC_id] = nCCE[CC_id] + 4;
|
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generating RAR DCI (proc %d), RA_active %d format 1A (%d,%d))\n",
|
||||||
RA_template[i].Msg3_subframe=Msg3_subframe;
|
module_idP, CC_id, frameP, subframeP,i,
|
||||||
} else if (RA_template[i].generate_Msg4 == 1) {
|
RA_template->RA_active,
|
||||||
|
RA_template->RA_dci_fmt1,
|
||||||
|
RA_template->RA_dci_size_bits1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
||||||
|
switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||||
|
case 6:
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 25:
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 50:
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 100:
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||||
|
case 6:
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 25:
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 50:
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 100:
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CCE_allocation_infeasible(module_idP,CC_id,1,subframeP,2,RA_template->RA_rnti)) {
|
||||||
|
add_common_dci(DCI_pdu,
|
||||||
|
(void*)&RA_template->RA_alloc_pdu1[0],
|
||||||
|
RA_template->RA_rnti,
|
||||||
|
RA_template->RA_dci_size_bytes1,
|
||||||
|
2,
|
||||||
|
RA_template->RA_dci_size_bits1,
|
||||||
|
RA_template->RA_dci_fmt1,
|
||||||
|
1);
|
||||||
|
|
||||||
|
RA_template->Msg3_subframe=Msg3_subframe;
|
||||||
|
}
|
||||||
|
} else if (RA_template->generate_Msg4 == 1) {
|
||||||
|
|
||||||
// check for Msg4 Message
|
// check for Msg4 Message
|
||||||
UE_id = find_UE_id(module_idP,RA_template[i].rnti);
|
UE_id = find_UE_id(module_idP,RA_template->rnti);
|
||||||
|
|
||||||
if (Is_rrc_registered == 1) {
|
if (Is_rrc_registered == 1) {
|
||||||
|
|
||||||
@@ -131,7 +293,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
|
|||||||
|
|
||||||
if (rrc_sdu_length>0) {
|
if (rrc_sdu_length>0) {
|
||||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RA proc %d, RNTI %x)\n",
|
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RA proc %d, RNTI %x)\n",
|
||||||
module_idP, CC_id, frameP, subframeP,i,RA_template[i].rnti);
|
module_idP, CC_id, frameP, subframeP,i,RA_template->rnti);
|
||||||
|
|
||||||
//msg("[MAC][eNB %d][RAPROC] Frame %d, subframeP %d: Received %d bytes for Msg4: \n",module_idP,frameP,subframeP,rrc_sdu_length);
|
//msg("[MAC][eNB %d][RAPROC] Frame %d, subframeP %d: Received %d bytes for Msg4: \n",module_idP,frameP,subframeP,rrc_sdu_length);
|
||||||
// for (j=0;j<rrc_sdu_length;j++)
|
// for (j=0;j<rrc_sdu_length;j++)
|
||||||
@@ -140,6 +302,21 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
|
|||||||
// msg("[MAC][eNB] Frame %d, subframeP %d: Generated DLSCH (Msg4) DCI, format 1A, for UE %d\n",frameP, subframeP,UE_id);
|
// msg("[MAC][eNB] Frame %d, subframeP %d: Generated DLSCH (Msg4) DCI, format 1A, for UE %d\n",frameP, subframeP,UE_id);
|
||||||
// Schedule Reflection of Connection request
|
// Schedule Reflection of Connection request
|
||||||
|
|
||||||
|
/*
|
||||||
|
// randomize frequency allocation for RA
|
||||||
|
while (1) {
|
||||||
|
first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
|
||||||
|
|
||||||
|
if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
first_rb=0;
|
||||||
|
|
||||||
|
vrb_map[first_rb] = 1;
|
||||||
|
vrb_map[first_rb+1] = 1;
|
||||||
|
vrb_map[first_rb+2] = 1;
|
||||||
|
vrb_map[first_rb+3] = 1;
|
||||||
|
|
||||||
|
|
||||||
// Compute MCS for 3 PRB
|
// Compute MCS for 3 PRB
|
||||||
@@ -149,273 +326,406 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
|
|||||||
|
|
||||||
switch (mac_xface->lte_frame_parms->N_RB_DL) {
|
switch (mac_xface->lte_frame_parms->N_RB_DL) {
|
||||||
case 6:
|
case 6:
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1;
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
|
||||||
if ((rrc_sdu_length+msg4_header) <= 22) {
|
if ((rrc_sdu_length+msg4_header) <= 22) {
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4;
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4;
|
||||||
TBsize = 22;
|
TBsize = 22;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5;
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5;
|
||||||
TBsize = 28;
|
TBsize = 28;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6;
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6;
|
||||||
TBsize = 32;
|
TBsize = 32;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7;
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7;
|
||||||
TBsize = 41;
|
TBsize = 41;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8;
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8;
|
||||||
TBsize = 49;
|
TBsize = 49;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9;
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9;
|
||||||
TBsize = 57;
|
TBsize = 57;
|
||||||
}
|
}
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1;
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
|
||||||
if ((rrc_sdu_length+msg4_header) <= 22) {
|
if ((rrc_sdu_length+msg4_header) <= 22) {
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4;
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4;
|
||||||
TBsize = 22;
|
TBsize = 22;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5;
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5;
|
||||||
TBsize = 28;
|
TBsize = 28;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6;
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6;
|
||||||
TBsize = 32;
|
TBsize = 32;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7;
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7;
|
||||||
TBsize = 41;
|
TBsize = 41;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8;
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8;
|
||||||
TBsize = 49;
|
TBsize = 49;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9;
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9;
|
||||||
TBsize = 57;
|
TBsize = 57;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50:
|
case 50:
|
||||||
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1;
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
|
||||||
if ((rrc_sdu_length+msg4_header) <= 22) {
|
if ((rrc_sdu_length+msg4_header) <= 22) {
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4;
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4;
|
||||||
TBsize = 22;
|
TBsize = 22;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5;
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5;
|
||||||
TBsize = 28;
|
TBsize = 28;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6;
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6;
|
||||||
TBsize = 32;
|
TBsize = 32;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7;
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7;
|
||||||
TBsize = 41;
|
TBsize = 41;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8;
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8;
|
||||||
TBsize = 49;
|
TBsize = 49;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9;
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9;
|
||||||
TBsize = 57;
|
TBsize = 57;
|
||||||
}
|
}
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 100:
|
case 100:
|
||||||
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1;
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
|
||||||
if ((rrc_sdu_length+msg4_header) <= 22) {
|
if ((rrc_sdu_length+msg4_header) <= 22) {
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4;
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4;
|
||||||
TBsize = 22;
|
TBsize = 22;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5;
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5;
|
||||||
TBsize = 28;
|
TBsize = 28;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6;
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6;
|
||||||
TBsize = 32;
|
TBsize = 32;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7;
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7;
|
||||||
TBsize = 41;
|
TBsize = 41;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8;
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8;
|
||||||
TBsize = 49;
|
TBsize = 49;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9;
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9;
|
||||||
TBsize = 57;
|
TBsize = 57;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { // FDD DCI
|
} else { // FDD DCI
|
||||||
switch (mac_xface->lte_frame_parms->N_RB_DL) {
|
switch (mac_xface->lte_frame_parms->N_RB_DL) {
|
||||||
case 6:
|
case 6:
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1;
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
|
||||||
if ((rrc_sdu_length+msg4_header) <= 22) {
|
if ((rrc_sdu_length+msg4_header) <= 22) {
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4;
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4;
|
||||||
TBsize = 22;
|
TBsize = 22;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5;
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5;
|
||||||
TBsize = 28;
|
TBsize = 28;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6;
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6;
|
||||||
TBsize = 32;
|
TBsize = 32;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7;
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7;
|
||||||
TBsize = 41;
|
TBsize = 41;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8;
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8;
|
||||||
TBsize = 49;
|
TBsize = 49;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9;
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9;
|
||||||
TBsize = 57;
|
TBsize = 57;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1;
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
|
||||||
if ((rrc_sdu_length+msg4_header) <= 22) {
|
if ((rrc_sdu_length+msg4_header) <= 22) {
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4;
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4;
|
||||||
TBsize = 22;
|
TBsize = 22;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5;
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5;
|
||||||
TBsize = 28;
|
TBsize = 28;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6;
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6;
|
||||||
TBsize = 32;
|
TBsize = 32;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7;
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7;
|
||||||
TBsize = 41;
|
TBsize = 41;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8;
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8;
|
||||||
TBsize = 49;
|
TBsize = 49;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9;
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9;
|
||||||
TBsize = 57;
|
TBsize = 57;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50:
|
case 50:
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1;
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
|
||||||
if ((rrc_sdu_length+msg4_header) <= 22) {
|
if ((rrc_sdu_length+msg4_header) <= 22) {
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4;
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4;
|
||||||
TBsize = 22;
|
TBsize = 22;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5;
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5;
|
||||||
TBsize = 28;
|
TBsize = 28;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6;
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6;
|
||||||
TBsize = 32;
|
TBsize = 32;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7;
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7;
|
||||||
TBsize = 41;
|
TBsize = 41;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8;
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8;
|
||||||
TBsize = 49;
|
TBsize = 49;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9;
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9;
|
||||||
TBsize = 57;
|
TBsize = 57;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 100:
|
case 100:
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->ndi=1;
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
|
||||||
if ((rrc_sdu_length+msg4_header) <= 22) {
|
if ((rrc_sdu_length+msg4_header) <= 22) {
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=4;
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4;
|
||||||
TBsize = 22;
|
TBsize = 22;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
} else if ((rrc_sdu_length+msg4_header) <= 28) {
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=5;
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5;
|
||||||
TBsize = 28;
|
TBsize = 28;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
} else if ((rrc_sdu_length+msg4_header) <= 32) {
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=6;
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6;
|
||||||
TBsize = 32;
|
TBsize = 32;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
} else if ((rrc_sdu_length+msg4_header) <= 41) {
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=7;
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7;
|
||||||
TBsize = 41;
|
TBsize = 41;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
} else if ((rrc_sdu_length+msg4_header) <= 49) {
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=8;
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8;
|
||||||
TBsize = 49;
|
TBsize = 49;
|
||||||
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
} else if ((rrc_sdu_length+msg4_header) <= 57) {
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template[i].RA_alloc_pdu2[0])->mcs=9;
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9;
|
||||||
TBsize = 57;
|
TBsize = 57;
|
||||||
}
|
}
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RA_template[i].generate_Msg4=0;
|
if (!CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,2,RA_template->rnti)) {
|
||||||
RA_template[i].generate_Msg4_dci=1;
|
add_ue_spec_dci(DCI_pdu,
|
||||||
RA_template[i].wait_ack_Msg4=1;
|
(void*)&RA_template->RA_alloc_pdu2[0],
|
||||||
RA_template[i].RA_active = FALSE;
|
RA_template->rnti,
|
||||||
lcid=0;
|
RA_template->RA_dci_size_bytes2,
|
||||||
|
2,
|
||||||
if ((TBsize - rrc_sdu_length - msg4_header) <= 2) {
|
RA_template->RA_dci_size_bits2,
|
||||||
msg4_padding = TBsize - rrc_sdu_length - msg4_header;
|
RA_template->RA_dci_fmt2,
|
||||||
msg4_post_padding = 0;
|
0);
|
||||||
} else {
|
|
||||||
msg4_padding = 0;
|
RA_template->generate_Msg4=0;
|
||||||
msg4_post_padding = TBsize - rrc_sdu_length - msg4_header -1;
|
RA_template->wait_ack_Msg4=1;
|
||||||
}
|
RA_template->RA_active = FALSE;
|
||||||
|
lcid=0;
|
||||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d subframeP %d Msg4 : TBS %d, sdu_len %d, msg4_header %d, msg4_padding %d, msg4_post_padding %d\n",
|
|
||||||
module_idP,CC_id,frameP,subframeP,TBsize,rrc_sdu_length,msg4_header,msg4_padding,msg4_post_padding);
|
if ((TBsize - rrc_sdu_length - msg4_header) <= 2) {
|
||||||
DevAssert( UE_id != UE_INDEX_INVALID ); // FIXME not sure how to gracefully return
|
msg4_padding = TBsize - rrc_sdu_length - msg4_header;
|
||||||
offset = generate_dlsch_header((unsigned char*)eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0],
|
msg4_post_padding = 0;
|
||||||
1, //num_sdus
|
} else {
|
||||||
(unsigned short*)&rrc_sdu_length, //
|
msg4_padding = 0;
|
||||||
&lcid, // sdu_lcid
|
msg4_post_padding = TBsize - rrc_sdu_length - msg4_header -1;
|
||||||
255, // no drx
|
}
|
||||||
0, // no timing advance
|
|
||||||
RA_template[i].cont_res_id, // contention res id
|
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d subframeP %d Msg4 : TBS %d, sdu_len %d, msg4_header %d, msg4_padding %d, msg4_post_padding %d\n",
|
||||||
msg4_padding, // no padding
|
module_idP,CC_id,frameP,subframeP,TBsize,rrc_sdu_length,msg4_header,msg4_padding,msg4_post_padding);
|
||||||
msg4_post_padding);
|
DevAssert( UE_id != UE_INDEX_INVALID ); // FIXME not sure how to gracefully return
|
||||||
|
offset = generate_dlsch_header((unsigned char*)eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0],
|
||||||
memcpy((void*)&eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0][(unsigned char)offset],
|
1, //num_sdus
|
||||||
&eNB->common_channels[CC_id].CCCH_pdu.payload[0],
|
(unsigned short*)&rrc_sdu_length, //
|
||||||
rrc_sdu_length);
|
&lcid, // sdu_lcid
|
||||||
|
255, // no drx
|
||||||
if (opt_enabled==1) {
|
0, // no timing advance
|
||||||
trace_pdu(1, (uint8_t *)eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0],
|
RA_template->cont_res_id, // contention res id
|
||||||
rrc_sdu_length, UE_id, 3, UE_RNTI(module_idP, UE_id),
|
msg4_padding, // no padding
|
||||||
eNB->subframe,0,0);
|
msg4_post_padding);
|
||||||
LOG_D(OPT,"[eNB %d][DLSCH] CC_id %d Frame %d trace pdu for rnti %x with size %d\n",
|
|
||||||
module_idP, CC_id, frameP, UE_RNTI(module_idP,UE_id), rrc_sdu_length);
|
memcpy((void*)&eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0][(unsigned char)offset],
|
||||||
}
|
&eNB->common_channels[CC_id].CCCH_pdu.payload[0],
|
||||||
|
rrc_sdu_length);
|
||||||
nprb[CC_id]= nprb[CC_id] + 3;
|
|
||||||
nCCE[CC_id] = nCCE[CC_id] + 4;
|
if (opt_enabled==1) {
|
||||||
}
|
trace_pdu(1, (uint8_t *)eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0],
|
||||||
|
rrc_sdu_length, UE_id, 3, UE_RNTI(module_idP, UE_id),
|
||||||
|
eNB->subframe,0,0);
|
||||||
|
LOG_D(OPT,"[eNB %d][DLSCH] CC_id %d Frame %d trace pdu for rnti %x with size %d\n",
|
||||||
|
module_idP, CC_id, frameP, UE_RNTI(module_idP,UE_id), rrc_sdu_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//try here
|
//try here
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
} else if (RA_template->wait_ack_Msg4==1) {
|
||||||
else if (eNB_mac_inst[module_idP][CC_id].RA_template[i].wait_ack_Msg4==1) {
|
// check HARQ status and retransmit if necessary
|
||||||
// check HARQ status and retransmit if necessary
|
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Checking if Msg4 was acknowledged: \n",
|
||||||
LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: Checking if Msg4 was acknowledged :\n",module_idP,frameP,subframeP);
|
module_idP,CC_id,frameP,subframeP);
|
||||||
// Get candidate harq_pid from PHY
|
// Get candidate harq_pid from PHY
|
||||||
mac_xface->get_ue_active_harq_pid(module_idP,eNB_mac_inst[module_idP][CC_id].RA_template[i].rnti,subframeP,&harq_pid,&round,0);
|
mac_xface->get_ue_active_harq_pid(module_idP,CC_id,RA_template->rnti,frameP,subframeP,&harq_pid,&round,0);
|
||||||
if (round>0) {
|
|
||||||
*nprb= (*nprb) + 3;
|
if (round>0) {
|
||||||
*nCCE = (*nCCE) + 4;
|
//RA_template->wait_ack_Msg4++;
|
||||||
}
|
// we have to schedule a retransmission
|
||||||
}
|
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
||||||
*/
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
} else {
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// randomize frequency allocation for RA
|
||||||
|
while (1) {
|
||||||
|
first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
|
||||||
|
|
||||||
|
if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
first_rb=0;
|
||||||
|
vrb_map[first_rb] = 1;
|
||||||
|
vrb_map[first_rb+1] = 1;
|
||||||
|
vrb_map[first_rb+2] = 1;
|
||||||
|
vrb_map[first_rb+3] = 1;
|
||||||
|
|
||||||
|
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
|
} else {
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4);
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
||||||
|
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,2,RA_template->rnti)) {
|
||||||
|
add_ue_spec_dci(DCI_pdu,
|
||||||
|
(void*)&RA_template->RA_alloc_pdu2[0],
|
||||||
|
RA_template->rnti,
|
||||||
|
RA_template->RA_dci_size_bytes2,
|
||||||
|
2,
|
||||||
|
RA_template->RA_dci_size_bits2,
|
||||||
|
RA_template->RA_dci_fmt2,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
LOG_W(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Msg4 not acknowledged, adding ue specific dci (rnti %x) for RA (Msg4 Retransmission)\n",
|
||||||
|
module_idP,CC_id,frameP,subframeP,RA_template->rnti);
|
||||||
|
} else {
|
||||||
|
/* msg4 not received
|
||||||
|
if ((round == 0) && (RA_template->wait_ack_Msg4>1){
|
||||||
|
remove UE instance across all the layers: mac_xface->cancel_RA();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,CC_id,frameP,subframeP);
|
||||||
|
RA_template->wait_ack_Msg4=0;
|
||||||
|
RA_template->RA_active=FALSE;
|
||||||
|
UE_id = find_UE_id(module_idP,RA_template->rnti);
|
||||||
|
DevAssert( UE_id != -1 );
|
||||||
|
eNB_mac_inst[module_idP].UE_list.UE_template[UE_PCCID(module_idP,UE_id)][UE_id].configured=TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
} // for i=0 .. N_RA_PROC-1
|
||||||
}
|
} // CC_id
|
||||||
|
|
||||||
stop_meas(&eNB->schedule_ra);
|
stop_meas(&eNB->schedule_ra);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,9 +72,8 @@ void
|
|||||||
schedule_SI(
|
schedule_SI(
|
||||||
module_id_t module_idP,
|
module_id_t module_idP,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
unsigned int* nprbP,
|
sub_frame_t subframeP)
|
||||||
unsigned int* nCCEP
|
|
||||||
)
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -85,12 +84,19 @@ schedule_SI(
|
|||||||
void *BCCH_alloc_pdu;
|
void *BCCH_alloc_pdu;
|
||||||
int CC_id;
|
int CC_id;
|
||||||
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
||||||
|
uint8_t *vrb_map;
|
||||||
|
int first_rb;
|
||||||
|
int rballoc[MAX_NUM_CCs];
|
||||||
|
int sizeof1A_bytes,sizeof1A_bits;
|
||||||
|
DCI_PDU *DCI_pdu;
|
||||||
|
|
||||||
start_meas(&eNB->schedule_si);
|
start_meas(&eNB->schedule_si);
|
||||||
|
|
||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
|
|
||||||
BCCH_alloc_pdu=(void*)&eNB->common_channels[CC_id].BCCH_alloc_pdu;
|
BCCH_alloc_pdu = (void*)&eNB->common_channels[CC_id].BCCH_alloc_pdu;
|
||||||
|
DCI_pdu = (void*)&eNB->common_channels[CC_id].DCI_pdu;
|
||||||
|
vrb_map = (void*)&eNB->common_channels[CC_id].vrb_map;
|
||||||
|
|
||||||
bcch_sdu_length = mac_rrc_data_req(module_idP,
|
bcch_sdu_length = mac_rrc_data_req(module_idP,
|
||||||
CC_id,
|
CC_id,
|
||||||
@@ -104,7 +110,41 @@ schedule_SI(
|
|||||||
if (bcch_sdu_length > 0) {
|
if (bcch_sdu_length > 0) {
|
||||||
LOG_D(MAC,"[eNB %d] Frame %d : BCCH->DLSCH CC_id %d, Received %d bytes \n",module_idP,frameP,CC_id,bcch_sdu_length);
|
LOG_D(MAC,"[eNB %d] Frame %d : BCCH->DLSCH CC_id %d, Received %d bytes \n",module_idP,frameP,CC_id,bcch_sdu_length);
|
||||||
|
|
||||||
|
// Allocate 4 PRBs in a random location
|
||||||
|
/*
|
||||||
|
while (1) {
|
||||||
|
first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
|
||||||
|
if ((vrb_map[first_rb] != 1) &&
|
||||||
|
(vrb_map[first_rb+1] != 1) &&
|
||||||
|
(vrb_map[first_rb+2] != 1) &&
|
||||||
|
(vrb_map[first_rb+3] != 1))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||||
|
case 6:
|
||||||
|
first_rb = 0;
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
first_rb = 6;
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
first_rb = 11;
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
first_rb = 23;
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
first_rb = 48;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
vrb_map[first_rb] = 1;
|
||||||
|
vrb_map[first_rb+1] = 1;
|
||||||
|
vrb_map[first_rb+2] = 1;
|
||||||
|
vrb_map[first_rb+3] = 1;
|
||||||
|
|
||||||
|
// Get MCS for length of SI
|
||||||
if (bcch_sdu_length <= (mac_xface->get_TBS_DL(0,3))) {
|
if (bcch_sdu_length <= (mac_xface->get_TBS_DL(0,3))) {
|
||||||
mcs=0;
|
mcs=0;
|
||||||
} else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) {
|
} else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) {
|
||||||
@@ -125,46 +165,153 @@ schedule_SI(
|
|||||||
mcs=8;
|
mcs=8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
||||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||||
case 6:
|
case 6:
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs;
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1;
|
||||||
|
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0;
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc);
|
||||||
|
sizeof1A_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
|
||||||
|
sizeof1A_bits = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs;
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs;
|
||||||
break;
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1;
|
||||||
|
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0;
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc);
|
||||||
|
sizeof1A_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
|
||||||
|
sizeof1A_bits = sizeof_DCI1A_5MHz_TDD_1_6_t;
|
||||||
|
break;
|
||||||
|
|
||||||
case 50:
|
case 50:
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs;
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1;
|
||||||
|
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0;
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc);
|
||||||
|
sizeof1A_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
|
||||||
|
sizeof1A_bits = sizeof_DCI1A_10MHz_TDD_1_6_t;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 100:
|
case 100:
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs;
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs;
|
||||||
break;
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1;
|
||||||
|
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0;
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc);
|
||||||
|
sizeof1A_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
|
||||||
|
sizeof1A_bits = sizeof_DCI1A_20MHz_TDD_1_6_t;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||||
case 6:
|
case 6:
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs;
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1;
|
||||||
|
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0;
|
||||||
|
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc);
|
||||||
|
sizeof1A_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
|
||||||
|
sizeof1A_bits = sizeof_DCI1A_1_5MHz_FDD_t;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs;
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs;
|
||||||
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1;
|
||||||
|
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0;
|
||||||
|
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc);
|
||||||
|
sizeof1A_bytes = sizeof(DCI1A_5MHz_FDD_t);
|
||||||
|
sizeof1A_bits = sizeof_DCI1A_5MHz_FDD_t;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50:
|
case 50:
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs;
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs;
|
||||||
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->type = 1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1;
|
||||||
|
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0;
|
||||||
|
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc);
|
||||||
|
sizeof1A_bytes = sizeof(DCI1A_10MHz_FDD_t);
|
||||||
|
sizeof1A_bits = sizeof_DCI1A_10MHz_FDD_t;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 100:
|
case 100:
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs;
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs;
|
||||||
break;
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
||||||
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->type = 1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
||||||
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1;
|
||||||
|
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0;
|
||||||
|
|
||||||
|
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc);
|
||||||
|
sizeof1A_bytes = sizeof(DCI1A_20MHz_FDD_t);
|
||||||
|
sizeof1A_bits = sizeof_DCI1A_20MHz_FDD_t;
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!CCE_allocation_infeasible(module_idP,CC_id,1,subframeP,2,SI_RNTI)) {
|
||||||
|
add_common_dci(DCI_pdu,
|
||||||
|
BCCH_alloc_pdu,
|
||||||
|
SI_RNTI,
|
||||||
|
sizeof1A_bytes,
|
||||||
|
2,
|
||||||
|
sizeof1A_bits,
|
||||||
|
format1A,0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_E(MAC,"[eNB %d] CCid %d Frame %d, subframe %d : Cannot add DCI 1A for SI\n",module_idP, CC_id,frameP,subframeP);
|
||||||
|
}
|
||||||
|
|
||||||
if (opt_enabled == 1) {
|
if (opt_enabled == 1) {
|
||||||
trace_pdu(1,
|
trace_pdu(1,
|
||||||
&eNB->common_channels[CC_id].BCCH_pdu.payload[0],
|
&eNB->common_channels[CC_id].BCCH_pdu.payload[0],
|
||||||
@@ -194,17 +341,13 @@ schedule_SI(
|
|||||||
mac_xface->get_TBS_DL(mcs,3));
|
mac_xface->get_TBS_DL(mcs,3));
|
||||||
}
|
}
|
||||||
|
|
||||||
eNB->common_channels[CC_id].bcch_active=1;
|
|
||||||
nprbP[CC_id]=3;
|
|
||||||
nCCEP[CC_id]=4;
|
|
||||||
eNB->eNB_stats[CC_id].total_num_bcch_pdu+=1;
|
eNB->eNB_stats[CC_id].total_num_bcch_pdu+=1;
|
||||||
eNB->eNB_stats[CC_id].bcch_buffer=bcch_sdu_length;
|
eNB->eNB_stats[CC_id].bcch_buffer=bcch_sdu_length;
|
||||||
eNB->eNB_stats[CC_id].total_bcch_buffer+=bcch_sdu_length;
|
eNB->eNB_stats[CC_id].total_bcch_buffer+=bcch_sdu_length;
|
||||||
eNB->eNB_stats[CC_id].bcch_mcs=mcs;
|
eNB->eNB_stats[CC_id].bcch_mcs=mcs;
|
||||||
} else {
|
} else {
|
||||||
eNB->common_channels[CC_id].bcch_active=0;
|
|
||||||
nprbP[CC_id]=0;
|
|
||||||
nCCEP[CC_id]=0;
|
|
||||||
//LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",Mod_id,frame);
|
//LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",Mod_id,frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -422,16 +422,13 @@ schedule_ue_spec(
|
|||||||
module_id_t module_idP,
|
module_id_t module_idP,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t subframeP,
|
sub_frame_t subframeP,
|
||||||
unsigned int *nb_rb_used0,
|
int* mbsfn_flag
|
||||||
unsigned int *nCCE_used,
|
|
||||||
int* mbsfn_flag
|
|
||||||
)
|
)
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
|
|
||||||
uint8_t CC_id;
|
uint8_t CC_id;
|
||||||
int UE_id;
|
int UE_id;
|
||||||
uint16_t nCCE[MAX_NUM_CCs];
|
|
||||||
int N_RBG[MAX_NUM_CCs];
|
int N_RBG[MAX_NUM_CCs];
|
||||||
unsigned char aggregation;
|
unsigned char aggregation;
|
||||||
mac_rlc_status_resp_t rlc_status;
|
mac_rlc_status_resp_t rlc_status;
|
||||||
@@ -450,7 +447,6 @@ schedule_ue_spec(
|
|||||||
// uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
// uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||||
int mcs;
|
int mcs;
|
||||||
uint16_t min_rb_unit[MAX_NUM_CCs];
|
uint16_t min_rb_unit[MAX_NUM_CCs];
|
||||||
short ta_update = 0;
|
|
||||||
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
||||||
UE_list_t *UE_list = &eNB->UE_list;
|
UE_list_t *UE_list = &eNB->UE_list;
|
||||||
LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs];
|
LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs];
|
||||||
@@ -459,6 +455,7 @@ schedule_ue_spec(
|
|||||||
int32_t tpc=1;
|
int32_t tpc=1;
|
||||||
static int32_t tpc_accumulated=0;
|
static int32_t tpc_accumulated=0;
|
||||||
UE_sched_ctrl *ue_sched_ctl;
|
UE_sched_ctrl *ue_sched_ctl;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (UE_list->head==-1) {
|
if (UE_list->head==-1) {
|
||||||
return;
|
return;
|
||||||
@@ -473,15 +470,18 @@ schedule_ue_spec(
|
|||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
min_rb_unit[CC_id]=get_min_rb_unit(module_idP,CC_id);
|
min_rb_unit[CC_id]=get_min_rb_unit(module_idP,CC_id);
|
||||||
frame_parms[CC_id] = mac_xface->get_lte_frame_parms(module_idP,CC_id);
|
frame_parms[CC_id] = mac_xface->get_lte_frame_parms(module_idP,CC_id);
|
||||||
total_nb_available_rb[CC_id] = frame_parms[CC_id]->N_RB_DL - nb_rb_used0[CC_id];
|
// get number of PRBs less those used by common channels
|
||||||
nCCE[CC_id] = mac_xface->get_nCCE_max(module_idP,CC_id) - nCCE_used[CC_id];
|
total_nb_available_rb[CC_id] = frame_parms[CC_id]->N_RB_DL;
|
||||||
|
for (i=0;i<frame_parms[CC_id]->N_RB_DL;i++)
|
||||||
|
if (eNB->common_channels[CC_id].vrb_map[i]!=0)
|
||||||
|
total_nb_available_rb[CC_id]--;
|
||||||
|
|
||||||
N_RBG[CC_id] = frame_parms[CC_id]->N_RBG;
|
N_RBG[CC_id] = frame_parms[CC_id]->N_RBG;
|
||||||
|
|
||||||
// store the global enb stats:
|
// store the global enb stats:
|
||||||
eNB->eNB_stats[CC_id].num_dlactive_UEs = UE_list->num_UEs;
|
eNB->eNB_stats[CC_id].num_dlactive_UEs = UE_list->num_UEs;
|
||||||
eNB->eNB_stats[CC_id].available_prbs = total_nb_available_rb[CC_id];
|
eNB->eNB_stats[CC_id].available_prbs = total_nb_available_rb[CC_id];
|
||||||
eNB->eNB_stats[CC_id].total_available_prbs += total_nb_available_rb[CC_id];
|
eNB->eNB_stats[CC_id].total_available_prbs += total_nb_available_rb[CC_id];
|
||||||
eNB->eNB_stats[CC_id].available_ncces = nCCE[CC_id];
|
|
||||||
eNB->eNB_stats[CC_id].dlsch_bytes_tx=0;
|
eNB->eNB_stats[CC_id].dlsch_bytes_tx=0;
|
||||||
eNB->eNB_stats[CC_id].dlsch_pdus_tx=0;
|
eNB->eNB_stats[CC_id].dlsch_pdus_tx=0;
|
||||||
}
|
}
|
||||||
@@ -523,9 +523,11 @@ schedule_ue_spec(
|
|||||||
continue_flag=1;
|
continue_flag=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || (nCCE[CC_id] < (1<<aggregation))) {
|
if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || // no RBs allocated
|
||||||
|
CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti)
|
||||||
|
) {
|
||||||
LOG_D(MAC,"[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n",
|
LOG_D(MAC,"[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n",
|
||||||
module_idP, frameP, UE_id, CC_id, nb_rb_used0[CC_id], ue_sched_ctl->pre_nb_available_rbs[CC_id], nCCE[CC_id], aggregation);
|
module_idP, frameP, UE_id, CC_id);
|
||||||
//if(mac_xface->get_transmission_mode(module_idP,rnti)==5)
|
//if(mac_xface->get_transmission_mode(module_idP,rnti)==5)
|
||||||
continue_flag=1; //to next user (there might be rbs availiable for other UEs in TM5
|
continue_flag=1; //to next user (there might be rbs availiable for other UEs in TM5
|
||||||
// else
|
// else
|
||||||
@@ -540,7 +542,6 @@ schedule_ue_spec(
|
|||||||
UE_list);
|
UE_list);
|
||||||
// update UL DAI after DLSCH scheduling
|
// update UL DAI after DLSCH scheduling
|
||||||
set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms);
|
set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (continue_flag == 1 ) {
|
if (continue_flag == 1 ) {
|
||||||
@@ -587,11 +588,10 @@ schedule_ue_spec(
|
|||||||
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = 0;
|
UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(MAC,"[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, ncc %d, rrc %d)\n",
|
LOG_D(MAC,"[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n",
|
||||||
module_idP, frameP, UE_id,CC_id,rnti,harq_pid, round,nb_available_rb,
|
module_idP, frameP, UE_id,CC_id,rnti,harq_pid, round,nb_available_rb,
|
||||||
eNB_UE_stats->DL_cqi[0], eNB_UE_stats->dlsch_mcs1,
|
eNB_UE_stats->DL_cqi[0], eNB_UE_stats->dlsch_mcs1,
|
||||||
nCCE[CC_id],
|
UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status);
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status);
|
|
||||||
|
|
||||||
|
|
||||||
// Note this code is for a specific DCI format
|
// Note this code is for a specific DCI format
|
||||||
@@ -641,8 +641,6 @@ schedule_ue_spec(
|
|||||||
|
|
||||||
nb_available_rb -= nb_rb;
|
nb_available_rb -= nb_rb;
|
||||||
aggregation = process_ue_cqi(module_idP,UE_id);
|
aggregation = process_ue_cqi(module_idP,UE_id);
|
||||||
nCCE[CC_id]-=(1<<aggregation); // adjust the remaining nCCE
|
|
||||||
nCCE_used[CC_id] += (1<<aggregation);
|
|
||||||
|
|
||||||
|
|
||||||
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb;
|
PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb;
|
||||||
@@ -789,7 +787,6 @@ schedule_ue_spec(
|
|||||||
UE_list->eNB_UE_stats[CC_id][UE_id].num_retransmission+=1;
|
UE_list->eNB_UE_stats[CC_id][UE_id].num_retransmission+=1;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_retx=nb_rb;
|
UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_retx=nb_rb;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_retx+=nb_rb;
|
UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_retx+=nb_rb;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].ncce_used_retx=nCCE[CC_id];
|
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1=eNB_UE_stats->dlsch_mcs1;
|
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1=eNB_UE_stats->dlsch_mcs1;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2=eNB_UE_stats->dlsch_mcs1;
|
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2=eNB_UE_stats->dlsch_mcs1;
|
||||||
} else {
|
} else {
|
||||||
@@ -806,29 +803,7 @@ schedule_ue_spec(
|
|||||||
// check first for RLC data on DCCH
|
// check first for RLC data on DCCH
|
||||||
// add the length for all the control elements (timing adv, drx, etc) : header + payload
|
// add the length for all the control elements (timing adv, drx, etc) : header + payload
|
||||||
|
|
||||||
//#ifndef EXMIMO_IOT
|
ta_len = (ue_sched_ctl->ta_update!=0) ? 2 : 0;
|
||||||
// to be checked by RK, NN, FK
|
|
||||||
uint8_t update_TA=4;
|
|
||||||
|
|
||||||
switch (frame_parms[CC_id]->N_RB_DL) {
|
|
||||||
case 6:
|
|
||||||
update_TA = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
update_TA = 4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 50:
|
|
||||||
update_TA = 8;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 100:
|
|
||||||
update_TA = 16;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ta_len = ((eNB_UE_stats->timing_advance_update/update_TA)!=0) ? 2 : 0;
|
|
||||||
|
|
||||||
header_len_dcch = 2; // 2 bytes DCCH SDU subheader
|
header_len_dcch = 2; // 2 bytes DCCH SDU subheader
|
||||||
|
|
||||||
@@ -1076,11 +1051,6 @@ schedule_ue_spec(
|
|||||||
post_padding = TBS - sdu_length_total - header_len_dcch - header_len_dtch - ta_len ; // 1 is for the postpadding header
|
post_padding = TBS - sdu_length_total - header_len_dcch - header_len_dtch - ta_len ; // 1 is for the postpadding header
|
||||||
}
|
}
|
||||||
|
|
||||||
//#ifndef EXMIMO_IOT
|
|
||||||
ta_update = eNB_UE_stats->timing_advance_update/update_TA;
|
|
||||||
/*#else
|
|
||||||
ta_update = 0;
|
|
||||||
#endif*/
|
|
||||||
|
|
||||||
offset = generate_dlsch_header((unsigned char*)UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0],
|
offset = generate_dlsch_header((unsigned char*)UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0],
|
||||||
// offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0],
|
// offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0],
|
||||||
@@ -1088,17 +1058,17 @@ schedule_ue_spec(
|
|||||||
sdu_lengths, //
|
sdu_lengths, //
|
||||||
sdu_lcids,
|
sdu_lcids,
|
||||||
255, // no drx
|
255, // no drx
|
||||||
ta_update, // timing advance
|
ue_sched_ctl->ta_update, // timing advance
|
||||||
NULL, // contention res id
|
NULL, // contention res id
|
||||||
padding,
|
padding,
|
||||||
post_padding);
|
post_padding);
|
||||||
|
|
||||||
//#ifdef DEBUG_eNB_SCHEDULER
|
//#ifdef DEBUG_eNB_SCHEDULER
|
||||||
if (ta_update) {
|
if (ue_sched_ctl->ta_update) {
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
"[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n",
|
"[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n",
|
||||||
module_idP,frameP, UE_id, CC_id, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset,
|
module_idP,frameP, UE_id, CC_id, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset,
|
||||||
ta_update,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch);
|
ue_sched_ctl->ta_update,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch);
|
||||||
}
|
}
|
||||||
|
|
||||||
//#endif
|
//#endif
|
||||||
@@ -1130,8 +1100,6 @@ schedule_ue_spec(
|
|||||||
}
|
}
|
||||||
|
|
||||||
aggregation = process_ue_cqi(module_idP,UE_id);
|
aggregation = process_ue_cqi(module_idP,UE_id);
|
||||||
nCCE[CC_id]-=(1<<aggregation); // adjust the remaining nCCE
|
|
||||||
nCCE_used[CC_id]+=(1<<aggregation); // adjust the remaining nCCE
|
|
||||||
UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = nb_rb;
|
UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = nb_rb;
|
||||||
|
|
||||||
add_ue_dlsch_info(module_idP,
|
add_ue_dlsch_info(module_idP,
|
||||||
@@ -1145,7 +1113,6 @@ schedule_ue_spec(
|
|||||||
|
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used = nb_rb;
|
UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used = nb_rb;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used += nb_rb;
|
UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used += nb_rb;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].ncce_used = nCCE[CC_id];
|
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1=eNB_UE_stats->dlsch_mcs1;
|
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1=eNB_UE_stats->dlsch_mcs1;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2=mcs;
|
UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2=mcs;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].TBS = TBS;
|
UE_list->eNB_UE_stats[CC_id][UE_id].TBS = TBS;
|
||||||
@@ -1166,7 +1133,7 @@ schedule_ue_spec(
|
|||||||
// this is the normalized RX power
|
// this is the normalized RX power
|
||||||
eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti);
|
eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti);
|
||||||
normalized_rx_power = eNB_UE_stats->Po_PUCCH_dBm;
|
normalized_rx_power = eNB_UE_stats->Po_PUCCH_dBm;
|
||||||
target_rx_power = mac_xface->get_target_pucch_rx_power(module_idP,CC_id) + 10;
|
target_rx_power = mac_xface->get_target_pucch_rx_power(module_idP,CC_id) + 20;
|
||||||
|
|
||||||
// this assumes accumulated tpc
|
// this assumes accumulated tpc
|
||||||
// make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
|
// make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
|
||||||
@@ -1178,6 +1145,7 @@ schedule_ue_spec(
|
|||||||
|
|
||||||
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame=frameP;
|
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame=frameP;
|
||||||
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe=subframeP;
|
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe=subframeP;
|
||||||
|
|
||||||
if (normalized_rx_power>(target_rx_power+1)) {
|
if (normalized_rx_power>(target_rx_power+1)) {
|
||||||
tpc = 0; //-1
|
tpc = 0; //-1
|
||||||
tpc_accumulated--;
|
tpc_accumulated--;
|
||||||
@@ -1187,9 +1155,11 @@ schedule_ue_spec(
|
|||||||
} else {
|
} else {
|
||||||
tpc = 1; //0
|
tpc = 1; //0
|
||||||
}
|
}
|
||||||
LOG_D(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n",
|
/*
|
||||||
|
LOG_I(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n",
|
||||||
module_idP,frameP, subframeP,harq_pid,tpc,
|
module_idP,frameP, subframeP,harq_pid,tpc,
|
||||||
tpc_accumulated,normalized_rx_power,target_rx_power);
|
tpc_accumulated,normalized_rx_power,target_rx_power);*/
|
||||||
|
|
||||||
} // Po_PUCCH has been updated
|
} // Po_PUCCH has been updated
|
||||||
else {
|
else {
|
||||||
tpc = 1; //0
|
tpc = 1; //0
|
||||||
@@ -1495,10 +1465,9 @@ schedule_ue_spec(
|
|||||||
if (frame_parms[CC_id]->frame_type == TDD) {
|
if (frame_parms[CC_id]->frame_type == TDD) {
|
||||||
set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms);
|
set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//printf("MAC nCCE : %d\n",*nCCE_used);
|
} // UE_id loop
|
||||||
|
} // CC_id loop
|
||||||
|
|
||||||
|
|
||||||
stop_meas(&eNB->schedule_dlsch);
|
stop_meas(&eNB->schedule_dlsch);
|
||||||
@@ -1509,13 +1478,11 @@ schedule_ue_spec(
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
fill_DLSCH_dci(
|
fill_DLSCH_dci(
|
||||||
module_id_t module_idP,
|
module_id_t module_idP,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t subframeP,
|
sub_frame_t subframeP,
|
||||||
uint32_t* RBallocP,
|
int* mbsfn_flagP
|
||||||
uint8_t RA_scheduledP,
|
)
|
||||||
int* mbsfn_flagP
|
|
||||||
)
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -1523,10 +1490,9 @@ fill_DLSCH_dci(
|
|||||||
int UE_id = -1;
|
int UE_id = -1;
|
||||||
uint8_t first_rb,nb_rb=3;
|
uint8_t first_rb,nb_rb=3;
|
||||||
rnti_t rnti;
|
rnti_t rnti;
|
||||||
unsigned char vrb_map[100];
|
unsigned char *vrb_map;
|
||||||
uint8_t rballoc_sub[25];
|
uint8_t rballoc_sub[25];
|
||||||
//uint8_t number_of_subbands=13;
|
//uint8_t number_of_subbands=13;
|
||||||
uint32_t *rballoc=RBallocP;
|
|
||||||
|
|
||||||
unsigned char round;
|
unsigned char round;
|
||||||
unsigned char harq_pid;
|
unsigned char harq_pid;
|
||||||
@@ -1549,598 +1515,8 @@ fill_DLSCH_dci(
|
|||||||
if (mbsfn_flagP[CC_id]>0)
|
if (mbsfn_flagP[CC_id]>0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu;
|
DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu;
|
||||||
BCCH_alloc_pdu=(void*)&eNB->common_channels[CC_id].BCCH_alloc_pdu;
|
|
||||||
// clear vrb_map
|
|
||||||
memset(vrb_map,0,100);
|
|
||||||
|
|
||||||
|
|
||||||
// SI DLSCH
|
|
||||||
// printf("BCCH check\n");
|
|
||||||
if (eNB->common_channels[CC_id].bcch_active == 1) {
|
|
||||||
eNB->common_channels[CC_id].bcch_active = 0;
|
|
||||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d: BCCH active\n", module_idP, CC_id, frameP, subframeP);
|
|
||||||
// randomize frequency allocation for SI
|
|
||||||
first_rb = 10;//(unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
|
|
||||||
|
|
||||||
/* Where is this from, should be removed!!!!
|
|
||||||
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
BCCH_alloc_pdu_fdd.rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(BCCH_alloc_pdu_fdd.vrb_type,BCCH_alloc_pdu_fdd.rballoc);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
vrb_map[first_rb] = 1;
|
|
||||||
vrb_map[first_rb+1] = 1;
|
|
||||||
vrb_map[first_rb+2] = 1;
|
|
||||||
vrb_map[first_rb+3] = 1;
|
|
||||||
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
|
||||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
|
||||||
case 6:
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0;
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc);
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
BCCH_alloc_pdu,
|
|
||||||
SI_RNTI,
|
|
||||||
sizeof(DCI1A_1_5MHz_TDD_1_6_t),
|
|
||||||
2,
|
|
||||||
sizeof_DCI1A_1_5MHz_TDD_1_6_t,
|
|
||||||
format1A,0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0;
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc);
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
BCCH_alloc_pdu,
|
|
||||||
SI_RNTI,
|
|
||||||
sizeof(DCI1A_5MHz_TDD_1_6_t),
|
|
||||||
2,
|
|
||||||
sizeof_DCI1A_5MHz_TDD_1_6_t,
|
|
||||||
format1A,0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 50:
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0;
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc);
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
BCCH_alloc_pdu,
|
|
||||||
SI_RNTI,
|
|
||||||
sizeof(DCI1A_10MHz_TDD_1_6_t),
|
|
||||||
2,
|
|
||||||
sizeof_DCI1A_10MHz_TDD_1_6_t,
|
|
||||||
format1A,0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 100:
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0;
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc);
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
BCCH_alloc_pdu,
|
|
||||||
SI_RNTI,
|
|
||||||
sizeof(DCI1A_20MHz_TDD_1_6_t),
|
|
||||||
2,
|
|
||||||
sizeof_DCI1A_20MHz_TDD_1_6_t,
|
|
||||||
format1A,0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
|
||||||
case 6:
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0;
|
|
||||||
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc);
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
BCCH_alloc_pdu,
|
|
||||||
SI_RNTI,
|
|
||||||
sizeof(DCI1A_1_5MHz_FDD_t),
|
|
||||||
2,
|
|
||||||
sizeof_DCI1A_1_5MHz_FDD_t,
|
|
||||||
format1A,0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0;
|
|
||||||
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc);
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
BCCH_alloc_pdu,
|
|
||||||
SI_RNTI,
|
|
||||||
sizeof(DCI1A_5MHz_FDD_t),
|
|
||||||
2,
|
|
||||||
sizeof_DCI1A_5MHz_FDD_t,
|
|
||||||
format1A,0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 50:
|
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->type = 1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0;
|
|
||||||
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc);
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
BCCH_alloc_pdu,
|
|
||||||
SI_RNTI,
|
|
||||||
sizeof(DCI1A_10MHz_FDD_t),
|
|
||||||
2,
|
|
||||||
sizeof_DCI1A_10MHz_FDD_t,
|
|
||||||
format1A,0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 100:
|
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->type = 1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0;
|
|
||||||
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc);
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
BCCH_alloc_pdu,
|
|
||||||
SI_RNTI,
|
|
||||||
sizeof(DCI1A_20MHz_FDD_t),
|
|
||||||
2,
|
|
||||||
sizeof_DCI1A_20MHz_FDD_t,
|
|
||||||
format1A,0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RA_scheduledP == 1) {
|
|
||||||
for (i=0; i<NB_RA_PROC_MAX; i++) {
|
|
||||||
|
|
||||||
RA_template = &eNB->common_channels[CC_id].RA_template[i];
|
|
||||||
|
|
||||||
if (RA_template->generate_rar == 1) {
|
|
||||||
|
|
||||||
//FK: postponed to fill_rar
|
|
||||||
//RA_template->generate_rar = 0;
|
|
||||||
|
|
||||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generating RAR DCI (proc %d), RA_active %d format 1A (%d,%d))\n",
|
|
||||||
module_idP, CC_id, frameP, subframeP,i,
|
|
||||||
RA_template->RA_active,
|
|
||||||
RA_template->RA_dci_fmt1,
|
|
||||||
RA_template->RA_dci_size_bits1);
|
|
||||||
|
|
||||||
// randomize frequency allocation for RA
|
|
||||||
while (1) {
|
|
||||||
first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
|
|
||||||
|
|
||||||
if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
vrb_map[first_rb] = 1;
|
|
||||||
vrb_map[first_rb+1] = 1;
|
|
||||||
vrb_map[first_rb+2] = 1;
|
|
||||||
vrb_map[first_rb+3] = 1;
|
|
||||||
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
|
||||||
switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
|
||||||
case 6:
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 50:
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 100:
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
|
||||||
case 6:
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 50:
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 100:
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type,
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
add_common_dci(DCI_pdu,
|
|
||||||
(void*)&RA_template->RA_alloc_pdu1[0],
|
|
||||||
RA_template->RA_rnti,
|
|
||||||
RA_template->RA_dci_size_bytes1,
|
|
||||||
2,
|
|
||||||
RA_template->RA_dci_size_bits1,
|
|
||||||
RA_template->RA_dci_fmt1,
|
|
||||||
1);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d: Adding common dci for RA%d (RAR) RA_active %d\n",
|
|
||||||
module_idP,CC_id,frameP,i, RA_template->RA_active);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RA_template->generate_Msg4_dci == 1) {
|
|
||||||
|
|
||||||
// randomize frequency allocation for RA
|
|
||||||
while (1) {
|
|
||||||
first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
|
|
||||||
|
|
||||||
if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
vrb_map[first_rb] = 1;
|
|
||||||
vrb_map[first_rb+1] = 1;
|
|
||||||
vrb_map[first_rb+2] = 1;
|
|
||||||
vrb_map[first_rb+3] = 1;
|
|
||||||
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
|
||||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
|
||||||
case 6:
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 50:
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 100:
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
|
||||||
|
|
||||||
case 6:
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 50:
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 100:
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0;
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1;
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
add_ue_spec_dci(DCI_pdu,
|
|
||||||
(void*)&RA_template->RA_alloc_pdu2[0],
|
|
||||||
RA_template->rnti,
|
|
||||||
RA_template->RA_dci_size_bytes2,
|
|
||||||
1,
|
|
||||||
RA_template->RA_dci_size_bits2,
|
|
||||||
RA_template->RA_dci_fmt2,
|
|
||||||
0);
|
|
||||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Adding ue specific dci (rnti %x) for Msg4\n",
|
|
||||||
module_idP,CC_id,frameP,subframeP,RA_template->rnti);
|
|
||||||
RA_template->generate_Msg4_dci=0;
|
|
||||||
|
|
||||||
} else if (RA_template->wait_ack_Msg4==1) {
|
|
||||||
// check HARQ status and retransmit if necessary
|
|
||||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Checking if Msg4 was acknowledged: \n",
|
|
||||||
module_idP,CC_id,frameP,subframeP);
|
|
||||||
// Get candidate harq_pid from PHY
|
|
||||||
mac_xface->get_ue_active_harq_pid(module_idP,CC_id,RA_template->rnti,frameP,subframeP,&harq_pid,&round,0);
|
|
||||||
|
|
||||||
if (round>0) {
|
|
||||||
//RA_template->wait_ack_Msg4++;
|
|
||||||
// we have to schedule a retransmission
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
|
||||||
} else {
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// randomize frequency allocation for RA
|
|
||||||
while (1) {
|
|
||||||
first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
|
|
||||||
|
|
||||||
if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
vrb_map[first_rb] = 1;
|
|
||||||
vrb_map[first_rb+1] = 1;
|
|
||||||
vrb_map[first_rb+2] = 1;
|
|
||||||
vrb_map[first_rb+3] = 1;
|
|
||||||
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
} else {
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4);
|
|
||||||
rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type,
|
|
||||||
((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc);
|
|
||||||
}
|
|
||||||
|
|
||||||
add_ue_spec_dci(DCI_pdu,
|
|
||||||
(void*)&RA_template->RA_alloc_pdu2[0],
|
|
||||||
RA_template->rnti,
|
|
||||||
RA_template->RA_dci_size_bytes2,
|
|
||||||
2,
|
|
||||||
RA_template->RA_dci_size_bits2,
|
|
||||||
RA_template->RA_dci_fmt2,
|
|
||||||
0);
|
|
||||||
LOG_W(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Msg4 not acknowledged, adding ue specific dci (rnti %x) for RA (Msg4 Retransmission)\n",
|
|
||||||
module_idP,CC_id,frameP,subframeP,RA_template->rnti);
|
|
||||||
} else {
|
|
||||||
/* msg4 not received
|
|
||||||
if ((round == 0) && (RA_template->wait_ack_Msg4>1){
|
|
||||||
remove UE instance across all the layers: mac_xface->cancel_RA();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,CC_id,frameP,subframeP);
|
|
||||||
RA_template->wait_ack_Msg4=0;
|
|
||||||
RA_template->RA_active=FALSE;
|
|
||||||
UE_id = find_UE_id(module_idP,RA_template->rnti);
|
|
||||||
DevAssert( UE_id != -1 );
|
|
||||||
eNB_mac_inst[module_idP].UE_list.UE_template[UE_PCCID(module_idP,UE_id)][UE_id].configured=TRUE;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // RA is scheduled in this subframeP
|
|
||||||
|
|
||||||
|
|
||||||
// UE specific DCIs
|
// UE specific DCIs
|
||||||
for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
|
for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
|
||||||
@@ -2161,11 +1537,6 @@ fill_DLSCH_dci(
|
|||||||
/// Synchronizing rballoc with rballoc_sub
|
/// Synchronizing rballoc with rballoc_sub
|
||||||
for(i=0; i<PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RBG; i++) {
|
for(i=0; i<PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RBG; i++) {
|
||||||
rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i];
|
rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i];
|
||||||
|
|
||||||
if(rballoc_sub[i] == 1) {
|
|
||||||
rballoc[CC_id] |= (0x0001<<i); // TO be FIXED!!!!!!
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(mac_xface->get_transmission_mode(module_idP,CC_id,rnti)) {
|
switch(mac_xface->get_transmission_mode(module_idP,CC_id,rnti)) {
|
||||||
@@ -2174,7 +1545,7 @@ fill_DLSCH_dci(
|
|||||||
case 1:
|
case 1:
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
LOG_D(MAC,"[eNB %d] CC_id %d Adding UE %d spec DCI for %d PRBS (rb alloc: %x) \n",module_idP, CC_id, UE_id, nb_rb,rballoc);
|
LOG_D(MAC,"[eNB %d] CC_id %d Adding UE %d spec DCI for %d PRBS \n",module_idP, CC_id, UE_id, nb_rb);
|
||||||
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
||||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||||
@@ -2267,7 +1638,7 @@ fill_DLSCH_dci(
|
|||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
LOG_D(MAC,"[eNB %d] CC_id %d Adding Format 2A UE %d spec DCI for %d PRBS (rb alloc: %x) \n",
|
LOG_D(MAC,"[eNB %d] CC_id %d Adding Format 2A UE %d spec DCI for %d PRBS (rb alloc: %x) \n",
|
||||||
module_idP, CC_id, UE_id, nb_rb,rballoc);
|
module_idP, CC_id, UE_id, nb_rb);
|
||||||
|
|
||||||
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
|
||||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||||
|
|||||||
@@ -267,6 +267,7 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP)
|
|||||||
UE_list->ordered_ULCCids[0][UE_id] = cc_idP;
|
UE_list->ordered_ULCCids[0][UE_id] = cc_idP;
|
||||||
UE_list->num_UEs++;
|
UE_list->num_UEs++;
|
||||||
UE_list->active[UE_id] = TRUE;
|
UE_list->active[UE_id] = TRUE;
|
||||||
|
memset((void*)&UE_list->UE_sched_ctrl[UE_id],0,sizeof(UE_sched_ctrl));
|
||||||
|
|
||||||
for (j=0; j<8; j++) {
|
for (j=0; j<8; j++) {
|
||||||
UE_list->UE_template[cc_idP][UE_id].oldNDI[j] = (j==0)?1:0; // 1 because first transmission is with format1A (Msg4) for harq_pid 0
|
UE_list->UE_template[cc_idP][UE_id].oldNDI[j] = (j==0)?1:0; // 1 because first transmission is with format1A (Msg4) for harq_pid 0
|
||||||
@@ -879,3 +880,230 @@ int get_nb_subband(void)
|
|||||||
return nb_sb;
|
return nb_sb;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void init_CCE_table(int module_idP,int CC_idP)
|
||||||
|
{
|
||||||
|
memset(eNB_mac_inst[module_idP].CCE_table[CC_idP],0,800*sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int get_nCCE_offset(int *CCE_table,
|
||||||
|
const unsigned char L,
|
||||||
|
const int nCCE,
|
||||||
|
const int common_dci,
|
||||||
|
const unsigned short rnti,
|
||||||
|
const unsigned char subframe)
|
||||||
|
{
|
||||||
|
|
||||||
|
int search_space_free,m,nb_candidates = 0,l,i;
|
||||||
|
unsigned int Yk;
|
||||||
|
/*
|
||||||
|
printf("CCE Allocation: ");
|
||||||
|
for (i=0;i<nCCE;i++)
|
||||||
|
printf("%d.",CCE_table[i]);
|
||||||
|
printf("\n");
|
||||||
|
*/
|
||||||
|
if (common_dci == 1) {
|
||||||
|
// check CCE(0 ... L-1)
|
||||||
|
nb_candidates = (L==4) ? 4 : 2;
|
||||||
|
nb_candidates = min(nb_candidates,nCCE/L);
|
||||||
|
|
||||||
|
// printf("Common DCI nb_candidates %d, L %d\n",nb_candidates,L);
|
||||||
|
|
||||||
|
for (m = nb_candidates-1 ; m >=0 ; m--) {
|
||||||
|
|
||||||
|
search_space_free = 1;
|
||||||
|
for (l=0; l<L; l++) {
|
||||||
|
|
||||||
|
// printf("CCE_table[%d] %d\n",(m*L)+l,CCE_table[(m*L)+l]);
|
||||||
|
if (CCE_table[(m*L) + l] == 1) {
|
||||||
|
search_space_free = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search_space_free == 1) {
|
||||||
|
|
||||||
|
// printf("returning %d\n",m*L);
|
||||||
|
|
||||||
|
for (l=0; l<L; l++)
|
||||||
|
CCE_table[(m*L)+l]=1;
|
||||||
|
return(m*L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
} else { // Find first available in ue specific search space
|
||||||
|
// according to procedure in Section 9.1.1 of 36.213 (v. 8.6)
|
||||||
|
// compute Yk
|
||||||
|
Yk = (unsigned int)rnti;
|
||||||
|
|
||||||
|
for (i=0; i<=subframe; i++)
|
||||||
|
Yk = (Yk*39827)%65537;
|
||||||
|
|
||||||
|
Yk = Yk % (nCCE/L);
|
||||||
|
|
||||||
|
|
||||||
|
switch (L) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
nb_candidates = 6;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
case 8:
|
||||||
|
nb_candidates = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DevParam(L, nCCE, rnti);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(MAC,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates);
|
||||||
|
|
||||||
|
for (m = 0 ; m < nb_candidates ; m++) {
|
||||||
|
search_space_free = 1;
|
||||||
|
|
||||||
|
for (l=0; l<L; l++) {
|
||||||
|
if (CCE_table[(((Yk+m)%(nCCE/L))*L) + l] == 1) {
|
||||||
|
search_space_free = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search_space_free == 1) {
|
||||||
|
for (l=0; l<L; l++)
|
||||||
|
CCE_table[(((Yk+m)%(nCCE/L))*L)+l]=1;
|
||||||
|
|
||||||
|
return(((Yk+m)%(nCCE/L))*L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allocate the CCEs
|
||||||
|
int allocate_CCEs(int module_idP,
|
||||||
|
int CC_idP,
|
||||||
|
int subframeP,
|
||||||
|
int test_onlyP) {
|
||||||
|
|
||||||
|
|
||||||
|
int *CCE_table = eNB_mac_inst[module_idP].CCE_table[CC_idP];
|
||||||
|
DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_idP].DCI_pdu;
|
||||||
|
int nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,DCI_pdu->num_pdcch_symbols,subframeP);
|
||||||
|
int fCCE;
|
||||||
|
int i,j;
|
||||||
|
int allocation_is_feasible = 1;
|
||||||
|
DCI_ALLOC_t *dci_alloc;
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(MAC,"Allocate CCEs subframe %d, test %d : (common %d,uspec %d)\n",subframeP,test_onlyP,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
|
||||||
|
|
||||||
|
init_CCE_table(module_idP,CC_idP);
|
||||||
|
DCI_pdu->nCCE=0;
|
||||||
|
|
||||||
|
while (allocation_is_feasible == 1) {
|
||||||
|
|
||||||
|
for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci;i++) {
|
||||||
|
dci_alloc = &DCI_pdu->dci_alloc[i];
|
||||||
|
LOG_D(MAC,"Trying to allocate DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
|
||||||
|
i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,
|
||||||
|
DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci,
|
||||||
|
dci_alloc->rnti,1<<dci_alloc->L,
|
||||||
|
DCI_pdu->nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
|
||||||
|
|
||||||
|
if (DCI_pdu->nCCE + (1<<dci_alloc->L) > nCCE_max) {
|
||||||
|
if (DCI_pdu->num_pdcch_symbols == 3)
|
||||||
|
allocation_is_feasible = 0;
|
||||||
|
else {
|
||||||
|
DCI_pdu->num_pdcch_symbols++;
|
||||||
|
nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,DCI_pdu->num_pdcch_symbols,subframeP);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else { // number of CCEs left can potentially hold this allocation
|
||||||
|
if ((fCCE = get_nCCE_offset(CCE_table,
|
||||||
|
1<<(dci_alloc->L),
|
||||||
|
nCCE_max,
|
||||||
|
(i<DCI_pdu->Num_common_dci) ? 1 : 0,
|
||||||
|
dci_alloc->rnti,
|
||||||
|
subframeP))>=0) {// the allocation is feasible, rnti rule passes
|
||||||
|
|
||||||
|
LOG_D(MAC,"Allocating at nCCE %d\n",fCCE);
|
||||||
|
if (test_onlyP == 0) {
|
||||||
|
DCI_pdu->nCCE += (1<<dci_alloc->L);
|
||||||
|
dci_alloc->firstCCE=fCCE;
|
||||||
|
LOG_D(MAC,"Allocate CCEs subframe %d, test %d\n",subframeP,test_onlyP);
|
||||||
|
}
|
||||||
|
} // fCCE>=0
|
||||||
|
else {
|
||||||
|
if (DCI_pdu->num_pdcch_symbols == 3) {
|
||||||
|
allocation_is_feasible = 0;
|
||||||
|
LOG_I(MAC,"subframe %d: Dropping Allocation for RNTI %x\n",
|
||||||
|
subframeP,dci_alloc->rnti);
|
||||||
|
for (j=0;j<=i;j++){
|
||||||
|
|
||||||
|
LOG_I(MAC,"DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
|
||||||
|
i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,
|
||||||
|
DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci,
|
||||||
|
DCI_pdu->dci_alloc[j].rnti,DCI_pdu->dci_alloc[j].format,
|
||||||
|
1<<DCI_pdu->dci_alloc[j].L,
|
||||||
|
DCI_pdu->nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DCI_pdu->num_pdcch_symbols++;
|
||||||
|
nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,DCI_pdu->num_pdcch_symbols,subframeP);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} // fCCE==-1
|
||||||
|
} // nCCE <= nCCE_max
|
||||||
|
} // for i = 0 ... num_dcis
|
||||||
|
if (allocation_is_feasible==1)
|
||||||
|
return (0);
|
||||||
|
} // allocation_is_feasible == 1
|
||||||
|
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean_t CCE_allocation_infeasible(int module_idP,
|
||||||
|
int CC_idP,
|
||||||
|
int common_flag,
|
||||||
|
int subframe,
|
||||||
|
int aggregation,
|
||||||
|
int rnti) {
|
||||||
|
|
||||||
|
|
||||||
|
DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_idP].DCI_pdu;
|
||||||
|
DCI_ALLOC_t *dci_alloc;
|
||||||
|
int ret;
|
||||||
|
boolean_t res=FALSE;
|
||||||
|
|
||||||
|
if (common_flag==1) {
|
||||||
|
DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci].rnti = rnti;
|
||||||
|
DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci].L = aggregation;
|
||||||
|
DCI_pdu->Num_common_dci++;
|
||||||
|
ret = allocate_CCEs(module_idP,CC_idP,subframe,1);
|
||||||
|
if (ret==-1)
|
||||||
|
res = TRUE;
|
||||||
|
DCI_pdu->Num_common_dci--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci].rnti = rnti;
|
||||||
|
DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci].L = aggregation;
|
||||||
|
DCI_pdu->Num_ue_spec_dci++;
|
||||||
|
ret = allocate_CCEs(module_idP,CC_idP,subframe,1);
|
||||||
|
if (ret==-1)
|
||||||
|
res = TRUE;
|
||||||
|
DCI_pdu->Num_ue_spec_dci--;
|
||||||
|
}
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ void rx_sdu(
|
|||||||
int ii,j;
|
int ii,j;
|
||||||
eNB_MAC_INST *eNB = &eNB_mac_inst[enb_mod_idP];
|
eNB_MAC_INST *eNB = &eNB_mac_inst[enb_mod_idP];
|
||||||
UE_list_t *UE_list= &eNB->UE_list;
|
UE_list_t *UE_list= &eNB->UE_list;
|
||||||
|
int crnti_rx=0;
|
||||||
|
|
||||||
start_meas(&eNB->rx_ulsch_sdu);
|
start_meas(&eNB->rx_ulsch_sdu);
|
||||||
|
|
||||||
@@ -126,13 +127,11 @@ void rx_sdu(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CRNTI:
|
case CRNTI:
|
||||||
LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d (ce %d/%d): Received CRNTI %2.2x%2.2x\n",
|
|
||||||
enb_mod_idP, CC_idP, rx_ces[i], i,num_ce, payload_ptr[0], payload_ptr[1]);
|
|
||||||
UE_id = find_UE_id(enb_mod_idP,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]);
|
UE_id = find_UE_id(enb_mod_idP,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]);
|
||||||
LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : CRNTI %x (UE_id %d) in Msg3\n",enb_mod_idP, CC_idP, rx_ces[i], (((uint16_t)payload_ptr[0])<<8) + payload_ptr[1],UE_id);
|
LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d (ce %d/%d): CRNTI %x (UE_id %d) in Msg3\n",enb_mod_idP, CC_idP, rx_ces[i], i,num_ce,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1],UE_id);
|
||||||
|
crnti_rx=1;
|
||||||
payload_ptr+=2;
|
payload_ptr+=2;
|
||||||
/* we don't process this CE yet */
|
|
||||||
if (msg3_flagP != NULL) {
|
if (msg3_flagP != NULL) {
|
||||||
*msg3_flagP = 0;
|
*msg3_flagP = 0;
|
||||||
}
|
}
|
||||||
@@ -146,6 +145,9 @@ void rx_sdu(
|
|||||||
LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n",
|
LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n",
|
||||||
enb_mod_idP, CC_idP, rx_ces[i], lcgid, payload_ptr[0] & 0x3f);
|
enb_mod_idP, CC_idP, rx_ces[i], lcgid, payload_ptr[0] & 0x3f);
|
||||||
|
|
||||||
|
if (crnti_rx==1)
|
||||||
|
LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n",
|
||||||
|
enb_mod_idP, CC_idP, rx_ces[i], lcgid, payload_ptr[0] & 0x3f);
|
||||||
if (UE_id != -1) {
|
if (UE_id != -1) {
|
||||||
|
|
||||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
|
UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
|
||||||
@@ -177,6 +179,15 @@ void rx_sdu(
|
|||||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1],
|
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1],
|
||||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2],
|
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2],
|
||||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]);
|
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]);
|
||||||
|
if (crnti_rx==1)
|
||||||
|
LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = "
|
||||||
|
"%u LCGID2 = %u LCGID3 = %u\n",
|
||||||
|
enb_mod_idP, CC_idP,
|
||||||
|
rx_ces[i],
|
||||||
|
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0],
|
||||||
|
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1],
|
||||||
|
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2],
|
||||||
|
UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]);
|
||||||
|
|
||||||
if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] == 0 ) {
|
if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] == 0 ) {
|
||||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0]=0;
|
UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0]=0;
|
||||||
@@ -223,7 +234,7 @@ void rx_sdu(
|
|||||||
payload_ptr[0],payload_ptr[1],payload_ptr[2],payload_ptr[3],payload_ptr[4], payload_ptr[5], rntiP);
|
payload_ptr[0],payload_ptr[1],payload_ptr[2],payload_ptr[3],payload_ptr[4], payload_ptr[5], rntiP);
|
||||||
|
|
||||||
for (ii=0; ii<NB_RA_PROC_MAX; ii++) {
|
for (ii=0; ii<NB_RA_PROC_MAX; ii++) {
|
||||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %p Checking proc %d : rnti (%x, %x), active %d\n",
|
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Checking proc %d : rnti (%x, %x), active %d\n",
|
||||||
enb_mod_idP, CC_idP, ii,
|
enb_mod_idP, CC_idP, ii,
|
||||||
eNB->common_channels[CC_idP].RA_template[ii].rnti, rntiP,
|
eNB->common_channels[CC_idP].RA_template[ii].rnti, rntiP,
|
||||||
eNB->common_channels[CC_idP].RA_template[ii].RA_active);
|
eNB->common_channels[CC_idP].RA_template[ii].RA_active);
|
||||||
@@ -236,7 +247,7 @@ void rx_sdu(
|
|||||||
if (UE_id < 0) {
|
if (UE_id < 0) {
|
||||||
memcpy(&eNB->common_channels[CC_idP].RA_template[ii].cont_res_id[0],payload_ptr,6);
|
memcpy(&eNB->common_channels[CC_idP].RA_template[ii].cont_res_id[0],payload_ptr,6);
|
||||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3: length %d, offset %d\n",
|
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3: length %d, offset %d\n",
|
||||||
enb_mod_idP,CC_idP,frameP,rx_lengths[ii],payload_ptr-sduP);
|
enb_mod_idP,CC_idP,frameP,rx_lengths[i],payload_ptr-sduP);
|
||||||
|
|
||||||
if ((UE_id=add_new_ue(enb_mod_idP,CC_idP,eNB->common_channels[CC_idP].RA_template[ii].rnti,harq_pidP)) == -1 ) {
|
if ((UE_id=add_new_ue(enb_mod_idP,CC_idP,eNB->common_channels[CC_idP].RA_template[ii].rnti,harq_pidP)) == -1 ) {
|
||||||
mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n");
|
mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n");
|
||||||
@@ -246,7 +257,7 @@ void rx_sdu(
|
|||||||
enb_mod_idP,CC_idP,frameP,eNB->common_channels[CC_idP].RA_template[ii].rnti,UE_id);
|
enb_mod_idP,CC_idP,frameP,eNB->common_channels[CC_idP].RA_template[ii].rnti,UE_id);
|
||||||
} else {
|
} else {
|
||||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3 from already registered UE %d: length %d, offset %d\n",
|
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3 from already registered UE %d: length %d, offset %d\n",
|
||||||
enb_mod_idP,CC_idP,frameP,UE_id,rx_lengths[ii],payload_ptr-sduP);
|
enb_mod_idP,CC_idP,frameP,UE_id,rx_lengths[i],payload_ptr-sduP);
|
||||||
// kill RA procedure
|
// kill RA procedure
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,7 +269,7 @@ void rx_sdu(
|
|||||||
rntiP,
|
rntiP,
|
||||||
CCCH,
|
CCCH,
|
||||||
(uint8_t*)payload_ptr,
|
(uint8_t*)payload_ptr,
|
||||||
rx_lengths[ii],
|
rx_lengths[i],
|
||||||
ENB_FLAG_YES,
|
ENB_FLAG_YES,
|
||||||
enb_mod_idP,
|
enb_mod_idP,
|
||||||
0);
|
0);
|
||||||
@@ -297,17 +308,17 @@ void rx_sdu(
|
|||||||
enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id, rx_lcids[i]);
|
enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id, rx_lcids[i]);
|
||||||
|
|
||||||
mac_rlc_data_ind(
|
mac_rlc_data_ind(
|
||||||
enb_mod_idP,
|
enb_mod_idP,
|
||||||
rntiP,
|
rntiP,
|
||||||
enb_mod_idP,
|
enb_mod_idP,
|
||||||
frameP,
|
frameP,
|
||||||
ENB_FLAG_YES,
|
ENB_FLAG_YES,
|
||||||
MBMS_FLAG_NO,
|
MBMS_FLAG_NO,
|
||||||
rx_lcids[i],
|
rx_lcids[i],
|
||||||
(char *)payload_ptr,
|
(char *)payload_ptr,
|
||||||
rx_lengths[i],
|
rx_lengths[i],
|
||||||
1,
|
1,
|
||||||
NULL);//(unsigned int*)crc_status);
|
NULL);//(unsigned int*)crc_status);
|
||||||
UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1;
|
UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1;
|
||||||
UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i];
|
UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i];
|
||||||
}
|
}
|
||||||
@@ -596,12 +607,14 @@ unsigned char *parse_ulsch_header(unsigned char *mac_header,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void schedule_ulsch(module_id_t module_idP, frame_t frameP,unsigned char cooperation_flag,sub_frame_t subframeP, unsigned char sched_subframe,
|
void schedule_ulsch(module_id_t module_idP,
|
||||||
unsigned int *nCCE) //,int calibration_flag) {
|
frame_t frameP,
|
||||||
{
|
unsigned char cooperation_flag,
|
||||||
|
sub_frame_t subframeP,
|
||||||
|
unsigned char sched_subframe) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int nCCE_available[MAX_NUM_CCs];
|
|
||||||
uint16_t first_rb[MAX_NUM_CCs],i;
|
uint16_t first_rb[MAX_NUM_CCs],i;
|
||||||
int CC_id;
|
int CC_id;
|
||||||
eNB_MAC_INST *eNB=&eNB_mac_inst[module_idP];
|
eNB_MAC_INST *eNB=&eNB_mac_inst[module_idP];
|
||||||
@@ -612,7 +625,6 @@ void schedule_ulsch(module_id_t module_idP, frame_t frameP,unsigned char coopera
|
|||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
|
|
||||||
first_rb[CC_id] = 1;
|
first_rb[CC_id] = 1;
|
||||||
nCCE_available[CC_id] = mac_xface->get_nCCE_max(module_idP,CC_id) - nCCE[CC_id];
|
|
||||||
|
|
||||||
// UE data info;
|
// UE data info;
|
||||||
// check which UE has data to transmit
|
// check which UE has data to transmit
|
||||||
@@ -644,10 +656,10 @@ void schedule_ulsch(module_id_t module_idP, frame_t frameP,unsigned char coopera
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
schedule_ulsch_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe, nCCE, nCCE_available, first_rb);
|
schedule_ulsch_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe,first_rb);
|
||||||
|
|
||||||
#ifdef CBA
|
#ifdef CBA
|
||||||
schedule_ulsch_cba_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe, nCCE, nCCE_available, first_rb);
|
schedule_ulsch_cba_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe, first_rb);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -662,8 +674,6 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t subframeP,
|
sub_frame_t subframeP,
|
||||||
unsigned char sched_subframe,
|
unsigned char sched_subframe,
|
||||||
unsigned int *nCCE,
|
|
||||||
unsigned int *nCCE_available,
|
|
||||||
uint16_t *first_rb)
|
uint16_t *first_rb)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -697,8 +707,7 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
frameP,
|
frameP,
|
||||||
subframeP,
|
subframeP,
|
||||||
first_rb,
|
first_rb,
|
||||||
aggregation,
|
aggregation);
|
||||||
nCCE);
|
|
||||||
|
|
||||||
// LOG_I(MAC,"exiting ulsch preprocesor\n");
|
// LOG_I(MAC,"exiting ulsch preprocesor\n");
|
||||||
|
|
||||||
@@ -729,11 +738,12 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
continue; // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n");
|
continue; // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nCCE_available[CC_id] < (1<<aggregation)) {
|
if (CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti)) {
|
||||||
LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d CC %d: not enough nCCE (%d)\n", module_idP,frameP,subframeP,UE_id,CC_id,nCCE_available[CC_id]);
|
LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id);
|
||||||
continue; // break;
|
continue; // break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// printf("UE %d/%x is feasible, mode %s\n",UE_id,rnti,mode_string[eNB_UE_stats->mode]);
|
||||||
|
|
||||||
if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel
|
if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel
|
||||||
|
|
||||||
@@ -747,9 +757,10 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
//should we continue or set harq_pid to 0?
|
//should we continue or set harq_pid to 0?
|
||||||
continue;
|
continue;
|
||||||
} else
|
} else
|
||||||
LOG_T(MAC,"[eNB %d] Frame %d, subframeP %d, UE %d CC %d : got harq pid %d round %d (nCCE %d, rnti %x,mode %s)\n",
|
LOG_T(MAC,"[eNB %d] Frame %d, subframeP %d, UE %d CC %d : got harq pid %d round %d (rnti %x,mode %s)\n",
|
||||||
module_idP,frameP,subframeP,UE_id,CC_id, harq_pid, round,nCCE[CC_id],rnti,mode_string[eNB_UE_stats->mode]);
|
module_idP,frameP,subframeP,UE_id,CC_id, harq_pid, round,rnti,mode_string[eNB_UE_stats->mode]);
|
||||||
|
|
||||||
|
//#undef EXMIMO_IOT
|
||||||
#ifndef EXMIMO_IOT
|
#ifndef EXMIMO_IOT
|
||||||
|
|
||||||
if (((UE_is_to_be_scheduled(module_idP,CC_id,UE_id)>0)) || (round>0) || ((frameP%10)==0))
|
if (((UE_is_to_be_scheduled(module_idP,CC_id,UE_id)>0)) || (round>0) || ((frameP%10)==0))
|
||||||
@@ -1088,9 +1099,6 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
subframeP,
|
subframeP,
|
||||||
S_UL_SCHEDULED);
|
S_UL_SCHEDULED);
|
||||||
|
|
||||||
nCCE[CC_id] = nCCE[CC_id] + (1<<aggregation);
|
|
||||||
nCCE_available[CC_id] = mac_xface->get_nCCE_max(module_idP,CC_id) - nCCE[CC_id];
|
|
||||||
|
|
||||||
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for next UE_id %d, format 0\n", module_idP,CC_id,frameP,subframeP,UE_id);
|
LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for next UE_id %d, format 0\n", module_idP,CC_id,frameP,subframeP,UE_id);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
dump_dci(frame_parms, &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]);
|
dump_dci(frame_parms, &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]);
|
||||||
@@ -1103,8 +1111,7 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CBA
|
#ifdef CBA
|
||||||
void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_flag, frame_t frameP, sub_frame_t subframeP, unsigned char sched_subframe, unsigned int *nCCE,
|
void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_flag, frame_t frameP, sub_frame_t subframeP, unsigned char sched_subframe, uint16_t *first_rb)
|
||||||
unsigned int *nCCE_available, uint16_t *first_rb)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
||||||
@@ -1163,11 +1170,11 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
|
|||||||
// cba group template uses the exisitng UE template, and thus if a UE
|
// cba group template uses the exisitng UE template, and thus if a UE
|
||||||
// is scheduled, the correspodning group can't be used for CBA
|
// is scheduled, the correspodning group can't be used for CBA
|
||||||
// this can be fixed later
|
// this can be fixed later
|
||||||
if ((total_groups > 0) && (nCCE[CC_id] == 0)) {
|
if (total_groups > 0) {
|
||||||
DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
|
DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
|
||||||
|
|
||||||
for (cba_group=0;
|
for (cba_group=0;
|
||||||
(cba_group<total_groups) && (nCCE_available[CC_id]* (total_cba_resources+1) > (1<<aggregation));
|
(cba_group<total_groups) > (1<<aggregation));
|
||||||
cba_group++) {
|
cba_group++) {
|
||||||
// equal weight
|
// equal weight
|
||||||
//weight[cba_group] = floor(total_UEs/active_groups);//find_num_active_UEs_in_cbagroup(module_idP, cba_group);
|
//weight[cba_group] = floor(total_UEs/active_groups);//find_num_active_UEs_in_cbagroup(module_idP, cba_group);
|
||||||
@@ -1255,13 +1262,6 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
|
|||||||
// phase 2 reduce the number of cba allocations among the groups
|
// phase 2 reduce the number of cba allocations among the groups
|
||||||
cba_group=0;
|
cba_group=0;
|
||||||
|
|
||||||
while (nCCE[CC_id] + (1<<aggregation) * total_cba_resources >= nCCE_available[CC_id]) {
|
|
||||||
num_cba_resources[cba_group%total_groups]--;
|
|
||||||
total_cba_resources--;
|
|
||||||
// LOG_N(MAC,"reducing num cba resources to %d for group %d \n", num_cba_resources[cba_group%total_groups], cba_group%total_groups );
|
|
||||||
cba_group++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (total_cba_resources <= 0) {
|
if (total_cba_resources <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1279,11 +1279,11 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
|
|||||||
for (cba_group=0; cba_group<total_groups; cba_group++) {
|
for (cba_group=0; cba_group<total_groups; cba_group++) {
|
||||||
|
|
||||||
LOG_N(MAC,
|
LOG_N(MAC,
|
||||||
"[eNB %d] CC_id %d Frame %d, subframe %d: cba group %d active_ues %d total groups %d mcs %d, available/required rb (%d/%d), num resources %d, ncce (%d/%d required %d \n",
|
"[eNB %d] CC_id %d Frame %d, subframe %d: cba group %d active_ues %d total groups %d mcs %d, available/required rb (%d/%d), num resources %d, ncce required %d \n",
|
||||||
module_idP, CC_id, frameP, subframeP, cba_group,active_UEs[cba_group],total_groups,
|
module_idP, CC_id, frameP, subframeP, cba_group,active_UEs[cba_group],total_groups,
|
||||||
mcs[cba_group], available_rbs,required_rbs[cba_group],
|
mcs[cba_group], available_rbs,required_rbs[cba_group],
|
||||||
num_cba_resources[cba_group],
|
num_cba_resources[cba_group],
|
||||||
nCCE[CC_id],nCCE_available[CC_id],(1<<aggregation) * num_cba_resources[cba_group]);
|
(1<<aggregation) * num_cba_resources[cba_group]);
|
||||||
|
|
||||||
for (cba_resources=0; cba_resources < num_cba_resources[cba_group]; cba_resources++) {
|
for (cba_resources=0; cba_resources < num_cba_resources[cba_group]; cba_resources++) {
|
||||||
rb_table_index =0;
|
rb_table_index =0;
|
||||||
@@ -1309,10 +1309,10 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
|
|||||||
|
|
||||||
first_rb[CC_id]+=rb_table[rb_table_index];
|
first_rb[CC_id]+=rb_table[rb_table_index];
|
||||||
LOG_N(MAC,
|
LOG_N(MAC,
|
||||||
"[eNB %d] CC_id %d Frame %d, subframeP %d: schedule CBA access %d rnti %x, total/required/allocated/remaining rbs (%d/%d/%d/%d), mcs %d, rballoc %d, nCCE (%d/%d)\n",
|
"[eNB %d] CC_id %d Frame %d, subframeP %d: schedule CBA access %d rnti %x, total/required/allocated/remaining rbs (%d/%d/%d/%d), mcs %d, rballoc %d\n",
|
||||||
module_idP, CC_id, frameP, subframeP, cba_group,eNB_mac_inst[module_idP].common_channels[CC_id].cba_rnti[cba_group],
|
module_idP, CC_id, frameP, subframeP, cba_group,eNB_mac_inst[module_idP].common_channels[CC_id].cba_rnti[cba_group],
|
||||||
available_rbs, required_rbs[cba_group], allocated_rbs, remaining_rbs,
|
available_rbs, required_rbs[cba_group], allocated_rbs, remaining_rbs,
|
||||||
mcs[cba_group],rballoc,nCCE_available[CC_id],nCCE[CC_id]);
|
mcs[cba_group],rballoc);
|
||||||
|
|
||||||
switch (frame_parms->N_RB_UL) {
|
switch (frame_parms->N_RB_UL) {
|
||||||
case 6:
|
case 6:
|
||||||
@@ -1425,8 +1425,6 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
nCCE[CC_id] = nCCE[CC_id] + (1<<aggregation) ;
|
|
||||||
nCCE_available[CC_id] = mac_xface->get_nCCE_max(module_idP,CC_id) - nCCE[CC_id];
|
|
||||||
// break;// for the moment only schedule one
|
// break;// for the moment only schedule one
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id)
|
|||||||
|
|
||||||
if (CC_id>0) {
|
if (CC_id>0) {
|
||||||
LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n");
|
LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n");
|
||||||
mac_xface->macphy_exit("MAC FATAL CC_id>0");
|
//mac_xface->macphy_exit("MAC FATAL CC_id>0");
|
||||||
return 0; // not reached
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UE_mac_inst[module_idP].radioResourceConfigCommon) {
|
if (UE_mac_inst[module_idP].radioResourceConfigCommon) {
|
||||||
@@ -56,7 +56,8 @@ int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_E(MAC,"[UE %d] CCid %d FATAL radioResourceConfigCommon is NULL !!!\n",module_idP,CC_id);
|
LOG_E(MAC,"[UE %d] CCid %d FATAL radioResourceConfigCommon is NULL !!!\n",module_idP,CC_id);
|
||||||
mac_xface->macphy_exit("FATAL radioResourceConfigCommon is NULL");
|
//mac_xface->macphy_exit("FATAL radioResourceConfigCommon is NULL");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(-120 + (rach_ConfigCommon->powerRampingParameters.preambleInitialReceivedTargetPower<<1) +
|
return(-120 + (rach_ConfigCommon->powerRampingParameters.preambleInitialReceivedTargetPower<<1) +
|
||||||
|
|||||||
@@ -468,6 +468,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui
|
|||||||
mac_xface->get_transmission_mode = get_transmission_mode;
|
mac_xface->get_transmission_mode = get_transmission_mode;
|
||||||
mac_xface->get_rballoc = get_rballoc;
|
mac_xface->get_rballoc = get_rballoc;
|
||||||
mac_xface->get_nb_rb = conv_nprb;
|
mac_xface->get_nb_rb = conv_nprb;
|
||||||
|
mac_xface->get_prb = get_prb;
|
||||||
// mac_xface->get_SB_size = Get_SB_size;
|
// mac_xface->get_SB_size = Get_SB_size;
|
||||||
mac_xface->get_subframe_direction = get_subframe_direction;
|
mac_xface->get_subframe_direction = get_subframe_direction;
|
||||||
mac_xface->Msg3_transmitted = Msg3_tx;
|
mac_xface->Msg3_transmitted = Msg3_tx;
|
||||||
@@ -507,7 +508,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui
|
|||||||
mac_xface->computeRIV = computeRIV;
|
mac_xface->computeRIV = computeRIV;
|
||||||
mac_xface->get_TBS_DL = get_TBS_DL;
|
mac_xface->get_TBS_DL = get_TBS_DL;
|
||||||
mac_xface->get_TBS_UL = get_TBS_UL;
|
mac_xface->get_TBS_UL = get_TBS_UL;
|
||||||
mac_xface->get_nCCE_max = get_nCCE_max;
|
mac_xface->get_nCCE_max = get_nCCE_mac;
|
||||||
mac_xface->get_nCCE_offset = get_nCCE_offset;
|
mac_xface->get_nCCE_offset = get_nCCE_offset;
|
||||||
mac_xface->get_ue_mode = get_ue_mode;
|
mac_xface->get_ue_mode = get_ue_mode;
|
||||||
mac_xface->phy_config_sib1_eNB = phy_config_sib1_eNB;
|
mac_xface->phy_config_sib1_eNB = phy_config_sib1_eNB;
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ void assign_rbs_required (module_id_t Mod_id,
|
|||||||
eNB_UE_stats[CC_id]->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE);
|
eNB_UE_stats[CC_id]->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE);
|
||||||
*/
|
*/
|
||||||
eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]];
|
eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]];
|
||||||
|
|
||||||
eNB_UE_stats[CC_id]->dlsch_mcs1 = cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs);
|
eNB_UE_stats[CC_id]->dlsch_mcs1 = cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -729,38 +730,123 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SF05_LIMIT 1
|
||||||
|
|
||||||
void dlsch_scheduler_pre_processor_reset (int module_idP,
|
void dlsch_scheduler_pre_processor_reset (int module_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
uint8_t CC_id,
|
uint8_t CC_id,
|
||||||
int frameP,
|
int frameP,
|
||||||
int subframeP,
|
int subframeP,
|
||||||
int N_RBG,
|
int N_RBG,
|
||||||
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||||
uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX],
|
||||||
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
|
unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],
|
||||||
unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX])
|
unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX])
|
||||||
|
|
||||||
{
|
{
|
||||||
int i;
|
int i,j;
|
||||||
UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list;
|
UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list;
|
||||||
UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
||||||
rnti_t rnti = UE_RNTI(module_idP,UE_id);
|
rnti_t rnti = UE_RNTI(module_idP,UE_id);
|
||||||
|
uint8_t *vrb_map = &eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map;
|
||||||
|
int RBGsize = PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL/N_RBG;
|
||||||
|
#ifdef SF05_LIMIT
|
||||||
|
int subframe05_limit=0;
|
||||||
|
int sf05_upper=-1,sf05_lower=-1;
|
||||||
|
#endif
|
||||||
|
LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti);
|
||||||
// initialize harq_pid and round
|
// initialize harq_pid and round
|
||||||
mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,
|
mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,
|
||||||
frameP,subframeP,
|
frameP,subframeP,
|
||||||
&ue_sched_ctl->harq_pid[CC_id],
|
&ue_sched_ctl->harq_pid[CC_id],
|
||||||
&ue_sched_ctl->round[CC_id],
|
&ue_sched_ctl->round[CC_id],
|
||||||
0);
|
0);
|
||||||
|
if (ue_sched_ctl->ta_timer == 0) {
|
||||||
|
|
||||||
|
// WE SHOULD PROTECT the eNB_UE_stats with a mutex here ...
|
||||||
|
|
||||||
|
ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY
|
||||||
|
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||||
|
case 6:
|
||||||
|
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 15:
|
||||||
|
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 25:
|
||||||
|
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 50:
|
||||||
|
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 75:
|
||||||
|
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/12;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 100:
|
||||||
|
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// clear the update in case PHY does not have a new measurement after timer expiry
|
||||||
|
eNB_UE_stats->timing_advance_update = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ue_sched_ctl->ta_timer--;
|
||||||
|
ue_sched_ctl->ta_update =0; // don't trigger a timing advance command
|
||||||
|
}
|
||||||
nb_rbs_required[CC_id][UE_id]=0;
|
nb_rbs_required[CC_id][UE_id]=0;
|
||||||
ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0;
|
ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0;
|
||||||
ue_sched_ctl->dl_pow_off[CC_id] = 2;
|
ue_sched_ctl->dl_pow_off[CC_id] = 2;
|
||||||
nb_rbs_required_remaining[CC_id][UE_id] = 0;
|
nb_rbs_required_remaining[CC_id][UE_id] = 0;
|
||||||
|
|
||||||
|
#ifdef SF05_LIMIT
|
||||||
|
switch (N_RBG) {
|
||||||
|
case 6:
|
||||||
|
sf05_lower=0;
|
||||||
|
sf05_upper=5;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
sf05_lower=2;
|
||||||
|
sf05_upper=5;
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
sf05_lower=4;
|
||||||
|
sf05_upper=7;
|
||||||
|
break;
|
||||||
|
case 17:
|
||||||
|
sf05_lower=7;
|
||||||
|
sf05_upper=9;
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
sf05_lower=11;
|
||||||
|
sf05_upper=13;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// Initialize Subbands according to VRB map
|
||||||
for (i=0; i<N_RBG; i++) {
|
for (i=0; i<N_RBG; i++) {
|
||||||
ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 0;
|
ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 0;
|
||||||
rballoc_sub[CC_id][i] = 0;
|
rballoc_sub[CC_id][i] = 0;
|
||||||
|
#ifdef SF05_LIMIT
|
||||||
|
// for avoiding 6+ PRBs around DC in subframe 0-5 (avoid excessive errors)
|
||||||
|
|
||||||
|
if ((subframeP==0 || subframeP==5) &&
|
||||||
|
(i>=sf05_lower && i<=sf05_upper))
|
||||||
|
rballoc_sub[CC_id][i]=1;
|
||||||
|
#endif
|
||||||
|
// for SI-RNTI,RA-RNTI and P-RNTI allocations
|
||||||
|
for (j=0;j<RBGsize;j++) {
|
||||||
|
if (vrb_map[j+(i*RBGsize)]!=0) {
|
||||||
|
rballoc_sub[CC_id][i] = 1;
|
||||||
|
LOG_D(MAC,"Frame %d, subframe %d : vrb %d allocated\n",frameP,subframeP,j+(i*RBGsize));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG_D(MAC,"Frame %d Subframe %d CC_id %d RBG %i : rb_alloc %d\n",frameP,subframeP,CC_id,i,rballoc_sub[CC_id][i]);
|
||||||
MIMO_mode_indicator[CC_id][i] = 2;
|
MIMO_mode_indicator[CC_id][i] = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -828,8 +914,7 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
|||||||
int frameP,
|
int frameP,
|
||||||
sub_frame_t subframeP,
|
sub_frame_t subframeP,
|
||||||
uint16_t *first_rb,
|
uint16_t *first_rb,
|
||||||
uint8_t aggregation,
|
uint8_t aggregation)
|
||||||
uint32_t *nCCE)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
int16_t i;
|
int16_t i;
|
||||||
@@ -839,7 +924,6 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
|||||||
int16_t total_remaining_rbs[MAX_NUM_CCs];
|
int16_t total_remaining_rbs[MAX_NUM_CCs];
|
||||||
uint16_t max_num_ue_to_be_scheduled=0,total_ue_count=0;
|
uint16_t max_num_ue_to_be_scheduled=0,total_ue_count=0;
|
||||||
rnti_t rnti= -1;
|
rnti_t rnti= -1;
|
||||||
uint32_t nCCE_to_be_used[MAX_NUM_CCs];
|
|
||||||
UE_list_t *UE_list = &eNB_mac_inst[module_idP].UE_list;
|
UE_list_t *UE_list = &eNB_mac_inst[module_idP].UE_list;
|
||||||
UE_TEMPLATE *UE_template = 0;
|
UE_TEMPLATE *UE_template = 0;
|
||||||
LTE_DL_FRAME_PARMS *frame_parms = 0;
|
LTE_DL_FRAME_PARMS *frame_parms = 0;
|
||||||
@@ -860,7 +944,6 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
|||||||
// we need to distribute RBs among UEs
|
// we need to distribute RBs among UEs
|
||||||
// step1: reset the vars
|
// step1: reset the vars
|
||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
nCCE_to_be_used[CC_id]= nCCE[CC_id];
|
|
||||||
total_allocated_rbs[CC_id]=0;
|
total_allocated_rbs[CC_id]=0;
|
||||||
total_remaining_rbs[CC_id]=0;
|
total_remaining_rbs[CC_id]=0;
|
||||||
average_rbs_per_user[CC_id]=0;
|
average_rbs_per_user[CC_id]=0;
|
||||||
@@ -894,11 +977,13 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
|||||||
if (UE_template->pre_allocated_nb_rb_ul > 0) {
|
if (UE_template->pre_allocated_nb_rb_ul > 0) {
|
||||||
total_ue_count+=1;
|
total_ue_count+=1;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
if((mac_xface->get_nCCE_max(module_idP,CC_id) - nCCE_to_be_used[CC_id]) > (1<<aggregation)) {
|
if((mac_xface->get_nCCE_max(module_idP,CC_id,3,subframeP) - nCCE_to_be_used[CC_id]) > (1<<aggregation)) {
|
||||||
nCCE_to_be_used[CC_id] = nCCE_to_be_used[CC_id] + (1<<aggregation);
|
nCCE_to_be_used[CC_id] = nCCE_to_be_used[CC_id] + (1<<aggregation);
|
||||||
max_num_ue_to_be_scheduled+=1;
|
max_num_ue_to_be_scheduled+=1;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
max_num_ue_to_be_scheduled+=1;
|
||||||
|
|
||||||
if (total_ue_count == 0) {
|
if (total_ue_count == 0) {
|
||||||
average_rbs_per_user[CC_id] = 0;
|
average_rbs_per_user[CC_id] = 0;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user