merge with develop
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
|
||||
+210
-64
@@ -36,7 +36,7 @@ set (OPENAIR1_DIR ${OPENAIR_DIR}/openair1)
|
||||
set (OPENAIR2_DIR ${OPENAIR_DIR}/openair2)
|
||||
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||
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_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
|
||||
|
||||
@@ -44,6 +44,10 @@ project (OpenAirInterface)
|
||||
|
||||
#add_definitions("-DEMIT_ASN_DEBUG=1")
|
||||
|
||||
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
|
||||
################################################
|
||||
@@ -135,9 +139,6 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
|
||||
if (CPUINFO MATCHES "avx2")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
|
||||
endif()
|
||||
if (CPUINFO MATCHES "sse4_2")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.2")
|
||||
endif()
|
||||
if (CPUINFO MATCHES "sse4_1")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1")
|
||||
endif()
|
||||
@@ -151,8 +152,8 @@ set(C_FLAGS_PROCESSOR " ${C_FLAGS_PROCESSOR} ${CFLAGS_PROCESSOR_USER}")
|
||||
Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}")
|
||||
|
||||
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")) )
|
||||
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\" ")
|
||||
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. 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()
|
||||
|
||||
@@ -164,49 +165,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"
|
||||
)
|
||||
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
|
||||
# these changes are related to hardcoded path to include .h files
|
||||
add_definitions(-DCMAKER)
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3")
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2")
|
||||
|
||||
# Below has been put in comment because does not work with
|
||||
# SVN authentication.
|
||||
#
|
||||
#find_package(Subversion)
|
||||
#if(SUBVERSION_FOUND)
|
||||
# Subversion_WC_INFO(${OPENAIR_DIR} openair)
|
||||
# set (FIRMWARE_VERSION "${openair_WC_REVISION} - ${openair_WC_LAST_CHANGED_DATE}")
|
||||
# Subversion_WC_LOG(${OPENAIR_DIR} Project)
|
||||
#else()
|
||||
# set (FIRMWARE_VERSION "No svn information")
|
||||
#endif()
|
||||
#add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
|
||||
|
||||
set(GIT_BRANCH "UNKNOWN")
|
||||
set(GIT_COMMIT_HASH "UNKNOWN")
|
||||
set(GIT_COMMIT_DATE "UNKNOWN")
|
||||
|
||||
|
||||
find_package(Git)
|
||||
if(GIT_FOUND)
|
||||
message("git found: ${GIT_EXECUTABLE}")
|
||||
# Get the current working branch
|
||||
execute_process(
|
||||
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
|
||||
set (FIRMWARE_VERSION "No svn information")
|
||||
add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
|
||||
add_definitions("-DPACKAGE_VERSION=\"${FIRMWARE_VERSION}\"")
|
||||
add_definitions("-DPACKAGE_BUGREPORT=\"OpenAirInterface web site\"")
|
||||
add_definitions("-DPACKAGE_VERSION=\"Branch: ${GIT_BRANCH} Abrev. Hash: ${GIT_COMMIT_HASH} Date: ${GIT_COMMIT_DATE}\"")
|
||||
add_definitions("-DPACKAGE_BUGREPORT=\"openair4g-devel@lists.eurecom.fr\"")
|
||||
|
||||
|
||||
|
||||
# Debug related options
|
||||
#########################################
|
||||
add_boolean_option(MSG_PRINT False "print debug messages")
|
||||
add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
|
||||
add_boolean_option(XER_PRINT False "print XER Format")
|
||||
add_boolean_option(RRC_MSG_PRINT Flase "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(ASN_DEBUG False "ASN1 coder/decoder Debug")
|
||||
add_boolean_option(EMIT_ASN_DEBUG False "ASN1 coder/decoder Debug")
|
||||
add_boolean_option(MSG_PRINT False "print debug messages")
|
||||
add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
|
||||
add_boolean_option(XER_PRINT False "print XER Format")
|
||||
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(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(DEBUG_OMG False "???")
|
||||
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(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(DEBUG_OMG False "???")
|
||||
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(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
|
||||
|
||||
@@ -249,6 +279,9 @@ endif (${RTAI})
|
||||
set(asn1c_call "${OPENAIR_CMAKE}/tools/generate_asn1")
|
||||
set(asn1_generated_dir ${OPENAIR_BIN_DIR})
|
||||
|
||||
set(protoc_call "${OPENAIR_CMAKE}/tools/generate_protobuf")
|
||||
set(protobuf_generated_dir ${OPENAIR_BIN_DIR})
|
||||
|
||||
# RRC
|
||||
######
|
||||
add_list2_option(RRC_ASN1_VERSION "Rel10" "ASN.1 version of RRC interface" "Rel8" "Rel10" "CBA")
|
||||
@@ -314,6 +347,7 @@ set(S1AP_OAI_generated
|
||||
${S1AP_C_DIR}/s1ap_decoder.c
|
||||
${S1AP_C_DIR}/s1ap_encoder.c
|
||||
${S1AP_C_DIR}/s1ap_xer_print.c
|
||||
${S1AP_C_DIR}/s1ap_compare.c
|
||||
${S1AP_C_DIR}/s1ap_ies_defs.h
|
||||
)
|
||||
file(GLOB s1ap_h ${S1AP_C_DIR}/*.h)
|
||||
@@ -409,8 +443,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_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")
|
||||
set(DRIVER2013)
|
||||
include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/")
|
||||
@@ -418,6 +499,7 @@ if (${RF_BOARD} STREQUAL "EXMIMO")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
|
||||
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c)
|
||||
set(option_HW_lib "-rdynamic -ldl")
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "OAI_USRP")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
|
||||
@@ -425,8 +507,7 @@ elseif (${RF_BOARD} STREQUAL "OAI_USRP")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp)
|
||||
LINK_DIRECTORIES("/opt/lib")
|
||||
set(option_HW_lib "uhd")
|
||||
set(LOWLATENCY False)
|
||||
set(option_HW_lib "-luhd -rdynamic -ldl")
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/")
|
||||
@@ -436,26 +517,51 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
|
||||
${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
|
||||
)
|
||||
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
|
||||
set(option_HW_lib "bladeRF")
|
||||
#set(LOWLATENCY False)
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "ETHERNET")
|
||||
include_directories ("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
||||
)
|
||||
set(LOWLATENCY True)
|
||||
|
||||
set(option_HW_lib "bladeRF -rdynamic -ldl")
|
||||
#set(LOWLATENCY False)
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB")
|
||||
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")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/cprigw_lib.c
|
||||
)
|
||||
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")
|
||||
|
||||
|
||||
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")
|
||||
|
||||
Message("LOWLATENCY flag is ${LOWLATENCY}")
|
||||
|
||||
##############################################################
|
||||
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
|
||||
@@ -464,6 +570,7 @@ add_boolean_option(ENABLE_SECURITY True "Enable LTE integrity and ciphe
|
||||
add_boolean_option(ENABLE_USE_MME True "eNB connected to MME (INTERFACE S1-C), not standalone eNB")
|
||||
add_boolean_option(NO_RRM True "DO WE HAVE A RADIO RESSOURCE MANAGER: NO")
|
||||
add_boolean_option(USER_MODE True "????")
|
||||
add_boolean_option(RRC_DEFAULT_RAB_IS_AM False "set the RLC mode to AM for the default bearer")
|
||||
|
||||
add_boolean_option(OAI_NW_DRIVER_TYPE_ETHERNET False "????")
|
||||
add_boolean_option(DISABLE_USE_NAS False "???")
|
||||
@@ -477,6 +584,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_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(ENB_AGENT True "enable eNB agent to inteface with a SDN contrller")
|
||||
|
||||
########################
|
||||
# Include order
|
||||
##########################
|
||||
@@ -847,6 +957,7 @@ set(PHY_SRC
|
||||
${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
|
||||
${OPENAIR1_DIR}/PHY/INIT/lte_init.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/lte_dfts.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
||||
@@ -1001,7 +1112,6 @@ add_library(CN_UTILS
|
||||
${OPENAIR3_DIR}/UTILS/conversions.c
|
||||
${OPENAIR3_DIR}/UTILS/enum_string.c
|
||||
${OPENAIR3_DIR}/UTILS/log.c
|
||||
${OPENAIR3_DIR}/UTILS/mme_config.c
|
||||
${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c
|
||||
)
|
||||
|
||||
@@ -1342,6 +1452,9 @@ include(FindPkgConfig)
|
||||
pkg_search_module(LIBXML2 libxml-2.0 REQUIRED)
|
||||
include_directories(${LIBXML2_INCLUDE_DIRS})
|
||||
|
||||
pkg_search_module(LIBXSLT libxslt REQUIRED)
|
||||
include_directories(${LIBXSLT_INCLUDE_DIRS})
|
||||
|
||||
pkg_search_module(OPENSSL openssl REQUIRED)
|
||||
include_directories(${OPENSSL_INCLUDE_DIRS})
|
||||
|
||||
@@ -1405,10 +1518,11 @@ add_definitions(-DASN1_MINIMUM_VERSION=924)
|
||||
|
||||
#################################
|
||||
# add executables for operation
|
||||
#################################""
|
||||
#################################
|
||||
|
||||
# lte-softmodem is both eNB and UE implementation
|
||||
###################################################
|
||||
|
||||
add_executable(lte-softmodem
|
||||
${rrc_h}
|
||||
${s1ap_h}
|
||||
@@ -1426,6 +1540,7 @@ add_executable(lte-softmodem
|
||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||
${GTPU_need_ITTI}
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${RTAI_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
${XFORMS_SOURCE_SOFTMODEM}
|
||||
@@ -1433,13 +1548,14 @@ add_executable(lte-softmodem
|
||||
|
||||
target_link_libraries (lte-softmodem
|
||||
-Wl,--start-group
|
||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${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 )
|
||||
|
||||
|
||||
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 ${LIB_LMS_LIBRARIES})
|
||||
|
||||
# lte-softmodem-nos1 is both eNB and UE implementation
|
||||
###################################################
|
||||
@@ -1460,6 +1576,7 @@ add_executable(lte-softmodem-nos1
|
||||
#${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${RTAI_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
${XFORMS_SOURCE_SOFTMODEM}
|
||||
@@ -1470,38 +1587,43 @@ target_link_libraries (lte-softmodem-nos1
|
||||
-Wl,--end-group )
|
||||
|
||||
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 ${LIB_LMS_LIBRARIES})
|
||||
|
||||
# rrh
|
||||
################################
|
||||
set(DRIVER2013)
|
||||
|
||||
#Note: only on RF type is currently supported for RRH
|
||||
#Note: only one RF type (USRP) is currently supported for RRH
|
||||
add_executable(rrh_gw
|
||||
${OPENAIR_TARGETS}/RT/USER/rrh_gw.c
|
||||
${OPENAIR_TARGETS}/RT/USER/eNB_transport_IQ.c
|
||||
${OPENAIR_TARGETS}/RT/USER/UE_transport_IQ.c
|
||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
)
|
||||
# assert and common_lib.h
|
||||
target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti ${OPENAIR_TARGETS}/ARCH/COMMON ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ )
|
||||
|
||||
target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti)
|
||||
target_link_libraries(rrh_gw
|
||||
-Wl,--start-group
|
||||
UTIL LFDS
|
||||
-Wl,--end-group )
|
||||
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("-- 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
|
||||
#################
|
||||
@@ -1552,6 +1674,7 @@ add_executable(oaisim
|
||||
${GTPU_need_ITTI}
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
)
|
||||
|
||||
@@ -1563,7 +1686,7 @@ target_link_libraries (oaisim
|
||||
-Wl,--end-group )
|
||||
|
||||
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})
|
||||
#Force link with forms, regardless XFORMS option
|
||||
target_link_libraries (oaisim forms)
|
||||
@@ -1590,6 +1713,7 @@ add_executable(oaisim_nos1
|
||||
${OPENAIR2_DIR}/UTIL/OMG/sumo.c
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
)
|
||||
target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER)
|
||||
@@ -1599,7 +1723,7 @@ target_link_libraries (oaisim_nos1
|
||||
-Wl,--end-group )
|
||||
|
||||
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})
|
||||
#Force link with forms, regardless XFORMS option
|
||||
target_link_libraries (oaisim_nos1 forms)
|
||||
@@ -1622,6 +1746,7 @@ endforeach(myExe)
|
||||
|
||||
add_executable(test_epc_generate_scenario
|
||||
${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}/COMMON/commonDef.h
|
||||
${OPENAIR2_DIR}/COMMON/messages_def.h
|
||||
@@ -1630,7 +1755,28 @@ add_executable(test_epc_generate_scenario
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
)
|
||||
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 01 Build OAI
|
||||
01 01 01 Build oaisim.Rel8
|
||||
01 01 02 Build oaisim.Rel8 + network device driver(nasmesh_fix)
|
||||
01 01 03 Build (lte-softmodem.Rel8.EXMIMO + lte-softmodem.Rel10.EXMIMO + lte-softmodem.Rel10.USRP)
|
||||
01 01 04 Build (dlsim.Rel10 + ulsim.Rel10 + pucchsim.Rel10 + prachsim.Rel10 + pdcchsim.Rel10 + pbchsim.Rel10 + mbmssim.Rel10
|
||||
01 01 02 Build oaisim.Rel10
|
||||
01 01 03 Build oaisim_noS1.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.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 08 Build oaisim.Rel10 + ITTI
|
||||
01 01 20 Build Nasmesh
|
||||
01 01 30 Build RRH Gateway
|
||||
|
||||
01 01 40 Build RRH Gateway for USRP (Rel 10)
|
||||
01 01 41 Build RRH Gateway for EXMIMO (Rel 10)
|
||||
01 01 42 Build RRH Gateway for BLADERF (Rel 10)
|
||||
|
||||
|
||||
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 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 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 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 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 Run OAISIM-NOS1 Rel10 (TDD + 5MHz/10MHz/20MHz + TM 1,2), and check the operation
|
||||
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 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 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 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
|
||||
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
|
||||
|
||||
01 03 Run OAISIM Rel10 (FDD + 5MHz/10MHz/20MHz + TM 1,2,5,6), 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 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 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 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 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 Run OAISIM-NOS1 Rel10 (FDD + 5MHz/10MHz/20MHz + TM 1,2), and check the operation
|
||||
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-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-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-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 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
|
||||
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
|
||||
|
||||
|
||||
|
||||
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 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
|
||||
@@ -88,7 +97,116 @@ Obj.# Case# Test# Description
|
||||
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
|
||||
|
||||
|
||||
@@ -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
|
||||
fi
|
||||
|
||||
trap handle_ctrl_c INT
|
||||
|
||||
source $OPENAIR_DIR/cmake_targets/tools/test_helper
|
||||
|
||||
#SUDO="sudo -E "
|
||||
|
||||
SUDO="sudo -E -S"
|
||||
tdir=$OPENAIR_DIR/cmake_targets/autotests
|
||||
rm -fr $tdir/bin $tdir/log
|
||||
mkdir -p $tdir/bin $tdir/log
|
||||
rm -fr $tdir/bin
|
||||
mkdir -p $tdir/bin
|
||||
results_file="$tdir/log/results_autotests.xml"
|
||||
|
||||
updated=$(svn st -q $OPENAIR_DIR)
|
||||
@@ -36,12 +39,12 @@ cd $tdir
|
||||
#\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 $14 -> tags to help identify the test case for readability in output xml file
|
||||
test_compile() {
|
||||
function test_compile() {
|
||||
|
||||
xUnit_start
|
||||
test_case_name=$1
|
||||
log_dir=$tdir/log
|
||||
log_file=$tdir/log/test.$1.txt
|
||||
log_dir=$tdir/log/$test_case_name
|
||||
log_file=$log_dir/test.$1.log.txt
|
||||
compile_prog=$2
|
||||
compile_args=$3
|
||||
pre_exec_file=$4
|
||||
@@ -54,11 +57,18 @@ test_compile() {
|
||||
class=${12}
|
||||
compile_prog_out=${13}
|
||||
tags=${14}
|
||||
build_dir=$tdir/$1/build
|
||||
exec_file=$build_dir/$6
|
||||
xmlfile_testcase=$log_dir/test.$1.xml
|
||||
#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.
|
||||
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=()
|
||||
read -a compile_prog_array <<<"$compile_prog"
|
||||
|
||||
tags_array=()
|
||||
read -a tags_array <<<"$tags"
|
||||
#tags_array=()
|
||||
#read -a tags_array <<<"$tags"
|
||||
|
||||
pre_compile_prog_array=()
|
||||
readarray -t pre_compile_prog_array <<< "$pre_compile_prog"
|
||||
#pre_compile_prog_array=()
|
||||
#readarray -t pre_compile_prog_array <<< "$pre_compile_prog"
|
||||
result=1
|
||||
result_string=""
|
||||
for (( run_index=1; run_index <= $nruns; run_index++ ))
|
||||
do
|
||||
tags_array_index=0
|
||||
for pre_compile_prog_array_index in "${pre_compile_prog_array[@]}"
|
||||
do
|
||||
|
||||
#tags_array_index=0
|
||||
#for pre_compile_prog_array_index in "${pre_compile_prog_array[@]}"
|
||||
#do
|
||||
|
||||
for compile_prog_array_index in "${compile_prog_array[@]}"
|
||||
do
|
||||
echo "Compiling test case $test_case_name.$compile_prog_array_index.${tags_array[$tags_array_index]} Log file = $log_file"
|
||||
echo "<COMPILATION LOG file=$compile_prog_array_index , Run = $run_index>" >> $log_file
|
||||
rm -fr $build_dir
|
||||
mkdir -p $build_dir
|
||||
cd $build_dir
|
||||
#for compile_prog_array_index in "${compile_prog_array[@]}"
|
||||
#do
|
||||
echo "Compiling test case $test_case_name.${tags} Log file = $log_file"
|
||||
date=`date`
|
||||
echo "<COMPILATION LOG file=$test_case_name.${tags} , Run = $run_index>, Date = $date " >> $log_file
|
||||
#rm -fr $build_dir
|
||||
#mkdir -p $build_dir
|
||||
cd $log_dir
|
||||
{
|
||||
eval $pre_compile_prog_array_index
|
||||
cmake ..
|
||||
#rm -fv $exec_file
|
||||
make -j`nproc` $compile_prog_array_index $compile_args
|
||||
uname -a
|
||||
compile_log_dir=`eval echo \"$OPENAIR_DIR/cmake_targets/log/\"`
|
||||
echo "Removing compilation log files in $compile_log_dir"
|
||||
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
|
||||
echo "</COMPILATION LOG>" >> $log_file 2>&1
|
||||
if [ "$class" == "compilation" ]; then
|
||||
if [ -s "$compile_prog_array_index" ] || [ -s "$compile_prog_out" ] ; then
|
||||
echo_success "$test_case_name.$compile_prog_array_index.${tags_array[$tags_array_index]} compiled"
|
||||
xUnit_success "compilation" "$test_case_name.$compile_prog_array_index.${tags_array[$tags_array_index]}" "PASS" "$run_index"
|
||||
else
|
||||
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"
|
||||
for compile_prog_out_index in ${compile_prog_out_array[@]}
|
||||
do
|
||||
if [ -s "$compile_prog_out_index" ]; then
|
||||
let "result = result&1"
|
||||
|
||||
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
|
||||
let "tags_array_index++"
|
||||
done # End of for loop compile_prog_array
|
||||
done # End of for loop (pre_compile_prog_array_index)
|
||||
#let "tags_array_index++"
|
||||
#done # End of for loop compile_prog_array
|
||||
#done # End of for loop (pre_compile_prog_array_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 $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 $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
|
||||
test_case_name=$1
|
||||
log_dir=$tdir/log
|
||||
log_file=$tdir/log/test.$1.txt
|
||||
log_dir=$tdir/log/$test_case_name
|
||||
log_file=$log_dir/test.$1.log.txt
|
||||
compile_prog=$2
|
||||
compile_args=$3
|
||||
pre_exec_file=$4
|
||||
@@ -149,16 +195,22 @@ test_compile_and_run() {
|
||||
class=${12}
|
||||
compile_prog_out=${13}
|
||||
tags=${14}
|
||||
mypassword=${15}
|
||||
test_config_file=${16}
|
||||
|
||||
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.
|
||||
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_file = $log_file"
|
||||
#echo "exec_file = $exec_file"
|
||||
@@ -168,63 +220,76 @@ test_compile_and_run() {
|
||||
#echo "nruns = $nruns"
|
||||
echo "class = $class"
|
||||
|
||||
compile_prog_array=()
|
||||
read -a compile_prog_array <<<"$compile_prog"
|
||||
#compile_prog_array=()
|
||||
#read -a compile_prog_array <<<"$compile_prog"
|
||||
|
||||
#test_config_file=`eval "echo \"$test_config_file\" "`
|
||||
|
||||
#echo "test_config_file = $test_config_file"
|
||||
|
||||
tags_array=()
|
||||
read -a tags_array <<<"$tags"
|
||||
|
||||
main_exec_args_array=()
|
||||
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[@]}"
|
||||
do
|
||||
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
|
||||
#mkdir -p $build_dir
|
||||
|
||||
rm -fr $build_dir
|
||||
mkdir -p $build_dir
|
||||
|
||||
cd $build_dir
|
||||
cd $log_dir
|
||||
{
|
||||
uname -a
|
||||
echo "Executing $pre_compile_prog"
|
||||
eval $pre_compile_prog
|
||||
cmake ..
|
||||
#rm -fv $exec_file
|
||||
make -j`nproc` $search_expr $compile_args
|
||||
|
||||
if [ "$test_config_file" != "" ]; then
|
||||
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
|
||||
echo "</COMPILATION LOG>" >> $log_file 2>&1
|
||||
if [ "$class" == "compilation" ]; then
|
||||
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
|
||||
|
||||
#done
|
||||
|
||||
#process the test case if it is that of execution
|
||||
if [ "$class" == "execution" ]; then
|
||||
tags_array_index=0
|
||||
for main_exec_args_array_index in "${main_exec_args_array[@]}"
|
||||
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
|
||||
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 "<EXECUTION LOG Run = $run_index >" >> $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 "-----------------------------------------------------------------------------" >> $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
|
||||
{ eval "source $pre_exec_file $pre_exec_args"; } >> $log_file 2>&1
|
||||
fi
|
||||
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
|
||||
{ echo " Executing $pre_exec_file $pre_exec_args "
|
||||
eval " echo '$mypassword' |sudo -S -E $pre_exec_file $pre_exec_args " ; }>> $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
|
||||
echo "</EXECUTION LOG Test Case = $test_case_name.$main_exec.${tags_array[$tags_array_index]}, Run = $run_index >" >> $log_file 2>&1
|
||||
|
||||
|
||||
result=1
|
||||
for search_expr in "${search_expr_array[@]}"
|
||||
@@ -241,68 +306,59 @@ test_compile_and_run() {
|
||||
let "result = result & 1"
|
||||
fi
|
||||
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"
|
||||
|
||||
test_case_result=""
|
||||
|
||||
#this is a result of this run
|
||||
#test_case_result=""
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
#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++"
|
||||
done # End of for loop (nindex)
|
||||
done
|
||||
fi
|
||||
rm -fr $build_dir
|
||||
}
|
||||
|
||||
dbin=$OPENAIR_DIR/cmake_targets/autotests/bin
|
||||
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
|
||||
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() {
|
||||
function print_help() {
|
||||
echo_info '
|
||||
This program runs automated test case system for OpenAirInterface
|
||||
You should have ubuntu 14.xx, updated, and the Linux kernel >= 3.14
|
||||
@@ -311,14 +367,20 @@ Options
|
||||
This help
|
||||
-g | --run-group
|
||||
Run test cases in a group. For example, ./run_exec_autotests "0101* 010102"
|
||||
-p
|
||||
Use password for logging
|
||||
'
|
||||
}
|
||||
|
||||
main () {
|
||||
function main () {
|
||||
RUN_GROUP=0
|
||||
SET_PASSWORD=0
|
||||
passwd=""
|
||||
test_case_group=""
|
||||
test_case_group_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" ]
|
||||
do
|
||||
@@ -326,8 +388,13 @@ until [ -z "$1" ]
|
||||
-g | --run-group)
|
||||
RUN_GROUP=1
|
||||
test_case_group=$2
|
||||
test_case_group=`sed "s/\+/\*/g" <<< "${test_case_group}"` # Replace + with * for bash string substituion
|
||||
echo_info "Will execute test cases only in group $test_case_group"
|
||||
shift 2;;
|
||||
-p)
|
||||
SET_PASSWORD=1
|
||||
passwd=$2
|
||||
shift 2;;
|
||||
-h | --help)
|
||||
print_help
|
||||
exit 1;;
|
||||
@@ -338,13 +405,36 @@ until [ -z "$1" ]
|
||||
esac
|
||||
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"
|
||||
|
||||
test_case_list=`xmlstarlet sel -T -t -m /testCaseList/testCase -s A:N:- "@id" -v "@id" -n $xml_conf`
|
||||
test_case_excl_list=`xmlstarlet sel -t -v "/testCaseList/TestCaseExclusionList" $xml_conf`
|
||||
echo "Test Case Exclusion List = $test_case_excl_list "
|
||||
|
||||
test_case_excl_list=`sed "s/\+/\*/g" <<< "$test_case_excl_list" ` # Replace + with * for bash string substituion
|
||||
|
||||
read -a test_case_excl_array <<< "$test_case_excl_list"
|
||||
|
||||
echo "test_case_list = $test_case_list"
|
||||
|
||||
echo "Test Case Exclusion List = $test_case_excl_list \n"
|
||||
|
||||
readarray -t test_case_array <<<"$test_case_list"
|
||||
|
||||
read -a test_case_group_array <<< "$test_case_group"
|
||||
@@ -365,7 +455,17 @@ for search_expr in "${test_case_array[@]}"
|
||||
else
|
||||
flag_run_test_case=1
|
||||
fi
|
||||
|
||||
|
||||
for search_excl in "${test_case_excl_array[@]}"
|
||||
do
|
||||
if [[ $search_expr == $search_excl ]];then
|
||||
flag_run_test_case=0
|
||||
echo_info "Test case $search_expr match found in test case excl group. Will skip the test case for execution..."
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
#We skip this test case if it is not in the group list
|
||||
if [ "$flag_run_test_case" -ne "1" ]; then
|
||||
continue
|
||||
@@ -386,12 +486,15 @@ for search_expr in "${test_case_array[@]}"
|
||||
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`
|
||||
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 "name = $name"
|
||||
echo "Description = $desc"
|
||||
echo "pre_compile_prog = $pre_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_args = $pre_exec_args"
|
||||
echo "main_exec = $main_exec"
|
||||
@@ -401,6 +504,7 @@ for search_expr in "${test_case_array[@]}"
|
||||
echo "nruns = $nruns"
|
||||
|
||||
#eval $pre_exec
|
||||
compile_prog_out=`eval echo \"$compile_prog_out\"`
|
||||
|
||||
search_array_true=()
|
||||
|
||||
@@ -421,9 +525,10 @@ for search_expr in "${test_case_array[@]}"
|
||||
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"
|
||||
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
|
||||
echo "Unexpected class of test case...Exiting...."
|
||||
echo "Unexpected class of test case...Skipping the test case $name ...."
|
||||
fi
|
||||
|
||||
done
|
||||
@@ -432,6 +537,8 @@ for search_expr in "${test_case_array[@]}"
|
||||
|
||||
}
|
||||
|
||||
uname -a
|
||||
|
||||
main "$@"
|
||||
|
||||
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
|
||||
|
||||
MSC_GEN="False"
|
||||
XFORMS="False"
|
||||
XFORMS="True"
|
||||
PRINT_STATS="False"
|
||||
VCD_TIMING="False"
|
||||
LOWLATENCY_FLAG_USER="False"
|
||||
FORCE_LOWLATENCY_FLAG_USER=""
|
||||
REL="Rel10"
|
||||
HW="EXMIMO"
|
||||
HW="None"
|
||||
TP="None"
|
||||
NOS1=0
|
||||
EPC=0
|
||||
VERBOSE_COMPILE=0
|
||||
CFLAGS_PROCESSOR_USER=""
|
||||
RUN_GROUP=0
|
||||
TEST_CASE_GROUP=""
|
||||
BUILD_DOXYGEN=0
|
||||
trap handle_ctrl_c INT
|
||||
|
||||
function print_help() {
|
||||
echo_info '
|
||||
@@ -80,18 +85,19 @@ Options
|
||||
Makes the LTE softmodem
|
||||
--UE
|
||||
Makes the UE specific parts (ue_ip, usim, nvram)
|
||||
--EPC
|
||||
Makes the EPC (MME-SPGW, HSS)
|
||||
--RRH
|
||||
Makes the RRH
|
||||
-r | --3gpp-release
|
||||
default is Rel10,
|
||||
Rel8 limits the implementation to 3GPP Release 8 version
|
||||
-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)
|
||||
-t | --transport protocol
|
||||
ETHERNET , None
|
||||
Adds this trasport protocol support in compilation
|
||||
--oaisim
|
||||
Makes the oaisim simulator. Hardware will be defaulted to "NONE".
|
||||
Makes the oaisim simulator. Hardware will be defaulted to "None".
|
||||
--phy_simulators
|
||||
Makes the unitary tests Layer 1 simulators
|
||||
--core_simulators
|
||||
@@ -113,11 +119,16 @@ Options
|
||||
Shows detailed compilation instructions in makefile
|
||||
--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
|
||||
|
||||
--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):
|
||||
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
|
||||
NI/ETTUS B201 + COTS UE : ./build_oai -I -g --eNB --EPC -x --install-system-files -w USRP
|
||||
Eurecom EXMIMO + COTS UE : ./build_oai -I -g --eNB -x --install-system-files
|
||||
NI/ETTUS B201 + COTS UE : ./build_oai -I -g --eNB -x --install-system-files -w USRP
|
||||
Usage (Regular):
|
||||
oaisim : ./build_oai --oaisim -x
|
||||
Eurecom EXMIMO + OAI ENB : ./build_oai --eNB -x
|
||||
@@ -159,30 +170,41 @@ function main() {
|
||||
UE=1
|
||||
echo_info "Will compile UE"
|
||||
shift;;
|
||||
--EPC)
|
||||
EPC=1
|
||||
echo_info "Will compile EPC"
|
||||
shift;;
|
||||
--RRH)
|
||||
RRH=1
|
||||
echo_info "Will compile RRH"
|
||||
shift;;
|
||||
-r | --3gpp-release)
|
||||
REL=$2
|
||||
echo_info "setting release to: $REL"
|
||||
echo_info "Setting release to: $REL"
|
||||
shift 2;;
|
||||
-w | --hardware)
|
||||
HW="$2" #"${i#*=}"
|
||||
# Use OAI_USRP as the key word USRP is used inside UHD driver
|
||||
if [ "$HW" == "USRP" ] ; then
|
||||
HW="OAI_USRP"
|
||||
fi
|
||||
if [ "$HW" == "BLADERF" ] ; then
|
||||
HW="OAI_BLADERF"
|
||||
fi
|
||||
echo_info "setting hardware to: $HW"
|
||||
# Use OAI_USRP as the key word USRP is used inside UHD driver
|
||||
if [ "$HW" != "BLADERF" -a "$HW" != "USRP" -a "$HW" != "LMSSDR" -a "$HW" != "None" -a "$HW" != "EXMIMO" ] ; then
|
||||
echo_fatal "Unknown HW type $HW will exit..."
|
||||
else
|
||||
if [ "$HW" == "USRP" ] ; then
|
||||
HW="OAI_USRP"
|
||||
fi
|
||||
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;;
|
||||
--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
|
||||
echo_info "Will compile oaisim and drivers nasmesh, ..."
|
||||
shift;;
|
||||
@@ -204,7 +226,7 @@ function main() {
|
||||
echo_info "executing test cases only in group: $TEST_CASE_GROUP"
|
||||
shift 2;;
|
||||
-V | --vcd)
|
||||
echo_info "setting gtk-wave output"
|
||||
echo_info "Setting gtk-wave output"
|
||||
VCD_TIMING=1
|
||||
EXE_ARGUMENTS="$EXE_ARGUMENTS -V"
|
||||
shift;;
|
||||
@@ -227,8 +249,20 @@ function main() {
|
||||
shift;;
|
||||
--cflags_processor)
|
||||
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;;
|
||||
--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)
|
||||
print_help
|
||||
exit 1;;
|
||||
@@ -238,6 +272,64 @@ function main() {
|
||||
break;;
|
||||
esac
|
||||
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
|
||||
@@ -277,7 +369,7 @@ function main() {
|
||||
check_install_usrp_uhd_driver
|
||||
fi
|
||||
if [ "$HW" == "OAI_BLADERF" ] ; then
|
||||
echo_info "installing packages for BALDERF support"
|
||||
echo_info "installing packages for BLADERF support"
|
||||
check_install_bladerf_driver
|
||||
fi
|
||||
fi
|
||||
@@ -288,9 +380,11 @@ function main() {
|
||||
fi
|
||||
|
||||
if [ "$oaisim" = "1" ] ; then
|
||||
if [ "$HW" != "ETHERNET" ] ; then
|
||||
HW="NONE"
|
||||
fi
|
||||
#to be discussed
|
||||
# there is no RF device and no transport protocol
|
||||
HW="None"
|
||||
TP="None"
|
||||
|
||||
if [ "$XFORMS" == "True" ] ; then
|
||||
PRINT_STATS="True"
|
||||
fi
|
||||
@@ -324,7 +418,9 @@ function main() {
|
||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $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
|
||||
cd $DIR/$lte_build_dir/build
|
||||
cmake ..
|
||||
@@ -416,7 +512,7 @@ function main() {
|
||||
|
||||
# EXMIMO drivers & firmware loader
|
||||
###############
|
||||
if [ "$HW" = "EXMIMO" -a "$EPC" = "0" ] ; then
|
||||
if [ "$HW" = "EXMIMO" ] ; then
|
||||
|
||||
echo_info "Compiling Express MIMO 2 board drivers"
|
||||
compilations \
|
||||
@@ -529,67 +625,146 @@ function main() {
|
||||
fi
|
||||
|
||||
# RRH compilation
|
||||
##################
|
||||
#####################
|
||||
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
|
||||
mkdir -p $DIR/rrh_gw/build
|
||||
cd $DIR/rrh_gw/build
|
||||
cmake ..
|
||||
compilations \
|
||||
rrh_gw rrh_gw \
|
||||
rrh_gw $dbin/rrh_gw
|
||||
fi
|
||||
rrh_exec=rrh_gw
|
||||
rrh_build_dir=rrh_gw
|
||||
|
||||
echo_info "Compiling $rrh_exec ..."
|
||||
|
||||
[ "$CLEAN" = "1" ] && rm -rf $DIR/rrh_gw/build
|
||||
mkdir -p $DIR/$rrh_build_dir/build
|
||||
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
|
||||
|
||||
# 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
|
||||
#####################
|
||||
if [ "$OAI_TEST" = "1" ]; then
|
||||
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
|
||||
mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log
|
||||
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
|
||||
$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
|
||||
wait
|
||||
else
|
||||
echo_info "10. Bypassing the Tests ..."
|
||||
fi
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
|
||||
set ( ASN_DEBUG False)
|
||||
set ( ADDR_CONF False )
|
||||
set ( DEBUG_OMG False )
|
||||
set ( DISABLE_XER_PRINT False )
|
||||
set ( DRIVER2013 True )
|
||||
set ( EMOS False )
|
||||
set ( EMIT_ASN_DEBUG False )
|
||||
set ( ENABLE_FXP True )
|
||||
set ( ENABLE_ITTI True )
|
||||
set ( ENABLE_NAS_UE_LOGGING True )
|
||||
@@ -47,9 +49,9 @@ set ( OAI_EMU False )
|
||||
set ( OAISIM False )
|
||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
|
||||
set ( OAI_NW_DRIVER_USE_NETLINK True )
|
||||
set ( OPENAIR1 False )
|
||||
set ( OPENAIR2 False )
|
||||
set ( OPENAIR_LTE F )
|
||||
set ( OPENAIR1 True )
|
||||
set ( OPENAIR2 True )
|
||||
set ( OPENAIR_LTE True )
|
||||
set ( PACKAGE_NAME "epc_test" )
|
||||
set ( PBS_SIM False )
|
||||
set ( PDCP_USE_NETLINK True )
|
||||
@@ -74,4 +76,4 @@ set ( SMBV False )
|
||||
set ( TEST_OMG False )
|
||||
set ( USE_MME "R10" )
|
||||
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(PHYSIM True)
|
||||
set(RF_BOARD None)
|
||||
set(XFORMS False)
|
||||
set(XFORMS True)
|
||||
|
||||
set(DEBUG_PHY 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
|
||||
# brief
|
||||
# author Laurent Thomas
|
||||
# authors Laurent Thomas, Lionel GAUTHIER
|
||||
#
|
||||
#######################################
|
||||
SUDO='sudo -E'
|
||||
@@ -111,7 +111,12 @@ compilations() {
|
||||
cd $OPENAIR_DIR/cmake_targets/$1/build
|
||||
{
|
||||
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
|
||||
echo_info "Log file for compilation has been written to: $dlog/$2.$REL.txt"
|
||||
if [ -s $3 ] ; then
|
||||
@@ -158,19 +163,24 @@ install_gnutls_from_source(){
|
||||
|
||||
|
||||
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)
|
||||
$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 -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(){
|
||||
$SUDO add-apt-repository -y ppa:bladerf/bladerf
|
||||
$SUDO apt-get update
|
||||
$SUDO apt-get install -y bladerf libbladerf-dev
|
||||
$SUDO apt-get install bladerf-firmware-fx3
|
||||
$SUDO apt-get install bladerf-fpga-hostedx40
|
||||
bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
|
||||
$SUDO apt-get install -y bladerf-firmware-fx3
|
||||
$SUDO apt-get install -y bladerf-fpga-hostedx40
|
||||
$SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
|
||||
}
|
||||
|
||||
check_install_additional_tools (){
|
||||
@@ -183,7 +193,6 @@ check_install_additional_tools (){
|
||||
libboost-all-dev \
|
||||
libpthread-stubs0-dev \
|
||||
openvpn \
|
||||
phpmyadmin \
|
||||
pkg-config \
|
||||
python-dev \
|
||||
python-pexpect \
|
||||
@@ -194,27 +203,27 @@ check_install_additional_tools (){
|
||||
unzip \
|
||||
valgrind \
|
||||
vlan \
|
||||
ctags
|
||||
ctags \
|
||||
ntpdate
|
||||
}
|
||||
|
||||
check_install_oai_software() {
|
||||
|
||||
$SUDO apt-get update
|
||||
$SUDO apt-get install -y \
|
||||
autoconf \
|
||||
autoconf \
|
||||
automake \
|
||||
bison \
|
||||
build-essential \
|
||||
cmake \
|
||||
cmake-curses-gui \
|
||||
doxygen \
|
||||
doxygen-gui\
|
||||
texlive-latex-base\
|
||||
doxygen-gui \
|
||||
texlive-latex-base \
|
||||
ethtool \
|
||||
flex \
|
||||
gccxml \
|
||||
gdb \
|
||||
git \
|
||||
gccxml \
|
||||
gdb \
|
||||
git \
|
||||
graphviz \
|
||||
gtkwave \
|
||||
guile-2.0-dev \
|
||||
@@ -233,7 +242,7 @@ check_install_oai_software() {
|
||||
libgmp-dev \
|
||||
libgtk-3-dev \
|
||||
libidn2-0-dev \
|
||||
libidn11-dev \
|
||||
libidn11-dev \
|
||||
libmysqlclient-dev \
|
||||
liboctave-dev \
|
||||
libpgm-5.1 \
|
||||
@@ -255,7 +264,14 @@ check_install_oai_software() {
|
||||
openssl \
|
||||
python \
|
||||
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
|
||||
if [ `lsb_release -rs` = '12.04' ] ; then
|
||||
install_nettle_from_source
|
||||
@@ -263,10 +279,18 @@ check_install_oai_software() {
|
||||
else
|
||||
$SUDO apt-get install -y libgnutls-dev nettle-dev nettle-bin
|
||||
fi
|
||||
$SUDO pip install paramiko
|
||||
$SUDO pip install pyroute2
|
||||
install_asn1c_from_source
|
||||
$SUDO rm -fr /opt/ssh
|
||||
$SUDO git clone https://gist.github.com/2190472.git /opt/ssh
|
||||
}
|
||||
|
||||
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
|
||||
cd /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_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/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 >> /tmp/log_compile_asn1c
|
||||
./configure
|
||||
make > /tmp/log_compile_asn1c 2>&1
|
||||
make -j`nproc`
|
||||
$SUDO make install
|
||||
) > $asn1_install_dir 2>&1
|
||||
}
|
||||
|
||||
#################################################
|
||||
@@ -302,7 +328,6 @@ install_nas_tools() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
################################
|
||||
# set_openair_env
|
||||
###############################
|
||||
@@ -319,3 +344,60 @@ set_openair_env(){
|
||||
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
|
||||
# OpenAirInterface Admin: openair_admin@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
|
||||
#
|
||||
@@ -121,6 +121,7 @@ function main()
|
||||
echo "Cleaning TEST_EPC"
|
||||
fi
|
||||
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
|
||||
mkdir -m 777 -p -v build
|
||||
fi
|
||||
@@ -140,6 +141,13 @@ function main()
|
||||
compilations \
|
||||
epc_test 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
|
||||
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
|
||||
OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
|
||||
PS2PDF="ps2pdf"
|
||||
@@ -301,8 +301,8 @@ oaisim_otg_stats(){
|
||||
sync
|
||||
|
||||
if [ ! -f $OAISIM_EXEC ]; then
|
||||
echo_info "3.1 compiling OAISIM ($OPENAIR_TARGETS/cmake_targets/build_oai --oaisim -c)"
|
||||
($OPENAIR_TARGETS/cmake_targets/build_oai --oaisim -c >> results/perf_log.txt 2>&1 )
|
||||
echo_info "3.1 compiling OAISIM ($OPENAIR_DIR/cmake_targets/build_oai --oaisim -c --noS1)"
|
||||
($OPENAIR_DIR/cmake_targets/build_oai --oaisim -c --noS1 >> results/perf_log.txt 2>&1 )
|
||||
build_stats=$?
|
||||
if [ $build_stats != 0 ] ; then
|
||||
echo_error "$OAISIM_EXEC cannot be built, check results/perf_log.txt file"
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
################################################################################
|
||||
# file run_enb_s1_usrp
|
||||
# brief run script for eNB USRP.
|
||||
# author Lionel GAUTHIER
|
||||
# author Lionel GAUTHIER and Navid Nikaein
|
||||
# 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 " -g, --gdb Run with GDB."
|
||||
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 " -M, --target-dl-mcs mcs Downlink target MCS."
|
||||
echo_error " -m, --mscgen directory Generate mscgen output files in a directory"
|
||||
@@ -137,7 +139,27 @@ function main()
|
||||
shift;
|
||||
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
|
||||
# can omit file name if last arg on the line
|
||||
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 $2 testcase name
|
||||
# \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() {
|
||||
class=$1
|
||||
test_case=$2
|
||||
result=$3
|
||||
run_index=$4
|
||||
run_result=$4
|
||||
xmlfile_testcase=$5
|
||||
currtime=$(date +%s.%N)
|
||||
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_FAILED=$((XUNIT_FAILED+1))
|
||||
}
|
||||
@@ -43,15 +46,18 @@ xUnit_fail() {
|
||||
# \param $1 classname
|
||||
# \param $2 testcase name
|
||||
# \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() {
|
||||
class=$1
|
||||
test_case=$2
|
||||
result=$3
|
||||
run_index=$4
|
||||
run_result=$4
|
||||
xmlfile_testcase=$5
|
||||
currtime=$(date +%s.%N)
|
||||
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_SUCCESS=$((XUNIT_SUCCESS+1))
|
||||
}
|
||||
|
||||
@@ -5,7 +5,8 @@ export OPENAIR1_DIR=$OPENAIR_HOME/openair1
|
||||
export OPENAIR2_DIR=$OPENAIR_HOME/openair2
|
||||
export OPENAIR3_DIR=$OPENAIR_HOME/openair3
|
||||
export OPENAIR_TARGETS=$OPENAIR_HOME/targets
|
||||
export OPENAIRITS_DIR=$OPENAIR_HOME/openairITS
|
||||
|
||||
export PATH=$PATH:$OPENAIR_TARGETS/bin
|
||||
|
||||
alias oai='cd $OPENAIR_HOME'
|
||||
alias oai0='cd $OPENAIR0_DIR'
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#include "PHY/defs.h"
|
||||
#include "assertions.h"
|
||||
|
||||
//#define cmin(a,b) ((a)<(b) ? (a) : (b))
|
||||
|
||||
@@ -515,16 +516,14 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC,
|
||||
// if (rvidx==3)
|
||||
// for (cnt=0;cnt<Ncb;cnt++)
|
||||
// counter_buffer[rvidx][cnt]=0;
|
||||
if (Ncb<(3*(RTC<<5))) {
|
||||
msg("Exiting, RM condition (Nir %d, Nsoft %d, Kw %d\n",Nir,Nsoft,3*(RTC<<5));
|
||||
return(0);
|
||||
}
|
||||
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));
|
||||
|
||||
|
||||
Gp = G/Nl/Qm;
|
||||
GpmodC = Gp%C;
|
||||
|
||||
#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
|
||||
|
||||
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;
|
||||
|
||||
default:
|
||||
msg("Illegal oversampling %d\n",osf);
|
||||
printf("Illegal oversampling %d\n",osf);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
switch (frame_parms->N_RB_DL) {
|
||||
|
||||
case 100:
|
||||
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);
|
||||
}
|
||||
|
||||
frame_parms->ofdm_symbol_size = 2048;
|
||||
frame_parms->log2_symbol_size = 11;
|
||||
frame_parms->samples_per_tti = 30720;
|
||||
frame_parms->first_carrier_offset = 2048-600;
|
||||
if (frame_parms->threequarter_fs) {
|
||||
frame_parms->ofdm_symbol_size = 1536;
|
||||
frame_parms->samples_per_tti = 23040;
|
||||
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_RBG = 25;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
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);
|
||||
}
|
||||
|
||||
frame_parms->ofdm_symbol_size = 1024*osf;
|
||||
frame_parms->log2_symbol_size = 10+log2_osf;
|
||||
frame_parms->samples_per_tti = 15360*osf;
|
||||
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 300;
|
||||
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:
|
||||
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);
|
||||
}
|
||||
|
||||
frame_parms->ofdm_symbol_size = 512*osf;
|
||||
|
||||
frame_parms->log2_symbol_size = 9+log2_osf;
|
||||
|
||||
frame_parms->samples_per_tti = 7680*osf;
|
||||
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 150;
|
||||
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:
|
||||
frame_parms->ofdm_symbol_size = 256*osf;
|
||||
frame_parms->log2_symbol_size = 8+log2_osf;
|
||||
frame_parms->samples_per_tti = 3840*osf;
|
||||
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 90;
|
||||
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:
|
||||
frame_parms->ofdm_symbol_size = 128*osf;
|
||||
frame_parms->log2_symbol_size = 7+log2_osf;
|
||||
frame_parms->samples_per_tti = 1920*osf;
|
||||
frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 36;
|
||||
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;
|
||||
|
||||
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);
|
||||
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)
|
||||
{
|
||||
msg("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);
|
||||
msg("frame_parms->Nid_cell=%d\n",frame_parms->Nid_cell);
|
||||
msg("frame_parms->Ncp=%d\n",frame_parms->Ncp);
|
||||
msg("frame_parms->Ncp_UL=%d\n",frame_parms->Ncp_UL);
|
||||
msg("frame_parms->nushift=%d\n",frame_parms->nushift);
|
||||
msg("frame_parms->frame_type=%d\n",frame_parms->frame_type);
|
||||
msg("frame_parms->tdd_config=%d\n",frame_parms->tdd_config);
|
||||
msg("frame_parms->tdd_config_S=%d\n",frame_parms->tdd_config_S);
|
||||
msg("frame_parms->mode1_flag=%d\n",frame_parms->mode1_flag);
|
||||
msg("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);
|
||||
msg("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);
|
||||
msg("frame_parms->nb_prefix_samples=%d\n",frame_parms->nb_prefix_samples);
|
||||
msg("frame_parms->nb_prefix_samples0=%d\n",frame_parms->nb_prefix_samples0);
|
||||
msg("frame_parms->first_carrier_offset=%d\n",frame_parms->first_carrier_offset);
|
||||
msg("frame_parms->samples_per_tti=%d\n",frame_parms->samples_per_tti);
|
||||
msg("frame_parms->symbols_per_tti=%d\n",frame_parms->symbols_per_tti);
|
||||
printf("frame_parms->N_RB_DL=%d\n",frame_parms->N_RB_DL);
|
||||
printf("frame_parms->N_RB_UL=%d\n",frame_parms->N_RB_UL);
|
||||
printf("frame_parms->Nid_cell=%d\n",frame_parms->Nid_cell);
|
||||
printf("frame_parms->Ncp=%d\n",frame_parms->Ncp);
|
||||
printf("frame_parms->Ncp_UL=%d\n",frame_parms->Ncp_UL);
|
||||
printf("frame_parms->nushift=%d\n",frame_parms->nushift);
|
||||
printf("frame_parms->frame_type=%d\n",frame_parms->frame_type);
|
||||
printf("frame_parms->tdd_config=%d\n",frame_parms->tdd_config);
|
||||
printf("frame_parms->tdd_config_S=%d\n",frame_parms->tdd_config_S);
|
||||
printf("frame_parms->mode1_flag=%d\n",frame_parms->mode1_flag);
|
||||
printf("frame_parms->nb_antennas_tx=%d\n",frame_parms->nb_antennas_tx);
|
||||
printf("frame_parms->nb_antennas_rx=%d\n",frame_parms->nb_antennas_rx);
|
||||
printf("frame_parms->ofdm_symbol_size=%d\n",frame_parms->ofdm_symbol_size);
|
||||
printf("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);
|
||||
printf("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);
|
||||
printf("frame_parms->symbols_per_tti=%d\n",frame_parms->symbols_per_tti);
|
||||
}
|
||||
|
||||
@@ -38,25 +38,18 @@ extern int card;
|
||||
#endif
|
||||
|
||||
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
|
||||
exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
|
||||
uint16_t i;
|
||||
#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",
|
||||
rssi,
|
||||
phy_vars_ue->PHY_measurements.rssi,
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]
|
||||
rx_power_fil_dB,
|
||||
phy_vars_ue->PHY_measurements.rssi,
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]
|
||||
);
|
||||
|
||||
// Gain control with hysterisis
|
||||
|
||||
@@ -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
|
||||
void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
|
||||
uint32_t rx_power_fil_dB,
|
||||
unsigned char eNB_id);
|
||||
|
||||
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);
|
||||
|
||||
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,
|
||||
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);
|
||||
|
||||
|
||||
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 UE_id,
|
||||
unsigned char init_averaging);
|
||||
|
||||
@@ -703,24 +703,28 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
void (*idft)(int16_t *,int16_t *, int);
|
||||
|
||||
switch (phy_vars_ue->lte_frame_parms.log2_symbol_size) {
|
||||
case 7:
|
||||
switch (phy_vars_ue->lte_frame_parms.ofdm_symbol_size) {
|
||||
case 128:
|
||||
idft = idft128;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
case 256:
|
||||
idft = idft256;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
case 512:
|
||||
idft = idft512;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
case 1024:
|
||||
idft = idft1024;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
case 1536:
|
||||
idft = idft1536;
|
||||
break;
|
||||
|
||||
case 2048:
|
||||
idft = idft2048;
|
||||
break;
|
||||
|
||||
|
||||
@@ -39,57 +39,36 @@
|
||||
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 clear)
|
||||
{
|
||||
|
||||
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;
|
||||
PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNb->PHY_measurements_eNB[eNB_id];
|
||||
|
||||
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;
|
||||
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 rb;
|
||||
int32_t *ul_ch;
|
||||
int32_t n0_power_tot;
|
||||
|
||||
int len;
|
||||
int offset;
|
||||
int Nsymb = (frame_parms->Ncp==NORMAL)?14:12;
|
||||
// noise measurements
|
||||
// for the moment we measure the noise on the 7th OFDM symbol (in S subframe)
|
||||
|
||||
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++) {
|
||||
if (clear == 1)
|
||||
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],
|
||||
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_dB[aarx] = (unsigned short) dB_fixed(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_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);
|
||||
|
||||
|
||||
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
||||
|
||||
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)
|
||||
// ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][((19*(frame_parms->ofdm_symbol_size)) + frame_parms->first_carrier_offset + (rb*12))<<1];
|
||||
ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][((7*frame_parms->ofdm_symbol_size) + frame_parms->first_carrier_offset + (rb*12))<<1];
|
||||
else if (rb>12)
|
||||
ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][((7*frame_parms->ofdm_symbol_size) + 6 + (rb-13)*12)<<1];
|
||||
else {
|
||||
ul_ch = NULL;
|
||||
}
|
||||
|
||||
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[aarx][rb] = signal_energy_nodc(ul_ch,len);
|
||||
//((k1*(signal_energy_nodc(ul_ch,len)))
|
||||
// + (k2*phy_measurements->n0_subband_power[aarx][rb]));
|
||||
|
||||
phy_measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(phy_measurements->n0_subband_power[aarx][rb]);
|
||||
// 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),
|
||||
// phy_measurements->n0_subband_power_dB[aarx][rb]);
|
||||
n0_power_tot += phy_measurements->n0_subband_power[aarx][rb];
|
||||
}
|
||||
|
||||
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,
|
||||
unsigned char eNB_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;
|
||||
//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_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);
|
||||
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++)
|
||||
((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;
|
||||
|
||||
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
|
||||
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) {
|
||||
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);
|
||||
|
||||
@@ -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_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) {
|
||||
((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;
|
||||
|
||||
@@ -72,7 +72,7 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB,
|
||||
else if ((p==1) && (l>0))
|
||||
nu = 0;
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
||||
#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);
|
||||
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
|
||||
|
||||
mprime++;
|
||||
@@ -151,7 +151,7 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
else if ((p==1) && (l>0))
|
||||
nu = 0;
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
||||
#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);
|
||||
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
|
||||
|
||||
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_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};
|
||||
|
||||
@@ -2108,14 +2108,14 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
||||
if (dci_alloc[i].L == (uint8_t)L) {
|
||||
|
||||
#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);
|
||||
dump_dci(frame_parms,&dci_alloc[i]);
|
||||
#endif
|
||||
|
||||
if (dci_alloc[i].nCCE>=0) {
|
||||
if (dci_alloc[i].firstCCE>=0) {
|
||||
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].L,
|
||||
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]);
|
||||
#endif
|
||||
|
||||
if (dci_alloc[i].nCCE >= 0) {
|
||||
if (dci_alloc[i].firstCCE >= 0) {
|
||||
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].L,
|
||||
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));
|
||||
}
|
||||
|
||||
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 !
|
||||
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,
|
||||
int do_common,
|
||||
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].rnti = crc;
|
||||
dci_alloc[*dci_cnt].L = L;
|
||||
dci_alloc[*dci_cnt].nCCE = CCEind;
|
||||
dci_alloc[*dci_cnt].firstCCE = CCEind;
|
||||
|
||||
if (sizeof_bytes<=4) {
|
||||
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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
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->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB;
|
||||
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->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->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB;
|
||||
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];
|
||||
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->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB;
|
||||
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->vrb_type = vrb_type;
|
||||
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
|
||||
dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
|
||||
dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
|
||||
dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
|
||||
if (vrb_type==LOCALIZED) {
|
||||
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
|
||||
dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
|
||||
dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
|
||||
dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
|
||||
}
|
||||
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;
|
||||
@@ -1102,8 +1128,12 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -1237,6 +1267,9 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
|
||||
|
||||
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;
|
||||
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
|
||||
// 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
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -1986,10 +2025,16 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
|
||||
// reset HARQ process if this is the first transmission
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
dlsch0_harq->Nl = 1;
|
||||
|
||||
|
||||
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;
|
||||
// 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) ) {
|
||||
/* necessary test? */
|
||||
if (dlsch0_harq->status == SCH_IDLE)
|
||||
remove_harq_pid_from_freelist(dlsch0, harq_pid);
|
||||
dlsch0_harq->status = ACTIVE;
|
||||
dlsch0_harq->mcs = mcs1;
|
||||
}
|
||||
|
||||
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->mcs = mcs2;
|
||||
}
|
||||
@@ -2473,6 +2531,9 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
|
||||
|
||||
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;
|
||||
// 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;
|
||||
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;
|
||||
// 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
|
||||
|
||||
if (dlsch0) {
|
||||
msg("dlsch0 eNB: dlsch0 %p\n",dlsch0);
|
||||
msg("dlsch0 eNB: rnti %x\n",dlsch0->rnti);
|
||||
msg("dlsch0 eNB: NBRB %d\n",dlsch0_harq->nb_rb);
|
||||
msg("dlsch0 eNB: rballoc %x\n",dlsch0_harq->rb_alloc[0]);
|
||||
msg("dlsch0 eNB: harq_pid %d\n",harq_pid);
|
||||
msg("dlsch0 eNB: round %d\n",dlsch0_harq->round);
|
||||
msg("dlsch0 eNB: rvidx %d\n",dlsch0_harq->rvidx);
|
||||
msg("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB);
|
||||
msg("dlsch0 eNB: mcs %d\n",dlsch0_harq->mcs);
|
||||
msg("dlsch0 eNB: tpmi %d\n",tpmi);
|
||||
msg("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode);
|
||||
printf("dlsch0 eNB: dlsch0 %p\n",dlsch0);
|
||||
printf("dlsch0 eNB: rnti %x\n",dlsch0->rnti);
|
||||
printf("dlsch0 eNB: NBRB %d\n",dlsch0_harq->nb_rb);
|
||||
printf("dlsch0 eNB: rballoc %x\n",dlsch0_harq->rb_alloc[0]);
|
||||
printf("dlsch0 eNB: harq_pid %d\n",harq_pid);
|
||||
printf("dlsch0 eNB: round %d\n",dlsch0_harq->round);
|
||||
printf("dlsch0 eNB: rvidx %d\n",dlsch0_harq->rvidx);
|
||||
printf("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB);
|
||||
printf("dlsch0 eNB: mcs %d\n",dlsch0_harq->mcs);
|
||||
printf("dlsch0 eNB: tpmi %d\n",tpmi);
|
||||
printf("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -5511,15 +5575,15 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
#ifdef DEBUG_DCI
|
||||
|
||||
if (dlsch[0]) {
|
||||
msg("PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti);
|
||||
msg("PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb);
|
||||
msg("PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc[0]);
|
||||
msg("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid);
|
||||
msg("PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi);
|
||||
msg("PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx);
|
||||
msg("PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS);
|
||||
msg("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: rnti %x\n",dlsch[0]->rnti);
|
||||
printf("PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb);
|
||||
printf("PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc_even[0]);
|
||||
printf("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid);
|
||||
printf("PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi);
|
||||
printf("PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx);
|
||||
printf("PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS);
|
||||
printf("PDSCH dlsch0 UE: mcs %d\n",dlsch0_harq->mcs);
|
||||
printf("PDSCH dlsch0 UE: pwr_off %d\n",dlsch0_harq->dl_power_off);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -258,6 +258,13 @@ typedef struct {
|
||||
uint8_t error_threshold;
|
||||
/// Pointers to 8 HARQ processes for the DLSCH
|
||||
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
|
||||
uint32_t G;
|
||||
/// Codebook index for this dlsch (0,1,2,3)
|
||||
@@ -266,6 +273,8 @@ typedef struct {
|
||||
uint8_t Mdlharq;
|
||||
/// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
|
||||
uint8_t Kmimo;
|
||||
/// Nsoft parameter related to UE Category
|
||||
uint32_t Nsoft;
|
||||
/// amplitude of PDSCH (compared to RS) in symbols without pilots
|
||||
int16_t sqrt_rho_a;
|
||||
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
|
||||
@@ -576,13 +585,13 @@ typedef struct {
|
||||
/// UL RSSI per receive antenna
|
||||
int32_t UL_rssi[NB_ANTENNAS_RX];
|
||||
/// PUCCH1a/b power (digital linear)
|
||||
int32_t Po_PUCCH;
|
||||
uint32_t Po_PUCCH;
|
||||
/// PUCCH1a/b power (dBm)
|
||||
int32_t Po_PUCCH_dBm;
|
||||
/// 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
|
||||
int32_t Po_PUCCH1_above;
|
||||
uint32_t Po_PUCCH1_above;
|
||||
/// Indicator that Po_PUCCH has been updated by PHY
|
||||
int32_t Po_PUCCH_update;
|
||||
/// DL Wideband CQI index (2 TBs)
|
||||
@@ -693,6 +702,8 @@ typedef struct {
|
||||
uint8_t Mdlharq;
|
||||
/// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
|
||||
uint8_t Kmimo;
|
||||
/// Nsoft parameter related to UE Category
|
||||
uint32_t Nsoft;
|
||||
/// Maximum number of Turbo iterations
|
||||
uint8_t max_turbo_iterations;
|
||||
/// accumulated tx power adjustment for PUCCH
|
||||
@@ -737,7 +748,7 @@ typedef struct {
|
||||
/// Aggregation level
|
||||
uint8_t L;
|
||||
/// Position of first CCE of the dci
|
||||
int nCCE;
|
||||
int firstCCE;
|
||||
/// flag to indicate that this is a RA response
|
||||
boolean_t ra_flag;
|
||||
/// 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;
|
||||
@@ -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));
|
||||
dlsch->Kmimo = Kmimo;
|
||||
dlsch->Mdlharq = Mdlharq;
|
||||
dlsch->Nsoft = Nsoft;
|
||||
|
||||
for (i=0; i<10; i++)
|
||||
dlsch->harq_ids[i] = Mdlharq;
|
||||
|
||||
dlsch->head_freelist = 0;
|
||||
dlsch->tail_freelist = 0;
|
||||
|
||||
for (i=0; i<Mdlharq; i++) {
|
||||
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",
|
||||
@@ -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);
|
||||
exit_flag=3;
|
||||
}
|
||||
|
||||
put_harq_pid_in_freelist(dlsch, i);
|
||||
}
|
||||
|
||||
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]->e+r_offset,
|
||||
dlsch->harq_processes[harq_pid]->C, // C
|
||||
NSOFT, // Nsoft,
|
||||
dlsch->Nsoft, // Nsoft,
|
||||
dlsch->Mdlharq,
|
||||
dlsch->Kmimo,
|
||||
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;
|
||||
@@ -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));
|
||||
dlsch->Kmimo = Kmimo;
|
||||
dlsch->Mdlharq = Mdlharq;
|
||||
dlsch->Nsoft = Nsoft;
|
||||
dlsch->max_turbo_iterations = max_turbo_iterations;
|
||||
|
||||
for (i=0; i<Mdlharq; i++) {
|
||||
@@ -353,7 +354,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
(uint8_t*)&dummy_w[r][0],
|
||||
dlsch_llr+r_offset,
|
||||
harq_process->C,
|
||||
NSOFT,
|
||||
dlsch->Nsoft,
|
||||
dlsch->Mdlharq,
|
||||
dlsch->Kmimo,
|
||||
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 (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
|
||||
len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
|
||||
} else {
|
||||
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);
|
||||
|
||||
for (i=0; i<len; i++) {
|
||||
*llr32 = *rxF;
|
||||
// printf("llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]);
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
#include "gain_control.h"
|
||||
#endif
|
||||
|
||||
#if defined(OAI_USRP) || defined(EXMIMO)
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
|
||||
#include "common_lib.h"
|
||||
extern openair0_config_t openair0_cfg[];
|
||||
#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;
|
||||
// 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;
|
||||
int i;
|
||||
int ret=-1;
|
||||
int aarx,rx_power=0;
|
||||
/*#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->frame_type=FDD;
|
||||
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);
|
||||
|
||||
/*#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*/
|
||||
/*
|
||||
write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
exit(-1);
|
||||
*/
|
||||
sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata,
|
||||
frame_parms,
|
||||
(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);
|
||||
#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
|
||||
|
||||
// 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
|
||||
|
||||
if (phy_vars_ue->UE_scan_carrier == 0) {
|
||||
#ifdef OPENAIR2
|
||||
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id);
|
||||
//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);
|
||||
#endif //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);
|
||||
//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);
|
||||
phy_vars_ue->UE_mode[0] = PRACH;
|
||||
}
|
||||
else {
|
||||
phy_vars_ue->UE_mode[0] = PUSCH;
|
||||
}
|
||||
|
||||
generate_pcfich_reg_mapping(frame_parms);
|
||||
generate_phich_reg_mapping(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_conseq=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,
|
||||
phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource],
|
||||
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",
|
||||
phy_vars_ue->Mod_id,
|
||||
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");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
#endif
|
||||
|
||||
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"
|
||||
extern openair0_config_t openair0_cfg[];
|
||||
#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)) {
|
||||
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.rssi)-phy_vars_ue->rx_total_gain_dB,
|
||||
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],
|
||||
@@ -96,20 +97,20 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
|
||||
#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]);
|
||||
#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);
|
||||
#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);
|
||||
#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] timing_advance = %d\n",phy_vars_ue->timing_advance);
|
||||
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",
|
||||
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),
|
||||
mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0),
|
||||
PHY_vars_UE_g[0][0]->ulsch_ue[0]->PHR);
|
||||
phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH,
|
||||
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",
|
||||
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+
|
||||
@@ -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[1]);
|
||||
|
||||
len += sprintf(&buffer[len],"[eNB PROC] Subband I0: ");
|
||||
|
||||
for (i=0; i<25; i++)
|
||||
len += sprintf(&buffer[len],"%2d ",
|
||||
phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dB[i]);
|
||||
len += sprintf(&buffer[len],"[eNB PROC] PRB I0 (%X.%X.%X.%X): ",
|
||||
phy_vars_eNB->rb_mask_ul[0],
|
||||
phy_vars_eNB->rb_mask_ul[1],phy_vars_eNB->rb_mask_ul[2],phy_vars_eNB->rb_mask_ul[3]);
|
||||
|
||||
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[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]),
|
||||
phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[0],
|
||||
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,
|
||||
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_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),
|
||||
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,
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
/** \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
|
||||
@returns Pointer to DLSCH to be removed
|
||||
@param Kmimo Kmimo factor from 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)
|
||||
@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)
|
||||
\brief This function frees memory allocated for a particular DLSCH at UE
|
||||
@@ -72,8 +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);
|
||||
|
||||
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);
|
||||
|
||||
/** \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
|
||||
@returns Pointer to DLSCH to be removed
|
||||
@param Kmimo Kmimo factor from 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)
|
||||
@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);
|
||||
@@ -84,9 +93,6 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t Mdlharq,uint8_t max_turbo_iterations,uint
|
||||
|
||||
LTE_UE_ULSCH_t *new_ue_ulsch(uint8_t Mdlharq, unsigned char N_RB_UL, uint8_t abstraction_flag);
|
||||
|
||||
uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n);
|
||||
|
||||
|
||||
/** \fn dlsch_encoding(uint8_t *input_buffer,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t num_pdcch_symbols,
|
||||
@@ -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);
|
||||
|
||||
/* \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 rb_alloc_dci rballoc field from 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
|
||||
@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);
|
||||
|
||||
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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
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);
|
||||
|
||||
@@ -1637,22 +1658,22 @@ void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t subframe);
|
||||
|
||||
|
||||
int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t UE_id,
|
||||
uint16_t n1_pucch,
|
||||
uint16_t n2_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint8_t *payload,
|
||||
uint8_t subframe,
|
||||
uint8_t pucch1_thres);
|
||||
uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t UE_id,
|
||||
uint16_t n1_pucch,
|
||||
uint16_t n2_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint8_t *payload,
|
||||
uint8_t subframe,
|
||||
uint8_t pucch1_thres);
|
||||
|
||||
int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t UE_index,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t n1_pucch_sel,
|
||||
uint8_t *payload,
|
||||
uint8_t subframe);
|
||||
uint8_t UE_index,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t n1_pucch_sel,
|
||||
uint8_t *payload,
|
||||
uint8_t subframe);
|
||||
|
||||
|
||||
/*!
|
||||
@@ -1769,5 +1790,7 @@ double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
|
||||
|
||||
uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapindex, uint16_t Nf);
|
||||
|
||||
uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n);
|
||||
|
||||
/**@}*/
|
||||
#endif
|
||||
|
||||
@@ -430,15 +430,15 @@ void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
}
|
||||
|
||||
int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t UE_id,
|
||||
uint16_t n1_pucch,
|
||||
uint16_t n2_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint8_t *payload,
|
||||
uint8_t subframe,
|
||||
uint8_t pucch1_thres)
|
||||
uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t UE_id,
|
||||
uint16_t n1_pucch,
|
||||
uint16_t n2_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint8_t *payload,
|
||||
uint8_t subframe,
|
||||
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_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];
|
||||
int8_t sigma2_dB = phy_vars_eNB->PHY_measurements_eNB[0].n0_power_dB[0];
|
||||
int32_t *Po_PUCCH = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH);
|
||||
int8_t sigma2_dB = phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dB[6];
|
||||
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_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_below = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below);
|
||||
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);
|
||||
uint32_t u,v,n,aa;
|
||||
uint32_t z[12*14];
|
||||
@@ -468,7 +468,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint32_t symbol_offset;
|
||||
int16_t stat_ref_re,stat_ref_im,*cfo,chest_re,chest_im;
|
||||
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 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 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)];
|
||||
int chL;
|
||||
|
||||
if (first_call == 1) {
|
||||
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)) {
|
||||
LOG_E(PHY,"[eNB] rx_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift);
|
||||
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];
|
||||
|
||||
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_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(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))/nsymb;
|
||||
off+=2;
|
||||
|
||||
|
||||
#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],
|
||||
cfo[l<<1],cfo[1+(l<<1)],
|
||||
stat_re,stat_im);
|
||||
stat_re,stat_im,stat);
|
||||
#endif
|
||||
}
|
||||
|
||||
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_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(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))/nsymb;
|
||||
off+=2;
|
||||
|
||||
#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],
|
||||
cfo[l2<<1],cfo[1+(l2<<1)],
|
||||
stat_re,stat_im);
|
||||
stat_re,stat_im,stat);
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
stat += (stat_re*stat_re) + (stat_im*stat_im);
|
||||
stat += ((stat_re*stat_re) + (stat_im*stat_im));
|
||||
|
||||
} //re
|
||||
} // aa
|
||||
|
||||
@@ -772,16 +779,18 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
} //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
|
||||
LOG_D(PHY,"[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max);
|
||||
#endif
|
||||
|
||||
#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
|
||||
|
||||
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;
|
||||
|
||||
/*
|
||||
@@ -798,13 +807,13 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {
|
||||
*payload = 1;
|
||||
*Po_PUCCH1_above = ((*Po_PUCCH1_above<<9) + (stat_max<<9)+1024)>>10;
|
||||
|
||||
//LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max);
|
||||
}
|
||||
else {
|
||||
*payload = 0;
|
||||
*Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10;
|
||||
}
|
||||
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;
|
||||
|
||||
} 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");
|
||||
#endif
|
||||
|
||||
for (phase=0; phase<7; phase++) {
|
||||
for (phase=3;phase<4;phase++){ //phase=0; phase<7; phase++) {
|
||||
stat=0;
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) {
|
||||
if ((l2<2) || ((l2>(nsymb>>1) - 3)) ) { // data symbols
|
||||
stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15);
|
||||
@@ -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
|
||||
LOG_D(PHY,"aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat);
|
||||
#endif
|
||||
|
||||
stat += ((((stat_re*stat_re)) + ((stat_im*stat_im)) +
|
||||
((stat_ref_re*stat_ref_re)) + ((stat_ref_im*stat_ref_im)))/nsymb);
|
||||
|
||||
|
||||
} //re
|
||||
} // aa
|
||||
|
||||
#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
|
||||
|
||||
if (stat>stat_max) {
|
||||
stat_max = stat;
|
||||
phase_max = phase;
|
||||
}
|
||||
} //phase
|
||||
|
||||
stat_max/=(nsymb*12); //normalize to energy per symbol and RE
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, phase_max : %d\n",stat_max,phase_max);
|
||||
#endif
|
||||
stat_max/=(12); //normalize to energy per symbol and RE
|
||||
//#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH fmt1a/b: stat_max : %d, phase_max : %d\n",stat_max,phase_max);
|
||||
//#endif
|
||||
|
||||
stat_re=0;
|
||||
stat_im=0;
|
||||
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_dBm = dB_fixed(*Po_PUCCH) - phy_vars_eNB->rx_total_gain_eNB_dB;
|
||||
*Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1));
|
||||
*Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - phy_vars_eNB->rx_total_gain_eNB_dB;
|
||||
*Po_PUCCH_update = 1;
|
||||
|
||||
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;
|
||||
|
||||
chL = (nsymb>>1)-4;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
for (re=0; re<12; re++) {
|
||||
chest_re=0;
|
||||
@@ -915,8 +931,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
// channel estimate for first slot
|
||||
for (l=2; l<(nsymb>>1)-2; l++) {
|
||||
off=(re<<1) + (24*l);
|
||||
chest_re += ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
|
||||
chest_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(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))/chL;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
@@ -928,8 +944,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
off=(re<<1) + (24*l);
|
||||
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
|
||||
tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
|
||||
stat_re += ((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15);
|
||||
stat_im += ((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15);
|
||||
stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
|
||||
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||
off+=2;
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
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);
|
||||
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
|
||||
tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
|
||||
stat_re += ((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15);
|
||||
stat_im += ((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15);
|
||||
stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15)/4);
|
||||
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15)/4);
|
||||
off+=2;
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
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
|
||||
for (l=2; l<(nsymb>>1)-2; l++) {
|
||||
off=(re<<1) + (24*l) + (nsymb>>1)*24;
|
||||
chest_re += ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
|
||||
chest_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(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))/chL;
|
||||
}
|
||||
|
||||
#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;
|
||||
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
|
||||
tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
|
||||
stat_re += ((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15);
|
||||
stat_im += ((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15);
|
||||
stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
|
||||
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||
off+=2;
|
||||
#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,
|
||||
@@ -988,8 +1004,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
off=(re<<1) + (24*l) + (nsymb>>1)*24;
|
||||
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
|
||||
tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
|
||||
stat_re += ((tmp_re*chest_re)>>9) + ((tmp_im*chest_im)>>9);
|
||||
stat_im += ((tmp_re*chest_im)>>9) - ((tmp_im*chest_re)>>9);
|
||||
stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
|
||||
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||
off+=2;
|
||||
#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,
|
||||
@@ -1007,20 +1023,27 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
} // aa
|
||||
|
||||
#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]));
|
||||
#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;
|
||||
|
||||
if (fmt==pucch_format1b)
|
||||
*(1+payload) = (stat_im<0) ? 1 : 0;
|
||||
} else { // insufficient energy on PUCCH so NAK
|
||||
*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)
|
||||
*(1+payload) = 0;
|
||||
@@ -1054,7 +1077,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -1657,8 +1657,15 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
} else {
|
||||
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],
|
||||
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
|
||||
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],
|
||||
|
||||
@@ -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.
|
||||
|
||||
@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 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_prefix_samples The number of prefix/suffix/zero samples
|
||||
@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,
|
||||
int *output,
|
||||
unsigned char log2fftsize,
|
||||
int fftsize,
|
||||
unsigned char nb_symbols,
|
||||
unsigned short nb_prefix_samples,
|
||||
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)));
|
||||
#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
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
frame_parms->ofdm_symbol_size,
|
||||
1, // number of symbols
|
||||
frame_parms->nb_prefix_samples0, // number of prefix samples
|
||||
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));
|
||||
#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
|
||||
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
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
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
|
||||
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 short nb_prefix_samples, /// cyclic prefix length
|
||||
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;
|
||||
void (*idft)(int16_t *,int16_t *, int);
|
||||
|
||||
switch (log2fftsize) {
|
||||
case 7:
|
||||
switch (fftsize) {
|
||||
case 128:
|
||||
idft = idft128;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
case 256:
|
||||
idft = idft256;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
case 512:
|
||||
idft = idft512;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
case 1024:
|
||||
idft = idft1024;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
case 1536:
|
||||
idft = idft1536;
|
||||
break;
|
||||
|
||||
case 2048:
|
||||
idft = idft2048;
|
||||
break;
|
||||
|
||||
@@ -127,8 +131,8 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
||||
}
|
||||
|
||||
#ifdef DEBUG_OFDM_MOD
|
||||
msg("[PHY] OFDM mod (size %d,prefix %d) Symbols %d, input %p, output %p\n",
|
||||
1<<log2fftsize,nb_prefix_samples,nb_symbols,input,output);
|
||||
printf("[PHY] OFDM mod (size %d,prefix %d) Symbols %d, input %p, output %p\n",
|
||||
fftsize,nb_prefix_samples,nb_symbols,input,output);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -136,35 +140,31 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
||||
for (i=0; i<nb_symbols; i++) {
|
||||
|
||||
#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
|
||||
|
||||
idft((int16_t *)&input[i<<log2fftsize],
|
||||
(log2fftsize==7) ? (int16_t *)temp : (int16_t *)&output[(i<<log2fftsize) + ((1+i)*nb_prefix_samples)],
|
||||
idft((int16_t *)&input[i*fftsize],
|
||||
(fftsize==128) ? (int16_t *)temp : (int16_t *)&output[(i*fftsize) + ((1+i)*nb_prefix_samples)],
|
||||
1);
|
||||
// write_output("fft_out.m","fftout",temp,(1<<log2fftsize)*2,1,1);
|
||||
|
||||
//memset(temp,0,1<<log2fftsize);
|
||||
|
||||
|
||||
// Copy to frame buffer with Cyclic Extension
|
||||
// Note: will have to adjust for synchronization offset!
|
||||
|
||||
switch (etype) {
|
||||
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;
|
||||
|
||||
|
||||
// msg("Doing cyclic prefix method\n");
|
||||
|
||||
if (log2fftsize==7) {
|
||||
for (j=0; j<((1<<log2fftsize)) ; j++) {
|
||||
if (fftsize==128) {
|
||||
for (j=0; j<fftsize ; j++) {
|
||||
output_ptr[j] = temp_ptr[j];
|
||||
}
|
||||
}
|
||||
|
||||
j=(1<<log2fftsize);
|
||||
j=fftsize;
|
||||
|
||||
for (k=-1; k>=-nb_prefix_samples; k--) {
|
||||
output_ptr[k] = output_ptr[--j];
|
||||
@@ -175,19 +175,19 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
||||
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;
|
||||
|
||||
// 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];
|
||||
}
|
||||
|
||||
|
||||
for (j=0; j<nb_prefix_samples; j++)
|
||||
output_ptr[(1<<log2fftsize)+j] = output_ptr[j];
|
||||
output_ptr[fftsize+j] = output_ptr[j];
|
||||
|
||||
break;
|
||||
|
||||
@@ -198,11 +198,11 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
||||
case NONE:
|
||||
|
||||
// msg("NO EXTENSION!\n");
|
||||
output_ptr = &output[(i<<log2fftsize)];
|
||||
output_ptr = &output[fftsize];
|
||||
|
||||
temp_ptr = (int *)temp;
|
||||
|
||||
for (j=0; j<(1<<log2fftsize) ; j++) {
|
||||
for (j=0; j<fftsize ; j++) {
|
||||
output_ptr[j] = temp_ptr[2*j];
|
||||
|
||||
|
||||
@@ -219,14 +219,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)]);
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -244,7 +237,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);
|
||||
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
||||
&txdata[aa][slot_offset], // output
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
frame_parms->ofdm_symbol_size,
|
||||
12, // number of symbols
|
||||
frame_parms->ofdm_symbol_size>>2, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
@@ -252,7 +245,7 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t
|
||||
if (frame_parms->Ncp == EXTENDED)
|
||||
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
||||
&txdata[aa][slot_offset], // output
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
frame_parms->ofdm_symbol_size,
|
||||
2, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
@@ -268,7 +261,7 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t
|
||||
if (frame_parms->Ncp == EXTENDED)
|
||||
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
||||
&txdata[aa][slot_offset], // output
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
frame_parms->ofdm_symbol_size,
|
||||
6, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
|
||||
@@ -58,24 +58,28 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
void (*dft)(int16_t *,int16_t *, int);
|
||||
int tmp_dft_in[256]; // This is for misalignment issues for 6 and 15 PRBs
|
||||
|
||||
switch (frame_parms->log2_symbol_size) {
|
||||
case 7:
|
||||
switch (frame_parms->ofdm_symbol_size) {
|
||||
case 128:
|
||||
dft = dft128;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
case 256:
|
||||
dft = dft256;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
case 512:
|
||||
dft = dft512;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
case 1024:
|
||||
dft = dft1024;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
case 1536:
|
||||
dft = dft1536;
|
||||
break;
|
||||
|
||||
case 2048:
|
||||
dft = dft2048;
|
||||
break;
|
||||
|
||||
@@ -96,12 +100,12 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
|
||||
if (l<0 || l>=7-frame_parms->Ncp) {
|
||||
msg("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
|
||||
printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
if (Ns<0 || Ns>=20) {
|
||||
msg("slot_fep: Ns must be between 0 and 19\n");
|
||||
printf("slot_fep: Ns must be between 0 and 19\n");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
@@ -116,7 +120,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
// if (phy_vars_ue->frame <100)
|
||||
msg("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", phy_vars_ue->frame_rx,Ns, symbol,
|
||||
printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", phy_vars_ue->frame_rx,Ns, symbol,
|
||||
nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset);
|
||||
#endif
|
||||
|
||||
@@ -147,7 +151,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
// if (phy_vars_ue->frame <100)
|
||||
msg("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", phy_vars_ue->frame_rx,Ns, symbol,
|
||||
printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", phy_vars_ue->frame_rx,Ns, symbol,
|
||||
nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset);
|
||||
#endif
|
||||
|
||||
@@ -182,7 +186,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx_eNB; aa++) {
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
msg("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
|
||||
printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
|
||||
#endif
|
||||
start_meas(&phy_vars_ue->dlsch_channel_estimation_stats);
|
||||
lte_dl_channel_estimation(phy_vars_ue,eNB_id,0,
|
||||
@@ -205,7 +209,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
// do frequency offset estimation here!
|
||||
// use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1})
|
||||
#ifdef DEBUG_FEP
|
||||
msg("Frequency offset estimation\n");
|
||||
printf("Frequency offset estimation\n");
|
||||
#endif
|
||||
|
||||
if (l==(4-frame_parms->Ncp)) {
|
||||
@@ -222,7 +226,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
msg("slot_fep: done\n");
|
||||
printf("slot_fep: done\n");
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
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;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
case 256:
|
||||
dft = dft256;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
case 512:
|
||||
dft = dft512;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
case 1024:
|
||||
dft = dft1024;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
case 1536:
|
||||
dft = dft1536;
|
||||
break;
|
||||
|
||||
case 2048:
|
||||
dft = dft2048;
|
||||
break;
|
||||
|
||||
|
||||
@@ -50,24 +50,28 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
void (*dft)(int16_t *,int16_t *, int);
|
||||
|
||||
switch (frame_parms->log2_symbol_size) {
|
||||
case 7:
|
||||
switch (frame_parms->ofdm_symbol_size) {
|
||||
case 128:
|
||||
dft = dft128;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
case 256:
|
||||
dft = dft256;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
case 512:
|
||||
dft = dft512;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
case 1024:
|
||||
dft = dft1024;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
case 1536:
|
||||
dft = dft1536;
|
||||
break;
|
||||
|
||||
case 2048:
|
||||
dft = dft2048;
|
||||
break;
|
||||
|
||||
|
||||
@@ -115,11 +115,11 @@ int32_t dot_product(int16_t *x,
|
||||
// convert back to integer
|
||||
result = _mm_cvtsi64_si32(mmtmp7);
|
||||
|
||||
return(result);
|
||||
|
||||
_mm_empty();
|
||||
_m_empty();
|
||||
|
||||
return(result);
|
||||
|
||||
#elif defined(__arm__)
|
||||
int16x4_t *x_128=(int16x4_t*)x;
|
||||
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,
|
||||
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)|
|
||||
// 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_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1));
|
||||
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_im = _mm_srai_epi32(tmp_im,output_shift);
|
||||
tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im);
|
||||
@@ -130,3 +130,4 @@ int mult_cpx_conj_vector(int16_t *x1,
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
//cmult_sv.h
|
||||
|
||||
/*!\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.
|
||||
@param x Vector input (Q1.15)
|
||||
@@ -95,192 +97,14 @@ void multadd_complex_vector_real_scalar(int16_t *x,
|
||||
uint8_t zero_flag,
|
||||
uint32_t N);
|
||||
|
||||
|
||||
/*!\fn int32_t mult_cpx_vector(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 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,
|
||||
int rotate_cpx_vector(int16_t *x,
|
||||
int16_t *alpha,
|
||||
int16_t *y,
|
||||
uint32_t N);
|
||||
|
||||
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);
|
||||
uint32_t N,
|
||||
uint16_t output_shift);
|
||||
|
||||
|
||||
/*!\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)
|
||||
\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
|
||||
*/
|
||||
|
||||
//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,
|
||||
uint8_t logsize,
|
||||
uint16_t *rev);
|
||||
@@ -355,6 +198,7 @@ int32_t rotate_cpx_vector(int16_t *x,
|
||||
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)
|
||||
This function performs componentwise addition of a vector with a complex scalar.
|
||||
|
||||
@@ -45,8 +45,10 @@
|
||||
#define debug_msg
|
||||
#define ONE_OVER_SQRT2_Q15 23170
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#define ONE_OVER_SQRT3_Q15 18919
|
||||
|
||||
#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_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_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);
|
||||
|
||||
*re32 = _mm_add_epi32(*re32,cmac_tmp_re32);
|
||||
@@ -3180,6 +3182,8 @@ void idft1536(int16_t *input, int16_t *output)
|
||||
int i,i2,j;
|
||||
uint32_t tmp[3][512 ]__attribute__((aligned(16)));
|
||||
uint32_t tmpo[3][512] __attribute__((aligned(16)));
|
||||
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++) {
|
||||
tmp[0][i] = ((uint32_t *)input)[j++];
|
||||
@@ -3190,17 +3194,6 @@ void idft1536(int16_t *input, int16_t *output)
|
||||
idft512((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
|
||||
idft512((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),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) {
|
||||
ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]),
|
||||
@@ -3209,6 +3202,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();
|
||||
_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_color( fdui->rxsig_t, FL_BLACK, FL_RED );
|
||||
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
|
||||
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);
|
||||
|
||||
// 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_color( fdui->pucch_comp1, FL_BLACK, FL_YELLOW );
|
||||
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 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;
|
||||
int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
|
||||
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_comp;
|
||||
int32_t *pucch1_comp;
|
||||
int16_t *pucch1ab_comp;
|
||||
int32_t *pucch1_thres;
|
||||
int32_t *pucch1ab_comp;
|
||||
float Re,Im,ymax;
|
||||
float *llr, *bit;
|
||||
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 chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
|
||||
float *chest_f_abs;
|
||||
float time[FRAME_LENGTH_COMPLEX_SAMPLES];
|
||||
float time2[2048];
|
||||
float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
|
||||
int frame = phy_vars_enb->proc[0].frame_tx;
|
||||
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_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];
|
||||
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
|
||||
if (rxsig_t != NULL) {
|
||||
@@ -236,19 +239,21 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
||||
|
||||
if (chest_t[0] !=NULL) {
|
||||
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)
|
||||
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++) {
|
||||
if (chest_t[arx] !=NULL) {
|
||||
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)
|
||||
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
|
||||
if (pucch1ab_comp!=NULL) {
|
||||
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]);
|
||||
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_comp1,B_pucch,A_pucch,1024,"","","");
|
||||
fl_set_xyplot_xbounds(form->pucch_comp,-200,200);
|
||||
fl_set_xyplot_ybounds(form->pucch_comp,-100,100);
|
||||
fl_set_xyplot_ybounds(form->pucch_comp1,10,40);
|
||||
fl_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED);
|
||||
fl_set_xyplot_ybounds(form->pucch_comp,-5000,5000);
|
||||
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_color( fdui->rxsig_t, FL_BLACK, FL_RED );
|
||||
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
|
||||
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
|
||||
if (pdsch_llr != NULL) {
|
||||
for (i=0; i<coded_bits_per_codeword/4; i++) {
|
||||
llr[i] = (float) pdsch_llr[4*i];
|
||||
for (i=0; i<coded_bits_per_codeword; i++) {
|
||||
llr[i] = (float) pdsch_llr[i];
|
||||
bit[i] = (float) i;
|
||||
}
|
||||
|
||||
fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword/4);
|
||||
fl_set_xyplot_data(form->pdsch_llr,bit,llr,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,"","","");
|
||||
}
|
||||
|
||||
// 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++) {
|
||||
|
||||
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
|
||||
|
||||
*******************************************************************************/
|
||||
#ifndef __TIME_MEAS_DEFS__H__
|
||||
#define __TIME_MEAS_DEFS__H__
|
||||
|
||||
#include <unistd.h>
|
||||
#include <math.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;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
+18
-2
@@ -76,6 +76,13 @@
|
||||
#define openair_free(y,x) free((y))
|
||||
#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.
|
||||
//! If no more memory is available, this function will terminate the program with an assertion error.
|
||||
static inline void* malloc16_clear( size_t size )
|
||||
@@ -271,6 +278,9 @@ typedef struct PHY_VARS_eNB_s {
|
||||
int **dl_precoder_SeNB[3];
|
||||
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)
|
||||
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
|
||||
@@ -313,6 +323,8 @@ typedef struct PHY_VARS_eNB_s {
|
||||
struct PhysicalConfigDedicated *physicalConfigDedicated[NUMBER_OF_UE_MAX];
|
||||
|
||||
|
||||
uint32_t rb_mask_ul[4];
|
||||
|
||||
/// Information regarding TM5
|
||||
MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];
|
||||
|
||||
@@ -374,12 +386,13 @@ typedef struct PHY_VARS_eNB_s {
|
||||
#ifdef LOCALIZATION
|
||||
/// time state for localization
|
||||
time_stats_t localization_stats;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10];
|
||||
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[NUMBER_OF_UE_MAX][10*1024];
|
||||
int32_t pucch1ab_stats[NUMBER_OF_UE_MAX][2*10*1024];
|
||||
|
||||
#if ENABLE_RAL
|
||||
hash_table_t *ral_thresholds_timed;
|
||||
@@ -569,6 +582,9 @@ typedef struct {
|
||||
/// holds the maximum channel/precoder coefficient
|
||||
char log2_maxp;
|
||||
|
||||
/// if ==0 enables phy only test mode
|
||||
int mac_enabled;
|
||||
|
||||
/// Flag to initialize averaging of PHY measurements
|
||||
int init_averaging;
|
||||
|
||||
|
||||
@@ -516,10 +516,10 @@ typedef struct {
|
||||
uint8_t dual_tx;
|
||||
/// flag to indicate SISO transmission
|
||||
uint8_t mode1_flag;
|
||||
/// Indicator that 20 MHz channel uses 3/4 sampling frequency
|
||||
uint8_t threequarter_fs;
|
||||
/// Size of FFT
|
||||
uint16_t ofdm_symbol_size;
|
||||
/// log2(Size of FFT)
|
||||
uint8_t log2_symbol_size;
|
||||
/// Number of prefix samples in all but first symbol of slot
|
||||
uint16_t nb_prefix_samples;
|
||||
/// Number of prefix samples in first symbol of slot
|
||||
|
||||
@@ -44,7 +44,14 @@
|
||||
/** @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_
|
||||
* @{
|
||||
* 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_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_ZERO_CARRIERS (NUMBER_OF_OFDM_CARRIERS-NUMBER_OF_USEFUL_CARRIERS)
|
||||
#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_HARQ_PID_MAX 8
|
||||
|
||||
#if defined(CBMIMO1) || defined(EXMIMO) || defined(OAI_USRP)
|
||||
#define MAX_FRAME_NUMBER 0x400
|
||||
#if defined(CBMIMO1) || defined(EXMIMO) || defined(OAI_USRP)
|
||||
#define NUMBER_OF_eNB_MAX 1
|
||||
#define NUMBER_OF_UE_MAX 4
|
||||
#define NUMBER_OF_CONNECTED_eNB_MAX 3
|
||||
#else
|
||||
#define MAX_FRAME_NUMBER 0xFFFF
|
||||
#ifdef LARGE_SCALE
|
||||
#define NUMBER_OF_eNB_MAX 2
|
||||
#define NUMBER_OF_UE_MAX 120
|
||||
@@ -471,13 +476,13 @@ typedef struct {
|
||||
//! estimated avg noise power (dB)
|
||||
short n0_power_tot_dBm;
|
||||
//! estimated avg noise power per RB per RX ant (lin)
|
||||
unsigned short n0_subband_power[NB_ANTENNAS_RX][25];
|
||||
unsigned short n0_subband_power[NB_ANTENNAS_RX][100];
|
||||
//! estimated avg noise power per RB per RX ant (dB)
|
||||
unsigned short n0_subband_power_dB[NB_ANTENNAS_RX][25];
|
||||
unsigned short n0_subband_power_dB[NB_ANTENNAS_RX][100];
|
||||
//! 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)
|
||||
short n0_subband_power_tot_dBm[25];
|
||||
short n0_subband_power_tot_dBm[100];
|
||||
// eNB measurements (per user)
|
||||
//! estimated received spatial signal power (linear)
|
||||
unsigned int rx_spatial_power[NUMBER_OF_UE_MAX][2][2];
|
||||
@@ -497,13 +502,13 @@ typedef struct {
|
||||
/// Wideband CQI (sum of all RX antennas, in dB)
|
||||
char wideband_cqi_tot[NUMBER_OF_UE_MAX];
|
||||
/// 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)
|
||||
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)
|
||||
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
|
||||
int subband_cqi_tot_dB[NUMBER_OF_UE_MAX][25];
|
||||
int subband_cqi_tot_dB[NUMBER_OF_UE_MAX][100];
|
||||
|
||||
} 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);
|
||||
|
||||
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);
|
||||
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)
|
||||
o_ACK[1] = harq_ack[0].ack;
|
||||
} else if (harq_ack[8].send_harq_status == 1)
|
||||
o_ACK[0] = harq_ack[8].ack;
|
||||
} else if (harq_ack[0].send_harq_status == 1)
|
||||
o_ACK[0] = harq_ack[0].ack;
|
||||
|
||||
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);
|
||||
|
||||
+308
-1040
File diff suppressed because it is too large
Load Diff
@@ -59,20 +59,15 @@ extern int card;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//#define DEBUG_PHY_PROC
|
||||
#define UE_TX_POWER (-10)
|
||||
#define DEBUG_PHY_PROC
|
||||
|
||||
//#ifdef OPENAIR2
|
||||
#ifndef PUCCH
|
||||
#define PUCCH
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
//#ifdef OPENAIR2
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
//#endif
|
||||
|
||||
#ifdef EMOS
|
||||
fifo_dump_emos_UE emos_dump_UE;
|
||||
@@ -87,9 +82,6 @@ fifo_dump_emos_UE emos_dump_UE;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef OPENAIR2
|
||||
//#define DIAG_PHY
|
||||
#endif
|
||||
|
||||
#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)
|
||||
@@ -121,7 +113,7 @@ extern int rx_sig_fifo;
|
||||
#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];
|
||||
#endif
|
||||
|
||||
@@ -168,7 +160,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
|
||||
1,
|
||||
phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
|
||||
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->lte_frame_parms.ofdm_symbol_size,
|
||||
nsymb,
|
||||
@@ -197,7 +189,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
|
||||
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 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
|
||||
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)
|
||||
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
|
||||
|
||||
int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
|
||||
#ifndef OPENAIR2
|
||||
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)
|
||||
{
|
||||
|
||||
#ifndef OPENAIR2
|
||||
int i;
|
||||
#endif
|
||||
uint16_t first_rb, nb_rb;
|
||||
uint8_t harq_pid;
|
||||
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;
|
||||
int8_t Po_PUCCH;
|
||||
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 k,l;
|
||||
#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);
|
||||
|
||||
|
||||
#ifdef OPENAIR2
|
||||
|
||||
if (phy_vars_ue->mac_enabled == 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_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;
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
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
|
||||
stop_meas(&phy_vars_ue->ulsch_encoding_stats);
|
||||
|
||||
|
||||
#ifdef OPENAIR2
|
||||
// signal MAC that Msg3 was sent
|
||||
mac_xface->Msg3_transmitted(Mod_id,
|
||||
CC_id,
|
||||
frame_tx,
|
||||
eNB_id);
|
||||
#endif
|
||||
if (phy_vars_ue->mac_enabled == 1) {
|
||||
// signal MAC that Msg3 was sent
|
||||
mac_xface->Msg3_transmitted(Mod_id,
|
||||
CC_id,
|
||||
frame_tx,
|
||||
eNB_id);
|
||||
}
|
||||
} else {
|
||||
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);
|
||||
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) {
|
||||
@@ -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");
|
||||
#endif
|
||||
#endif
|
||||
#else //OPENAIR2
|
||||
}
|
||||
else {
|
||||
// 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) {
|
||||
@@ -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++)
|
||||
ulsch_input_buffer[i]= i;
|
||||
*/
|
||||
}
|
||||
|
||||
#endif //OPENAIR2
|
||||
start_meas(&phy_vars_ue->ulsch_encoding_stats);
|
||||
|
||||
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) {
|
||||
#ifdef OPENAIR2
|
||||
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;
|
||||
#else
|
||||
phy_vars_ue->tx_power_dBm = UE_TX_POWER;
|
||||
#endif
|
||||
if (phy_vars_ue->mac_enabled==1) {
|
||||
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;
|
||||
}
|
||||
else {
|
||||
phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm;
|
||||
}
|
||||
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,
|
||||
phy_vars_ue->tx_power_max_dBm,
|
||||
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) {
|
||||
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);
|
||||
#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) {
|
||||
generate_ul_signal = 1;
|
||||
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 {
|
||||
phy_vars_ue->sr[subframe_tx]=0;
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
SR_payload=0;
|
||||
}
|
||||
|
||||
if (get_ack(&phy_vars_ue->lte_frame_parms,
|
||||
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,
|
||||
SR_payload);
|
||||
|
||||
#ifdef OPENAIR2
|
||||
Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format);
|
||||
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
||||
#else
|
||||
phy_vars_ue->tx_power_dBm = UE_TX_POWER;
|
||||
#endif
|
||||
if (phy_vars_ue->mac_enabled == 1) {
|
||||
Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format);
|
||||
}
|
||||
else {
|
||||
Po_PUCCH = phy_vars_ue->tx_power_max_dBm;
|
||||
}
|
||||
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
||||
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,
|
||||
phy_vars_ue->tx_power_max_dBm,
|
||||
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
|
||||
|
||||
#ifdef OPENAIR2
|
||||
Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1);
|
||||
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
||||
#else
|
||||
phy_vars_ue->tx_power_dBm = UE_TX_POWER;
|
||||
#endif
|
||||
if (phy_vars_ue->mac_enabled == 1) {
|
||||
Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1);
|
||||
}
|
||||
else {
|
||||
Po_PUCCH = phy_vars_ue->tx_power_max_dBm;
|
||||
}
|
||||
phy_vars_ue->tx_power_dBm = Po_PUCCH;
|
||||
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,
|
||||
phy_vars_ue->tx_power_max_dBm,
|
||||
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) {
|
||||
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-
|
||||
openair_daq_vars.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++) {
|
||||
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],
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
dummy_tx_buffer,
|
||||
#else
|
||||
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
|
||||
#endif
|
||||
frame_parms->log2_symbol_size,
|
||||
frame_parms->ofdm_symbol_size,
|
||||
nsymb,
|
||||
frame_parms->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
else
|
||||
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,
|
||||
#else
|
||||
&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
|
||||
#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,1);
|
||||
#else
|
||||
@@ -1304,7 +1295,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
|
||||
*/
|
||||
#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;
|
||||
|
||||
//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
|
||||
// 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)) {
|
||||
|
||||
#else
|
||||
|
||||
if (1) {
|
||||
#endif
|
||||
|
||||
// check if we have PRACH opportunity
|
||||
if (is_prach_subframe(&phy_vars_ue->lte_frame_parms,frame_tx,subframe_tx)) {
|
||||
phy_vars_ue->generate_prach=0;
|
||||
#ifdef OPENAIR2
|
||||
|
||||
// ask L2 for RACH transport
|
||||
if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
|
||||
phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id,
|
||||
CC_id,
|
||||
frame_tx,
|
||||
eNB_id,
|
||||
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->mac_enabled==1){
|
||||
// ask L2 for RACH transport
|
||||
if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
|
||||
phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id,
|
||||
CC_id,
|
||||
frame_tx,
|
||||
eNB_id,
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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_RNTI);
|
||||
|
||||
#ifdef OPENAIR2
|
||||
if (mode != calib_prach_tx)
|
||||
if ((phy_vars_ue->mac_enabled==1) && (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);
|
||||
}
|
||||
else {
|
||||
phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm;
|
||||
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;
|
||||
|
||||
#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->tx_power_max_dBm,
|
||||
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 {
|
||||
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;
|
||||
#ifdef OPENAIR2
|
||||
mac_xface->Msg1_transmitted(Mod_id,
|
||||
CC_id,
|
||||
frame_tx,
|
||||
eNB_id);
|
||||
#endif
|
||||
if (phy_vars_ue->mac_enabled==1){
|
||||
mac_xface->Msg1_transmitted(Mod_id,
|
||||
CC_id,
|
||||
frame_tx,
|
||||
eNB_id);
|
||||
}
|
||||
}
|
||||
|
||||
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) &&
|
||||
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
|
||||
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
|
||||
#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
|
||||
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 += pbch_phase;
|
||||
|
||||
#ifdef OPENAIR2
|
||||
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);
|
||||
#endif
|
||||
|
||||
if (phy_vars_ue->mac_enabled==1) {
|
||||
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);
|
||||
}
|
||||
|
||||
#ifdef EMOS
|
||||
//emos_dump_UE.frame_tx = frame_tx;
|
||||
//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->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq++;
|
||||
phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors++;
|
||||
#ifdef OPENAIR2
|
||||
mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id);
|
||||
#else
|
||||
|
||||
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");
|
||||
mac_xface->macphy_exit("More that 100 consecutive PBCH errors!");
|
||||
if (phy_vars_ue->mac_enabled == 1) {
|
||||
mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id);
|
||||
}
|
||||
else{
|
||||
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");
|
||||
mac_xface->macphy_exit("More that 100 consecutive PBCH errors!");
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
#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);
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
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
|
||||
|
||||
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);
|
||||
//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
|
||||
@@ -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;
|
||||
uint8_t dual_stream_UE = 0;
|
||||
#endif
|
||||
#ifndef OPENAIR2
|
||||
uint8_t *rar;
|
||||
#endif
|
||||
int pmch_flag=0;
|
||||
uint8_t sync_area=255;
|
||||
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 subframe_rx = slot_rx>>1;
|
||||
int subframe_prev = (subframe_rx+9)%10;
|
||||
#ifdef OPENAIR2
|
||||
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);
|
||||
|
||||
@@ -2444,7 +2424,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
|
||||
else
|
||||
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,
|
||||
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,
|
||||
@@ -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;
|
||||
|
||||
#ifdef DEBUG_PHY_PROC
|
||||
//#ifdef DEBUG_PHY_PROC
|
||||
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
||||
harq_pid,
|
||||
(subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev);
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
if (phy_vars_ue->dlsch_ue[eNB_id][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)) {
|
||||
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)\n",
|
||||
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n",
|
||||
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
||||
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]->mcs);
|
||||
|
||||
// if (abstraction_flag ==0 )
|
||||
//dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid);
|
||||
//mac_xface->macphy_exit("");
|
||||
#endif
|
||||
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);
|
||||
} 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",
|
||||
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");
|
||||
#endif
|
||||
#endif
|
||||
#ifdef OPENAIR2
|
||||
mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
|
||||
CC_id,
|
||||
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]->TBS>>3,
|
||||
eNB_id);
|
||||
#endif
|
||||
if (phy_vars_ue->mac_enabled == 1) {
|
||||
mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
|
||||
CC_id,
|
||||
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]->TBS>>3,
|
||||
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->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);
|
||||
|
||||
#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]->G,
|
||||
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)) {
|
||||
phy_vars_ue->dlsch_SI_errors[eNB_id]++;
|
||||
#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,
|
||||
frame_rx,
|
||||
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]);
|
||||
#endif
|
||||
|
||||
#ifdef OPENAIR2
|
||||
/*
|
||||
printf("\n\n");
|
||||
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("\n");
|
||||
*/
|
||||
mac_xface->ue_decode_si(phy_vars_ue->Mod_id,
|
||||
CC_id,
|
||||
frame_rx,
|
||||
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]->TBS>>3);
|
||||
/*
|
||||
if ((frame_rx % 160) < 10)
|
||||
printf("sending SI to L2 in frame %d\n",frame_rx);
|
||||
*/
|
||||
#endif
|
||||
if (phy_vars_ue->mac_enabled == 1) {
|
||||
/*
|
||||
printf("\n\n");
|
||||
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("\n");
|
||||
*/
|
||||
mac_xface->ue_decode_si(phy_vars_ue->Mod_id,
|
||||
CC_id,
|
||||
frame_rx,
|
||||
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]->TBS>>3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
#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)) {
|
||||
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),
|
||||
@@ -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);
|
||||
}
|
||||
} // mode != PUSCH
|
||||
|
||||
#else //OPENAIR2
|
||||
|
||||
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 = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0];
|
||||
process_timing_advance_rar(phy_vars_ue,timing_advance);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
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 = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0];
|
||||
process_timing_advance_rar(phy_vars_ue,timing_advance);
|
||||
}
|
||||
} //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)) {
|
||||
LOG_I(PHY,"ue calling pmch subframe ..\n ");
|
||||
LOG_D(PHY,"ue calling pmch subframe ..\n ");
|
||||
|
||||
if ((slot_rx%2)==1) {
|
||||
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->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;
|
||||
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_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs,
|
||||
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;
|
||||
#endif
|
||||
int frame_rx = phy_vars_ue->frame_rx;
|
||||
#ifdef OPENAIR2
|
||||
int frame_tx = phy_vars_ue->frame_tx;
|
||||
#endif
|
||||
int slot_rx = phy_vars_ue->slot_rx;
|
||||
int slot_tx = phy_vars_ue->slot_tx;
|
||||
int subframe_tx = slot_tx>>1;
|
||||
int subframe_rx = slot_rx>>1;
|
||||
#undef DEBUG_PHY_PROC
|
||||
|
||||
#ifdef OPENAIR2
|
||||
UE_L2_STATE_t ret;
|
||||
#endif
|
||||
#ifndef OPENAIR2
|
||||
phy_vars_ue->UE_mode[eNB_id]=PUSCH;
|
||||
phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local;
|
||||
prach_resources_local.ra_RNTI = 0xbeef;
|
||||
prach_resources_local.ra_PreambleIndex = 0;
|
||||
#endif
|
||||
|
||||
if (phy_vars_ue->mac_enabled == 0) {
|
||||
phy_vars_ue->UE_mode[eNB_id]=PUSCH;
|
||||
phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local;
|
||||
prach_resources_local.ra_RNTI = 0xbeef;
|
||||
prach_resources_local.ra_PreambleIndex = 0;
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#ifdef OPENAIR2
|
||||
|
||||
if (slot_rx%2==0) {
|
||||
|
||||
ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id,
|
||||
frame_tx,
|
||||
subframe_rx,
|
||||
subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx),
|
||||
eNB_id,
|
||||
0/*FIXME CC_id*/);
|
||||
if (phy_vars_ue->mac_enabled==1) {
|
||||
if (slot_rx%2==0) {
|
||||
ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id,
|
||||
frame_tx,
|
||||
subframe_rx,
|
||||
subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx),
|
||||
eNB_id,
|
||||
0/*FIXME CC_id*/);
|
||||
|
||||
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,
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
#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);
|
||||
stop_meas(&phy_vars_ue->phy_proc);
|
||||
|
||||
+213
-267
@@ -61,25 +61,7 @@
|
||||
extern unsigned int dlsch_tbs25[27][25],TBStable[27][110];
|
||||
extern unsigned char offset_mumimo_llr_drange_fix;
|
||||
|
||||
#ifdef XFORMS
|
||||
#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_UE *PHY_vars_UE;
|
||||
@@ -107,88 +89,6 @@ void handler(int sig)
|
||||
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];
|
||||
@@ -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)
|
||||
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
|
||||
&txdata[aa][slot_offset], // output
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
frame_parms->ofdm_symbol_size,
|
||||
6, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
@@ -266,15 +166,15 @@ int main(int argc, char **argv)
|
||||
unsigned int ret;
|
||||
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;
|
||||
char fname[32],vname[32];
|
||||
FILE *bler_fd;
|
||||
char bler_fname[256];
|
||||
FILE *time_meas_fd;
|
||||
char time_meas_fname[256];
|
||||
FILE *tikz_fd;
|
||||
char tikz_fname[256];
|
||||
// FILE *tikz_fd;
|
||||
// char tikz_fname[256];
|
||||
|
||||
FILE *input_trch_fd=NULL;
|
||||
unsigned char input_trch_file=0;
|
||||
@@ -300,7 +200,7 @@ int main(int argc, char **argv)
|
||||
uint8_t rx_sample_offset = 0;
|
||||
//char stats_buffer[4096];
|
||||
//int len;
|
||||
uint8_t num_rounds = 4,fix_rounds=0;
|
||||
uint8_t num_rounds = 4;//,fix_rounds=0;
|
||||
uint8_t subframe=7;
|
||||
int u;
|
||||
int n=0;
|
||||
@@ -314,23 +214,22 @@ int main(int argc, char **argv)
|
||||
|
||||
// void *data;
|
||||
// int ii;
|
||||
int bler;
|
||||
double blerr[4],uncoded_ber,avg_ber;
|
||||
// int bler;
|
||||
double blerr[4],uncoded_ber;//,avg_ber;
|
||||
short *uncoded_ber_bit=NULL;
|
||||
uint8_t N_RB_DL=25,osf=1;
|
||||
uint8_t fdd_flag = 0;
|
||||
#ifdef XFORMS
|
||||
frame_t frame_type = FDD;
|
||||
int xforms=0;
|
||||
FD_lte_phy_scope_ue *form_ue;
|
||||
char title[255];
|
||||
#endif
|
||||
uint32_t DLSCH_RB_ALLOC = 0x1fff;
|
||||
int numCCE=0;
|
||||
int dci_length_bytes=0,dci_length=0;
|
||||
double BW = 5.0;
|
||||
//double channel_bandwidth = 5.0, sampling_rate=7.68;
|
||||
int common_flag=0,TPC=0;
|
||||
|
||||
double cpu_freq_GHz;
|
||||
time_stats_t ts;//,sts,usts;
|
||||
// time_stats_t ts;//,sts,usts;
|
||||
int avg_iter,iter_trials;
|
||||
int rballocset=0;
|
||||
int print_perf=0;
|
||||
@@ -344,15 +243,24 @@ int main(int argc, char **argv)
|
||||
int TB0_active = 1;
|
||||
uint32_t perfect_ce = 0;
|
||||
|
||||
LTE_DL_UE_HARQ_t *dlsch0_ue_harq;
|
||||
LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq;
|
||||
// LTE_DL_UE_HARQ_t *dlsch0_ue_harq;
|
||||
// LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq;
|
||||
uint8_t Kmimo;
|
||||
FILE *proc_fd = NULL;
|
||||
char buf[64];
|
||||
uint8_t ue_category=4;
|
||||
uint32_t Nsoft;
|
||||
|
||||
|
||||
|
||||
int CCE_table[800];
|
||||
|
||||
int threequarter_fs=0;
|
||||
|
||||
opp_enabled=1; // to enable the time meas
|
||||
|
||||
#if defined(__arm__)
|
||||
FILE *proc_fd = NULL;
|
||||
char buf[64];
|
||||
|
||||
proc_fd = fopen("/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq", "r");
|
||||
if(!proc_fd)
|
||||
printf("cannot open /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq");
|
||||
@@ -375,16 +283,20 @@ int main(int argc, char **argv)
|
||||
// default parameters
|
||||
n_frames = 1000;
|
||||
snr0 = 0;
|
||||
num_layers = 1;
|
||||
// num_layers = 1;
|
||||
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) {
|
||||
case 'a':
|
||||
awgn_flag = 1;
|
||||
channel_model = AWGN;
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
abstx = 1;
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
tdd_config=atoi(optarg);
|
||||
break;
|
||||
@@ -393,10 +305,59 @@ int main(int argc, char **argv)
|
||||
N_RB_DL=atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
num_pdcch_symbols=atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
Nid_cell = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
dci_flag = 1;
|
||||
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':
|
||||
mcs1 = atoi(optarg);
|
||||
break;
|
||||
@@ -405,6 +366,11 @@ int main(int argc, char **argv)
|
||||
mcs2 = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'O':
|
||||
test_perf=atoi(optarg);
|
||||
//print_perf =1;
|
||||
break;
|
||||
|
||||
case 't':
|
||||
mcs_i = atoi(optarg);
|
||||
i_mod = get_Qm(mcs_i);
|
||||
@@ -414,27 +380,16 @@ int main(int argc, char **argv)
|
||||
n_frames = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
Nid_cell = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
rx_sample_offset = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
fdd_flag = 1;
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
DLSCH_RB_ALLOC = atoi(optarg);
|
||||
rballocset = 1;
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
forgetting_factor = atof(optarg);
|
||||
break;
|
||||
|
||||
case 's':
|
||||
snr0 = atof(optarg);
|
||||
break;
|
||||
@@ -443,13 +398,6 @@ int main(int argc, char **argv)
|
||||
snr_int = atof(optarg);
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
input_snr_step= atof(optarg);
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
abstx = 1;
|
||||
break;
|
||||
|
||||
case 'N':
|
||||
n_ch_rlz= atof(optarg);
|
||||
@@ -459,10 +407,6 @@ int main(int argc, char **argv)
|
||||
extended_prefix_flag=1;
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
num_pdcch_symbols=atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'g':
|
||||
memcpy(channel_model_input,optarg,10);
|
||||
|
||||
@@ -522,70 +466,12 @@ int main(int argc, char **argv)
|
||||
case 'N':
|
||||
channel_model=AWGN;
|
||||
break;
|
||||
|
||||
default:
|
||||
msg("Unsupported channel model!\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
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':
|
||||
num_rounds=atoi(optarg);
|
||||
break;
|
||||
@@ -623,26 +509,58 @@ int main(int argc, char **argv)
|
||||
print_perf=1;
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
llr8_flag=1;
|
||||
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 'l':
|
||||
offset_mumimo_llr_drange_fix=atoi(optarg);
|
||||
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 'O':
|
||||
test_perf=atoi(optarg);
|
||||
//print_perf =1;
|
||||
case 'X':
|
||||
xforms=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;
|
||||
|
||||
case 'Z':
|
||||
dump_table=1;
|
||||
break;
|
||||
|
||||
case 'Y':
|
||||
perfect_ce=1;
|
||||
break;
|
||||
|
||||
|
||||
case 'h':
|
||||
default:
|
||||
@@ -680,27 +598,19 @@ int main(int argc, char **argv)
|
||||
switch (N_RB_DL) {
|
||||
case 6:
|
||||
if (rballocset==0) DLSCH_RB_ALLOC = 0x3f;
|
||||
|
||||
BW = 1.25;
|
||||
num_pdcch_symbols = 3;
|
||||
break;
|
||||
|
||||
case 25:
|
||||
if (rballocset==0) DLSCH_RB_ALLOC = 0x1fff;
|
||||
|
||||
BW = 5.00;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
if (rballocset==0) DLSCH_RB_ALLOC = 0x1ffff;
|
||||
|
||||
BW = 10.00;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
if (rballocset==0) DLSCH_RB_ALLOC = 0x1ffffff;
|
||||
|
||||
BW = 20.00;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -708,33 +618,42 @@ int main(int argc, char **argv)
|
||||
} else
|
||||
NB_RB = 4;
|
||||
|
||||
NB_RB=conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL);
|
||||
|
||||
if ((transmission_mode > 1) && (n_tx != 2))
|
||||
printf("n_tx must be >1 for transmission_mode %d\n",transmission_mode);
|
||||
|
||||
#ifdef XFORMS
|
||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||
form_ue = create_lte_phy_scope_ue();
|
||||
sprintf (title, "LTE PHY SCOPE eNB");
|
||||
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
||||
|
||||
if (!dual_stream_UE==0) {
|
||||
openair_daq_vars.use_ia_receiver = 1;
|
||||
fl_set_button(form_ue->button_0,1);
|
||||
fl_set_object_label(form_ue->button_0, "IA Receiver ON");
|
||||
fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN);
|
||||
if (xforms==1) {
|
||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||
form_ue = create_lte_phy_scope_ue();
|
||||
sprintf (title, "LTE PHY SCOPE eNB");
|
||||
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
||||
|
||||
if (!dual_stream_UE==0) {
|
||||
openair_daq_vars.use_ia_receiver = 1;
|
||||
fl_set_button(form_ue->button_0,1);
|
||||
fl_set_object_label(form_ue->button_0, "IA Receiver ON");
|
||||
fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (transmission_mode==5) {
|
||||
n_users = 2;
|
||||
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;
|
||||
|
||||
printf("Setting mcs1 = %d\n",mcs1);
|
||||
@@ -967,7 +886,8 @@ int main(int argc, char **argv)
|
||||
eNB2UE[0] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
forgetting_factor,
|
||||
rx_sample_offset,
|
||||
0);
|
||||
@@ -977,8 +897,9 @@ int main(int argc, char **argv)
|
||||
eNB2UE[n] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
BW,
|
||||
forgetting_factor,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
forgetting_factor,
|
||||
rx_sample_offset,
|
||||
0);
|
||||
}
|
||||
@@ -993,10 +914,27 @@ int main(int argc, char **argv)
|
||||
else
|
||||
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++) {
|
||||
// Create transport channel structures for 2 transport blocks (MIMO)
|
||||
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]) {
|
||||
printf("Can't get eNB dlsch structures\n");
|
||||
@@ -1008,7 +946,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
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]) {
|
||||
printf("Can't get ue dlsch structures\n");
|
||||
@@ -1019,7 +957,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
// 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) {
|
||||
|
||||
@@ -1306,7 +1244,7 @@ int main(int argc, char **argv)
|
||||
dci_alloc[num_dci].L = 1;
|
||||
dci_alloc[num_dci].rnti = SI_RNTI;
|
||||
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]);
|
||||
|
||||
printf("Generating dlsch params for user %d\n",k);
|
||||
@@ -1613,7 +1551,7 @@ int main(int argc, char **argv)
|
||||
dci_alloc[num_dci].L = 1;
|
||||
dci_alloc[num_dci].rnti = SI_RNTI;
|
||||
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]);
|
||||
|
||||
printf("Generating dlsch params for user %d\n",k);
|
||||
@@ -1921,7 +1859,7 @@ int main(int argc, char **argv)
|
||||
dci_alloc[num_dci].L = 1;
|
||||
dci_alloc[num_dci].rnti = SI_RNTI;
|
||||
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]);
|
||||
|
||||
printf("Generating dlsch params for user %d\n",k);
|
||||
@@ -1952,7 +1890,7 @@ int main(int argc, char **argv)
|
||||
dci_alloc[num_dci].L = 1;
|
||||
dci_alloc[num_dci].rnti = n_rnti+k;
|
||||
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);
|
||||
generate_eNB_dlsch_params_from_dci(0,
|
||||
subframe,
|
||||
@@ -1997,17 +1935,20 @@ int main(int argc, char **argv)
|
||||
if (n_frames==1) printf("%d\n",numCCE);
|
||||
|
||||
// apply RNTI-based nCCE allocation
|
||||
memset(CCE_table,0,800*sizeof(int));
|
||||
|
||||
for (i=num_common_dci; i<num_dci; i++) {
|
||||
|
||||
dci_alloc[i].nCCE = get_nCCE_offset(1<<dci_alloc[i].L,
|
||||
numCCE,
|
||||
(dci_alloc[i].rnti==SI_RNTI)? 1 : 0,
|
||||
dci_alloc[i].rnti,
|
||||
subframe);
|
||||
dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table,
|
||||
1<<dci_alloc[i].L,
|
||||
numCCE,
|
||||
(dci_alloc[i].rnti==SI_RNTI)? 1 : 0,
|
||||
dci_alloc[i].rnti,
|
||||
subframe);
|
||||
|
||||
if (n_frames==1)
|
||||
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++) {
|
||||
@@ -2090,7 +2031,7 @@ int main(int argc, char **argv)
|
||||
round_trials[3] = 0;
|
||||
|
||||
dci_errors=0;
|
||||
avg_ber = 0;
|
||||
// avg_ber = 0;
|
||||
|
||||
round=0;
|
||||
avg_iter = 0;
|
||||
@@ -2561,7 +2502,7 @@ PMI_FEEDBACK:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci,
|
||||
num_common_dci,
|
||||
dci_alloc,
|
||||
@@ -2570,7 +2511,7 @@ PMI_FEEDBACK:
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
|
||||
subframe);
|
||||
|
||||
|
||||
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);
|
||||
exit(-1);
|
||||
@@ -2675,13 +2616,15 @@ PMI_FEEDBACK:
|
||||
}
|
||||
|
||||
start_meas(&PHY_vars_eNB->dlsch_modulation_stats);
|
||||
|
||||
re_allocated = dlsch_modulation(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
|
||||
AMP,
|
||||
subframe,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
num_pdcch_symbols,
|
||||
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);
|
||||
/*
|
||||
if (trials==0 && round==0)
|
||||
@@ -2789,7 +2732,7 @@ PMI_FEEDBACK:
|
||||
|
||||
// Multipath channel
|
||||
if (awgn_flag == 0) {
|
||||
multipath_channel(eNB2UE[0],s_re,s_im,r_re,r_im,
|
||||
multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im,
|
||||
2*frame_parms->samples_per_tti,hold_channel);
|
||||
|
||||
// printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset);
|
||||
@@ -2799,8 +2742,16 @@ PMI_FEEDBACK:
|
||||
random_channel(eNB2UE[2],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 (trials==0 && round==0) {
|
||||
@@ -2946,11 +2897,6 @@ PMI_FEEDBACK:
|
||||
|
||||
if (PHY_vars_UE->perfect_ce==1) {
|
||||
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(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
@@ -3534,13 +3480,13 @@ PMI_FEEDBACK:
|
||||
// PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round++;
|
||||
}
|
||||
|
||||
#ifdef XFORMS
|
||||
phy_scope_UE(form_ue,
|
||||
PHY_vars_UE,
|
||||
eNB_id,
|
||||
0,// UE_id
|
||||
subframe);
|
||||
#endif
|
||||
if (xforms==1) {
|
||||
phy_scope_UE(form_ue,
|
||||
PHY_vars_UE,
|
||||
eNB_id,
|
||||
0,// UE_id
|
||||
subframe);
|
||||
}
|
||||
|
||||
} //round
|
||||
|
||||
|
||||
@@ -47,15 +47,12 @@
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
|
||||
#ifdef XFORMS
|
||||
#include <forms.h>
|
||||
#include "../../USERSPACE_TOOLS/SCOPE/lte_scope.h"
|
||||
#include "PHY/TOOLS/lte_phy_scope.h"
|
||||
#endif //XFORMS
|
||||
|
||||
|
||||
#include "OCG_vars.h"
|
||||
|
||||
//#define BW 5.0
|
||||
|
||||
|
||||
PHY_VARS_eNB *PHY_vars_eNB;
|
||||
PHY_VARS_UE *PHY_vars_UE;
|
||||
@@ -131,7 +128,7 @@ int main(int argc, char **argv)
|
||||
|
||||
char c;
|
||||
|
||||
int i,l,aa,aarx;
|
||||
int i,l,aa,aarx,k;
|
||||
double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0;
|
||||
uint8_t snr1set=0;
|
||||
double snr_step=1,input_snr_step=1;
|
||||
@@ -172,21 +169,23 @@ int main(int argc, char **argv)
|
||||
unsigned int trials,errs[4]= {0,0,0,0}; //,round_trials[4]={0,0,0,0};
|
||||
|
||||
uint8_t N_RB_DL=25,osf=1;
|
||||
double BW=5.0;
|
||||
uint32_t perfect_ce = 0;
|
||||
|
||||
lte_frame_type_t frame_type = FDD;
|
||||
|
||||
uint32_t Nsoft = 1827072;
|
||||
|
||||
/*
|
||||
#ifdef XFORMS
|
||||
FD_lte_scope *form_dl;
|
||||
FD_lte_phy_scope_ue *form_ue;
|
||||
char title[255];
|
||||
|
||||
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");
|
||||
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
|
||||
*/
|
||||
|
||||
logInit();
|
||||
number_of_cards = 1;
|
||||
@@ -255,27 +254,9 @@ int main(int argc, char **argv)
|
||||
case 'R':
|
||||
N_RB_DL = atoi(optarg);
|
||||
|
||||
switch (N_RB_DL) {
|
||||
case 6:
|
||||
BW=1.25;
|
||||
break;
|
||||
|
||||
case 25:
|
||||
BW=5.0;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
BW=10.0;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
BW=20.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((N_RB_DL!=6) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=100)) {
|
||||
printf("Unsupported Bandwidth %d\n",N_RB_DL);
|
||||
exit(-1);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -397,20 +378,21 @@ int main(int argc, char **argv)
|
||||
eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
|
||||
// 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) {
|
||||
printf("Can't get eNB dlsch structures\n");
|
||||
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.MBSFN_config[0].radioframeAllocationPeriod = 0;
|
||||
@@ -477,7 +459,7 @@ int main(int argc, char **argv)
|
||||
|
||||
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0], // input,
|
||||
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
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
@@ -541,15 +523,26 @@ int main(int argc, char **argv)
|
||||
subframe%10,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
for (l=2; l<12; l++) {
|
||||
rx_pmch(PHY_vars_UE,
|
||||
|
||||
if (PHY_vars_UE->perfect_ce==1) {
|
||||
// fill in perfect channel estimates
|
||||
freq_channel(eNB2UE,PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1);
|
||||
for(k=0; k<NUMBER_OF_eNB_MAX; k++) {
|
||||
for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
for (i=0; i<frame_parms->N_RB_DL*12; i++) {
|
||||
((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP);
|
||||
((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rx_pmch(PHY_vars_UE,
|
||||
0,
|
||||
subframe%10,
|
||||
l);
|
||||
|
||||
|
||||
}
|
||||
|
||||
PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&PHY_vars_UE->lte_frame_parms,
|
||||
|
||||
@@ -53,90 +53,11 @@
|
||||
|
||||
#include "OCG_vars.h"
|
||||
|
||||
#define BW 5.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;
|
||||
|
||||
#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 dummy0[2048*14];
|
||||
mod_sym_t dummy1[2048*14];
|
||||
@@ -423,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);
|
||||
|
||||
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
|
||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||
form_ue = create_lte_phy_scope_ue();
|
||||
@@ -439,13 +382,13 @@ int main(int argc, char **argv)
|
||||
|
||||
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];
|
||||
txdata1 = PHY_vars_eNb1->lte_eNB_common_vars.txdata[0];
|
||||
txdata2 = PHY_vars_eNb2->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];
|
||||
txdata2 = PHY_vars_eNB2->lte_eNB_common_vars.txdata[0];
|
||||
|
||||
|
||||
s_re = malloc(2*sizeof(double*));
|
||||
@@ -466,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,
|
||||
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,interf1,interf2);
|
||||
|
||||
printf("PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
|
||||
PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0]);
|
||||
printf("PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
|
||||
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0]);
|
||||
|
||||
|
||||
DLSCH_alloc_pdu2.rah = 0;
|
||||
@@ -482,28 +425,31 @@ int main(int argc, char **argv)
|
||||
// Forget second codeword
|
||||
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,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
|
||||
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,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
0,
|
||||
4,
|
||||
0);
|
||||
|
||||
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,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
0,
|
||||
8,
|
||||
0);
|
||||
@@ -567,47 +513,47 @@ int main(int argc, char **argv)
|
||||
pbch_pdu[1]=1;
|
||||
pbch_pdu[2]=0;
|
||||
|
||||
if (PHY_vars_eNb->lte_frame_parms.frame_type == 0) {
|
||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
if (PHY_vars_eNB->lte_frame_parms.frame_type == 0) {
|
||||
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
0);
|
||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||
0);
|
||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
10);
|
||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||
10);
|
||||
|
||||
} else {
|
||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
1);
|
||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
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,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
11);
|
||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
2,
|
||||
12);
|
||||
|
||||
@@ -626,11 +572,11 @@ int main(int argc, char **argv)
|
||||
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,
|
||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pilots(PHY_vars_eNB,
|
||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
|
||||
@@ -641,8 +587,8 @@ int main(int argc, char **argv)
|
||||
dci_alloc,
|
||||
0,
|
||||
1024,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
0);
|
||||
*/
|
||||
|
||||
@@ -657,47 +603,47 @@ int main(int argc, char **argv)
|
||||
dummybuf[1] = dummy1;
|
||||
dummybuf[2] = dummy2;
|
||||
dummybuf[3] = dummy3;
|
||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
||||
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||
(mod_sym_t**)dummybuf,
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
pbch_pdu,
|
||||
0);
|
||||
}
|
||||
|
||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
pbch_pdu,
|
||||
pbch_phase);
|
||||
/*
|
||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
pbch_pdu,
|
||||
1);
|
||||
*/
|
||||
|
||||
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,
|
||||
&PHY_vars_eNb1->lte_frame_parms,
|
||||
(PHY_vars_eNb1->lte_frame_parms.Ncp==0)?6:5,
|
||||
&PHY_vars_eNB1->lte_frame_parms,
|
||||
(PHY_vars_eNB1->lte_frame_parms.Ncp==0)?6:5,
|
||||
0);
|
||||
*/
|
||||
generate_pilots(PHY_vars_eNb1,
|
||||
PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pilots(PHY_vars_eNB1,
|
||||
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
|
||||
|
||||
generate_pbch(&PHY_vars_eNb1->lte_eNB_pbch,
|
||||
PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pbch(&PHY_vars_eNB1->lte_eNB_pbch,
|
||||
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb1->lte_frame_parms,
|
||||
&PHY_vars_eNB1->lte_frame_parms,
|
||||
pbch_pdu,
|
||||
0);
|
||||
|
||||
@@ -705,26 +651,26 @@ int main(int argc, char **argv)
|
||||
|
||||
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,
|
||||
&PHY_vars_eNb2->lte_frame_parms,
|
||||
(PHY_vars_eNb2->lte_frame_parms.Ncp==0)?6:5,
|
||||
&PHY_vars_eNB2->lte_frame_parms,
|
||||
(PHY_vars_eNB2->lte_frame_parms.Ncp==0)?6:5,
|
||||
0);
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
generate_pilots(PHY_vars_eNb2,
|
||||
PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pilots(PHY_vars_eNB2,
|
||||
PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
|
||||
|
||||
generate_pbch(&PHY_vars_eNb2->lte_eNB_pbch,
|
||||
PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pbch(&PHY_vars_eNB2->lte_eNB_pbch,
|
||||
PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb2->lte_frame_parms,
|
||||
&PHY_vars_eNB2->lte_frame_parms,
|
||||
pbch_pdu,
|
||||
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("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)
|
||||
write_output("txsigF1.m","txsF1", PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,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);
|
||||
|
||||
tx_lev = 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)
|
||||
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
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
frame_parms->ofdm_symbol_size,
|
||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
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],
|
||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb,
|
||||
frame_parms);
|
||||
@@ -765,17 +711,17 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
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)
|
||||
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
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
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
|
||||
frame_parms->ofdm_symbol_size,
|
||||
2*nsymb, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
else {
|
||||
normal_prefix_mod(PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][aa],
|
||||
PHY_vars_eNb1->lte_eNB_common_vars.txdata[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],
|
||||
2*nsymb,
|
||||
frame_parms);
|
||||
}
|
||||
@@ -784,24 +730,24 @@ int main(int argc, char **argv)
|
||||
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)
|
||||
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 (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);
|
||||
}
|
||||
|
||||
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)
|
||||
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
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
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
|
||||
frame_parms->ofdm_symbol_size,
|
||||
2*nsymb, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
else {
|
||||
normal_prefix_mod(PHY_vars_eNb2->lte_eNB_common_vars.txdataF[0][aa],
|
||||
PHY_vars_eNb2->lte_eNB_common_vars.txdata[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],
|
||||
2*nsymb,
|
||||
frame_parms);
|
||||
}
|
||||
@@ -810,10 +756,10 @@ int main(int argc, char **argv)
|
||||
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)
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
// 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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
i=0;
|
||||
|
||||
@@ -864,7 +810,7 @@ int main(int argc, char **argv)
|
||||
// multipath channel
|
||||
|
||||
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_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)
|
||||
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++) {
|
||||
//printf("n_trial %d\n",n_trials);
|
||||
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) {
|
||||
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]);
|
||||
@@ -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);
|
||||
|
||||
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);
|
||||
@@ -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(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);
|
||||
@@ -1038,7 +984,7 @@ int main(int argc, char **argv)
|
||||
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++) {
|
||||
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,
|
||||
PHY_vars_UE->lte_ue_pbch_vars[0],
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
0,
|
||||
ALAMOUTI,
|
||||
PHY_vars_UE->high_speed_flag,
|
||||
@@ -1119,10 +1065,10 @@ int main(int argc, char **argv)
|
||||
|
||||
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)
|
||||
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("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 CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2)
|
||||
#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,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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#define DLSCH_RB_ALLOC ((uint16_t)0x1fbf) // igore DC component,RB13
|
||||
|
||||
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)
|
||||
{
|
||||
uint8_t BCCH_alloc_pdu[8];
|
||||
uint8_t DLSCH_alloc_pdu[8];
|
||||
uint8_t UL_alloc_pdu[8];
|
||||
uint32_t BCCH_alloc_pdu[2];
|
||||
uint32_t DLSCH_alloc_pdu[2];
|
||||
uint32_t UL_alloc_pdu[2];
|
||||
|
||||
int i;
|
||||
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;
|
||||
memcpy((void*)&DCI_pdu.dci_alloc[0].dci_pdu[0], &BCCH_alloc_pdu[0], BCCH_pdu_size_bytes);
|
||||
DCI_pdu.Num_common_dci++;
|
||||
/*
|
||||
if (lte_frame_parms->N_RB_DL >= 25) {
|
||||
// add ue specific dci
|
||||
DCI_pdu.dci_alloc[1].dci_length = dci_length;
|
||||
DCI_pdu.dci_alloc[1].L = log2L;
|
||||
DCI_pdu.dci_alloc[1].rnti = rnti;
|
||||
DCI_pdu.dci_alloc[1].format = format1;
|
||||
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);
|
||||
DCI_pdu.Num_ue_spec_dci++;
|
||||
DCI_pdu.dci_alloc[1].dci_length = dci_length;
|
||||
DCI_pdu.dci_alloc[1].L = log2L;
|
||||
DCI_pdu.dci_alloc[1].rnti = rnti;
|
||||
DCI_pdu.dci_alloc[1].format = format1;
|
||||
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);
|
||||
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;
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
|
||||
return(&DCI_pdu);
|
||||
}
|
||||
|
||||
@@ -523,10 +435,8 @@ int main(int argc, char **argv)
|
||||
uint8_t dci_cnt=0;
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
uint8_t log2L=2, log2Lcommon=2, format_selector=0;
|
||||
uint8_t numCCE,nCCE_max,common_active=0,ul_active=0,dl_active=0;
|
||||
uint32_t rv;
|
||||
uint8_t numCCE,common_active=0,ul_active=0,dl_active=0;
|
||||
|
||||
DCI_format_t format = format1;
|
||||
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 tdd_config=3;
|
||||
@@ -540,20 +450,19 @@ int main(int argc, char **argv)
|
||||
|
||||
DCI_ALLOC_t dci_alloc_rx[8];
|
||||
|
||||
void* dlsch_pdu = NULL;
|
||||
// int ret;
|
||||
int ret;
|
||||
|
||||
uint8_t harq_pid;
|
||||
uint8_t phich_ACK;
|
||||
|
||||
uint8_t num_phich_interf = 0;
|
||||
lte_frame_type_t frame_type=TDD;
|
||||
int re_offset;
|
||||
uint32_t *txptr;
|
||||
// int re_offset;
|
||||
// uint32_t *txptr;
|
||||
int aarx;
|
||||
int k;
|
||||
double BW=5.0;
|
||||
uint32_t perfect_ce = 0;
|
||||
int CCE_table[800];
|
||||
|
||||
number_of_cards = 1;
|
||||
openair_daq_vars.rx_rf_mode = 1;
|
||||
@@ -799,9 +708,10 @@ int main(int argc, char **argv)
|
||||
n_rx,
|
||||
transmission_mode,
|
||||
extended_prefix_flag,
|
||||
frame_type,
|
||||
Nid_cell,
|
||||
tdd_config,
|
||||
N_RB_DL,frame_type,
|
||||
N_RB_DL,
|
||||
osf,
|
||||
perfect_ce);
|
||||
|
||||
@@ -840,28 +750,11 @@ int main(int argc, char **argv)
|
||||
subframe,NUMBER_OF_OFDM_CARRIERS,
|
||||
PHY_vars_eNB->lte_frame_parms.Ncp,PHY_vars_eNB->lte_frame_parms.samples_per_tti,nsymb);
|
||||
|
||||
switch (N_RB_DL) {
|
||||
case 6:
|
||||
BW = 1.25;
|
||||
break;
|
||||
|
||||
case 25:
|
||||
BW = 5.00;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
BW = 10.00;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
BW = 20.00;
|
||||
break;
|
||||
}
|
||||
|
||||
eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB,
|
||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
@@ -894,7 +787,7 @@ int main(int argc, char **argv)
|
||||
i=0;
|
||||
|
||||
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) {
|
||||
((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL));
|
||||
@@ -921,7 +814,7 @@ int main(int argc, char **argv)
|
||||
|
||||
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("num_phich interferers %d\n",num_phich_interf);
|
||||
@@ -973,55 +866,62 @@ int main(int argc, char **argv)
|
||||
numCCE=0;
|
||||
n_trials_common++;
|
||||
common_active = 1;
|
||||
n_trials_ul++;
|
||||
ul_active = 1;
|
||||
n_trials_dl++;
|
||||
dl_active = 1;
|
||||
if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 50) {
|
||||
n_trials_ul++;
|
||||
ul_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,
|
||||
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) {
|
||||
printf("num_dci %d, num_pddch_symbols %d, nCCE %d\n",
|
||||
DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci,
|
||||
num_pdcch_symbols,
|
||||
DCI_pdu.nCCE);
|
||||
num_pdcch_symbols,numCCE);
|
||||
}
|
||||
|
||||
// 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++) {
|
||||
// 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.nCCE,
|
||||
1,
|
||||
SI_RNTI,
|
||||
subframe);
|
||||
DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table,
|
||||
1<<DCI_pdu.dci_alloc[i].L,
|
||||
numCCE,
|
||||
1,
|
||||
SI_RNTI,
|
||||
subframe);
|
||||
}
|
||||
// RA RNTI
|
||||
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.nCCE,
|
||||
1,
|
||||
DCI_pdu.dci_alloc[i].rnti,
|
||||
subframe);
|
||||
DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table,
|
||||
1<<DCI_pdu.dci_alloc[i].L,
|
||||
numCCE,
|
||||
1,
|
||||
DCI_pdu.dci_alloc[i].rnti,
|
||||
subframe);
|
||||
}
|
||||
// C RNTI
|
||||
else {
|
||||
DCI_pdu.dci_alloc[i].nCCE = get_nCCE_offset(1<<DCI_pdu.dci_alloc[i].L,
|
||||
DCI_pdu.nCCE,
|
||||
0,
|
||||
DCI_pdu.dci_alloc[i].rnti,
|
||||
subframe);
|
||||
DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table,
|
||||
1<<DCI_pdu.dci_alloc[i].L,
|
||||
numCCE,
|
||||
0,
|
||||
DCI_pdu.dci_alloc[i].rnti,
|
||||
subframe);
|
||||
}
|
||||
|
||||
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,
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -1055,7 +955,7 @@ int main(int argc, char **argv)
|
||||
|
||||
generate_phich_top(PHY_vars_eNB,
|
||||
subframe,AMP,0,0);
|
||||
/*
|
||||
|
||||
// generate 3 interfering PHICH
|
||||
if (num_phich_interf>0) {
|
||||
PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 4;
|
||||
@@ -1082,7 +982,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -1102,7 +1002,7 @@ int main(int argc, char **argv)
|
||||
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,
|
||||
&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
|
||||
PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
@@ -1262,7 +1162,7 @@ int main(int argc, char **argv)
|
||||
|
||||
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,
|
||||
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++) {
|
||||
@@ -1337,8 +1237,8 @@ int main(int argc, char **argv)
|
||||
} //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_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 (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);
|
||||
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_hi = %d/%d (%e)\n", SNR,n_errors_hi,trial,(double)n_errors_hi/trial);
|
||||
|
||||
|
||||
@@ -47,8 +47,6 @@
|
||||
|
||||
#include "OCG_vars.h"
|
||||
|
||||
#define BW 5.0
|
||||
|
||||
int current_dlsch_cqi; //FIXME!
|
||||
|
||||
PHY_VARS_eNB *PHY_vars_eNB;
|
||||
@@ -58,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];
|
||||
|
||||
int main(int argc, char **argv)
|
||||
@@ -372,7 +318,16 @@ int main(int argc, char **argv)
|
||||
if (transmission_mode==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) {
|
||||
@@ -412,7 +367,8 @@ int main(int argc, char **argv)
|
||||
UE2eNB = new_channel_desc_scm(PHY_vars_UE->lte_frame_parms.nb_antennas_tx,
|
||||
PHY_vars_eNB->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
|
||||
0.0,
|
||||
delay,
|
||||
0);
|
||||
|
||||
@@ -49,8 +49,6 @@
|
||||
#include "OCG_vars.h"
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
|
||||
#define BW 5.0
|
||||
|
||||
int current_dlsch_cqi; //FIXME!
|
||||
|
||||
PHY_VARS_eNB *PHY_vars_eNB;
|
||||
@@ -60,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)
|
||||
{
|
||||
|
||||
@@ -248,7 +192,7 @@ int main(int argc, char **argv)
|
||||
break;
|
||||
|
||||
default:
|
||||
msg("Unsupported channel model!\n");
|
||||
printf("Unsupported channel model!\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
@@ -260,13 +204,13 @@ int main(int argc, char **argv)
|
||||
|
||||
case 's':
|
||||
snr0 = atof(optarg);
|
||||
msg("Setting SNR0 to %f\n",snr0);
|
||||
printf("Setting SNR0 to %f\n",snr0);
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
snr1 = atof(optarg);
|
||||
snr1set=1;
|
||||
msg("Setting SNR1 to %f\n",snr1);
|
||||
printf("Setting SNR1 to %f\n",snr1);
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
@@ -289,7 +233,7 @@ int main(int argc, char **argv)
|
||||
if ((transmission_mode!=1) &&
|
||||
(transmission_mode!=2) &&
|
||||
(transmission_mode!=6)) {
|
||||
msg("Unsupported transmission mode %d\n",transmission_mode);
|
||||
printf("Unsupported transmission mode %d\n",transmission_mode);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
@@ -299,7 +243,7 @@ int main(int argc, char **argv)
|
||||
n_tx=atoi(optarg);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -309,7 +253,7 @@ int main(int argc, char **argv)
|
||||
n_rx=atoi(optarg);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -370,7 +314,16 @@ int main(int argc, char **argv)
|
||||
if (transmission_mode==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) {
|
||||
@@ -414,18 +367,19 @@ 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,
|
||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
|
||||
0.0,
|
||||
0,
|
||||
0);
|
||||
|
||||
|
||||
if (UE2eNB==NULL) {
|
||||
msg("Problem generating channel model. Exiting.\n");
|
||||
printf("Problem generating channel model. Exiting.\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
@@ -453,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.nCS_AN = 0;
|
||||
|
||||
pucch_payload = 1;
|
||||
pucch_payload = 0;
|
||||
|
||||
generate_pucch(PHY_vars_UE->lte_ue_common_vars.txdataF,
|
||||
frame_parms,
|
||||
@@ -474,7 +428,7 @@ int main(int argc, char **argv)
|
||||
if (frame_parms->Ncp == 1)
|
||||
PHY_ofdm_mod(txdataF2[aa], // input
|
||||
txdata[aa], // output
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
frame_parms->ofdm_symbol_size,
|
||||
2*nsymb, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
@@ -497,7 +451,7 @@ int main(int argc, char **argv)
|
||||
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,
|
||||
&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
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
@@ -596,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 (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
|
||||
@@ -646,6 +598,10 @@ int main(int argc, char **argv)
|
||||
|
||||
// if (sig == 1)
|
||||
// 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)));
|
||||
stat = rx_pucch(PHY_vars_eNB,
|
||||
pucch_format,
|
||||
|
||||
@@ -56,94 +56,11 @@
|
||||
#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;
|
||||
|
||||
#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 dummy0[2048*14];
|
||||
mod_sym_t dummy1[2048*14];
|
||||
@@ -404,7 +321,16 @@ int main(int argc, char **argv)
|
||||
if (transmission_mode>=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
|
||||
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);
|
||||
|
||||
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];
|
||||
txdata1 = PHY_vars_eNb1->lte_eNB_common_vars.txdata[0];
|
||||
txdata2 = PHY_vars_eNb2->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];
|
||||
txdata2 = PHY_vars_eNB2->lte_eNB_common_vars.txdata[0];
|
||||
|
||||
|
||||
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,
|
||||
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb);
|
||||
|
||||
printf("PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
|
||||
PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0]);
|
||||
printf("PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
|
||||
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0]);
|
||||
|
||||
|
||||
DLSCH_alloc_pdu2.rah = 0;
|
||||
@@ -465,13 +391,14 @@ int main(int argc, char **argv)
|
||||
// Forget second codeword
|
||||
DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding
|
||||
|
||||
eNB2UE = new_channel_desc_scm(PHY_vars_eNb->lte_frame_parms.nb_antennas_tx,
|
||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
BW,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
|
||||
|
||||
if (eNB2UE==NULL) {
|
||||
@@ -512,51 +439,51 @@ int main(int argc, char **argv)
|
||||
pbch_pdu[1]=1;
|
||||
pbch_pdu[2]=0;
|
||||
|
||||
if (PHY_vars_eNb->lte_frame_parms.frame_type == FDD) {
|
||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
if (PHY_vars_eNB->lte_frame_parms.frame_type == FDD) {
|
||||
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==NORMAL) ? 6 : 5,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5,
|
||||
0);
|
||||
/*
|
||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||
0);*/
|
||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
10);
|
||||
/*
|
||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
|
||||
10);
|
||||
*/
|
||||
|
||||
} else {
|
||||
|
||||
generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
1);
|
||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
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,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
(PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
|
||||
11);
|
||||
generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
2,
|
||||
12);
|
||||
|
||||
@@ -565,8 +492,8 @@ int main(int argc, char **argv)
|
||||
|
||||
|
||||
/*
|
||||
generate_pilots(PHY_vars_eNb,
|
||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pilots(PHY_vars_eNB,
|
||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
|
||||
@@ -577,8 +504,8 @@ int main(int argc, char **argv)
|
||||
dci_alloc,
|
||||
0,
|
||||
1024,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
0);
|
||||
*/
|
||||
|
||||
@@ -593,25 +520,25 @@ int main(int argc, char **argv)
|
||||
dummybuf[1] = dummy1;
|
||||
dummybuf[2] = dummy2;
|
||||
dummybuf[3] = dummy3;
|
||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
||||
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||
(mod_sym_t**)dummybuf,
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
pbch_pdu,
|
||||
0);
|
||||
}
|
||||
|
||||
generate_pbch(&PHY_vars_eNb->lte_eNB_pbch,
|
||||
PHY_vars_eNb->lte_eNB_common_vars.txdataF[0],
|
||||
generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
|
||||
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
&PHY_vars_eNb->lte_frame_parms,
|
||||
&PHY_vars_eNB->lte_frame_parms,
|
||||
pbch_pdu,
|
||||
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)
|
||||
write_output("txsigF1.m","txsF1", PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,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);
|
||||
|
||||
tx_lev = 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)
|
||||
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
|
||||
frame_parms->log2_symbol_size, // log2_fft_size
|
||||
frame_parms->ofdm_symbol_size,
|
||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
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],
|
||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb,
|
||||
frame_parms);
|
||||
@@ -648,7 +575,7 @@ int main(int argc, char **argv)
|
||||
// multipath channel
|
||||
|
||||
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_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,
|
||||
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)
|
||||
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++) {
|
||||
//printf("n_trial %d\n",n_trials);
|
||||
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+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)
|
||||
PHY_ofdm_mod(txdataF2[aa], // input
|
||||
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
|
||||
PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
||||
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)
|
||||
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa], // input,
|
||||
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
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
||||
@@ -1240,7 +1240,7 @@ int main(int argc, char **argv)
|
||||
if (frame_parms->Ncp == 1)
|
||||
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
|
||||
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
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
||||
@@ -1260,7 +1260,7 @@ int main(int argc, char **argv)
|
||||
if (frame_parms->Ncp == 1)
|
||||
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
|
||||
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
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
frame_parms->twiddle_ifft, // IFFT twiddle factors
|
||||
|
||||
@@ -52,29 +52,15 @@
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
#include "OCG_vars.h"
|
||||
|
||||
#ifdef XFORMS
|
||||
#include "PHY/TOOLS/lte_phy_scope.h"
|
||||
#endif
|
||||
|
||||
extern unsigned short dftsizes[33];
|
||||
extern short *ul_ref_sigs[30][2][33];
|
||||
//#define AWGN
|
||||
//#define NO_DCI
|
||||
|
||||
#define BW 7.68
|
||||
//#define ABSTRACTION
|
||||
//#define PERFECT_CE
|
||||
|
||||
/*
|
||||
#define RBmask0 0x00fc00fc
|
||||
#define RBmask1 0x0
|
||||
#define RBmask2 0x0
|
||||
#define RBmask3 0x0
|
||||
*/
|
||||
PHY_VARS_eNB *PHY_vars_eNB;
|
||||
PHY_VARS_UE *PHY_vars_UE;
|
||||
|
||||
#define MCS_COUNT 23//added for PHY abstraction
|
||||
//#define MCS_COUNT 23//added for PHY abstraction
|
||||
|
||||
channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
|
||||
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX];
|
||||
@@ -86,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 char* namepointer_chMag ;
|
||||
|
||||
|
||||
|
||||
#ifdef XFORMS
|
||||
int xforms=0;
|
||||
FD_lte_phy_scope_enb *form_enb;
|
||||
char title[255];
|
||||
#endif
|
||||
|
||||
/*the following parameters are used to control the processing times*/
|
||||
double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */
|
||||
@@ -101,65 +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_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");
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#define UL_RB_ALLOC 0x1ff;
|
||||
|
||||
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
|
||||
@@ -168,12 +92,10 @@ int main(int argc, char **argv)
|
||||
|
||||
int aarx,aatx;
|
||||
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 blerr;
|
||||
|
||||
//int **txdataF, **txdata;
|
||||
|
||||
int **txdata;
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
@@ -199,7 +121,7 @@ int main(int argc, char **argv)
|
||||
unsigned int coded_bits_per_codeword,nsymb;
|
||||
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};
|
||||
uint8_t transmission_mode=1,n_rx=1,n_tx=1;
|
||||
uint8_t transmission_mode=1,n_rx=1;
|
||||
|
||||
FILE *bler_fd=NULL;
|
||||
char bler_fname[512];
|
||||
@@ -267,6 +189,7 @@ int main(int argc, char **argv)
|
||||
int nb_rb_set = 0;
|
||||
int sf;
|
||||
|
||||
int threequarter_fs=0;
|
||||
opp_enabled=1; // to enable the time meas
|
||||
|
||||
cpu_freq_GHz = (double)get_cpu_freq_GHz();
|
||||
@@ -276,7 +199,7 @@ int main(int argc, char **argv)
|
||||
|
||||
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) {
|
||||
case 'a':
|
||||
channel_model = AWGN;
|
||||
@@ -414,10 +337,6 @@ int main(int argc, char **argv)
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (transmission_mode>1) {
|
||||
n_tx = 1;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'y':
|
||||
@@ -450,6 +369,10 @@ int main(int argc, char **argv)
|
||||
cyclic_shift = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
threequarter_fs=1;
|
||||
break;
|
||||
|
||||
case 'N':
|
||||
N0 = atoi(optarg);
|
||||
break;
|
||||
@@ -526,6 +449,10 @@ int main(int argc, char **argv)
|
||||
max_turbo_iterations=atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
xforms=1;
|
||||
break;
|
||||
|
||||
case 'Z':
|
||||
dump_table = 1;
|
||||
break;
|
||||
@@ -539,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)
|
||||
nb_rb = PHY_vars_eNB->lte_frame_parms.N_RB_UL;
|
||||
@@ -583,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);
|
||||
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");
|
||||
|
||||
@@ -591,13 +532,16 @@ int main(int argc, char **argv)
|
||||
hostname[1023] = '\0';
|
||||
gethostname(hostname, 1023);
|
||||
printf("Hostname: %s\n", hostname);
|
||||
char dirname[FILENAME_MAX];
|
||||
sprintf(dirname, "%s//SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname);
|
||||
mkdir(dirname, 0777);
|
||||
sprintf(time_meas_fname,"%s/time_meas_prb%d_mcs%d_antrx%d_channel%s_tx%d.csv",
|
||||
dirname,
|
||||
//char dirname[FILENAME_MAX];
|
||||
//sprintf(dirname, "%s//SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname);
|
||||
//mkdir(dirname, 0777);
|
||||
sprintf(time_meas_fname,"time_meas_prb%d_mcs%d_antrx%d_channel%s_tx%d.csv",
|
||||
N_RB_DL,mcs,n_rx,channel_model_input,transmission_mode);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -649,12 +593,12 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
|
||||
#ifdef XFORMS
|
||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||
form_enb = create_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);
|
||||
#endif
|
||||
if (xforms==1) {
|
||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||
form_enb = create_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);
|
||||
}
|
||||
|
||||
PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = 14;
|
||||
|
||||
@@ -688,7 +632,8 @@ int main(int argc, char **argv)
|
||||
UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
|
||||
PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
|
||||
channel_model,
|
||||
BW,
|
||||
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
|
||||
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
|
||||
forgetting_factor,
|
||||
delay,
|
||||
0);
|
||||
@@ -701,8 +646,8 @@ int main(int argc, char **argv)
|
||||
|
||||
// Create transport channel structures for 2 transport blocks (MIMO)
|
||||
for (i=0; i<2; i++) {
|
||||
PHY_vars_eNB->dlsch_eNB[0][i] = new_eNB_dlsch(1,8,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_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,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
|
||||
|
||||
if (!PHY_vars_eNB->dlsch_eNB[0][i]) {
|
||||
printf("Can't get eNB dlsch structures\n");
|
||||
@@ -717,7 +662,7 @@ int main(int argc, char **argv)
|
||||
PHY_vars_eNB->dlsch_eNB[0][i]->rnti = 14;
|
||||
PHY_vars_UE->dlsch_ue[0][i]->rnti = 14;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
switch (PHY_vars_eNB->lte_frame_parms.N_RB_UL) {
|
||||
@@ -905,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);
|
||||
|
||||
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);
|
||||
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) {
|
||||
trch_out_fdUL= fopen("ulsch_trchUL.txt","w");
|
||||
@@ -931,7 +876,7 @@ int main(int argc, char **argv)
|
||||
i=0;
|
||||
|
||||
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) {
|
||||
((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL));
|
||||
@@ -1120,7 +1065,7 @@ int main(int argc, char **argv)
|
||||
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
|
||||
&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
|
||||
PHY_vars_UE->lte_frame_parms.nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
@@ -1261,6 +1206,7 @@ int main(int argc, char **argv)
|
||||
start_meas(&PHY_vars_eNB->phy_proc_rx);
|
||||
start_meas(&PHY_vars_eNB->ofdm_demod_stats);
|
||||
lte_eNB_I0_measurements(PHY_vars_eNB,
|
||||
subframe,
|
||||
0,
|
||||
1);
|
||||
|
||||
@@ -1407,9 +1353,9 @@ int main(int argc, char **argv)
|
||||
if ((errs[0]>=100) && (trials>(n_frames/2)))
|
||||
break;
|
||||
|
||||
#ifdef XFORMS
|
||||
phy_scope_eNB(form_enb,PHY_vars_eNB,0);
|
||||
#endif
|
||||
if (xforms==1)
|
||||
phy_scope_eNB(form_enb,PHY_vars_eNB,0);
|
||||
|
||||
/*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;
|
||||
|
||||
@@ -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;
|
||||
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*));
|
||||
sin_lut = (double **)malloc(n_samples*sizeof(double*));
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
cos_lut[f+(n_samples>>1)] = (double *)malloc((int)desc->nb_taps*sizeof(double));
|
||||
@@ -73,7 +75,7 @@ void init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
|
||||
if (desc->nb_taps==1)
|
||||
delay = desc->delays[l];
|
||||
else
|
||||
delay = desc->delays[l]+NB_SAMPLES_CHANNEL_OFFSET/desc->BW;
|
||||
delay = desc->delays[l]+NB_SAMPLES_CHANNEL_OFFSET/desc->sampling_rate;
|
||||
|
||||
cos_lut[f+(n_samples>>1)][l] = cos(2*M_PI*freq*delay);
|
||||
sin_lut[f+(n_samples>>1)][l] = sin(2*M_PI*freq*delay);
|
||||
@@ -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 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);
|
||||
|
||||
if (freq_channel_init == 0) {
|
||||
// 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
|
||||
n_samples_max=12*nb_rb+1;
|
||||
init_freq_channel(desc,nb_rb,n_samples_max);
|
||||
freq_channel_init=1;
|
||||
if (init_freq_channel(desc,nb_rb,n_samples_max)==0)
|
||||
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);
|
||||
|
||||
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];
|
||||
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);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
double compute_pbch_sinr(channel_desc_t *desc,
|
||||
|
||||
@@ -69,7 +69,9 @@ typedef struct {
|
||||
///Maximum path delay in mus.
|
||||
double Td;
|
||||
///Channel bandwidth in MHz.
|
||||
double BW;
|
||||
double channel_bandwidth;
|
||||
///System sampling rate in Msps.
|
||||
double sampling_rate;
|
||||
///Ricean factor of first tap wrt other taps (0..1, where 0 means AWGN and 1 means Rayleigh channel).
|
||||
double ricean_factor;
|
||||
///Angle of arrival of wavefront (in radians). For Ricean channel only. This assumes that both RX and TX have linear antenna arrays with lambda/2 antenna spacing. Furhter it is assumed that the arrays are parallel to each other and that they are far enough apart so that we can safely assume plane wave propagation.
|
||||
@@ -202,7 +204,8 @@ typedef enum {
|
||||
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
uint8_t nb_rx,
|
||||
SCM_t channel_model,
|
||||
double BW,
|
||||
double sampling_rate,
|
||||
double channel_bandwidth,
|
||||
double forgetting_factor,
|
||||
int32_t channel_offset,
|
||||
double path_loss_dB);
|
||||
@@ -351,8 +354,8 @@ int gauss(unsigned int *gauss_LUT,unsigned char Nbits);
|
||||
double gaussdouble(double,double);
|
||||
void randominit(unsigned int seed_init);
|
||||
double uniformrandom(void);
|
||||
void 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 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);
|
||||
void multipath_tv_channel(channel_desc_t *desc,
|
||||
double **tx_sig_re,
|
||||
@@ -364,6 +367,10 @@ void multipath_tv_channel(channel_desc_t *desc,
|
||||
|
||||
/**@} */
|
||||
/**@} */
|
||||
|
||||
double N_RB2sampling_rate(uint16_t N_RB);
|
||||
double N_RB2channel_bandwidth(uint16_t N_RB);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -175,13 +175,13 @@ void tv_channel(channel_desc_t *desc,double complex ***H,uint16_t length)
|
||||
{
|
||||
for(p=0;p<desc->nb_paths;p++)
|
||||
{
|
||||
H[i][j] += sqrt(desc->amps[j]/2)*alpha[p]*cexp(-I*(2*pi*w_Hz[p]*i*(1/(desc->BW*1e6))+phi_rad[p]));
|
||||
H[i][j] += sqrt(desc->amps[j]/2)*alpha[p]*cexp(-I*(2*pi*w_Hz[p]*i*(1/(desc->sampling_rate*1e6))+phi_rad[p]));
|
||||
}
|
||||
}
|
||||
}
|
||||
for(j=0;j<desc->nb_paths;j++)
|
||||
{
|
||||
phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->BW)+phi_rad[j],2*pi);
|
||||
phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->sampling_rate)+phi_rad[j],2*pi);
|
||||
}
|
||||
*/
|
||||
|
||||
@@ -193,13 +193,13 @@ void tv_channel(channel_desc_t *desc,double complex ***H,uint16_t length)
|
||||
H[i+(j*desc->nb_rx)][k][l] = 0;
|
||||
|
||||
for(p=0; p<desc->nb_paths; p++) {
|
||||
H[i+(j*desc->nb_rx)][k][l] += sqrt(desc->amps[l]/2)*alpha[p]*cexp(I*(2*pi*w_Hz[p]*k*(1/(desc->BW*1e6))+phi_rad[p]));
|
||||
H[i+(j*desc->nb_rx)][k][l] += sqrt(desc->amps[l]/2)*alpha[p]*cexp(I*(2*pi*w_Hz[p]*k*(1/(desc->sampling_rate*1e6))+phi_rad[p]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(j=0; j<desc->nb_paths; j++) {
|
||||
phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->BW)+phi_rad[j],2*pi);
|
||||
phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->sampling_rate)+phi_rad[j],2*pi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,8 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
||||
double *delays,
|
||||
struct complex** R_sqrt,
|
||||
double Td,
|
||||
double BW,
|
||||
double sampling_rate,
|
||||
double channel_bandwidth,
|
||||
double ricean_factor,
|
||||
double aoa,
|
||||
double forgetting_factor,
|
||||
@@ -81,7 +82,8 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
||||
chan_desc->delays = delays;
|
||||
|
||||
chan_desc->Td = Td;
|
||||
chan_desc->BW = BW;
|
||||
chan_desc->sampling_rate = sampling_rate;
|
||||
chan_desc->channel_bandwidth = channel_bandwidth;
|
||||
chan_desc->ricean_factor = ricean_factor;
|
||||
chan_desc->aoa = aoa;
|
||||
chan_desc->random_aoa = random_aoa;
|
||||
@@ -195,7 +197,8 @@ struct complex **R_sqrt_ptr2;
|
||||
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
uint8_t nb_rx,
|
||||
SCM_t channel_model,
|
||||
double BW,
|
||||
double sampling_rate,
|
||||
double channel_bandwidth,
|
||||
double forgetting_factor,
|
||||
int32_t channel_offset,
|
||||
double path_loss_dB)
|
||||
@@ -209,7 +212,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
|
||||
chan_desc->nb_tx = nb_tx;
|
||||
chan_desc->nb_rx = nb_rx;
|
||||
chan_desc->BW = BW;
|
||||
chan_desc->sampling_rate = sampling_rate;
|
||||
chan_desc->channel_bandwidth = channel_bandwidth;
|
||||
chan_desc->forgetting_factor = forgetting_factor;
|
||||
chan_desc->channel_offset = channel_offset;
|
||||
chan_desc->path_loss_dB = path_loss_dB;
|
||||
@@ -232,7 +236,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
case SCM_C:
|
||||
chan_desc->nb_taps = 18;
|
||||
chan_desc->Td = 4.625;
|
||||
chan_desc->channel_length = (int) (2*chan_desc->BW*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->BW*chan_desc->Td));
|
||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||
sum_amps = 0;
|
||||
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
|
||||
|
||||
@@ -291,7 +295,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
LOG_W(OCM,"This is not the real SCM-D model! It is just SCM-C with an additional Rice factor!\n");
|
||||
chan_desc->nb_taps = 18;
|
||||
chan_desc->Td = 4.625;
|
||||
chan_desc->channel_length = (int) (2*chan_desc->BW*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->BW*chan_desc->Td));
|
||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||
sum_amps = 0;
|
||||
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
|
||||
|
||||
@@ -349,7 +353,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
case EPA:
|
||||
chan_desc->nb_taps = 7;
|
||||
chan_desc->Td = .410;
|
||||
chan_desc->channel_length = (int) (2*chan_desc->BW*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->BW*chan_desc->Td));
|
||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||
sum_amps = 0;
|
||||
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
|
||||
|
||||
@@ -403,7 +407,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
case EVA:
|
||||
chan_desc->nb_taps = 9;
|
||||
chan_desc->Td = 2.51;
|
||||
chan_desc->channel_length = (int) (2*chan_desc->BW*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->BW*chan_desc->Td));
|
||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||
sum_amps = 0;
|
||||
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
|
||||
|
||||
@@ -457,7 +461,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
case ETU:
|
||||
chan_desc->nb_taps = 9;
|
||||
chan_desc->Td = 5.0;
|
||||
chan_desc->channel_length = (int) (2*chan_desc->BW*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->BW*chan_desc->Td));
|
||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||
sum_amps = 0;
|
||||
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
|
||||
|
||||
@@ -511,7 +515,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
case MBSFN:
|
||||
chan_desc->nb_taps = 18;
|
||||
chan_desc->Td = 28.58;
|
||||
chan_desc->channel_length = (int) (2*chan_desc->BW*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->BW*chan_desc->Td));
|
||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||
sum_amps = 0;
|
||||
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
|
||||
|
||||
@@ -558,7 +562,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
case Rayleigh8:
|
||||
nb_taps = 8;
|
||||
Td = 0.8;
|
||||
channel_length = (int)11+2*BW*Td;
|
||||
channel_length = (int)11+2*sampling_rate*Td;
|
||||
ricean_factor = 1;
|
||||
aoa = .03;
|
||||
maxDoppler = 0;
|
||||
@@ -572,7 +576,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
NULL,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -585,7 +590,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
case Rice8:
|
||||
nb_taps = 8;
|
||||
Td = 0.8;
|
||||
channel_length = (int)11+2*BW*Td;
|
||||
channel_length = (int)11+2*sampling_rate*Td;
|
||||
ricean_factor = 0.1;
|
||||
aoa = .03;
|
||||
maxDoppler = 0;
|
||||
@@ -598,7 +603,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
NULL,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -624,7 +630,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
NULL,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -650,7 +657,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
NULL,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -683,7 +691,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
R_sqrt_ptr2,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -716,7 +725,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
R_sqrt_ptr2,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -742,7 +752,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
NULL,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -768,7 +779,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
NULL,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -803,7 +815,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
R_sqrt_ptr2,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -836,7 +849,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
NULL,
|
||||
R_sqrt_ptr2,
|
||||
Td,
|
||||
BW,
|
||||
sampling_rate,
|
||||
channel_bandwidth,
|
||||
ricean_factor,
|
||||
aoa,
|
||||
forgetting_factor,
|
||||
@@ -985,11 +999,11 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag)
|
||||
desc->ch[aarx+(aatx*desc->nb_rx)][k].y = 0.0;
|
||||
|
||||
for (l=0; l<desc->nb_taps; l++) {
|
||||
if ((k - (desc->delays[l]*desc->BW) - NB_SAMPLES_CHANNEL_OFFSET) == 0)
|
||||
if ((k - (desc->delays[l]*desc->sampling_rate) - NB_SAMPLES_CHANNEL_OFFSET) == 0)
|
||||
s = 1.0;
|
||||
else
|
||||
s = sin(M_PI*(k - (desc->delays[l]*desc->BW) - NB_SAMPLES_CHANNEL_OFFSET))/
|
||||
(M_PI*(k - (desc->delays[l]*desc->BW) - NB_SAMPLES_CHANNEL_OFFSET));
|
||||
s = sin(M_PI*(k - (desc->delays[l]*desc->sampling_rate) - NB_SAMPLES_CHANNEL_OFFSET))/
|
||||
(M_PI*(k - (desc->delays[l]*desc->sampling_rate) - NB_SAMPLES_CHANNEL_OFFSET));
|
||||
|
||||
desc->ch[aarx+(aatx*desc->nb_rx)][k].x += s*desc->a[l][aarx+(aatx*desc->nb_rx)].x;
|
||||
desc->ch[aarx+(aatx*desc->nb_rx)][k].y += s*desc->a[l][aarx+(aatx*desc->nb_rx)].y;
|
||||
@@ -1014,22 +1028,77 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag)
|
||||
return (0);
|
||||
}
|
||||
|
||||
double N_RB2sampling_rate(uint16_t N_RB)
|
||||
{
|
||||
double sampling_rate;
|
||||
switch (N_RB) {
|
||||
case 6:
|
||||
sampling_rate = 1.92;
|
||||
break;
|
||||
|
||||
case 25:
|
||||
sampling_rate = 7.68;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
sampling_rate = 15.36;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
sampling_rate = 30.72;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(PHY,"Unknown N_PRB\n");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
return(sampling_rate);
|
||||
}
|
||||
|
||||
double N_RB2channel_bandwidth(uint16_t N_RB)
|
||||
{
|
||||
double channel_bandwidth;
|
||||
switch (N_RB) {
|
||||
case 6:
|
||||
channel_bandwidth = 1.25;
|
||||
break;
|
||||
|
||||
case 25:
|
||||
channel_bandwidth = 5.00;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
channel_bandwidth = 10.00;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
channel_bandwidth = 20.00;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(PHY,"Unknown N_PRB\n");
|
||||
return(-1);
|
||||
}
|
||||
return(channel_bandwidth);
|
||||
}
|
||||
|
||||
#ifdef RANDOM_CHANNEL_MAIN
|
||||
#define BW 5.0
|
||||
#define sampling_rate 5.0
|
||||
#define Td 2.0
|
||||
main(int argc,char **argv)
|
||||
{
|
||||
|
||||
double amps[8] = {.8,.2,.1,.04,.02,.01,.005};
|
||||
struct complex ch[(int)(1+2*BW*Td)],phase;
|
||||
struct complex ch[(int)(1+2*sampling_rate*Td)],phase;
|
||||
int i;
|
||||
|
||||
randominit();
|
||||
phase.x = 1.0;
|
||||
phase.y = 0;
|
||||
random_channel(amps,Td, 8,BW,ch,(double)1.0,&phase);
|
||||
random_channel(amps,Td, 8,sampling_rate,ch,(double)1.0,&phase);
|
||||
/*
|
||||
for (i=0;i<(11+2*BW*Td);i++){
|
||||
for (i=0;i<(11+2*sampling_rate*Td);i++){
|
||||
printf("%f + sqrt(-1)*%f\n",ch[i].x,ch[i].y);
|
||||
}
|
||||
*/
|
||||
|
||||
@@ -48,7 +48,19 @@ Description Contains global common definitions
|
||||
|
||||
#include <stdint.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"
|
||||
|
||||
@@ -59,13 +71,6 @@ Description Contains global common definitions
|
||||
#define RETURNok (0)
|
||||
#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
|
||||
* 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 rnti_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)
|
||||
#define NOT_A_RNTI (rnti_t)0
|
||||
#endif
|
||||
|
||||
@@ -115,7 +115,7 @@ typedef struct net_ip_address_s {
|
||||
unsigned ipv4:1;
|
||||
unsigned ipv6:1;
|
||||
char ipv4_address[16];
|
||||
char ipv6_address[40];
|
||||
char ipv6_address[46];
|
||||
} net_ip_address_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_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_NONE "none"
|
||||
@@ -253,7 +265,7 @@ static const eutra_band_t eutra_bands[] = {
|
||||
|
||||
Enb_properties_array_t enb_properties;
|
||||
|
||||
static void enb_config_display(void)
|
||||
void enb_config_display(void)
|
||||
{
|
||||
int i,j;
|
||||
|
||||
@@ -274,6 +286,34 @@ static void enb_config_display(void)
|
||||
} else {
|
||||
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++) {
|
||||
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_mme_addresses = 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_otg = NULL;
|
||||
config_setting_t *subsetting_otg = NULL;
|
||||
config_setting_t *subsetting_otg = NULL;
|
||||
int num_enb_properties = 0;
|
||||
int enb_properties_index = 0;
|
||||
int num_enbs = 0;
|
||||
int num_mme_address = 0;
|
||||
int num_otg_elements =0;
|
||||
int num_component_carriers =0;
|
||||
int num_rrh_gw = 0;
|
||||
int num_otg_elements = 0;
|
||||
int num_component_carriers = 0;
|
||||
int i = 0;
|
||||
int j = 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;
|
||||
|
||||
|
||||
char* if_name = NULL;
|
||||
char* ipv4 = NULL;
|
||||
char* ipv4_remote = NULL;
|
||||
char* ipv6 = NULL;
|
||||
char* active = 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];
|
||||
char* enb_interface_name_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;
|
||||
|
||||
if ((prach_zero_correlation <0) || (prach_zero_correlation > 63))
|
||||
if ((prach_zero_correlation <0) || (prach_zero_correlation > 15))
|
||||
AssertError (0, parse_errors ++,
|
||||
"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);
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
// 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
|
||||
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;
|
||||
} 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 {
|
||||
/* Unique eNB_id to identify the eNB within EPC.
|
||||
* 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;
|
||||
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
|
||||
/* Nb of 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_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_get(void);
|
||||
|
||||
@@ -251,7 +251,8 @@ typedef struct {
|
||||
typedef struct {
|
||||
uint8_t Num_ue_spec_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_PDU;
|
||||
/*! \brief CCCH payload */
|
||||
@@ -735,7 +736,8 @@ typedef struct {
|
||||
uint8_t dl_pow_off[MAX_NUM_CCs];
|
||||
uint16_t pre_nb_available_rbs[MAX_NUM_CCs];
|
||||
unsigned char rballoc_sub_UE[MAX_NUM_CCs][N_RBG_MAX];
|
||||
|
||||
uint16_t ta_timer;
|
||||
int16_t ta_update;
|
||||
} UE_sched_ctrl;
|
||||
/*! \brief eNB template for the Random access information */
|
||||
typedef struct {
|
||||
@@ -765,8 +767,6 @@ typedef struct {
|
||||
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.
|
||||
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.
|
||||
uint8_t wait_ack_Msg4;
|
||||
/// UE RNTI allocated during RAR
|
||||
@@ -835,8 +835,8 @@ typedef struct {
|
||||
/// Outgoing CCCH pdu for PHY
|
||||
CCCH_PDU CCCH_pdu;
|
||||
RA_TEMPLATE RA_template[NB_RA_PROC_MAX];
|
||||
/// BCCH active flag
|
||||
uint8_t bcch_active;
|
||||
/// VRB map for common channels
|
||||
uint8_t vrb_map[100];
|
||||
/// MBSFN SubframeConfig
|
||||
struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8];
|
||||
/// number of subframe allocation pattern available for MBSFN sync area
|
||||
@@ -883,9 +883,11 @@ typedef struct {
|
||||
/// Common cell resources
|
||||
COMMON_channels_t common_channels[MAX_NUM_CCs];
|
||||
UE_list_t UE_list;
|
||||
|
||||
///subband bitmap configuration
|
||||
SBMAP_CONF sbmap_conf;
|
||||
|
||||
/// CCE table used to build DCI scheduling information
|
||||
int CCE_table[MAX_NUM_CCs][800];
|
||||
/// active flag for Other lcid
|
||||
uint8_t lcid_active[NB_RB_MAX];
|
||||
/// 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) {
|
||||
{
|
||||
|
||||
unsigned int nprb[MAX_NUM_CCs];
|
||||
unsigned int nCCE[MAX_NUM_CCs];
|
||||
int mbsfn_status[MAX_NUM_CCs];
|
||||
uint32_t RBalloc[MAX_NUM_CCs];
|
||||
protocol_ctxt_t ctxt;
|
||||
#ifdef EXMIMO
|
||||
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++) {
|
||||
DCI_pdu[CC_id] = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
|
||||
nCCE[CC_id]=0;
|
||||
nprb[CC_id]=0;
|
||||
RBalloc[CC_id]=0;
|
||||
DCI_pdu[CC_id]->nCCE=0;
|
||||
DCI_pdu[CC_id]->num_pdcch_symbols=1;
|
||||
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
|
||||
@@ -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++) {
|
||||
DCI_pdu[CC_id]->Num_common_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
|
||||
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].subframe = subframeP;
|
||||
|
||||
|
||||
}
|
||||
|
||||
//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 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
|
||||
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
|
||||
(mac_xface->lte_frame_parms->tdd_config == 3) ||
|
||||
(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);
|
||||
|
||||
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;
|
||||
|
||||
@@ -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) {
|
||||
case 0:
|
||||
case 1:
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7,nCCE);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8,nCCE);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} 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,1,5,nCCE);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,1,5);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -287,9 +291,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
// TDD, nothing
|
||||
// FDD, normal UL/DLSCH
|
||||
if (mac_xface->lte_frame_parms->frame_type == FDD) { //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,2,6,nCCE);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,2,6);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
}
|
||||
|
||||
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) {
|
||||
switch (mac_xface->lte_frame_parms->tdd_config) {
|
||||
case 2:
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7,nCCE);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
|
||||
|
||||
// no break here!
|
||||
case 5:
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} 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;
|
||||
@@ -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
|
||||
switch (mac_xface->lte_frame_parms->tdd_config) {
|
||||
case 1:
|
||||
// schedule_RA(module_idP,frameP,subframeP,nprb,nCCE);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8,nCCE);
|
||||
// schedule_RA(module_idP,frameP,subframeP);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
|
||||
|
||||
// no break here!
|
||||
case 2:
|
||||
@@ -341,8 +345,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
|
||||
// no break here!
|
||||
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;
|
||||
|
||||
default:
|
||||
@@ -350,11 +355,11 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
}
|
||||
} else {
|
||||
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 normal 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) {
|
||||
schedule_RA(module_idP,frameP,subframeP,1,nprb,nCCE);
|
||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,5,9,nCCE);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
||||
|
||||
schedule_RA(module_idP,frameP,subframeP,1);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,5,9);
|
||||
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
|
||||
(mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
|
||||
//schedule_ulsch(module_idP,cooperation_flag,subframeP,nCCE);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
//schedule_ulsch(module_idP,cooperation_flag,subframeP);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
} else {
|
||||
//schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -395,36 +400,36 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
break;
|
||||
|
||||
case 1:
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2,nCCE);
|
||||
// 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,subframeP,2);
|
||||
// schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,nCCE);
|
||||
// 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,subframeP,3);
|
||||
// schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
schedule_RA(module_idP,frameP,subframeP,2,nprb,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,2);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
case 4:
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,6,0,nCCE);
|
||||
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,6,0);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
}
|
||||
|
||||
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) {
|
||||
case 3:
|
||||
case 4:
|
||||
schedule_RA(module_idP,frameP,subframeP,3,nprb,nCCE); // 3 = Msg3 subframeP, not
|
||||
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,3); // 3 = Msg3 subframeP, not
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
//schedule_ulsch(module_idP,frameP,cooperation_flag,7,1,nCCE);
|
||||
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,7,1);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -470,19 +475,19 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
||||
case 4:
|
||||
case 5:
|
||||
|
||||
// schedule_RA(module_idP,subframeP,nprb,nCCE);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2,nCCE);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
// schedule_RA(module_idP,subframeP);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
//schedule_ulsch(module_idP,frameP,cooperation_flag,8,2,nCCE);
|
||||
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,8,2);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
}
|
||||
|
||||
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) {
|
||||
switch (mac_xface->lte_frame_parms->tdd_config) {
|
||||
case 1:
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,nCCE);
|
||||
schedule_RA(module_idP,frameP,subframeP,7,nprb,nCCE); // 7 = Msg3 subframeP, not
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,1,mbsfn_status);
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
|
||||
schedule_RA(module_idP,frameP,subframeP,7); // 7 = Msg3 subframeP, not
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
case 4:
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3,nCCE);
|
||||
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,subframeP,3);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4,nCCE);
|
||||
//schedule_RA(module_idP,frameP,subframeP,nprb,nCCE);
|
||||
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,subframeP,4);
|
||||
//schedule_RA(module_idP,frameP,subframeP);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case 5:
|
||||
//schedule_RA(module_idP,frameP,subframeP,nprb,nCCE);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,nprb,nCCE,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,RBalloc,0,mbsfn_status);
|
||||
//schedule_RA(module_idP,frameP,subframeP);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else { //FDD
|
||||
// schedule_ulsch(module_idP,frameP,cooperation_flag,9,3,nCCE);
|
||||
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,9,3);
|
||||
schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
|
||||
fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
DCI_pdu[CC_id]->nCCE = nCCE[CC_id];
|
||||
}
|
||||
LOG_D(MAC,"FrameP %d, subframeP %d : Scheduling CCEs\n",frameP,subframeP);
|
||||
|
||||
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);
|
||||
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
|
||||
|
||||
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;
|
||||
@@ -76,34 +77,195 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
|
||||
|
||||
|
||||
RA_TEMPLATE *RA_template;
|
||||
unsigned char i;//,harq_pid,round;
|
||||
unsigned char i,harq_pid,round;
|
||||
int16_t rrc_sdu_length;
|
||||
unsigned char lcid,offset;
|
||||
module_id_t UE_id= UE_INDEX_INVALID;
|
||||
unsigned short TBsize = -1;
|
||||
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);
|
||||
|
||||
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++) {
|
||||
|
||||
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",
|
||||
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) {
|
||||
nprb[CC_id]= nprb[CC_id] + 3;
|
||||
nCCE[CC_id] = nCCE[CC_id] + 4;
|
||||
RA_template[i].Msg3_subframe=Msg3_subframe;
|
||||
} else if (RA_template[i].generate_Msg4 == 1) {
|
||||
if (RA_template->generate_rar == 1) {
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
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
|
||||
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) {
|
||||
|
||||
@@ -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) {
|
||||
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);
|
||||
// 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);
|
||||
// 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
|
||||
@@ -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) {
|
||||
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) {
|
||||
((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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
|
||||
((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[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) {
|
||||
((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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
|
||||
|
||||
((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[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) {
|
||||
((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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
((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[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) {
|
||||
((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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
|
||||
((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;
|
||||
}
|
||||
} else { // FDD DCI
|
||||
switch (mac_xface->lte_frame_parms->N_RB_DL) {
|
||||
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) {
|
||||
((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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
|
||||
((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[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) {
|
||||
((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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
|
||||
((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[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) {
|
||||
((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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
|
||||
((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[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) {
|
||||
((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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
} 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;
|
||||
}
|
||||
|
||||
((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;
|
||||
}
|
||||
}
|
||||
|
||||
RA_template[i].generate_Msg4=0;
|
||||
RA_template[i].generate_Msg4_dci=1;
|
||||
RA_template[i].wait_ack_Msg4=1;
|
||||
RA_template[i].RA_active = FALSE;
|
||||
lcid=0;
|
||||
|
||||
if ((TBsize - rrc_sdu_length - msg4_header) <= 2) {
|
||||
msg4_padding = TBsize - rrc_sdu_length - msg4_header;
|
||||
msg4_post_padding = 0;
|
||||
} else {
|
||||
msg4_padding = 0;
|
||||
msg4_post_padding = TBsize - rrc_sdu_length - msg4_header -1;
|
||||
}
|
||||
|
||||
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);
|
||||
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],
|
||||
1, //num_sdus
|
||||
(unsigned short*)&rrc_sdu_length, //
|
||||
&lcid, // sdu_lcid
|
||||
255, // no drx
|
||||
0, // no timing advance
|
||||
RA_template[i].cont_res_id, // contention res id
|
||||
msg4_padding, // no padding
|
||||
msg4_post_padding);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
nprb[CC_id]= nprb[CC_id] + 3;
|
||||
nCCE[CC_id] = nCCE[CC_id] + 4;
|
||||
}
|
||||
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);
|
||||
|
||||
RA_template->generate_Msg4=0;
|
||||
RA_template->wait_ack_Msg4=1;
|
||||
RA_template->RA_active = FALSE;
|
||||
lcid=0;
|
||||
|
||||
if ((TBsize - rrc_sdu_length - msg4_header) <= 2) {
|
||||
msg4_padding = TBsize - rrc_sdu_length - msg4_header;
|
||||
msg4_post_padding = 0;
|
||||
} else {
|
||||
msg4_padding = 0;
|
||||
msg4_post_padding = TBsize - rrc_sdu_length - msg4_header -1;
|
||||
}
|
||||
|
||||
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);
|
||||
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],
|
||||
1, //num_sdus
|
||||
(unsigned short*)&rrc_sdu_length, //
|
||||
&lcid, // sdu_lcid
|
||||
255, // no drx
|
||||
0, // no timing advance
|
||||
RA_template->cont_res_id, // contention res id
|
||||
msg4_padding, // no padding
|
||||
msg4_post_padding);
|
||||
|
||||
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);
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
/*
|
||||
else if (eNB_mac_inst[module_idP][CC_id].RA_template[i].wait_ack_Msg4==1) {
|
||||
// check HARQ status and retransmit if necessary
|
||||
LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d: Checking if Msg4 was acknowledged :\n",module_idP,frameP,subframeP);
|
||||
// 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);
|
||||
if (round>0) {
|
||||
*nprb= (*nprb) + 3;
|
||||
*nCCE = (*nCCE) + 4;
|
||||
}
|
||||
}
|
||||
*/
|
||||
} 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;
|
||||
}
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -72,9 +72,8 @@ void
|
||||
schedule_SI(
|
||||
module_id_t module_idP,
|
||||
frame_t frameP,
|
||||
unsigned int* nprbP,
|
||||
unsigned int* nCCEP
|
||||
)
|
||||
sub_frame_t subframeP)
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
|
||||
@@ -85,12 +84,19 @@ schedule_SI(
|
||||
void *BCCH_alloc_pdu;
|
||||
int CC_id;
|
||||
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);
|
||||
|
||||
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,
|
||||
CC_id,
|
||||
@@ -104,7 +110,41 @@ schedule_SI(
|
||||
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);
|
||||
|
||||
// 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))) {
|
||||
mcs=0;
|
||||
} else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) {
|
||||
@@ -125,46 +165,153 @@ schedule_SI(
|
||||
mcs=8;
|
||||
}
|
||||
|
||||
|
||||
|
||||
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)->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;
|
||||
|
||||
case 25:
|
||||
((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:
|
||||
((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;
|
||||
|
||||
case 100:
|
||||
((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 {
|
||||
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)->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;
|
||||
|
||||
case 25:
|
||||
((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;
|
||||
|
||||
case 50:
|
||||
((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;
|
||||
|
||||
case 100:
|
||||
((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) {
|
||||
trace_pdu(1,
|
||||
&eNB->common_channels[CC_id].BCCH_pdu.payload[0],
|
||||
@@ -194,17 +341,13 @@ schedule_SI(
|
||||
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].bcch_buffer=bcch_sdu_length;
|
||||
eNB->eNB_stats[CC_id].total_bcch_buffer+=bcch_sdu_length;
|
||||
eNB->eNB_stats[CC_id].bcch_mcs=mcs;
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -422,16 +422,13 @@ schedule_ue_spec(
|
||||
module_id_t module_idP,
|
||||
frame_t frameP,
|
||||
sub_frame_t subframeP,
|
||||
unsigned int *nb_rb_used0,
|
||||
unsigned int *nCCE_used,
|
||||
int* mbsfn_flag
|
||||
int* mbsfn_flag
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
|
||||
uint8_t CC_id;
|
||||
int UE_id;
|
||||
uint16_t nCCE[MAX_NUM_CCs];
|
||||
int N_RBG[MAX_NUM_CCs];
|
||||
unsigned char aggregation;
|
||||
mac_rlc_status_resp_t rlc_status;
|
||||
@@ -452,7 +449,6 @@ schedule_ue_spec(
|
||||
// uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
int mcs;
|
||||
uint16_t min_rb_unit[MAX_NUM_CCs];
|
||||
short ta_update = 0;
|
||||
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
||||
UE_list_t *UE_list = &eNB->UE_list;
|
||||
LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs];
|
||||
@@ -461,6 +457,7 @@ schedule_ue_spec(
|
||||
int32_t tpc=1;
|
||||
static int32_t tpc_accumulated=0;
|
||||
UE_sched_ctrl *ue_sched_ctl;
|
||||
int i;
|
||||
|
||||
if (UE_list->head==-1) {
|
||||
return;
|
||||
@@ -475,15 +472,18 @@ schedule_ue_spec(
|
||||
for (CC_id=0; CC_id<MAX_NUM_CCs; 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);
|
||||
total_nb_available_rb[CC_id] = frame_parms[CC_id]->N_RB_DL - nb_rb_used0[CC_id];
|
||||
nCCE[CC_id] = mac_xface->get_nCCE_max(module_idP,CC_id) - nCCE_used[CC_id];
|
||||
// get number of PRBs less those used by common channels
|
||||
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;
|
||||
|
||||
// store the global enb stats:
|
||||
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].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_pdus_tx=0;
|
||||
}
|
||||
@@ -525,9 +525,11 @@ schedule_ue_spec(
|
||||
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",
|
||||
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)
|
||||
continue_flag=1; //to next user (there might be rbs availiable for other UEs in TM5
|
||||
// else
|
||||
@@ -542,7 +544,6 @@ schedule_ue_spec(
|
||||
UE_list);
|
||||
// update UL DAI after DLSCH scheduling
|
||||
set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms);
|
||||
|
||||
}
|
||||
|
||||
if (continue_flag == 1 ) {
|
||||
@@ -589,11 +590,10 @@ schedule_ue_spec(
|
||||
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,
|
||||
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
|
||||
@@ -643,8 +643,6 @@ schedule_ue_spec(
|
||||
|
||||
nb_available_rb -= nb_rb;
|
||||
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;
|
||||
@@ -791,7 +789,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].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_mcs2=eNB_UE_stats->dlsch_mcs1;
|
||||
} else {
|
||||
@@ -808,29 +805,7 @@ schedule_ue_spec(
|
||||
// check first for RLC data on DCCH
|
||||
// add the length for all the control elements (timing adv, drx, etc) : header + payload
|
||||
|
||||
//#ifndef EXMIMO_IOT
|
||||
// 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;
|
||||
ta_len = (ue_sched_ctl->ta_update!=0) ? 2 : 0;
|
||||
|
||||
header_len_dcch = 2; // 2 bytes DCCH SDU subheader
|
||||
|
||||
@@ -1086,11 +1061,6 @@ schedule_ue_spec(
|
||||
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*)eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0],
|
||||
@@ -1098,19 +1068,18 @@ schedule_ue_spec(
|
||||
sdu_lengths, //
|
||||
sdu_lcids,
|
||||
255, // no drx
|
||||
ta_update, // timing advance
|
||||
ue_sched_ctl->ta_update, // timing advance
|
||||
NULL, // contention res id
|
||||
padding,
|
||||
post_padding);
|
||||
|
||||
//#ifdef DEBUG_eNB_SCHEDULER
|
||||
// if (ta_update) {
|
||||
if (ue_sched_ctl->ta_update) {
|
||||
LOG_I(MAC,
|
||||
"[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d LCID %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_lcids[0], 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);
|
||||
// }
|
||||
|
||||
"[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,
|
||||
ue_sched_ctl->ta_update,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch);
|
||||
}
|
||||
//#endif
|
||||
#ifdef DEBUG_eNB_SCHEDULER
|
||||
LOG_T(MAC,"[eNB %d] First 16 bytes of DLSCH : \n");
|
||||
@@ -1140,8 +1109,6 @@ schedule_ue_spec(
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
add_ue_dlsch_info(module_idP,
|
||||
@@ -1155,7 +1122,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].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_mcs2=mcs;
|
||||
UE_list->eNB_UE_stats[CC_id][UE_id].TBS = TBS;
|
||||
@@ -1176,7 +1142,7 @@ schedule_ue_spec(
|
||||
// this is the normalized RX power
|
||||
eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti);
|
||||
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
|
||||
// make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
|
||||
@@ -1188,6 +1154,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_subframe=subframeP;
|
||||
|
||||
if (normalized_rx_power>(target_rx_power+1)) {
|
||||
tpc = 0; //-1
|
||||
tpc_accumulated--;
|
||||
@@ -1197,9 +1164,11 @@ schedule_ue_spec(
|
||||
} else {
|
||||
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,
|
||||
tpc_accumulated,normalized_rx_power,target_rx_power);
|
||||
tpc_accumulated,normalized_rx_power,target_rx_power);*/
|
||||
|
||||
} // Po_PUCCH has been updated
|
||||
else {
|
||||
tpc = 1; //0
|
||||
@@ -1505,10 +1474,9 @@ schedule_ue_spec(
|
||||
if (frame_parms[CC_id]->frame_type == TDD) {
|
||||
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);
|
||||
@@ -1519,13 +1487,11 @@ schedule_ue_spec(
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
fill_DLSCH_dci(
|
||||
module_id_t module_idP,
|
||||
frame_t frameP,
|
||||
sub_frame_t subframeP,
|
||||
uint32_t* RBallocP,
|
||||
uint8_t RA_scheduledP,
|
||||
int* mbsfn_flagP
|
||||
)
|
||||
module_id_t module_idP,
|
||||
frame_t frameP,
|
||||
sub_frame_t subframeP,
|
||||
int* mbsfn_flagP
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
|
||||
@@ -1533,10 +1499,9 @@ fill_DLSCH_dci(
|
||||
int UE_id = -1;
|
||||
uint8_t first_rb,nb_rb=3;
|
||||
rnti_t rnti;
|
||||
unsigned char vrb_map[100];
|
||||
unsigned char *vrb_map;
|
||||
uint8_t rballoc_sub[25];
|
||||
//uint8_t number_of_subbands=13;
|
||||
uint32_t *rballoc=RBallocP;
|
||||
|
||||
unsigned char round;
|
||||
unsigned char harq_pid;
|
||||
@@ -1559,598 +1524,8 @@ fill_DLSCH_dci(
|
||||
if (mbsfn_flagP[CC_id]>0)
|
||||
continue;
|
||||
|
||||
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
|
||||
|
||||
DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu;
|
||||
|
||||
|
||||
// UE specific DCIs
|
||||
for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
|
||||
@@ -2171,11 +1546,6 @@ fill_DLSCH_dci(
|
||||
/// Synchronizing rballoc with rballoc_sub
|
||||
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];
|
||||
|
||||
if(rballoc_sub[i] == 1) {
|
||||
rballoc[CC_id] |= (0x0001<<i); // TO be FIXED!!!!!!
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
switch(mac_xface->get_transmission_mode(module_idP,CC_id,rnti)) {
|
||||
@@ -2184,7 +1554,7 @@ fill_DLSCH_dci(
|
||||
case 1:
|
||||
|
||||
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) {
|
||||
switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
|
||||
@@ -2277,7 +1647,7 @@ fill_DLSCH_dci(
|
||||
|
||||
case 3:
|
||||
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) {
|
||||
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->num_UEs++;
|
||||
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++) {
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -87,6 +87,7 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
int ii,j;
|
||||
eNB_MAC_INST *eNB = &eNB_mac_inst[enb_mod_idP];
|
||||
UE_list_t *UE_list= &eNB->UE_list;
|
||||
int crnti_rx=0;
|
||||
|
||||
start_meas(&eNB->rx_ulsch_sdu);
|
||||
|
||||
@@ -125,13 +126,11 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
break;
|
||||
|
||||
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]);
|
||||
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;
|
||||
/* we don't process this CE yet */
|
||||
|
||||
if (msg3_flagP != NULL) {
|
||||
*msg3_flagP = 0;
|
||||
}
|
||||
@@ -145,6 +144,9 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
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);
|
||||
|
||||
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) {
|
||||
|
||||
UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
|
||||
@@ -176,6 +178,15 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
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 (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 ) {
|
||||
UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0]=0;
|
||||
@@ -222,7 +233,7 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
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++) {
|
||||
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->common_channels[CC_idP].RA_template[ii].rnti, rntiP,
|
||||
eNB->common_channels[CC_idP].RA_template[ii].RA_active);
|
||||
@@ -235,7 +246,7 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
if (UE_id < 0) {
|
||||
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",
|
||||
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 ) {
|
||||
mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n");
|
||||
@@ -245,7 +256,7 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
enb_mod_idP,CC_idP,frameP,eNB->common_channels[CC_idP].RA_template[ii].rnti,UE_id);
|
||||
} 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",
|
||||
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
|
||||
}
|
||||
|
||||
@@ -257,7 +268,7 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
rntiP,
|
||||
CCCH,
|
||||
(uint8_t*)payload_ptr,
|
||||
rx_lengths[ii],
|
||||
rx_lengths[i],
|
||||
ENB_FLAG_YES,
|
||||
enb_mod_idP,
|
||||
0);
|
||||
@@ -581,12 +592,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,
|
||||
unsigned int *nCCE) //,int calibration_flag) {
|
||||
{
|
||||
void schedule_ulsch(module_id_t module_idP,
|
||||
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;
|
||||
int CC_id;
|
||||
eNB_MAC_INST *eNB=&eNB_mac_inst[module_idP];
|
||||
@@ -597,7 +610,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++) {
|
||||
|
||||
first_rb[CC_id] = 1;
|
||||
nCCE_available[CC_id] = mac_xface->get_nCCE_max(module_idP,CC_id) - nCCE[CC_id];
|
||||
|
||||
// UE data info;
|
||||
// check which UE has data to transmit
|
||||
@@ -629,10 +641,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
|
||||
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
|
||||
|
||||
|
||||
@@ -647,8 +659,6 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
frame_t frameP,
|
||||
sub_frame_t subframeP,
|
||||
unsigned char sched_subframe,
|
||||
unsigned int *nCCE,
|
||||
unsigned int *nCCE_available,
|
||||
uint16_t *first_rb)
|
||||
{
|
||||
|
||||
@@ -682,8 +692,7 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
frameP,
|
||||
subframeP,
|
||||
first_rb,
|
||||
aggregation,
|
||||
nCCE);
|
||||
aggregation);
|
||||
|
||||
// LOG_I(MAC,"exiting ulsch preprocesor\n");
|
||||
|
||||
@@ -714,11 +723,12 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
continue; // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n");
|
||||
}
|
||||
|
||||
if (nCCE_available[CC_id] < (1<<aggregation)) {
|
||||
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]);
|
||||
if (CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti)) {
|
||||
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;
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
@@ -732,9 +742,10 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
//should we continue or set harq_pid to 0?
|
||||
continue;
|
||||
} 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",
|
||||
module_idP,frameP,subframeP,UE_id,CC_id, harq_pid, round,nCCE[CC_id],rnti,mode_string[eNB_UE_stats->mode]);
|
||||
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,rnti,mode_string[eNB_UE_stats->mode]);
|
||||
|
||||
//#undef EXMIMO_IOT
|
||||
#ifndef EXMIMO_IOT
|
||||
|
||||
if (((UE_is_to_be_scheduled(module_idP,CC_id,UE_id)>0)) || (round>0) || ((frameP%10)==0))
|
||||
@@ -1073,9 +1084,6 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
subframeP,
|
||||
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);
|
||||
#ifdef DEBUG
|
||||
dump_dci(frame_parms, &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]);
|
||||
@@ -1088,8 +1096,7 @@ void schedule_ulsch_rnti(module_id_t module_idP,
|
||||
}
|
||||
|
||||
#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,
|
||||
unsigned int *nCCE_available, uint16_t *first_rb)
|
||||
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)
|
||||
{
|
||||
|
||||
eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP];
|
||||
@@ -1148,11 +1155,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
|
||||
// is scheduled, the correspodning group can't be used for CBA
|
||||
// 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;
|
||||
|
||||
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++) {
|
||||
// equal weight
|
||||
//weight[cba_group] = floor(total_UEs/active_groups);//find_num_active_UEs_in_cbagroup(module_idP, cba_group);
|
||||
@@ -1240,13 +1247,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
|
||||
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) {
|
||||
return;
|
||||
}
|
||||
@@ -1264,11 +1264,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++) {
|
||||
|
||||
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,
|
||||
mcs[cba_group], available_rbs,required_rbs[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++) {
|
||||
rb_table_index =0;
|
||||
@@ -1294,10 +1294,10 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
|
||||
|
||||
first_rb[CC_id]+=rb_table[rb_table_index];
|
||||
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],
|
||||
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) {
|
||||
case 6:
|
||||
@@ -1410,8 +1410,6 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,8 +47,8 @@ int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id)
|
||||
|
||||
if (CC_id>0) {
|
||||
LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n");
|
||||
mac_xface->macphy_exit("MAC FATAL CC_id>0");
|
||||
return 0; // not reached
|
||||
//mac_xface->macphy_exit("MAC FATAL CC_id>0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 {
|
||||
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) +
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user