From 75ad3da9d978c9101baf7cec3041308b4f2cb457 Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Thu, 21 Jan 2021 15:51:30 +0100 Subject: [PATCH 001/125] start new gtpu --- cmake_targets/CMakeLists.txt | 43 +- common/utils/msc/msc.h | 2 +- common/utils/ocp_itti/intertask_interface.h | 1 + executables/main-ocp.c | 1 - executables/nr-ru.c | 1 - executables/nr-softmodem.c | 1 - executables/nr-uesoftmodem.c | 1 - executables/ocp-gnb.c | 1 - executables/softmodem-common.c | 2 + executables/softmodem-common.h | 3 + openair1/PHY/TOOLS/time_meas.c | 1 + openair1/PHY/TOOLS/time_meas.h | 2 +- openair1/SIMULATION/NR_PHY/prachsim.c | 1 + openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h | 2 - openair2/LAYER2/RLC/rlc.c | 2 + openair2/LAYER2/RLC/rlc.h | 12 +- openair2/NETWORK_DRIVER/MESH/device.c | 4 + openair2/NETWORK_DRIVER/UE_IP/device.c | 4 + openair2/RRC/LTE/rrc_eNB.c | 1 + openair2/RRC/LTE/rrc_eNB_GTPV1U.c | 18 +- openair2/RRC/LTE/rrc_eNB_S1AP.c | 3 +- openair2/SIMULATION/NR_RRC/itti_sim.c | 1 - openair3/ocp-gtpu/gtp_itf.cpp | 623 +++++++++++++++++++ openair3/ocp-gtpu/gtp_itf.h | 49 ++ targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 2 +- targets/COMMON/create_tasks.c | 1 + targets/COMMON/create_tasks_mbms.c | 1 + targets/RT/USER/lte-softmodem.c | 1 - targets/RT/USER/lte-uesoftmodem.c | 1 - 29 files changed, 734 insertions(+), 51 deletions(-) create mode 100644 openair3/ocp-gtpu/gtp_itf.cpp create mode 100644 openair3/ocp-gtpu/gtp_itf.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 0b9d925017..0e13d14f0b 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -405,6 +405,7 @@ add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace") add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace") add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering") +add_boolean_option(NEW_GTPU False "NEW_GTP") set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti) add_library(ITTI @@ -413,7 +414,6 @@ add_library(ITTI ) add_dependencies(ITTI rrc_flag) set(ITTI_LIB ITTI) - set(GTPU_need_ITTI ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_eNB.c) ################################################## @@ -2217,15 +2217,19 @@ set (GTPV1U_SRC add_library(GTPV1U ${GTPV1U_SRC}) add_dependencies(GTPV1U rrc_flag) -#add_library (GTPV1U_OCP -#${OPENAIR3_DIR}/ocp-gtp/gtp_itf.cpp -#) -#include_directories(${OPENAIR3_DIR}/ocp-gtp) +add_library (GTPV1U_OCP + ${NR_RRC_DIR}/rrc_gNB_GTPV1U.c + ${RRC_DIR}/rrc_eNB_GTPV1U.c +${OPENAIR3_DIR}/ocp-gtpu/gtp_itf.cpp +) +add_dependencies(GTPV1U_OCP rrc_flag) +include_directories(${OPENAIR3_DIR}/ocp-gtp) #NR case set (NR_GTPV1U_SRC ${NR_RRC_DIR}/rrc_gNB_GTPV1U.c ${RRC_DIR}/rrc_eNB_GTPV1U.c + ${GTPV1U_DIR}/gtpv1u_eNB.c ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTrxn.c ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uMsg.c @@ -2235,6 +2239,12 @@ set (NR_GTPV1U_SRC add_library(NR_GTPV1U ${NR_GTPV1U_SRC}) add_dependencies(NR_GTPV1U rrc_flag) +if (${NEW_GTPU}) +set(GTPV1U GTPV1U_OCP) +else() +set(GTPV1U NR_GTPV1U) +endif() + set (MME_APP_SRC ${OPENAIR3_DIR}/MME_APP/mme_app.c ${OPENAIR3_DIR}/MME_APP/mme_config.c @@ -2864,7 +2874,6 @@ add_executable(lte-softmodem ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c ${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/system.c - ${GTPU_need_ITTI} ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} ${CONFIG_SOURCES} @@ -2874,7 +2883,7 @@ add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer) target_link_libraries (lte-softmodem -Wl,--start-group - RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB + RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} -Wl,--end-group z dl) @@ -2905,7 +2914,6 @@ add_executable(ocp-enb ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c ${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/system.c - ${GTPU_need_ITTI} ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} ${CONFIG_SOURCES} @@ -2915,7 +2923,7 @@ add_dependencies(ocp-enb rrc_flag s1ap_flag x2_flag oai_iqplayer coding params_l target_link_libraries (ocp-enb -Wl,--start-group - RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB + RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} -Wl,--end-group z dl) @@ -2985,7 +2993,7 @@ endif() target_link_libraries (lte-uesoftmodem -Wl,--start-group RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB - GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON + ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES} -Wl,--end-group z dl) @@ -3018,7 +3026,6 @@ add_executable(nr-softmodem ${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${GTPU_need_ITTI} ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} ${CONFIG_SOURCES} @@ -3027,7 +3034,7 @@ add_executable(nr-softmodem target_link_libraries (nr-softmodem -Wl,--start-group - UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA + UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS ${GTPV1U} SECU_CN SECU_OSA ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB} @@ -3057,7 +3064,6 @@ add_executable(ocp-gnb ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/system.c - ${GTPU_need_ITTI} ${XFORMS_SOURCE_NR} ${T_SOURCE} ${CONFIG_SOURCES} @@ -3067,7 +3073,7 @@ add_executable(ocp-gnb target_link_libraries (ocp-gnb -Wl,--start-group - UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA + UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS ${GTPV1U} SECU_CN SECU_OSA ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON @@ -3371,7 +3377,7 @@ add_executable(test_epc_generate_scenario ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP 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} ${CONFIG_LIB} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP ${GTPV1U} LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP 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} ${CONFIG_LIB} ) add_executable(test_epc_play_scenario @@ -3390,7 +3396,7 @@ add_executable(test_epc_play_scenario ) 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 X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP ${GTPV1U} LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ) @@ -3436,7 +3442,7 @@ if (${T_TRACER}) NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_NR MAC_UE_NR NGAP_GNB - CN_UTILS GTPV1U NR_GTPV1U SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB + CN_UTILS ${GTPV1U} SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB ldpc_orig ldpc_optim ldpc_optim8seg ldpc PROTO_AGENT dfts) if (TARGET ${i}) add_dependencies(${i} generate_T) @@ -3534,7 +3540,6 @@ add_executable(nr-ittisim ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c - ${GTPU_need_ITTI} ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} ${CONFIG_SOURCES} @@ -3543,7 +3548,7 @@ add_executable(nr-ittisim target_link_libraries (nr-ittisim -Wl,--start-group - UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA + UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS ${GTPV1U} SECU_CN SECU_OSA ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB} diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h index b218d58e3d..68b05ffce3 100644 --- a/common/utils/msc/msc.h +++ b/common/utils/msc/msc.h @@ -115,7 +115,7 @@ void msc_log_message( #define MESSAGE_CHART_GENERATOR msc_interface.msc_loaded -msc_interface_t msc_interface; +extern msc_interface_t msc_interface; #define MSC_INIT(arg1,arg2) if(msc_interface.msc_loaded) msc_interface.msc_init(arg1,arg2) #define MSC_START_USE if(msc_interface.msc_loaded) msc_interface.msc_start_use #define MSC_END if(msc_interface.msc_loaded) msc_interface.msc_end diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h index a40660eb9e..140340bacd 100644 --- a/common/utils/ocp_itti/intertask_interface.h +++ b/common/utils/ocp_itti/intertask_interface.h @@ -341,6 +341,7 @@ void * rrc_enb_process_msg(void*); TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \ TASK_DEF(TASK_MSC, TASK_PRIORITY_MED, 200, NULL, NULL)\ TASK_DEF(TASK_GTPV1_U, TASK_PRIORITY_MED, 1000,NULL, NULL)\ + TASK_DEF(OCP_GTPV1_U, TASK_PRIORITY_MED, 1000,NULL, NULL)\ TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)\ TASK_DEF(TASK_CU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \ TASK_DEF(TASK_DU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \ diff --git a/executables/main-ocp.c b/executables/main-ocp.c index 6e5857d6d1..e6ce40e808 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -78,7 +78,6 @@ int otg_enabled; uint64_t downlink_frequency[MAX_NUM_CCs][4]; int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; int split73; -int usrp_tx_thread = 0; char * split73_config; int split73; AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]= {0}; diff --git a/executables/nr-ru.c b/executables/nr-ru.c index feff0c29c2..3a90edbf20 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -118,7 +118,6 @@ uint16_t sl_ahead; extern int emulate_rf; extern int numerology; -extern int usrp_tx_thread; /*************************************************************/ /* Functions to attach and configure RRU */ diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index fb757a9f47..a46e65624a 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -181,7 +181,6 @@ extern void *udp_eNB_task(void *args_p); int transmission_mode=1; int emulate_rf = 0; int numerology = 0; -int usrp_tx_thread = 0; static char *parallel_config = NULL; diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 1d3288862d..052fb561a0 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -155,7 +155,6 @@ int card_offset = 0; uint64_t num_missed_slots = 0; // counter for the number of missed slots int transmission_mode = 1; int numerology = 0; -int usrp_tx_thread = 0; int oaisim_flag = 0; int emulate_rf = 0; diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c index 67f68f43e3..db416d1487 100644 --- a/executables/ocp-gnb.c +++ b/executables/ocp-gnb.c @@ -70,7 +70,6 @@ uint32_t timing_advance = 0; int transmission_mode=1; int emulate_rf = 0; int numerology = 0; -int usrp_tx_thread = 0; int config_sync_var=-1; diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c index 04a58413b5..b88fe29956 100644 --- a/executables/softmodem-common.c +++ b/executables/softmodem-common.c @@ -43,6 +43,8 @@ static softmodem_params_t softmodem_params; char *parallel_config=NULL; char *worker_config=NULL; +msc_interface_t msc_interface; +int usrp_tx_thread = 0; static mapping softmodem_funcs[] = MAPPING_SOFTMODEM_FUNCTIONS; diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index f8e9b0959f..51f14f218c 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -90,6 +90,7 @@ extern "C" #define CONFIG_HLP_RFSIM "Run in rf simulator mode (also known as basic simulator)\n" #define CONFIG_HLP_NOKRNMOD "(noS1 only): Use tun instead of namesh module \n" #define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n" +#define CONFIG_HLP_USRP_THREAD "having extra thead for usrp tx\n" /*-----------------------------------------------------------------------------------------------------------------------------------------------------*/ /* command line parameters common to eNodeB and UE */ @@ -113,6 +114,7 @@ extern "C" #define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat"; +extern int usrp_tx_thread; #define CMDLINE_PARAMS_DESC { \ {"rf-config-file", CONFIG_HLP_RFCFGF, 0, strptr:(char **)&RF_CONFIG_FILE, defstrval:NULL, TYPE_STRING, sizeof(RF_CONFIG_FILE)},\ {"split73", CONFIG_HLP_SPLIT73, 0, strptr:(char **)&SPLIT73, defstrval:NULL, TYPE_STRING, sizeof(SPLIT73)},\ @@ -139,6 +141,7 @@ extern "C" {"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \ {"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \ {"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \ + {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \ } diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c index cfa3b93007..37cb93e96b 100644 --- a/openair1/PHY/TOOLS/time_meas.c +++ b/openair1/PHY/TOOLS/time_meas.c @@ -26,6 +26,7 @@ // global var for openair performance profiler int opp_enabled = 0; +double cpu_freq_GHz __attribute__ ((aligned(32))); double get_cpu_freq_GHz(void) { diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index 2deab40f27..e2ceef8405 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -33,7 +33,7 @@ #include // global var to enable openair performance profiler extern int opp_enabled; -double cpu_freq_GHz __attribute__ ((aligned(32)));; +extern double cpu_freq_GHz __attribute__ ((aligned(32)));; #if defined(__x86_64__) || defined(__i386__) typedef struct { diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index 1f4db3138a..324a70fb37 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -68,6 +68,7 @@ int sl_ahead = 0; //void dump_nr_prach_config(NR_DL_FRAME_PARMS *frame_parms,uint8_t subframe); /* temporary dummy implem of get_softmodem_optmask, till basic simulators implemented as device */ +msc_interface_t msc_interface; uint64_t get_softmodem_optmask(void) {return 0;} softmodem_params_t *get_softmodem_params(void) {return 0;} diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h index 6da464aa28..bfde1b31f3 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h @@ -21,8 +21,6 @@ # ifndef __RLC_UM_TEST_H__ # define __RLC_UM_TEST_H__ -rlc_um_entity_t um_tx; -rlc_um_entity_t um_rx; void rlc_um_v9_3_0_test_windows_5(void); void rlc_um_v9_3_0_test_windows_10(void); diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index 98c8c3e252..84a9cb57bd 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -52,6 +52,8 @@ extern boolean_t pdcp_data_ind( //#define TRACE_RLC_PAYLOAD 1 #define DEBUG_RLC_DATA_REQ 1 +logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ +logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ //----------------------------------------------------------------------------- void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char *dataP, const signed long sizeP) //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h index 7e4920a579..3a37723f53 100644 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -133,13 +133,13 @@ typedef struct { #define RLC_MAX_MBMS_LC (LTE_maxSessionPerPMCH * LTE_maxServiceCount) #define RLC_MAX_LC ((max_val_LTE_DRB_Identity+1)* MAX_MOBILES_PER_ENB) -void (*rlc_rrc_data_ind)( +extern void (*rlc_rrc_data_ind)( const protocol_ctxt_t *const ctxtP, const rb_id_t rb_idP, const sdu_size_t sdu_sizeP, const uint8_t *const sduP) __attribute__ ((aligned(32))); -void (*rlc_rrc_data_conf)( +extern void (*rlc_rrc_data_conf)( const protocol_ctxt_t *const ctxtP, const rb_id_t rb_idP, const mui_t muiP, @@ -184,8 +184,8 @@ typedef struct rlc_mbms_id_s { //rlc_mbms_t rlc_mbms_array_ue[MAX_MOBILES_PER_ENB][maxServiceCount][maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h //rlc_mbms_t rlc_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h -rlc_mbms_id_t rlc_mbms_lcid2service_session_id_ue[MAX_MOBILES_PER_ENB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h -rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h +extern rlc_mbms_id_t rlc_mbms_lcid2service_session_id_ue[MAX_MOBILES_PER_ENB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h +extern rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h #define rlc_mbms_enb_get_lcid_by_rb_id(Enb_mOD,rB_iD) rlc_mbms_rbid2lcid_eNB[Enb_mOD][rB_iD] ; @@ -201,8 +201,6 @@ rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_ rlc_mbms_rbid2lcid_ue[uE_mOD][rB_iD] = lOG_cH_iD; \ } while (0); -logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ -logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ #define RLC_COLL_KEY_VALUE(eNB_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \ @@ -250,7 +248,7 @@ logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; (((hash_key_t)(sESSION_ID)) << 37) | \ (((hash_key_t)(0x0000000000000001)) << 63)) -hash_table_t *rlc_coll_p __attribute__ ((aligned(32))); +extern hash_table_t *rlc_coll_p __attribute__ ((aligned(32))); /*! \fn tbs_size_t mac_rlc_serialize_tb (char* bufferP, list_t transport_blocksP) * \brief Serialize a list of transport blocks coming from RLC in order to be processed by MAC. diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c index 5690b9b153..181899cd6e 100644 --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -297,7 +297,11 @@ int nas_change_mtu(struct net_device *dev, int mtu) } //--------------------------------------------------------------------------- +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,7,0) void nas_tx_timeout(struct net_device *dev) +#else +void nas_tx_timeout(struct net_device *dev, unsigned int x) +#endif { //--------------------------------------------------------------------------- // Transmitter timeout, serious problems. diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c index 32f9442747..e3c0f92ec7 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -302,7 +302,11 @@ void ue_ip_change_rx_flags(struct net_device *dev_pP, int flagsP) { } //--------------------------------------------------------------------------- +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,7,0) void ue_ip_tx_timeout(struct net_device *dev_pP) { +#else +void ue_ip_tx_timeout(struct net_device *dev_pP, unsigned int x) { +#endif //--------------------------------------------------------------------------- // Transmitter timeout, serious problems. ue_ip_priv_t *priv_p = netdev_priv(dev_pP); diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index 18b7173a08..2564983d47 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -87,6 +87,7 @@ #include "pdcp.h" #include "gtpv1u_eNB_task.h" +#include #include "intertask_interface.h" diff --git a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c index 5c25d2dbcf..6111bec6a5 100644 --- a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c +++ b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c @@ -40,6 +40,7 @@ # include "common/ran_context.h" +#include extern RAN_CONTEXT_t RC; @@ -181,21 +182,16 @@ void rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ( LOG_W(RRC, "[eNB] In %s: invalid UE\n", __func__); return; } + gtpv1u_enb_delete_tunnel_req_t tmp={0}; - MSC_LOG_TX_MESSAGE(MSC_RRC_ENB, MSC_GTPU_ENB, NULL, 0, - "0 GTPV1U_ENB_DELETE_TUNNEL_REQ rnti %x ", - ue_context_pP->ue_context.eNB_ue_s1ap_id); - - MessageDef *msg = itti_alloc_new_message(TASK_RRC_ENB, GTPV1U_ENB_DELETE_TUNNEL_REQ); - memset(>PV1U_ENB_DELETE_TUNNEL_REQ(msg), 0, sizeof(GTPV1U_ENB_DELETE_TUNNEL_REQ(msg))); - GTPV1U_ENB_DELETE_TUNNEL_REQ(msg).rnti = ue_context_pP->ue_context.rnti; - GTPV1U_ENB_DELETE_TUNNEL_REQ(msg).from_gnb = 0; - GTPV1U_ENB_DELETE_TUNNEL_REQ(msg).num_erab = ue_context_pP->ue_context.nb_of_e_rabs; + tmp.rnti = ue_context_pP->ue_context.rnti; + tmp.from_gnb = 0; + tmp.num_erab = ue_context_pP->ue_context.nb_of_e_rabs; for (int e_rab = 0; e_rab < ue_context_pP->ue_context.nb_of_e_rabs; e_rab++) { const rb_id_t gtp_ebi = ue_context_pP->ue_context.enb_gtp_ebi[e_rab]; - GTPV1U_ENB_DELETE_TUNNEL_REQ(msg).eps_bearer_id[e_rab] = gtp_ebi; + tmp.eps_bearer_id[e_rab] = gtp_ebi; } - itti_send_msg_to_task(TASK_GTPV1_U, ENB_MODULE_ID_TO_INSTANCE(enb_mod_idP), msg); + gtpv1u_delete_s1u_tunnel(enb_mod_idP,&tmp); } diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c index 4be9a50b32..9edfa50f12 100644 --- a/openair2/RRC/LTE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c @@ -48,11 +48,12 @@ #include "pdcp_primitives.h" #include "UTIL/OSA/osa_defs.h" -#include "msc.h" +#include #include "LTE_UERadioAccessCapabilityInformation.h" #include "gtpv1u_eNB_task.h" +#include #include "RRC/LTE/rrc_eNB_GTPV1U.h" #include "TLVDecoder.h" diff --git a/openair2/SIMULATION/NR_RRC/itti_sim.c b/openair2/SIMULATION/NR_RRC/itti_sim.c index d9352f2d0a..86779e0ad9 100644 --- a/openair2/SIMULATION/NR_RRC/itti_sim.c +++ b/openair2/SIMULATION/NR_RRC/itti_sim.c @@ -148,7 +148,6 @@ extern void *udp_eNB_task(void *args_p); int transmission_mode=1; int emulate_rf = 0; int numerology = 0; -int usrp_tx_thread = 0; double cpuf; diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp new file mode 100644 index 0000000000..5a5717c726 --- /dev/null +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -0,0 +1,623 @@ +#include +#include +#include +#include +#include + +#include +#include +#include "common/utils/LOG/log.h" +#include +#include +#include +//#include +#include +using namespace std; + +#pragma pack(1) + +typedef struct Gtpv1uMsgHeader { + uint8_t PN:1; + uint8_t S:1; + uint8_t E:1; + uint8_t spare:1; + uint8_t PT:1; + uint8_t version:3; + uint8_t msgType; + uint16_t msgLength; + uint32_t teid; +} __attribute__((packed)) Gtpv1uMsgHeaderT; + +#pragma pack() + + // TS 29.060, table 7.1 defines the possible message types + // here are all the possible messages (3GPP R16) +#define GTP_ECHO_REQ (1) +#define GTP_ECHO_RSP (2) +#define GTP_ERROR_INDICATION (26) +#define GTP_SUPPORTED_EXTENSION_HEADER_INDICATION (31) +#define GTP_END_MARKER (254) +#define GTP_GPDU (255) + + +typedef struct ocp_gtpv1u_bearer_s { + /* TEID used in dl and ul */ + teid_t teid_incoming; ///< eNB TEID + teid_t teid_outgoing; ///< Remote TEID + in_addr_t outgoing_ip_addr; + struct in6_addr outgoing_ip6_addr; + tcp_udp_port_t outgoing_port; + uint16_t seqNum; + uint8_t npduNum; +} ocp_gtpv1u_bearer_t; + +typedef struct { + map bearers; +} teidData_t; + +typedef struct { + rnti_t rnti; +} rntiData_t; + +class gtpEndPoint { + public: + openAddr_t addr; + map ue2te_mapping; + map te2ue_mapping; +}; + +class gtpEndPoints { + public: + pthread_mutex_t gtp_lock=PTHREAD_MUTEX_INITIALIZER; + // the instance id will be the Linux socket handler, as this is uniq + map instances; +}; + +gtpEndPoints globGtp; + +#ifdef __cplusplus +extern "C" { +#endif + +static uint32_t gtpv1uNewTeid(void) { +#ifdef GTPV1U_LINEAR_TEID_ALLOCATION + g_gtpv1u_teid = g_gtpv1u_teid + 1; + return g_gtpv1u_teid; +#else + return random() + random() % (RAND_MAX - 1) + 1; +#endif +} + + +#define GTPV1U_HEADER_SIZE (8) +static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, uint32_t teid, uint8_t *Msg,int msgLen, + bool seqNumFlag, bool npduNumFlag, bool extHdrFlag, int seqNum, int npduNum, int extHdrType) { + AssertFatal(extHdrFlag==false,"Not developped"); + int headerAdditional=0; + + if ( seqNumFlag || npduNumFlag || extHdrFlag) + headerAdditional=4; + + uint8_t *buffer; + int fullSize=GTPV1U_HEADER_SIZE+headerAdditional+msgLen; + AssertFatal((buffer=(uint8_t *) malloc(fullSize)) != NULL, ""); + Gtpv1uMsgHeaderT *msgHdr = (Gtpv1uMsgHeaderT *)buffer ; + msgHdr->PN=npduNumFlag; + msgHdr->S=seqNumFlag; + msgHdr->E=extHdrFlag; + msgHdr->spare=0; + msgHdr->PT=1; + msgHdr->version=1; + msgHdr->msgType=GTP_GPDU; + msgHdr->msgLength=htons(msgLen); + msgHdr->teid=htonl(teid); + + if(seqNumFlag || extHdrFlag || npduNumFlag) { + *((uint16_t *) (buffer+8)) = seqNumFlag ? htons(seqNum) : 0x0000; + *((uint8_t *) (buffer+10)) = npduNumFlag ? htons(npduNum) : 0x00; + *((uint8_t *) (buffer+11)) = extHdrFlag ? htons(extHdrType) : 0x00; + } + + memcpy(buffer+GTPV1U_HEADER_SIZE+headerAdditional, Msg, msgLen); + static struct sockaddr_in to= {0}; + to.sin_family = AF_INET; + to.sin_port = htons(peerPort); + to.sin_addr.s_addr = peerIp ; + LOG_D(GTPU,"sending packet size: %d to %s\n",fullSize, inet_ntoa(to.sin_addr) ); + + if (sendto(h, (void *)buffer, (size_t)fullSize, 0,(struct sockaddr *)&to, sizeof(to) ) != fullSize ) { + LOG_E(GTPU, + "[SD %d] Failed to send data to " IPV4_ADDR " on port %d, buffer size %u\n", + h, IPV4_ADDR_FORMAT(peerIp), peerPort, fullSize); + free(buffer); + return GTPNOK; + } + + free(buffer); + return !GTPNOK; +} + +static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) { + uint8_t *buffer=req->buffer+req->offset; + size_t length=req->length; + uint64_t rnti=req->rnti; + int rab_id=req->rab_id; + pthread_mutex_lock(&globGtp.gtp_lock); + auto inst=&globGtp.instances[instance]; + auto ptrRnti=inst->ue2te_mapping.find(rnti); + + if ( ptrRnti==inst->ue2te_mapping.end() ) { + LOG_E(GTPU, "Gtpv1uProcessUlpReq failed: while getting ue rnti %lx in hashtable ue_mapping\n", rnti); + pthread_mutex_unlock(&globGtp.gtp_lock); + return; + } + + auto ptr=ptrRnti->second.bearers; + + if ( ptr.find(rab_id) == ptr.end() ) { + LOG_E(GTPU,"sending a packet to a non existant RNTI:RAB: %lx/%x\n", rnti, rab_id); + pthread_mutex_unlock(&globGtp.gtp_lock); + return; + } else + LOG_D(GTPU,"sending a packet to RNTI:RAB:teid %lx/%x/%x, len %lu, oldseq %d, oldnum %d\n", + rnti, rab_id,ptr[rab_id].teid_outgoing,length, ptr[rab_id].seqNum,ptr[rab_id].npduNum ); + + if(seqNumFlag) + ptr[rab_id].seqNum++; + + if(npduNumFlag) + ptr[rab_id].npduNum++; + + pthread_mutex_unlock(&globGtp.gtp_lock); + gtpv1uCreateAndSendMsg(instance, + ptr[rab_id].outgoing_ip_addr, + ptr[rab_id].outgoing_port, + ptr[rab_id].teid_outgoing, + buffer, length, false, false, false, ptr[rab_id].seqNum, ptr[rab_id].npduNum, 0) ; +} + +static int udpServerSocket(openAddr_s addr) { + LOG_I(GTPU, "Initializing UDP for local address %s with port %s\n", addr.originHost, addr.originService); + int status; + struct addrinfo hints= {0}, *servinfo, *p; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_PASSIVE; + + if ((status = getaddrinfo(addr.originHost, addr.originService, &hints, &servinfo)) != 0) { + LOG_E(GTPU,"getaddrinfo error: %s\n", gai_strerror(status)); + return -1; + } + + int sockfd=-1; + + // loop through all the results and bind to the first we can + for(p = servinfo; p != NULL; p = p->ai_next) { + if ((sockfd = socket(p->ai_family, p->ai_socktype, + p->ai_protocol)) == -1) { + LOG_W(GTPU,"socket: %s\n", strerror(errno)); + continue; + } + + if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { + close(sockfd); + LOG_W(GTPU,"bind: %s\n", strerror(errno)); + continue; + } + + break; // if we get here, we must have connected successfully + } + + if (p == NULL) { + // looped off the end of the list with no successful bind + LOG_E(GTPU,"failed to bind socket: %s %s \n", addr.originHost, addr.originService); + return -1; + } + + freeaddrinfo(servinfo); // all done with this structure + int sendbuff = 1000*1000*10; + AssertFatal(0==setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff)),""); + LOG_D(GTPU,"Created listener for paquets to: %s:%s, send buffer size: %d\n", addr.originHost, addr.originService,sendbuff); + return sockfd; +} + +instance_t ocp_gtpv1Init(openAddr_t context) { + pthread_mutex_lock(&globGtp.gtp_lock); + int id=udpServerSocket(context); + + if (id>=0) { + globGtp.instances[id].addr=context; + itti_subscribe_event_fd(OCP_GTPV1_U, id); + } else + LOG_E(GTPU,"can't create GTP-U instance\n"); + + pthread_mutex_unlock(&globGtp.gtp_lock); + + return id; +} + +int ocp_gtpv1u_create_s1u_tunnel(instance_t instance, + const gtpv1u_enb_create_tunnel_req_t *create_tunnel_req, + gtpv1u_enb_create_tunnel_resp_t *create_tunnel_resp) { + LOG_D(GTPU, "Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %d\n", + create_tunnel_req->rnti, + create_tunnel_req->num_tunnels, + create_tunnel_req->sgw_S1u_teid[0]); + pthread_mutex_lock(&globGtp.gtp_lock); + auto inst=&globGtp.instances[instance]; + auto it=inst->ue2te_mapping.find(create_tunnel_req->rnti); + + if ( it != inst->ue2te_mapping.end() ) { + LOG_W(GTPU,"Create a config for a already existing GTP tunnel (rnti %x)\n", create_tunnel_req->rnti); + inst->ue2te_mapping.erase(it); + } + + rntiData_t rntiData= {create_tunnel_req->rnti}; + + for (int i = 0; i < create_tunnel_req->num_tunnels; i++) { + ocp_gtpv1u_bearer_t gtpv1u_ue_data; + uint32_t s1u_teid=gtpv1uNewTeid(); + + while ( inst->te2ue_mapping.find(s1u_teid) != inst->te2ue_mapping.end() ) { + LOG_W(GTPU, "generated a random Teid that exists, re-generating (%u)\n",s1u_teid); + s1u_teid=gtpv1uNewTeid(); + }; + + inst->te2ue_mapping[s1u_teid]=rntiData; + + int addrs_length_in_bytes = create_tunnel_req->sgw_addr[i].length / 8; + + switch (addrs_length_in_bytes) { + case 4: + memcpy(>pv1u_ue_data.outgoing_ip_addr,create_tunnel_req->sgw_addr[i].buffer,4); + break; + + case 16: + memcpy(>pv1u_ue_data.outgoing_ip6_addr.s6_addr, + create_tunnel_req->sgw_addr[i].buffer, + 16); + break; + + case 20: + memcpy(>pv1u_ue_data.outgoing_ip_addr,create_tunnel_req->sgw_addr[i].buffer,4); + memcpy(>pv1u_ue_data.outgoing_ip6_addr.s6_addr, + create_tunnel_req->sgw_addr[i].buffer+4, + 16); + + default: + AssertFatal(false, "SGW Address size impossible"); + } + + gtpv1u_ue_data.teid_incoming = s1u_teid; + gtpv1u_ue_data.outgoing_port=2152; + gtpv1u_ue_data.teid_outgoing= create_tunnel_req->sgw_S1u_teid[i]; + inst->ue2te_mapping[create_tunnel_req->rnti].bearers[create_tunnel_req->eps_bearer_id[i]]=gtpv1u_ue_data; + LOG_D(GTPU, "Created tunnel %x for RNTI %x, SGW: " IPV4_ADDR ":%d\n", + s1u_teid, create_tunnel_req->rnti, + IPV4_ADDR_FORMAT(inst->ue2te_mapping[create_tunnel_req->rnti].bearers[create_tunnel_req->eps_bearer_id[i]].outgoing_ip_addr), + inst->ue2te_mapping[create_tunnel_req->rnti].bearers[create_tunnel_req->eps_bearer_id[i]].outgoing_port ); + create_tunnel_resp->status=0; + create_tunnel_resp->rnti=create_tunnel_req->rnti; + create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels; + create_tunnel_resp->enb_S1u_teid[i]=gtpv1u_ue_data.teid_incoming; + create_tunnel_resp->eps_bearer_id[i] = create_tunnel_req->eps_bearer_id[i]; + //TBD: fix me this is quite bad, for IPv4 only and + // Overcomplex stuff to fill InitialContextSetupResponse in S1AP + int status; + struct addrinfo hints= {0}, *servinfo, *p; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_PASSIVE; + openAddr_t *addr=&globGtp.instances[instance].addr; + + if ((status = getaddrinfo(addr->originHost, addr->originService, &hints, &servinfo)) != 0) { + LOG_E(GTPU,"getaddrinfo error: %s\n", gai_strerror(status)); + pthread_mutex_unlock(&globGtp.gtp_lock); + return -1; + } + + // TBD: we take the first IPv4 addr, but it should be coded in the right way + for(p = servinfo; p != NULL; p = p->ai_next) + if (p->ai_family == AF_INET) { + struct sockaddr_in *ipv4P=(struct sockaddr_in *)p->ai_addr; + memcpy(create_tunnel_resp->enb_addr.buffer, + &ipv4P->sin_addr.s_addr, sizeof(ipv4P->sin_addr.s_addr)); + create_tunnel_resp->enb_addr.length = sizeof(ipv4P->sin_addr.s_addr); + break; + } + + if ( p == NULL ) + LOG_E(GTPU,"can't translate IP address string: %s\n",addr->originHost); + + freeaddrinfo(servinfo); // all done with this structure + } + + pthread_mutex_unlock(&globGtp.gtp_lock); + return !GTPNOK; +} + +int ocp_gtpv1u_update_s1u_tunnel( + const instance_t instance, + const gtpv1u_enb_create_tunnel_req_t *const create_tunnel_req, + const rnti_t prior_rnti +) { + LOG_D(GTPU, "Start update tunnels for old RNTI %x, new RNTI %x, num_tunnels %d, sgw_S1u_teid %d, eps_bearer_id %d\n", + prior_rnti, + create_tunnel_req->rnti, + create_tunnel_req->num_tunnels, + create_tunnel_req->sgw_S1u_teid[0], + create_tunnel_req->eps_bearer_id[0]); + pthread_mutex_lock(&globGtp.gtp_lock); + auto inst=&globGtp.instances[instance]; + + if ( inst->ue2te_mapping.find(create_tunnel_req->rnti) != inst->ue2te_mapping.end() ) { + LOG_E(GTPU,"Update a existing GTP tunnel to a already existing tunnel (new rnti %x, old rnti %x)\n", create_tunnel_req->rnti, prior_rnti); + } + + auto it=inst->ue2te_mapping.find(prior_rnti); + + if ( it != inst->ue2te_mapping.end() ) { + LOG_W(GTPU,"Update a not existing tunnel, start create the new one (new rnti %x, old rnti %x)\n", create_tunnel_req->rnti, prior_rnti); + gtpv1u_enb_create_tunnel_resp_t tmp; + (void)ocp_gtpv1u_create_s1u_tunnel(instance, create_tunnel_req, &tmp); + pthread_mutex_unlock(&globGtp.gtp_lock); + return 0; + } + + inst->ue2te_mapping[create_tunnel_req->rnti]=it->second; + inst->ue2te_mapping.erase(it); + pthread_mutex_unlock(&globGtp.gtp_lock); + return 0; +} + +int ocp_gtpv1u_create_x2u_tunnel( + const instance_t instanceP, + const gtpv1u_enb_create_x2u_tunnel_req_t * const create_tunnel_req_pP, + gtpv1u_enb_create_x2u_tunnel_resp_t * const create_tunnel_resp_pP){ + AssertFatal( false, "to be developped\n"); +} + +int ocp_gtpv1u_delete_s1u_tunnel( const instance_t instance, + const gtpv1u_enb_delete_tunnel_req_t *const req_pP) { + LOG_D(GTPU, "Start delete tunnels for RNTI %x, num_erab %d, eps_bearer_id %d \n", + req_pP->rnti, + req_pP->num_erab, + req_pP->eps_bearer_id[0]); + pthread_mutex_lock(&globGtp.gtp_lock); + auto inst=&globGtp.instances[instance]; + auto it=inst->ue2te_mapping.find(req_pP->rnti); + + if ( it == inst->ue2te_mapping.end() ) { + LOG_W(GTPU,"Delete a non existing GTP tunnel\n"); + pthread_mutex_unlock(&globGtp.gtp_lock); + return -1; + } + + for (auto j=it->second.bearers.begin(); + j!=it->second.bearers.end(); + ++j) + inst->te2ue_mapping.erase(j->second.teid_incoming); + + inst->ue2te_mapping.erase(it); + pthread_mutex_unlock(&globGtp.gtp_lock); + return !GTPNOK; +} + +static int Gtpv1uHandleEchoReq(int h, + uint8_t *msgBuf, + uint32_t msgBufLen, + uint16_t peerPort, + uint32_t peerIp) { + LOG_E(GTPU,"to be dev\n"); + int rc = GTPNOK; + return rc; +} + +static int Gtpv1uHandleError(int h, + uint8_t *msgBuf, + uint32_t msgBufLen, + uint16_t peerPort, + uint32_t peerIp) { + LOG_E(GTPU,"to be dev\n"); + int rc = GTPNOK; + return rc; +} + +static int Gtpv1uHandleSupportedExt(int h, + uint8_t *msgBuf, + uint32_t msgBufLen, + uint16_t peerPort, + uint32_t peerIp) { + LOG_E(GTPU,"to be dev\n"); + int rc = GTPNOK; + return rc; +} + + static int Gtpv1uHandleEndMarker(int h, + uint8_t *msgBuf, + uint32_t msgBufLen, + uint16_t peerPort, + uint32_t peerIp) { + LOG_E(GTPU,"to be dev\n"); + int rc = GTPNOK; + return rc; +} +static int Gtpv1uHandleGpdu(int h, + uint8_t *msgBuf, + uint32_t msgBufLen, + uint16_t peerPort, + uint32_t peerIp) { + Gtpv1uMsgHeaderT *msgHdr = (Gtpv1uMsgHeaderT *) msgBuf; + + if ( msgHdr->version != 1 || msgHdr->PT != 1 ) { + LOG_E(GTPU, "Received a packet that is not GTP header\n"); + return GTPNOK; + } + + pthread_mutex_lock(&globGtp.gtp_lock); + // the socket Linux file handler is the instance id + auto inst=&globGtp.instances[h]; + auto tunnel=inst->te2ue_mapping.find(ntohl(msgHdr->teid)); + + if ( tunnel == inst->te2ue_mapping.end() ) { + LOG_E(GTPU,"Received a incoming packet on non open teid (%d)\n", msgHdr->teid); + pthread_mutex_unlock(&globGtp.gtp_lock); + return GTPNOK; + } + + int offset=8; + if( msgHdr->E || msgHdr->S ||msgHdr->PN) + offset+=4; + /* + gtpv1u_enb_tunnel_data_ind_t tmp; + protocol_ctxt_t ctxt; + ctxt.module_id = 0; + ctxt.enb_flag = 1; + ctxt.instance = 0; + ctxt.frame = 0; + ctxt.subframe = 0; + ctxt.eNB_index = 0; + ctxt.configured = 1; + ctxt.brOption = 0; + result = pdcp_data_req(&ctxt, + SRB_FLAG_YES, + RRC_DCCH_DATA_REQ(msg_p).rb_id, + RRC_DCCH_DATA_REQ(msg_p).muip, + RRC_DCCH_DATA_REQ(msg_p).confirmp, + RRC_DCCH_DATA_REQ(msg_p).sdu_size, + RRC_DCCH_DATA_REQ(msg_p).sdu_p, + RRC_DCCH_DATA_REQ(msg_p).mode, + NULL, NULL); + + + ctxt.rnti = rnti; + pdcp_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, + RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, + PDCP_TRANSMISSION_MODE_DATA, NULL, NULL); + + MessageDef *msg_p=itti_alloc_new_message_sized(OCP_GTPV1_U,GTPV1U_ENB_TUNNEL_DATA_IND, + sizeof(MessageDef) + msgBufLen); + GTPV1U_ENB_TUNNEL_DATA_IND(msg_p).buffer=(uint8_t *)(msg_p+1); + memcpy(GTPV1U_ENB_TUNNEL_DATA_IND(msg_p).buffer,msgBuf,msgBufLen); + GTPV1U_ENB_TUNNEL_DATA_IND(msg_p).length=msgBufLen; + GTPV1U_ENB_TUNNEL_DATA_IND(msg_p).offset=offset; + pthread_mutex_unlock(&globGtp.gtp_lock); + inst->addr.dlCallBack(msg_p); + */ + // could be a full itti msg, make it in the call back if you need + //itti_send_msg_to_task(TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(0), msg_p); + LOG_D(GTPU,"Received a %d bytes packet for: teid:%x\n", + msgBufLen-offset, + ntohl(msgHdr->teid)); + return !GTPNOK; +} + +void gtpv1uReceiver(int h) { + uint8_t udpData[65536]; + int udpDataLen; + socklen_t from_len; + struct sockaddr_in addr; + from_len = (socklen_t)sizeof(struct sockaddr_in); + + if ((udpDataLen = recvfrom(h, udpData, sizeof(udpData), 0, + (struct sockaddr *)&addr, &from_len)) < 0) { + LOG_E(GTPU, "Recvfrom failed %s\n", strerror(errno)); + return; + } else if (udpDataLen == 0) { + LOG_W(GTPU, "Recvfrom returned 0\n"); + return; + } else { + uint8_t msgType = *((uint8_t *)(udpData + 1)); + LOG_D(GTPU, "Received GTP data, msg type: %x\n", msgType); + + switch(msgType) { + case GTP_ECHO_RSP: + break; + + case GTP_ECHO_REQ: + Gtpv1uHandleEchoReq( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); + break; + + case GTP_ERROR_INDICATION: + Gtpv1uHandleError( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); + break; + + case GTP_SUPPORTED_EXTENSION_HEADER_INDICATION: + Gtpv1uHandleSupportedExt( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); + break; + + case GTP_END_MARKER: + Gtpv1uHandleEndMarker( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); + break; + + case GTP_GPDU: + Gtpv1uHandleGpdu( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); + break; + + default: + LOG_E(GTPU, "Received a GTP packet of unknown type: %d\n",msgType); + break; + } + } +} + +void *ocp_gtpv1uTask(void *args) { + while(1) { + /* Trying to fetch a message from the message queue. + If the queue is empty, this function will block till a + message is sent to the task. + */ + MessageDef *message_p = NULL; + itti_receive_msg(OCP_GTPV1_U, &message_p); + + if (message_p != NULL ) { + switch (ITTI_MSG_ID(message_p)) { + // DATA TO BE SENT TO UDP + case GTPV1U_ENB_TUNNEL_DATA_REQ: { + gtpv1uSend(ITTI_MESSAGE_GET_INSTANCE(message_p), + >PV1U_ENB_TUNNEL_DATA_REQ(message_p), false, false); + itti_free(OCP_GTPV1_U, GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).buffer); + } + break; + + case TERMINATE_MESSAGE: + break; + + case TIMER_HAS_EXPIRED: + LOG_E(GTPU, "Received unexpected timer expired (no need of timers in this version) %s\n", ITTI_MSG_NAME(message_p)); + break; + + + case GTPV1U_ENB_DATA_FORWARDING_REQ: + case GTPV1U_ENB_DATA_FORWARDING_IND: + case GTPV1U_ENB_END_MARKER_REQ: + case GTPV1U_ENB_END_MARKER_IND: + case GTPV1U_ENB_S1_REQ: + LOG_E(GTPU, "to be developped %s\n", ITTI_MSG_NAME(message_p)); + abort(); + break; + + default: + LOG_E(GTPU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p)); + abort(); + break; + } + + AssertFatal(EXIT_SUCCESS==itti_free(OCP_GTPV1_U, message_p), "Failed to free memory!\n"); + } + + struct epoll_event *events; + + int nb_events = itti_get_events(OCP_GTPV1_U, &events); + + if (nb_events > 0 && events!= NULL ) + for (int i = 0; i < nb_events; i++) + gtpv1uReceiver(events[i].data.fd); + } + + return NULL; +} + +#ifdef __cplusplus +} +#endif diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h new file mode 100644 index 0000000000..e09f2194eb --- /dev/null +++ b/openair3/ocp-gtpu/gtp_itf.h @@ -0,0 +1,49 @@ +#ifndef __UDP_ITF_H__ +#define __UDP_ITF_H__ +#define GTPNOK -1 + +# define GTPU_HEADER_OVERHEAD_MAX 64 +#ifdef __cplusplus +extern "C" { +#endif + +#include +#if defined(NEW_GTPU) + #define gtpv1u_create_s1u_tunnel ocp_gtpv1u_create_s1u_tunnel + #define gtpv1u_update_s1u_tunnel ocp_gtpv1u_update_s1u_tunnel + #define gtpv1u_delete_s1u_tunnel ocp_gtpv1u_delete_s1u_tunnel + #define gtpv1u_create_x2u_tunnel ocp_gtpv1u_create_x2u_tunnel + #endif + +typedef struct openAddr_s { + char originHost[HOST_NAME_MAX]; + char originService[HOST_NAME_MAX]; + char destinationHost[HOST_NAME_MAX]; + char destinationService[HOST_NAME_MAX]; + instance_t originInstance; +} openAddr_t; + +// the init function create a gtp instance and return the gtp instance id +// the parameter originInstance will be sent back in each message from gtp to the creator +instance_t ocp_gtpv1Init(openAddr_t context); +void ocp_gtpv1uReceiver(int h); +void ocp_gtpv1uProcessTimeout(int handle,void *arg); +int ocp_gtpv1u_create_s1u_tunnel(const instance_t instance, const gtpv1u_enb_create_tunnel_req_t *create_tunnel_req, + gtpv1u_enb_create_tunnel_resp_t *create_tunnel_resp); +int ocp_gtpv1u_update_s1u_tunnel(const instance_t instanceP, + const gtpv1u_enb_create_tunnel_req_t *create_tunnel_req_pP, + const rnti_t prior_rnti + ); +int ocp_gtpv1u_delete_s1u_tunnel( const instance_t instance, const gtpv1u_enb_delete_tunnel_req_t *const req_pP); +int gtpv1u_delete_s1u_tunnel( const instance_t instance, const gtpv1u_enb_delete_tunnel_req_t *const req_pP); + + int ocp_gtpv1u_create_x2u_tunnel( + const instance_t instanceP, + const gtpv1u_enb_create_x2u_tunnel_req_t * const create_tunnel_req_pP, + gtpv1u_enb_create_x2u_tunnel_resp_t * const create_tunnel_resp_pP); + void *ocp_gtpv1uTask(void *args); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index dd29d01fae..851082f44b 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1329,7 +1329,7 @@ extern "C" { if(is_equal(s->sample_rate, (double)7.68e6)) s->tx_forward_nsamps = 50; - + if (device->recplay_state != NULL) { // record mode device->recplay_state->ms_sample = (iqrec_t *) malloc(openair0_cfg[0].recplay_conf->u_sf_max * sizeof(iqrec_t)); diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c index 4d57ab4e16..3e0d97f60a 100644 --- a/targets/COMMON/create_tasks.c +++ b/targets/COMMON/create_tasks.c @@ -42,6 +42,7 @@ # include "enb_app.h" # include "openair2/LAYER2/MAC/mac_proto.h" #include +#include extern RAN_CONTEXT_t RC; diff --git a/targets/COMMON/create_tasks_mbms.c b/targets/COMMON/create_tasks_mbms.c index 5f81592b96..579e851ea7 100644 --- a/targets/COMMON/create_tasks_mbms.c +++ b/targets/COMMON/create_tasks_mbms.c @@ -47,6 +47,7 @@ # include "mce_app.h" # include "mme_app.h" +#include //extern RAN_CONTEXT_t RC; int create_tasks_mbms(uint32_t enb_nb) { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 0d0dde4ac4..1fa6c594d6 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -170,7 +170,6 @@ extern void init_eNB_afterRU(void); int transmission_mode=1; int emulate_rf = 0; int numerology = 0; -int usrp_tx_thread = 0; THREAD_STRUCT thread_struct; /* struct for ethernet specific parameters given in eNB conf file */ diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 2bf2314f1b..f7dfed80e5 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -168,7 +168,6 @@ extern void get_uethreads_params(void); int transmission_mode=1; -int usrp_tx_thread = 0; char *usrp_args=NULL; From 954b0f559d83304754ee06be8b338e7fc4628eba Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Mon, 25 Jan 2021 12:59:38 +0100 Subject: [PATCH 002/125] new gtp before tests --- cmake_targets/CMakeLists.txt | 4 +- doc/SW_archi.md | 22 ++ openair2/COMMON/gtpv1_u_messages_types.h | 2 + openair2/ENB_APP/enb_config.c | 5 +- openair2/GNB_APP/gnb_config.c | 6 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 3 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 7 +- openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c | 3 +- openair2/RRC/LTE/rrc_eNB.c | 2 +- openair2/RRC/LTE/rrc_eNB_S1AP.c | 2 +- openair2/RRC/NR/rrc_gNB_nsa.c | 3 +- openair3/ocp-gtpu/gtp_itf.cpp | 369 +++++++++++----------- openair3/ocp-gtpu/gtp_itf.h | 49 ++- 13 files changed, 274 insertions(+), 203 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 1b93dea0c0..1a4a0a88f7 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2883,8 +2883,8 @@ add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer) target_link_libraries (lte-softmodem -Wl,--start-group - RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB - PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 + RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB + PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE ${GTPV1U} NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} -Wl,--end-group z dl) diff --git a/doc/SW_archi.md b/doc/SW_archi.md index 412dad402d..f6114c33c2 100644 --- a/doc/SW_archi.md +++ b/doc/SW_archi.md @@ -296,6 +296,28 @@ gtp thread calls directly pdcp_data_req(), so it runs inside it's context intern ## inside other threads gtpv1u_create_s1u_tunnel(), delete tunnel, ... functions are called inside the other threads, without mutex. +# New GTP +## initialization +Coexistance until full merge with legacy GTP +cmake new option: NEW_GTPU to use the new implementation (it changes for the entire executable) +It is possible to use both old and new GTP in same executable because the itti task and all functions names are different +Current status of new implementation: not tested, X2 not developped, 5G new GTP option not developped, remain issues on data coming from void: muid, enb_flag, ... + +ocp_gtpv1uTask(): this creates only the thread, doesn't configure anything +gtpv1Init(): creates a listening socket to Linux for a given reception and select a local IP address + +newGtpuCreateTunnel() this function will replace the xxx_create_tunnel_xxx() for various cases +This creates a outgoing context for a teid (in input), it computes and return the incoming teid that will be used for incoming packets +These teids and in a "instance", so in a Linux socket: same teid can co-exist for different sockets + Remain here a lack to fill: the information given in the legacy funtions is not enough to fullfil the data needed by the callback +stuff like enb_flag, but also mui and more important data are not given explicitly by any legacy function (gtpv1u_create_s1u_tunnel), but the legacy and the new interface to lower layer (like pdcp) require this data. +The datamodel is still not fully understood, so this data source remain unknown +A new parameter is the callback function: will be pdpcp_data_req() and gtpv_data_req() (x2 case) for existing implementation and later other call backs like the F1-U implementation. + +incoming packets +the gtp layer retrieves the data, the teid, find out the related data: rnti, bearer and quite a lot of other parameters (not clear why, because it looks like all is statefull, so the lower layer should have the context) +if lower layers can be stateless, it is a good idea to keep the context in the gtp layer and pass it to the callback, but the design remain obfuscated. + # NGAP NGAP would be a itti thread as is S1AP (+twin thread SCTP that is almost void processing)? About all messages are exchanged with RRC thread diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h index 14b6e7c0b1..a0c1a9e817 100644 --- a/openair2/COMMON/gtpv1_u_messages_types.h +++ b/openair2/COMMON/gtpv1_u_messages_types.h @@ -170,6 +170,8 @@ typedef struct gtpv1u_enb_end_marker_ind_s { typedef struct { in_addr_t enb_ip_address_for_S1u_S12_S4_up; tcp_udp_port_t enb_port_for_S1u_S12_S4_up; + char addrStr[256]; + char portStr[256]; } Gtpv1uS1Req; #endif /* GTPV1_U_MESSAGES_TYPES_H_ */ diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index de77d783c7..9b0bc14f70 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -57,6 +57,7 @@ #include "enb_paramdef.h" #include "proto_agent.h" #include "executables/thread-common.h" +#include extern uint32_t to_earfcn_DL(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw); extern uint32_t to_earfcn_UL(int eutra_bandP, uint32_t ul_CarrierFreq, uint32_t bw); @@ -2055,7 +2056,9 @@ int RCconfig_gtpu(void ) { IPV4_STR_ADDR_TO_INT_NWBO ( address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up); GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = enb_port_for_S1U; - itti_send_msg_to_task (TASK_GTPV1_U, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id) + strcpy(GTPV1U_ENB_S1_REQ(message).addrStr,address); + sprintf(GTPV1U_ENB_S1_REQ(message).portStr,"%d", enb_port_for_S1U); + itti_send_msg_to_task (TASK_VARIABLE, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id) } else LOG_E(GTPU,"invalid address for S1U\n"); diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 3785ded9e9..19ff268668 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -57,6 +57,7 @@ //#include "RRC_config_tools.h" #include "gnb_paramdef.h" #include "NR_MAC_gNB/mac_proto.h" +#include #include "NR_asn_constant.h" #include "executables/thread-common.h" @@ -740,8 +741,9 @@ int RCconfig_nr_gtpu(void ) { LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up); GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = gnb_port_for_NGU; } - - itti_send_msg_to_task (TASK_GTPV1_U, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id) + strcpy(GTPV1U_ENB_S1_REQ(message).addrStr,address); + sprintf(GTPV1U_ENB_S1_REQ(message).portStr,"%d", gnb_port_for_NGU); + itti_send_msg_to_task (TASK_VARIABLE, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id) } else LOG_E(GTPU,"invalid address for NGU\n"); diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 9b6de7c168..9c5438b589 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -61,6 +61,7 @@ # include "gtpv1u_eNB_task.h" # include "gtpv1u.h" +#include #include "ENB_APP/enb_config.h" @@ -937,7 +938,7 @@ pdcp_data_ind( GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX; GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rnti = ctxt_pP->rnti; GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rab_id = rb_id + 4; - itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p); + itti_send_msg_to_task(TASK_VARIABLE, INSTANCE_DEFAULT, message_p); packet_forwarded = TRUE; } } else { diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index c8ab4499ee..52efc3c03e 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -242,17 +242,18 @@ typedef struct pdcp_mbms_s { * \note None * @ingroup _pdcp */ + boolean_t pdcp_data_req( protocol_ctxt_t *ctxt_pP, const srb_flag_t srb_flagP, const rb_id_t rb_id, const mui_t muiP, - const confirm_t confirmP, \ + const confirm_t confirmP, const sdu_size_t sdu_buffer_size, unsigned char *const sdu_buffer, const pdcp_transmission_mode_t mode, - const uint32_t *const sourceL2Id, - const uint32_t *const destinationL2Id + const uint32_t * sourceL2Id, + const uint32_t * destinationL2Id ); /*! \fn boolean_t pdcp_data_ind(const protocol_ctxt_t* const, srb_flag_t, MBMS_flag_t, rb_id_t, sdu_size_t, mem_block_t*, boolean_t) diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index 9b33b2715d..1e5ec1ee59 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -33,6 +33,7 @@ /* from OAI */ #include "pdcp.h" #include "LAYER2/nr_rlc/nr_rlc_oai_api.h" +#include #define TODO do { \ printf("%s:%d:%s: todo\n", __FILE__, __LINE__, __FUNCTION__); \ @@ -442,7 +443,7 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity, LOG_D(PDCP, "%s() (drb %d) sending message to gtp size %d\n", __func__, rb_id, size); //for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)buf[i]); //printf("\n"); - itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p); + itti_send_msg_to_task(TASK_VARIABLE, INSTANCE_DEFAULT, message_p); } } diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index 2564983d47..5624bf80d8 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -5034,7 +5034,7 @@ void rrc_eNB_handover_ue_context_release( ue_context_p->ue_context.enb_gtp_ebi[e_rab] = 0; } - itti_send_msg_to_task(TASK_GTPV1_U, ctxt_pP->module_id, msg_delete_tunnels_p); + itti_send_msg_to_task(TASK_VARIABLE, ctxt_pP->module_id, msg_delete_tunnels_p); struct rrc_ue_s1ap_ids_s *rrc_ue_s1ap_ids = NULL; rrc_ue_s1ap_ids = rrc_eNB_S1AP_get_ue_ids(RC.rrc[ctxt_pP->module_id], 0, eNB_ue_s1ap_id); diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c index 9edfa50f12..49450e2deb 100644 --- a/openair2/RRC/LTE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c @@ -1763,7 +1763,7 @@ int rrc_eNB_process_S1AP_E_RAB_RELEASE_COMMAND(MessageDef *msg_p, const char *ms } } - itti_send_msg_to_task(TASK_GTPV1_U, instance, msg_delete_tunnels_p); + itti_send_msg_to_task(TASK_VARIABLE, instance, msg_delete_tunnels_p); //S1AP_E_RAB_RELEASE_RESPONSE rrc_eNB_send_S1AP_E_RAB_RELEASE_RESPONSE(&ctxt, ue_context_p, xid); } diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c index 8f1fa9f81f..e1c511c4f9 100644 --- a/openair2/RRC/NR/rrc_gNB_nsa.c +++ b/openair2/RRC/NR/rrc_gNB_nsa.c @@ -39,6 +39,7 @@ #include "openair2/RRC/LTE/rrc_eNB_GTPV1U.h" #include "executables/softmodem-common.h" #include +#include extern boolean_t nr_rrc_pdcp_config_asn1_req( const protocol_ctxt_t *const ctxt_pP, @@ -341,7 +342,7 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) { ue_context->ue_context.gnb_gtp_ebi[e_rab] = 0; } - itti_send_msg_to_task(TASK_GTPV1_U, rrc->module_id, msg_delete_tunnels_p); + itti_send_msg_to_task(TASK_VARIABLE, rrc->module_id, msg_delete_tunnels_p); /* remove context */ rrc_gNB_remove_ue_context(&ctxt, rrc, ue_context); diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index 5a5717c726..f9fc506860 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -1,3 +1,9 @@ +#include +using namespace std; + +#ifdef __cplusplus +extern "C" { +#endif #include #include #include @@ -10,9 +16,8 @@ #include #include #include +#include //#include -#include -using namespace std; #pragma pack(1) @@ -25,13 +30,13 @@ typedef struct Gtpv1uMsgHeader { uint8_t version:3; uint8_t msgType; uint16_t msgLength; - uint32_t teid; + teid_t teid; } __attribute__((packed)) Gtpv1uMsgHeaderT; #pragma pack() - // TS 29.060, table 7.1 defines the possible message types - // here are all the possible messages (3GPP R16) +// TS 29.060, table 7.1 defines the possible message types +// here are all the possible messages (3GPP R16) #define GTP_ECHO_REQ (1) #define GTP_ECHO_RSP (2) #define GTP_ERROR_INDICATION (26) @@ -57,11 +62,14 @@ typedef struct { typedef struct { rnti_t rnti; + gtpCallback callBack; } rntiData_t; class gtpEndPoint { public: openAddr_t addr; + uint8_t foundAddr[20]; + int foundAddrLen; map ue2te_mapping; map te2ue_mapping; }; @@ -75,10 +83,6 @@ class gtpEndPoints { gtpEndPoints globGtp; -#ifdef __cplusplus -extern "C" { -#endif - static uint32_t gtpv1uNewTeid(void) { #ifdef GTPV1U_LINEAR_TEID_ALLOCATION g_gtpv1u_teid = g_gtpv1u_teid + 1; @@ -90,7 +94,7 @@ static uint32_t gtpv1uNewTeid(void) { #define GTPV1U_HEADER_SIZE (8) -static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, uint32_t teid, uint8_t *Msg,int msgLen, +static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, teid_t teid, uint8_t *Msg,int msgLen, bool seqNumFlag, bool npduNumFlag, bool extHdrFlag, int seqNum, int npduNum, int extHdrType) { AssertFatal(extHdrFlag==false,"Not developped"); int headerAdditional=0; @@ -203,6 +207,11 @@ static int udpServerSocket(openAddr_s addr) { close(sockfd); LOG_W(GTPU,"bind: %s\n", strerror(errno)); continue; + } else { + // We create the gtp instance on the socket + globGtp.instances[sockfd].addr=addr; + memcpy(globGtp.instances[sockfd].foundAddr, p->ai_addr, p->ai_addrlen); + globGtp.instances[sockfd].foundAddrLen=p->ai_addrlen; } break; // if we get here, we must have connected successfully @@ -215,6 +224,28 @@ static int udpServerSocket(openAddr_s addr) { } freeaddrinfo(servinfo); // all done with this structure + + if (strlen(addr.destinationHost)>1) { + struct addrinfo hints; + memset(&hints,0,sizeof(hints)); + hints.ai_family=AF_UNSPEC; + hints.ai_socktype=SOCK_DGRAM; + hints.ai_protocol=0; + hints.ai_flags=AI_PASSIVE|AI_ADDRCONFIG; + struct addrinfo *res=0; + int err=getaddrinfo(addr.destinationHost,addr.destinationService,&hints,&res); + + if (err==0) { + for(p = res; p != NULL; p = p->ai_next) { + if ((err=connect(sockfd, p->ai_addr, p->ai_addrlen))==0) + break; + } + } + + if (err) + LOG_E(GTPU,"Can't filter remote host: %s, %s\n", addr.destinationHost,addr.destinationService); + } + int sendbuff = 1000*1000*10; AssertFatal(0==setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff)),""); LOG_D(GTPU,"Created listener for paquets to: %s:%s, send buffer size: %d\n", addr.originHost, addr.originService,sendbuff); @@ -226,16 +257,66 @@ instance_t ocp_gtpv1Init(openAddr_t context) { int id=udpServerSocket(context); if (id>=0) { - globGtp.instances[id].addr=context; itti_subscribe_event_fd(OCP_GTPV1_U, id); } else LOG_E(GTPU,"can't create GTP-U instance\n"); pthread_mutex_unlock(&globGtp.gtp_lock); - return id; } +teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int bearer_id, teid_t teid, transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) { + pthread_mutex_lock(&globGtp.gtp_lock); + auto inst=&globGtp.instances[instance]; + auto it=inst->ue2te_mapping.find(rnti); + + if ( it != inst->ue2te_mapping.end() ) { + LOG_W(GTPU,"Create a config for a already existing GTP tunnel (rnti %x)\n", rnti); + inst->ue2te_mapping.erase(it); + } + + uint32_t s1u_teid=gtpv1uNewTeid(); + + while ( inst->te2ue_mapping.find(s1u_teid) != inst->te2ue_mapping.end() ) { + LOG_W(GTPU, "generated a random Teid that exists, re-generating (%u)\n",s1u_teid); + s1u_teid=gtpv1uNewTeid(); + }; + + inst->te2ue_mapping[s1u_teid].rnti=rnti; + + inst->te2ue_mapping[s1u_teid].callBack=callBack; + + auto tmp=&inst->ue2te_mapping[rnti].bearers[bearer_id]; + + int addrs_length_in_bytes = remoteAddr.length / 8; + + switch (addrs_length_in_bytes) { + case 4: + memcpy(&tmp->outgoing_ip_addr,remoteAddr.buffer,4); + break; + + case 16: + memcpy(tmp->outgoing_ip6_addr.s6_addr,remoteAddr.buffer, + 16); + break; + + case 20: + memcpy(&tmp->outgoing_ip_addr,remoteAddr.buffer,4); + memcpy(&tmp->outgoing_ip6_addr.s6_addr, + remoteAddr.buffer+4, + 16); + + default: + AssertFatal(false, "SGW Address size impossible"); + } + + tmp->teid_incoming = s1u_teid; + tmp->outgoing_port=port; + tmp->teid_outgoing= teid; + pthread_mutex_unlock(&globGtp.gtp_lock); + return s1u_teid; +} + int ocp_gtpv1u_create_s1u_tunnel(instance_t instance, const gtpv1u_enb_create_tunnel_req_t *create_tunnel_req, gtpv1u_enb_create_tunnel_resp_t *create_tunnel_resp) { @@ -243,96 +324,23 @@ int ocp_gtpv1u_create_s1u_tunnel(instance_t instance, create_tunnel_req->rnti, create_tunnel_req->num_tunnels, create_tunnel_req->sgw_S1u_teid[0]); - pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[instance]; - auto it=inst->ue2te_mapping.find(create_tunnel_req->rnti); - - if ( it != inst->ue2te_mapping.end() ) { - LOG_W(GTPU,"Create a config for a already existing GTP tunnel (rnti %x)\n", create_tunnel_req->rnti); - inst->ue2te_mapping.erase(it); - } - - rntiData_t rntiData= {create_tunnel_req->rnti}; for (int i = 0; i < create_tunnel_req->num_tunnels; i++) { - ocp_gtpv1u_bearer_t gtpv1u_ue_data; - uint32_t s1u_teid=gtpv1uNewTeid(); - - while ( inst->te2ue_mapping.find(s1u_teid) != inst->te2ue_mapping.end() ) { - LOG_W(GTPU, "generated a random Teid that exists, re-generating (%u)\n",s1u_teid); - s1u_teid=gtpv1uNewTeid(); - }; - - inst->te2ue_mapping[s1u_teid]=rntiData; - - int addrs_length_in_bytes = create_tunnel_req->sgw_addr[i].length / 8; - - switch (addrs_length_in_bytes) { - case 4: - memcpy(>pv1u_ue_data.outgoing_ip_addr,create_tunnel_req->sgw_addr[i].buffer,4); - break; - - case 16: - memcpy(>pv1u_ue_data.outgoing_ip6_addr.s6_addr, - create_tunnel_req->sgw_addr[i].buffer, - 16); - break; - - case 20: - memcpy(>pv1u_ue_data.outgoing_ip_addr,create_tunnel_req->sgw_addr[i].buffer,4); - memcpy(>pv1u_ue_data.outgoing_ip6_addr.s6_addr, - create_tunnel_req->sgw_addr[i].buffer+4, - 16); - - default: - AssertFatal(false, "SGW Address size impossible"); - } - - gtpv1u_ue_data.teid_incoming = s1u_teid; - gtpv1u_ue_data.outgoing_port=2152; - gtpv1u_ue_data.teid_outgoing= create_tunnel_req->sgw_S1u_teid[i]; - inst->ue2te_mapping[create_tunnel_req->rnti].bearers[create_tunnel_req->eps_bearer_id[i]]=gtpv1u_ue_data; - LOG_D(GTPU, "Created tunnel %x for RNTI %x, SGW: " IPV4_ADDR ":%d\n", - s1u_teid, create_tunnel_req->rnti, - IPV4_ADDR_FORMAT(inst->ue2te_mapping[create_tunnel_req->rnti].bearers[create_tunnel_req->eps_bearer_id[i]].outgoing_ip_addr), - inst->ue2te_mapping[create_tunnel_req->rnti].bearers[create_tunnel_req->eps_bearer_id[i]].outgoing_port ); + teid_t teid=newGtpuCreateTunnel(instance, create_tunnel_req->rnti, + create_tunnel_req->eps_bearer_id[i], + create_tunnel_req->eps_bearer_id[i], + create_tunnel_req->sgw_addr[i], 2152, + pdcp_data_req); create_tunnel_resp->status=0; create_tunnel_resp->rnti=create_tunnel_req->rnti; create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels; - create_tunnel_resp->enb_S1u_teid[i]=gtpv1u_ue_data.teid_incoming; + create_tunnel_resp->enb_S1u_teid[i]=teid; create_tunnel_resp->eps_bearer_id[i] = create_tunnel_req->eps_bearer_id[i]; - //TBD: fix me this is quite bad, for IPv4 only and - // Overcomplex stuff to fill InitialContextSetupResponse in S1AP - int status; - struct addrinfo hints= {0}, *servinfo, *p; - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags = AI_PASSIVE; - openAddr_t *addr=&globGtp.instances[instance].addr; - - if ((status = getaddrinfo(addr->originHost, addr->originService, &hints, &servinfo)) != 0) { - LOG_E(GTPU,"getaddrinfo error: %s\n", gai_strerror(status)); - pthread_mutex_unlock(&globGtp.gtp_lock); - return -1; - } - - // TBD: we take the first IPv4 addr, but it should be coded in the right way - for(p = servinfo; p != NULL; p = p->ai_next) - if (p->ai_family == AF_INET) { - struct sockaddr_in *ipv4P=(struct sockaddr_in *)p->ai_addr; - memcpy(create_tunnel_resp->enb_addr.buffer, - &ipv4P->sin_addr.s_addr, sizeof(ipv4P->sin_addr.s_addr)); - create_tunnel_resp->enb_addr.length = sizeof(ipv4P->sin_addr.s_addr); - break; - } - - if ( p == NULL ) - LOG_E(GTPU,"can't translate IP address string: %s\n",addr->originHost); - - freeaddrinfo(servinfo); // all done with this structure + memcpy(create_tunnel_resp->enb_addr.buffer,globGtp.instances[instance].foundAddr, + globGtp.instances[instance].foundAddrLen); + create_tunnel_resp->enb_addr.length= globGtp.instances[instance].foundAddrLen; } - pthread_mutex_unlock(&globGtp.gtp_lock); return !GTPNOK; } @@ -358,9 +366,9 @@ int ocp_gtpv1u_update_s1u_tunnel( if ( it != inst->ue2te_mapping.end() ) { LOG_W(GTPU,"Update a not existing tunnel, start create the new one (new rnti %x, old rnti %x)\n", create_tunnel_req->rnti, prior_rnti); + pthread_mutex_unlock(&globGtp.gtp_lock); gtpv1u_enb_create_tunnel_resp_t tmp; (void)ocp_gtpv1u_create_s1u_tunnel(instance, create_tunnel_req, &tmp); - pthread_mutex_unlock(&globGtp.gtp_lock); return 0; } @@ -369,16 +377,16 @@ int ocp_gtpv1u_update_s1u_tunnel( pthread_mutex_unlock(&globGtp.gtp_lock); return 0; } - + int ocp_gtpv1u_create_x2u_tunnel( const instance_t instanceP, - const gtpv1u_enb_create_x2u_tunnel_req_t * const create_tunnel_req_pP, - gtpv1u_enb_create_x2u_tunnel_resp_t * const create_tunnel_resp_pP){ + const gtpv1u_enb_create_x2u_tunnel_req_t *const create_tunnel_req_pP, + gtpv1u_enb_create_x2u_tunnel_resp_t *const create_tunnel_resp_pP) { AssertFatal( false, "to be developped\n"); } - + int ocp_gtpv1u_delete_s1u_tunnel( const instance_t instance, - const gtpv1u_enb_delete_tunnel_req_t *const req_pP) { + const gtpv1u_enb_delete_tunnel_req_t *const req_pP) { LOG_D(GTPU, "Start delete tunnels for RNTI %x, num_erab %d, eps_bearer_id %d \n", req_pP->rnti, req_pP->num_erab, @@ -422,22 +430,22 @@ static int Gtpv1uHandleError(int h, int rc = GTPNOK; return rc; } - + static int Gtpv1uHandleSupportedExt(int h, - uint8_t *msgBuf, - uint32_t msgBufLen, - uint16_t peerPort, - uint32_t peerIp) { + uint8_t *msgBuf, + uint32_t msgBufLen, + uint16_t peerPort, + uint32_t peerIp) { LOG_E(GTPU,"to be dev\n"); int rc = GTPNOK; return rc; } - - static int Gtpv1uHandleEndMarker(int h, - uint8_t *msgBuf, - uint32_t msgBufLen, - uint16_t peerPort, - uint32_t peerIp) { + +static int Gtpv1uHandleEndMarker(int h, + uint8_t *msgBuf, + uint32_t msgBufLen, + uint16_t peerPort, + uint32_t peerIp) { LOG_E(GTPU,"to be dev\n"); int rc = GTPNOK; return rc; @@ -460,52 +468,52 @@ static int Gtpv1uHandleGpdu(int h, auto tunnel=inst->te2ue_mapping.find(ntohl(msgHdr->teid)); if ( tunnel == inst->te2ue_mapping.end() ) { - LOG_E(GTPU,"Received a incoming packet on non open teid (%d)\n", msgHdr->teid); + LOG_E(GTPU,"Received a incoming packet on unknown teid (%d) Dropping!\n", msgHdr->teid); pthread_mutex_unlock(&globGtp.gtp_lock); return GTPNOK; } int offset=8; + if( msgHdr->E || msgHdr->S ||msgHdr->PN) offset+=4; - /* - gtpv1u_enb_tunnel_data_ind_t tmp; + + // This context is not good for gtp + // frame, ... has no meaning + // manyother attributes may come from create tunnel protocol_ctxt_t ctxt; - ctxt.module_id = 0; - ctxt.enb_flag = 1; - ctxt.instance = 0; - ctxt.frame = 0; - ctxt.subframe = 0; - ctxt.eNB_index = 0; - ctxt.configured = 1; - ctxt.brOption = 0; - result = pdcp_data_req(&ctxt, - SRB_FLAG_YES, - RRC_DCCH_DATA_REQ(msg_p).rb_id, - RRC_DCCH_DATA_REQ(msg_p).muip, - RRC_DCCH_DATA_REQ(msg_p).confirmp, - RRC_DCCH_DATA_REQ(msg_p).sdu_size, - RRC_DCCH_DATA_REQ(msg_p).sdu_p, - RRC_DCCH_DATA_REQ(msg_p).mode, - NULL, NULL); - - - ctxt.rnti = rnti; - pdcp_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, - PDCP_TRANSMISSION_MODE_DATA, NULL, NULL); - - MessageDef *msg_p=itti_alloc_new_message_sized(OCP_GTPV1_U,GTPV1U_ENB_TUNNEL_DATA_IND, - sizeof(MessageDef) + msgBufLen); - GTPV1U_ENB_TUNNEL_DATA_IND(msg_p).buffer=(uint8_t *)(msg_p+1); - memcpy(GTPV1U_ENB_TUNNEL_DATA_IND(msg_p).buffer,msgBuf,msgBufLen); - GTPV1U_ENB_TUNNEL_DATA_IND(msg_p).length=msgBufLen; - GTPV1U_ENB_TUNNEL_DATA_IND(msg_p).offset=offset; + ctxt.module_id = 0; + ctxt.enb_flag = 1; + ctxt.instance = inst->addr.originInstance; + ctxt.rnti = tunnel->second.rnti; + ctxt.frame = 0; + ctxt.subframe = 0; + ctxt.eNB_index = 0; + ctxt.configured = 1; + ctxt.brOption = 0; + const srb_flag_t srb_flag=SRB_FLAG_NO; + const rb_id_t rb_id=0; + const mui_t mui=RLC_MUI_UNDEFINED; + const confirm_t confirm=RLC_SDU_CONFIRM_NO; + const sdu_size_t sdu_buffer_size=msgBufLen-offset; + unsigned char *const sdu_buffer=msgBuf+offset; + const pdcp_transmission_mode_t mode=PDCP_TRANSMISSION_MODE_DATA; + const uint32_t sourceL2Id=0; + const uint32_t destinationL2Id=0; pthread_mutex_unlock(&globGtp.gtp_lock); - inst->addr.dlCallBack(msg_p); - */ - // could be a full itti msg, make it in the call back if you need - //itti_send_msg_to_task(TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(0), msg_p); + + if ( !tunnel->second.callBack(&ctxt, + srb_flag, + rb_id, + mui, + confirm, + sdu_buffer_size, + sdu_buffer, + mode, + &sourceL2Id, + &destinationL2Id) ) + LOG_E(GTPU,"down layer refused incoming packet\n"); + LOG_D(GTPU,"Received a %d bytes packet for: teid:%x\n", msgBufLen-offset, ntohl(msgHdr->teid)); @@ -541,26 +549,28 @@ void gtpv1uReceiver(int h) { case GTP_ERROR_INDICATION: Gtpv1uHandleError( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); break; - - case GTP_SUPPORTED_EXTENSION_HEADER_INDICATION: + + case GTP_SUPPORTED_EXTENSION_HEADER_INDICATION: Gtpv1uHandleSupportedExt( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); - break; - - case GTP_END_MARKER: - Gtpv1uHandleEndMarker( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); - break; - - case GTP_GPDU: - Gtpv1uHandleGpdu( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); - break; - - default: - LOG_E(GTPU, "Received a GTP packet of unknown type: %d\n",msgType); - break; + break; + + case GTP_END_MARKER: + Gtpv1uHandleEndMarker( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); + break; + + case GTP_GPDU: + Gtpv1uHandleGpdu( h, udpData, udpDataLen, htons(addr.sin_port), addr.sin_addr.s_addr); + break; + + default: + LOG_E(GTPU, "Received a GTP packet of unknown type: %d\n",msgType); + break; } } } +#include + void *ocp_gtpv1uTask(void *args) { while(1) { /* Trying to fetch a message from the message queue. @@ -571,6 +581,8 @@ void *ocp_gtpv1uTask(void *args) { itti_receive_msg(OCP_GTPV1_U, &message_p); if (message_p != NULL ) { + openAddr_t addr= {0}; + switch (ITTI_MSG_ID(message_p)) { // DATA TO BE SENT TO UDP case GTPV1U_ENB_TUNNEL_DATA_REQ: { @@ -587,19 +599,24 @@ void *ocp_gtpv1uTask(void *args) { LOG_E(GTPU, "Received unexpected timer expired (no need of timers in this version) %s\n", ITTI_MSG_NAME(message_p)); break; - - case GTPV1U_ENB_DATA_FORWARDING_REQ: - case GTPV1U_ENB_DATA_FORWARDING_IND: - case GTPV1U_ENB_END_MARKER_REQ: - case GTPV1U_ENB_END_MARKER_IND: - case GTPV1U_ENB_S1_REQ: - LOG_E(GTPU, "to be developped %s\n", ITTI_MSG_NAME(message_p)); - abort(); - break; - - default: - LOG_E(GTPU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p)); - abort(); + case GTPV1U_ENB_DATA_FORWARDING_REQ: + case GTPV1U_ENB_DATA_FORWARDING_IND: + case GTPV1U_ENB_END_MARKER_REQ: + case GTPV1U_ENB_END_MARKER_IND: + LOG_E(GTPU, "to be developped %s\n", ITTI_MSG_NAME(message_p)); + abort(); + break; + + case GTPV1U_ENB_S1_REQ: + // to be dev: should be removed, to use API + strcpy(addr.originHost, GTPV1U_ENB_S1_REQ(message_p).addrStr); + strcpy(addr.originService, GTPV1U_ENB_S1_REQ(message_p).portStr); + AssertFatal(ocp_gtpv1Init(addr),"Only one instance 0 supprted\n"); + break; + + default: + LOG_E(GTPU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p)); + abort(); break; } diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h index e09f2194eb..24b1adaa6f 100644 --- a/openair3/ocp-gtpu/gtp_itf.h +++ b/openair3/ocp-gtpu/gtp_itf.h @@ -1,5 +1,5 @@ -#ifndef __UDP_ITF_H__ -#define __UDP_ITF_H__ +#ifndef __GTPUNEW_ITF_H__ +#define __GTPUNEW_ITF_H__ #define GTPNOK -1 # define GTPU_HEADER_OVERHEAD_MAX 64 @@ -9,11 +9,27 @@ extern "C" { #include #if defined(NEW_GTPU) - #define gtpv1u_create_s1u_tunnel ocp_gtpv1u_create_s1u_tunnel - #define gtpv1u_update_s1u_tunnel ocp_gtpv1u_update_s1u_tunnel - #define gtpv1u_delete_s1u_tunnel ocp_gtpv1u_delete_s1u_tunnel - #define gtpv1u_create_x2u_tunnel ocp_gtpv1u_create_x2u_tunnel - #endif +#define gtpv1u_create_s1u_tunnel ocp_gtpv1u_create_s1u_tunnel +#define gtpv1u_update_s1u_tunnel ocp_gtpv1u_update_s1u_tunnel +#define gtpv1u_delete_s1u_tunnel ocp_gtpv1u_delete_s1u_tunnel +#define gtpv1u_create_x2u_tunnel ocp_gtpv1u_create_x2u_tunnel +#define gtpv1u_eNB_task ocp_gtpv1uTask +#define TASK_VARIABLE OCP_GTPV1_U +#else +#define TASK_VARIABLE TASK_GTPV1_U +#endif + +typedef boolean_t (*gtpCallback)( + protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_sizeP, + unsigned char *const sdu_buffer_pP, + const pdcp_transmission_mode_t modeP, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id); typedef struct openAddr_s { char originHost[HOST_NAME_MAX]; @@ -25,7 +41,6 @@ typedef struct openAddr_s { // the init function create a gtp instance and return the gtp instance id // the parameter originInstance will be sent back in each message from gtp to the creator -instance_t ocp_gtpv1Init(openAddr_t context); void ocp_gtpv1uReceiver(int h); void ocp_gtpv1uProcessTimeout(int handle,void *arg); int ocp_gtpv1u_create_s1u_tunnel(const instance_t instance, const gtpv1u_enb_create_tunnel_req_t *create_tunnel_req, @@ -36,13 +51,19 @@ int ocp_gtpv1u_update_s1u_tunnel(const instance_t instanceP, ); int ocp_gtpv1u_delete_s1u_tunnel( const instance_t instance, const gtpv1u_enb_delete_tunnel_req_t *const req_pP); int gtpv1u_delete_s1u_tunnel( const instance_t instance, const gtpv1u_enb_delete_tunnel_req_t *const req_pP); - - int ocp_gtpv1u_create_x2u_tunnel( + +int ocp_gtpv1u_create_x2u_tunnel( const instance_t instanceP, - const gtpv1u_enb_create_x2u_tunnel_req_t * const create_tunnel_req_pP, - gtpv1u_enb_create_x2u_tunnel_resp_t * const create_tunnel_resp_pP); - void *ocp_gtpv1uTask(void *args); - + const gtpv1u_enb_create_x2u_tunnel_req_t *const create_tunnel_req_pP, + gtpv1u_enb_create_x2u_tunnel_resp_t *const create_tunnel_resp_pP); + + +// New API +teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int bearer_id, teid_t teid, + transport_layer_addr_t remoteAddr, int port, gtpCallback callBack); +instance_t ocp_gtpv1Init(openAddr_t context); +void *ocp_gtpv1uTask(void *args); + #ifdef __cplusplus } #endif From 4b345f1589bdeaf8cae9cd5bd022aa19ababceb2 Mon Sep 17 00:00:00 2001 From: laurent Date: Wed, 27 Jan 2021 15:09:00 +0100 Subject: [PATCH 003/125] tested with one UE, better intergration with legacy gtpu --- common/utils/ocp_itti/intertask_interface.h | 3 + openair2/LAYER2/MAC/eNB_scheduler_mch.c | 2 +- openair2/LAYER2/MAC/mac_extern.h | 1 + openair2/LAYER2/MAC/pre_processor.c | 3 +- openair2/LAYER2/MAC/ue_procedures.c | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 3 - openair3/ocp-gtpu/gtp_itf.cpp | 74 +++++++++++++-------- 7 files changed, 56 insertions(+), 32 deletions(-) diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h index 140340bacd..7df88c20a6 100644 --- a/common/utils/ocp_itti/intertask_interface.h +++ b/common/utils/ocp_itti/intertask_interface.h @@ -472,6 +472,9 @@ void itti_subscribe_event_fd(task_id_t task_id, int fd); void itti_unsubscribe_event_fd(task_id_t task_id, int fd); /** \brief Return the list of events excluding the fd associated with itti + \the fd associated with itti can return, but it is marked events[i].events &= ~EPOLLIN + \as it is not EPOLLIN, the reader should ignore this fd + \or it can manage the list of fd's in his interest, so ignore the other ones \param task_id Task ID of the task \param events events list @returns number of events to handle diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index f3a77ed703..1272b16ec0 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -84,7 +84,7 @@ get_mbsfn_sf_alloction(module_id_t module_idP, uint8_t CC_id, static uint32_t bytes_in_buffer=0; static uint32_t msi_pmch_stop=0; -uint16_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047}; +rb_id_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047}; static uint32_t msi_sfs=0; diff --git a/openair2/LAYER2/MAC/mac_extern.h b/openair2/LAYER2/MAC/mac_extern.h index cee6066a9e..bc11c5aad6 100644 --- a/openair2/LAYER2/MAC/mac_extern.h +++ b/openair2/LAYER2/MAC/mac_extern.h @@ -77,4 +77,5 @@ extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; extern mac_rlc_am_muilist_t rlc_am_mui; extern SCHEDULER_MODES global_scheduler_mode; +extern rb_id_t mbms_rab_id; #endif //DEF_H diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index e720c1dfec..206f9f2255 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -734,7 +734,8 @@ void calculate_max_mcs_min_rb(module_id_t mod_id, /* find maximum MCS */ while ((phr - *tx_power < 0 || tbs > bytes) && *mcs > 3) { - mcs--; + *mcs=*mcs-1; + AssertFatal(*rb_index < 34, ""); tbs = get_TBS_UL(*mcs, rb_table[*rb_index]); *tx_power = estimate_ue_tx_power(tbs * 8, rb_table[*rb_index], 0, Ncp, 0); } diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 8c4ee72380..6d5c2fc395 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -72,7 +72,7 @@ extern UL_IND_t *UL_INFO; extern int next_ra_frame; extern module_id_t next_Mod_id; -int mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047}; +rb_id_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047}; static int mbms_mch_i=0; //static int num_msi_per_CSA[28]; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index 04b9e188e6..0153d80401 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -78,9 +78,6 @@ extern int nas_sock_fd[MAX_MOBILES_PER_ENB]; extern int nas_sock_mbms_fd; -extern int mbms_rab_id; - - extern struct msghdr nas_msg_tx; extern struct msghdr nas_msg_rx; diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index f9fc506860..0776a3863e 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -62,6 +62,7 @@ typedef struct { typedef struct { rnti_t rnti; + ebi_t rb_id; gtpCallback callBack; } rntiData_t; @@ -92,6 +93,8 @@ static uint32_t gtpv1uNewTeid(void) { #endif } +int legacyInstanceMapping=0; +#define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT?legacyInstanceMapping:a) #define GTPV1U_HEADER_SIZE (8) static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, teid_t teid, uint8_t *Msg,int msgLen, @@ -147,11 +150,11 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b uint64_t rnti=req->rnti; int rab_id=req->rab_id; pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[instance]; + auto inst=&globGtp.instances[compatInst(instance)]; auto ptrRnti=inst->ue2te_mapping.find(rnti); if ( ptrRnti==inst->ue2te_mapping.end() ) { - LOG_E(GTPU, "Gtpv1uProcessUlpReq failed: while getting ue rnti %lx in hashtable ue_mapping\n", rnti); + LOG_E(GTPU, "gtpv1uSend failed: while getting ue rnti %lx in hashtable ue_mapping\n", rnti); pthread_mutex_unlock(&globGtp.gtp_lock); return; } @@ -173,7 +176,7 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b ptr[rab_id].npduNum++; pthread_mutex_unlock(&globGtp.gtp_lock); - gtpv1uCreateAndSendMsg(instance, + gtpv1uCreateAndSendMsg(compatInst(instance), ptr[rab_id].outgoing_ip_addr, ptr[rab_id].outgoing_port, ptr[rab_id].teid_outgoing, @@ -210,8 +213,21 @@ static int udpServerSocket(openAddr_s addr) { } else { // We create the gtp instance on the socket globGtp.instances[sockfd].addr=addr; - memcpy(globGtp.instances[sockfd].foundAddr, p->ai_addr, p->ai_addrlen); - globGtp.instances[sockfd].foundAddrLen=p->ai_addrlen; + + if (p->ai_family == AF_INET) { + struct sockaddr_in *ipv4=(struct sockaddr_in *)p->ai_addr; + memcpy(globGtp.instances[sockfd].foundAddr, + &ipv4->sin_addr.s_addr, sizeof(ipv4->sin_addr.s_addr)); + globGtp.instances[sockfd].foundAddrLen=sizeof(ipv4->sin_addr.s_addr); + break; + } else if (p->ai_family == AF_INET6) { + LOG_W(GTPU,"Local address is IP v6\n"); + struct sockaddr_in6 *ipv6=(struct sockaddr_in6 *)p->ai_addr; + memcpy(globGtp.instances[sockfd].foundAddr, + &ipv6->sin6_addr.s6_addr, sizeof(ipv6->sin6_addr.s6_addr)); + globGtp.instances[sockfd].foundAddrLen=sizeof(ipv6->sin6_addr.s6_addr); + } else + AssertFatal(false,"Local address is not IPv4 or IPv6"); } break; // if we get here, we must have connected successfully @@ -284,6 +300,8 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int bearer_id, teid inst->te2ue_mapping[s1u_teid].rnti=rnti; + inst->te2ue_mapping[s1u_teid].rb_id= teid; + inst->te2ue_mapping[s1u_teid].callBack=callBack; auto tmp=&inst->ue2te_mapping[rnti].bearers[bearer_id]; @@ -326,9 +344,9 @@ int ocp_gtpv1u_create_s1u_tunnel(instance_t instance, create_tunnel_req->sgw_S1u_teid[0]); for (int i = 0; i < create_tunnel_req->num_tunnels; i++) { - teid_t teid=newGtpuCreateTunnel(instance, create_tunnel_req->rnti, - create_tunnel_req->eps_bearer_id[i], + teid_t teid=newGtpuCreateTunnel(compatInst(instance), create_tunnel_req->rnti, create_tunnel_req->eps_bearer_id[i], + create_tunnel_req->sgw_S1u_teid[i], create_tunnel_req->sgw_addr[i], 2152, pdcp_data_req); create_tunnel_resp->status=0; @@ -336,9 +354,9 @@ int ocp_gtpv1u_create_s1u_tunnel(instance_t instance, create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels; create_tunnel_resp->enb_S1u_teid[i]=teid; create_tunnel_resp->eps_bearer_id[i] = create_tunnel_req->eps_bearer_id[i]; - memcpy(create_tunnel_resp->enb_addr.buffer,globGtp.instances[instance].foundAddr, - globGtp.instances[instance].foundAddrLen); - create_tunnel_resp->enb_addr.length= globGtp.instances[instance].foundAddrLen; + memcpy(create_tunnel_resp->enb_addr.buffer,globGtp.instances[compatInst(instance)].foundAddr, + globGtp.instances[compatInst(instance)].foundAddrLen); + create_tunnel_resp->enb_addr.length= globGtp.instances[compatInst(instance)].foundAddrLen; } return !GTPNOK; @@ -356,7 +374,7 @@ int ocp_gtpv1u_update_s1u_tunnel( create_tunnel_req->sgw_S1u_teid[0], create_tunnel_req->eps_bearer_id[0]); pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[instance]; + auto inst=&globGtp.instances[compatInst(instance)]; if ( inst->ue2te_mapping.find(create_tunnel_req->rnti) != inst->ue2te_mapping.end() ) { LOG_E(GTPU,"Update a existing GTP tunnel to a already existing tunnel (new rnti %x, old rnti %x)\n", create_tunnel_req->rnti, prior_rnti); @@ -385,15 +403,12 @@ int ocp_gtpv1u_create_x2u_tunnel( AssertFatal( false, "to be developped\n"); } -int ocp_gtpv1u_delete_s1u_tunnel( const instance_t instance, - const gtpv1u_enb_delete_tunnel_req_t *const req_pP) { - LOG_D(GTPU, "Start delete tunnels for RNTI %x, num_erab %d, eps_bearer_id %d \n", - req_pP->rnti, - req_pP->num_erab, - req_pP->eps_bearer_id[0]); +int newGtpuDeleteTunnel(instance_t instance, rnti_t rnti) { + LOG_D(GTPU, "Start delete tunnels for RNTI %x\n", + rnti); pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[instance]; - auto it=inst->ue2te_mapping.find(req_pP->rnti); + auto inst=&globGtp.instances[compatInst(instance)]; + auto it=inst->ue2te_mapping.find(rnti); if ( it == inst->ue2te_mapping.end() ) { LOG_W(GTPU,"Delete a non existing GTP tunnel\n"); @@ -411,6 +426,13 @@ int ocp_gtpv1u_delete_s1u_tunnel( const instance_t instance, return !GTPNOK; } +// Legacy delete tunnel finish by deleting all the rnti +// so the list of bearer provided is only a design bug +int ocp_gtpv1u_delete_s1u_tunnel( const instance_t instance, + const gtpv1u_enb_delete_tunnel_req_t *const req_pP) { + return newGtpuDeleteTunnel(instance, req_pP->rnti); +} + static int Gtpv1uHandleEchoReq(int h, uint8_t *msgBuf, uint32_t msgBufLen, @@ -489,10 +511,10 @@ static int Gtpv1uHandleGpdu(int h, ctxt.frame = 0; ctxt.subframe = 0; ctxt.eNB_index = 0; - ctxt.configured = 1; + ctxt.configured = 0; ctxt.brOption = 0; const srb_flag_t srb_flag=SRB_FLAG_NO; - const rb_id_t rb_id=0; + const rb_id_t rb_id=tunnel->second.rb_id; const mui_t mui=RLC_MUI_UNDEFINED; const confirm_t confirm=RLC_SDU_CONFIRM_NO; const sdu_size_t sdu_buffer_size=msgBufLen-offset; @@ -529,7 +551,7 @@ void gtpv1uReceiver(int h) { if ((udpDataLen = recvfrom(h, udpData, sizeof(udpData), 0, (struct sockaddr *)&addr, &from_len)) < 0) { - LOG_E(GTPU, "Recvfrom failed %s\n", strerror(errno)); + LOG_E(GTPU, "Recvfrom failed on %d (%s)\n", h, strerror(errno)); return; } else if (udpDataLen == 0) { LOG_W(GTPU, "Recvfrom returned 0\n"); @@ -586,7 +608,7 @@ void *ocp_gtpv1uTask(void *args) { switch (ITTI_MSG_ID(message_p)) { // DATA TO BE SENT TO UDP case GTPV1U_ENB_TUNNEL_DATA_REQ: { - gtpv1uSend(ITTI_MESSAGE_GET_INSTANCE(message_p), + gtpv1uSend(compatInst(ITTI_MESSAGE_GET_INSTANCE(message_p)), >PV1U_ENB_TUNNEL_DATA_REQ(message_p), false, false); itti_free(OCP_GTPV1_U, GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).buffer); } @@ -611,7 +633,7 @@ void *ocp_gtpv1uTask(void *args) { // to be dev: should be removed, to use API strcpy(addr.originHost, GTPV1U_ENB_S1_REQ(message_p).addrStr); strcpy(addr.originService, GTPV1U_ENB_S1_REQ(message_p).portStr); - AssertFatal(ocp_gtpv1Init(addr),"Only one instance 0 supprted\n"); + AssertFatal((legacyInstanceMapping=ocp_gtpv1Init(addr))!=0,"Instance 0 reserved for legacy\n"); break; default: @@ -627,8 +649,8 @@ void *ocp_gtpv1uTask(void *args) { int nb_events = itti_get_events(OCP_GTPV1_U, &events); - if (nb_events > 0 && events!= NULL ) - for (int i = 0; i < nb_events; i++) + for (int i = 0; i < nb_events; i++) + if ((events[i].events&EPOLLIN)) gtpv1uReceiver(events[i].data.fd); } From 7eda2b7409c1e176c6f07ea600b34388a97b5387 Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Mon, 1 Feb 2021 15:35:17 +0100 Subject: [PATCH 004/125] remainign bug after merge develop --- cmake_targets/CMakeLists.txt | 15 ++------------- executables/nr-softmodem.c | 1 + openair3/ocp-gtpu/gtp_itf.h | 1 + 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index a210524220..51287a8ba4 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -405,7 +405,7 @@ add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace") add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace") add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering") -add_boolean_option(NEW_GTPU True "NEW_GTP") +add_boolean_option(NEW_GTPU False "NEW_GTP") set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti) add_library(ITTI @@ -2207,16 +2207,6 @@ add_library(CN_UTILS ) set(GTPV1U_DIR ${OPENAIR3_DIR}/GTPV1-U) -set (GTPV1U_SRC - ${RRC_DIR}/rrc_eNB_GTPV1U.c - ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c - ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTrxn.c - ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uMsg.c - ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1u.c - ${GTPV1U_DIR}/gtpv1u_teid_pool.c -) -add_library(GTPV1U ${GTPV1U_SRC}) -add_dependencies(GTPV1U rrc_flag) add_library (GTPV1U_OCP ${NR_RRC_DIR}/rrc_gNB_GTPV1U.c @@ -2231,6 +2221,7 @@ set (NR_GTPV1U_SRC ${NR_RRC_DIR}/rrc_gNB_GTPV1U.c ${RRC_DIR}/rrc_eNB_GTPV1U.c ${GTPV1U_DIR}/gtpv1u_eNB.c + ${GTPV1U_DIR}/gtpv1u_gNB.c ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTrxn.c ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uMsg.c @@ -3022,7 +3013,6 @@ add_executable(nr-softmodem ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_gNB.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/system.c @@ -3539,7 +3529,6 @@ add_executable(nr-ittisim ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_gNB.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c ${OPENAIR_DIR}/common/utils/utils.c diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 82dcec1220..7884ca9e81 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -85,6 +85,7 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "x2ap_eNB.h" #include "ngap_gNB.h" #include "gnb_paramdef.h" +#include pthread_cond_t nfapi_sync_cond; pthread_mutex_t nfapi_sync_mutex; diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h index 24b1adaa6f..507aa1338e 100644 --- a/openair3/ocp-gtpu/gtp_itf.h +++ b/openair3/ocp-gtpu/gtp_itf.h @@ -14,6 +14,7 @@ extern "C" { #define gtpv1u_delete_s1u_tunnel ocp_gtpv1u_delete_s1u_tunnel #define gtpv1u_create_x2u_tunnel ocp_gtpv1u_create_x2u_tunnel #define gtpv1u_eNB_task ocp_gtpv1uTask +#define gtpv1u_gNB_task ocp_gtpv1uTask #define TASK_VARIABLE OCP_GTPV1_U #else #define TASK_VARIABLE TASK_GTPV1_U From edccb986916cd0fb648659cc398c027b869e5237 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 17 Feb 2021 20:16:03 +0000 Subject: [PATCH 005/125] First draft implementation of CBRA --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 17 +++++++++++++---- openair2/LAYER2/NR_MAC_UE/config_ue.c | 12 +++++++----- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 14 ++++++++++++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 12 ++++++++---- openair2/RRC/NR/rrc_gNB_reconfig.c | 11 ++++++++--- 5 files changed, 48 insertions(+), 18 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index b5a3c061e9..231c9c8cc0 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -678,10 +678,19 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, } else { - preamble_shift -= NCS; - - if (preamble_shift < 0) - preamble_shift+=N_ZC; + + // FIXME: It is working, but we need to differentiate between odd and even preamble index + // Check why preamble_shift does not match with UE + // TS 38.211 Section 6.3.3.1 Sequence generation + if(preamble_index%2==0) { + preamble_shift = (NCS==0)? 0 : (preamble_index % (N_ZC/NCS)); + preamble_shift *= NCS; + } else { + preamble_shift -= 2*NCS; + if (preamble_shift < 0) + preamble_shift+=N_ZC; + } + } } else { // This is the high-speed case new_dft = 0; diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index f6bd5436bc..63a3dc7897 100755 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -529,11 +529,13 @@ int nr_rrc_mac_config_req_ue( mac->servCellIndex = *cell_group_config->spCellConfig->servCellIndex; config_control_ue(mac); if (cell_group_config->spCellConfig->reconfigurationWithSync) { - ra->rach_ConfigDedicated = cell_group_config->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink; - mac->scc = cell_group_config->spCellConfig->reconfigurationWithSync->spCellConfigCommon; - config_common_ue(mac,module_id,cc_idP); - mac->crnti = cell_group_config->spCellConfig->reconfigurationWithSync->newUE_Identity; - LOG_I(MAC,"Configuring CRNTI %x\n",mac->crnti); + if (cell_group_config->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated) { + ra->rach_ConfigDedicated = cell_group_config->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink; + } + mac->scc = cell_group_config->spCellConfig->reconfigurationWithSync->spCellConfigCommon; + config_common_ue(mac,module_id,cc_idP); + mac->crnti = cell_group_config->spCellConfig->reconfigurationWithSync->newUE_Identity; + LOG_I(MAC,"Configuring CRNTI %x\n",mac->crnti); } // Setup the SSB to Rach Occasions mapping according to the config diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 61b5efe39c..aa68bd1ef2 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -79,8 +79,8 @@ void init_RA(module_id_t mod_id, if (rach_ConfigDedicated) { if (rach_ConfigDedicated->cfra){ - LOG_I(MAC, "Initialization of 4-step contention-free random access procedure\n"); - prach_resources->RA_TYPE = RA_4STEP; + LOG_I(MAC, "Initialization of 2-step contention-free random access procedure\n"); + prach_resources->RA_TYPE = RA_2STEP; ra->cfra = 1; } else if (rach_ConfigDedicated->ext1){ if (rach_ConfigDedicated->ext1->cfra_TwoStep_r16){ @@ -93,6 +93,10 @@ void init_RA(module_id_t mod_id, } else { LOG_E(MAC, "In %s: config not handled\n", __FUNCTION__); } + } else if (nr_rach_ConfigCommon){ + LOG_I(MAC, "Initialization of 4-step contention-based random access procedure\n"); + prach_resources->RA_TYPE = RA_4STEP; + ra->cfra = 0; } else { LOG_E(MAC, "In %s: config not handled\n", __FUNCTION__); } @@ -366,6 +370,12 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t prach_resources->ra_PreambleIndex = ra->starting_preamble_nb + sizeOfRA_PreamblesGroupA + ((taus()) % (ra->cb_preambles_per_ssb - sizeOfRA_PreamblesGroupA)); ra->RA_usedGroupA = 0; } + + // TODO: Remove to generate random ra_PreambleIndex + printf("prach_resources->ra_PreambleIndex = %i\n", prach_resources->ra_PreambleIndex); + prach_resources->ra_PreambleIndex = 21; + ra->RA_usedGroupA = 1; + } else { // Msg3 is being retransmitted if (ra->RA_usedGroupA && noGroupB) { prach_resources->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % ra->cb_preambles_per_ssb); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 2b78788e53..037b0f16af 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -454,11 +454,15 @@ void nr_initiate_ra_proc(module_id_t module_idP, // if the preamble received correspond to one of the listed // the UE sent a RACH either for starting RA procedure or RA procedure failed and UE retries int pr_found=0; - for (int i = 0; i < ra->preambles.num_preambles; i++) { - if (preamble_index == ra->preambles.preamble_list[i]) { - pr_found=1; - break; + if(ra->preambles.num_preambles > 0) { + for (int i = 0; i < ra->preambles.num_preambles; i++) { + if (preamble_index == ra->preambles.preamble_list[i]) { + pr_found=1; + break; + } } + } else { + pr_found=1; } if (!pr_found) { diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 4fc4d8c023..95dcfcc3e8 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -226,7 +226,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->spCellConfig->reconfigurationWithSync->t304=NR_ReconfigurationWithSync__t304_ms2000; secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = NULL; secondaryCellGroup->spCellConfig->reconfigurationWithSync->ext1 = NULL; - /* contention free ra */ + + // For 2-step contention-free random access procedure +#if 0 secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = calloc(1,sizeof(struct NR_ReconfigurationWithSync__rach_ConfigDedicated)); secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->present= NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink; secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink= calloc(1,sizeof(struct NR_RACH_ConfigDedicated)); @@ -240,12 +242,13 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.present = NR_CFRA__resources_PR_ssb; secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb = calloc(1,sizeof(struct NR_CFRA__resources__ssb)); secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ra_ssb_OccasionMaskIndex = 0; + struct NR_CFRA_SSB_Resource *ssbElem[8]; + ssbElem[0] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); ssbElem[0]->ssb = 0; ssbElem[0]->ra_PreambleIndex = 63; ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[0]); -#if 0 ssbElem[1] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); ssbElem[1]->ssb = 1; ssbElem[1]->ra_PreambleIndex = 62; @@ -274,8 +277,10 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ssbElem[7]->ssb = 7; ssbElem[7]->ra_PreambleIndex = 63; ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[7]); -#endif + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->ext1 = NULL; +#endif + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants)); secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->present = NR_SetupRelease_RLF_TimersAndConstants_PR_setup; secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup)); From a6136177375f220d1e7835c5352917607df5494f Mon Sep 17 00:00:00 2001 From: rmagueta Date: Sun, 21 Feb 2021 04:05:29 +0000 Subject: [PATCH 006/125] Fix preamble shift at gNB for RA works with all preambles --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 15 ++---- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 2 + openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 49 ++++++++++---------- 3 files changed, 29 insertions(+), 37 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 231c9c8cc0..0c1fde07a2 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -678,19 +678,10 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, } else { + preamble_shift -= NCS; - // FIXME: It is working, but we need to differentiate between odd and even preamble index - // Check why preamble_shift does not match with UE - // TS 38.211 Section 6.3.3.1 Sequence generation - if(preamble_index%2==0) { - preamble_shift = (NCS==0)? 0 : (preamble_index % (N_ZC/NCS)); - preamble_shift *= NCS; - } else { - preamble_shift -= 2*NCS; - if (preamble_shift < 0) - preamble_shift+=N_ZC; - } - + if (preamble_shift < 0) + preamble_shift+=((N_ZC/NCS)*NCS); } } else { // This is the high-speed case new_dft = 0; diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index dd0aa15c52..cf157e108a 100755 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -257,6 +257,8 @@ typedef struct { uint8_t RA_attempt_number; /// Random-access procedure flag uint8_t RA_active; + /// Random-access preamble index + int ra_PreambleIndex; /// Flag for the Msg1 generation: enabled at every occurrence of nr prach slot uint8_t generate_nr_prach; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index aa68bd1ef2..0b600d2b4c 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -64,6 +64,8 @@ void init_RA(module_id_t mod_id, RA_config_t *ra = &mac->ra; ra->RA_active = 1; + ra->ra_PreambleIndex = -1; + ra->RA_usedGroupA = 1; ra->RA_RAPID_found = 0; ra->preambleTransMax = 0; ra->first_Msg3 = 1; @@ -251,7 +253,7 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t int messageSizeGroupA = 0; int sizeOfRA_PreamblesGroupA = 0; int messagePowerOffsetGroupB = 0; - int PLThreshold; + int PLThreshold = 0; long deltaPreamble_Msg3 = 0; uint8_t noGroupB = 0; RA_config_t *ra = &mac->ra; @@ -354,37 +356,34 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t } /* Msg3 has not been transmitted yet */ if (ra->first_Msg3) { - if (noGroupB) { - // use Group A preamble - prach_resources->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % ra->cb_preambles_per_ssb); - ra->RA_usedGroupA = 1; - } else if ((ra->Msg3_size < messageSizeGroupA) && (dl_pathloss > PLThreshold)) { - // Group B is configured and RA preamble Group A is used - // - todo add condition on CCCH_sdu_size for initiation by CCCH - prach_resources->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % sizeOfRA_PreamblesGroupA); - ra->RA_usedGroupA = 1; - } else { - // Group B preamble is configured and used - // the first sizeOfRA_PreamblesGroupA RA preambles belong to RA Preambles Group A - // the remaining belong to RA Preambles Group B - prach_resources->ra_PreambleIndex = ra->starting_preamble_nb + sizeOfRA_PreamblesGroupA + ((taus()) % (ra->cb_preambles_per_ssb - sizeOfRA_PreamblesGroupA)); - ra->RA_usedGroupA = 0; + if(ra->ra_PreambleIndex < 0 || ra->ra_PreambleIndex > 63) { + if (noGroupB) { + // use Group A preamble + ra->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % ra->cb_preambles_per_ssb); + ra->RA_usedGroupA = 1; + } else if ((ra->Msg3_size < messageSizeGroupA) && (dl_pathloss > PLThreshold)) { + // Group B is configured and RA preamble Group A is used + // - todo add condition on CCCH_sdu_size for initiation by CCCH + ra->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % sizeOfRA_PreamblesGroupA); + ra->RA_usedGroupA = 1; + } else { + // Group B preamble is configured and used + // the first sizeOfRA_PreamblesGroupA RA preambles belong to RA Preambles Group A + // the remaining belong to RA Preambles Group B + ra->ra_PreambleIndex = ra->starting_preamble_nb + sizeOfRA_PreamblesGroupA + ((taus()) % (ra->cb_preambles_per_ssb - sizeOfRA_PreamblesGroupA)); + ra->RA_usedGroupA = 0; + } } - - // TODO: Remove to generate random ra_PreambleIndex - printf("prach_resources->ra_PreambleIndex = %i\n", prach_resources->ra_PreambleIndex); - prach_resources->ra_PreambleIndex = 21; - ra->RA_usedGroupA = 1; - } else { // Msg3 is being retransmitted if (ra->RA_usedGroupA && noGroupB) { - prach_resources->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % ra->cb_preambles_per_ssb); + ra->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % ra->cb_preambles_per_ssb); } else if (ra->RA_usedGroupA && !noGroupB){ - prach_resources->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % sizeOfRA_PreamblesGroupA); + ra->ra_PreambleIndex = ra->starting_preamble_nb + ((taus()) % sizeOfRA_PreamblesGroupA); } else { - prach_resources->ra_PreambleIndex = ra->starting_preamble_nb + sizeOfRA_PreamblesGroupA + ((taus()) % (ra->cb_preambles_per_ssb - sizeOfRA_PreamblesGroupA)); + ra->ra_PreambleIndex = ra->starting_preamble_nb + sizeOfRA_PreamblesGroupA + ((taus()) % (ra->cb_preambles_per_ssb - sizeOfRA_PreamblesGroupA)); } } + prach_resources->ra_PreambleIndex = ra->ra_PreambleIndex; } // RA-RNTI computation (associated to PRACH occasion in which the RA Preamble is transmitted) From 23695a52d7a916f124d56a0dccb2e80620fe5967 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 22 Feb 2021 14:30:04 +0000 Subject: [PATCH 007/125] Fix stored node --- targets/ARCH/rfsimulator/stored_node.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/ARCH/rfsimulator/stored_node.c b/targets/ARCH/rfsimulator/stored_node.c index dcea69b9dd..8b0b397995 100644 --- a/targets/ARCH/rfsimulator/stored_node.c +++ b/targets/ARCH/rfsimulator/stored_node.c @@ -186,14 +186,14 @@ int main(int argc, char *argv[]) { serviceSock=client_start(argv[2],atoi(argv[3])); } - uint64_t typeStamp=ENB_MAGICDL_FDD; + uint64_t typeStamp=ENB_MAGICDL; boolean_t raw=false; if ( argc == 5 ) { raw=true; if (strcmp(argv[4],"UL") == 0 ) - typeStamp=UE_MAGICDL_FDD; + typeStamp=UE_MAGICDL; } samplesBlockHeader_t header; From 31cf9ab84760eea32a49f959420d46ef6645d286 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 23 Feb 2021 02:22:27 +0000 Subject: [PATCH 008/125] Fix ra->rnti --- openair1/PHY/defs_gNB.h | 1 + openair2/LAYER2/NR_MAC_gNB/config.c | 7 +++++++ openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 20 ++++++++++--------- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index b7923adb0b..f3f212effb 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -655,6 +655,7 @@ typedef struct { int prach_I0; } PHY_MEASUREMENTS_gNB; +#define TOTAL_NUM_NR_PRACH_PREAMBLES 64 #define MAX_NUM_NR_RX_RACH_PDUS 4 #define MAX_NUM_NR_RX_PRACH_PREAMBLES 4 #define MAX_UL_PDUS_PER_SLOT 8 diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 6aa906b82b..6f6ea8a327 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -416,6 +416,13 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, for (int i = 0; i < num_preamble; i++) ra->preambles.preamble_list[i] = cfra.resources.choice.ssb->ssb_ResourceList.list.array[i]->ra_PreambleIndex; } + } else { + ra->cfra = false; + ra->rnti = rnti; + ra->preambles.num_preambles = TOTAL_NUM_NR_PRACH_PREAMBLES; + ra->preambles.preamble_list = (uint8_t *) malloc(TOTAL_NUM_NR_PRACH_PREAMBLES*sizeof(uint8_t)); + for (int i = 0; i < TOTAL_NUM_NR_PRACH_PREAMBLES; i++) + ra->preambles.preamble_list[i] = i; } LOG_I(PHY,"Added new RA process for UE RNTI %04x with initial secondaryCellGroup\n", rnti); } else { // secondaryCellGroup has been updated diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 037b0f16af..0b3492ccdc 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -454,15 +454,11 @@ void nr_initiate_ra_proc(module_id_t module_idP, // if the preamble received correspond to one of the listed // the UE sent a RACH either for starting RA procedure or RA procedure failed and UE retries int pr_found=0; - if(ra->preambles.num_preambles > 0) { - for (int i = 0; i < ra->preambles.num_preambles; i++) { - if (preamble_index == ra->preambles.preamble_list[i]) { - pr_found=1; - break; - } + for (int i = 0; i < ra->preambles.num_preambles; i++) { + if (preamble_index == ra->preambles.preamble_list[i]) { + pr_found=1; + break; } - } else { - pr_found=1; } if (!pr_found) { @@ -487,7 +483,7 @@ void nr_initiate_ra_proc(module_id_t module_idP, preamble_index, freq_index, symbol); - int loop = 0; + LOG_D(MAC, "Frame %d, Slot %d: Activating RA process \n", frameP, slotP); ra->state = Msg2; ra->timing_offset = timing_offset; @@ -514,6 +510,10 @@ void nr_initiate_ra_proc(module_id_t module_idP, ra->Msg2_slot = msg2_slot; LOG_I(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); + + // TODO: Configure RRC with the new RNTI of the following commented lines + /* + int loop = 0; if (!ra->cfra) { do { ra->rnti = (taus() % 65518) + 1; @@ -525,6 +525,8 @@ void nr_initiate_ra_proc(module_id_t module_idP, abort(); } } + */ + ra->RA_rnti = ra_rnti; ra->preamble_index = preamble_index; ra->beam_id = beam_index; From 9d72f65e9c7e692bd52a3c839e95b181dfb292a4 Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Tue, 23 Feb 2021 13:58:14 +0100 Subject: [PATCH 009/125] small fix --- openair1/PHY/TOOLS/nr_phy_scope.c | 11 +++++++---- openair1/PHY/defs_gNB.h | 2 +- targets/ARCH/rfsimulator/stored_node.c | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index cb61523852..d78e0ffaa2 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -38,10 +38,7 @@ int otg_enabled; const FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW}; const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED}; -typedef struct { - int16_t r; - int16_t i; -} scopeSample_t; +typedef struct complex16 scopeSample_t; #define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i) typedef struct OAIgraph { @@ -546,6 +543,12 @@ static void *scope_thread_gNB(void *arg) { pthread_attr_init(&atr); pthread_attr_getstacksize(&atr, &stksize); pthread_attr_setstacksize(&atr,32*1024*1024 ); + p.gNB->scopeData=calloc(sizeof(nrscope_t)); + nrscope_t scope=(nrscope_t*) p.gNB->scopeData; + scope->rxdataF=(int32_t **)malloc16(Prx*sizeof(int32_t*)); + for (int i=0; i < p.gNB->gNB_config.carrier_config.num_rx_ant.value; ; i++) + scope->rxdataF[i] = (scopeSample_t*)malloc16_clear(p->gNB.frme_parms.samples_per_frame_wCP*sizeof(scopeSample_t)); + sleep(3); // no clean interthread barriers int fl_argc=1; char *name="5G-gNB-scope"; diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index b7923adb0b..e0b9d2153e 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -833,7 +833,7 @@ typedef struct PHY_VARS_gNB_s { tpool_t *threadPool; int nbDecode; uint8_t pusch_proc_threads; - + void * scopeData; } PHY_VARS_gNB; typedef struct LDPCDecode_s { diff --git a/targets/ARCH/rfsimulator/stored_node.c b/targets/ARCH/rfsimulator/stored_node.c index dcea69b9dd..8b0b397995 100644 --- a/targets/ARCH/rfsimulator/stored_node.c +++ b/targets/ARCH/rfsimulator/stored_node.c @@ -186,14 +186,14 @@ int main(int argc, char *argv[]) { serviceSock=client_start(argv[2],atoi(argv[3])); } - uint64_t typeStamp=ENB_MAGICDL_FDD; + uint64_t typeStamp=ENB_MAGICDL; boolean_t raw=false; if ( argc == 5 ) { raw=true; if (strcmp(argv[4],"UL") == 0 ) - typeStamp=UE_MAGICDL_FDD; + typeStamp=UE_MAGICDL; } samplesBlockHeader_t header; From aacf75b298f4af192508bae10885c3444888f1a0 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 24 Feb 2021 02:54:53 +0000 Subject: [PATCH 010/125] Transmission and reception of a fake RA-Msg4 --- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 5 +- .../NR_MAC_UE/nr_ue_dci_configuration.c | 28 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 80 ++- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 635 +++++++++++++++++- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 19 + .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 9 +- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 15 + 7 files changed, 756 insertions(+), 35 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 61d63f0f5a..71b3502c1a 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -481,6 +481,7 @@ void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint // start contention resolution timer ra->RA_contention_resolution_cnt = (nr_rach_ConfigCommon->ra_ContentionResolutionTimer + 1) * 8; ra->RA_contention_resolution_timer_active = 1; + ra->ra_state = WAIT_CONTENTION_RESOLUTION; } @@ -536,7 +537,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, } } - if (prach_resources->init_msg1) { + if (prach_resources->init_msg1 && ra->ra_state != RA_SUCCEEDED) { if (ra->RA_active == 0) { /* RA not active - checking if RRC is ready to initiate the RA procedure */ @@ -625,7 +626,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, if (ra->RA_window_cnt >= 0 && ra->RA_RAPID_found == 1) { // Reset RA_active flag: it disables Msg3 retransmission (8.3 of TS 38.213) - nr_ra_succeeded(mod_id, frame, nr_slot_tx); + //nr_ra_succeeded(mod_id, frame, nr_slot_tx); } else if (ra->RA_window_cnt == 0 && !ra->RA_RAPID_found) { diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c index 11edc6c20d..6ada79a675 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c @@ -153,6 +153,16 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t case NR_RNTI_CS: break; case NR_RNTI_TC: + // we use the initial DL BWP + sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12; + monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps)); + rel15->rnti = ra->t_crnti; + //rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + //rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + rel15->BWPSize = NRRIV2BW(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing; + rel15->dci_length_options[0] = nr_dci_size(scc, mac->scg, def_dci_pdu_rel15, rel15->dci_format_options[0], NR_RNTI_TC, rel15->BWPSize, bwp_id); break; case NR_RNTI_SP_CSI: break; @@ -245,14 +255,18 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl if (ss->searchSpaceId == *pdcch_ConfigCommon->choice.setup->ra_SearchSpace){ switch(ra->ra_state){ case WAIT_RAR: - LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space\n"); - rel15->num_dci_options = 1; - rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; - config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id); - fill_dci_search_candidates(ss, rel15); - break; + LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg2)\n"); + rel15->num_dci_options = 1; + rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; + config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id); + fill_dci_search_candidates(ss, rel15); + break; case WAIT_CONTENTION_RESOLUTION: - LOG_E(MAC, "In %s: CB-RA not implemented yet. Should not have fallen in this case.\n", __FUNCTION__); + LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg4)\n"); + rel15->num_dci_options = 1; + rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; + config_dci_pdu(mac, rel15, dl_config, NR_RNTI_TC, ss_id); + fill_dci_search_candidates(ss, rel15); break; default: break; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 250cf856bc..a27ce36831 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -73,10 +73,10 @@ int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti){ if (rnti == ra->ra_rnti) { rnti_type = NR_RNTI_RA; + } else if (rnti == ra->t_crnti && ra->ra_state == WAIT_CONTENTION_RESOLUTION) { + rnti_type = NR_RNTI_TC; } else if (rnti == mac->crnti) { rnti_type = NR_RNTI_C; - } else if (rnti == ra->t_crnti) { - rnti_type = NR_RNTI_TC; } else if (rnti == 0xFFFE) { rnti_type = NR_RNTI_P; } else if (rnti == 0xFFFF) { @@ -515,9 +515,9 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr // Config PUSCH PDU ret = nr_config_pusch_pdu(mac, pusch_config_pdu, dci, NULL, rnti, &dci_format); - if (ret != -1 && ra->RA_active && mac->crnti){ - nr_ra_succeeded(module_id, frame, slot); - } + //if (ret != -1 && ra->RA_active && mac->crnti){ + // nr_ra_succeeded(module_id, frame, slot); + //} } @@ -578,9 +578,9 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr // Config PUSCH PDU ret = nr_config_pusch_pdu(mac, pusch_config_pdu, dci, NULL, rnti, &dci_format); - if (ret != -1 && ra->RA_active && mac->crnti){ - nr_ra_succeeded(module_id, frame, slot); - } + //if (ret != -1 && ra->RA_active && mac->crnti){ + // nr_ra_succeeded(module_id, frame, slot); + //} } @@ -661,6 +661,9 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing; BWPSize = n_RB_DLBWP; + + if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) + pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); } /* IDENTIFIER_DCI_FORMATS */ @@ -770,6 +773,13 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr LOG_D(MAC,"(nr_ue_procedures.c) pdu_type=%d\n\n",dl_config->dl_config_list[dl_config->number_pdus].pdu_type); dl_config->number_pdus = dl_config->number_pdus + 1; + + // FIXME: Remove this + if (ra->ra_state == WAIT_CONTENTION_RESOLUTION && rnti == ra->t_crnti){ + LOG_I(NR_MAC,"RA-Msg4 was received\n"); + nr_ra_succeeded(module_id, frame, slot); + } + break; } @@ -1105,7 +1115,6 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){ int N_RB = 0, start_RB; switch(rnti_type) { case NR_RNTI_RA: - case NR_RNTI_TC: case NR_RNTI_P: { NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; if (mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero) { @@ -1120,6 +1129,7 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){ case NR_RNTI_SI: N_RB = mac->type0_PDCCH_CSS_config.num_rbs; break; + case NR_RNTI_TC: case NR_RNTI_C: N_RB = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); break; @@ -1392,39 +1402,71 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, break; case NR_RNTI_TC: - // indicating a DL DCI format 1bit + + // indicating a DL DCI format - 1 bit pos++; dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1; + // Freq domain assignment 0-16 bit fsize = (int)ceil( log2( (N_RB*(N_RB+1))>>1 ) ); pos+=fsize; dci_pdu_rel15->frequency_domain_assignment.val = (*dci_pdu>>(dci_size-pos))&((1<time_domain_assignment.val = (*dci_pdu>>(dci_size-pos))&0xf; - // VRB to PRB mapping 1 bit + + // VRB to PRB mapping - 1 bit + pos++; dci_pdu_rel15->vrb_to_prb_mapping.val = (*dci_pdu>>(dci_size-pos))&1; + // MCS 5bit //bit over 32, so dci_pdu ++ pos+=5; dci_pdu_rel15->mcs = (*dci_pdu>>(dci_size-pos))&0x1f; - // New data indicator 1bit + + // New data indicator - 1 bit + pos++; dci_pdu_rel15->ndi = (*dci_pdu>>(dci_size-pos))&1; - // Redundancy version 2bit + + // Redundancy version - 2 bits pos+=2; dci_pdu_rel15->rv = (*dci_pdu>>(dci_size-pos))&3; - // HARQ process number 4bit + + // HARQ process number - 4 bits pos+=4; dci_pdu_rel15->harq_pid = (*dci_pdu>>(dci_size-pos))&0xf; - // Downlink assignment index  E2 bits + + // Downlink assignment index - 2 bits pos+=2; dci_pdu_rel15->dai[0].val = (*dci_pdu>>(dci_size-pos))&3; - // TPC command for scheduled PUCCH  E2 bits + + // TPC command for scheduled PUCCH - 2 bits pos+=2; dci_pdu_rel15->tpc = (*dci_pdu>>(dci_size-pos))&3; - // PDSCH-to-HARQ_feedback timing indicator  E3 bits + + // PUCCH resource indicator - 3 bits + pos+=3; + dci_pdu_rel15->pucch_resource_indicator = (*dci_pdu>>(dci_size-pos))&7; + + // PDSCH-to-HARQ_feedback timing indicator - 3 bits pos+=3; dci_pdu_rel15->pdsch_to_harq_feedback_timing_indicator.val = (*dci_pdu>>(dci_size-pos))&7; - + + LOG_D(NR_MAC,"N_RB = %i\n", N_RB); + LOG_D(NR_MAC,"dci_size = %i\n", dci_size); + LOG_D(NR_MAC,"fsize = %i\n", fsize); + LOG_D(NR_MAC,"dci_pdu_rel15->format_indicator = %i\n", dci_pdu_rel15->format_indicator); + LOG_D(NR_MAC,"dci_pdu_rel15->frequency_domain_assignment.val = %i\n", dci_pdu_rel15->frequency_domain_assignment.val); + LOG_D(NR_MAC,"dci_pdu_rel15->time_domain_assignment.val = %i\n", dci_pdu_rel15->time_domain_assignment.val); + LOG_D(NR_MAC,"dci_pdu_rel15->vrb_to_prb_mapping.val = %i\n", dci_pdu_rel15->vrb_to_prb_mapping.val); + LOG_D(NR_MAC,"dci_pdu_rel15->mcs = %i\n", dci_pdu_rel15->mcs); + LOG_D(NR_MAC,"dci_pdu_rel15->rv = %i\n", dci_pdu_rel15->rv); + LOG_D(NR_MAC,"dci_pdu_rel15->harq_pid = %i\n", dci_pdu_rel15->harq_pid); + LOG_D(NR_MAC,"dci_pdu_rel15->dai[0].val = %i\n", dci_pdu_rel15->dai[0].val); + LOG_D(NR_MAC,"dci_pdu_rel15->tpc = %i\n", dci_pdu_rel15->tpc); + LOG_D(NR_MAC,"dci_pdu_rel15->pucch_resource_indicator = %i\n", dci_pdu_rel15->pucch_resource_indicator); + LOG_D(NR_MAC,"dci_pdu_rel15->pdsch_to_harq_feedback_timing_indicator.val = %i\n", dci_pdu_rel15->pdsch_to_harq_feedback_timing_indicator.val); + break; } break; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 0b3492ccdc..e3c9d23c04 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -568,10 +568,10 @@ void nr_schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t slotP){ nr_generate_Msg2(module_idP, CC_id, frameP, slotP); break; case Msg4: - //generate_Msg4(module_idP, CC_id, frameP, slotP); + nr_generate_Msg4(module_idP, CC_id, frameP, slotP); break; case WAIT_Msg4_ACK: - //check_Msg4_retransmission(module_idP, CC_id, frameP, slotP); + nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP); break; default: break; @@ -1013,6 +1013,637 @@ void nr_generate_Msg2(module_id_t module_idP, } } +/*void nr_get_retransmission_timing(frame_t *frameP, sub_frame_t *subframeP) { + *frameP = (*frameP + 1) % 1024; + *subframeP = *subframeP; + return; +}*/ + +void nr_generate_Msg4(module_id_t module_idP, + int CC_id, + frame_t frameP, + sub_frame_t slotP) { + + gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; + NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; + NR_RA_t *ra = &cc->ra[0]; + + if (ra->Msg4_frame == frameP && ra->Msg4_slot == slotP ) { + + int mcsIndex = 0; + int startSymbolAndLength = 0; + int StartSymbolIndex = -1; + int NrOfSymbols = 14; + int StartSymbolIndex_tmp = 0; + int NrOfSymbols_tmp = 0; + int x_Overhead = 0; + int time_domain_assignment = 0; + long locationAndBandwidth = 0; + uint8_t nr_of_candidates = 0; + uint8_t aggregation_level = 0; + + NR_SearchSpace_t *ss = ra->ra_ss; + NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; + + // check if UE is doing RA on CORESET0 , InitialBWP or configured BWP from SCD + // get the BW of the PDCCH for PDCCH size and Msg4 PDSCH size + + NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + int dci10_bw; + + if (ra->coreset0_configured == 1) { + AssertFatal(1==0,"This is a standalone condition\n"); + } + else { // on configured BWP or initial LDBWP, bandwidth parameters in DCI correspond size of initialBWP + //locationAndBandwidth = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth; + locationAndBandwidth = bwp->bwp_Common->genericParameters.locationAndBandwidth; + dci10_bw = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE); + } + + nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; + // Checking if the DCI allocation is feasible in current subframe + if (dl_req->nPDUs > NFAPI_NR_MAX_DL_TTI_PDUS - 2) { + LOG_I(NR_MAC, "[RAPROC] Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", slotP, ra->rnti); + return; + } + + find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss); + NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0 /* common */); + int CCEIndex = allocate_nr_CCEs(nr_mac, + bwp, + coreset, + aggregation_level, + 0, + 0, + nr_of_candidates); + + if (CCEIndex < 0) { + LOG_E(NR_MAC, "%s(): cannot find free CCE for RNTI %04x!\n", __func__, ra->rnti); + return; + } + + nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; + + // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially + // important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them + const int bwpid = bwp->bwp_Id; + const int coresetid = coreset->controlResourceSetId; + nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid]; + if (!pdcch_pdu_rel15) { + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; + memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t)); + dl_tti_pdcch_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE; + dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu)); + dl_req->nPDUs += 1; + pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; + nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, bwp); + nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15; + } + + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; + memset((void *)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); + dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE; + dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdsch_pdu)); + dl_req->nPDUs+=1; + nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; + + LOG_I(NR_MAC,"[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state); + + // This code from this point on will not work on initialBWP or CORESET0 + AssertFatal(ra->bwp_id>0,"cannot work on initialBWP for now\n"); + AssertFatal(ra->secondaryCellGroup, "no secondaryCellGroup for RNTI %04x\n", ra->rnti); + + AssertFatal(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, + "downlinkBWP_ToAddModList has %d BWP!\n", + ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); + + LOG_I(NR_MAC, "[RAPROC] Scheduling common search space DCI type 1 dlBWP BW %d\n", dci10_bw); + + pdsch_pdu_rel15->pduBitmap = 0; + pdsch_pdu_rel15->rnti = ra->rnti; + + // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control + // information to data and is reset every slot. + const int pduindex = nr_mac->pdu_index[CC_id]++; + pdsch_pdu_rel15->pduIndex = pduindex; + + pdsch_pdu_rel15->BWPSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; + pdsch_pdu_rel15->CyclicPrefix = 0; + pdsch_pdu_rel15->NrOfCodewords = 1; + pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,0); + pdsch_pdu_rel15->qamModOrder[0] = 2; + pdsch_pdu_rel15->mcsIndex[0] = mcsIndex; + + if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) { + pdsch_pdu_rel15->mcsTable[0] = 0; + } else { + if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) { + pdsch_pdu_rel15->mcsTable[0] = 1; + } else { + pdsch_pdu_rel15->mcsTable[0] = 2; + } + } + + pdsch_pdu_rel15->rvIndex[0] = 0; + pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; + pdsch_pdu_rel15->nrOfLayers = 1; + pdsch_pdu_rel15->transmissionScheme = 0; + pdsch_pdu_rel15->refPoint = 0; + pdsch_pdu_rel15->dmrsConfigType = 0; + pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; + pdsch_pdu_rel15->SCID = 0; + pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2; + pdsch_pdu_rel15->dmrsPorts = 1; + pdsch_pdu_rel15->resourceAlloc = 1; + pdsch_pdu_rel15->rbStart = 0; + pdsch_pdu_rel15->rbSize = 6; + pdsch_pdu_rel15->VRBtoPRBMapping = 0; + + for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { + startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; + SLIV2SL(startSymbolAndLength, &StartSymbolIndex_tmp, &NrOfSymbols_tmp); + if (NrOfSymbols_tmp < NrOfSymbols) { + NrOfSymbols = NrOfSymbols_tmp; + StartSymbolIndex = StartSymbolIndex_tmp; + time_domain_assignment = i; // this is short PDSCH added to the config to fit mixed slot + } + } + + AssertFatal(StartSymbolIndex >= 0, "StartSymbolIndex is negative\n"); + + pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; + pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; + pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols); + + // Fill PDCCH DL DCI PDU + nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; + pdcch_pdu_rel15->numDlDci++; + dci_pdu->RNTI = ra->rnti; + dci_pdu->ScramblingId = *scc->physCellId; + dci_pdu->ScramblingRNTI = 0; + dci_pdu->AggregationLevel = aggregation_level; + dci_pdu->CceIndex = CCEIndex; + dci_pdu->beta_PDCCH_1_0 = 0; + dci_pdu->powerControlOffsetSS = 1; + + dci_pdu_rel15_t dci_payload; + dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize, + pdsch_pdu_rel15->rbStart, + dci10_bw); + dci_payload.time_domain_assignment.val = time_domain_assignment; + dci_payload.vrb_to_prb_mapping.val = 0; + dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0]; + dci_payload.tb_scaling = 0; + + LOG_I(NR_MAC, + "[RAPROC] DCI type 1 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d \n", + dci_payload.frequency_domain_assignment.val, + pdsch_pdu_rel15->rbStart, + pdsch_pdu_rel15->rbSize, + dci10_bw, + dci_payload.time_domain_assignment.val, + dci_payload.vrb_to_prb_mapping.val, + dci_payload.mcs, + dci_payload.tb_scaling); + + LOG_I(NR_MAC, "Frame %d: Subframe %d : Adding common DL DCI for RNTI %x\n", frameP, slotP, ra->rnti); + + const int dci_format = NR_DL_DCI_FORMAT_1_0; + const int rnti_type = NR_RNTI_TC; + + LOG_I(NR_MAC, + "[RAPROC] DCI params: rnti 0x%x, rnti_type %d, dci_format %d coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d\n", + pdcch_pdu_rel15->dci_pdu[0].RNTI, + rnti_type, + dci_format, + (unsigned long long)pdcch_pdu_rel15->FreqDomainResource, + pdcch_pdu_rel15->StartSymbolIndex, + pdcch_pdu_rel15->DurationSymbols); + + fill_dci_pdu_rel15(scc, + ra->secondaryCellGroup, + dci_pdu, + &dci_payload, + dci_format, + rnti_type, + dci10_bw, + ra->bwp_id); + + x_Overhead = 0; + nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); + + uint8_t payload[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; + + // DL TX request + tx_req->PDU_length = pdsch_pdu_rel15->TBSize[0]; + tx_req->PDU_index = pduindex; + tx_req->num_TLV = 1; + tx_req->TLVs[0].length = 8; + nr_mac->TX_req[CC_id].SFN = frameP; + nr_mac->TX_req[CC_id].Number_of_PDUs++; + nr_mac->TX_req[CC_id].Slot = slotP; + memcpy(tx_req->TLVs[0].value.direct, payload, tx_req->TLVs[0].length); + + // mark the corresponding RBs as used + uint16_t *vrb_map = cc[CC_id].vrb_map; + for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) { + vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1; + } + + ra->state = WAIT_Msg4_ACK; +/* + // PREPROCESSOR + NR_UE_info_t *UE_info = &nr_mac->UE_info; + + int16_t rrc_sdu_length = 0; + uint16_t msg4_padding = 0; + uint16_t msg4_post_padding = 0; + uint16_t msg4_header = 0; + + int UE_id = find_nr_UE_id(module_id, ra->rnti); + + if (UE_id < 0) { + LOG_E(NR_MAC, "Can't find UE for t-crnti %x, kill RA procedure for this UE\n", ra->rnti); + nr_clear_ra_proc(module_id, CC_id, frame); + return; + } + + nr_mac->pre_processor_dl(module_id, frame, slot); + + NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + + // POST processing + struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = + sched_ctrl->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; + AssertFatal(sched_ctrl->time_domain_allocation < tdaList->list.count, + "time_domain_allocation %d>=%d\n", + sched_ctrl->time_domain_allocation, + tdaList->list.count); + + const int startSymbolAndLength = tdaList->list.array[sched_ctrl->time_domain_allocation]->startSymbolAndLength; + + int startSymbolIndex; + int nrOfSymbols; + SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); + + long dmrsConfigType = sched_ctrl->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; + uint8_t N_PRB_DMRS = 0; + if (dmrsConfigType==NFAPI_NR_DMRS_TYPE1) { + N_PRB_DMRS = sched_ctrl->numDmrsCdmGrpsNoData * 6; + } + else { + N_PRB_DMRS = sched_ctrl->numDmrsCdmGrpsNoData * 4; + } + + uint8_t N_DMRS_SLOT = get_num_dmrs_symbols(NULL, + RC.nrmac[module_id]->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position , + nrOfSymbols); + + sched_ctrl->rbSize = 4; + const uint32_t TBS = nr_compute_tbs(nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), + nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), + sched_ctrl->rbSize, + nrOfSymbols, + N_PRB_DMRS * N_DMRS_SLOT, + 0, + 0, + 1) >> 3; + + NR_UE_harq_t *harq = &sched_ctrl->harq_processes[sched_ctrl->dl_harq_pid]; + NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[0]; + harq->feedback_slot = pucch->ul_slot; + harq->is_waiting = 1; + UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++; + ra->harq_pid = sched_ctrl->dl_harq_pid; + LOG_I(NR_MAC, "%4d.%2d RNTI %04x start %d RBS %d MCS %d TBS %d HARQ PID %d round %d NDI %d, feedback slot %d, iswaiting %d\n", + frame, slot, ra->rnti, sched_ctrl->rbStart, sched_ctrl->rbSize, sched_ctrl->mcs, + TBS, sched_ctrl->dl_harq_pid, harq->round, harq->ndi, harq->feedback_slot, harq->is_waiting); + + nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; + + NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; + memset((void*)dl_tti_pdcch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); + dl_tti_pdcch_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE; + dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu)); + dl_req->nPDUs += 1; + nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; + nr_configure_pdcch(pdcch_pdu_rel15, + sched_ctrl->search_space, + sched_ctrl->coreset, + scc, + sched_ctrl->active_bwp); + + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; + memset((void*)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); + dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE; + dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdsch_pdu)); + dl_req->nPDUs += 1; + nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; + + pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; + + pdsch_pdu_rel15->pduBitmap = 0; + pdsch_pdu_rel15->rnti = ra->rnti; + pdsch_pdu_rel15->pduIndex = nr_mac->pdu_index[0]++; + + pdsch_pdu_rel15->BWPSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); + pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); + + pdsch_pdu_rel15->SubcarrierSpacing = sched_ctrl->active_bwp->bwp_Common->genericParameters.subcarrierSpacing; + if (sched_ctrl->active_bwp->bwp_Common->genericParameters.cyclicPrefix) { + pdsch_pdu_rel15->CyclicPrefix = *sched_ctrl->active_bwp->bwp_Common->genericParameters.cyclicPrefix; + } else { + pdsch_pdu_rel15->CyclicPrefix = 0; + } + + pdsch_pdu_rel15->NrOfCodewords = 1; + pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(sched_ctrl->mcs,0); + pdsch_pdu_rel15->qamModOrder[0] = 2; + pdsch_pdu_rel15->mcsIndex[0] = sched_ctrl->mcs; + pdsch_pdu_rel15->mcsTable[0] = 0; + pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[0]; + pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; + pdsch_pdu_rel15->nrOfLayers = 1; + pdsch_pdu_rel15->transmissionScheme = 0; + pdsch_pdu_rel15->refPoint = 1; + pdsch_pdu_rel15->dmrsConfigType = dmrsConfigType; + pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; + pdsch_pdu_rel15->SCID = 0; + pdsch_pdu_rel15->numDmrsCdmGrpsNoData = sched_ctrl->numDmrsCdmGrpsNoData; + pdsch_pdu_rel15->dmrsPorts = 1; + pdsch_pdu_rel15->resourceAlloc = 1; + pdsch_pdu_rel15->rbStart = sched_ctrl->rbStart; + pdsch_pdu_rel15->rbSize = sched_ctrl->rbSize; + pdsch_pdu_rel15->VRBtoPRBMapping = 0; + pdsch_pdu_rel15->qamModOrder[0] = nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx); + pdsch_pdu_rel15->TBSize[0] = TBS; + pdsch_pdu_rel15->mcsTable[0] = sched_ctrl->mcsTableIdx; + pdsch_pdu_rel15->StartSymbolIndex = startSymbolIndex; + pdsch_pdu_rel15->NrOfSymbols = nrOfSymbols; + + pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(sched_ctrl->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, scc->dmrs_TypeA_Position, pdsch_pdu_rel15->StartSymbolIndex+pdsch_pdu_rel15->NrOfSymbols); + + LOG_D(NR_MAC,"dlDmrsSymbPos = 0x%x\n", pdsch_pdu_rel15->dlDmrsSymbPos); + + // Fill PDCCH DL DCI PDU + nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; + pdcch_pdu_rel15->numDlDci++; + dci_pdu->RNTI = ra->rnti; + dci_pdu->ScramblingId = *scc->physCellId; + dci_pdu->ScramblingRNTI = 0; + dci_pdu->AggregationLevel = sched_ctrl->aggregation_level; + dci_pdu->CceIndex = sched_ctrl->cce_index; + dci_pdu->beta_PDCCH_1_0 = 0; + dci_pdu->powerControlOffsetSS = 1; + + // DCI payload + dci_pdu_rel15_t dci_payload; + memset(&dci_payload, 0, sizeof(dci_pdu_rel15_t)); + + dci_payload.bwp_indicator.val = sched_ctrl->active_bwp->bwp_Id; + + // frequency domain assignment + dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0( + pdsch_pdu_rel15->rbSize, pdsch_pdu_rel15->rbStart, pdsch_pdu_rel15->BWPSize); + + dci_payload.time_domain_assignment.val = sched_ctrl->time_domain_allocation; + dci_payload.mcs = sched_ctrl->mcs; + dci_payload.rv = pdsch_pdu_rel15->rvIndex[0]; + dci_payload.harq_pid = 0; + dci_payload.ndi = 0; + dci_payload.dai[0].val = 0; + dci_payload.tpc = 0; // table 7.2.1-1 in 38.213 + dci_payload.pucch_resource_indicator = 0; + dci_payload.pdsch_to_harq_feedback_timing_indicator.val = 0; + dci_payload.antenna_ports.val = 0; + dci_payload.dmrs_sequence_initialization.val = pdsch_pdu_rel15->SCID; + + fill_dci_pdu_rel15(scc, + ra->secondaryCellGroup, + &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1], + &dci_payload, + NR_DL_DCI_FORMAT_1_0, + NR_RNTI_TC, + pdsch_pdu_rel15->BWPSize, + sched_ctrl->active_bwp->bwp_Id); + + LOG_D(NR_MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize); + LOG_D(NR_MAC,"BWPStart: %i\n", pdcch_pdu_rel15->BWPStart); + LOG_D(NR_MAC,"SubcarrierSpacing: %i\n", pdcch_pdu_rel15->SubcarrierSpacing); + LOG_D(NR_MAC,"CyclicPrefix: %i\n", pdcch_pdu_rel15->CyclicPrefix); + LOG_D(NR_MAC,"StartSymbolIndex: %i\n", pdcch_pdu_rel15->StartSymbolIndex); + LOG_D(NR_MAC,"DurationSymbols: %i\n", pdcch_pdu_rel15->DurationSymbols); + for(int n=0;n<6;n++) LOG_D(NR_MAC,"FreqDomainResource[%i]: %x\n",n, pdcch_pdu_rel15->FreqDomainResource[n]); + LOG_D(NR_MAC,"CceRegMappingType: %i\n", pdcch_pdu_rel15->CceRegMappingType); + LOG_D(NR_MAC,"RegBundleSize: %i\n", pdcch_pdu_rel15->RegBundleSize); + LOG_D(NR_MAC,"InterleaverSize: %i\n", pdcch_pdu_rel15->InterleaverSize); + LOG_D(NR_MAC,"CoreSetType: %i\n", pdcch_pdu_rel15->CoreSetType); + LOG_D(NR_MAC,"ShiftIndex: %i\n", pdcch_pdu_rel15->ShiftIndex); + LOG_D(NR_MAC,"precoderGranularity: %i\n", pdcch_pdu_rel15->precoderGranularity); + LOG_D(NR_MAC,"numDlDci: %i\n", pdcch_pdu_rel15->numDlDci); + + NR_UE_ret_info_t *retInfo = &sched_ctrl->retInfo[sched_ctrl->dl_harq_pid]; + if (harq->round != 0) { // retransmission + if (sched_ctrl->rbSize != retInfo->rbSize) + LOG_W(NR_MAC, + "retransmission uses different rbSize (%d vs. orig %d)\n", + sched_ctrl->rbSize, + retInfo->rbSize); + if (sched_ctrl->time_domain_allocation != retInfo->time_domain_allocation) + LOG_W(NR_MAC, + "retransmission uses different time_domain_allocation (%d vs. orig %d)\n", + sched_ctrl->time_domain_allocation, + retInfo->time_domain_allocation); + if (sched_ctrl->mcs != retInfo->mcs + || sched_ctrl->mcsTableIdx != retInfo->mcsTableIdx + || sched_ctrl->numDmrsCdmGrpsNoData != retInfo->numDmrsCdmGrpsNoData) + LOG_W(NR_MAC, + "retransmission uses different table/MCS/numDmrsCdmGrpsNoData (%d/%d/%d vs. orig %d/%d/%d)\n", + sched_ctrl->mcsTableIdx, + sched_ctrl->mcs, + sched_ctrl->numDmrsCdmGrpsNoData, + retInfo->mcsTableIdx, + retInfo->mcs, + retInfo->numDmrsCdmGrpsNoData); + // we do not have to do anything, since we do not require to get data + // from RLC, encode MAC CEs, or copy data to FAPI structures + LOG_W(NR_MAC, "%d.%2d retransmission UE %d/RNTI %04x\n", frame, slot, UE_id, ra->rnti); + LOG_W(NR_MAC, + "%d.%2d DL retransmission UE %d/RNTI %04x HARQ PID %d round %d NDI %d\n", + frame, + slot, + UE_id, + ra->rnti, + sched_ctrl->dl_harq_pid, + harq->round, + harq->ndi); + } else { // initial transmission + LOG_D(NR_MAC, "[%s] Initial HARQ transmission in %d.%d\n", __FUNCTION__, frame, slot); + // reserve space for timing advance of UE if necessary, + // nr_generate_dlsch_pdu() checks for ta_apply and add TA CE if necessary + const int cont_res_len = 1 + 6; + const int ta_len = (sched_ctrl->ta_apply) ? 2 : 0; + + // Get RLC data TODO: remove random data retrieval + int header_length_total = 0; + int header_length_last = 0; + int sdu_length_total = 0; + int num_sdus = 0; + uint16_t sdu_lengths[NB_RB_MAX] = {0}; + uint8_t mac_sdus[MAX_NR_DLSCH_PAYLOAD_BYTES]; + unsigned char sdu_lcids[NB_RB_MAX] = {0}; + const int lcid = DL_SCH_LCID_CCCH; + if (sched_ctrl->num_total_bytes > 0) { + LOG_I(NR_MAC, + "[gNB %d][MSG4] Frame %d : CCCH->DLSCH, Requesting " + "%d bytes from RLC (lcid %d total hdr len %d), TBS: %d \n \n", + module_id, + frame, + TBS - ta_len - header_length_total - sdu_length_total - 3, + lcid, + header_length_total, + TBS); +#if 0 + // sdu_lengths[num_sdus] = mac_rrc_data_req(module_id, CC_idP, frameP, CCCH, + // UE_RNTI(module_idP,UE_id),1, // 1 transport block + // &cc[CC_idP].CCCH_pdu.payload[0], 1); + sdu_lengths[num_sdus] = mac_rrc_nr_data_req(module_id, CC_id, frame, CCCH, ra->rnti, 1, // 1 transport block + mac_sdus); + + LOG_D(MAC, + "[gNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n", + module_id, + sdu_lengths[num_sdus], + lcid); + + sdu_lcids[num_sdus] = lcid; + sdu_length_total += sdu_lengths[num_sdus]; + header_length_last = 1 + 1 + (sdu_lengths[num_sdus] >= 128); + header_length_total += header_length_last; + + num_sdus++; +#else + LOG_I(NR_MAC, "Configuring DL_TX in %d.%d: random data\n", frame, slot); + // fill dlsch_buffer with random data + sdu_lcids[0] = lcid; // DRB + sdu_lengths[0] = 500; + for (int i = 0; i < sdu_lengths[0]; i++) + mac_sdus[i] = (unsigned char) (lrand48()&0xff); + sdu_length_total += sdu_lengths[0]; + header_length_total += 2 + (sdu_lengths[0] >= 128); + num_sdus +=1; +#endif + //ue_sched_ctl->uplane_inactivity_timer = 0; + } + + UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS; + UE_info->mac_stats[UE_id].lc_bytes_tx[lcid] += sdu_length_total; + + // Check if there is data from RLC or CE + const int post_padding = TBS > header_length_total + sdu_length_total + cont_res_len; + + LOG_I(NR_MAC, "Configuring DL_TX in %d.%d: TBS %d, header_length_total %d, sdu_length_total %d,cont_res_len %d, post_padding %d \n", frame, slot, + TBS , header_length_total , sdu_length_total ,cont_res_len , post_padding ); + // padding param currently not in use + //padding = TBS - header_length_total - sdu_length_total - ta_len - 1; + + const int ntx_req = nr_mac->TX_req[CC_id].Number_of_PDUs; + nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[ntx_req]; + // pointer to directly generate the PDU into the nFAPI structure + uint32_t *buf = tx_req->TLVs[0].value.direct; + + const int offset = nr_write_ce_dlsch_pdu(module_id, + sched_ctrl, + (unsigned char *)buf, + 255, // no drx + ra->cont_res_id); + + // Padding: fill remainder of DLSCH with 0 + if (post_padding > 0) { + for (int j = 0; j < TBS - offset; j++) + buf[offset + j] = 0; + } + + // the buffer has been filled by nr_generate_dlsch_pdu(), below we simply + //fill the remaining information + tx_req->PDU_length = TBS; + tx_req->PDU_index = nr_mac->pdu_index[0]++; + tx_req->num_TLV = 1; + tx_req->TLVs[0].length = TBS + 2; + nr_mac->TX_req[CC_id].Number_of_PDUs++; + nr_mac->TX_req[CC_id].SFN = frame; + nr_mac->TX_req[CC_id].Slot = slot; + + retInfo->rbSize = sched_ctrl->rbSize; + retInfo->time_domain_allocation = sched_ctrl->time_domain_allocation; + retInfo->mcsTableIdx = sched_ctrl->mcsTableIdx; + retInfo->mcs = sched_ctrl->mcs; + retInfo->numDmrsCdmGrpsNoData = sched_ctrl->numDmrsCdmGrpsNoData; + +#if defined(ENABLE_MAC_PAYLOAD_DEBUG) + if (frame%100 == 0) { + LOG_I(MAC, + "%d.%d, first 10 payload bytes, TBS size: %d \n", + frame, + slot, + TBS); + for(int i = 0; i < 10; i++) + LOG_I(MAC, "byte %d: %x\n", i, ((uint8_t *) buf)[i]); + } +#endif + } + + nr_get_retransmission_timing(&ra->Msg4_frame, &ra->Msg4_slot); + ra->state = WAIT_Msg4_ACK; + LOG_I(NR_MAC, "Retransmission time for Msg4 is %d %d\n", ra->Msg4_frame, ra->Msg4_slot); + */ + } +} + +void nr_check_Msg4_Ack(module_id_t module_id, + int CC_id, + frame_t frame, + sub_frame_t slot) { + + LOG_W(NR_MAC,"nr_check_Msg4_Ack() is not implemented yet!\n"); + + gNB_MAC_INST *nr_mac = RC.nrmac[module_id]; + NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; + NR_RA_t *ra = &cc->ra[0]; + + ra->state = RA_IDLE; + + + /* + NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; + int UE_id = find_nr_UE_id_msg4(module_id, ra->rnti); + NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + const int current_harq_pid = ra->harq_pid; + NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid]; + + LOG_D(MAC, "ue %d, rnti %d, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid); + + if (harq->is_waiting == 0) + { + if ( harq->round == 0) + { + ra->state = IDLE; + UE_info->active[UE_id] = true; + free(ra->preambles.preamble_list); + LOG_I(MAC, "ue %d, rnti %d is active, frame %d %d\n", UE_id, ra->rnti, frame, slot); + } + else + { + ra->state = Msg4; + } + } + */ +} + void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP){ NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[0]; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 20da8fa30a..f2c75acd22 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -1131,6 +1131,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc, break; case NR_RNTI_TC: + pos = 1; // indicating a DL DCI format 1bit *dci_pdu |= ((uint64_t)dci_pdu_rel15->format_indicator & 1) << (dci_size - pos++); // Freq domain assignment 0-16 bit @@ -1159,9 +1160,27 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc, // TPC command for scheduled PUCCH – 2 bits for (int i = 0; i < 2; i++) *dci_pdu |= (((uint64_t)dci_pdu_rel15->tpc >> (1 - i)) & 1) << (dci_size - pos++); + // PUCCH resource indicator – 3 bits + for (int i = 0; i < 3; i++) + *dci_pdu |= (((uint64_t)dci_pdu_rel15->pucch_resource_indicator >> (2 - i)) & 1) << (dci_size - pos++); // PDSCH-to-HARQ_feedback timing indicator – 3 bits for (int i = 0; i < 3; i++) *dci_pdu |= (((uint64_t)dci_pdu_rel15->pdsch_to_harq_feedback_timing_indicator.val >> (2 - i)) & 1) << (dci_size - pos++); + + LOG_D(NR_MAC,"N_RB = %i\n", N_RB); + LOG_D(NR_MAC,"dci_size = %i\n", dci_size); + LOG_D(NR_MAC,"fsize = %i\n", fsize); + LOG_D(NR_MAC,"dci_pdu_rel15->format_indicator = %i\n", dci_pdu_rel15->format_indicator); + LOG_D(NR_MAC,"dci_pdu_rel15->frequency_domain_assignment.val = %i\n", dci_pdu_rel15->frequency_domain_assignment.val); + LOG_D(NR_MAC,"dci_pdu_rel15->time_domain_assignment.val = %i\n", dci_pdu_rel15->time_domain_assignment.val); + LOG_D(NR_MAC,"dci_pdu_rel15->vrb_to_prb_mapping.val = %i\n", dci_pdu_rel15->vrb_to_prb_mapping.val); + LOG_D(NR_MAC,"dci_pdu_rel15->mcs = %i\n", dci_pdu_rel15->mcs); + LOG_D(NR_MAC,"dci_pdu_rel15->rv = %i\n", dci_pdu_rel15->rv); + LOG_D(NR_MAC,"dci_pdu_rel15->harq_pid = %i\n", dci_pdu_rel15->harq_pid); + LOG_D(NR_MAC,"dci_pdu_rel15->dai[0].val = %i\n", dci_pdu_rel15->dai[0].val); + LOG_D(NR_MAC,"dci_pdu_rel15->tpc = %i\n", dci_pdu_rel15->tpc); + LOG_D(NR_MAC,"dci_pdu_rel15->pdsch_to_harq_feedback_timing_indicator.val = %i\n", dci_pdu_rel15->pdsch_to_harq_feedback_timing_indicator.val); + break; } break; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 1e2f341192..0ac10c90d5 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -490,12 +490,11 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; free(ra->preambles.preamble_list); - ra->state = RA_IDLE; - LOG_I(NR_MAC, - "reset RA state information for RA-RNTI %04x/index %d\n", - ra->rnti, - i); + ra->state = Msg4; + ra->Msg4_frame = ( frameP +2 ) % 1024; + ra->Msg4_slot = 1; + LOG_I(MAC, "set RA state to Msg4 for RA-RNTI %04x, msg4 frame %d %d\n", ra->rnti, ra->Msg4_frame, ra->Msg4_slot); return; } } diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 4b0f2eed2b..d0131e5cb2 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -347,12 +347,27 @@ void config_nr_mib(int Mod_idP, int cellBarred, int intraFreqReselection); +int nr_write_ce_dlsch_pdu(module_id_t module_idP, + const NR_UE_sched_ctrl_t *ue_sched_ctl, + unsigned char *mac_pdu, + unsigned char drx_cmd, + unsigned char *ue_cont_res_id); void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP); +void nr_generate_Msg4(module_id_t module_idP, + int CC_id, + frame_t frameP, + sub_frame_t slotP); + +void nr_check_Msg4_Ack(module_id_t module_id, + int CC_id, + frame_t frame, + sub_frame_t slot); + void nr_process_mac_pdu( module_id_t module_idP, rnti_t rnti, From 2060cf45bb3f1d747fa35b53c2d0e53c614d39e0 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 24 Feb 2021 18:49:00 +0000 Subject: [PATCH 011/125] Fix RA-Msg4 to Initial BWP --- openair1/PHY/NR_TRANSPORT/nr_dci.c | 2 + .../NR_MAC_UE/nr_ue_dci_configuration.c | 14 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 19 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 458 ++---------------- 4 files changed, 60 insertions(+), 433 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index 469415908f..61238ae647 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -88,6 +88,8 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, cset_start_sc = frame_parms.first_carrier_offset + rb_offset*NR_NB_SC_PER_RB; if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_MIB_SIB1) { cset_start_sc = cset_start_sc + RC.nrmac[gNB->Mod_id]->type0_PDCCH_CSS_config.cset_start_rb*NR_NB_SC_PER_RB; + } else if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0) { + cset_start_sc = cset_start_sc + pdcch_pdu_rel15->BWPStart*NR_NB_SC_PER_RB; } for (int d=0;dnumDlDci;d++) { diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c index 6ada79a675..1e1f4b311c 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c @@ -88,7 +88,11 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t } else { ss = mac->search_space_zero; coreset = mac->coreset0; - rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_MIB_SIB1; + if(rnti_type == NR_RNTI_SI) { + rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_MIB_SIB1; + } else { + rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0; + } } rel15->coreset.duration = coreset->duration; @@ -157,10 +161,8 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12; monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps)); rel15->rnti = ra->t_crnti; - //rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - //rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - rel15->BWPSize = NRRIV2BW(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing; rel15->dci_length_options[0] = nr_dci_size(scc, mac->scg, def_dci_pdu_rel15, rel15->dci_format_options[0], NR_RNTI_TC, rel15->BWPSize, bwp_id); break; @@ -265,7 +267,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg4)\n"); rel15->num_dci_options = 1; rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; - config_dci_pdu(mac, rel15, dl_config, NR_RNTI_TC, ss_id); + config_dci_pdu(mac, rel15, dl_config, NR_RNTI_TC, -1); fill_dci_search_candidates(ss, rel15); break; default: diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index a27ce36831..18ad62cf39 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -469,7 +469,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr AssertFatal(mac->DLbwp[0]!=NULL,"DLbwp[0] should not be zero here!\n"); AssertFatal(mac->ULbwp[0]!=NULL,"DLbwp[0] should not be zero here!\n"); - const uint16_t n_RB_DLBWP = (ra->ra_state == WAIT_RAR) ? NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) : NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + const uint16_t n_RB_DLBWP = (ra->ra_state == WAIT_RAR || ra->ra_state == WAIT_CONTENTION_RESOLUTION) ? NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) : NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); LOG_D(MAC, "In %s: Processing received DCI format %s (DL BWP %d)\n", __FUNCTION__, dci_formats[dci_format], n_RB_DLBWP); @@ -657,13 +657,20 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr } else { dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH; } - dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing; - BWPSize = n_RB_DLBWP; + + if(rnti == ra->t_crnti) { + dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + } else { + dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing; + } if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); + + BWPSize = n_RB_DLBWP; } /* IDENTIFIER_DCI_FORMATS */ @@ -1115,6 +1122,7 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){ int N_RB = 0, start_RB; switch(rnti_type) { case NR_RNTI_RA: + case NR_RNTI_TC: case NR_RNTI_P: { NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; if (mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero) { @@ -1129,7 +1137,6 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){ case NR_RNTI_SI: N_RB = mac->type0_PDCCH_CSS_config.num_rbs; break; - case NR_RNTI_TC: case NR_RNTI_C: N_RB = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); break; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index e3c9d23c04..284243b69c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1013,12 +1013,6 @@ void nr_generate_Msg2(module_id_t module_idP, } } -/*void nr_get_retransmission_timing(frame_t *frameP, sub_frame_t *subframeP) { - *frameP = (*frameP + 1) % 1024; - *subframeP = *subframeP; - return; -}*/ - void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, @@ -1038,29 +1032,16 @@ void nr_generate_Msg4(module_id_t module_idP, int NrOfSymbols_tmp = 0; int x_Overhead = 0; int time_domain_assignment = 0; - long locationAndBandwidth = 0; uint8_t nr_of_candidates = 0; uint8_t aggregation_level = 0; - NR_SearchSpace_t *ss = ra->ra_ss; - NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; - - // check if UE is doing RA on CORESET0 , InitialBWP or configured BWP from SCD - // get the BW of the PDCCH for PDCCH size and Msg4 PDSCH size - + NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; + NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; + NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; - int dci10_bw; - - if (ra->coreset0_configured == 1) { - AssertFatal(1==0,"This is a standalone condition\n"); - } - else { // on configured BWP or initial LDBWP, bandwidth parameters in DCI correspond size of initialBWP - //locationAndBandwidth = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth; - locationAndBandwidth = bwp->bwp_Common->genericParameters.locationAndBandwidth; - dci10_bw = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE); - } nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; + // Checking if the DCI allocation is feasible in current subframe if (dl_req->nPDUs > NFAPI_NR_MAX_DL_TTI_PDUS - 2) { LOG_I(NR_MAC, "[RAPROC] Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", slotP, ra->rnti); @@ -1068,7 +1049,6 @@ void nr_generate_Msg4(module_id_t module_idP, } find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss); - NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0 /* common */); int CCEIndex = allocate_nr_CCEs(nr_mac, bwp, coreset, @@ -1100,6 +1080,9 @@ void nr_generate_Msg4(module_id_t module_idP, nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15; } + // TODO: This assignment should be done in function nr_configure_pdcch() + pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0; + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset((void *)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE; @@ -1117,8 +1100,6 @@ void nr_generate_Msg4(module_id_t module_idP, "downlinkBWP_ToAddModList has %d BWP!\n", ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); - LOG_I(NR_MAC, "[RAPROC] Scheduling common search space DCI type 1 dlBWP BW %d\n", dci10_bw); - pdsch_pdu_rel15->pduBitmap = 0; pdsch_pdu_rel15->rnti = ra->rnti; @@ -1126,9 +1107,8 @@ void nr_generate_Msg4(module_id_t module_idP, // information to data and is reset every slot. const int pduindex = nr_mac->pdu_index[CC_id]++; pdsch_pdu_rel15->pduIndex = pduindex; - - pdsch_pdu_rel15->BWPSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_pdu_rel15->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; @@ -1151,7 +1131,7 @@ void nr_generate_Msg4(module_id_t module_idP, pdsch_pdu_rel15->nrOfLayers = 1; pdsch_pdu_rel15->transmissionScheme = 0; pdsch_pdu_rel15->refPoint = 0; - pdsch_pdu_rel15->dmrsConfigType = 0; + pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; pdsch_pdu_rel15->SCID = 0; pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2; @@ -1191,45 +1171,41 @@ void nr_generate_Msg4(module_id_t module_idP, dci_pdu_rel15_t dci_payload; dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize, pdsch_pdu_rel15->rbStart, - dci10_bw); + pdsch_pdu_rel15->BWPSize); + dci_payload.time_domain_assignment.val = time_domain_assignment; dci_payload.vrb_to_prb_mapping.val = 0; dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0]; dci_payload.tb_scaling = 0; - LOG_I(NR_MAC, + LOG_D(NR_MAC, "[RAPROC] DCI type 1 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d \n", dci_payload.frequency_domain_assignment.val, pdsch_pdu_rel15->rbStart, pdsch_pdu_rel15->rbSize, - dci10_bw, + pdsch_pdu_rel15->BWPSize, dci_payload.time_domain_assignment.val, dci_payload.vrb_to_prb_mapping.val, dci_payload.mcs, dci_payload.tb_scaling); - LOG_I(NR_MAC, "Frame %d: Subframe %d : Adding common DL DCI for RNTI %x\n", frameP, slotP, ra->rnti); - - const int dci_format = NR_DL_DCI_FORMAT_1_0; - const int rnti_type = NR_RNTI_TC; - - LOG_I(NR_MAC, + LOG_D(NR_MAC, "[RAPROC] DCI params: rnti 0x%x, rnti_type %d, dci_format %d coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d\n", pdcch_pdu_rel15->dci_pdu[0].RNTI, - rnti_type, - dci_format, + NR_RNTI_TC, + NR_DL_DCI_FORMAT_1_0, (unsigned long long)pdcch_pdu_rel15->FreqDomainResource, pdcch_pdu_rel15->StartSymbolIndex, pdcch_pdu_rel15->DurationSymbols); fill_dci_pdu_rel15(scc, - ra->secondaryCellGroup, - dci_pdu, + nr_mac->secondaryCellGroupCommon, + &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1], &dci_payload, - dci_format, - rnti_type, - dci10_bw, - ra->bwp_id); + NR_DL_DCI_FORMAT_1_0, + NR_RNTI_TC, + pdsch_pdu_rel15->BWPSize, + nr_mac->sched_ctrlCommon->active_bwp->bwp_Id); x_Overhead = 0; nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); @@ -1251,356 +1227,22 @@ void nr_generate_Msg4(module_id_t module_idP, for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) { vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1; } - ra->state = WAIT_Msg4_ACK; -/* - // PREPROCESSOR - NR_UE_info_t *UE_info = &nr_mac->UE_info; - int16_t rrc_sdu_length = 0; - uint16_t msg4_padding = 0; - uint16_t msg4_post_padding = 0; - uint16_t msg4_header = 0; - - int UE_id = find_nr_UE_id(module_id, ra->rnti); - - if (UE_id < 0) { - LOG_E(NR_MAC, "Can't find UE for t-crnti %x, kill RA procedure for this UE\n", ra->rnti); - nr_clear_ra_proc(module_id, CC_id, frame); - return; - } - - nr_mac->pre_processor_dl(module_id, frame, slot); - - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - - // POST processing - struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = - sched_ctrl->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; - AssertFatal(sched_ctrl->time_domain_allocation < tdaList->list.count, - "time_domain_allocation %d>=%d\n", - sched_ctrl->time_domain_allocation, - tdaList->list.count); - - const int startSymbolAndLength = tdaList->list.array[sched_ctrl->time_domain_allocation]->startSymbolAndLength; - - int startSymbolIndex; - int nrOfSymbols; - SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); - - long dmrsConfigType = sched_ctrl->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; - uint8_t N_PRB_DMRS = 0; - if (dmrsConfigType==NFAPI_NR_DMRS_TYPE1) { - N_PRB_DMRS = sched_ctrl->numDmrsCdmGrpsNoData * 6; - } - else { - N_PRB_DMRS = sched_ctrl->numDmrsCdmGrpsNoData * 4; - } - - uint8_t N_DMRS_SLOT = get_num_dmrs_symbols(NULL, - RC.nrmac[module_id]->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position , - nrOfSymbols); - - sched_ctrl->rbSize = 4; - const uint32_t TBS = nr_compute_tbs(nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), - nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), - sched_ctrl->rbSize, - nrOfSymbols, - N_PRB_DMRS * N_DMRS_SLOT, - 0, - 0, - 1) >> 3; - - NR_UE_harq_t *harq = &sched_ctrl->harq_processes[sched_ctrl->dl_harq_pid]; - NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[0]; - harq->feedback_slot = pucch->ul_slot; - harq->is_waiting = 1; - UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++; - ra->harq_pid = sched_ctrl->dl_harq_pid; - LOG_I(NR_MAC, "%4d.%2d RNTI %04x start %d RBS %d MCS %d TBS %d HARQ PID %d round %d NDI %d, feedback slot %d, iswaiting %d\n", - frame, slot, ra->rnti, sched_ctrl->rbStart, sched_ctrl->rbSize, sched_ctrl->mcs, - TBS, sched_ctrl->dl_harq_pid, harq->round, harq->ndi, harq->feedback_slot, harq->is_waiting); - - nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; - - NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; - - nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; - memset((void*)dl_tti_pdcch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); - dl_tti_pdcch_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE; - dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu)); - dl_req->nPDUs += 1; - nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; - nr_configure_pdcch(pdcch_pdu_rel15, - sched_ctrl->search_space, - sched_ctrl->coreset, - scc, - sched_ctrl->active_bwp); - - nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; - memset((void*)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); - dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE; - dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdsch_pdu)); - dl_req->nPDUs += 1; - nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; - - pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; - - pdsch_pdu_rel15->pduBitmap = 0; - pdsch_pdu_rel15->rnti = ra->rnti; - pdsch_pdu_rel15->pduIndex = nr_mac->pdu_index[0]++; - - pdsch_pdu_rel15->BWPSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - - pdsch_pdu_rel15->SubcarrierSpacing = sched_ctrl->active_bwp->bwp_Common->genericParameters.subcarrierSpacing; - if (sched_ctrl->active_bwp->bwp_Common->genericParameters.cyclicPrefix) { - pdsch_pdu_rel15->CyclicPrefix = *sched_ctrl->active_bwp->bwp_Common->genericParameters.cyclicPrefix; - } else { - pdsch_pdu_rel15->CyclicPrefix = 0; - } - - pdsch_pdu_rel15->NrOfCodewords = 1; - pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(sched_ctrl->mcs,0); - pdsch_pdu_rel15->qamModOrder[0] = 2; - pdsch_pdu_rel15->mcsIndex[0] = sched_ctrl->mcs; - pdsch_pdu_rel15->mcsTable[0] = 0; - pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[0]; - pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; - pdsch_pdu_rel15->nrOfLayers = 1; - pdsch_pdu_rel15->transmissionScheme = 0; - pdsch_pdu_rel15->refPoint = 1; - pdsch_pdu_rel15->dmrsConfigType = dmrsConfigType; - pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; - pdsch_pdu_rel15->SCID = 0; - pdsch_pdu_rel15->numDmrsCdmGrpsNoData = sched_ctrl->numDmrsCdmGrpsNoData; - pdsch_pdu_rel15->dmrsPorts = 1; - pdsch_pdu_rel15->resourceAlloc = 1; - pdsch_pdu_rel15->rbStart = sched_ctrl->rbStart; - pdsch_pdu_rel15->rbSize = sched_ctrl->rbSize; - pdsch_pdu_rel15->VRBtoPRBMapping = 0; - pdsch_pdu_rel15->qamModOrder[0] = nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx); - pdsch_pdu_rel15->TBSize[0] = TBS; - pdsch_pdu_rel15->mcsTable[0] = sched_ctrl->mcsTableIdx; - pdsch_pdu_rel15->StartSymbolIndex = startSymbolIndex; - pdsch_pdu_rel15->NrOfSymbols = nrOfSymbols; - - pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(sched_ctrl->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, scc->dmrs_TypeA_Position, pdsch_pdu_rel15->StartSymbolIndex+pdsch_pdu_rel15->NrOfSymbols); - - LOG_D(NR_MAC,"dlDmrsSymbPos = 0x%x\n", pdsch_pdu_rel15->dlDmrsSymbPos); - - // Fill PDCCH DL DCI PDU - nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; - pdcch_pdu_rel15->numDlDci++; - dci_pdu->RNTI = ra->rnti; - dci_pdu->ScramblingId = *scc->physCellId; - dci_pdu->ScramblingRNTI = 0; - dci_pdu->AggregationLevel = sched_ctrl->aggregation_level; - dci_pdu->CceIndex = sched_ctrl->cce_index; - dci_pdu->beta_PDCCH_1_0 = 0; - dci_pdu->powerControlOffsetSS = 1; - - // DCI payload - dci_pdu_rel15_t dci_payload; - memset(&dci_payload, 0, sizeof(dci_pdu_rel15_t)); - - dci_payload.bwp_indicator.val = sched_ctrl->active_bwp->bwp_Id; - - // frequency domain assignment - dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0( - pdsch_pdu_rel15->rbSize, pdsch_pdu_rel15->rbStart, pdsch_pdu_rel15->BWPSize); - - dci_payload.time_domain_assignment.val = sched_ctrl->time_domain_allocation; - dci_payload.mcs = sched_ctrl->mcs; - dci_payload.rv = pdsch_pdu_rel15->rvIndex[0]; - dci_payload.harq_pid = 0; - dci_payload.ndi = 0; - dci_payload.dai[0].val = 0; - dci_payload.tpc = 0; // table 7.2.1-1 in 38.213 - dci_payload.pucch_resource_indicator = 0; - dci_payload.pdsch_to_harq_feedback_timing_indicator.val = 0; - dci_payload.antenna_ports.val = 0; - dci_payload.dmrs_sequence_initialization.val = pdsch_pdu_rel15->SCID; - - fill_dci_pdu_rel15(scc, - ra->secondaryCellGroup, - &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1], - &dci_payload, - NR_DL_DCI_FORMAT_1_0, - NR_RNTI_TC, - pdsch_pdu_rel15->BWPSize, - sched_ctrl->active_bwp->bwp_Id); - - LOG_D(NR_MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize); - LOG_D(NR_MAC,"BWPStart: %i\n", pdcch_pdu_rel15->BWPStart); - LOG_D(NR_MAC,"SubcarrierSpacing: %i\n", pdcch_pdu_rel15->SubcarrierSpacing); - LOG_D(NR_MAC,"CyclicPrefix: %i\n", pdcch_pdu_rel15->CyclicPrefix); - LOG_D(NR_MAC,"StartSymbolIndex: %i\n", pdcch_pdu_rel15->StartSymbolIndex); - LOG_D(NR_MAC,"DurationSymbols: %i\n", pdcch_pdu_rel15->DurationSymbols); - for(int n=0;n<6;n++) LOG_D(NR_MAC,"FreqDomainResource[%i]: %x\n",n, pdcch_pdu_rel15->FreqDomainResource[n]); - LOG_D(NR_MAC,"CceRegMappingType: %i\n", pdcch_pdu_rel15->CceRegMappingType); - LOG_D(NR_MAC,"RegBundleSize: %i\n", pdcch_pdu_rel15->RegBundleSize); - LOG_D(NR_MAC,"InterleaverSize: %i\n", pdcch_pdu_rel15->InterleaverSize); - LOG_D(NR_MAC,"CoreSetType: %i\n", pdcch_pdu_rel15->CoreSetType); - LOG_D(NR_MAC,"ShiftIndex: %i\n", pdcch_pdu_rel15->ShiftIndex); - LOG_D(NR_MAC,"precoderGranularity: %i\n", pdcch_pdu_rel15->precoderGranularity); - LOG_D(NR_MAC,"numDlDci: %i\n", pdcch_pdu_rel15->numDlDci); - - NR_UE_ret_info_t *retInfo = &sched_ctrl->retInfo[sched_ctrl->dl_harq_pid]; - if (harq->round != 0) { // retransmission - if (sched_ctrl->rbSize != retInfo->rbSize) - LOG_W(NR_MAC, - "retransmission uses different rbSize (%d vs. orig %d)\n", - sched_ctrl->rbSize, - retInfo->rbSize); - if (sched_ctrl->time_domain_allocation != retInfo->time_domain_allocation) - LOG_W(NR_MAC, - "retransmission uses different time_domain_allocation (%d vs. orig %d)\n", - sched_ctrl->time_domain_allocation, - retInfo->time_domain_allocation); - if (sched_ctrl->mcs != retInfo->mcs - || sched_ctrl->mcsTableIdx != retInfo->mcsTableIdx - || sched_ctrl->numDmrsCdmGrpsNoData != retInfo->numDmrsCdmGrpsNoData) - LOG_W(NR_MAC, - "retransmission uses different table/MCS/numDmrsCdmGrpsNoData (%d/%d/%d vs. orig %d/%d/%d)\n", - sched_ctrl->mcsTableIdx, - sched_ctrl->mcs, - sched_ctrl->numDmrsCdmGrpsNoData, - retInfo->mcsTableIdx, - retInfo->mcs, - retInfo->numDmrsCdmGrpsNoData); - // we do not have to do anything, since we do not require to get data - // from RLC, encode MAC CEs, or copy data to FAPI structures - LOG_W(NR_MAC, "%d.%2d retransmission UE %d/RNTI %04x\n", frame, slot, UE_id, ra->rnti); - LOG_W(NR_MAC, - "%d.%2d DL retransmission UE %d/RNTI %04x HARQ PID %d round %d NDI %d\n", - frame, - slot, - UE_id, - ra->rnti, - sched_ctrl->dl_harq_pid, - harq->round, - harq->ndi); - } else { // initial transmission - LOG_D(NR_MAC, "[%s] Initial HARQ transmission in %d.%d\n", __FUNCTION__, frame, slot); - // reserve space for timing advance of UE if necessary, - // nr_generate_dlsch_pdu() checks for ta_apply and add TA CE if necessary - const int cont_res_len = 1 + 6; - const int ta_len = (sched_ctrl->ta_apply) ? 2 : 0; - - // Get RLC data TODO: remove random data retrieval - int header_length_total = 0; - int header_length_last = 0; - int sdu_length_total = 0; - int num_sdus = 0; - uint16_t sdu_lengths[NB_RB_MAX] = {0}; - uint8_t mac_sdus[MAX_NR_DLSCH_PAYLOAD_BYTES]; - unsigned char sdu_lcids[NB_RB_MAX] = {0}; - const int lcid = DL_SCH_LCID_CCCH; - if (sched_ctrl->num_total_bytes > 0) { - LOG_I(NR_MAC, - "[gNB %d][MSG4] Frame %d : CCCH->DLSCH, Requesting " - "%d bytes from RLC (lcid %d total hdr len %d), TBS: %d \n \n", - module_id, - frame, - TBS - ta_len - header_length_total - sdu_length_total - 3, - lcid, - header_length_total, - TBS); -#if 0 - // sdu_lengths[num_sdus] = mac_rrc_data_req(module_id, CC_idP, frameP, CCCH, - // UE_RNTI(module_idP,UE_id),1, // 1 transport block - // &cc[CC_idP].CCCH_pdu.payload[0], 1); - sdu_lengths[num_sdus] = mac_rrc_nr_data_req(module_id, CC_id, frame, CCCH, ra->rnti, 1, // 1 transport block - mac_sdus); - - LOG_D(MAC, - "[gNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n", - module_id, - sdu_lengths[num_sdus], - lcid); - - sdu_lcids[num_sdus] = lcid; - sdu_length_total += sdu_lengths[num_sdus]; - header_length_last = 1 + 1 + (sdu_lengths[num_sdus] >= 128); - header_length_total += header_length_last; - - num_sdus++; -#else - LOG_I(NR_MAC, "Configuring DL_TX in %d.%d: random data\n", frame, slot); - // fill dlsch_buffer with random data - sdu_lcids[0] = lcid; // DRB - sdu_lengths[0] = 500; - for (int i = 0; i < sdu_lengths[0]; i++) - mac_sdus[i] = (unsigned char) (lrand48()&0xff); - sdu_length_total += sdu_lengths[0]; - header_length_total += 2 + (sdu_lengths[0] >= 128); - num_sdus +=1; -#endif - //ue_sched_ctl->uplane_inactivity_timer = 0; - } - - UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS; - UE_info->mac_stats[UE_id].lc_bytes_tx[lcid] += sdu_length_total; - - // Check if there is data from RLC or CE - const int post_padding = TBS > header_length_total + sdu_length_total + cont_res_len; - - LOG_I(NR_MAC, "Configuring DL_TX in %d.%d: TBS %d, header_length_total %d, sdu_length_total %d,cont_res_len %d, post_padding %d \n", frame, slot, - TBS , header_length_total , sdu_length_total ,cont_res_len , post_padding ); - // padding param currently not in use - //padding = TBS - header_length_total - sdu_length_total - ta_len - 1; - - const int ntx_req = nr_mac->TX_req[CC_id].Number_of_PDUs; - nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[ntx_req]; - // pointer to directly generate the PDU into the nFAPI structure - uint32_t *buf = tx_req->TLVs[0].value.direct; - - const int offset = nr_write_ce_dlsch_pdu(module_id, - sched_ctrl, - (unsigned char *)buf, - 255, // no drx - ra->cont_res_id); - - // Padding: fill remainder of DLSCH with 0 - if (post_padding > 0) { - for (int j = 0; j < TBS - offset; j++) - buf[offset + j] = 0; - } - - // the buffer has been filled by nr_generate_dlsch_pdu(), below we simply - //fill the remaining information - tx_req->PDU_length = TBS; - tx_req->PDU_index = nr_mac->pdu_index[0]++; - tx_req->num_TLV = 1; - tx_req->TLVs[0].length = TBS + 2; - nr_mac->TX_req[CC_id].Number_of_PDUs++; - nr_mac->TX_req[CC_id].SFN = frame; - nr_mac->TX_req[CC_id].Slot = slot; - - retInfo->rbSize = sched_ctrl->rbSize; - retInfo->time_domain_allocation = sched_ctrl->time_domain_allocation; - retInfo->mcsTableIdx = sched_ctrl->mcsTableIdx; - retInfo->mcs = sched_ctrl->mcs; - retInfo->numDmrsCdmGrpsNoData = sched_ctrl->numDmrsCdmGrpsNoData; - -#if defined(ENABLE_MAC_PAYLOAD_DEBUG) - if (frame%100 == 0) { - LOG_I(MAC, - "%d.%d, first 10 payload bytes, TBS size: %d \n", - frame, - slot, - TBS); - for(int i = 0; i < 10; i++) - LOG_I(MAC, "byte %d: %x\n", i, ((uint8_t *) buf)[i]); - } -#endif - } - - nr_get_retransmission_timing(&ra->Msg4_frame, &ra->Msg4_slot); - ra->state = WAIT_Msg4_ACK; - LOG_I(NR_MAC, "Retransmission time for Msg4 is %d %d\n", ra->Msg4_frame, ra->Msg4_slot); - */ + LOG_D(MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize); + LOG_D(MAC,"BWPStart: %i\n", pdcch_pdu_rel15->BWPStart); + LOG_D(MAC,"SubcarrierSpacing: %i\n", pdcch_pdu_rel15->SubcarrierSpacing); + LOG_D(MAC,"CyclicPrefix: %i\n", pdcch_pdu_rel15->CyclicPrefix); + LOG_D(MAC,"StartSymbolIndex: %i\n", pdcch_pdu_rel15->StartSymbolIndex); + LOG_D(MAC,"DurationSymbols: %i\n", pdcch_pdu_rel15->DurationSymbols); + for(int n=0;n<6;n++) LOG_D(MAC,"FreqDomainResource[%i]: %x\n",n, pdcch_pdu_rel15->FreqDomainResource[n]); + LOG_D(MAC,"CceRegMappingType: %i\n", pdcch_pdu_rel15->CceRegMappingType); + LOG_D(MAC,"RegBundleSize: %i\n", pdcch_pdu_rel15->RegBundleSize); + LOG_D(MAC,"InterleaverSize: %i\n", pdcch_pdu_rel15->InterleaverSize); + LOG_D(MAC,"CoreSetType: %i\n", pdcch_pdu_rel15->CoreSetType); + LOG_D(MAC,"ShiftIndex: %i\n", pdcch_pdu_rel15->ShiftIndex); + LOG_D(MAC,"precoderGranularity: %i\n", pdcch_pdu_rel15->precoderGranularity); + LOG_D(MAC,"numDlDci: %i\n", pdcch_pdu_rel15->numDlDci); } } @@ -1616,32 +1258,6 @@ void nr_check_Msg4_Ack(module_id_t module_id, NR_RA_t *ra = &cc->ra[0]; ra->state = RA_IDLE; - - - /* - NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; - int UE_id = find_nr_UE_id_msg4(module_id, ra->rnti); - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - const int current_harq_pid = ra->harq_pid; - NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid]; - - LOG_D(MAC, "ue %d, rnti %d, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid); - - if (harq->is_waiting == 0) - { - if ( harq->round == 0) - { - ra->state = IDLE; - UE_info->active[UE_id] = true; - free(ra->preambles.preamble_list); - LOG_I(MAC, "ue %d, rnti %d is active, frame %d %d\n", UE_id, ra->rnti, frame, slot); - } - else - { - ra->state = Msg4; - } - } - */ } void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP){ From d1ba40cc561bc3ee4d9dff680c827d609c37b244 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 24 Feb 2021 19:34:53 +0000 Subject: [PATCH 012/125] Fix RA-Msg2 to Initial BWP --- .../NR_MAC_UE/nr_ue_dci_configuration.c | 4 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 2 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 141 ++++++++---------- 3 files changed, 65 insertions(+), 82 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c index 1e1f4b311c..f3b4acc9bd 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c @@ -148,7 +148,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps)); rel15->rnti = ra->ra_rnti; rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); //NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, 275); + rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing; rel15->dci_length_options[0] = nr_dci_size(scc, mac->scg, def_dci_pdu_rel15, rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, bwp_id); break; @@ -260,7 +260,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg2)\n"); rel15->num_dci_options = 1; rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; - config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id); + config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, -1); fill_dci_search_candidates(ss, rel15); break; case WAIT_CONTENTION_RESOLUTION: diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 18ad62cf39..d228c7fc96 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -658,7 +658,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH; } - if(rnti == ra->t_crnti) { + if( (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti) ) { dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); } else { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 284243b69c..00827a13ee 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -663,7 +663,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t vrb_map_UL[i + ra->msg3_first_rb] = 1; } - LOG_I(MAC, "[gNB %d][RAPROC] Frame %d, Subframe %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot); + LOG_D(MAC, "[gNB %d][RAPROC] Frame %d, Subframe %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot); nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[CC_id][ra->Msg3_slot]; AssertFatal(future_ul_tti_req->SFN == ra->Msg3_frame @@ -774,49 +774,43 @@ void nr_generate_Msg2(module_id_t module_idP, sub_frame_t slotP) { - int mcsIndex; - int startSymbolAndLength = 0, StartSymbolIndex = -1, NrOfSymbols = 14, StartSymbolIndex_tmp, NrOfSymbols_tmp, x_Overhead, time_domain_assignment = 0; - gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; - NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; - NR_RA_t *ra = &cc->ra[CC_id]; - NR_SearchSpace_t *ss = ra->ra_ss; - - uint16_t RA_rnti = ra->RA_rnti; - long locationAndBandwidth; - - // check if UE is doing RA on CORESET0 , InitialBWP or configured BWP from SCD - // get the BW of the PDCCH for PDCCH size and RAR PDSCH size - - NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; - int dci10_bw; - - if (ra->coreset0_configured == 1) { - AssertFatal(1==0,"This is a standalone condition\n"); - } - else { // on configured BWP or initial LDBWP, bandwidth parameters in DCI correspond size of initialBWP - locationAndBandwidth = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth; - dci10_bw = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE); - } + gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; + NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; + NR_RA_t *ra = &cc->ra[0]; if ((ra->Msg2_frame == frameP) && (ra->Msg2_slot == slotP)) { + int mcsIndex = 0; + int startSymbolAndLength = 0; + int StartSymbolIndex = -1; + int NrOfSymbols = 14; + int StartSymbolIndex_tmp = 0; + int NrOfSymbols_tmp = 0; + int x_Overhead = 0; + int time_domain_assignment = 0; + uint8_t nr_of_candidates = 0; + uint8_t aggregation_level = 0; + + NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; + NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; + NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; + NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; + // Checking if the DCI allocation is feasible in current subframe if (dl_req->nPDUs > NFAPI_NR_MAX_DL_TTI_PDUS - 2) { - LOG_I(MAC, "[RAPROC] Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", slotP, RA_rnti); + LOG_I(MAC, "[RAPROC] Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", slotP, ra->RA_rnti); return; } - uint8_t nr_of_candidates, aggregation_level; find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss); - NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; - NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0 /* common */); int CCEIndex = allocate_nr_CCEs(nr_mac, bwp, coreset, aggregation_level, - 0, // Y - 0, // m + 0, + 0, nr_of_candidates); if (CCEIndex < 0) { @@ -826,9 +820,8 @@ void nr_generate_Msg2(module_id_t module_idP, nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; - /* look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not - * exist, create it. This is especially important if we have multiple RAs, - * and the DLSCH has to reuse them, so we need to mark them */ + // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially + // important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them const int bwpid = bwp->bwp_Id; const int coresetid = coreset->controlResourceSetId; nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid]; @@ -843,6 +836,9 @@ void nr_generate_Msg2(module_id_t module_idP, nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15; } + // TODO: This assignment should be done in function nr_configure_pdcch() + pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0; + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset((void *)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE; @@ -850,7 +846,7 @@ void nr_generate_Msg2(module_id_t module_idP, dl_req->nPDUs+=1; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; - LOG_I(MAC,"[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RAR DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state); + LOG_I(NR_MAC,"[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state); // This code from this point on will not work on initialBWP or CORESET0 AssertFatal(ra->bwp_id>0,"cannot work on initialBWP for now\n"); @@ -860,33 +856,23 @@ void nr_generate_Msg2(module_id_t module_idP, ra->crnti); AssertFatal(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList has %d BWP!\n", ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); - NR_BWP_Uplink_t *ubwp=ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1]; - - LOG_I(MAC, "[RAPROC] Scheduling common search space DCI type 1 dlBWP BW %d\n", dci10_bw); - - // Qm>2 not allowed for RAR - if (get_softmodem_params()->do_ra) - mcsIndex = 9; - else - mcsIndex = 0; pdsch_pdu_rel15->pduBitmap = 0; - pdsch_pdu_rel15->rnti = RA_rnti; - /* SCF222: PDU index incremented for each PDSCH PDU sent in TX control - * message. This is used to associate control information to data and is - * reset every slot. */ + pdsch_pdu_rel15->rnti = ra->RA_rnti; + + // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control + // information to data and is reset every slot. const int pduindex = nr_mac->pdu_index[CC_id]++; pdsch_pdu_rel15->pduIndex = pduindex; - - - pdsch_pdu_rel15->BWPSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_pdu_rel15->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,0); pdsch_pdu_rel15->qamModOrder[0] = 2; pdsch_pdu_rel15->mcsIndex[0] = mcsIndex; + if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) pdsch_pdu_rel15->mcsTable[0] = 0; else{ @@ -895,12 +881,13 @@ void nr_generate_Msg2(module_id_t module_idP, else pdsch_pdu_rel15->mcsTable[0] = 2; } + pdsch_pdu_rel15->rvIndex[0] = 0; pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; pdsch_pdu_rel15->nrOfLayers = 1; pdsch_pdu_rel15->transmissionScheme = 0; pdsch_pdu_rel15->refPoint = 0; - pdsch_pdu_rel15->dmrsConfigType = 0; + pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; pdsch_pdu_rel15->SCID = 0; pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2; @@ -908,7 +895,7 @@ void nr_generate_Msg2(module_id_t module_idP, pdsch_pdu_rel15->resourceAlloc = 1; pdsch_pdu_rel15->rbStart = 0; pdsch_pdu_rel15->rbSize = 6; - pdsch_pdu_rel15->VRBtoPRBMapping = 0; // non interleaved + pdsch_pdu_rel15->VRBtoPRBMapping = 0; for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; @@ -926,13 +913,10 @@ void nr_generate_Msg2(module_id_t module_idP, pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols); - /* Fill PDCCH DL DCI PDU */ + // Fill PDCCH DL DCI PDU nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; pdcch_pdu_rel15->numDlDci++; - dci_pdu->RNTI = RA_rnti; - /* TODO: remove next line */ - AssertFatal(ss->searchSpaceType->present != NR_SearchSpace__searchSpaceType_PR_ue_Specific, - "shouldn't the RA SS be common?\n"); + dci_pdu->RNTI = ra->RA_rnti; dci_pdu->ScramblingId = *scc->physCellId; dci_pdu->ScramblingRNTI = 0; dci_pdu->AggregationLevel = aggregation_level; @@ -942,47 +926,45 @@ void nr_generate_Msg2(module_id_t module_idP, dci_pdu_rel15_t dci_payload; dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize, - pdsch_pdu_rel15->rbStart,dci10_bw); + pdsch_pdu_rel15->rbStart, + pdsch_pdu_rel15->BWPSize); + dci_payload.time_domain_assignment.val = time_domain_assignment; dci_payload.vrb_to_prb_mapping.val = 0; dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0]; dci_payload.tb_scaling = 0; - LOG_I(MAC, + LOG_D(NR_MAC, "[RAPROC] DCI type 1 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d \n", dci_payload.frequency_domain_assignment.val, pdsch_pdu_rel15->rbStart, pdsch_pdu_rel15->rbSize, - dci10_bw, + pdsch_pdu_rel15->BWPSize, dci_payload.time_domain_assignment.val, dci_payload.vrb_to_prb_mapping.val, dci_payload.mcs, dci_payload.tb_scaling); - LOG_I(MAC, "Frame %d: Subframe %d : Adding common DL DCI for RA_RNTI %x\n", frameP, slotP, RA_rnti); - - const int dci_format = NR_DL_DCI_FORMAT_1_0; - const int rnti_type = NR_RNTI_RA; - - LOG_I(MAC, - "[RAPROC] DCI params: rnti %d, rnti_type %d, dci_format %d coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d\n", + LOG_D(NR_MAC, + "[RAPROC] DCI params: rnti 0x%x, rnti_type %d, dci_format %d coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d\n", pdcch_pdu_rel15->dci_pdu[0].RNTI, - rnti_type, - dci_format, + NR_RNTI_RA, + NR_DL_DCI_FORMAT_1_0, (unsigned long long)pdcch_pdu_rel15->FreqDomainResource, pdcch_pdu_rel15->StartSymbolIndex, pdcch_pdu_rel15->DurationSymbols); fill_dci_pdu_rel15(scc, - ra->secondaryCellGroup, - dci_pdu, + nr_mac->secondaryCellGroupCommon, + &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1], &dci_payload, - dci_format, - rnti_type, - dci10_bw, - ra->bwp_id); + NR_DL_DCI_FORMAT_1_0, + NR_RNTI_RA, + pdsch_pdu_rel15->BWPSize, + nr_mac->sched_ctrlCommon->active_bwp->bwp_Id); // Program UL processing for Msg3 + NR_BWP_Uplink_t *ubwp=ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1]; nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra); LOG_I(MAC, "Frame %d, Subframe %d: Setting Msg3 reception for Frame %d Subframe %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot); nr_add_msg3(module_idP, CC_id, frameP, slotP); @@ -1003,13 +985,14 @@ void nr_generate_Msg2(module_id_t module_idP, memcpy((void*)&tx_req->TLVs[0].value.direct[0], (void*)&cc[CC_id].RAR_pdu.payload[0], tx_req->TLVs[0].length); T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), - T_INT(RA_rnti), T_INT(frameP), T_INT(slotP), T_INT(0) /* harq pid, meaningful? */, + T_INT(ra->RA_rnti), T_INT(frameP), T_INT(slotP), T_INT(0) /* harq pid, meaningful? */, T_BUFFER(&cc[CC_id].RAR_pdu.payload[0], tx_req->TLVs[0].length)); - /* mark the corresponding RBs as used */ + // mark the corresponding RBs as used uint16_t *vrb_map = cc[CC_id].vrb_map; - for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) + for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) { vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1; + } } } From adaf5a721cedefd166a01eb2a2d96694096dbd90 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Thu, 25 Feb 2021 10:56:08 +0000 Subject: [PATCH 013/125] Define Initial BWP with the same locationAndBandwidth as Coreset0 defined by PDCCHConfigSIB1 in MIB --- .../CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index d28427dbf3..892aa73398 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -50,8 +50,8 @@ gNBs = dl_carrierBandwidth = 106; #initialDownlinkBWP #genericParameters - # this is RBstart=41,L=24 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 6366; # 6366 12925 12956 28875 + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 12952; # 6366 12925 12956 28875 12952 # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; @@ -94,7 +94,7 @@ gNBs = pMax = 20; #initialUplinkBWP #genericParameters - initialULBWPlocationAndBandwidth = 6366; + initialULBWPlocationAndBandwidth = 12952; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialULBWPsubcarrierSpacing = 1; From c8fbcdf7b997a7ae7d6cfefe3693e47e18e89211 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 25 Feb 2021 12:47:23 +0000 Subject: [PATCH 014/125] Minor fix --- openair1/PHY/NR_TRANSPORT/nr_dci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index 61238ae647..c4673e9d18 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -88,7 +88,7 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, cset_start_sc = frame_parms.first_carrier_offset + rb_offset*NR_NB_SC_PER_RB; if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_MIB_SIB1) { cset_start_sc = cset_start_sc + RC.nrmac[gNB->Mod_id]->type0_PDCCH_CSS_config.cset_start_rb*NR_NB_SC_PER_RB; - } else if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0) { + } else { cset_start_sc = cset_start_sc + pdcch_pdu_rel15->BWPStart*NR_NB_SC_PER_RB; } From 6a16fe9e3f5b7d6626c56206534dccc1793402c5 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 25 Feb 2021 14:57:53 +0000 Subject: [PATCH 015/125] Fix issues caused by merge of branch develop --- openair1/PHY/defs_gNB.h | 2 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 2 +- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 1 + openair2/LAYER2/NR_MAC_gNB/config.c | 6 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 205 +++++++++--------- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 5 +- openair2/NR_PHY_INTERFACE/NR_IF_Module.c | 2 +- 9 files changed, 118 insertions(+), 109 deletions(-) diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index f3f212effb..b22803116b 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -655,7 +655,7 @@ typedef struct { int prach_I0; } PHY_MEASUREMENTS_gNB; -#define TOTAL_NUM_NR_PRACH_PREAMBLES 64 +#define MAX_NUM_NR_PRACH_PREAMBLES 64 #define MAX_NUM_NR_RX_RACH_PDUS 4 #define MAX_NUM_NR_RX_PRACH_PREAMBLES 4 #define MAX_UL_PDUS_PER_SLOT 8 diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index d228c7fc96..f26062d4c7 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -783,7 +783,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr // FIXME: Remove this if (ra->ra_state == WAIT_CONTENTION_RESOLUTION && rnti == ra->t_crnti){ - LOG_I(NR_MAC,"RA-Msg4 was received\n"); + LOG_I(NR_MAC,"RA-Msg4 received\n"); nr_ra_succeeded(module_id, frame, slot); } diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 9fcf9baaaf..d60fc55090 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -895,6 +895,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in for (int k = 0; k < TBS_bytes; k++) { LOG_D(NR_MAC,"(%i): 0x%x\n",k,mac->ulsch_pdu.payload[k]); } + LOG_I(NR_MAC,"[RAPROC] RA-Msg3 transmitted\n"); } else { if (IS_SOFTMODEM_NOS1 && (mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] != ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator)){ // Getting IP traffic to be transmitted diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index cf4966b31e..41317f8bbc 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -436,9 +436,9 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, } else { ra->cfra = false; ra->rnti = rnti; - ra->preambles.num_preambles = TOTAL_NUM_NR_PRACH_PREAMBLES; - ra->preambles.preamble_list = (uint8_t *) malloc(TOTAL_NUM_NR_PRACH_PREAMBLES*sizeof(uint8_t)); - for (int i = 0; i < TOTAL_NUM_NR_PRACH_PREAMBLES; i++) + ra->preambles.num_preambles = MAX_NUM_NR_PRACH_PREAMBLES; + ra->preambles.preamble_list = (uint8_t *) malloc(MAX_NUM_NR_PRACH_PREAMBLES*sizeof(uint8_t)); + for (int i = 0; i < MAX_NUM_NR_PRACH_PREAMBLES; i++) ra->preambles.preamble_list[i] = i; } LOG_I(PHY,"Added new RA process for UE RNTI %04x with initial secondaryCellGroup\n", rnti); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index c636c28bf3..288b57659d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -65,7 +65,7 @@ int16_t ssb_index_from_prach(module_id_t module_idP, uint8_t config_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex; uint8_t fdm = cfg->prach_config.num_prach_fd_occasions.value; - uint8_t total_RApreambles = 64; + uint8_t total_RApreambles = MAX_NUM_NR_PRACH_PREAMBLES; if( scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles != NULL) total_RApreambles = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles; @@ -520,7 +520,7 @@ void nr_initiate_ra_proc(module_id_t module_idP, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1); - LOG_I(MAC, + LOG_D(MAC, "[gNB %d][RAPROC] CC_id %d Frame %d, Slot %d Initiating RA procedure for preamble index %d\n", module_idP, CC_id, @@ -542,7 +542,6 @@ void nr_initiate_ra_proc(module_id_t module_idP, continue; // if the PRACH preamble does not correspond to any of the ones sent through RRC abort RA proc } } - int loop = 0; LOG_D(MAC, "Frame %d, Slot %d: Activating RA process \n", frameP, slotP); ra->state = Msg2; ra->timing_offset = timing_offset; @@ -574,7 +573,11 @@ void nr_initiate_ra_proc(module_id_t module_idP, ra->Msg2_frame = msg2_frame; ra->Msg2_slot = msg2_slot; - LOG_I(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); + LOG_D(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); + + // TODO: Configure RRC with the new RNTI of the following commented lines + /* + int loop = 0; if (!ra->cfra) { do { ra->rnti = (taus() % 65518) + 1; @@ -587,11 +590,13 @@ void nr_initiate_ra_proc(module_id_t module_idP, abort(); } } + */ + ra->RA_rnti = ra_rnti; ra->preamble_index = preamble_index; ra->beam_id = beam_index; - LOG_I(MAC, + LOG_D(MAC, "[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB " "index %u\n", module_idP, @@ -610,76 +615,76 @@ void nr_initiate_ra_proc(module_id_t module_idP, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 0); } -void nr_schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) -{ - gNB_MAC_INST *mac = RC.nrmac[module_idP]; + void nr_schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) + { + gNB_MAC_INST *mac = RC.nrmac[module_idP]; - start_meas(&mac->schedule_ra); - for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - NR_COMMON_channels_t *cc = &mac->common_channels[CC_id]; - for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { - NR_RA_t *ra = &cc->ra[i]; - LOG_D(MAC, "RA[state:%d]\n", ra->state); - switch (ra->state) { - case Msg2: - nr_generate_Msg2(module_idP, CC_id, frameP, slotP, ra); - break; - case Msg4: - nr_generate_Msg4(module_idP, CC_id, frameP, slotP); - break; - case WAIT_Msg4_ACK: - nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP); - break; - default: - break; + start_meas(&mac->schedule_ra); + for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + NR_COMMON_channels_t *cc = &mac->common_channels[CC_id]; + for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { + NR_RA_t *ra = &cc->ra[i]; + LOG_D(MAC, "RA[state:%d]\n", ra->state); + switch (ra->state) { + case Msg2: + nr_generate_Msg2(module_idP, CC_id, frameP, slotP, ra); + break; + case Msg4: + nr_generate_Msg4(module_idP, CC_id, frameP, slotP); + break; + case WAIT_Msg4_ACK: + nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP); + break; + default: + break; + } } } + stop_meas(&mac->schedule_ra); } - stop_meas(&mac->schedule_ra); -} -void nr_get_Msg3alloc(module_id_t module_id, - int CC_id, - NR_ServingCellConfigCommon_t *scc, - NR_BWP_Uplink_t *ubwp, - sub_frame_t current_slot, - frame_t current_frame, - NR_RA_t *ra) { + void nr_get_Msg3alloc(module_id_t module_id, + int CC_id, + NR_ServingCellConfigCommon_t *scc, + NR_BWP_Uplink_t *ubwp, + sub_frame_t current_slot, + frame_t current_frame, + NR_RA_t *ra) { - // msg3 is schedulend in mixed slot in the following TDD period + // msg3 is schedulend in mixed slot in the following TDD period - uint16_t msg3_nb_rb = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // sdu has 6 or 8 bytes + uint16_t msg3_nb_rb = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // sdu has 6 or 8 bytes - int mu = ubwp->bwp_Common->genericParameters.subcarrierSpacing; - int StartSymbolIndex, NrOfSymbols, startSymbolAndLength, temp_slot; - ra->Msg3_tda_id = 16; // initialization to a value above limit + int mu = ubwp->bwp_Common->genericParameters.subcarrierSpacing; + int StartSymbolIndex, NrOfSymbols, startSymbolAndLength, temp_slot; + ra->Msg3_tda_id = 16; // initialization to a value above limit - for (int i=0; ibwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.count; i++) { - startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; - SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols); - // we want to transmit in the uplink symbols of mixed slot - if (NrOfSymbols == scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols) { - ra->Msg3_tda_id = i; - break; + for (int i=0; ibwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.count; i++) { + startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; + SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols); + // we want to transmit in the uplink symbols of mixed slot + if (NrOfSymbols == scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols) { + ra->Msg3_tda_id = i; + break; + } } - } - AssertFatal(ra->Msg3_tda_id<16,"Unable to find Msg3 time domain allocation in list\n"); + AssertFatal(ra->Msg3_tda_id<16,"Unable to find Msg3 time domain allocation in list\n"); - uint8_t k2 = *ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->k2; + uint8_t k2 = *ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->k2; - temp_slot = current_slot + k2 + DELTA[mu]; // msg3 slot according to 8.3 in 38.213 - ra->Msg3_slot = temp_slot%nr_slots_per_frame[mu]; - if (nr_slots_per_frame[mu]>temp_slot) - ra->Msg3_frame = current_frame; - else - ra->Msg3_frame = current_frame + (temp_slot/nr_slots_per_frame[mu]); + temp_slot = current_slot + k2 + DELTA[mu]; // msg3 slot according to 8.3 in 38.213 + ra->Msg3_slot = temp_slot%nr_slots_per_frame[mu]; + if (nr_slots_per_frame[mu]>temp_slot) + ra->Msg3_frame = current_frame; + else + ra->Msg3_frame = current_frame + (temp_slot/nr_slots_per_frame[mu]); - LOG_I(MAC, "[RAPROC] Msg3 slot %d: current slot %u Msg3 frame %u k2 %u Msg3_tda_id %u start symbol index %u\n", ra->Msg3_slot, current_slot, ra->Msg3_frame, k2,ra->Msg3_tda_id, StartSymbolIndex); - uint16_t *vrb_map_UL = - &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE]; - const uint16_t bwpSize = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + LOG_D(MAC, "[RAPROC] Msg3 slot %d: current slot %u Msg3 frame %u k2 %u Msg3_tda_id %u start symbol index %u\n", ra->Msg3_slot, current_slot, ra->Msg3_frame, k2,ra->Msg3_tda_id, StartSymbolIndex); + uint16_t *vrb_map_UL = + &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE]; + const uint16_t bwpSize = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - /* search msg3_nb_rb free RBs */ + /* search msg3_nb_rb free RBs */ int rbSize = 0; int rbStart = 0; while (rbSize < msg3_nb_rb) { @@ -824,7 +829,6 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; - NR_RA_t *ra = &cc->ra[0]; if ((ra->Msg2_frame == frameP) && (ra->Msg2_slot == slotP)) { @@ -838,14 +842,31 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int time_domain_assignment = 0; uint8_t nr_of_candidates = 0; uint8_t aggregation_level = 0; + int rbStart = 0; + int rbSize = 6; + uint16_t *vrb_map = cc[CC_id].vrb_map; NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; + for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) { + if (vrb_map[rbStart + i]) { + rbStart += i; + i = 0; + } + } + if (rbStart > (BWPSize - rbSize)) { + LOG_E(MAC, "%s(): cannot find free vrb_map for RA RNTI %04x!\n", __func__, ra->RA_rnti); + return; + } + // Checking if the DCI allocation is feasible in current subframe if (dl_req->nPDUs > NFAPI_NR_MAX_DL_TTI_PDUS - 2) { LOG_I(MAC, "[RAPROC] Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", slotP, ra->RA_rnti); @@ -866,8 +887,6 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra return; } - nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; - // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially // important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them const int bwpid = bwp->bwp_Id; @@ -894,14 +913,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dl_req->nPDUs+=1; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; - LOG_I(NR_MAC,"[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state); + LOG_I(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d\n", module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state); - // This code from this point on will not work on initialBWP or CORESET0 - AssertFatal(ra->bwp_id>0,"cannot work on initialBWP for now\n"); - - AssertFatal(ra->secondaryCellGroup, - "no secondaryCellGroup for RNTI %04x\n", - ra->crnti); + AssertFatal(ra->secondaryCellGroup, "no secondaryCellGroup for RNTI %04x\n", ra->crnti); AssertFatal(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList has %d BWP!\n", ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); @@ -912,15 +926,14 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // information to data and is reset every slot. const int pduindex = nr_mac->pdu_index[CC_id]++; pdsch_pdu_rel15->pduIndex = pduindex; - pdsch_pdu_rel15->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_pdu_rel15->BWPSize = BWPSize; + pdsch_pdu_rel15->BWPStart = BWPStart; pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,0); pdsch_pdu_rel15->qamModOrder[0] = 2; pdsch_pdu_rel15->mcsIndex[0] = mcsIndex; - if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) pdsch_pdu_rel15->mcsTable[0] = 0; else{ @@ -929,7 +942,6 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra else pdsch_pdu_rel15->mcsTable[0] = 2; } - pdsch_pdu_rel15->rvIndex[0] = 0; pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; pdsch_pdu_rel15->nrOfLayers = 1; @@ -941,8 +953,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2; pdsch_pdu_rel15->dmrsPorts = 1; pdsch_pdu_rel15->resourceAlloc = 1; - pdsch_pdu_rel15->rbStart = 0; - pdsch_pdu_rel15->rbSize = 6; + pdsch_pdu_rel15->rbStart = rbStart; + pdsch_pdu_rel15->rbSize = rbSize; pdsch_pdu_rel15->VRBtoPRBMapping = 0; for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { @@ -1011,17 +1023,6 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->BWPSize, nr_mac->sched_ctrlCommon->active_bwp->bwp_Id); - // Program UL processing for Msg3 - NR_BWP_Uplink_t *ubwp=ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1]; - nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra); - LOG_I(MAC, "Frame %d, Subframe %d: Setting Msg3 reception for Frame %d Subframe %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot); - nr_add_msg3(module_idP, CC_id, frameP, slotP); - ra->state = WAIT_Msg3; - LOG_I(MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state); - - x_Overhead = 0; - nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); - // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; tx_req->PDU_length = pdsch_pdu_rel15->TBSize[0]; @@ -1031,16 +1032,25 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra nr_mac->TX_req[CC_id].SFN = frameP; nr_mac->TX_req[CC_id].Number_of_PDUs++; nr_mac->TX_req[CC_id].Slot = slotP; - memcpy((void*)&tx_req->TLVs[0].value.direct[0], (void*)&cc[CC_id].RAR_pdu.payload[0], tx_req->TLVs[0].length); + + // Program UL processing for Msg3 + NR_BWP_Uplink_t *ubwp=ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1]; + nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra); + LOG_I(MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception for Frame %d Subframe %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot); + nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]); + ra->state = WAIT_Msg3; + LOG_I(MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state); + + x_Overhead = 0; + nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), - T_INT(ra->RA_rnti), T_INT(frameP), T_INT(slotP), T_INT(0) /* harq pid, meaningful? */, - T_BUFFER(&cc[CC_id].RAR_pdu.payload[0], tx_req->TLVs[0].length)); + T_INT(ra->RA_rnti), T_INT(frameP), T_INT(slotP), T_INT(0), + T_BUFFER(&tx_req->TLVs[0].value.direct[0], tx_req->TLVs[0].length)); - // mark the corresponding RBs as used - uint16_t *vrb_map = cc[CC_id].vrb_map; - for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) { - vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1; + // Mark the corresponding RBs as used + for (int rb = 0; rb < rbSize; rb++) { + vrb_map[rb + rbStart] = 1; } } } @@ -1124,10 +1134,7 @@ void nr_generate_Msg4(module_id_t module_idP, LOG_I(NR_MAC,"[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state); - // This code from this point on will not work on initialBWP or CORESET0 - AssertFatal(ra->bwp_id>0,"cannot work on initialBWP for now\n"); AssertFatal(ra->secondaryCellGroup, "no secondaryCellGroup for RNTI %04x\n", ra->rnti); - AssertFatal(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList has %d BWP!\n", ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); @@ -1254,7 +1261,7 @@ void nr_generate_Msg4(module_id_t module_idP, nr_mac->TX_req[CC_id].Slot = slotP; memcpy(tx_req->TLVs[0].value.direct, payload, tx_req->TLVs[0].length); - // mark the corresponding RBs as used + // Mark the corresponding RBs as used uint16_t *vrb_map = cc[CC_id].vrb_map; for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) { vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index f2c75acd22..d9948b64b8 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -1698,7 +1698,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *secon add_tail_nr_list(&sched_ctrl->available_ul_harq, harq); create_nr_list(&sched_ctrl->feedback_ul_harq, 16); create_nr_list(&sched_ctrl->retrans_ul_harq, 16); - LOG_I(MAC, "gNB %d] Add NR UE_id %d : rnti %x\n", + LOG_I(MAC, "[gNB %d] Add NR UE_id %d : rnti %x\n", mod_idP, UE_id, rntiP); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 629b4dc7b0..4c7e063a0f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -164,7 +164,7 @@ void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =0; } - LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d\n", + LOG_D (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d\n", UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen, UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen, UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index ad71e467c3..b0b6ebbd5a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -476,13 +476,14 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->secondaryCellGroup); UE_info->UE_beam_index[UE_id] = ra->beam_id; LOG_I(NR_MAC, - "[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, " + "[gNB %d][RAPROC] PUSCH with TC-RNTI %x received correctly, " "adding UE MAC Context UE_id %d/RNTI %04x\n", gnb_mod_idP, current_rnti, UE_id, ra->rnti); + LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received\n"); LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n"); for (int k = 0; k < sdu_lenP; k++) { LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); @@ -496,7 +497,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, ra->state = Msg4; ra->Msg4_frame = ( frameP +2 ) % 1024; ra->Msg4_slot = 1; - LOG_I(MAC, "set RA state to Msg4 for RA-RNTI %04x, msg4 frame %d %d\n", ra->rnti, ra->Msg4_frame, ra->Msg4_slot); + LOG_I(MAC, "Scheduling RA-Msg4 for TC-RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot); return; } } diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index b183b32aab..63cc0cf0de 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -56,7 +56,7 @@ extern uint16_t sl_ahead; void handle_nr_rach(NR_UL_IND_t *UL_info) { if (UL_info->rach_ind.number_of_pdus>0) { - LOG_I(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",UL_info->frame,UL_info->slot, UL_info->rach_ind.sfn,UL_info->rach_ind.slot); + LOG_D(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",UL_info->frame,UL_info->slot, UL_info->rach_ind.sfn,UL_info->rach_ind.slot); int npdus = UL_info->rach_ind.number_of_pdus; for(int i = 0; i < npdus; i++) { UL_info->rach_ind.number_of_pdus--; From eb17629d34d146b24d5f2f6ed7fbeb7187213468 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 26 Feb 2021 00:51:03 +0000 Subject: [PATCH 016/125] nr_generate_Msg4 support for multiple RA procedures --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 22 ++++++------------- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 10 ++------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 288b57659d..5b21b9a68c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -475,7 +475,7 @@ void nr_initiate_ra_proc(module_id_t module_idP, NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; - uint8_t total_RApreambles = 64; + uint8_t total_RApreambles = MAX_NUM_NR_PRACH_PREAMBLES; uint8_t num_ssb_per_RO = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present; int pr_found; @@ -624,16 +624,16 @@ void nr_initiate_ra_proc(module_id_t module_idP, NR_COMMON_channels_t *cc = &mac->common_channels[CC_id]; for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { NR_RA_t *ra = &cc->ra[i]; - LOG_D(MAC, "RA[state:%d]\n", ra->state); + LOG_D(NR_MAC, "RA[state:%d]\n", ra->state); switch (ra->state) { case Msg2: nr_generate_Msg2(module_idP, CC_id, frameP, slotP, ra); break; case Msg4: - nr_generate_Msg4(module_idP, CC_id, frameP, slotP); + nr_generate_Msg4(module_idP, CC_id, frameP, slotP, ra); break; case WAIT_Msg4_ACK: - nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP); + nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP, ra); break; default: break; @@ -1055,14 +1055,10 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } } -void nr_generate_Msg4(module_id_t module_idP, - int CC_id, - frame_t frameP, - sub_frame_t slotP) { +void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra) { gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; - NR_RA_t *ra = &cc->ra[0]; if (ra->Msg4_frame == frameP && ra->Msg4_slot == slotP ) { @@ -1285,16 +1281,12 @@ void nr_generate_Msg4(module_id_t module_idP, } } -void nr_check_Msg4_Ack(module_id_t module_id, - int CC_id, - frame_t frame, - sub_frame_t slot) { +void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra) { LOG_W(NR_MAC,"nr_check_Msg4_Ack() is not implemented yet!\n"); gNB_MAC_INST *nr_mac = RC.nrmac[module_id]; NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; - NR_RA_t *ra = &cc->ra[0]; ra->state = RA_IDLE; } @@ -1303,7 +1295,7 @@ void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP){ NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[0]; LOG_D(MAC,"[gNB %d][RAPROC] CC_id %d Frame %d Clear Random access information rnti %x\n", module_idP, CC_id, frameP, ra->rnti); - ra->state = IDLE; + ra->state = RA_IDLE; ra->timing_offset = 0; ra->RRC_timer = 20; ra->rnti = 0; diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 5d77bcb949..823e374ceb 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -355,15 +355,9 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP, void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra); -void nr_generate_Msg4(module_id_t module_idP, - int CC_id, - frame_t frameP, - sub_frame_t slotP); +void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra); -void nr_check_Msg4_Ack(module_id_t module_id, - int CC_id, - frame_t frame, - sub_frame_t slot); +void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra); void nr_process_mac_pdu( module_id_t module_idP, From fc9b781c2a7de5f4b2b751fc2956d05b54d104f2 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 26 Feb 2021 20:15:06 +0000 Subject: [PATCH 017/125] Avoid multiple transmissions in the RA-Msg4 slot --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 8 +++++++- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 5 ----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index 7201b29596..6164f64e21 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -438,7 +438,13 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, } // This schedules the DCI for Downlink and PDSCH - if (is_xlsch_in_slot(dlsch_in_slot_bitmap, slot)) + bool tx_ra_msg4 = false; + for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { + if(cc->ra[i].state == Msg4 && cc->ra[i].Msg4_frame==frame && cc->ra[i].Msg4_slot==slot) { + tx_ra_msg4 = true; + } + } + if ( is_xlsch_in_slot(dlsch_in_slot_bitmap, slot) && tx_ra_msg4 == false ) nr_schedule_ue_spec(module_idP, frame, slot); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 5b21b9a68c..1eb25c0366 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1282,12 +1282,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra) { - LOG_W(NR_MAC,"nr_check_Msg4_Ack() is not implemented yet!\n"); - - gNB_MAC_INST *nr_mac = RC.nrmac[module_id]; - NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; - ra->state = RA_IDLE; } From 9ce7f945184d6d2ae12bb320c455506981ea0f5b Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Sun, 28 Feb 2021 21:39:53 +0100 Subject: [PATCH 018/125] record/replay for 5G, nrscope bug fix --- executables/main-ocp.c | 4 +- executables/nr-ru.c | 5 +- executables/nr-softmodem.c | 2 +- executables/nr-uesoftmodem.c | 2 +- executables/ocp-gnb.c | 2 +- executables/softmodem-common.c | 2 +- executables/softmodem-common.h | 4 +- openair1/PHY/TOOLS/nr_phy_scope.c | 108 ++- openair1/PHY/TOOLS/nr_phy_scope.h | 8 +- openair1/PHY/TOOLS/phy_scope_interface.c | 1 + openair1/PHY/TOOLS/phy_scope_interface.h | 19 + targets/ARCH/COMMON/record_player.c | 24 +- targets/ARCH/COMMON/record_player.h | 19 +- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 950 +++++++++---------- targets/ARCH/iqplayer/iqplayer_lib.c | 205 ++-- targets/RT/USER/lte-softmodem.c | 4 +- targets/RT/USER/lte-uesoftmodem.c | 4 +- 17 files changed, 671 insertions(+), 692 deletions(-) diff --git a/executables/main-ocp.c b/executables/main-ocp.c index ae1db7195b..d1ccda95c3 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -1318,7 +1318,7 @@ int main ( int argc, char **argv ) { // end of CI modifications //getchar(); - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) load_softscope("enb", NULL); itti_wait_tasks_end(); @@ -1327,7 +1327,7 @@ int main ( int argc, char **argv ) { // stop threads if (RC.nb_inst == 0 || !NODE_IS_CU(node_type)) { - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) end_forms(); LOG_I(ENB_APP,"stopping MODEM threads\n"); diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 73421d8ed7..9e9303e228 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -89,7 +89,7 @@ static int DEFBFW[] = {0x00007fff}; #include "s1ap_eNB.h" #include "SIMULATION/ETH_TRANSPORT/proto.h" - +#include #include "T.h" @@ -1593,7 +1593,8 @@ void *ru_thread( void *param ) { for (aa=0;aanb_rx;aa++) memcpy((void*)RC.gNB[0]->common_vars.rxdataF[aa], (void*)ru->common.rxdataF[aa], fp->symbols_per_slot*fp->ofdm_symbol_size*sizeof(int32_t)); - + if (IS_SOFTMODEM_DOSCOPE && RC.gNB[0]->scopeData) + ((scopeData_t*)RC.gNB[0]->scopeData)->slotFunc(ru->common.rxdataF[0],proc->tti_rx, RC.gNB[0]->scopeData); // Do PRACH RU processing int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST); diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 924c32b8a7..4d88edebb2 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -900,7 +900,7 @@ if(!IS_SOFTMODEM_NOS1) printf("RC.nb_RU:%d\n", RC.nb_RU); // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration) printf("ALL RUs ready - init gNBs\n"); - if(IS_SOFTMODEM_DOFORMS) { + if(IS_SOFTMODEM_DOSCOPE) { sleep(1); scopeParms_t p; p.argc=&argc; diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 5d651344d6..981ee735c9 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -551,7 +551,7 @@ int main( int argc, char **argv ) { configure_linux(); mlockall(MCL_CURRENT | MCL_FUTURE); - if(IS_SOFTMODEM_DOFORMS) { + if(IS_SOFTMODEM_DOSCOPE) { load_softscope("nr",PHY_vars_UE_g[0][0]); } diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c index 4ddc7870d9..a468861533 100644 --- a/executables/ocp-gnb.c +++ b/executables/ocp-gnb.c @@ -996,7 +996,7 @@ int main( int argc, char **argv ) { (void *)NULL, "time_meas", -1, OAI_PRIORITY_RT_LOW); } - if(IS_SOFTMODEM_DOFORMS) { + if(IS_SOFTMODEM_DOSCOPE) { scopeParms_t tmp= {&argc, argv, &ru, RC.gNB[0]}; load_softscope("nr",&tmp); } diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c index 1077c0e1ac..72cf2e32c5 100644 --- a/executables/softmodem-common.c +++ b/executables/softmodem-common.c @@ -140,7 +140,7 @@ void get_common_options(uint32_t execmask) { } if (do_forms) { - set_softmodem_optmask(SOFTMODEM_DOFORMS_BIT); + set_softmodem_optmask(SOFTMODEM_DOSCOPE_BIT); } if(parallel_config != NULL) set_parallel_conf(parallel_config); diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 60a761c732..4bbeaff32b 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -188,7 +188,7 @@ extern "C" #define SOFTMODEM_RFSIM_BIT (1<<10) #define SOFTMODEM_BASICSIM_BIT (1<<11) #define SOFTMODEM_SIML1_BIT (1<<12) -#define SOFTMODEM_DOFORMS_BIT (1<<15) +#define SOFTMODEM_DOSCOPE_BIT (1<<15) #define SOFTMODEM_RECPLAY_BIT (1<<16) #define SOFTMODEM_ENB_BIT (1<<20) #define SOFTMODEM_GNB_BIT (1<<21) @@ -204,7 +204,7 @@ extern "C" #define IS_SOFTMODEM_RFSIM ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT) #define IS_SOFTMODEM_BASICSIM ( get_softmodem_optmask() & SOFTMODEM_BASICSIM_BIT) #define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT) -#define IS_SOFTMODEM_DOFORMS ( get_softmodem_optmask() & SOFTMODEM_DOFORMS_BIT) +#define IS_SOFTMODEM_DOSCOPE ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE_BIT) #define IS_SOFTMODEM_IQPLAYER ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT) #define IS_SOFTMODEM_ENB_BIT ( get_softmodem_optmask() & SOFTMODEM_ENB_BIT) #define IS_SOFTMODEM_GNB_BIT ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT) diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index d78e0ffaa2..b42dcd11ee 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -56,7 +56,7 @@ typedef struct OAIgraph { double *waterFallAvg; boolean_t initDone; int iteration; - void (*gNBfunct) (struct OAIgraph *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id); + void (*gNBfunct) (struct OAIgraph *graph, scopeData_t *p, int UE_id); void (*nrUEfunct)(struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); } OAIgraph_t; @@ -132,7 +132,7 @@ static void commonGraph(OAIgraph_t *graph, int type, FL_Coord x, FL_Coord y, FL_ graph->iteration=0; } -static OAIgraph_t gNBcommonGraph( void (*funct) (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id), +static OAIgraph_t gNBcommonGraph( void (*funct) (OAIgraph_t *graph, scopeData_t *p, int UE_id), int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) { OAIgraph_t graph; commonGraph(&graph, type, x, y, w, h, label, pointColor); @@ -223,7 +223,8 @@ static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int laye static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const int datasize, const int divisions, const char *label) { if ( values == NULL ) - return; + return; + fl_winset(FL_ObjWin(graph->graph)); const int samplesPerPixel=datasize/graph->w; int displayPart=graph->waterFallh-ScaleZone; @@ -318,10 +319,10 @@ static void genericPowerPerAntena(OAIgraph_t *graph, const int nb_ant, const sc } } -static void gNBWaterFall (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { - NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms; +static void gNBWaterFall (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { + NR_DL_FRAME_PARMS *frame_parms=&p->gNB->frame_parms; //use 1st antenna - genericWaterFall(graph, (scopeSample_t *)phy_vars_ru->common.rxdata[0], + genericWaterFall(graph, (scopeSample_t *)p->ru->common.rxdata[0], frame_parms->samples_per_frame, frame_parms->slots_per_frame, "X axis:one frame in time"); } @@ -339,31 +340,35 @@ static void timeSignal (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy } */ -static void timeResponse (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { - const int len=2*phy_vars_gnb->frame_parms.ofdm_symbol_size; +static void timeResponse (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { + const int len=2*p->gNB->frame_parms.ofdm_symbol_size; float *values, *time; oai_xygraph_getbuff(graph, &time, &values, len, 0); const int ant=0; // display antenna 0 for each UE for (int ue=0; uepusch_vars[ue]->ul_ch_estimates_time[ant]; + if ( p->gNB->pusch_vars && p->gNB->pusch_vars[ue] && + p->gNB->pusch_vars[ue]->ul_ch_estimates_time && + p->gNB->pusch_vars[ue]->ul_ch_estimates_time[ant] ) { + scopeSample_t *data= (scopeSample_t *)p->gNB->pusch_vars[ue]->ul_ch_estimates_time[ant]; - if (data != NULL) { - for (int i=0; iframe_parms; +static void gNBfreqWaterFall (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { + NR_DL_FRAME_PARMS *frame_parms=&p->gNB->frame_parms; //use 1st antenna - genericWaterFall(graph, (scopeSample_t *)phy_vars_ru->common.rxdataF[0], frame_parms->samples_per_frame_wCP, + genericWaterFall(graph, (scopeSample_t *)p->rxdataF, frame_parms->samples_per_frame_wCP, frame_parms->slots_per_frame, - "X axis: Frequency domain, one frame"); + "X axis: Frequency domain, one subframe"); } /* @@ -375,16 +380,18 @@ static void frequencyResponse (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU } */ -static void puschLLR (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { +static void puschLLR (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { //int Qm = 2; int coded_bits_per_codeword =3*8*6144+12; // (8*((3*8*6144)+12)); // frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti; for (int ue=0; uepusch_vars[ue]->llr; - float *llr, *bit; - oai_xygraph_getbuff(graph, &bit, &llr, coded_bits_per_codeword, ue); + if ( p->gNB->pusch_vars && + p->gNB->pusch_vars[ue] && + p->gNB->pusch_vars[ue]->llr ) { + int16_t *pusch_llr = (int16_t *)p->gNB->pusch_vars[ue]->llr; + float *llr, *bit; + oai_xygraph_getbuff(graph, &bit, &llr, coded_bits_per_codeword, ue); - if (pusch_llr) { for (int i=0; iframe_parms; +static void puschIQ (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { + NR_DL_FRAME_PARMS *frame_parms=&p->gNB->frame_parms; int sz=frame_parms->N_RB_UL*12*frame_parms->symbols_per_slot; for (int ue=0; uepusch_vars[ue]->rxdataF_comp[0]; - float *I, *Q; - oai_xygraph_getbuff(graph, &I, &Q, sz, ue); + if ( p->gNB->pusch_vars && + p->gNB->pusch_vars[ue] && + p->gNB->pusch_vars[ue]->rxdataF_comp && + p->gNB->pusch_vars[ue]->rxdataF_comp[0] ) { + scopeSample_t *pusch_comp = (scopeSample_t *) p->gNB->pusch_vars[ue]->rxdataF_comp[0]; + float *I, *Q; + oai_xygraph_getbuff(graph, &I, &Q, sz, ue); - if (pusch_comp) { for (int k=0; kpucch1ab_stats[UE_id]; @@ -440,10 +450,10 @@ static void pucchEnergy (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *ph */ } -static void pucchIQ (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { +static void pucchIQ (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { } -static void puschThroughtput (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { +static void puschThroughtput (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { // PUSCH Throughput /* float tput_time_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; @@ -510,8 +520,7 @@ static OAI_phy_scope_t *create_phy_scope_gnb(void) { static const int scope_enb_num_ue = 1; void phy_scope_gNB(OAI_phy_scope_t *form, - PHY_VARS_gNB *phy_vars_gnb, - RU_t *phy_vars_ru, + scopeData_t *p, int UE_id) { static OAI_phy_scope_t *rememberForm=NULL; @@ -526,7 +535,7 @@ void phy_scope_gNB(OAI_phy_scope_t *form, int i=0; while (form->graph[i].graph) { - form->graph[i].gNBfunct(form->graph+i, phy_vars_gnb, phy_vars_ru, UE_id); + form->graph[i].gNBfunct(form->graph+i, p, UE_id); i++; } @@ -534,7 +543,7 @@ void phy_scope_gNB(OAI_phy_scope_t *form, } static void *scope_thread_gNB(void *arg) { - scopeParms_t *p=(scopeParms_t *) arg; + scopeData_t *p=(scopeData_t *) arg; //# ifdef ENABLE_XFORMS_WRITE_STATS // FILE *gNB_stats = fopen("gNB_stats.txt", "w"); //#endif @@ -543,12 +552,6 @@ static void *scope_thread_gNB(void *arg) { pthread_attr_init(&atr); pthread_attr_getstacksize(&atr, &stksize); pthread_attr_setstacksize(&atr,32*1024*1024 ); - p.gNB->scopeData=calloc(sizeof(nrscope_t)); - nrscope_t scope=(nrscope_t*) p.gNB->scopeData; - scope->rxdataF=(int32_t **)malloc16(Prx*sizeof(int32_t*)); - for (int i=0; i < p.gNB->gNB_config.carrier_config.num_rx_ant.value; ; i++) - scope->rxdataF[i] = (scopeSample_t*)malloc16_clear(p->gNB.frme_parms.samples_per_frame_wCP*sizeof(scopeSample_t)); - sleep(3); // no clean interthread barriers int fl_argc=1; char *name="5G-gNB-scope"; @@ -557,18 +560,31 @@ static void *scope_thread_gNB(void *arg) { OAI_phy_scope_t *form_gnb = create_phy_scope_gnb(); while (!oai_exit) { - phy_scope_gNB(form_gnb, p->gNB, p->ru, nb_ue); + phy_scope_gNB(form_gnb, p, nb_ue); usleep(99*1000); } return NULL; } +static void copyRxdataF(int32_t *data, int slot, void *scopeData) { + scopeData_t *scope=(scopeData_t *)scopeData; + memcpy(scope->rxdataF + slot*scope->gNB->frame_parms.samples_per_slot_wCP, + data, + scope->gNB->frame_parms.samples_per_slot_wCP); +} + void gNBinitScope(scopeParms_t *p) { - static scopeParms_t parms; - memcpy(&parms,p,sizeof(parms)); + AssertFatal(p->gNB->scopeData=malloc(sizeof(scopeData_t)),""); + scopeData_t *scope=(scopeData_t *) p->gNB->scopeData; + scope->argc=p->argc; + scope->argv=p->argv; + scope->ru=p->ru; + scope->gNB=p->gNB; + scope->slotFunc=copyRxdataF; + AssertFatal(scope->rxdataF=(int32_t *) calloc(p->gNB->frame_parms.samples_per_frame_wCP*sizeof(int32_t),1),""); pthread_t forms_thread; - threadCreate(&forms_thread, scope_thread_gNB, &parms, "scope", -1, OAI_PRIORITY_RT_LOW); + threadCreate(&forms_thread, scope_thread_gNB, p->gNB->scopeData, "scope", -1, OAI_PRIORITY_RT_LOW); } static void ueWaterFall (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { diff --git a/openair1/PHY/TOOLS/nr_phy_scope.h b/openair1/PHY/TOOLS/nr_phy_scope.h index 84b9e66908..e34ddf2c20 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.h +++ b/openair1/PHY/TOOLS/nr_phy_scope.h @@ -33,13 +33,7 @@ //#include "PHY/impl_defs_top.h" #include "PHY/defs_nr_UE.h" -typedef struct { - int *argc; - char **argv; - RU_t *ru; - PHY_VARS_gNB *gNB; -} scopeParms_t; - +#include extern RAN_CONTEXT_t RC; #endif diff --git a/openair1/PHY/TOOLS/phy_scope_interface.c b/openair1/PHY/TOOLS/phy_scope_interface.c index af237b2325..7cd68c53d2 100644 --- a/openair1/PHY/TOOLS/phy_scope_interface.c +++ b/openair1/PHY/TOOLS/phy_scope_interface.c @@ -35,6 +35,7 @@ #include "phy_scope_interface.h" #define SOFTSCOPE_ENDFUNC_IDX 0 + static loader_shlibfunc_t scope_fdesc[]= {{"end_forms",NULL}}; int load_softscope(char *exectype, void *initarg) { diff --git a/openair1/PHY/TOOLS/phy_scope_interface.h b/openair1/PHY/TOOLS/phy_scope_interface.h index adf04d5ea4..8b747d575d 100644 --- a/openair1/PHY/TOOLS/phy_scope_interface.h +++ b/openair1/PHY/TOOLS/phy_scope_interface.h @@ -29,7 +29,26 @@ * \note * \warning */ +#ifndef __PHY_SCOPE_INTERFACE_H__ +#define __PHY_SCOPE_INTERFACE_H__ +#include +typedef struct { + int *argc; + char **argv; + RU_t *ru; + PHY_VARS_gNB *gNB; +} scopeParms_t; +typedef struct scopeData_s { + int *argc; + char **argv; + RU_t *ru; + PHY_VARS_gNB *gNB; + int32_t * rxdataF; + void (*slotFunc)(int32_t* data, int slot, void * scopeData); +} scopeData_t; + int load_softscope(char *exectype, void *initarg); int end_forms(void) ; +#endif diff --git a/targets/ARCH/COMMON/record_player.c b/targets/ARCH/COMMON/record_player.c index 2dcd61e479..522f6b6d16 100644 --- a/targets/ARCH/COMMON/record_player.c +++ b/targets/ARCH/COMMON/record_player.c @@ -68,8 +68,10 @@ int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_ *recplay_conf=NULL; } - if (u_sf_replay == 1) return RECPLAY_REPLAYMODE; - else if (u_sf_record == 1) return RECPLAY_RECORDMODE; + if (u_sf_replay == 1) + return RECPLAY_REPLAYMODE; + else if (u_sf_record == 1) + return RECPLAY_RECORDMODE; return 0; } @@ -80,7 +82,7 @@ int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_ */ void iqrecorder_end(openair0_device *device) { if (device->recplay_state != NULL) { // subframes store - iqfile_header_t fh = {device->type,device->openair0_cfg->tx_sample_advance, device->openair0_cfg->rx_bw,OAIIQFILE_ID}; + iqfile_header_t fh = {device->type,device->openair0_cfg->tx_sample_advance, device->openair0_cfg->rx_bw,0,OAIIQFILE_ID}; recplay_state_t *rs = device->recplay_state; recplay_conf_t *rc = device->openair0_cfg[0].recplay_conf; rs->pFile = fopen (rc->u_sf_filename,"wb+"); @@ -91,16 +93,20 @@ void iqrecorder_end(openair0_device *device) { unsigned int i = 0; unsigned int modu = 0; - if ((modu = rs->nb_samples % 10) != 0) { - rs->nb_samples -= modu; // store entire number of frames + if ((modu = rs->nbSamplesBlocks % 10) != 0) { + rs->nbSamplesBlocks -= modu; // store entire number of frames } + fh.nbSamplesBlocks=rs->nbSamplesBlocks; LOG_I(HW,"Writing file header to %s \n", rc->u_sf_filename ); fwrite(&fh, sizeof(fh), 1, rs->pFile); - LOG_UI(HW,"Writing %u subframes to %s \n",rs->nb_samples, rc->u_sf_filename ); + LOG_UI(HW,"Writing %u subframes to %s \n",rs->nbSamplesBlocks, rc->u_sf_filename ); + uint8_t *ptr=(uint8_t *)rs->ms_sample; - for (i = 0; i < rs->nb_samples; i++) { - fwrite(rs->ms_sample+i, sizeof(unsigned char), sizeof(iqrec_t), rs->pFile); + for (i = 0; i < rs->nbSamplesBlocks; i++) { + int blockBytes=sizeof(iqrec_t)+((iqrec_t *)ptr)->nbBytes; + fwrite(ptr, sizeof(unsigned char), blockBytes, rs->pFile); + ptr+=blockBytes; } fclose (rs->pFile); @@ -112,4 +118,4 @@ void iqrecorder_end(openair0_device *device) { rs->ms_sample = NULL; } } -} \ No newline at end of file +} diff --git a/targets/ARCH/COMMON/record_player.h b/targets/ARCH/COMMON/record_player.h index 500acdd709..d91da68323 100644 --- a/targets/ARCH/COMMON/record_player.h +++ b/targets/ARCH/COMMON/record_player.h @@ -46,21 +46,22 @@ extern "C" #define BELL_LABS_IQ_HEADER 0xabababababababab #define BELL_LABS_IQ_PER_SF 7680 // Up to 5MHz bw for now #define BELL_LABS_IQ_BYTES_PER_SF (BELL_LABS_IQ_PER_SF * 4) +#define MAX_BELL_LABS_IQ_BYTES_PER_SF BELL_LABS_IQ_BYTES_PER_SF*10 -#define OAIIQFILE_ID "OIQF" +#define OAIIQFILE_ID {'O', 'I','Q','F'} typedef struct { uint64_t devtype; uint64_t tx_sample_advance; double bw; + unsigned int nbSamplesBlocks; char oaiid[4]; } iqfile_header_t; typedef struct { int64_t header; int64_t ts; - int64_t rfu1; + int64_t nbBytes; int64_t rfu2; // pad for 256 bits alignement required by AVX2 - unsigned char samples[BELL_LABS_IQ_BYTES_PER_SF]; // iq's for one subframe } iqrec_t; #define DEF_NB_SF 120000 // default nb of sf or ms to capture (2 minutes at 5MHz) #define DEF_SF_FILE "/tmp/iqfile" // default subframes file name @@ -114,14 +115,16 @@ typedef struct { int use_mmap; // default is to use mmap size_t mapsize; FILE *pFile; - int mmapfd; - int iqfd; + int fd; iqrec_t *ms_sample; // memory for all subframes - unsigned int nb_samples; + unsigned int nbSamplesBlocks; + uint8_t *currentPtr; + uint64_t currentTs; + unsigned int curSamplesBlock; + int64_t wrap_count; + size_t maxSizeBytes; } recplay_state_t; - - #ifdef __cplusplus } #endif diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index dd29d01fae..d6ee1b340a 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -272,11 +272,10 @@ static int sync_to_gps(openair0_device *device) { */ static int trx_usrp_start(openair0_device *device) { usrp_state_t *s = (usrp_state_t *)device->priv; - // setup GPIO for TDD, GPIO(4) = ATR_RX //set data direction register (DDR) to output s->usrp->set_gpio_attr("FP0", "DDR", 0xfff, 0xfff); - //set lower 7 bits to be controlled automatically by ATR (the rest 5 bits are controlled manually) + //set lower 7 bits to be controlled automatically by ATR (the rest 5 bits are controlled manually) s->usrp->set_gpio_attr("FP0", "CTRL", 0x7f,0xfff); //set pins 4 (RX_TX_Switch) and 6 (Shutdown PA) to 1 when the radio is only receiving (ATR_RX) s->usrp->set_gpio_attr("FP0", "ATR_RX", (1<<4)|(1<<6), 0x7f); @@ -285,26 +284,24 @@ static int trx_usrp_start(openair0_device *device) { s->usrp->set_gpio_attr("FP0", "ATR_XX", (1<<5), 0x7f); // set the output pins to 1 s->usrp->set_gpio_attr("FP0", "OUT", 7<<7, 0xf80); - s->wait_for_first_pps = 1; s->rx_count = 0; s->tx_count = 0; //s->first_tx = 1; //s->first_rx = 1; s->rx_timestamp = 0; - s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); // wait for the pps to change uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(); + while (time_last_pps == s->usrp->get_time_last_pps()) { boost::this_thread::sleep(boost::posix_time::milliseconds(1)); } uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); - cmd.time_spec = uhd::time_spec_t(1.0); + cmd.time_spec = uhd::time_spec_t(1.0); cmd.stream_now = false; // start at constant delay s->rx_stream->issue_stream_cmd(cmd); - return 0; } /*! \brief Terminate operation of the USRP transceiver -- free all associated resources @@ -315,12 +312,11 @@ static void trx_usrp_end(openair0_device *device) { return; usrp_state_t *s = (usrp_state_t *)device->priv; - + if (s == NULL) return; + iqrecorder_end(device); - - } /*! \brief Called to send samples to the USRP RF target @@ -332,64 +328,59 @@ static void trx_usrp_end(openair0_device *device) { @param flags flags must be set to TRUE if timestamp parameter needs to be applied */ static int trx_usrp_write(openair0_device *device, - openair0_timestamp timestamp, - void **buff, - int nsamps, - int cc, - int flags) { + openair0_timestamp timestamp, + void **buff, + int nsamps, + int cc, + int flags) { int ret=0; usrp_state_t *s = (usrp_state_t *)device->priv; int nsamps2; // aligned to upper 32 or 16 byte boundary - int flags_lsb = flags&0xff; int flags_msb = (flags>>8)&0xff; - int end; openair0_thread_t *write_thread = &device->write_thread; openair0_write_package_t *write_package = write_thread->write_package; - AssertFatal( MAX_WRITE_THREAD_BUFFER_SIZE >= cc,"Do not support more than %d cc number\n", MAX_WRITE_THREAD_BUFFER_SIZE); + boolean_t first_packet_state=false,last_packet_state=false; - boolean_t first_packet_state=false,last_packet_state=false; - - if (flags_lsb == 2) { // start of burst - // s->tx_md.start_of_burst = true; - // s->tx_md.end_of_burst = false; - first_packet_state = true; - last_packet_state = false; - } else if (flags_lsb == 3) { // end of burst - //s->tx_md.start_of_burst = false; - //s->tx_md.end_of_burst = true; - first_packet_state = false; - last_packet_state = true; - } else if (flags_lsb == 4) { // start and end + if (flags_lsb == 2) { // start of burst + // s->tx_md.start_of_burst = true; + // s->tx_md.end_of_burst = false; + first_packet_state = true; + last_packet_state = false; + } else if (flags_lsb == 3) { // end of burst + //s->tx_md.start_of_burst = false; + //s->tx_md.end_of_burst = true; + first_packet_state = false; + last_packet_state = true; + } else if (flags_lsb == 4) { // start and end // s->tx_md.start_of_burst = true; // s->tx_md.end_of_burst = true; - first_packet_state = true; - last_packet_state = true; - } else if (flags_lsb==1) { // middle of burst + first_packet_state = true; + last_packet_state = true; + } else if (flags_lsb==1) { // middle of burst // s->tx_md.start_of_burst = false; // s->tx_md.end_of_burst = false; - first_packet_state = false; - last_packet_state = false; - } - else if (flags_lsb==10) { // fail safe mode - // s->tx_md.has_time_spec = false; - // s->tx_md.start_of_burst = false; - // s->tx_md.end_of_burst = true; - first_packet_state = false; - last_packet_state = true; - } + first_packet_state = false; + last_packet_state = false; + } else if (flags_lsb==10) { // fail safe mode + // s->tx_md.has_time_spec = false; + // s->tx_md.start_of_burst = false; + // s->tx_md.end_of_burst = true; + first_packet_state = false; + last_packet_state = true; + } - if(usrp_tx_thread == 0){ + if(usrp_tx_thread == 0) { #if defined(__x86_64) || defined(__i386__) - #ifdef __AVX2__ - nsamps2 = (nsamps+7)>>3; - __m256i buff_tx[8][nsamps2]; - #else +#ifdef __AVX2__ + nsamps2 = (nsamps+7)>>3; + __m256i buff_tx[8][nsamps2]; +#else nsamps2 = (nsamps+3)>>2; __m128i buff_tx[8][nsamps2]; - #endif +#endif #elif defined(__arm__) nsamps2 = (nsamps+3)>>2; int16x8_t buff_tx[8][nsamps2]; @@ -417,8 +408,8 @@ static int trx_usrp_write(openair0_device *device, s->tx_md.end_of_burst = last_packet_state; s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); s->tx_count++; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO,1); -VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO,1); // bit 3 enables gpio (for backward compatibility) if (flags_msb&8) { // push GPIO bits 7-9 from flags_msb @@ -427,7 +418,8 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI s->usrp->set_gpio_attr("FP0", "OUT", gpio789, 0x380); s->usrp->clear_command_time(); } -VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO,0); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO,0); if (cc>1) { std::vector buff_ptrs; @@ -436,18 +428,18 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI buff_ptrs.push_back(&(((int16_t *)buff_tx[i])[0])); ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md); - } - else { + } else { ret = (int)s->tx_stream->send(&(((int16_t *)buff_tx[0])[0]), nsamps, s->tx_md); } - if (ret != nsamps) LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps); + if (ret != nsamps) + LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps); + return ret; - } - else{ + } else { pthread_mutex_lock(&write_thread->mutex_write); - if(write_thread->count_write >= MAX_WRITE_THREAD_PACKAGE){ + if(write_thread->count_write >= MAX_WRITE_THREAD_PACKAGE) { LOG_W(HW,"Buffer overflow, count_write = %d, start = %d end = %d, resetting write package\n", write_thread->count_write, write_thread->start, write_thread->end); write_thread->end = write_thread->start; write_thread->count_write = 0; @@ -460,15 +452,16 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI write_package[end].first_packet = first_packet_state; write_package[end].last_packet = last_packet_state; write_package[end].flags_msb = flags_msb; + for (int i = 0; i < cc; i++) write_package[end].buff[i] = buff[i]; + write_thread->count_write++; write_thread->end = (write_thread->end + 1)% MAX_WRITE_THREAD_PACKAGE; pthread_cond_signal(&write_thread->cond_write); pthread_mutex_unlock(&write_thread->mutex_write); return 0; } - } //-----------------------start-------------------------- @@ -480,12 +473,11 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI @param antenna_id index of the antenna if the device has multiple antennas @param flags flags must be set to TRUE if timestamp parameter needs to be applied */ -void *trx_usrp_write_thread(void * arg){ +void *trx_usrp_write_thread(void *arg) { int ret=0; openair0_device *device=(openair0_device *)arg; openair0_thread_t *write_thread = &device->write_thread; openair0_write_package_t *write_package = write_thread->write_package; - usrp_state_t *s; int nsamps2; // aligned to upper 32 or 16 byte boundary int start; @@ -497,11 +489,13 @@ void *trx_usrp_write_thread(void * arg){ signed char last_packet; int flags_msb; - while(1){ + while(1) { pthread_mutex_lock(&write_thread->mutex_write); + while (write_thread->count_write == 0) { pthread_cond_wait(&write_thread->cond_write,&write_thread->mutex_write); // this unlocks mutex_rxtx while waiting and then locks it again } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD, 1 ); s = (usrp_state_t *)device->priv; start = write_thread->start; @@ -518,38 +512,36 @@ void *trx_usrp_write_thread(void * arg){ /*if(write_thread->count_write != 0){ LOG_W(HW,"count write = %d, start = %d, end = %d\n", write_thread->count_write, write_thread->start, write_thread->end); }*/ - - #if defined(__x86_64) || defined(__i386__) - #ifdef __AVX2__ - nsamps2 = (nsamps+7)>>3; - __m256i buff_tx[8][nsamps2]; - #else - nsamps2 = (nsamps+3)>>2; - __m128i buff_tx[8][nsamps2]; - #endif - #elif defined(__arm__) - nsamps2 = (nsamps+3)>>2; - int16x8_t buff_tx[8][nsamps2]; - #else - #error Unsupported CPU architecture, USRP device cannot be built - #endif +#if defined(__x86_64) || defined(__i386__) +#ifdef __AVX2__ + nsamps2 = (nsamps+7)>>3; + __m256i buff_tx[8][nsamps2]; +#else + nsamps2 = (nsamps+3)>>2; + __m128i buff_tx[8][nsamps2]; +#endif +#elif defined(__arm__) + nsamps2 = (nsamps+3)>>2; + int16x8_t buff_tx[8][nsamps2]; +#else +#error Unsupported CPU architecture, USRP device cannot be built +#endif // bring RX data into 12 LSBs for softmodem RX for (int i=0; itx_md.has_time_spec = true; s->tx_md.start_of_burst = (s->tx_count==0) ? true : first_packet; s->tx_md.end_of_burst = last_packet; @@ -572,34 +564,32 @@ void *trx_usrp_write_thread(void * arg){ buff_ptrs.push_back(&(((int16_t *)buff_tx[i])[0])); ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md); - } - else { + } else { ret = (int)s->tx_stream->send(&(((int16_t *)buff_tx[0])[0]), nsamps, s->tx_md); } - if (ret != nsamps) LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps); + if (ret != nsamps) + LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_USRP_SEND_RETURN, ret ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD, 0 ); - if(0) break; + if(0) + break; } return NULL; } -int trx_usrp_write_init(openair0_device *device){ - +int trx_usrp_write_init(openair0_device *device) { uhd::set_thread_priority_safe(1.0); openair0_thread_t *write_thread = &device->write_thread; printf("initializing tx write thread\n"); - write_thread->start = 0; write_thread->end = 0; write_thread->count_write = 0; printf("end of tx write thread\n"); - pthread_create(&write_thread->pthread_write,NULL,trx_usrp_write_thread,(void *)device); - return(0); } @@ -633,57 +623,60 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp int16x8_t buff_tmp[2][nsamps2]; #endif - if (cc>1) { - // receive multiple channels (e.g. RF A and RF B) - std::vector buff_ptrs; + if (cc>1) { + // receive multiple channels (e.g. RF A and RF B) + std::vector buff_ptrs; - for (int i=0; irx_stream->recv(buff_ptrs, nsamps, s->rx_md); - } else { - // receive a single channel (e.g. from connector RF A) - samples_received=0; + samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md); + } else { + // receive a single channel (e.g. from connector RF A) + samples_received=0; - while (samples_received != nsamps) { - samples_received += s->rx_stream->recv((void*)((int32_t*)buff_tmp[0]+samples_received), - nsamps-samples_received, s->rx_md); + while (samples_received != nsamps) { + samples_received += s->rx_stream->recv((void *)((int32_t *)buff_tmp[0]+samples_received), + nsamps-samples_received, s->rx_md); - if ((s->wait_for_first_pps == 0) && (s->rx_md.error_code!=uhd::rx_metadata_t::ERROR_CODE_NONE)) - break; + if ((s->wait_for_first_pps == 0) && (s->rx_md.error_code!=uhd::rx_metadata_t::ERROR_CODE_NONE)) + break; - if ((s->wait_for_first_pps == 1) && (samples_received != nsamps)) { - printf("sleep...\n"); //usleep(100); - } + if ((s->wait_for_first_pps == 1) && (samples_received != nsamps)) { + printf("sleep...\n"); //usleep(100); } - if (samples_received == nsamps) s->wait_for_first_pps=0; } - // bring RX data into 12 LSBs for softmodem RX - for (int i=0; iwait_for_first_pps=0; + } + + // bring RX data into 12 LSBs for softmodem RX + for (int i=0; irx_md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) LOG_E(HW, "%s\n", s->rx_md.to_pp_string(true).c_str()); @@ -691,21 +684,28 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp s->rx_count += nsamps; s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); *ptimestamp = s->rx_timestamp; - // push GPIO bits 7-9 from flags_msb - /*s->usrp->set_command_time(uhd::time_spec_t::from_ticks((s->rx_timestamp+(2*nsamps)),s->sample_rate)); - s->usrp->set_gpio_attr("FP0", "OUT", gpio789<<7, 0x380); - s->usrp->clear_command_time(); - gpio789 = (gpio789+1)&7;*/ + /*s->usrp->set_command_time(uhd::time_spec_t::from_ticks((s->rx_timestamp+(2*nsamps)),s->sample_rate)); + s->usrp->set_gpio_attr("FP0", "OUT", gpio789<<7, 0x380); + s->usrp->clear_command_time(); + gpio789 = (gpio789+1)&7;*/ + recplay_state_t *recPlay=device->recplay_state; - if (device->recplay_state != NULL) { // record mode + if ( recPlay != NULL) { // record mode // Copy subframes to memory (later dump on a file) - if (device->recplay_state->nb_samples < device->openair0_cfg->recplay_conf->u_sf_max) { - (device->recplay_state->ms_sample+device->recplay_state->nb_samples)->header = BELL_LABS_IQ_HEADER; - (device->recplay_state->ms_sample+device->recplay_state->nb_samples)->ts = *ptimestamp; - memcpy((device->recplay_state->ms_sample+device->recplay_state->nb_samples)->samples, buff[0], nsamps*4); - device->recplay_state->nb_samples++; - } else exit_function(__FILE__, __FUNCTION__, __LINE__,"Recording reaches max iq limit\n"); + if (recPlay->nbSamplesBlocks < device->openair0_cfg->recplay_conf->u_sf_max && + recPlay->maxSizeBytes > (recPlay->currentPtr-(uint8_t *)recPlay->ms_sample) + + sizeof(iqrec_t) + nsamps*4 ) { + iqrec_t *hdr=(iqrec_t *)recPlay->currentPtr; + hdr->header = BELL_LABS_IQ_HEADER; + hdr->ts = *ptimestamp; + hdr->nbBytes=nsamps*4; + memcpy(hdr+1, buff[0], nsamps*4); + recPlay->currentPtr+=sizeof(iqrec_t)+nsamps*4; + recPlay->nbSamplesBlocks++; + LOG_D(HW,"recorded %d samples, for TS %lu, shift in buffer %ld\n", nsamps, hdr->ts, recPlay->currentPtr-(uint8_t *)recPlay->ms_sample); + } else + exit_function(__FILE__, __FUNCTION__, __LINE__,"Recording reaches max iq limit\n"); } return samples_received; @@ -937,32 +937,30 @@ extern "C" { device->trx_set_freq_func = trx_usrp_set_freq; device->trx_set_gains_func = trx_usrp_set_gains; device->trx_write_init = trx_usrp_write_init; - - // hotfix! to be checked later uhd::set_thread_priority_safe(1.0); // Initialize USRP device int vers=0,subvers=0,subsubvers=0; int bw_gain_adjust=0; - + if (device->openair0_cfg->recplay_mode == RECPLAY_RECORDMODE) { std::cerr << "USRP device initialized in subframes record mode" << std::endl; } - + sscanf(uhd::get_version_string().c_str(),"%d.%d.%d",&vers,&subvers,&subsubvers); LOG_I(HW,"UHD version %s (%d.%d.%d)\n", uhd::get_version_string().c_str(),vers,subvers,subsubvers); std::string args; - + if (openair0_cfg[0].sdr_addrs == NULL) { args = "type=b200"; } else { args = openair0_cfg[0].sdr_addrs; LOG_I(HW,"Checking for USRP with args %s\n",openair0_cfg[0].sdr_addrs); } - + uhd::device_addrs_t device_adds = uhd::device::find(args); - + if (device_adds.size() == 0) { LOG_E(HW,"No USRP Device Found.\n "); free(s); @@ -972,375 +970,367 @@ extern "C" { free(s); return -1; } - + LOG_I(HW,"Found USRP %s\n", device_adds[0].get("type").c_str()); double usrp_master_clock; - + if (device_adds[0].get("type") == "b200") { device->type = USRP_B200_DEV; usrp_master_clock = 30.72e6; args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=7680, recv_frame_size=7680" ; } - + if (device_adds[0].get("type") == "n3xx") { printf("Found USRP n300\n"); - device->type=USRP_N300_DEV; + device->type=USRP_N300_DEV; usrp_master_clock = 122.88e6; args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); //args += ", send_buff_size=33554432"; } - + if (device_adds[0].get("type") == "x300") { printf("Found USRP x300\n"); device->type=USRP_X300_DEV; usrp_master_clock = 184.32e6; args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); - + // USRP recommended: https://files.ettus.com/manual/page_usrp_x3x0_config.html if ( 0 != system("sysctl -w net.core.rmem_max=33554432 net.core.wmem_max=33554432") ) LOG_W(HW,"Can't set kernel parameters for X3xx\n"); } - + s->usrp = uhd::usrp::multi_usrp::make(args); - + if (args.find("clock_source")==std::string::npos) { - if (openair0_cfg[0].clock_source == internal) { - s->usrp->set_clock_source("internal"); - LOG_D(HW,"Setting clock source to internal\n"); - } - else if (openair0_cfg[0].clock_source == external ) { - s->usrp->set_clock_source("external"); - LOG_D(HW,"Setting clock source to external\n"); - } - else if (openair0_cfg[0].clock_source==gpsdo) { - s->usrp->set_clock_source("gpsdo"); - LOG_D(HW,"Setting clock source to gpsdo\n"); - } - else { - LOG_W(HW,"Clock source set neither in usrp_args nor on command line, using default!\n"); - } + if (openair0_cfg[0].clock_source == internal) { + s->usrp->set_clock_source("internal"); + LOG_D(HW,"Setting clock source to internal\n"); + } else if (openair0_cfg[0].clock_source == external ) { + s->usrp->set_clock_source("external"); + LOG_D(HW,"Setting clock source to external\n"); + } else if (openair0_cfg[0].clock_source==gpsdo) { + s->usrp->set_clock_source("gpsdo"); + LOG_D(HW,"Setting clock source to gpsdo\n"); + } else { + LOG_W(HW,"Clock source set neither in usrp_args nor on command line, using default!\n"); + } + } else { + if (openair0_cfg[0].clock_source != unset) { + LOG_W(HW,"Clock source set in both usrp_args and in clock_source, ingnoring the latter!\n"); + } } - else { - if (openair0_cfg[0].clock_source != unset) { - LOG_W(HW,"Clock source set in both usrp_args and in clock_source, ingnoring the latter!\n"); - } - } if (args.find("time_source")==std::string::npos) { - if (openair0_cfg[0].time_source == internal) { - s->usrp->set_time_source("internal"); - LOG_D(HW,"Setting time source to internal\n"); - } - else if (openair0_cfg[0].time_source == external ) { - s->usrp->set_time_source("external"); - LOG_D(HW,"Setting time source to external\n"); - } - else if (openair0_cfg[0].time_source==gpsdo) { - s->usrp->set_time_source("gpsdo"); - LOG_D(HW,"Setting time source to gpsdo\n"); - } - else { - LOG_W(HW,"Time source set neither in usrp_args nor on command line, using default!\n"); - } - } - else { - if (openair0_cfg[0].clock_source != unset) { - LOG_W(HW,"Time source set in both usrp_args and in time_source, ingnoring the latter!\n"); - } - } - - - if (s->usrp->get_clock_source(0) == "gpsdo") { - s->use_gps = 1; - - if (sync_to_gps(device)==EXIT_SUCCESS) { - LOG_I(HW,"USRP synced with GPS!\n"); + if (openair0_cfg[0].time_source == internal) { + s->usrp->set_time_source("internal"); + LOG_D(HW,"Setting time source to internal\n"); + } else if (openair0_cfg[0].time_source == external ) { + s->usrp->set_time_source("external"); + LOG_D(HW,"Setting time source to external\n"); + } else if (openair0_cfg[0].time_source==gpsdo) { + s->usrp->set_time_source("gpsdo"); + LOG_D(HW,"Setting time source to gpsdo\n"); + } else { + LOG_W(HW,"Time source set neither in usrp_args nor on command line, using default!\n"); + } } else { - LOG_I(HW,"USRP fails to sync with GPS. Exiting.\n"); - exit(EXIT_FAILURE); + if (openair0_cfg[0].clock_source != unset) { + LOG_W(HW,"Time source set in both usrp_args and in time_source, ingnoring the latter!\n"); + } } - } else if (s->usrp->get_clock_source(0) == "external") { - if (check_ref_locked(s,0)) { - LOG_I(HW,"USRP locked to external reference!\n"); - } else { - LOG_I(HW,"Failed to lock to external reference. Exiting.\n"); - exit(EXIT_FAILURE); + + if (s->usrp->get_clock_source(0) == "gpsdo") { + s->use_gps = 1; + + if (sync_to_gps(device)==EXIT_SUCCESS) { + LOG_I(HW,"USRP synced with GPS!\n"); + } else { + LOG_I(HW,"USRP fails to sync with GPS. Exiting.\n"); + exit(EXIT_FAILURE); + } + } else if (s->usrp->get_clock_source(0) == "external") { + if (check_ref_locked(s,0)) { + LOG_I(HW,"USRP locked to external reference!\n"); + } else { + LOG_I(HW,"Failed to lock to external reference. Exiting.\n"); + exit(EXIT_FAILURE); + } } - } - - if (device->type==USRP_X300_DEV) { - openair0_cfg[0].rx_gain_calib_table = calib_table_x310; - std::cerr << "-- Using calibration table: calib_table_x310" << std::endl; - } - if (device->type==USRP_N300_DEV) { - openair0_cfg[0].rx_gain_calib_table = calib_table_n310; - std::cerr << "-- Using calibration table: calib_table_n310" << std::endl; - } + if (device->type==USRP_X300_DEV) { + openair0_cfg[0].rx_gain_calib_table = calib_table_x310; + std::cerr << "-- Using calibration table: calib_table_x310" << std::endl; + } + if (device->type==USRP_N300_DEV) { + openair0_cfg[0].rx_gain_calib_table = calib_table_n310; + std::cerr << "-- Using calibration table: calib_table_n310" << std::endl; + } - if (device->type==USRP_N300_DEV || device->type==USRP_X300_DEV) { - LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate); + if (device->type==USRP_N300_DEV || device->type==USRP_X300_DEV) { + LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate); - switch ((int)openair0_cfg[0].sample_rate) { - case 122880000: - // from usrp_time_offset - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; //to be checked - openair0_cfg[0].tx_bw = 80e6; - openair0_cfg[0].rx_bw = 80e6; - break; - - case 92160000: - // from usrp_time_offset - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; //to be checked - openair0_cfg[0].tx_bw = 80e6; - openair0_cfg[0].rx_bw = 80e6; - break; - - case 61440000: - // from usrp_time_offset - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; - openair0_cfg[0].tx_bw = 40e6; - openair0_cfg[0].rx_bw = 40e6; - break; - - case 46080000: - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; - openair0_cfg[0].tx_bw = 40e6; - openair0_cfg[0].rx_bw = 40e6; - break; - - case 30720000: - // from usrp_time_offset - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - case 15360000: - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 45; - openair0_cfg[0].tx_bw = 10e6; - openair0_cfg[0].rx_bw = 10e6; - break; - - case 7680000: - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 5e6; - openair0_cfg[0].rx_bw = 5e6; - break; - - case 1920000: - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 1.25e6; - openair0_cfg[0].rx_bw = 1.25e6; - break; - - default: - LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + switch ((int)openair0_cfg[0].sample_rate) { + case 122880000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; //to be checked + openair0_cfg[0].tx_bw = 80e6; + openair0_cfg[0].rx_bw = 80e6; + break; + + case 92160000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; //to be checked + openair0_cfg[0].tx_bw = 80e6; + openair0_cfg[0].rx_bw = 80e6; + break; + + case 61440000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; + + case 46080000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; + + case 30720000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 15360000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 45; + openair0_cfg[0].tx_bw = 10e6; + openair0_cfg[0].rx_bw = 10e6; + break; + + case 7680000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 5e6; + openair0_cfg[0].rx_bw = 5e6; + break; + + case 1920000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 1.25e6; + openair0_cfg[0].rx_bw = 1.25e6; + break; + + default: + LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + } + + if (device->type == USRP_B200_DEV) { + if ((vers == 3) && (subvers == 9) && (subsubvers>=2)) { + openair0_cfg[0].rx_gain_calib_table = calib_table_b210; + bw_gain_adjust=0; + std::cerr << "-- Using calibration table: calib_table_b210" << std::endl; // Bell Labs info + } else { + openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38; + bw_gain_adjust=1; + std::cerr << "-- Using calibration table: calib_table_b210_38" << std::endl; // Bell Labs info + } + + switch ((int)openair0_cfg[0].sample_rate) { + case 46080000: + s->usrp->set_master_clock_rate(46.08e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 115; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; + + case 30720000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 115; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 23040000: + s->usrp->set_master_clock_rate(23.04e6); //to be checked + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 113; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 15360000: + s->usrp->set_master_clock_rate(30.72e06); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 103; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 7680000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 1920000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 40; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + default: + LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + } + + /* device specific */ + //openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered + openair0_cfg[0].iq_txshift = 4;//shift + openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + + for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) { + if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); + set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); + ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); + // limit to maximum gain + AssertFatal( openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] <= gain_range.stop(), + "RX Gain too high, lower by %f dB\n", + openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); + s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); + LOG_I(HW,"RX Gain %d %f (%f) => %f (max %f)\n",i, + openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], + openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); + } + } + + LOG_D(HW, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels()); + LOG_D(HW, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels); + + for(int i=0; i<((int) s->usrp->get_tx_num_channels()); i++) { + ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); + + if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); + s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i); + LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]); + } + } + + //s->usrp->set_clock_source("external"); + //s->usrp->set_time_source("external"); + // display USRP settings + LOG_I(HW,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6); + LOG_I(HW,"Actual clock source %s...\n",s->usrp->get_clock_source(0).c_str()); + LOG_I(HW,"Actual time source %s...\n",s->usrp->get_time_source(0).c_str()); + sleep(1); + // create tx & rx streamer + uhd::stream_args_t stream_args_rx("sc16", "sc16"); + int samples=openair0_cfg[0].sample_rate; + int max=s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps(); + samples/=10000; + LOG_I(HW,"RF board max packet size %u, size for 100µs jitter %d \n", max, samples); + + if ( samples < max ) { + stream_args_rx.args["spp"] = str(boost::format("%d") % samples ); + } + + LOG_I(HW,"rx_max_num_samps %zu\n", + s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps()); + + for (int i = 0; irx_stream = s->usrp->get_rx_stream(stream_args_rx); + uhd::stream_args_t stream_args_tx("sc16", "sc16"); + + for (int i = 0; itx_stream = s->usrp->get_tx_stream(stream_args_tx); + + /* Setting TX/RX BW after streamers are created due to USRP calibration issue */ + for(int i=0; i<((int) s->usrp->get_tx_num_channels()) && iusrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); + + for(int i=0; i<((int) s->usrp->get_rx_num_channels()) && iusrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); + + for (int i=0; iusrp->get_rx_rate(i)/1e6); + LOG_I(HW," Actual RX frequency: %fGHz...\n", s->usrp->get_rx_freq(i)/1e9); + LOG_I(HW," Actual RX gain: %f...\n", s->usrp->get_rx_gain(i)); + LOG_I(HW," Actual RX bandwidth: %fM...\n", s->usrp->get_rx_bandwidth(i)/1e6); + LOG_I(HW," Actual RX antenna: %s...\n", s->usrp->get_rx_antenna(i).c_str()); + } + + for (int i=0; iusrp->get_tx_rate(i)/1e6); + LOG_I(HW," Actual TX frequency: %fGHz...\n", s->usrp->get_tx_freq(i)/1e9); + LOG_I(HW," Actual TX gain: %f...\n", s->usrp->get_tx_gain(i)); + LOG_I(HW," Actual TX bandwidth: %fM...\n", s->usrp->get_tx_bandwidth(i)/1e6); + LOG_I(HW," Actual TX antenna: %s...\n", s->usrp->get_tx_antenna(i).c_str()); + LOG_I(HW," Actual TX packet size: %lu\n",s->tx_stream->get_max_num_samps()); + } + + LOG_I(HW,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs()); + device->trx_write_func = trx_usrp_write; + device->trx_read_func = trx_usrp_read; + s->sample_rate = openair0_cfg[0].sample_rate; + + // TODO: + // init tx_forward_nsamps based usrp_time_offset ex + if(is_equal(s->sample_rate, (double)30.72e6)) + s->tx_forward_nsamps = 176; + + if(is_equal(s->sample_rate, (double)15.36e6)) + s->tx_forward_nsamps = 90; + + if(is_equal(s->sample_rate, (double)7.68e6)) + s->tx_forward_nsamps = 50; + + recplay_state_t *recPlay=device->recplay_state; + + if (recPlay != NULL) { // record mode + recPlay->maxSizeBytes=openair0_cfg[0].recplay_conf->u_sf_max * + (sizeof(iqrec_t)+BELL_LABS_IQ_BYTES_PER_SF); + recPlay->ms_sample = (iqrec_t *) malloc(recPlay->maxSizeBytes); + recPlay->currentPtr= (uint8_t *)recPlay->ms_sample; + + if (recPlay->ms_sample == NULL) { + std::cerr<< "Memory allocation failed for subframe record or replay mode." << std::endl; exit(-1); - break; + } } + return 0; } - - if (device->type == USRP_B200_DEV) { - if ((vers == 3) && (subvers == 9) && (subsubvers>=2)) { - openair0_cfg[0].rx_gain_calib_table = calib_table_b210; - bw_gain_adjust=0; - std::cerr << "-- Using calibration table: calib_table_b210" << std::endl; // Bell Labs info - } else { - openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38; - bw_gain_adjust=1; - std::cerr << "-- Using calibration table: calib_table_b210_38" << std::endl; // Bell Labs info - } - - switch ((int)openair0_cfg[0].sample_rate) { - case 46080000: - s->usrp->set_master_clock_rate(46.08e6); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 115; - openair0_cfg[0].tx_bw = 40e6; - openair0_cfg[0].rx_bw = 40e6; - break; - - case 30720000: - s->usrp->set_master_clock_rate(30.72e6); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 115; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - case 23040000: - s->usrp->set_master_clock_rate(23.04e6); //to be checked - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 113; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - case 15360000: - s->usrp->set_master_clock_rate(30.72e06); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 103; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - case 7680000: - s->usrp->set_master_clock_rate(30.72e6); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 80; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - case 1920000: - s->usrp->set_master_clock_rate(30.72e6); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 40; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - default: - LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; - } - } - - /* device specific */ - //openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered - //openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered - openair0_cfg[0].iq_txshift = 4;//shift - openair0_cfg[0].iq_rxrescale = 15;//rescale iqs - - for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) { - if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); - s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); - set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); - ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); - // limit to maximum gain - AssertFatal( openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] <= gain_range.stop(), - "RX Gain too high, lower by %f dB\n", - openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); - s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); - LOG_I(HW,"RX Gain %d %f (%f) => %f (max %f)\n",i, - openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], - openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); - } - } - - LOG_D(HW, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels()); - LOG_D(HW, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels); - - for(int i=0; i<((int) s->usrp->get_tx_num_channels()); i++) { - ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); - - if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i); - s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); - s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i); - LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]); - } - } - - //s->usrp->set_clock_source("external"); - //s->usrp->set_time_source("external"); - // display USRP settings - LOG_I(HW,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6); - LOG_I(HW,"Actual clock source %s...\n",s->usrp->get_clock_source(0).c_str()); - LOG_I(HW,"Actual time source %s...\n",s->usrp->get_time_source(0).c_str()); - sleep(1); - // create tx & rx streamer - uhd::stream_args_t stream_args_rx("sc16", "sc16"); - int samples=openair0_cfg[0].sample_rate; - int max=s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps(); - samples/=10000; - LOG_I(HW,"RF board max packet size %u, size for 100µs jitter %d \n", max, samples); - - if ( samples < max ) { - stream_args_rx.args["spp"] = str(boost::format("%d") % samples ); - } - - LOG_I(HW,"rx_max_num_samps %zu\n", - s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps()); - - for (int i = 0; irx_stream = s->usrp->get_rx_stream(stream_args_rx); - uhd::stream_args_t stream_args_tx("sc16", "sc16"); - - for (int i = 0; itx_stream = s->usrp->get_tx_stream(stream_args_tx); - - /* Setting TX/RX BW after streamers are created due to USRP calibration issue */ - for(int i=0; i<((int) s->usrp->get_tx_num_channels()) && iusrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); - - for(int i=0; i<((int) s->usrp->get_rx_num_channels()) && iusrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); - - for (int i=0; iusrp->get_rx_rate(i)/1e6); - LOG_I(HW," Actual RX frequency: %fGHz...\n", s->usrp->get_rx_freq(i)/1e9); - LOG_I(HW," Actual RX gain: %f...\n", s->usrp->get_rx_gain(i)); - LOG_I(HW," Actual RX bandwidth: %fM...\n", s->usrp->get_rx_bandwidth(i)/1e6); - LOG_I(HW," Actual RX antenna: %s...\n", s->usrp->get_rx_antenna(i).c_str()); - } - - for (int i=0; iusrp->get_tx_rate(i)/1e6); - LOG_I(HW," Actual TX frequency: %fGHz...\n", s->usrp->get_tx_freq(i)/1e9); - LOG_I(HW," Actual TX gain: %f...\n", s->usrp->get_tx_gain(i)); - LOG_I(HW," Actual TX bandwidth: %fM...\n", s->usrp->get_tx_bandwidth(i)/1e6); - LOG_I(HW," Actual TX antenna: %s...\n", s->usrp->get_tx_antenna(i).c_str()); - LOG_I(HW," Actual TX packet size: %lu\n",s->tx_stream->get_max_num_samps()); - } - - LOG_I(HW,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs()); - device->trx_write_func = trx_usrp_write; - device->trx_read_func = trx_usrp_read; - s->sample_rate = openair0_cfg[0].sample_rate; - - // TODO: - // init tx_forward_nsamps based usrp_time_offset ex - if(is_equal(s->sample_rate, (double)30.72e6)) - s->tx_forward_nsamps = 176; - - if(is_equal(s->sample_rate, (double)15.36e6)) - s->tx_forward_nsamps = 90; - - if(is_equal(s->sample_rate, (double)7.68e6)) - s->tx_forward_nsamps = 50; - - - if (device->recplay_state != NULL) { // record mode - device->recplay_state->ms_sample = (iqrec_t *) malloc(openair0_cfg[0].recplay_conf->u_sf_max * sizeof(iqrec_t)); - - if (device->recplay_state->ms_sample == NULL) { - std::cerr<< "Memory allocation failed for subframe record or replay mode." << std::endl; - exit(-1); - } - - memset(device->recplay_state->ms_sample, 0, openair0_cfg[0].recplay_conf->u_sf_max * BELL_LABS_IQ_BYTES_PER_SF); - } - return 0; -} -/*@}*/ + /*@}*/ }/* extern c */ diff --git a/targets/ARCH/iqplayer/iqplayer_lib.c b/targets/ARCH/iqplayer/iqplayer_lib.c index c4133d1b11..f634a4dbc5 100644 --- a/targets/ARCH/iqplayer/iqplayer_lib.c +++ b/targets/ARCH/iqplayer/iqplayer_lib.c @@ -40,18 +40,15 @@ #include "assertions.h" #include "common/utils/LOG/log.h" - - - - - static void parse_iqfile_header(openair0_device *device, iqfile_header_t *iq_fh) { - AssertFatal((memcmp(iq_fh->oaiid,OAIIQFILE_ID,sizeof(OAIIQFILE_ID)) == 0), - "iqfile doesn't seem to be compatible with oai (invalid id %.4s in header)\n", - iq_fh->oaiid); + char tmp[4]=OAIIQFILE_ID; + AssertFatal((memcmp(iq_fh->oaiid,tmp,sizeof(iq_fh->oaiid)) == 0), + "iqfile doesn't seem to be compatible with oai (invalid id %.4s in header)\n", + iq_fh->oaiid); device->type = iq_fh->devtype; device->openair0_cfg[0].tx_sample_advance=iq_fh->tx_sample_advance; device->openair0_cfg[0].tx_bw = device->openair0_cfg[0].rx_bw = iq_fh->bw; + device->recplay_state->nbSamplesBlocks=iq_fh->nbSamplesBlocks; LOG_UI(HW,"Replay iqs from %s device, bandwidth %e\n",get_devname(iq_fh->devtype),iq_fh->bw); } @@ -63,89 +60,73 @@ static int iqplayer_loadfile(openair0_device *device, openair0_config_t *openair recplay_state_t *s = device->recplay_state; recplay_conf_t *c = openair0_cfg->recplay_conf; + struct stat sb; + s->fd = open(c->u_sf_filename, O_RDONLY ); + if (s->fd >= 0 ) { + fstat(s->fd, &sb); + } else { + LOG_E( HW,"Cannot open %s exiting.\n", c->u_sf_filename ); + exit(-1); + } + if (s->use_mmap) { // use mmap - s->mmapfd = open(c->u_sf_filename, O_RDONLY ); - - if (s->mmapfd != 0) { - struct stat sb; - fstat(s->mmapfd, &sb); s->mapsize=sb.st_size; LOG_I(HW,"Loading subframes using mmap() from %s size=%lu bytes ...\n",c->u_sf_filename, (uint64_t)sb.st_size ); - void *mptr = mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, s->mmapfd, 0) ; - s->ms_sample = (iqrec_t *) ( mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, s->mmapfd, 0) + sizeof(iqfile_header_t)); + void *mptr = mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, s->fd, 0) ; + s->ms_sample = (iqrec_t *) ( mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, s->fd, 0) + sizeof(iqfile_header_t)); if (mptr != MAP_FAILED) { parse_iqfile_header(device, (iqfile_header_t *)mptr); s->ms_sample = (iqrec_t *)((char *)mptr + sizeof(iqfile_header_t)); - s->nb_samples = ((sb.st_size-sizeof(iqfile_header_t)) / sizeof(iqrec_t)); - int aligned = (((unsigned long)s->ms_sample & 31) == 0)? 1:0; - LOG_I(HW,"Loaded %u subframes.\n",s->nb_samples ); - - if (aligned == 0) { - LOG_E(HW, "mmap address is not 32 bytes aligned, exiting.\n" ); - close(s->mmapfd); - exit(-1); - } + LOG_I(HW,"Loaded %u subframes.\n",s->nbSamplesBlocks ); } else { LOG_E(HW,"Cannot mmap file, exiting.\n"); - close(s->mmapfd); + close(s->fd); exit(-1); } - } else { - LOG_E( HW,"Cannot open %s exiting.\n", c->u_sf_filename ); - exit(-1); - } } else { - s->iqfd = open(c->u_sf_filename, O_RDONLY); + iqfile_header_t fh; + size_t hs = read(s->fd,&fh,sizeof(fh)); - if (s->iqfd != 0) { - struct stat sb; - iqfile_header_t fh; - size_t hs = read(s->iqfd,&fh,sizeof(fh)); - - if (hs == sizeof(fh)) { - parse_iqfile_header(device, &fh); - fstat(s->iqfd, &sb); + if (hs == sizeof(fh)) { + parse_iqfile_header(device, &fh); + fstat(s->fd, &sb); s->mapsize=sb.st_size; - s->nb_samples = ((sb.st_size-sizeof(iqfile_header_t))/ sizeof(iqrec_t)); - LOG_I(HW, "Loading %u subframes from %s,size=%lu bytes ...\n",s->nb_samples, c->u_sf_filename,(uint64_t)sb.st_size); + LOG_I(HW, "Loading %u subframes from %s,size=%lu bytes ...\n",s->nbSamplesBlocks, c->u_sf_filename,(uint64_t)sb.st_size); // allocate buffer for 1 sample at a time - s->ms_sample = (iqrec_t *) malloc(sizeof(iqrec_t)); + s->ms_sample = (iqrec_t *) malloc(sizeof(iqrec_t)+MAX_BELL_LABS_IQ_BYTES_PER_SF*4); if (s->ms_sample == NULL) { LOG_E(HW,"Memory allocation failed for individual subframe replay mode.\n" ); - close(s->iqfd); + close(s->fd); exit(-1); } memset(s->ms_sample, 0, sizeof(iqrec_t)); // point at beginning of iqs in file - if (lseek(s->iqfd,sizeof(iqfile_header_t), SEEK_SET) == 0) { + if (lseek(s->fd,sizeof(iqfile_header_t), SEEK_SET) == 0) { LOG_I(HW,"Initial seek at beginning of the file\n" ); } else { LOG_I(HW,"Problem initial seek at beginning of the file\n"); } } else { LOG_E(HW,"Cannot read header in %s exiting.\n",c->u_sf_filename ); - close(s->iqfd); + close(s->fd); exit(-1); } - } else { - LOG_E(HW,"Cannot open %s exiting.\n",c->u_sf_filename ); - exit(-1); - } } + s->currentPtr=(uint8_t *)s->ms_sample; return 0; } /*! \brief start the oai iq player * \param device, the hardware used */ -static int trx_iqplayer_start(openair0_device *device){ - return 0; +static int trx_iqplayer_start(openair0_device *device) { + return 0; } /*! \brief Terminate operation of the oai iq player @@ -157,28 +138,22 @@ static void trx_iqplayer_end(openair0_device *device) { if (device->recplay_state == NULL) return; - + if (device->recplay_state->use_mmap) { if (device->recplay_state->ms_sample != MAP_FAILED) { munmap(device->recplay_state->ms_sample, device->recplay_state->mapsize); - device->recplay_state->ms_sample = NULL; - } - - if (device->recplay_state->mmapfd != 0) { - close(device->recplay_state->mmapfd); - device->recplay_state->mmapfd = 0; - } + } } else { if (device->recplay_state->ms_sample != NULL) { free(device->recplay_state->ms_sample); - device->recplay_state->ms_sample = NULL; - } - - if (device->recplay_state->iqfd != 0) { - close(device->recplay_state->iqfd); - device->recplay_state->iqfd = 0; - } + } } + device->recplay_state->ms_sample = NULL; + if (device->recplay_state->fd >= 0) { + close(device->recplay_state->fd); + device->recplay_state->fd = -1; + } + } /*! \brief Write iqs function when in replay mode, just introduce a delay, as configured at init time, @param device pointer to the device structure specific to the RF hardware target @@ -208,93 +183,68 @@ static int trx_iqplayer_write(openair0_device *device, openair0_timestamp timest * \returns the number of sample read */ static int trx_iqplayer_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { - int samples_received=0; - static unsigned int cur_samples; - static int64_t wrap_count; - static int64_t wrap_ts; recplay_state_t *s = device->recplay_state; - if (cur_samples == s->nb_samples) { - cur_samples = 0; - wrap_count++; + if (s->curSamplesBlock==0 && s->wrap_count==0 ) + s->currentTs=s->ms_sample->ts; + + if (s->curSamplesBlock == s->nbSamplesBlocks) { + LOG_I(HW, "wrapping on iq file (%ld)\n", s->wrap_count); + s->curSamplesBlock = 0; + s->wrap_count++; - if (wrap_count == device->openair0_cfg->recplay_conf->u_sf_loops) { - LOG_W(HW, "iqplayer device terminating subframes replay after %u iteration\n",device->openair0_cfg->recplay_conf->u_sf_loops); + if (s->wrap_count == device->openair0_cfg->recplay_conf->u_sf_loops) { + LOG_W(HW, "iqplayer device terminating subframes replay after %u iteration\n", + device->openair0_cfg->recplay_conf->u_sf_loops); exit_function(__FILE__, __FUNCTION__, __LINE__,"replay ended, triggering process termination\n"); } - wrap_ts = wrap_count * (s->nb_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000)); + LOG_I(HW,"go back at the beginning of IQ file"); + device->recplay_state->currentPtr=(uint8_t *)device->recplay_state->ms_sample; - if (!device->recplay_state->use_mmap) { - if (lseek(device->recplay_state->iqfd, 0, SEEK_SET) == 0) { - LOG_I(HW,"Seeking at the beginning of IQ file"); - } else { - LOG_I(HW, "Problem seeking at the beginning of IQ file"); + if (!s->use_mmap) { + if (lseek(device->recplay_state->fd, 0, SEEK_SET) != 0) { + LOG_E(HW, "Problem seeking at the beginning of IQ file"); } } } - if (s->use_mmap) { - if (cur_samples < s->nb_samples) { - *ptimestamp = (s->ms_sample[0].ts + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000))) + wrap_ts; - - if (cur_samples == 0) { - LOG_I(HW,"starting subframes file with wrap_count=%lu wrap_ts=%lu ts=%lu\n", wrap_count,wrap_ts,*ptimestamp); - } - - memcpy(buff[0], &s->ms_sample[cur_samples].samples[0], nsamps*4); - cur_samples++; - } - } else { + if (!s->use_mmap) { // read sample from file - if (read(s->iqfd, s->ms_sample, sizeof(iqrec_t)) != sizeof(iqrec_t)) { - LOG_E(HW,"pb reading iqfile at index %lu\n",sizeof(iqrec_t)*cur_samples ); - close(s->iqfd); - free(s->ms_sample); - s->ms_sample = NULL; - s->iqfd = 0; + if (read(s->fd, s->ms_sample, sizeof(iqrec_t)) != sizeof(iqrec_t)) { + LOG_E(HW,"pb reading iqfile at index %lu\n",sizeof(iqrec_t)*s->curSamplesBlock ); exit(-1); - } - - if (cur_samples < s->nb_samples) { - static int64_t ts0 = 0; - - if ((cur_samples == 0) && (wrap_count == 0)) { - ts0 = s->ms_sample->ts; - } - - *ptimestamp = ts0 + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000)) + wrap_ts; - - if (cur_samples == 0) { - LOG_I(HW, "starting subframes file with wrap_count=%lu wrap_ts=%lu ts=%lu ",wrap_count,wrap_ts, *ptimestamp); - } - - memcpy(buff[0], &s->ms_sample->samples[0], nsamps*4); - cur_samples++; - // Prepare for next read - off_t where = lseek(s->iqfd, cur_samples * sizeof(iqrec_t), SEEK_SET); - - if (where < 0) { - LOG_E(HW,"Cannot lseek in iqfile: %s\n",strerror(errno)); + } else { + if (read(s->fd, s->ms_sample+1, s->ms_sample->nbBytes) != s->ms_sample->nbBytes) { + LOG_E(HW,"pb reading iqfile at index %lu\n",sizeof(iqrec_t)*s->curSamplesBlock ); exit(-1); } } } + iqrec_t *curHeader=(iqrec_t *)s->currentPtr; + AssertFatal(curHeader->header==BELL_LABS_IQ_HEADER,"" ); + // the current timestamp is the stored timestamp until we wrap on input + // USRP shifts 1 sample time to time + AssertFatal(s->wrap_count !=0 || abs(curHeader->ts-s->currentTs) < 5 ,""); + AssertFatal(nsamps*4==curHeader->nbBytes,""); + *ptimestamp = s->currentTs; + memcpy(buff[0], curHeader+1, nsamps*4); + s->curSamplesBlock++; + // Prepare for next read + s->currentTs+=nsamps; + + if (s->use_mmap) + s->currentPtr+=sizeof(iqrec_t)+s->ms_sample->nbBytes; + struct timespec req; - req.tv_sec = 0; - req.tv_nsec = (device->openair0_cfg[0].recplay_conf->u_sf_read_delay) * 1000; - nanosleep(&req, NULL); - + LOG_D(HW, "returning %d samples at ts %lu\n", nsamps, *ptimestamp); return nsamps; - - return samples_received; } - int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { device->openair0_cfg = openair0_cfg; device->trx_start_func = trx_iqplayer_start; @@ -313,5 +263,4 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { LOG_UI(HW,"iqplayer device initialized, replay %s for %i iterations",openair0_cfg->recplay_conf->u_sf_filename,openair0_cfg->recplay_conf->u_sf_loops); return 0; } - /*@}*/ diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 2e6f148e00..b3d895d360 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -727,7 +727,7 @@ int main ( int argc, char **argv ) fflush(stderr); // end of CI modifications //getchar(); - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) load_softscope("enb",NULL); itti_wait_tasks_end(); oai_exit=1; @@ -735,7 +735,7 @@ int main ( int argc, char **argv ) // stop threads if (RC.nb_inst == 0 || !NODE_IS_CU(node_type)) { - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) end_forms(); LOG_I(ENB_APP,"stopping MODEM threads\n"); diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 9bf179efb9..15b97df3ed 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -758,7 +758,7 @@ int main( int argc, char **argv ) { PHY_vars_UE_g[0][0]->no_timing_correction = 1; } - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) load_softscope("ue",NULL); config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS); @@ -783,7 +783,7 @@ int main( int argc, char **argv ) { printf("oai_exit=%d\n",oai_exit); // stop threads - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) end_forms(); printf("stopping MODEM threads\n"); From f18db2bad8cf61350dd2f41d302f73b83a3efdc5 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 1 Mar 2021 10:32:12 +0000 Subject: [PATCH 019/125] Update SIB1 with q_RxLevMin to -65 and MCC and MNC to match SIM card values --- openair2/RRC/NR/MESSAGES/asn1_msg.c | 2 +- .../GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf | 2 +- .../GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 82855365c8..4eea13bfe4 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -326,7 +326,7 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, // cellSelectionInfo sib1->cellSelectionInfo = CALLOC(1,sizeof(struct NR_SIB1__cellSelectionInfo)); - sib1->cellSelectionInfo->q_RxLevMin = -50; + sib1->cellSelectionInfo->q_RxLevMin = -65; // cellAccessRelatedInfo struct NR_PLMN_IdentityInfo *nr_plmn_info=CALLOC(1,sizeof(struct NR_PLMN_IdentityInfo)); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index 108cf06033..5bf6779f6d 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -13,7 +13,7 @@ gNBs = // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; - plmn_list = ({mcc = 222; mnc = 93; mnc_length = 2;}); + plmn_list = ({mcc = 208; mnc = 92; mnc_length = 2;}); tr_s_preference = "local_mac" diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 892aa73398..60834281a9 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -13,7 +13,7 @@ gNBs = // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; - plmn_list = ({mcc = 222; mnc = 93; mnc_length = 2;}); + plmn_list = ({mcc = 208; mnc = 92; mnc_length = 2;}); tr_s_preference = "local_mac" From ee9210c69bd174669cc81680e17be1f1b5736a2f Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 1 Mar 2021 11:22:39 +0000 Subject: [PATCH 020/125] Correction proposal for HARQ when ULSCH is not received --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index b0b6ebbd5a..92fdadf757 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -329,8 +329,16 @@ void handle_nr_ul_harq(module_id_t mod_id, return; remove_front_nr_list(&sched_ctrl->feedback_ul_harq); - sched_ctrl->ul_harq_processes[harq_pid].round++; - add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid); + sched_ctrl->ul_harq_processes[harq_pid].is_waiting = false; + if(sched_ctrl->ul_harq_processes[harq_pid].round == MAX_HARQ_ROUNDS) { + sched_ctrl->ul_harq_processes[harq_pid].ndi ^= 1; + sched_ctrl->ul_harq_processes[harq_pid].round = 0; + UE_info->mac_stats[UE_id].ulsch_errors++; + add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid); + } else { + sched_ctrl->ul_harq_processes[harq_pid].round++; + add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid); + } harq_pid = sched_ctrl->feedback_ul_harq.head; } remove_front_nr_list(&sched_ctrl->feedback_ul_harq); From deef82d70b0bf849c9e855aa5520c4c1f56a55e1 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 1 Mar 2021 19:23:23 +0000 Subject: [PATCH 021/125] Fix RA-Msg3 to logical channel CCCH --- openair2/LAYER2/NR_MAC_COMMON/nr_mac.h | 1 - openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 3 ++- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 5 ++-- openair2/RRC/NR/L2_nr_interface.c | 25 ++++++++++++++++++++ openair2/RRC/NR/nr_rrc_proto.h | 18 ++++++++++++++ openair2/RRC/NR/rrc_gNB.c | 12 ++++------ 6 files changed, 53 insertions(+), 11 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h index 381dce11b2..fa4d8d48ea 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h @@ -339,7 +339,6 @@ typedef struct { #define UL_SCH_LCID_SRB2 0x02 #define UL_SCH_LCID_SRB3 0x03 #define UL_SCH_LCID_DTCH 0x04 -#define UL_SCH_LCID_CCCH_MSG3 0x21 #define UL_SCH_LCID_RECOMMENDED_BITRATE_QUERY 0x35 #define UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT 0x36 #define UL_SCH_LCID_CONFIGURED_GRANT_CONFIRMATION 0x37 diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 71b3502c1a..9e4afd9c85 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -513,7 +513,8 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); RA_config_t *ra = &mac->ra; uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES]; - uint8_t lcid = UL_SCH_LCID_CCCH_MSG3, *payload; + uint8_t lcid = UL_SCH_LCID_CCCH; + uint8_t *payload; uint16_t size_sdu = 0; unsigned short post_padding; NR_ServingCellConfigCommon_t *scc = mac->scc; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index f26062d4c7..0012ad64e2 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2066,8 +2066,9 @@ uint16_t nr_generate_ulsch_pdu(uint8_t *sdus_payload, last_size = 3; } } else { // UL CCCH SDU - mac_pdu_ptr->R = 0; - mac_pdu_ptr->LCID = sdu_lcids[i]; + ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0; + ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = sdu_lcids[i]; + last_size = 1; } mac_pdu_ptr += last_size; diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c index 58c595a3d0..cc97591f46 100644 --- a/openair2/RRC/NR/L2_nr_interface.c +++ b/openair2/RRC/NR/L2_nr_interface.c @@ -303,4 +303,29 @@ int8_t mac_rrc_nr_data_req(const module_id_t Mod_idP, return(0); +} + +int8_t nr_mac_rrc_data_ind(const module_id_t module_idP, + const int CC_id, + const frame_t frameP, + const sub_frame_t sub_frameP, + const int UE_id, + const rnti_t rntiP, + const rb_id_t srb_idP, + const uint8_t *sduP, + const sdu_size_t sdu_lenP, + const boolean_t brOption) { + + protocol_ctxt_t ctxt; + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, GNB_FLAG_YES, rntiP, frameP, sub_frameP,0); + + if((srb_idP & RAB_OFFSET) == CCCH) { + LOG_D(NR_RRC, "[gNB %d] Received SDU for CCCH on SRB %ld\n", module_idP, srb_idP); + ctxt.brOption = brOption; + if (sdu_lenP > 0) { + nr_rrc_gNB_decode_ccch(&ctxt, sduP, sdu_lenP, CC_id); + } + } + + return 0; } \ No newline at end of file diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h index 6d876a0eef..895624ca6a 100644 --- a/openair2/RRC/NR/nr_rrc_proto.h +++ b/openair2/RRC/NR/nr_rrc_proto.h @@ -156,6 +156,24 @@ int nr_rrc_mac_remove_ue(module_id_t mod_idP, rnti_t rntiP); +int8_t nr_mac_rrc_data_ind( + const module_id_t module_idP, + const int CC_id, + const frame_t frameP, + const sub_frame_t sub_frameP, + const int UE_id, + const rnti_t rntiP, + const rb_id_t srb_idP, + const uint8_t *sduP, + const sdu_size_t sdu_lenP, + const boolean_t brOption +); + +int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP, + const uint8_t *buffer, + int buffer_length, + const int CC_id); + void rrc_gNB_generate_dedicatedRRCReconfiguration_release( const protocol_ctxt_t *const ctxt_pP, diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 6d430d7223..3a70ea482a 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -1383,7 +1383,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP, break; case NR_UL_CCCH_MessageType__c1_PR_rrcSetupRequest: - LOG_I(NR_RRC, "Received RRCSetupRequest on UL-CCCH-Message (UE rnti %x)\n", ctxt_pP->rnti); + LOG_D(NR_RRC, "Received RRCSetupRequest on UL-CCCH-Message (UE rnti %x)\n", ctxt_pP->rnti); ue_context_p = rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti); if (ue_context_p != NULL) { rrc_gNB_free_mem_UE_context(ctxt_pP, ue_context_p); @@ -1490,15 +1490,13 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP, CC_id); break; } - } - if (ue_context_p != NULL) { ue_context_p->ue_context.establishment_cause = rrcSetupRequest->establishmentCause; - } - rrc_gNB_generate_RRCSetup(ctxt_pP, - rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti), - CC_id); + rrc_gNB_generate_RRCSetup(ctxt_pP, + rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti), + CC_id); + } break; case NR_UL_CCCH_MessageType__c1_PR_rrcResumeRequest: From e5aba9eda1a9e318b9790b3863980b43fe04f5ac Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 1 Mar 2021 19:23:43 +0000 Subject: [PATCH 022/125] Fix RA-Msg3 to logical channel CCCH --- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 92fdadf757..37ee5acb85 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -237,13 +237,19 @@ void nr_process_mac_pdu( case UL_SCH_LCID_SRB3: // todo break; - case UL_SCH_LCID_CCCH_MSG3: - // todo - break; case UL_SCH_LCID_CCCH: - // todo - mac_subheader_len = 2; - break; + mac_subheader_len = 1; + nr_mac_rrc_data_ind(module_idP, + CC_id, + frameP, + 0, + 0, + rnti, + CCCH, + pdu_ptr+mac_subheader_len, + pdu_len-mac_subheader_len, + 0); + break; case UL_SCH_LCID_DTCH: // check if LCID is valid at current time. @@ -500,6 +506,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, // re-initialize ta update variables afrer RA procedure completion UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; + nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP); + free(ra->preambles.preamble_list); ra->state = Msg4; From 240f411fed85686aeaa591472fbcfca1a18ea8c0 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Mon, 1 Mar 2021 20:41:02 +0100 Subject: [PATCH 023/125] Passing symbolStart to fill_dmrs_mask It is sufficient to pass l_d directly to the function but considering future extension to mapping type B, this way makes more sense. --- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 8 +++-- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h | 4 +-- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 6 ++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 4 +-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 6 ++-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 31 ++++++++++++------- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 3 +- 7 files changed, 38 insertions(+), 24 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index 5d1b08bcf6..aba03f44cf 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -2228,8 +2228,8 @@ int get_num_dmrs(uint16_t dmrs_mask ) { return(num_dmrs); } /* returns the total DMRS symbols in a slot*/ -uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols){ - return get_num_dmrs(fill_dmrs_mask(pdsch_Config,dmrs_TypeA_Position,NrOfSymbols)); +uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols,int startSymbol){ + return get_num_dmrs(fill_dmrs_mask(pdsch_Config,dmrs_TypeA_Position,NrOfSymbols,startSymbol)); } // Table 5.1.2.2.1-1 38.214 @@ -2864,9 +2864,10 @@ int is_nr_UL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slot) { else return(slot_in_period >= slots1+scc->tdd_UL_DL_ConfigurationCommon->pattern2->nrofDownlinkSlots ? 1 : 0); } -int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols) { +int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols,int startSymbol) { int l0; + int ld = NrOfSymbols; if (dmrs_TypeA_Position == NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos2) l0=2; else if (dmrs_TypeA_Position == NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos3) l0=3; else AssertFatal(1==0,"Illegal dmrs_TypeA_Position %d\n",(int)dmrs_TypeA_Position); @@ -2877,6 +2878,7 @@ int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,i if (pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA && pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->present == NR_SetupRelease_DMRS_DownlinkConfig_PR_setup) { // Relative to start of slot + ld += startSymbol; NR_DMRS_DownlinkConfig_t *dmrs_config = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; AssertFatal(NrOfSymbols>1 && NrOfSymbols < 15,"Illegal NrOfSymbols %d\n",NrOfSymbols); int pos2=0; diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h index 087d316567..258b0f2400 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h @@ -47,7 +47,7 @@ uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn); uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw); -int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols); +int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols,int startSymbol); int is_nr_DL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slotP); @@ -142,7 +142,7 @@ bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config, uint8_t NrOfSymbols); void get_band(uint64_t downlink_frequency, uint16_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type); -uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols); +uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols,int startSymbol); /* \brief Set the transform precoding according to 6.1.3 of 3GPP TS 38.214 version 16.3.0 Release 16 @param *pusch_config, pointer to pusch config diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index f26062d4c7..431e582ca4 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -687,7 +687,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr /* dmrs symbol positions*/ dlsch_config_pdu_1_0->dlDmrsSymbPos = fill_dmrs_mask(pdsch_config, mac->scc->dmrs_TypeA_Position, - dlsch_config_pdu_1_0->start_symbol+dlsch_config_pdu_1_0->number_symbols); + dlsch_config_pdu_1_0->number_symbols, + dlsch_config_pdu_1_0->start_symbol); dlsch_config_pdu_1_0->dmrsConfigType = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; /* number of DM-RS CDM groups without data according to subclause 5.1.6.2 of 3GPP TS 38.214 version 15.9.0 Release 15 */ if (dlsch_config_pdu_1_0->number_symbols == 2) @@ -859,7 +860,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr /* dmrs symbol positions*/ dlsch_config_pdu_1_1->dlDmrsSymbPos = fill_dmrs_mask(pdsch_config, mac->scc->dmrs_TypeA_Position, - dlsch_config_pdu_1_1->number_symbols); + dlsch_config_pdu_1_1->number_symbols, + dlsch_config_pdu_1_1->start_symbol); dlsch_config_pdu_1_1->dmrsConfigType = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; /* TODO: fix number of DM-RS CDM groups without data according to subclause 5.1.6.2 of 3GPP TS 38.214, using tables 7.3.1.2.2-1, 7.3.1.2.2-2, 7.3.1.2.2-3, 7.3.1.2.2-4 of 3GPP TS 38.212 */ diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 1eb25c0366..68697a69a8 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -971,7 +971,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; - pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols); + pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols, StartSymbolIndex); // Fill PDCCH DL DCI PDU nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; @@ -1190,7 +1190,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; - pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols); + pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols, StartSymbolIndex); // Fill PDCCH DL DCI PDU nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 3f69cfbe74..07875028cf 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -289,7 +289,7 @@ void schedule_control_sib1(module_id_t module_id, // Calculate number of PRB_DMRS uint8_t N_PRB_DMRS = gNB_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 6; - uint16_t dlDmrsSymbPos = fill_dmrs_mask(gNB_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, startSymbolIndex+nrOfSymbols); + uint16_t dlDmrsSymbPos = fill_dmrs_mask(gNB_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex); uint16_t dmrs_length = get_num_dmrs(dlDmrsSymbPos); int rbSize = 0; @@ -388,7 +388,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; - pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(bwp->bwp_Dedicated->pdsch_Config->choice.setup, scc->dmrs_TypeA_Position, pdsch_pdu_rel15->StartSymbolIndex+pdsch_pdu_rel15->NrOfSymbols); + pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(bwp->bwp_Dedicated->pdsch_Config->choice.setup, scc->dmrs_TypeA_Position, pdsch_pdu_rel15->NrOfSymbols, pdsch_pdu_rel15->StartSymbolIndex); LOG_D(MAC,"dlDmrsSymbPos = 0x%x\n", pdsch_pdu_rel15->dlDmrsSymbPos); @@ -489,7 +489,7 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) // Calculate number of PRB_DMRS uint8_t N_PRB_DMRS = gNB_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 6; - uint16_t dlDmrsSymbPos = fill_dmrs_mask(gNB_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, startSymbolIndex+nrOfSymbols); + uint16_t dlDmrsSymbPos = fill_dmrs_mask(gNB_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex); uint16_t dmrs_length = get_num_dmrs(dlDmrsSymbPos); const uint32_t TBS = nr_compute_tbs(nr_get_Qm_dl(gNB_mac->sched_ctrlCommon->mcs, gNB_mac->sched_ctrlCommon->mcsTableIdx), diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 30a89cce77..296b271df5 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -302,7 +302,7 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP, return offset; } -int getNrOfSymbols(NR_BWP_Downlink_t *bwp, int tda) { +void getStartNrOfSymbols(NR_BWP_Downlink_t *bwp, int tda, int *startSymbol, int *nrOfSymbols) { struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; AssertFatal(tda < tdaList->list.count, @@ -311,9 +311,7 @@ int getNrOfSymbols(NR_BWP_Downlink_t *bwp, int tda) { tdaList->list.count); const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength; - int startSymbolIndex, nrOfSymbols; - SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); - return nrOfSymbols; + SLIV2SL(startSymbolAndLength, startSymbol, nrOfSymbols); } nfapi_nr_dmrs_type_e getDmrsConfigType(NR_BWP_Downlink_t *bwp) { @@ -487,8 +485,12 @@ void pf_dl(module_id_t module_id, sched_ctrl->numDmrsCdmGrpsNoData = 1; uint8_t N_PRB_DMRS = getN_PRB_DMRS(sched_ctrl->active_bwp, sched_ctrl->numDmrsCdmGrpsNoData); - int nrOfSymbols = getNrOfSymbols(sched_ctrl->active_bwp, - sched_ctrl->time_domain_allocation); + int startSymbol; + int nrOfSymbols; + getStartNrOfSymbols(sched_ctrl->active_bwp, + sched_ctrl->time_domain_allocation, + &startSymbol, + &nrOfSymbols); uint32_t tbs = nr_compute_tbs(nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx), 1, // rbSize @@ -574,13 +576,18 @@ void pf_dl(module_id_t module_id, const uint8_t N_PRB_DMRS = getN_PRB_DMRS(sched_ctrl->active_bwp, sched_ctrl->numDmrsCdmGrpsNoData); - const int nrOfSymbols = getNrOfSymbols(sched_ctrl->active_bwp, - sched_ctrl->time_domain_allocation); + int startSymbol; + int nrOfSymbols; + getStartNrOfSymbols(sched_ctrl->active_bwp, + sched_ctrl->time_domain_allocation, + &startSymbol, + &nrOfSymbols); const NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels->ServingCellConfigCommon; const uint8_t N_DMRS_SLOT = get_num_dmrs_symbols( sched_ctrl->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, scc->dmrs_TypeA_Position, - nrOfSymbols); + nrOfSymbols, + startSymbol); int rbSize = 0; uint32_t TBS = 0; @@ -697,7 +704,8 @@ void nr_schedule_ue_spec(module_id_t module_id, getN_PRB_DMRS(sched_ctrl->active_bwp, sched_ctrl->numDmrsCdmGrpsNoData); uint8_t N_DMRS_SLOT = get_num_dmrs_symbols(sched_ctrl->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, RC.nrmac[module_id]->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position , - nrOfSymbols); + nrOfSymbols, + startSymbolIndex); const nfapi_nr_dmrs_type_e dmrsConfigType = getDmrsConfigType(sched_ctrl->active_bwp); const int nrOfLayers = 1; const uint16_t R = nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx); @@ -818,7 +826,8 @@ void nr_schedule_ue_spec(module_id_t module_id, pdsch_pdu->dlDmrsSymbPos = fill_dmrs_mask(bwp->bwp_Dedicated->pdsch_Config->choice.setup, scc->dmrs_TypeA_Position, - nrOfSymbols); + nrOfSymbols, + startSymbolIndex); pdsch_pdu->dmrsConfigType = dmrsConfigType; pdsch_pdu->dlDmrsScramblingId = *scc->physCellId; pdsch_pdu->SCID = 0; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 6487f391b9..bf8269132a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -164,7 +164,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, - NrOfSymbols); + NrOfSymbols, + StartSymbolIndex); /* AssertFatal(k0==0,"k0 is not zero for Initial DL BWP TimeDomain Alloc\n"); From ca5eb17f285cc099abea869735c730d2b6d4aaed Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 1 Mar 2021 22:18:51 +0000 Subject: [PATCH 024/125] Fix SIB1 with offsetToPointA = 86 --- openair2/RRC/NR/MESSAGES/asn1_msg.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 4eea13bfe4..e07d461c4c 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -418,7 +418,8 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, nrMultiBandInfo->freqBandIndicatorNR = configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[i]; ASN_SEQUENCE_ADD(&sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list,nrMultiBandInfo); } - sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; + //sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; + sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = 86; for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.count; i++) { ASN_SEQUENCE_ADD(&sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list,configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[i]); } From 1a7a08648032e03e76712f56f51544494653727f Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Mon, 1 Mar 2021 23:50:16 +0100 Subject: [PATCH 025/125] Passing symbolStart to fill_dmrs_mask Adding missed changes in previous commit --- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index aba03f44cf..ad68b3b950 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -2880,7 +2880,7 @@ int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,i // Relative to start of slot ld += startSymbol; NR_DMRS_DownlinkConfig_t *dmrs_config = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; - AssertFatal(NrOfSymbols>1 && NrOfSymbols < 15,"Illegal NrOfSymbols %d\n",NrOfSymbols); + AssertFatal(ld>1 && ld < 15,"Illegal l_d %d\n",ld); int pos2=0; if (dmrs_config->maxLength == NULL) { // this is Table 7.4.1.1.2-3: PDSCH DM-RS positions l for single-symbol DM-RS @@ -2889,7 +2889,7 @@ int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,i return(1<3,"Illegal NrOfSymbols %d for len2 DMRS\n",NrOfSymbols); - if (NrOfSymbols < 10) return(1<dmrs_AdditionalPosition==NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1<dmrs_AdditionalPosition!=NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1<3,"Illegal l_d %d for len2 DMRS\n",ld); + if (ld < 10) return(1<dmrs_AdditionalPosition==NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1<dmrs_AdditionalPosition!=NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1<dmrs_AdditionalPosition!=NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1<dmrs_AdditionalPosition!=NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1) return(1<dmrs_AdditionalPosition==NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1< Date: Tue, 2 Mar 2021 20:20:11 +0000 Subject: [PATCH 026/125] Draft RA-Msg4 at gNB --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 95 ++++++++++++++++--- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 4 +- openair2/RRC/NR/L2_nr_interface.c | 44 ++++----- openair2/RRC/NR/nr_rrc_proto.h | 1 + 4 files changed, 103 insertions(+), 41 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 68697a69a8..1824490371 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -862,8 +862,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra i = 0; } } + if (rbStart > (BWPSize - rbSize)) { - LOG_E(MAC, "%s(): cannot find free vrb_map for RA RNTI %04x!\n", __func__, ra->RA_rnti); + LOG_E(NR_MAC, "%s(): cannot find free vrb_map for RA RNTI %04x!\n", __func__, ra->RA_rnti); return; } @@ -1070,17 +1071,64 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int NrOfSymbols_tmp = 0; int x_Overhead = 0; int time_domain_assignment = 0; + int rbStart = 0; + int rbSize = 0; uint8_t nr_of_candidates = 0; uint8_t aggregation_level = 0; + uint16_t *vrb_map = cc[CC_id].vrb_map; NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; - nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; + long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + + long dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; + uint8_t N_PRB_DMRS = 0; + if (dmrsConfigType==NFAPI_NR_DMRS_TYPE1) { + N_PRB_DMRS = nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 6; + } + else { + N_PRB_DMRS = nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 4; + } + + uint8_t N_DMRS_SLOT = get_num_dmrs_symbols(NULL, + RC.nrmac[module_idP]->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, + NrOfSymbols, + StartSymbolIndex); + + uint8_t mac_sdu[30]; + uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, mac_sdu); + + LOG_I(NR_MAC, "[gNB %d] Got %d bytes from CCCH\n", module_idP, mac_sdu_length); + + int header_length_total = 1 + 6 + 2 + (mac_sdu_length >= 128); + int payload_length = mac_sdu_length + header_length_total; + + uint32_t TBS = 0; + do { + rbSize++; + TBS = nr_compute_tbs(nr_get_Qm_dl(nr_mac->sched_ctrlCommon->mcs, nr_mac->sched_ctrlCommon->mcsTableIdx), + nr_get_code_rate_dl(nr_mac->sched_ctrlCommon->mcs, nr_mac->sched_ctrlCommon->mcsTableIdx), + rbSize, NrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT,0, 0,1) >> 3; + } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && TBS < payload_length); + + for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) { + if (vrb_map[rbStart + i]) { + rbStart += i; + i = 0; + } + } + + if (rbStart > (BWPSize - rbSize)) { + LOG_E(NR_MAC, "%s(): cannot find free vrb_map for RA RNTI %04x!\n", __func__, ra->RA_rnti); + return; + } // Checking if the DCI allocation is feasible in current subframe + nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; if (dl_req->nPDUs > NFAPI_NR_MAX_DL_TTI_PDUS - 2) { LOG_I(NR_MAC, "[RAPROC] Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", slotP, ra->rnti); return; @@ -1100,8 +1148,6 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra return; } - nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; - // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially // important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them const int bwpid = bwp->bwp_Id; @@ -1142,8 +1188,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // information to data and is reset every slot. const int pduindex = nr_mac->pdu_index[CC_id]++; pdsch_pdu_rel15->pduIndex = pduindex; - pdsch_pdu_rel15->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_pdu_rel15->BWPSize = BWPSize; + pdsch_pdu_rel15->BWPStart = BWPStart; pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; @@ -1172,8 +1218,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2; pdsch_pdu_rel15->dmrsPorts = 1; pdsch_pdu_rel15->resourceAlloc = 1; - pdsch_pdu_rel15->rbStart = 0; - pdsch_pdu_rel15->rbSize = 6; + pdsch_pdu_rel15->rbStart = rbStart; + pdsch_pdu_rel15->rbSize = rbSize; pdsch_pdu_rel15->VRBtoPRBMapping = 0; for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { @@ -1185,7 +1231,6 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra time_domain_assignment = i; // this is short PDSCH added to the config to fit mixed slot } } - AssertFatal(StartSymbolIndex >= 0, "StartSymbolIndex is negative\n"); pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; @@ -1245,20 +1290,42 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra x_Overhead = 0; nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); - uint8_t payload[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; + const int cont_res_len = 1 + 6; + const int post_padding = TBS > header_length_total + payload_length + cont_res_len; + + LOG_D(NR_MAC, "Configuring DL_TX in %d.%d: TBS %d, header_length_total %d, sdu_length_total %d,cont_res_len %d, post_padding %d \n", frameP, slotP, + TBS, header_length_total, payload_length, cont_res_len, post_padding); // DL TX request - tx_req->PDU_length = pdsch_pdu_rel15->TBSize[0]; + nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; + + uint8_t payload[50] = {}; + const int offset = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, (unsigned char *)payload, 255, ra->cont_res_id); + + ((NR_MAC_SUBHEADER_SHORT *) &payload[offset])->R = 0; + ((NR_MAC_SUBHEADER_SHORT *) &payload[offset])->F = 0; + ((NR_MAC_SUBHEADER_SHORT *) &payload[offset])->LCID = DL_SCH_LCID_CCCH; + ((NR_MAC_SUBHEADER_SHORT *) &payload[offset])->L = mac_sdu_length*8; + + memcpy(&payload[9], mac_sdu, mac_sdu_length); + + if (post_padding > 0) { + for (int j = 0; j < TBS - payload_length; j++) + payload[payload_length + j] = 0; + } + + bzero(tx_req->TLVs[0].value.direct,MAX_NR_DLSCH_PAYLOAD_BYTES); + memcpy(&tx_req->TLVs[0].value.direct, payload, payload_length); + + tx_req->PDU_length = TBS; tx_req->PDU_index = pduindex; tx_req->num_TLV = 1; - tx_req->TLVs[0].length = 8; + tx_req->TLVs[0].length = TBS + 2; nr_mac->TX_req[CC_id].SFN = frameP; nr_mac->TX_req[CC_id].Number_of_PDUs++; nr_mac->TX_req[CC_id].Slot = slotP; - memcpy(tx_req->TLVs[0].value.direct, payload, tx_req->TLVs[0].length); // Mark the corresponding RBs as used - uint16_t *vrb_map = cc[CC_id].vrb_map; for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) { vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 07875028cf..45f9b4ab83 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -113,7 +113,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, dl_tti_request = &gNB->DL_req[CC_id]; dl_req = &dl_tti_request->dl_tti_request_body; - mib_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, MIBCH, 1, &cc->MIB_pdu.payload[0]); + mib_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, MIBCH, 0, 1, &cc->MIB_pdu.payload[0]); LOG_D(MAC, "Frame %d, slot %d: BCH PDU length %d\n", frameP, slotP, mib_sdu_length); @@ -473,7 +473,7 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) // Get SIB1 uint8_t sib1_payload[NR_MAX_SIB_LENGTH/8]; - uint8_t sib1_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, BCCH, 1, sib1_payload); + uint8_t sib1_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, BCCH, 0, 1, sib1_payload); LOG_D(MAC,"sib1_sdu_length = %i\n", sib1_sdu_length); LOG_D(MAC,"SIB1: \n"); for (int i=0;i>4)&0x3f); - #ifdef DEBUG_RRC LOG_D(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%ld\n",Mod_idP,Srb_id); #endif - rrc_gNB_carrier_data_t *carrier; - NR_BCCH_BCH_Message_t *mib; - NR_SRB_INFO *srb_info; - char payload_size, *payload_pP; - - carrier = &RC.nrrrc[Mod_idP]->carrier; - mib = &carrier->mib; - srb_info = &carrier->Srb0; - - /* MIBCH */ + // MIBCH if ((Srb_id & RAB_OFFSET) == MIBCH) { + asn_enc_rval_t enc_rval; + uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f); + rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier; + NR_BCCH_BCH_Message_t *mib = &carrier->mib; + // Currently we are getting the pdcch_ConfigSIB1 from the configuration file. // Uncomment this function for a dynamic pdcch_ConfigSIB1. //channel_bandwidth_t min_channel_bw = bw_10MHz; // Must be obtained based on TS 38.101-1 Table 5.3.5-1 @@ -269,7 +263,7 @@ int8_t mac_rrc_nr_data_req(const module_id_t Mod_idP, return (3); } - /* TODO BCCH SIB1 SIBs */ + // TODO BCCH SIB1 SIBs if ((Srb_id & RAB_OFFSET ) == BCCH) { memcpy(&buffer_pP[0], RC.nrrrc[Mod_idP]->carrier.SIB1, @@ -278,25 +272,25 @@ int8_t mac_rrc_nr_data_req(const module_id_t Mod_idP, return RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1; } - /* CCCH */ + // CCCH if( (Srb_id & RAB_OFFSET ) == CCCH) { - //struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(RC.rrc[Mod_idP],rnti); - //if (ue_context_p == NULL) return(0); - //eNB_RRC_UE_t *ue_p = &ue_context_p->ue_context; - LOG_D(RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id); - // srb_info=&ue_p->Srb0; + char *payload_pP; + uint8_t Sdu_size = 0; + struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[Mod_idP], rnti); - payload_size = srb_info->Tx_buffer.payload_size; + LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id); + + char payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size; // check if data is there for MAC if (payload_size > 0) { - payload_pP = srb_info->Tx_buffer.Payload; - LOG_D(RRC,"[gNB %d] CCCH (%p) has %d bytes (dest: %p, src %p)\n", Mod_idP, srb_info, payload_size, buffer_pP, payload_pP); + payload_pP = ue_context_p->ue_context.Srb0.Tx_buffer.Payload; + LOG_D(NR_RRC,"[gNB %d] CCCH has %d bytes (dest: %p, src %p)\n", Mod_idP, payload_size, buffer_pP, payload_pP); // Fill buffer memcpy((void *)buffer_pP, (void*)payload_pP, payload_size); Sdu_size = payload_size; - srb_info->Tx_buffer.payload_size = 0; + ue_context_p->ue_context.Srb0.Tx_buffer.payload_size = 0; } return Sdu_size; } diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h index 895624ca6a..7c08d59e67 100644 --- a/openair2/RRC/NR/nr_rrc_proto.h +++ b/openair2/RRC/NR/nr_rrc_proto.h @@ -51,6 +51,7 @@ int8_t mac_rrc_nr_data_req(const module_id_t Mod_idP, const int CC_id, const frame_t frameP, const rb_id_t Srb_id, + const rnti_t rnti, const uint8_t Nb_tb, uint8_t *const buffer_pP ); From d1c56742d32c8c74157b64b4ce607e1031b57b6c Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 3 Mar 2021 00:11:07 +0000 Subject: [PATCH 027/125] Msg4 transmitted with UE Contention Resolution Identity and with RRCSetup --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 14 +++- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 77 +++++++++++-------- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 4 + 3 files changed, 61 insertions(+), 34 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index a1e687bded..3993fc2bca 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1825,7 +1825,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, case DL_SCH_LCID_CCCH: // MSG4 RRC Connection Setup 38.331 - // varialbe length + // variable length mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L; mac_subheader_len = 2; if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){ @@ -1833,6 +1833,13 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, mac_subheader_len = 3; } + LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d: bits\n", mac_ce_len); + + // TODO: Forward RRCSetup to RRC + LOG_D(NR_MAC,"RRCSetup received at nr_ue_process_mac_pdu with payload len %d: \n bits, rx bytes: \n", mac_ce_len); + for (int i = 0; i < mac_ce_len/8; i++) { + LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[i + 2]); + } break; case DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH: @@ -1942,10 +1949,13 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, case DL_SCH_LCID_CON_RES_ID: // Clause 5.1.5 and 6.1.3.3 of 3GPP TS 38.321 version 16.2.1 Release 16 // WIP todo: handle CCCH_pdu + // MAC Header: 1 byte (R/R/LCID) + // MAC SDU: 6 bytes (UE Contention Resolution Identity) mac_ce_len = 6; - LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution msg: %x.%x.%x.%x.%x.%x, Terminating RA procedure\n", module_idP, frameP, pduP[0], pduP[1], pduP[2], pduP[3], pduP[4], pduP[5]); + LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution identity: 0x%x%x%x%x%x%x. Terminating RA procedure\n", module_idP, frameP, pduP[1], pduP[2], pduP[3], pduP[4], pduP[5], pduP[6]); + // FIXME: Only succeeds if received contention resolution equals to the first 48 bits of transmitted Mgs3 if (ra->RA_active == 1) { nr_ra_succeeded(module_idP, frameP, slot); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 1824490371..01f8b012a8 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1063,10 +1063,35 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra if (ra->Msg4_frame == frameP && ra->Msg4_slot == slotP ) { + uint8_t mac_pdu[100] = {}; + uint16_t mac_pdu_length = 0; + + const int offset = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, (unsigned char *)mac_pdu, 255, ra->cont_res_id); + mac_pdu_length += offset; + + uint8_t mac_sdu[30]; + uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, mac_sdu); + + + ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->R = 0; + ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->F = 0; + ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; + ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->L = mac_sdu_length * 8; + mac_pdu_length += 2; + + memcpy(&mac_pdu[mac_pdu_length], mac_sdu, sizeof(uint8_t) * mac_sdu_length); + mac_pdu_length += mac_sdu_length; + + LOG_I(NR_MAC, "[gNB %d] Got %d bytes from CCCH\n", module_idP, mac_sdu_length); + + //int header_length_total = 1 + 6 + 2 + (mac_sdu_length >= 128); + //int payload_length = mac_sdu_length + header_length_total; + + int mcsIndex = 0; int startSymbolAndLength = 0; int StartSymbolIndex = -1; - int NrOfSymbols = 14; + int NrOfSymbols = 5; int StartSymbolIndex_tmp = 0; int NrOfSymbols_tmp = 0; int x_Overhead = 0; @@ -1099,13 +1124,6 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra NrOfSymbols, StartSymbolIndex); - uint8_t mac_sdu[30]; - uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, mac_sdu); - - LOG_I(NR_MAC, "[gNB %d] Got %d bytes from CCCH\n", module_idP, mac_sdu_length); - - int header_length_total = 1 + 6 + 2 + (mac_sdu_length >= 128); - int payload_length = mac_sdu_length + header_length_total; uint32_t TBS = 0; do { @@ -1113,7 +1131,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra TBS = nr_compute_tbs(nr_get_Qm_dl(nr_mac->sched_ctrlCommon->mcs, nr_mac->sched_ctrlCommon->mcsTableIdx), nr_get_code_rate_dl(nr_mac->sched_ctrlCommon->mcs, nr_mac->sched_ctrlCommon->mcsTableIdx), rbSize, NrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT,0, 0,1) >> 3; - } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && TBS < payload_length); + } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && TBS < mac_pdu_length); for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) { if (vrb_map[rbStart + i]) { @@ -1200,11 +1218,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) { pdsch_pdu_rel15->mcsTable[0] = 0; } else { - if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) { - pdsch_pdu_rel15->mcsTable[0] = 1; - } else { - pdsch_pdu_rel15->mcsTable[0] = 2; - } + if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) { + pdsch_pdu_rel15->mcsTable[0] = 1; + } else { + pdsch_pdu_rel15->mcsTable[0] = 2; + } } pdsch_pdu_rel15->rvIndex[0] = 0; @@ -1222,14 +1240,16 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->rbSize = rbSize; pdsch_pdu_rel15->VRBtoPRBMapping = 0; + // FIXME: should use Initial BWP for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; SLIV2SL(startSymbolAndLength, &StartSymbolIndex_tmp, &NrOfSymbols_tmp); - if (NrOfSymbols_tmp < NrOfSymbols) { + //if (NrOfSymbols_tmp < NrOfSymbols) { NrOfSymbols = NrOfSymbols_tmp; StartSymbolIndex = StartSymbolIndex_tmp; time_domain_assignment = i; // this is short PDSCH added to the config to fit mixed slot - } + //} + break; } AssertFatal(StartSymbolIndex >= 0, "StartSymbolIndex is negative\n"); @@ -1291,31 +1311,24 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); const int cont_res_len = 1 + 6; - const int post_padding = TBS > header_length_total + payload_length + cont_res_len; + const int post_padding = TBS > mac_pdu_length; - LOG_D(NR_MAC, "Configuring DL_TX in %d.%d: TBS %d, header_length_total %d, sdu_length_total %d,cont_res_len %d, post_padding %d \n", frameP, slotP, - TBS, header_length_total, payload_length, cont_res_len, post_padding); + //LOG_I(NR_MAC, "Configuring DL_TX in %d.%d: TBS %d, header_length_total %d, sdu_length_total %d,cont_res_len %d, post_padding %d \n", frameP, slotP, + // TBS, header_length_total, payload_length, cont_res_len, post_padding); // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; - uint8_t payload[50] = {}; - const int offset = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, (unsigned char *)payload, 255, ra->cont_res_id); - - ((NR_MAC_SUBHEADER_SHORT *) &payload[offset])->R = 0; - ((NR_MAC_SUBHEADER_SHORT *) &payload[offset])->F = 0; - ((NR_MAC_SUBHEADER_SHORT *) &payload[offset])->LCID = DL_SCH_LCID_CCCH; - ((NR_MAC_SUBHEADER_SHORT *) &payload[offset])->L = mac_sdu_length*8; - - memcpy(&payload[9], mac_sdu, mac_sdu_length); if (post_padding > 0) { - for (int j = 0; j < TBS - payload_length; j++) - payload[payload_length + j] = 0; + for (int j = 0; j < TBS - mac_pdu_length; j++) + mac_pdu[mac_pdu_length + j] = 0; } + mac_pdu_length = TBS; - bzero(tx_req->TLVs[0].value.direct,MAX_NR_DLSCH_PAYLOAD_BYTES); - memcpy(&tx_req->TLVs[0].value.direct, payload, payload_length); + + //bzero(tx_req->TLVs[0].value.direct,MAX_NR_DLSCH_PAYLOAD_BYTES); + memcpy(&tx_req->TLVs[0].value.direct, mac_pdu, sizeof(uint8_t) * mac_pdu_length); tx_req->PDU_length = TBS; tx_req->PDU_index = pduindex; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index e8e6ef5f07..e6441f4581 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -504,6 +504,10 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); } + // UE Contention Resolution Identity + // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4 + memcpy(ra->cont_res_id, sduP, sizeof(uint8_t) * 6); + // re-initialize ta update variables afrer RA procedure completion UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; From d0b9146cd0def103623659e4d448270007fa797a Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 3 Mar 2021 01:27:50 +0000 Subject: [PATCH 028/125] Msg4 transmitted from MAC to RRC through ITTI (TASK_RRC_NRUE created) --- executables/nr-uesoftmodem.c | 23 ++++++++++++ openair1/SIMULATION/NR_PHY/dlsim.c | 15 ++++---- openair1/SIMULATION/NR_PHY/prachsim.c | 14 +++++++- openair1/SIMULATION/NR_PHY/ulsim.c | 14 ++++++-- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 37 +++++++++++--------- openair2/RRC/NR_UE/L2_interface_ue.c | 31 ++++++++++++++++ openair2/RRC/NR_UE/rrc_proto.h | 10 +++++- 7 files changed, 118 insertions(+), 26 deletions(-) diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 981ee735c9..25356704cb 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -180,6 +180,23 @@ void print_difftimes(void) { LOG_I(HW,"difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec); } +int create_tasks_nrue(uint32_t ue_nb) { + LOG_D(NR_RRC, "%s(ue_nb:%d)\n", __FUNCTION__, ue_nb); + itti_wait_ready(1); + + if (ue_nb > 0) { + LOG_I(NR_RRC,"create TASK_RRC_NRUE \n"); + if (itti_create_task (TASK_RRC_NRUE, rrc_nrue_task, NULL) < 0) { + LOG_E(NR_RRC, "Create task for RRC UE failed\n"); + return -1; + } + + } + + itti_wait_ready(0); + return 0; +} + void exit_function(const char *file, const char *function, const int line, const char *s) { int CC_id; @@ -561,6 +578,12 @@ int main( int argc, char **argv ) { // wait for end of program printf("TYPE TO TERMINATE\n"); + + if (create_tasks_nrue(1) < 0) { + printf("cannot create ITTI tasks\n"); + exit(-1); // need a softer mode + } + // Sleep a while before checking all parameters have been used // Some are used directly in external threads, asynchronously sleep(20); diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 6856ecfb04..040f8c5a54 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -87,12 +87,15 @@ uint64_t downlink_frequency[MAX_NUM_CCs][4]; // dummy functions int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { return(0); } -int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, - const int CC_id, - const uint8_t gNB_index, - const int8_t channel, - const uint8_t* pduP, - const sdu_size_t pdu_len) +int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, + const int CC_id, + const uint8_t gNB_index, + const frame_t frame, + const sub_frame_t sub_frame, + const rnti_t rnti, + const channel_t channel, + const uint8_t* pduP, + const sdu_size_t pdu_len) { return 0; } diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index 3c15707402..4b6e9993cc 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -47,6 +47,7 @@ #include "OCG_vars.h" #include #include +#include //#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" @@ -130,7 +131,18 @@ nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP( return 0; } -int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) {return 0;} +int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, + const int CC_id, + const uint8_t gNB_index, + const frame_t frame, + const sub_frame_t sub_frame, + const rnti_t rnti, + const channel_t channel, + const uint8_t* pduP, + const sdu_size_t pdu_len) +{ + return 0; +} void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, const uint8_t gNB_index) { diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 3b9d8045d0..fded8619f0 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -82,9 +82,19 @@ double cpuf; //uint8_t nfapi_mode = 0; uint64_t downlink_frequency[MAX_NUM_CCs][4]; +int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, + const int CC_id, + const uint8_t gNB_index, + const frame_t frame, + const sub_frame_t sub_frame, + const rnti_t rnti, + const channel_t channel, + const uint8_t* pduP, + const sdu_size_t pdu_len) +{ + return 0; +} -int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, - const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) { return 0; } int generate_dlsch_header(unsigned char *mac_header, unsigned char num_sdus, unsigned short *sdu_lengths, diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 3993fc2bca..843e030f6f 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -105,7 +105,7 @@ int8_t nr_ue_decode_mib(module_id_t module_id, NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); - nr_mac_rrc_data_ind_ue( module_id, cc_id, gNB_index, NR_BCCH_BCH, (uint8_t *) pduP, 3 ); // fixed 3 bytes MIB PDU + nr_mac_rrc_data_ind_ue( module_id, cc_id, gNB_index, 0, 0, 0, NR_BCCH_BCH, (uint8_t *) pduP, 3 ); // fixed 3 bytes MIB PDU AssertFatal(mac->mib != NULL, "nr_ue_decode_mib() mac->mib == NULL\n"); //if(mac->mib != NULL){ @@ -161,7 +161,7 @@ int8_t nr_ue_decode_BCCH_DL_SCH(module_id_t module_id, uint8_t *pduP, uint32_t pdu_len) { LOG_D(NR_MAC, "Decoding NR-BCCH-DL-SCH-Message (SIB1 or SI)\n"); - nr_mac_rrc_data_ind_ue(module_id, cc_id, gNB_index, NR_BCCH_DL_SCH, (uint8_t *) pduP, pdu_len); + nr_mac_rrc_data_ind_ue(module_id, cc_id, gNB_index, 0, 0, 0, NR_BCCH_DL_SCH, (uint8_t *) pduP, pdu_len); return 0; } @@ -1824,23 +1824,28 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, // MAC CE case DL_SCH_LCID_CCCH: - // MSG4 RRC Connection Setup 38.331 - // variable length - mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L; + // MSG4 RRC Connection Setup 38.331 + // variable length + + if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){ + mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8) + | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff); + mac_subheader_len = 3; + } else { + mac_sdu_len = ((NR_MAC_SUBHEADER_LONG *) pduP)->L1; mac_subheader_len = 2; - if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){ - mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8; - mac_subheader_len = 3; - } + } - LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d: bits\n", mac_ce_len); + LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d: bits\n", mac_sdu_len); - // TODO: Forward RRCSetup to RRC - LOG_D(NR_MAC,"RRCSetup received at nr_ue_process_mac_pdu with payload len %d: \n bits, rx bytes: \n", mac_ce_len); - for (int i = 0; i < mac_ce_len/8; i++) { - LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[i + 2]); - } - break; + + LOG_D(NR_MAC,"RRCSetup received at nr_ue_process_mac_pdu with payload len %d: \n bits, rx bytes: \n", mac_sdu_len); + for (int i = 0; i < mac_sdu_len/8; i++) { + LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[i + 2]); + } + + nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_sdu_len); + break; case DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH: diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c index e21859ded8..347a367e62 100644 --- a/openair2/RRC/NR_UE/L2_interface_ue.c +++ b/openair2/RRC/NR_UE/L2_interface_ue.c @@ -42,17 +42,48 @@ nr_mac_rrc_data_ind_ue( const module_id_t module_id, const int CC_id, const uint8_t gNB_index, + const frame_t frame, + const sub_frame_t sub_frame, + const rnti_t rnti, const channel_t channel, const uint8_t* pduP, const sdu_size_t pdu_len){ + sdu_size_t sdu_size = 0; + protocol_ctxt_t ctxt; switch(channel){ case NR_BCCH_BCH: AssertFatal( nr_rrc_ue_decode_NR_BCCH_BCH_Message(module_id, gNB_index, (uint8_t*)pduP, pdu_len) == 0, "UE decode BCCH-BCH error!\n"); break; + case NR_BCCH_DL_SCH: AssertFatal( nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(module_id, gNB_index, (uint8_t*)pduP, pdu_len, 0, 0) == 0, "UE decode BCCH-DL-SCH error!\n"); break; + + case CCCH: + if (pdu_len>0) { + LOG_T(NR_RRC,"[UE %d] Received SDU for CCCH on SRB %ld from gNB %d\n",module_id,channel & RAB_OFFSET,gNB_index); + + MessageDef *message_p; + int msg_sdu_size = CCCH_SDU_SIZE; + + if (pdu_len > msg_sdu_size) { + LOG_E(NR_RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); + sdu_size = msg_sdu_size; + } else { + sdu_size = pdu_len; + } + + message_p = itti_alloc_new_message (TASK_MAC_UE, 0, NR_RRC_MAC_CCCH_DATA_IND); + memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE); + memcpy (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, pduP, sdu_size); + NR_RRC_MAC_CCCH_DATA_IND (message_p).frame = frame; //frameP + NR_RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = sub_frame; //sub_frameP + NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_size; + NR_RRC_MAC_CCCH_DATA_IND (message_p).gnb_index = gNB_index; + NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti; //rntiP + itti_send_msg_to_task (TASK_RRC_NRUE, GNB_MODULE_ID_TO_INSTANCE( module_id ), message_p); + } default: break; } diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index 0acf6db634..534da0112b 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -109,7 +109,15 @@ int8_t nr_rrc_ue_decode_NR_DL_DCCH_Message(const module_id_t module_id, const ui \param channel indicator for channel of the pdu \param pduP pointer to pdu \param pdu_len data length of pdu*/ -int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const channel_t channel, const uint8_t* pduP, const sdu_size_t pdu_len); +int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, + const int CC_id, + const uint8_t gNB_index, + const frame_t frame, + const sub_frame_t sub_frame, + const rnti_t rnti, + const channel_t channel, + const uint8_t* pduP, + const sdu_size_t pdu_len); /**\brief \param module_id module id From c457cf645566f384c9cc3c009eb8b70175048238 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 3 Mar 2021 10:01:35 +0000 Subject: [PATCH 029/125] Msg2 temporary fix for PDSCH time domain resource allocation (use the same as SIB1 from TS 38.214 Table 5.1.2.1.1-2) --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 01f8b012a8..11bbb3ea3d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -833,9 +833,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra if ((ra->Msg2_frame == frameP) && (ra->Msg2_slot == slotP)) { int mcsIndex = 0; - int startSymbolAndLength = 0; - int StartSymbolIndex = -1; - int NrOfSymbols = 14; + int startSymbolAndLength = 53; + int StartSymbolIndex = 2; + int NrOfSymbols = 12; int StartSymbolIndex_tmp = 0; int NrOfSymbols_tmp = 0; int x_Overhead = 0; @@ -958,16 +958,17 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->rbSize = rbSize; pdsch_pdu_rel15->VRBtoPRBMapping = 0; + // FIXME: should use Initial BWP and maybe Default values from TS 38.214 Table 5.1.2.1.1-1 for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; SLIV2SL(startSymbolAndLength, &StartSymbolIndex_tmp, &NrOfSymbols_tmp); - if (NrOfSymbols_tmp < NrOfSymbols) { + //if (NrOfSymbols_tmp < NrOfSymbols) { NrOfSymbols = NrOfSymbols_tmp; StartSymbolIndex = StartSymbolIndex_tmp; time_domain_assignment = i; // this is short PDSCH added to the config to fit mixed slot - } + //} + break; } - AssertFatal(StartSymbolIndex >= 0, "StartSymbolIndex is negative\n"); pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; @@ -1089,9 +1090,9 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int mcsIndex = 0; - int startSymbolAndLength = 0; - int StartSymbolIndex = -1; - int NrOfSymbols = 5; + int startSymbolAndLength = 53; + int StartSymbolIndex = 2; + int NrOfSymbols = 12; int StartSymbolIndex_tmp = 0; int NrOfSymbols_tmp = 0; int x_Overhead = 0; @@ -1240,7 +1241,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->rbSize = rbSize; pdsch_pdu_rel15->VRBtoPRBMapping = 0; - // FIXME: should use Initial BWP + // FIXME: should use Initial BWP and maybe Default values from TS 38.214 Table 5.1.2.1.1-1 for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; SLIV2SL(startSymbolAndLength, &StartSymbolIndex_tmp, &NrOfSymbols_tmp); From efd1f46f1f419e2259ffe5b6ddc9b37517ff460c Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 3 Mar 2021 12:12:39 +0000 Subject: [PATCH 030/125] Fix Msg4 mcsIndex assignment --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 17 +++++++----- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 27 +++++++------------ 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 843e030f6f..6485d6c851 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1836,15 +1836,20 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, mac_subheader_len = 2; } - LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d: bits\n", mac_sdu_len); + if ( mac_sdu_len > 0) { + LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d: bits\n", mac_sdu_len); - LOG_D(NR_MAC,"RRCSetup received at nr_ue_process_mac_pdu with payload len %d: \n bits, rx bytes: \n", mac_sdu_len); - for (int i = 0; i < mac_sdu_len/8; i++) { - LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[i + 2]); + LOG_D(NR_MAC,"RRCSetup received at nr_ue_process_mac_pdu with payload len %d: \n bits, rx bytes: \n", mac_sdu_len); + for (int i = 0; i < mac_subheader_len; i++) { + LOG_D(NR_MAC, "MAC header %d: 0x%x\n", i, pduP[i]); + } + for (int i = 0; i < mac_sdu_len/8; i++) { + LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[mac_subheader_len + i]); + } + + nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_sdu_len); } - - nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_sdu_len); break; case DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH: diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 11bbb3ea3d..37db600b6b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1090,7 +1090,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int mcsIndex = 0; - int startSymbolAndLength = 53; + int mcsTableIndex = 0; + int startSymbolAndLength = 0; int StartSymbolIndex = 2; int NrOfSymbols = 12; int StartSymbolIndex_tmp = 0; @@ -1129,8 +1130,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra uint32_t TBS = 0; do { rbSize++; - TBS = nr_compute_tbs(nr_get_Qm_dl(nr_mac->sched_ctrlCommon->mcs, nr_mac->sched_ctrlCommon->mcsTableIdx), - nr_get_code_rate_dl(nr_mac->sched_ctrlCommon->mcs, nr_mac->sched_ctrlCommon->mcsTableIdx), + TBS = nr_compute_tbs(nr_get_Qm_dl(mcsIndex, mcsTableIndex), + nr_get_code_rate_dl(mcsIndex, mcsTableIndex), rbSize, NrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT,0, 0,1) >> 3; } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && TBS < mac_pdu_length); @@ -1212,10 +1213,10 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; - pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,0); + pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIndex); pdsch_pdu_rel15->qamModOrder[0] = 2; pdsch_pdu_rel15->mcsIndex[0] = mcsIndex; - +/* if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) { pdsch_pdu_rel15->mcsTable[0] = 0; } else { @@ -1225,6 +1226,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->mcsTable[0] = 2; } } + */ + pdsch_pdu_rel15->rvIndex[0] = 0; pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; @@ -1311,8 +1314,6 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra x_Overhead = 0; nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); - const int cont_res_len = 1 + 6; - const int post_padding = TBS > mac_pdu_length; //LOG_I(NR_MAC, "Configuring DL_TX in %d.%d: TBS %d, header_length_total %d, sdu_length_total %d,cont_res_len %d, post_padding %d \n", frameP, slotP, // TBS, header_length_total, payload_length, cont_res_len, post_padding); @@ -1320,17 +1321,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; - - if (post_padding > 0) { - for (int j = 0; j < TBS - mac_pdu_length; j++) - mac_pdu[mac_pdu_length + j] = 0; - } - mac_pdu_length = TBS; - - - //bzero(tx_req->TLVs[0].value.direct,MAX_NR_DLSCH_PAYLOAD_BYTES); - memcpy(&tx_req->TLVs[0].value.direct, mac_pdu, sizeof(uint8_t) * mac_pdu_length); - + memcpy(&tx_req->TLVs[0].value.direct, mac_pdu, sizeof(uint8_t) * TBS); tx_req->PDU_length = TBS; tx_req->PDU_index = pduindex; tx_req->num_TLV = 1; From bb0507a8465230742a8e122b95c3b65973021962 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 3 Mar 2021 16:03:18 +0000 Subject: [PATCH 031/125] Revert code from commit fc9b781c --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index 95e27021cb..ede68b11ef 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -444,13 +444,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, } // This schedules the DCI for Downlink and PDSCH - bool tx_ra_msg4 = false; - for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { - if(cc->ra[i].state == Msg4 && cc->ra[i].Msg4_frame==frame && cc->ra[i].Msg4_slot==slot) { - tx_ra_msg4 = true; - } - } - if ( is_xlsch_in_slot(dlsch_in_slot_bitmap, slot) && tx_ra_msg4 == false ) + if (is_xlsch_in_slot(dlsch_in_slot_bitmap, slot)) nr_schedule_ue_spec(module_idP, frame, slot); From ab3794e62cc64a0837b443efbb9c5c013aabdf65 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 3 Mar 2021 20:16:14 +0000 Subject: [PATCH 032/125] Improvements in RA-Msg2 --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 6 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 124 ++++++++---------- 2 files changed, 60 insertions(+), 70 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 6485d6c851..a63cec0481 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -654,8 +654,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr } else { if (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti){ dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH; + pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; } else { dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH; + if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) + pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); } if( (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti) ) { @@ -667,9 +670,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing; } - if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) - pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); - BWPSize = n_RB_DLBWP; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 37db600b6b..b14c82fa3a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -832,19 +832,10 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra if ((ra->Msg2_frame == frameP) && (ra->Msg2_slot == slotP)) { - int mcsIndex = 0; - int startSymbolAndLength = 53; - int StartSymbolIndex = 2; - int NrOfSymbols = 12; - int StartSymbolIndex_tmp = 0; - int NrOfSymbols_tmp = 0; - int x_Overhead = 0; - int time_domain_assignment = 0; - uint8_t nr_of_candidates = 0; - uint8_t aggregation_level = 0; + uint8_t time_domain_assignment = 0; + uint8_t mcsIndex = 0; int rbStart = 0; int rbSize = 6; - uint16_t *vrb_map = cc[CC_id].vrb_map; NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; @@ -854,8 +845,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; - + uint16_t *vrb_map = cc[CC_id].vrb_map; for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) { if (vrb_map[rbStart + i]) { rbStart += i; @@ -869,25 +859,27 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } // Checking if the DCI allocation is feasible in current subframe + nfapi_nr_dl_tti_request_body_t *dl_req = &nr_mac->DL_req[CC_id].dl_tti_request_body; if (dl_req->nPDUs > NFAPI_NR_MAX_DL_TTI_PDUS - 2) { LOG_I(MAC, "[RAPROC] Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", slotP, ra->RA_rnti); return; } + uint8_t aggregation_level; + uint8_t nr_of_candidates; find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss); - int CCEIndex = allocate_nr_CCEs(nr_mac, - bwp, - coreset, - aggregation_level, - 0, - 0, - nr_of_candidates); - + int CCEIndex = allocate_nr_CCEs(nr_mac, bwp, coreset, aggregation_level,0,0,nr_of_candidates); if (CCEIndex < 0) { LOG_E(MAC, "%s(): cannot find free CCE for RA RNTI %04x!\n", __func__, ra->rnti); return; } + // Calculate number of symbols + int startSymbolIndex, nrOfSymbols; + const int startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength; + SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); + AssertFatal(startSymbolIndex >= 0, "StartSymbolIndex is negative\n"); + // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially // important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them const int bwpid = bwp->bwp_Id; @@ -914,35 +906,41 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dl_req->nPDUs+=1; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; - LOG_I(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d\n", module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state); + LOG_I(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d\n", + module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state); AssertFatal(ra->secondaryCellGroup, "no secondaryCellGroup for RNTI %04x\n", ra->crnti); - AssertFatal(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, - "downlinkBWP_ToAddModList has %d BWP!\n", ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); - pdsch_pdu_rel15->pduBitmap = 0; - pdsch_pdu_rel15->rnti = ra->RA_rnti; + AssertFatal(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, + "downlinkBWP_ToAddModList has %d BWP!\n", + ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control // information to data and is reset every slot. const int pduindex = nr_mac->pdu_index[CC_id]++; + + uint8_t mcsTableIdx = 0; + if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) + mcsTableIdx = 0; + else{ + if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) + mcsTableIdx = 1; + else + mcsTableIdx = 2; + } + + pdsch_pdu_rel15->pduBitmap = 0; + pdsch_pdu_rel15->rnti = ra->RA_rnti; pdsch_pdu_rel15->pduIndex = pduindex; pdsch_pdu_rel15->BWPSize = BWPSize; pdsch_pdu_rel15->BWPStart = BWPStart; pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; - pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,0); + pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIdx); pdsch_pdu_rel15->qamModOrder[0] = 2; pdsch_pdu_rel15->mcsIndex[0] = mcsIndex; - if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) - pdsch_pdu_rel15->mcsTable[0] = 0; - else{ - if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) - pdsch_pdu_rel15->mcsTable[0] = 1; - else - pdsch_pdu_rel15->mcsTable[0] = 2; - } + pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx; pdsch_pdu_rel15->rvIndex[0] = 0; pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; pdsch_pdu_rel15->nrOfLayers = 1; @@ -957,23 +955,16 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->rbStart = rbStart; pdsch_pdu_rel15->rbSize = rbSize; pdsch_pdu_rel15->VRBtoPRBMapping = 0; + pdsch_pdu_rel15->StartSymbolIndex = startSymbolIndex; + pdsch_pdu_rel15->NrOfSymbols = nrOfSymbols; + pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(nr_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, + nr_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, + nrOfSymbols, + startSymbolIndex); - // FIXME: should use Initial BWP and maybe Default values from TS 38.214 Table 5.1.2.1.1-1 - for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { - startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; - SLIV2SL(startSymbolAndLength, &StartSymbolIndex_tmp, &NrOfSymbols_tmp); - //if (NrOfSymbols_tmp < NrOfSymbols) { - NrOfSymbols = NrOfSymbols_tmp; - StartSymbolIndex = StartSymbolIndex_tmp; - time_domain_assignment = i; // this is short PDSCH added to the config to fit mixed slot - //} - break; - } - AssertFatal(StartSymbolIndex >= 0, "StartSymbolIndex is negative\n"); - - pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; - pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; - pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols, StartSymbolIndex); + int x_Overhead = 0; + uint8_t tb_scaling = 0; + nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, tb_scaling); // Fill PDCCH DL DCI PDU nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; @@ -994,7 +985,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dci_payload.time_domain_assignment.val = time_domain_assignment; dci_payload.vrb_to_prb_mapping.val = 0; dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0]; - dci_payload.tb_scaling = 0; + dci_payload.tb_scaling = tb_scaling; LOG_D(NR_MAC, "[RAPROC] DCI type 1 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d \n", @@ -1027,6 +1018,17 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; + + // Program UL processing for Msg3 + NR_BWP_Uplink_t *ubwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1]; + nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra); + nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]); + + LOG_I(MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception for Frame %d Subframe %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot); + + T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(ra->RA_rnti), T_INT(frameP), + T_INT(slotP), T_INT(0), T_BUFFER(&tx_req->TLVs[0].value.direct[0], tx_req->TLVs[0].length)); + tx_req->PDU_length = pdsch_pdu_rel15->TBSize[0]; tx_req->PDU_index = pduindex; tx_req->num_TLV = 1; @@ -1035,25 +1037,13 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra nr_mac->TX_req[CC_id].Number_of_PDUs++; nr_mac->TX_req[CC_id].Slot = slotP; - // Program UL processing for Msg3 - NR_BWP_Uplink_t *ubwp=ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1]; - nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra); - LOG_I(MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception for Frame %d Subframe %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot); - nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]); - ra->state = WAIT_Msg3; - LOG_I(MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state); - - x_Overhead = 0; - nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); - - T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), - T_INT(ra->RA_rnti), T_INT(frameP), T_INT(slotP), T_INT(0), - T_BUFFER(&tx_req->TLVs[0].value.direct[0], tx_req->TLVs[0].length)); - // Mark the corresponding RBs as used for (int rb = 0; rb < rbSize; rb++) { vrb_map[rb + rbStart] = 1; } + + ra->state = WAIT_Msg3; + LOG_I(MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state); } } From 245f1e066feab4286bf777f8a014bc057e6803e2 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 4 Mar 2021 01:23:56 +0000 Subject: [PATCH 033/125] Improvements in RA-Msg4 --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 6 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 194 +++++++----------- openair2/RRC/NR_UE/L2_interface_ue.c | 3 +- 3 files changed, 83 insertions(+), 120 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index a63cec0481..a644059839 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -654,20 +654,20 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr } else { if (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti){ dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH; - pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; } else { dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH; - if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) - pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); } if( (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti) ) { dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; } else { dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing; + if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) + pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); } BWPSize = n_RB_DLBWP; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index b14c82fa3a..dcd2e44026 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -909,7 +909,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra LOG_I(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d\n", module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state); - AssertFatal(ra->secondaryCellGroup, "no secondaryCellGroup for RNTI %04x\n", ra->crnti); + AssertFatal(ra->secondaryCellGroup, "no secondaryCellGroup for RNTI %04x\n", ra->RA_rnti); AssertFatal(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList has %d BWP!\n", @@ -1054,45 +1054,10 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra if (ra->Msg4_frame == frameP && ra->Msg4_slot == slotP ) { + uint8_t time_domain_assignment = 0; + uint8_t mcsIndex = 0; + uint8_t mac_sdu[30] = {}; uint8_t mac_pdu[100] = {}; - uint16_t mac_pdu_length = 0; - - const int offset = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, (unsigned char *)mac_pdu, 255, ra->cont_res_id); - mac_pdu_length += offset; - - uint8_t mac_sdu[30]; - uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, mac_sdu); - - - ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->R = 0; - ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->F = 0; - ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; - ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->L = mac_sdu_length * 8; - mac_pdu_length += 2; - - memcpy(&mac_pdu[mac_pdu_length], mac_sdu, sizeof(uint8_t) * mac_sdu_length); - mac_pdu_length += mac_sdu_length; - - LOG_I(NR_MAC, "[gNB %d] Got %d bytes from CCCH\n", module_idP, mac_sdu_length); - - //int header_length_total = 1 + 6 + 2 + (mac_sdu_length >= 128); - //int payload_length = mac_sdu_length + header_length_total; - - - int mcsIndex = 0; - int mcsTableIndex = 0; - int startSymbolAndLength = 0; - int StartSymbolIndex = 2; - int NrOfSymbols = 12; - int StartSymbolIndex_tmp = 0; - int NrOfSymbols_tmp = 0; - int x_Overhead = 0; - int time_domain_assignment = 0; - int rbStart = 0; - int rbSize = 0; - uint8_t nr_of_candidates = 0; - uint8_t aggregation_level = 0; - uint16_t *vrb_map = cc[CC_id].vrb_map; NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; @@ -1102,6 +1067,30 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + // Bytes to be transmitted + uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, mac_sdu); + uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, (unsigned char *)mac_pdu, 255, ra->cont_res_id); + ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->R = 0; + ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->F = 0; + ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; + ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->L = mac_sdu_length * 8; + mac_pdu_length += 2; + memcpy(&mac_pdu[mac_pdu_length], mac_sdu, sizeof(uint8_t) * mac_sdu_length); + mac_pdu_length += mac_sdu_length; + + // Calculate number of symbols + int startSymbolIndex, nrOfSymbols; + const int startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength; + SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); + AssertFatal(startSymbolIndex >= 0, "StartSymbolIndex is negative\n"); + + uint16_t dlDmrsSymbPos = fill_dmrs_mask(nr_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, + nr_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, + nrOfSymbols, + startSymbolIndex); + + uint16_t N_DMRS_SLOT = get_num_dmrs(dlDmrsSymbPos); + long dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; uint8_t N_PRB_DMRS = 0; if (dmrsConfigType==NFAPI_NR_DMRS_TYPE1) { @@ -1111,18 +1100,26 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra N_PRB_DMRS = nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 4; } - uint8_t N_DMRS_SLOT = get_num_dmrs_symbols(NULL, - RC.nrmac[module_idP]->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, - NrOfSymbols, - StartSymbolIndex); - + uint8_t mcsTableIdx = 0; + if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) + mcsTableIdx = 0; + else{ + if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) + mcsTableIdx = 1; + else + mcsTableIdx = 2; + } + int rbStart = 0; + int rbSize = 0; uint32_t TBS = 0; + uint8_t tb_scaling = 0; + uint16_t *vrb_map = cc[CC_id].vrb_map; do { rbSize++; - TBS = nr_compute_tbs(nr_get_Qm_dl(mcsIndex, mcsTableIndex), - nr_get_code_rate_dl(mcsIndex, mcsTableIndex), - rbSize, NrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT,0, 0,1) >> 3; + TBS = nr_compute_tbs(nr_get_Qm_dl(mcsIndex, mcsTableIdx), + nr_get_code_rate_dl(mcsIndex, mcsTableIdx), + rbSize, nrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT, 0, tb_scaling,1) >> 3; } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && TBS < mac_pdu_length); for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) { @@ -1133,7 +1130,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } if (rbStart > (BWPSize - rbSize)) { - LOG_E(NR_MAC, "%s(): cannot find free vrb_map for RA RNTI %04x!\n", __func__, ra->RA_rnti); + LOG_E(NR_MAC, "%s(): cannot find free vrb_map for RNTI %04x!\n", __func__, ra->rnti); return; } @@ -1144,17 +1141,12 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra return; } + uint8_t aggregation_level; + uint8_t nr_of_candidates; find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss); - int CCEIndex = allocate_nr_CCEs(nr_mac, - bwp, - coreset, - aggregation_level, - 0, - 0, - nr_of_candidates); - + int CCEIndex = allocate_nr_CCEs(nr_mac, bwp, coreset, aggregation_level,0,0,nr_of_candidates); if (CCEIndex < 0) { - LOG_E(NR_MAC, "%s(): cannot find free CCE for RNTI %04x!\n", __func__, ra->rnti); + LOG_E(MAC, "%s(): cannot find free CCE for RA RNTI %04x!\n", __func__, ra->rnti); return; } @@ -1187,44 +1179,33 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra LOG_I(NR_MAC,"[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state); AssertFatal(ra->secondaryCellGroup, "no secondaryCellGroup for RNTI %04x\n", ra->rnti); + AssertFatal(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList has %d BWP!\n", ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); - pdsch_pdu_rel15->pduBitmap = 0; - pdsch_pdu_rel15->rnti = ra->rnti; - // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control // information to data and is reset every slot. const int pduindex = nr_mac->pdu_index[CC_id]++; + + pdsch_pdu_rel15->pduBitmap = 0; + pdsch_pdu_rel15->rnti = ra->rnti; pdsch_pdu_rel15->pduIndex = pduindex; pdsch_pdu_rel15->BWPSize = BWPSize; pdsch_pdu_rel15->BWPStart = BWPStart; pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; - pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIndex); + pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIdx); pdsch_pdu_rel15->qamModOrder[0] = 2; pdsch_pdu_rel15->mcsIndex[0] = mcsIndex; -/* - if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) { - pdsch_pdu_rel15->mcsTable[0] = 0; - } else { - if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) { - pdsch_pdu_rel15->mcsTable[0] = 1; - } else { - pdsch_pdu_rel15->mcsTable[0] = 2; - } - } - */ - - + pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx; pdsch_pdu_rel15->rvIndex[0] = 0; pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; pdsch_pdu_rel15->nrOfLayers = 1; pdsch_pdu_rel15->transmissionScheme = 0; pdsch_pdu_rel15->refPoint = 0; - pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; + pdsch_pdu_rel15->dmrsConfigType = dmrsConfigType; pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; pdsch_pdu_rel15->SCID = 0; pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2; @@ -1233,23 +1214,12 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->rbStart = rbStart; pdsch_pdu_rel15->rbSize = rbSize; pdsch_pdu_rel15->VRBtoPRBMapping = 0; + pdsch_pdu_rel15->StartSymbolIndex = startSymbolIndex; + pdsch_pdu_rel15->NrOfSymbols = nrOfSymbols; + pdsch_pdu_rel15->dlDmrsSymbPos = dlDmrsSymbPos; - // FIXME: should use Initial BWP and maybe Default values from TS 38.214 Table 5.1.2.1.1-1 - for (int i=0; ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count; i++) { - startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; - SLIV2SL(startSymbolAndLength, &StartSymbolIndex_tmp, &NrOfSymbols_tmp); - //if (NrOfSymbols_tmp < NrOfSymbols) { - NrOfSymbols = NrOfSymbols_tmp; - StartSymbolIndex = StartSymbolIndex_tmp; - time_domain_assignment = i; // this is short PDSCH added to the config to fit mixed slot - //} - break; - } - AssertFatal(StartSymbolIndex >= 0, "StartSymbolIndex is negative\n"); - - pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; - pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; - pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols, StartSymbolIndex); + int x_Overhead = 0; + nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, tb_scaling); // Fill PDCCH DL DCI PDU nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; @@ -1270,7 +1240,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dci_payload.time_domain_assignment.val = time_domain_assignment; dci_payload.vrb_to_prb_mapping.val = 0; dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0]; - dci_payload.tb_scaling = 0; + dci_payload.tb_scaling = tb_scaling; LOG_D(NR_MAC, "[RAPROC] DCI type 1 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d \n", @@ -1301,16 +1271,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->BWPSize, nr_mac->sched_ctrlCommon->active_bwp->bwp_Id); - x_Overhead = 0; - nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling); - - - //LOG_I(NR_MAC, "Configuring DL_TX in %d.%d: TBS %d, header_length_total %d, sdu_length_total %d,cont_res_len %d, post_padding %d \n", frameP, slotP, - // TBS, header_length_total, payload_length, cont_res_len, post_padding); - // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; - memcpy(&tx_req->TLVs[0].value.direct, mac_pdu, sizeof(uint8_t) * TBS); tx_req->PDU_length = TBS; tx_req->PDU_index = pduindex; @@ -1324,22 +1286,24 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) { vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1; } - ra->state = WAIT_Msg4_ACK; - LOG_D(MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize); - LOG_D(MAC,"BWPStart: %i\n", pdcch_pdu_rel15->BWPStart); - LOG_D(MAC,"SubcarrierSpacing: %i\n", pdcch_pdu_rel15->SubcarrierSpacing); - LOG_D(MAC,"CyclicPrefix: %i\n", pdcch_pdu_rel15->CyclicPrefix); - LOG_D(MAC,"StartSymbolIndex: %i\n", pdcch_pdu_rel15->StartSymbolIndex); - LOG_D(MAC,"DurationSymbols: %i\n", pdcch_pdu_rel15->DurationSymbols); - for(int n=0;n<6;n++) LOG_D(MAC,"FreqDomainResource[%i]: %x\n",n, pdcch_pdu_rel15->FreqDomainResource[n]); - LOG_D(MAC,"CceRegMappingType: %i\n", pdcch_pdu_rel15->CceRegMappingType); - LOG_D(MAC,"RegBundleSize: %i\n", pdcch_pdu_rel15->RegBundleSize); - LOG_D(MAC,"InterleaverSize: %i\n", pdcch_pdu_rel15->InterleaverSize); - LOG_D(MAC,"CoreSetType: %i\n", pdcch_pdu_rel15->CoreSetType); - LOG_D(MAC,"ShiftIndex: %i\n", pdcch_pdu_rel15->ShiftIndex); - LOG_D(MAC,"precoderGranularity: %i\n", pdcch_pdu_rel15->precoderGranularity); - LOG_D(MAC,"numDlDci: %i\n", pdcch_pdu_rel15->numDlDci); + LOG_D(NR_MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize); + LOG_D(NR_MAC,"BWPStart: %i\n", pdcch_pdu_rel15->BWPStart); + LOG_D(NR_MAC,"SubcarrierSpacing: %i\n", pdcch_pdu_rel15->SubcarrierSpacing); + LOG_D(NR_MAC,"CyclicPrefix: %i\n", pdcch_pdu_rel15->CyclicPrefix); + LOG_D(NR_MAC,"StartSymbolIndex: %i\n", pdcch_pdu_rel15->StartSymbolIndex); + LOG_D(NR_MAC,"DurationSymbols: %i\n", pdcch_pdu_rel15->DurationSymbols); + for(int n=0;n<6;n++) LOG_D(NR_MAC,"FreqDomainResource[%i]: %x\n",n, pdcch_pdu_rel15->FreqDomainResource[n]); + LOG_D(NR_MAC,"CceRegMappingType: %i\n", pdcch_pdu_rel15->CceRegMappingType); + LOG_D(NR_MAC,"RegBundleSize: %i\n", pdcch_pdu_rel15->RegBundleSize); + LOG_D(NR_MAC,"InterleaverSize: %i\n", pdcch_pdu_rel15->InterleaverSize); + LOG_D(NR_MAC,"CoreSetType: %i\n", pdcch_pdu_rel15->CoreSetType); + LOG_D(NR_MAC,"ShiftIndex: %i\n", pdcch_pdu_rel15->ShiftIndex); + LOG_D(NR_MAC,"precoderGranularity: %i\n", pdcch_pdu_rel15->precoderGranularity); + LOG_D(NR_MAC,"numDlDci: %i\n", pdcch_pdu_rel15->numDlDci); + + ra->state = WAIT_Msg4_ACK; + LOG_I(MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state); } } diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c index 347a367e62..609d526127 100644 --- a/openair2/RRC/NR_UE/L2_interface_ue.c +++ b/openair2/RRC/NR_UE/L2_interface_ue.c @@ -49,7 +49,6 @@ nr_mac_rrc_data_ind_ue( const uint8_t* pduP, const sdu_size_t pdu_len){ sdu_size_t sdu_size = 0; - protocol_ctxt_t ctxt; switch(channel){ case NR_BCCH_BCH: @@ -62,7 +61,7 @@ nr_mac_rrc_data_ind_ue( case CCCH: if (pdu_len>0) { - LOG_T(NR_RRC,"[UE %d] Received SDU for CCCH on SRB %ld from gNB %d\n",module_id,channel & RAB_OFFSET,gNB_index); + LOG_T(NR_RRC,"[UE %d] Received SDU for CCCH on SRB %u from gNB %d\n",module_id,channel & RAB_OFFSET,gNB_index); MessageDef *message_p; int msg_sdu_size = CCCH_SDU_SIZE; From 3b1b74cfd2512cd1195b1b029128dbbba03fa310 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Thu, 4 Mar 2021 13:22:14 +0100 Subject: [PATCH 034/125] starting --- .../install_external_packages.ubuntu20 | 22 +++++++++++++------ openair1/SIMULATION/TOOLS/random_channel.c | 14 ++++++++---- openair1/SIMULATION/TOOLS/sim.h | 4 +++- targets/ARCH/rfsimulator/apply_channelmod.c | 2 +- targets/ARCH/rfsimulator/simulator.c | 8 +++++-- targets/RT/USER/rfsim.c | 2 ++ 6 files changed, 37 insertions(+), 15 deletions(-) diff --git a/cmake_targets/install_external_packages.ubuntu20 b/cmake_targets/install_external_packages.ubuntu20 index 9ef79be9c2..db6e324eab 100755 --- a/cmake_targets/install_external_packages.ubuntu20 +++ b/cmake_targets/install_external_packages.ubuntu20 @@ -157,8 +157,16 @@ install_protobuf_from_source(){ #cd protobuf-2.6.1/ rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0 wget --tries=3 --retry-connrefused https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz - tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner "$USER" --group "$(groups | cut -d" " -f1)" --no-same-owner - cd protobuf-3.3.0/ || exit + tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $(id -u) --group $(id -g) --no-same-owner + cd protobuf-3.3.0/ + else + export LD_LIBRARY_PATH=/usr/local/lib #protoc needs to know where toclook for shared libs + rm -rf /tmp/protobuf + git clone --depth=1 --branch=v3.3.0 https://github.com/protocolbuffers/protobuf.git /tmp/protobuf + cd /tmp/protobuf + git submodule update --init --recursive + ./autogen.sh + fi ./configure echo "Compiling protobuf" make -j"$(nproc)" @@ -198,15 +206,15 @@ install_usrp_uhd_driver_from_source(){ rm -rf /tmp/uhd git clone https://github.com/EttusResearch/uhd.git cd uhd || exit - git checkout tags/v3.13.0.2 + git checkout UHD-3.15.LTS mkdir -p host/build cd host/build || exit - $CMAKE ../ + $CMAKE ../ -GNinja echo "Compiling UHD" - make -j"$(nproc)" - make test - $SUDO make install + ninja + $SUDO ninja install $SUDO ldconfig + $SUDO /usr/lib/uhd/utils/uhd_images_downloader.py ) >& "$uhd_install_log" } diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 8c063fadc0..6ce3d27ec1 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -502,7 +502,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, double DS_TDL, double forgetting_factor, int32_t channel_offset, - double path_loss_dB) { + double path_loss_dB, + float noise_power_dB) { channel_desc_t *chan_desc = (channel_desc_t *)calloc(1,sizeof(channel_desc_t)); for(int i=0; ipath_loss_dB = path_loss_dB; chan_desc->first_run = 1; chan_desc->ip = 0.0; + chan_desc->noise_power_dB = noise_power_dB; + LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model); int tdl_paths=0; @@ -1861,7 +1864,7 @@ static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt prnt("channelmod show current: display the currently used models in the running executable\n"); prnt("channelmod modify : set the specified parameters in a current model to the given value\n"); prnt(" specifies the model, the show current model command can be used to list the current models indexes\n"); - prnt(" can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"offset\", \"forgetf\"\n"); + prnt(" can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"noise_power_dB\", \"offset\", \"forgetf\"\n"); return CMDSTATUS_FOUND; } @@ -1874,8 +1877,8 @@ static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_ prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate); prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n", cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No")); - prnt("max Doppler: %lf path loss: %lf rchannel offset: %i forget factor; %lf\n", - cd->max_Doppler, cd->path_loss_dB, cd->channel_offset, cd->forgetting_factor); + prnt("max Doppler: %lf path loss: %lf noise: %lf rchannel offset: %i forget factor; %lf\n", + cd->max_Doppler, cd->path_loss_dB, cd->noise_power_dB, cd->channel_offset, cd->forgetting_factor); prnt("Initial phase: %lf nb_path: %i \n", cd->ip, cd->nb_paths); for (int i=0; inb_taps ; i++) { @@ -1945,6 +1948,9 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt) } else if ( strcmp(param,"ploss") == 0) { double dbl = atof(value); defined_channels[cd_id]->path_loss_dB=dbl; + } else if ( strcmp(param,"noise_power_dB") == 0) { + double dbl = atof(value); + defined_channels[cd_id]->noise_power_dB=dbl; } else if ( strcmp(param,"offset") == 0) { int i = atoi(value); defined_channels[cd_id]->channel_offset=i; diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h index 55a78e9778..97be5bf7e9 100644 --- a/openair1/SIMULATION/TOOLS/sim.h +++ b/openair1/SIMULATION/TOOLS/sim.h @@ -89,6 +89,7 @@ typedef struct { double path_loss_dB; ///additional delay of channel in samples. int32_t channel_offset; + float noise_power_dB; ///This parameter (0...1) allows for simple 1st order temporal variation. 0 means a new channel every call, 1 means keep channel constant all the time double forgetting_factor; ///needs to be set to 1 for the first call, 0 otherwise. @@ -280,7 +281,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, double TDL_DS, double forgetting_factor, int32_t channel_offset, - double path_loss_dB); + double path_loss_dB, + float noise_power_dB); /** \brief free memory allocated for a model descriptor \param ch points to the model, which cannot be used after calling this fuction diff --git a/targets/ARCH/rfsimulator/apply_channelmod.c b/targets/ARCH/rfsimulator/apply_channelmod.c index 3f4c0e1517..9ff9eda4d3 100644 --- a/targets/ARCH/rfsimulator/apply_channelmod.c +++ b/targets/ARCH/rfsimulator/apply_channelmod.c @@ -72,7 +72,7 @@ void rxAddInput( struct complex16 *input_sig, struct complex16 *after_channel_si // Fixme: how to convert a noise in Watt into a 12 bits value out of the RF ADC ? // the parameter "-s" is declared as SNR, but the input power is not well defined // −132.24 dBm is a LTE subcarrier noise, that was used in origin code (15KHz BW thermal noise) - const double rxGain= 132.24 - channelmod_get_snr_dB(); + const double rxGain= 132.24 - channelDesc->noise_power_dB; // sqrt(4*noise_figure_watt) is the thermal noise factor (volts) // fixme: the last constant is pure trial results to make decent noise const double noise_per_sample = sqrt(4*noise_figure_watt) * pow(10,rxGain/20) *10; diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c index cd35c46a15..6a4db361df 100644 --- a/targets/ARCH/rfsimulator/simulator.c +++ b/targets/ARCH/rfsimulator/simulator.c @@ -133,6 +133,7 @@ typedef struct { double chan_pathloss; double chan_forgetfact; int chan_offset; + float noise_power_dB; void *telnetcmd_qid; poll_telnetcmdq_func_t poll_telnetcmdq; } rfsimulator_state_t; @@ -190,7 +191,8 @@ static void allocCirBuf(rfsimulator_state_t *bridge, int sock) { 30e-9, // TDL delay-spread parameter bridge->chan_forgetfact, // forgetting_factor bridge->chan_offset, // maybe used for TA - bridge->chan_pathloss); // path_loss in dB + bridge->chan_pathloss, + bridge->noise_power_dB); // path_loss in dB set_channeldesc_owner(ptr->channel_model, RFSIMU_MODULEID); random_channel(ptr->channel_model,false); } @@ -341,7 +343,9 @@ static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, 30e-9, // TDL delay-spread parameter t->chan_forgetfact, // forgetting_factor t->chan_offset, // maybe used for TA - t->chan_pathloss); // path_loss in dB + t->chan_pathloss, + t->noise_power_dB + ); // path_loss in dB set_channeldesc_owner(newmodel, RFSIMU_MODULEID); random_channel(newmodel,false); channel_desc_t *oldmodel=b->channel_model; diff --git a/targets/RT/USER/rfsim.c b/targets/RT/USER/rfsim.c index eb380b9518..2bd95507c3 100644 --- a/targets/RT/USER/rfsim.c +++ b/targets/RT/USER/rfsim.c @@ -361,6 +361,7 @@ void init_ocm(void) { DS_TDL, 0.0, 0, + 0, 0); random_channel(sim.RU2UE[ru_id][UE_id][CC_id],0); LOG_D(OCM,"[SIM] Initializing channel (%s) from UE %d to ru %d\n", "AWGN", UE_id, ru_id); @@ -374,6 +375,7 @@ void init_ocm(void) { DS_TDL, 0.0, 0, + 0, 0); random_channel(sim.UE2RU[UE_id][ru_id][CC_id],0); // to make channel reciprocal uncomment following line instead of previous. However this only works for SISO at the moment. For MIMO the channel would need to be transposed. From cfd5adcc84f832213606a7582f32657276821fd8 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 4 Mar 2021 16:11:44 +0000 Subject: [PATCH 035/125] Segmentation fault prevention in RA-Msg2 --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index dcd2e44026..7a00f40e45 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -837,6 +837,18 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int rbStart = 0; int rbSize = 6; + if (nr_mac->sched_ctrlCommon == NULL){ + nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); + nr_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->search_space)); + nr_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->active_bwp)); + nr_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->coreset)); + nr_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->active_bwp)); + fill_default_searchSpaceZero(nr_mac->sched_ctrlCommon->search_space); + fill_default_coresetZero(nr_mac->sched_ctrlCommon->coreset,cc->ServingCellConfigCommon); + fill_default_initialDownlinkBWP(nr_mac->sched_ctrlCommon->active_bwp,cc->ServingCellConfigCommon); + } + nr_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; + NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; From ba8c14debcdc0a1dee464c3457706186c54594a7 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 4 Mar 2021 19:58:11 +0000 Subject: [PATCH 036/125] Update RA succeeded procedures --- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 2 + openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 10 ++-- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 50 +++++++++---------- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 3 +- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index cf157e108a..84e8ec59b5 100755 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -291,6 +291,8 @@ typedef struct { uint8_t RA_contention_resolution_timer_active; /// Random-access Contention Resolution Timer count value uint8_t RA_contention_resolution_cnt; + /// Transmitted UE Contention Resolution Identifier + uint8_t cont_res_id[6]; /// BeamfailurerecoveryConfig NR_BeamFailureRecoveryConfig_t RA_BeamFailureRecoveryConfig; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 9e4afd9c85..671dfbdd68 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -568,6 +568,11 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, if (size_sdu > 0) { + // UE Contention Resolution Identity + // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to determine whether or not the + // Random Access Procedure has been successful after reception of Msg4 + memcpy(ra->cont_res_id, mac_sdus, sizeof(uint8_t) * 6); + LOG_D(MAC, "[UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", mod_id, frame, nr_slot_tx); ra->Msg3_size = size_sdu + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); @@ -624,10 +629,9 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, prach_resources->RA_PREAMBLE_BACKOFF = 0; } - if (ra->RA_window_cnt >= 0 && ra->RA_RAPID_found == 1) { + if (ra->RA_window_cnt >= 0 && ra->RA_RAPID_found == 1 && ra->cfra) { // Reset RA_active flag: it disables Msg3 retransmission (8.3 of TS 38.213) - - //nr_ra_succeeded(mod_id, frame, nr_slot_tx); + nr_ra_succeeded(mod_id, frame, nr_slot_tx); } else if (ra->RA_window_cnt == 0 && !ra->RA_RAPID_found) { diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index a644059839..5380de2ba4 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -515,10 +515,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr // Config PUSCH PDU ret = nr_config_pusch_pdu(mac, pusch_config_pdu, dci, NULL, rnti, &dci_format); - //if (ret != -1 && ra->RA_active && mac->crnti){ - // nr_ra_succeeded(module_id, frame, slot); - //} - } break; @@ -578,10 +574,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr // Config PUSCH PDU ret = nr_config_pusch_pdu(mac, pusch_config_pdu, dci, NULL, rnti, &dci_format); - //if (ret != -1 && ra->RA_active && mac->crnti){ - // nr_ra_succeeded(module_id, frame, slot); - //} - } break; @@ -782,12 +774,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dl_config->number_pdus = dl_config->number_pdus + 1; - // FIXME: Remove this - if (ra->ra_state == WAIT_CONTENTION_RESOLUTION && rnti == ra->t_crnti){ - LOG_I(NR_MAC,"RA-Msg4 received\n"); - nr_ra_succeeded(module_id, frame, slot); - } - break; } @@ -1957,20 +1943,34 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, break; case DL_SCH_LCID_CON_RES_ID: - // Clause 5.1.5 and 6.1.3.3 of 3GPP TS 38.321 version 16.2.1 Release 16 - // WIP todo: handle CCCH_pdu - // MAC Header: 1 byte (R/R/LCID) - // MAC SDU: 6 bytes (UE Contention Resolution Identity) - mac_ce_len = 6; - - LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution identity: 0x%x%x%x%x%x%x. Terminating RA procedure\n", module_idP, frameP, pduP[1], pduP[2], pduP[3], pduP[4], pduP[5], pduP[6]); + // Clause 5.1.5 and 6.1.3.3 of 3GPP TS 38.321 version 16.2.1 Release 16 + // MAC Header: 1 byte (R/R/LCID) + // MAC SDU: 6 bytes (UE Contention Resolution Identity) + mac_ce_len = 6; - // FIXME: Only succeeds if received contention resolution equals to the first 48 bits of transmitted Mgs3 - if (ra->RA_active == 1) { - nr_ra_succeeded(module_idP, frameP, slot); + if(ra->ra_state == WAIT_CONTENTION_RESOLUTION) { + LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution identity: 0x%02x%02x%02x%02x%02x%02x Terminating RA procedure\n", + module_idP, frameP, pduP[1], pduP[2], pduP[3], pduP[4], pduP[5], pduP[6]); + + bool ra_success = true; + for(int i = 0; icont_res_id[i] != pduP[i+1]) { + ra_success = false; + break; + } } - break; + if ( (ra->RA_active == 1) && ra_success) { + nr_ra_succeeded(module_idP, frameP, slot); + } else if (!ra_success){ + // TODO: Handle failure of RA procedure @ MAC layer + // nr_ra_failed(module_idP, CC_id, prach_resources, frameP, slot); // prach_resources is a PHY structure + ra->ra_state = RA_UE_IDLE; + ra->RA_active = 0; + } + } + + break; case DL_SCH_LCID_PADDING: done = 1; // end of MAC PDU, can ignore the rest. diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index e6441f4581..86b33236ca 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -506,7 +506,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, // UE Contention Resolution Identity // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4 - memcpy(ra->cont_res_id, sduP, sizeof(uint8_t) * 6); + // First byte corresponds to R/LCID MAC sub-header + memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6); // re-initialize ta update variables afrer RA procedure completion UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; From 99711020bdd9128dac298422685434c22de0a08c Mon Sep 17 00:00:00 2001 From: rmagueta Date: Sat, 6 Mar 2021 20:13:14 +0000 Subject: [PATCH 037/125] Update generate_nr_prach after receiving RA-Msg2 at UE --- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 671dfbdd68..ead83af58a 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -629,9 +629,14 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, prach_resources->RA_PREAMBLE_BACKOFF = 0; } - if (ra->RA_window_cnt >= 0 && ra->RA_RAPID_found == 1 && ra->cfra) { - // Reset RA_active flag: it disables Msg3 retransmission (8.3 of TS 38.213) - nr_ra_succeeded(mod_id, frame, nr_slot_tx); + if (ra->RA_window_cnt >= 0 && ra->RA_RAPID_found == 1) { + + if(ra->cfra) { + // Reset RA_active flag: it disables Msg3 retransmission (8.3 of TS 38.213) + nr_ra_succeeded(mod_id, frame, nr_slot_tx); + } else { + ra->generate_nr_prach = 2; + } } else if (ra->RA_window_cnt == 0 && !ra->RA_RAPID_found) { From dc9425ee914eaa40d9dba7026789176802063858 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 8 Mar 2021 12:05:25 +0000 Subject: [PATCH 038/125] Uniformization of coreset start subcarrier at gNB for coreset0 --- openair1/PHY/NR_TRANSPORT/nr_dci.c | 7 +------ openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 1 - openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 5 ++++- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index c4673e9d18..269ed3860d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -85,12 +85,7 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, // compute rb_offset and n_prb based on frequency allocation nr_fill_cce_list(gNB,0,pdcch_pdu_rel15); get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset); - cset_start_sc = frame_parms.first_carrier_offset + rb_offset*NR_NB_SC_PER_RB; - if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_MIB_SIB1) { - cset_start_sc = cset_start_sc + RC.nrmac[gNB->Mod_id]->type0_PDCCH_CSS_config.cset_start_rb*NR_NB_SC_PER_RB; - } else { - cset_start_sc = cset_start_sc + pdcch_pdu_rel15->BWPStart*NR_NB_SC_PER_RB; - } + cset_start_sc = frame_parms.first_carrier_offset + (pdcch_pdu_rel15->BWPStart + rb_offset) * NR_NB_SC_PER_RB; for (int d=0;dnumDlDci;d++) { /*The coreset is initialised diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 7a00f40e45..413fadb4a8 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -840,7 +840,6 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra if (nr_mac->sched_ctrlCommon == NULL){ nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); nr_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->search_space)); - nr_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->active_bwp)); nr_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->coreset)); nr_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->active_bwp)); fill_default_searchSpaceZero(nr_mac->sched_ctrlCommon->search_space); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 45f9b4ab83..a60685c586 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -245,7 +245,6 @@ void schedule_control_sib1(module_id_t module_id, if (gNB_mac->sched_ctrlCommon == NULL){ gNB_mac->sched_ctrlCommon = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon)); gNB_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->search_space)); - gNB_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->active_bwp)); gNB_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->coreset)); gNB_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->active_bwp)); fill_default_searchSpaceZero(gNB_mac->sched_ctrlCommon->search_space); @@ -340,6 +339,10 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, scc, bwp); + // TODO: This assignment should be done in function nr_configure_pdcch() + pdcch_pdu_rel15->BWPSize = gNB_mac->type0_PDCCH_CSS_config.num_rbs; + pdcch_pdu_rel15->BWPStart = gNB_mac->type0_PDCCH_CSS_config.cset_start_rb; + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset((void*)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE; From 45b86847b70a07a9bae9f95cb26a839468483458 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 8 Mar 2021 19:35:49 +0000 Subject: [PATCH 039/125] Fix DMRS sequence generation for BWPStart>0 (Msg2 and Msg4) --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 25 ++++++++++++++----- .../nr_dl_channel_estimation.c | 5 +++- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 2 +- .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 66fc987f6d..4fb9065aa5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -151,7 +151,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB, else { nb_re_dmrs = 4*rel15->numDmrsCdmGrpsNoData; } - n_dmrs = (rel15->rbSize+rel15->rbStart)*nb_re_dmrs; + n_dmrs = (rel15->BWPStart+rel15->rbStart+rel15->rbSize)*nb_re_dmrs; uint16_t dmrs_symbol_map = rel15->dlDmrsSymbPos;//single DMRS: 010000100 Double DMRS 110001100 uint8_t dmrs_len = get_num_dmrs(rel15->dlDmrsSymbPos); @@ -320,11 +320,24 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB, /// DMRS QPSK modulation uint8_t k_prime=0; uint16_t n=0; - if ((dmrs_symbol_map & (1 << l))){ //DMRS time occasion - if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k) - dmrs_idx = rel15->rbStart*6; - else - dmrs_idx = rel15->rbStart*4; + + if ((dmrs_symbol_map & (1 << l))){ // DMRS time occasion + // The reference point for is subcarrier 0 of the lowest-numbered resource block in CORESET 0 if the corresponding + // PDCCH is associated with CORESET 0 and Type0-PDCCH common search space and is addressed to SI-RNTI + // 3GPP TS 38.211 V15.8.0 Section 7.4.1.1.2 Mapping to physical resources + if (rel15->rnti==SI_RNTI) { + if (dmrs_Type==NFAPI_NR_DMRS_TYPE1) { + dmrs_idx = rel15->rbStart*6; + } else { + dmrs_idx = rel15->rbStart*4; + } + } else { + if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) { + dmrs_idx = (rel15->rbStart+rel15->BWPStart)*6; + } else { + dmrs_idx = (rel15->rbStart+rel15->BWPStart)*4; + } + } } // Update l_prime in the case of double DMRS config diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 6cb0a612e9..b498ed9c6f 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -687,7 +687,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, #endif // generate pilot for gNB port number 1000+p - uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12 - BWPStart; + uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12; + if (Ns % 20 == 0) { // FIXME: temporary fix for SIB1 + rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12 - BWPStart; + } uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type; int8_t delta = get_delta(p, config_type); nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol][0], &pilot[0],1000,0,nb_rb_pdsch+rb_offset); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 413fadb4a8..3a27f92a34 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -832,7 +832,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra if ((ra->Msg2_frame == frameP) && (ra->Msg2_slot == slotP)) { - uint8_t time_domain_assignment = 0; + uint8_t time_domain_assignment = 3; uint8_t mcsIndex = 0; int rbStart = 0; int rbSize = 6; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 60834281a9..35eb694c2b 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -106,7 +106,7 @@ gNBs = prach_msg1_FDM = 0; prach_msg1_FrequencyStart = 0; zeroCorrelationZoneConfig = 13; - preambleReceivedTargetPower = -100; + preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) preambleTransMax = 6; #powerRampingStep From 782053f03ff26991b5729cac6d69404f4bf9802e Mon Sep 17 00:00:00 2001 From: frtabu Date: Tue, 9 Mar 2021 01:19:39 +0100 Subject: [PATCH 040/125] enhance channel model configuration --- ci-scripts/conf_files/channelmod_rfsimu.conf | 48 ++++++++++ common/config/config_cmdline.c | 2 +- openair1/SIMULATION/TOOLS/random_channel.c | 95 +++++++++++++++++--- openair1/SIMULATION/TOOLS/sim.h | 47 ++++++++-- targets/ARCH/rfsimulator/simulator.c | 44 +++++---- 5 files changed, 193 insertions(+), 43 deletions(-) create mode 100644 ci-scripts/conf_files/channelmod_rfsimu.conf diff --git a/ci-scripts/conf_files/channelmod_rfsimu.conf b/ci-scripts/conf_files/channelmod_rfsimu.conf new file mode 100644 index 0000000000..c7abffa878 --- /dev/null +++ b/ci-scripts/conf_files/channelmod_rfsimu.conf @@ -0,0 +1,48 @@ +/* configuration for channel modelisation */ +/* To be included in main config file when */ +/* channel modelisation is used (rfsimulator with chanmod options enabled) */ +channelmod = { + max_chan=10; + modellist="modellist_rfsimu_1"; + modellist_rfsimu_1 = ( + { + model_name = "rfsimu_channel_ue0" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + }, + { + model_name = "rfsimu_channel_ue0" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + }, + ); + modellist_rfsimu_2 = ( + { + model_name = "rfsimu_channel_ue0" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + }, + { + model_name = "rfsimu_channel_ue0" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + }, + ); +}; + diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c index 6d01d98c65..1df1bc16f7 100644 --- a/common/config/config_cmdline.c +++ b/common/config/config_cmdline.c @@ -255,7 +255,7 @@ int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix) if ( ((strlen(oneargv) == 2) && (strcmp(oneargv + 1,cfgpath) == 0)) || /* short option, one "-" */ ((strlen(oneargv) > 2) && (strcmp(oneargv + 2,cfgpath ) == 0 )) || /* long option beginning with "--" */ ((strlen(oneargv) == 2) && (strcmp(oneargv + 1,cfgoptions[n].optname) == 0) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) || - ((strlen(oneargv) > 2) && (strcmp(oneargv + 2,cfgpath ) == 0 ) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) ) { + ((strlen(oneargv) > 2) && (strcmp(oneargv + 2, cfgoptions[n].optname) == 0 ) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) ) { char *valptr=NULL; int ret; config_get_if()->argv_info[i] |= CONFIG_CMDLINEOPT_PROCESSED; diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 6ce3d27ec1..7d8ef0a27c 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -61,7 +61,9 @@ static telnetshell_vardef_t channelmod_vardef[] = { static double snr_dB=25; static double sinr_dB=0; static unsigned int max_chan; -static channel_desc_t** defined_channels; +static channel_desc_t **defined_channels; +static char modellist_name[MAX_OPTNAME_SIZE]; + void fill_channel_desc(channel_desc_t *chan_desc, uint8_t nb_tx, uint8_t nb_rx, @@ -494,16 +496,17 @@ struct complex *R_sqrt_22_EPA_medium[1] = {R_sqrt_22_EPA_medium_tap}; //Rayleigh1_orth_eff_ch_TM4 + channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, uint8_t nb_rx, SCM_t channel_model, double sampling_rate, double channel_bandwidth, - double DS_TDL, + double DS_TDL, double forgetting_factor, int32_t channel_offset, double path_loss_dB, - float noise_power_dB) { + float noise_power_dB) { channel_desc_t *chan_desc = (channel_desc_t *)calloc(1,sizeof(channel_desc_t)); for(int i=0; inb_paths = 10; return(chan_desc); -} - +} /* channel_desc_t *new_channel_desc_scm */ + +channel_desc_t * find_channel_desc_fromname( char *modelname ) { + for(int i=0; imodel_name,modelname) == 0) + return defined_channels[i]; + } + } + LOG_E(OCM,"Model %s not found \n", modelname); + return NULL; +} /* channel_desc_t * new_channel_desc_fromconfig */ + + + void free_channel_desc_scm(channel_desc_t *ch) { // Must be made cleanly, a lot of leaks... defined_channels[ch->chan_idx]=NULL; @@ -1657,7 +1675,8 @@ void free_channel_desc_scm(channel_desc_t *ch) { free(ch->R_sqrt); free(ch->ch); free(ch->chF); - free(ch->a); + free(ch->a); + free(ch->model_name); free(ch); } @@ -1851,7 +1870,7 @@ double N_RB2channel_bandwidth(uint16_t N_RB) { break; default: - LOG_E(PHY,"Unknown N_PRB\n"); + LOG_E(OCM,"Unknown N_PRB\n"); return(-1); } return(channel_bandwidth); @@ -1989,18 +2008,74 @@ double channelmod_get_sinr_dB(void) { void init_channelmod(void) { paramdef_t channelmod_params[] = CHANNELMOD_PARAMS_DESC; - int ret = config_get( channelmod_params,sizeof(channelmod_params)/sizeof(paramdef_t),CHANNELMOD_SECTION); + + int numparams=sizeof(channelmod_params)/sizeof(paramdef_t); + int ret = config_get( channelmod_params,numparams,CHANNELMOD_SECTION); AssertFatal(ret >= 0, "configuration couldn't be performed"); defined_channels=calloc(max_chan,sizeof( channel_desc_t*)); AssertFatal(defined_channels!=NULL, "couldn't allocate %u channel descriptors\n",max_chan); - + /* look for telnet server, if it is loaded, add the channel modeling commands to it */ add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME); if (addcmd != NULL) { addcmd("channelmod",channelmod_vardef,channelmod_cmdarray); } -} +} /* init_channelmod */ + +void load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) { + + paramdef_t channelmod_params[] = CHANNELMOD_PARAMS_DESC; + + int numparams=sizeof(channelmod_params)/sizeof(paramdef_t); + int ret = config_get( channelmod_params,numparams,CHANNELMOD_SECTION); + AssertFatal(ret >= 0, "configuration couldn't be performed"); + defined_channels=calloc(max_chan,sizeof( channel_desc_t*)); + AssertFatal(defined_channels!=NULL, "couldn't allocate %u channel descriptors\n",max_chan); + + + paramdef_t achannel_params[] = CHANNELMOD_MODEL_PARAMS_DESC; + paramlist_def_t channel_list; + memset(&channel_list,0,sizeof(paramlist_def_t)); + strncpy(channel_list.listname,modellist_name,MAX_OPTNAME_SIZE-1); + + numparams = sizeof(achannel_params)/sizeof(paramdef_t); + config_getlist( &channel_list,achannel_params,numparams, CHANNELMOD_SECTION); + AssertFatal(channel_list.numelt>0, "List %s.%s not found in config filee\n",CHANNELMOD_SECTION,CHANNELMOD_MODELLIST_PARANAME); + int pindex_NAME = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_NAME_PNAME); + int pindex_DT = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_DT_PNAME ); + int pindex_FF = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_FF_PNAME ); + int pindex_CO = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_CO_PNAME ); + int pindex_PL = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_PL_PNAME ); + int pindex_NP = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_NP_PNAME ); + int pindex_TYPE = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_TYPE_PNAME); + + for (int i=0; imodel_name = strdup(*(channel_list.paramarray[i][pindex_NAME].strptr)); + LOG_I(OCM,"Model %s type %s allocated from config file, list %s\n",*(channel_list.paramarray[i][pindex_NAME].strptr), + *(channel_list.paramarray[i][pindex_TYPE].strptr), modellist_name); + } /* for loop on channel_list */ + /* look for telnet server, if it is loaded, add the channel modeling commands to it */ + add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME); + + if (addcmd != NULL) { + addcmd("channelmod",channelmod_vardef,channelmod_cmdarray); + } +} /* load_channelist */ #ifdef RANDOM_CHANNEL_MAIN #define sampling_rate 5.0 diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h index 97be5bf7e9..69e9871a7a 100644 --- a/openair1/SIMULATION/TOOLS/sim.h +++ b/openair1/SIMULATION/TOOLS/sim.h @@ -107,8 +107,10 @@ typedef struct { unsigned int chan_idx; /// id of the channel modeling algorithm int modelid; - /// identifies channel descriptor owner (the module which created this descriptor) + /// identifies channel descriptor owner (the module which created this descriptor channelmod_moduleid_t module_id; + /// name of this descriptor,used for model created from config file at init time + char *model_name; /// flags to properly trigger memory free unsigned int free_flags; } channel_desc_t; @@ -242,12 +244,37 @@ typedef enum { #define CONFIG_HLP_SNR "Set average SNR in dB (for --siml1 option)\n" #define CHANNELMOD_SECTION "channelmod" + +/* global channel modelization parameters */ +#define CHANNELMOD_MODELLIST_PARANAME "modellist" + +#define CHANNELMOD_HELP_MODELLIST " channel list name in config file describing the model type and its parameters\n" #define CHANNELMOD_PARAMS_DESC { \ - {"s" , CONFIG_HLP_SNR, PARAMFLAG_CMDLINE_NOPREFIXENABLED, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0},\ - {"sinr_dB", NULL, 0 , dblptr:&sinr_dB, defdblval:0 , TYPE_DOUBLE, 0},\ - {"max_chan, CONFIG_HLP_MAX_CHAN", 0, uptr:&max_chan, defintval:10, TYPE_UINT, 0},\ + {"s" , CONFIG_HLP_SNR, PARAMFLAG_CMDLINE_NOPREFIXENABLED, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0},\ + {"sinr_dB", NULL, 0, dblptr:&sinr_dB, defdblval:0 , TYPE_DOUBLE, 0},\ + {"max_chan", "Max number of runtime models", 0, uptr:&max_chan, defintval:10, TYPE_UINT, 0},\ + {CHANNELMOD_MODELLIST_PARANAME, CHANNELMOD_HELP_MODELLIST, 0, strptr:(char **)&modellist_name, defstrval:"DefaultChannelList", TYPE_STRING, 0 },\ } +/* parameters for one model */ +#define CHANNELMOD_MODEL_NAME_PNAME "model_name" +#define CHANNELMOD_MODEL_TYPE_PNAME "type" +#define CHANNELMOD_MODEL_PL_PNAME "ploss_dB" +#define CHANNELMOD_MODEL_NP_PNAME "noise_power_dB" +#define CHANNELMOD_MODEL_FF_PNAME "forgetfact" +#define CHANNELMOD_MODEL_CO_PNAME "offset" +#define CHANNELMOD_MODEL_DT_PNAME "ds_tdl" + +#define CHANNELMOD_MODEL_PARAMS_DESC { \ + {CHANNELMOD_MODEL_NAME_PNAME, "name of the model\n", 0, strptr:NULL , defstrval:"", TYPE_STRING, 0 },\ + {CHANNELMOD_MODEL_TYPE_PNAME, "name of the model type\n", 0, strptr:NULL , defstrval:"AWGN", TYPE_STRING, 0 },\ + {CHANNELMOD_MODEL_PL_PNAME, "channel path loss in dB\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ + {CHANNELMOD_MODEL_NP_PNAME, "channel noise in dB\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ + {CHANNELMOD_MODEL_FF_PNAME, "channel forget factor ((0 to 1)\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ + {CHANNELMOD_MODEL_CO_PNAME, "channel offset in samps\n", 0, iptr:NULL, defintval:0, TYPE_INT, 0 },\ + {CHANNELMOD_MODEL_DT_PNAME, "delay spread for TDL models\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 }\ +} + #include "platform_constants.h" typedef struct { @@ -276,13 +303,17 @@ typedef struct { channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, uint8_t nb_rx, SCM_t channel_model, - double sampling_rate, + double sampling_rate, double channel_bandwidth, - double TDL_DS, + double TDL_DS, double forgetting_factor, int32_t channel_offset, double path_loss_dB, - float noise_power_dB); + float noise_power_dB); + +channel_desc_t *find_channel_desc_fromname( char *modelname ); + + /** \brief free memory allocated for a model descriptor \param ch points to the model, which cannot be used after calling this fuction @@ -458,7 +489,7 @@ int modelid_fromname(char *modelname); double channelmod_get_snr_dB(void); double channelmod_get_sinr_dB(void); void init_channelmod(void) ; - +void load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) ; double N_RB2sampling_rate(uint16_t N_RB); double N_RB2channel_bandwidth(uint16_t N_RB); diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c index 6a4db361df..3d9b000331 100644 --- a/targets/ARCH/rfsimulator/simulator.c +++ b/targets/ARCH/rfsimulator/simulator.c @@ -69,7 +69,9 @@ extern RAN_CONTEXT_t RC; #define RFSIMU_SECTION "rfsimulator" #define RFSIMU_OPTIONS_PARAMNAME "options" -# define RFSIM_CONFIG_HELP_OPTIONS " list of comma separated options to enable rf simulator functionalities. Available options: \n"\ + + +#define RFSIM_CONFIG_HELP_OPTIONS " list of comma separated options to enable rf simulator functionalities. Available options: \n"\ " chanmod: enable channel modelisation\n"\ " saviq: enable saving written iqs to a file\n" /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -78,14 +80,14 @@ extern RAN_CONTEXT_t RC; /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define simOpt PARAMFLAG_NOFREE|PARAMFLAG_CMDLINE_NOPREFIXENABLED #define RFSIMULATOR_PARAMS_DESC { \ - {"serveraddr", "\n", simOpt , strptr:&(rfsimulator->ip), defstrval:"127.0.0.1", TYPE_STRING, 0 },\ - {"serverport", "\n", simOpt, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\ - {RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0 },\ - {"IQfile", "\n",simOpt, strptr:&(saveF), defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\ - {"modelname", "\n", simOpt, strptr:&(modelname), defstrval:"AWGN", TYPE_STRING, 0 },\ - {"ploss", "\n", simOpt, dblptr:&(rfsimulator->chan_pathloss), defdblval:0, TYPE_DOUBLE, 0 },\ - {"forgetfact", "\n", simOpt, dblptr:&(rfsimulator->chan_forgetfact), defdblval:0, TYPE_DOUBLE, 0 },\ - {"offset", "\n", simOpt, iptr:&(rfsimulator->chan_offset), defintval:0, TYPE_INT, 0 }\ + {"serveraddr", "\n", simOpt, strptr:&(rfsimulator->ip), defstrval:"127.0.0.1", TYPE_STRING, 0 },\ + {"serverport", "\n", simOpt, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\ + {RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0 },\ + {"IQfile", "\n",simOpt, strptr:&(saveF), defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\ + {"modelname", "\n", simOpt, strptr:&(modelname), defstrval:"AWGN", TYPE_STRING, 0 },\ + {"ploss", "\n", simOpt, dblptr:&(rfsimulator->chan_pathloss), defdblval:0, TYPE_DOUBLE, 0 },\ + {"forgetfact", "\n", simOpt, dblptr:&(rfsimulator->chan_forgetfact), defdblval:0, TYPE_DOUBLE, 0 },\ + {"offset", "\n", simOpt, iptr:&(rfsimulator->chan_offset), defintval:0, TYPE_INT, 0 }\ }; @@ -183,16 +185,8 @@ static void allocCirBuf(rfsimulator_state_t *bridge, int sock) { tableNor(rand); init_done=true; } - - ptr->channel_model=new_channel_desc_scm(bridge->tx_num_channels,bridge->rx_num_channels, - bridge->channelmod, - bridge->sample_rate, - bridge->tx_bw, - 30e-9, // TDL delay-spread parameter - bridge->chan_forgetfact, // forgetting_factor - bridge->chan_offset, // maybe used for TA - bridge->chan_pathloss, - bridge->noise_power_dB); // path_loss in dB + char *modelname = (bridge->typeStamp == ENB_MAGICDL) ? "rfsimu_channel_ue0":"rfsimu_channel_enB0"; + ptr->channel_model=find_channel_desc_fromname(modelname); // path_loss in dB set_channeldesc_owner(ptr->channel_model, RFSIMU_MODULEID); random_channel(ptr->channel_model,false); } @@ -301,6 +295,7 @@ static void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) { break; } else if (strcmp(rfsimu_params[p].strlistptr[i],"chanmod") == 0) { init_channelmod(); + load_channellist(rfsimulator->tx_num_channels, rfsimulator->rx_num_channels, rfsimulator->sample_rate, rfsimulator->tx_bw); rfsimulator->channelmod=modelid_fromname(modelname); } else { fprintf(stderr,"Unknown rfsimulator option: %s\n",rfsimu_params[p].strlistptr[i]); @@ -778,6 +773,11 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { // to change the log level, use this on command line // --log_config.hw_log_level debug rfsimulator_state_t *rfsimulator = (rfsimulator_state_t *)calloc(sizeof(rfsimulator_state_t),1); + // initialize channel simulation + rfsimulator->tx_num_channels=openair0_cfg->tx_num_channels; + rfsimulator->rx_num_channels=openair0_cfg->rx_num_channels; + rfsimulator->sample_rate=openair0_cfg->sample_rate; + rfsimulator->tx_bw=openair0_cfg->tx_bw; rfsimulator_readconfig(rfsimulator); pthread_mutex_init(&Sockmutex, NULL); LOG_I(HW,"rfsimulator: running as %s\n", rfsimulator-> typeStamp == ENB_MAGICDL ? "server waiting opposite rfsimulators to connect" : "client: will connect to a rfsimulator server side"); @@ -802,11 +802,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { rfsimulator->buf[i].conn_sock=-1; AssertFatal((rfsimulator->epollfd = epoll_create1(0)) != -1,""); - // initialize channel simulation - rfsimulator->tx_num_channels=openair0_cfg->tx_num_channels; - rfsimulator->rx_num_channels=openair0_cfg->rx_num_channels; - rfsimulator->sample_rate=openair0_cfg->sample_rate; - rfsimulator->tx_bw=openair0_cfg->tx_bw; + //randominit(0); set_taus_seed(0); /* look for telnet server, if it is loaded, add the channel modeling commands to it */ From e5ee51964b876b702a527ec643e57041d420be72 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 9 Mar 2021 15:00:06 +0000 Subject: [PATCH 041/125] Add temporary LOGs for Msg2 --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 25 ++++++++++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 40 +++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 5380de2ba4..312a9215d1 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2362,8 +2362,26 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t rnti = mac->crnti; } - #ifdef DEBUG_RAR - LOG_D(MAC, "In %s:[%d.%d]: [UE %d] Received RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d csi_req %d t_crnti %x \n", + // FIXME: To be removed + LOG_I(NR_MAC, "rarh->E = 0x%x\n", rarh->E); + LOG_I(NR_MAC, "rarh->T = 0x%x\n", rarh->T); + LOG_I(NR_MAC, "rarh->RAPID = 0x%x (%i)\n", rarh->RAPID, rarh->RAPID); + + LOG_I(NR_MAC, "rar->R = 0x%x\n", rar->R); + LOG_I(NR_MAC, "rar->TA1 = 0x%x\n", rar->TA1); + + LOG_I(NR_MAC, "rar->TA2 = 0x%x\n", rar->TA2); + LOG_I(NR_MAC, "rar->UL_GRANT_1 = 0x%x\n", rar->UL_GRANT_1); + + LOG_I(NR_MAC, "rar->UL_GRANT_2 = 0x%x\n", rar->UL_GRANT_2); + LOG_I(NR_MAC, "rar->UL_GRANT_3 = 0x%x\n", rar->UL_GRANT_3); + LOG_I(NR_MAC, "rar->UL_GRANT_4 = 0x%x\n", rar->UL_GRANT_4); + + LOG_I(NR_MAC, "rar->TCRNTI_1 = 0x%x\n", rar->TCRNTI_1); + LOG_I(NR_MAC, "rar->TCRNTI_2 = 0x%x\n", rar->TCRNTI_2); + + //#ifdef DEBUG_RAR + LOG_I(NR_MAC, "In %s:[%d.%d]: [UE %d] Received RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d t_crnti %x \n", __FUNCTION__, frame, slot, @@ -2374,9 +2392,8 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t rar_grant.mcs, rar_grant.freq_hopping, tpc_command, - csi_req, ra->t_crnti); - #endif + //#endif // Schedule Msg3 ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, rar_grant.Msg3_t_alloc); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 3a27f92a34..a9e20c7c9a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1427,4 +1427,44 @@ void nr_fill_rar(uint8_t Mod_idP, rar->UL_GRANT_3 = (uint8_t) (ul_grant >> 8) & 0xff; rar->UL_GRANT_4 = (uint8_t) ul_grant & 0xff; + // FIXME: To be removed + LOG_I(NR_MAC, "rarh->E = 0x%x\n", rarh->E); + LOG_I(NR_MAC, "rarh->T = 0x%x\n", rarh->T); + LOG_I(NR_MAC, "rarh->RAPID = 0x%x (%i)\n", rarh->RAPID, rarh->RAPID); + + LOG_I(NR_MAC, "rar->R = 0x%x\n", rar->R); + LOG_I(NR_MAC, "rar->TA1 = 0x%x\n", rar->TA1); + + LOG_I(NR_MAC, "rar->TA2 = 0x%x\n", rar->TA2); + LOG_I(NR_MAC, "rar->UL_GRANT_1 = 0x%x\n", rar->UL_GRANT_1); + + LOG_I(NR_MAC, "rar->UL_GRANT_2 = 0x%x\n", rar->UL_GRANT_2); + LOG_I(NR_MAC, "rar->UL_GRANT_3 = 0x%x\n", rar->UL_GRANT_3); + LOG_I(NR_MAC, "rar->UL_GRANT_4 = 0x%x\n", rar->UL_GRANT_4); + + LOG_I(NR_MAC, "rar->TCRNTI_1 = 0x%x\n", rar->TCRNTI_1); + LOG_I(NR_MAC, "rar->TCRNTI_2 = 0x%x\n", rar->TCRNTI_2); + + int mcs = (unsigned char) (rar->UL_GRANT_4 >> 4); + // time alloc + int Msg3_t_alloc = (unsigned char) (rar->UL_GRANT_3 & 0x07); + // frequency alloc + int Msg3_f_alloc = (uint16_t) ((rar->UL_GRANT_3 >> 4) | (rar->UL_GRANT_2 << 4) | ((rar->UL_GRANT_1 & 0x03) << 12)); + // frequency hopping + int freq_hopping = (unsigned char) (rar->UL_GRANT_1 >> 2); + // TA command + int ta_command = rar->TA2 + (rar->TA1 << 5); + // TC-RNTI + int t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8); + + LOG_I(NR_MAC, "In %s: Transmitted RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d csi_req %d t_crnti %x \n", + __FUNCTION__, + Msg3_t_alloc, + Msg3_f_alloc, + ta_command, + mcs, + freq_hopping, + tpc_command, + csi_req, + t_crnti); } From 7be1952c82cff254eee82a3fafd9792dfc32ebcd Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 9 Mar 2021 16:29:04 +0000 Subject: [PATCH 042/125] Add back-off indicator subheader to Msg2 --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 17 ++++++++----- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 24 +++++++++++++++---- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 312a9215d1..460f148b14 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2266,27 +2266,32 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 1); // RAR subPDU pointer uint8_t preamble_index = get_ra_PreambleIndex(mod_id, cc_id, gNB_id); //prach_resources->ra_PreambleIndex; - LOG_D(MAC, "In %s:[%d.%d]: [UE %d][RAPROC] invoking MAC for received RAR (current preamble %d)\n", __FUNCTION__, frame, slot, mod_id, preamble_index); + LOG_D(NR_MAC, "In %s:[%d.%d]: [UE %d][RAPROC] invoking MAC for received RAR (current preamble %d)\n", __FUNCTION__, frame, slot, mod_id, preamble_index); while (1) { n_subheaders++; if (rarh->T == 1) { n_subPDUs++; - LOG_D(MAC, "[UE %d][RAPROC] Got RAPID RAR subPDU\n", mod_id); + LOG_I(NR_MAC, "[UE %d][RAPROC] Got RAPID RAR subPDU\n", mod_id); } else { - n_subPDUs++; ra->RA_backoff_indicator = table_7_2_1[((NR_RA_HEADER_BI *)rarh)->BI]; ra->RA_BI_found = 1; - LOG_D(MAC, "[UE %d][RAPROC] Got BI RAR subPDU %d\n", mod_id, ra->RA_backoff_indicator); + LOG_I(NR_MAC, "[UE %d][RAPROC] Got BI RAR subPDU %d ms\n", mod_id, ra->RA_backoff_indicator); + if ( ((NR_RA_HEADER_BI *)rarh)->E == 1) { + rarh += sizeof(NR_RA_HEADER_BI); + continue; + } else { + break; + } } if (rarh->RAPID == preamble_index) { - LOG_I(MAC, "[UE %d][RAPROC][%d.%d] Found RAR with the intended RAPID %d\n", mod_id, frame, slot, rarh->RAPID); + LOG_I(NR_MAC, "[UE %d][RAPROC][%d.%d] Found RAR with the intended RAPID %d\n", mod_id, frame, slot, rarh->RAPID); rar = (NR_MAC_RAR *) (dlsch_buffer + n_subheaders + (n_subPDUs - 1) * sizeof(NR_MAC_RAR)); ra->RA_RAPID_found = 1; break; } if (rarh->E == 0) { - LOG_W(PHY,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match the intended RAPID...\n", mod_id, preamble_index); + LOG_W(NR_MAC,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match the intended RAPID (%d)\n", mod_id, rarh->RAPID, preamble_index); break; } else { rarh += sizeof(NR_MAC_RAR) + 1; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index a9e20c7c9a..b7614034de 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -835,7 +835,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra uint8_t time_domain_assignment = 3; uint8_t mcsIndex = 0; int rbStart = 0; - int rbSize = 6; + int rbSize = 8; if (nr_mac->sched_ctrlCommon == NULL){ nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); @@ -1043,7 +1043,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra tx_req->PDU_length = pdsch_pdu_rel15->TBSize[0]; tx_req->PDU_index = pduindex; tx_req->num_TLV = 1; - tx_req->TLVs[0].length = 8; + tx_req->TLVs[0].length = tx_req->PDU_length + 2; nr_mac->TX_req[CC_id].SFN = frameP; nr_mac->TX_req[CC_id].Number_of_PDUs++; nr_mac->TX_req[CC_id].Slot = slotP; @@ -1371,8 +1371,9 @@ void nr_fill_rar(uint8_t Mod_idP, nfapi_nr_pusch_pdu_t *pusch_pdu){ LOG_I(MAC, "[gNB] Generate RAR MAC PDU frame %d slot %d preamble index %u TA command %d \n", ra->Msg2_frame, ra-> Msg2_slot, ra->preamble_index, ra->timing_offset); - NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) dlsch_buffer; - NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 1); + NR_RA_HEADER_BI *rarbi = (NR_RA_HEADER_BI *) dlsch_buffer; + NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) (dlsch_buffer + 1); + NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 2); unsigned char csi_req = 0, tpc_command; //uint8_t N_UL_Hop; uint8_t valid_bits; @@ -1381,6 +1382,16 @@ void nr_fill_rar(uint8_t Mod_idP, tpc_command = 3; // this is 0 dB + /// E/T/R/R/BI subheader /// + // E = 1, MAC PDU includes another MAC sub-PDU (RAPID) + // T = 0, Back-off indicator subheader + // R = 2, Reserved + // BI = 0, 5ms + rarbi->E = 1; + rarbi->T = 0; + rarbi->R = 0; + rarbi->BI = 0; + /// E/T/RAPID subheader /// // E = 0, one only RAR, first and last // T = 1, RAPID @@ -1428,6 +1439,11 @@ void nr_fill_rar(uint8_t Mod_idP, rar->UL_GRANT_4 = (uint8_t) ul_grant & 0xff; // FIXME: To be removed + //LOG_I(NR_MAC, "rarbi->E = 0x%x\n", rarbi->E); + //LOG_I(NR_MAC, "rarbi->T = 0x%x\n", rarbi->T); + //LOG_I(NR_MAC, "rarbi->R = 0x%x\n", rarbi->R); + //LOG_I(NR_MAC, "rarbi->BI = 0x%x\n", rarbi->BI); + LOG_I(NR_MAC, "rarh->E = 0x%x\n", rarh->E); LOG_I(NR_MAC, "rarh->T = 0x%x\n", rarh->T); LOG_I(NR_MAC, "rarh->RAPID = 0x%x (%i)\n", rarh->RAPID, rarh->RAPID); From 1f0e82664f180c1b3cfaf42cacf901b30e401e27 Mon Sep 17 00:00:00 2001 From: frtabu Date: Tue, 9 Mar 2021 01:19:39 +0100 Subject: [PATCH 043/125] enhance channel model configuration --- ci-scripts/conf_files/channelmod_rfsimu.conf | 48 ++++++++++ common/config/config_cmdline.c | 2 +- common/utils/telnetsrv/telnetsrv.c | 2 +- openair1/SIMULATION/TOOLS/random_channel.c | 99 ++++++++++++++++---- openair1/SIMULATION/TOOLS/sim.h | 55 +++++++++-- targets/ARCH/rfsimulator/simulator.c | 86 +++++++++-------- 6 files changed, 226 insertions(+), 66 deletions(-) create mode 100644 ci-scripts/conf_files/channelmod_rfsimu.conf diff --git a/ci-scripts/conf_files/channelmod_rfsimu.conf b/ci-scripts/conf_files/channelmod_rfsimu.conf new file mode 100644 index 0000000000..c7abffa878 --- /dev/null +++ b/ci-scripts/conf_files/channelmod_rfsimu.conf @@ -0,0 +1,48 @@ +/* configuration for channel modelisation */ +/* To be included in main config file when */ +/* channel modelisation is used (rfsimulator with chanmod options enabled) */ +channelmod = { + max_chan=10; + modellist="modellist_rfsimu_1"; + modellist_rfsimu_1 = ( + { + model_name = "rfsimu_channel_ue0" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + }, + { + model_name = "rfsimu_channel_ue0" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + }, + ); + modellist_rfsimu_2 = ( + { + model_name = "rfsimu_channel_ue0" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + }, + { + model_name = "rfsimu_channel_ue0" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + }, + ); +}; + diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c index 6d01d98c65..1df1bc16f7 100644 --- a/common/config/config_cmdline.c +++ b/common/config/config_cmdline.c @@ -255,7 +255,7 @@ int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix) if ( ((strlen(oneargv) == 2) && (strcmp(oneargv + 1,cfgpath) == 0)) || /* short option, one "-" */ ((strlen(oneargv) > 2) && (strcmp(oneargv + 2,cfgpath ) == 0 )) || /* long option beginning with "--" */ ((strlen(oneargv) == 2) && (strcmp(oneargv + 1,cfgoptions[n].optname) == 0) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) || - ((strlen(oneargv) > 2) && (strcmp(oneargv + 2,cfgpath ) == 0 ) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) ) { + ((strlen(oneargv) > 2) && (strcmp(oneargv + 2, cfgoptions[n].optname) == 0 ) && (cfgoptions[n].paramflags & PARAMFLAG_CMDLINE_NOPREFIXENABLED )) ) { char *valptr=NULL; int ret; config_get_if()->argv_info[i] |= CONFIG_CMDLINEOPT_PROCESSED; diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c index 03f7af99bc..5a1fefbf3d 100644 --- a/common/utils/telnetsrv/telnetsrv.c +++ b/common/utils/telnetsrv/telnetsrv.c @@ -495,7 +495,7 @@ int process_command(char *buf) { memset(cmdb,0,sizeof(cmdb)); bufbck=strdup(buf); rt=CMDSTATUS_NOTFOUND; - j = sscanf(buf,"%19s %19s %19[^\t\n]",modulename,cmd,cmdb); + j = sscanf(buf,"%19s %19s %[^\t\n]",modulename,cmd,cmdb); if (telnetparams.telnetdbg > 0) printf("process_command: %i words, module=%s cmd=%s, parameters= %s\n",j,modulename,cmd,cmdb); diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 6ce3d27ec1..a6877cd9e1 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -61,7 +61,9 @@ static telnetshell_vardef_t channelmod_vardef[] = { static double snr_dB=25; static double sinr_dB=0; static unsigned int max_chan; -static channel_desc_t** defined_channels; +static channel_desc_t **defined_channels; +static char modellist_name[MAX_OPTNAME_SIZE]=""; + void fill_channel_desc(channel_desc_t *chan_desc, uint8_t nb_tx, uint8_t nb_rx, @@ -494,16 +496,17 @@ struct complex *R_sqrt_22_EPA_medium[1] = {R_sqrt_22_EPA_medium_tap}; //Rayleigh1_orth_eff_ch_TM4 + channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, uint8_t nb_rx, SCM_t channel_model, double sampling_rate, double channel_bandwidth, - double DS_TDL, + double DS_TDL, double forgetting_factor, int32_t channel_offset, double path_loss_dB, - float noise_power_dB) { + float noise_power_dB) { channel_desc_t *chan_desc = (channel_desc_t *)calloc(1,sizeof(channel_desc_t)); for(int i=0; inb_paths = 10; return(chan_desc); -} - +} /* channel_desc_t *new_channel_desc_scm */ + +channel_desc_t * find_channel_desc_fromname( char *modelname ) { + for(int i=0; imodel_name,modelname) == 0) + return defined_channels[i]; + } + } + LOG_E(OCM,"Model %s not found \n", modelname); + return NULL; +} /* channel_desc_t * new_channel_desc_fromconfig */ + + + void free_channel_desc_scm(channel_desc_t *ch) { // Must be made cleanly, a lot of leaks... defined_channels[ch->chan_idx]=NULL; @@ -1657,7 +1675,8 @@ void free_channel_desc_scm(channel_desc_t *ch) { free(ch->R_sqrt); free(ch->ch); free(ch->chF); - free(ch->a); + free(ch->a); + free(ch->model_name); free(ch); } @@ -1665,6 +1684,12 @@ void set_channeldesc_owner(channel_desc_t *cdesc, uint32_t module_id) { cdesc->module_id=module_id; } +void set_channeldesc_name(channel_desc_t *cdesc,char *modelname) { + if(cdesc->model_name != NULL) + free(cdesc->model_name); + cdesc->model_name=strdup(modelname); +} + int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) { double s; int i,k,l,aarx,aatx; @@ -1851,7 +1876,7 @@ double N_RB2channel_bandwidth(uint16_t N_RB) { break; default: - LOG_E(PHY,"Unknown N_PRB\n"); + LOG_E(OCM,"Unknown N_PRB\n"); return(-1); } return(channel_bandwidth); @@ -1871,9 +1896,7 @@ static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) { char *module_id_str[]=MODULEID_STR_INIT; - if (cd->module_id != 0) { - prnt("model owner: %s\n",module_id_str[cd->module_id]); - } + prnt("model owner: %s\n",(cd->module_id != 0)?module_id_str[cd->module_id]:"not set"); prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate); prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n", cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No")); @@ -1899,7 +1922,8 @@ static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt) { } else if ( strcmp(subcmd,"current") == 0) { for (int i=0; i < max_chan ; i++) { if (defined_channels[i] != NULL) { - prnt("model %i %s: \n----------------\n", i, map_int_to_str(channelmod_names,defined_channels[i]->modelid)); + prnt("model %i %s type %s: \n----------------\n", i, (defined_channels[i]->model_name !=NULL)?defined_channels[i]->model_name:"(no name set)", + map_int_to_str(channelmod_names,defined_channels[i]->modelid)); display_channelmodel(defined_channels[i],debug,prnt); } } @@ -1972,10 +1996,10 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt) return CMDSTATUS_FOUND; } -int modelid_fromname(char *modelname) { - int modelid=map_str_to_int(channelmod_names,modelname); +int modelid_fromstrtype(char *modeltype) { + int modelid=map_str_to_int(channelmod_names,modeltype); if (modelid < 0) - LOG_E(OCM,"random_channel.c: Error channel model %s unknown\n",modelname); + LOG_E(OCM,"random_channel.c: Error channel model %s unknown\n",modeltype); return modelid; } @@ -1989,18 +2013,59 @@ double channelmod_get_sinr_dB(void) { void init_channelmod(void) { paramdef_t channelmod_params[] = CHANNELMOD_PARAMS_DESC; - int ret = config_get( channelmod_params,sizeof(channelmod_params)/sizeof(paramdef_t),CHANNELMOD_SECTION); + + int numparams=sizeof(channelmod_params)/sizeof(paramdef_t); + int ret = config_get( channelmod_params,numparams,CHANNELMOD_SECTION); AssertFatal(ret >= 0, "configuration couldn't be performed"); defined_channels=calloc(max_chan,sizeof( channel_desc_t*)); AssertFatal(defined_channels!=NULL, "couldn't allocate %u channel descriptors\n",max_chan); - + /* look for telnet server, if it is loaded, add the channel modeling commands to it */ add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME); if (addcmd != NULL) { addcmd("channelmod",channelmod_vardef,channelmod_cmdarray); } -} +} /* init_channelmod */ + +int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) { + paramdef_t achannel_params[] = CHANNELMOD_MODEL_PARAMS_DESC; + paramlist_def_t channel_list; + memset(&channel_list,0,sizeof(paramlist_def_t)); + strncpy(channel_list.listname,modellist_name,MAX_OPTNAME_SIZE-1); + + int numparams = sizeof(achannel_params)/sizeof(paramdef_t); + config_getlist( &channel_list,achannel_params,numparams, CHANNELMOD_SECTION); + AssertFatal(channel_list.numelt>0, "List %s.%s not found in config file\n",CHANNELMOD_SECTION,channel_list.listname); + int pindex_NAME = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_NAME_PNAME); + int pindex_DT = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_DT_PNAME ); + int pindex_FF = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_FF_PNAME ); + int pindex_CO = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_CO_PNAME ); + int pindex_PL = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_PL_PNAME ); + int pindex_NP = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_NP_PNAME ); + int pindex_TYPE = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_TYPE_PNAME); + + for (int i=0; imodel_name = strdup(*(channel_list.paramarray[i][pindex_NAME].strptr)); + LOG_I(OCM,"Model %s type %s allocated from config file, list %s\n",*(channel_list.paramarray[i][pindex_NAME].strptr), + *(channel_list.paramarray[i][pindex_TYPE].strptr), modellist_name); + } /* for loop on channel_list */ + return channel_list.numelt; +} /* load_channelist */ #ifdef RANDOM_CHANNEL_MAIN #define sampling_rate 5.0 diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h index 97be5bf7e9..0b154dbcc4 100644 --- a/openair1/SIMULATION/TOOLS/sim.h +++ b/openair1/SIMULATION/TOOLS/sim.h @@ -107,8 +107,10 @@ typedef struct { unsigned int chan_idx; /// id of the channel modeling algorithm int modelid; - /// identifies channel descriptor owner (the module which created this descriptor) + /// identifies channel descriptor owner (the module which created this descriptor channelmod_moduleid_t module_id; + /// name of this descriptor,used for model created from config file at init time + char *model_name; /// flags to properly trigger memory free unsigned int free_flags; } channel_desc_t; @@ -242,12 +244,37 @@ typedef enum { #define CONFIG_HLP_SNR "Set average SNR in dB (for --siml1 option)\n" #define CHANNELMOD_SECTION "channelmod" + +/* global channel modelization parameters */ +#define CHANNELMOD_MODELLIST_PARANAME "modellist" + +#define CHANNELMOD_HELP_MODELLIST " channel list name in config file describing the model type and its parameters\n" #define CHANNELMOD_PARAMS_DESC { \ - {"s" , CONFIG_HLP_SNR, PARAMFLAG_CMDLINE_NOPREFIXENABLED, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0},\ - {"sinr_dB", NULL, 0 , dblptr:&sinr_dB, defdblval:0 , TYPE_DOUBLE, 0},\ - {"max_chan, CONFIG_HLP_MAX_CHAN", 0, uptr:&max_chan, defintval:10, TYPE_UINT, 0},\ + {"s" , CONFIG_HLP_SNR, PARAMFLAG_CMDLINE_NOPREFIXENABLED, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0},\ + {"sinr_dB", NULL, 0, dblptr:&sinr_dB, defdblval:0 , TYPE_DOUBLE, 0},\ + {"max_chan", "Max number of runtime models", 0, uptr:&max_chan, defintval:10, TYPE_UINT, 0},\ + {CHANNELMOD_MODELLIST_PARANAME, CHANNELMOD_HELP_MODELLIST, 0, strptr:(char **)&modellist_name, defstrval:"DefaultChannelList", TYPE_STRING, 60 },\ } +/* parameters for one model */ +#define CHANNELMOD_MODEL_NAME_PNAME "model_name" +#define CHANNELMOD_MODEL_TYPE_PNAME "type" +#define CHANNELMOD_MODEL_PL_PNAME "ploss_dB" +#define CHANNELMOD_MODEL_NP_PNAME "noise_power_dB" +#define CHANNELMOD_MODEL_FF_PNAME "forgetfact" +#define CHANNELMOD_MODEL_CO_PNAME "offset" +#define CHANNELMOD_MODEL_DT_PNAME "ds_tdl" + +#define CHANNELMOD_MODEL_PARAMS_DESC { \ + {CHANNELMOD_MODEL_NAME_PNAME, "name of the model\n", 0, strptr:NULL , defstrval:"", TYPE_STRING, 0 },\ + {CHANNELMOD_MODEL_TYPE_PNAME, "name of the model type\n", 0, strptr:NULL , defstrval:"AWGN", TYPE_STRING, 0 },\ + {CHANNELMOD_MODEL_PL_PNAME, "channel path loss in dB\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ + {CHANNELMOD_MODEL_NP_PNAME, "channel noise in dB\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ + {CHANNELMOD_MODEL_FF_PNAME, "channel forget factor ((0 to 1)\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ + {CHANNELMOD_MODEL_CO_PNAME, "channel offset in samps\n", 0, iptr:NULL, defintval:0, TYPE_INT, 0 },\ + {CHANNELMOD_MODEL_DT_PNAME, "delay spread for TDL models\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 }\ +} + #include "platform_constants.h" typedef struct { @@ -276,13 +303,17 @@ typedef struct { channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, uint8_t nb_rx, SCM_t channel_model, - double sampling_rate, + double sampling_rate, double channel_bandwidth, - double TDL_DS, + double TDL_DS, double forgetting_factor, int32_t channel_offset, double path_loss_dB, - float noise_power_dB); + float noise_power_dB); + +channel_desc_t *find_channel_desc_fromname( char *modelname ); + + /** \brief free memory allocated for a model descriptor \param ch points to the model, which cannot be used after calling this fuction @@ -295,6 +326,12 @@ void free_channel_desc_scm(channel_desc_t *ch); \param module_id identifies the channel model. should be define as a macro in simu.h */ void set_channeldesc_owner(channel_desc_t *cdesc, channelmod_moduleid_t module_id); +/** +\brief This function set a model name to a model descriptor, can be later used to identify a allocated channel model +\param cdesc points to the model descriptor +\param module_name is the C string to use as model name for the channel pointed by cdesc +*/ +void set_channeldesc_name(channel_desc_t *cdesc,char *modelname); /** \fn void random_channel(channel_desc_t *desc) \brief This routine generates a random channel response (time domain) according to a tapped delay line model. \param desc Pointer to the channel descriptor @@ -454,11 +491,11 @@ void multipath_tv_channel(channel_desc_t *desc, /**@} */ /**@} */ -int modelid_fromname(char *modelname); +int modelid_fromstrtype(char *modeltype); double channelmod_get_snr_dB(void); double channelmod_get_sinr_dB(void); void init_channelmod(void) ; - +int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) ; double N_RB2sampling_rate(uint16_t N_RB); double N_RB2channel_bandwidth(uint16_t N_RB); diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c index 6a4db361df..26b81728cb 100644 --- a/targets/ARCH/rfsimulator/simulator.c +++ b/targets/ARCH/rfsimulator/simulator.c @@ -69,7 +69,9 @@ extern RAN_CONTEXT_t RC; #define RFSIMU_SECTION "rfsimulator" #define RFSIMU_OPTIONS_PARAMNAME "options" -# define RFSIM_CONFIG_HELP_OPTIONS " list of comma separated options to enable rf simulator functionalities. Available options: \n"\ + + +#define RFSIM_CONFIG_HELP_OPTIONS " list of comma separated options to enable rf simulator functionalities. Available options: \n"\ " chanmod: enable channel modelisation\n"\ " saviq: enable saving written iqs to a file\n" /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -78,21 +80,21 @@ extern RAN_CONTEXT_t RC; /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define simOpt PARAMFLAG_NOFREE|PARAMFLAG_CMDLINE_NOPREFIXENABLED #define RFSIMULATOR_PARAMS_DESC { \ - {"serveraddr", "\n", simOpt , strptr:&(rfsimulator->ip), defstrval:"127.0.0.1", TYPE_STRING, 0 },\ - {"serverport", "\n", simOpt, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\ - {RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0 },\ - {"IQfile", "\n",simOpt, strptr:&(saveF), defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\ - {"modelname", "\n", simOpt, strptr:&(modelname), defstrval:"AWGN", TYPE_STRING, 0 },\ - {"ploss", "\n", simOpt, dblptr:&(rfsimulator->chan_pathloss), defdblval:0, TYPE_DOUBLE, 0 },\ - {"forgetfact", "\n", simOpt, dblptr:&(rfsimulator->chan_forgetfact), defdblval:0, TYPE_DOUBLE, 0 },\ - {"offset", "\n", simOpt, iptr:&(rfsimulator->chan_offset), defintval:0, TYPE_INT, 0 }\ + {"serveraddr", "\n", simOpt, strptr:&(rfsimulator->ip), defstrval:"127.0.0.1", TYPE_STRING, 0 },\ + {"serverport", "\n", simOpt, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\ + {RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0 },\ + {"IQfile", "\n",simOpt, strptr:&(saveF), defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\ + {"modelname", "\n", simOpt, strptr:&(modelname), defstrval:"AWGN", TYPE_STRING, 0 },\ + {"ploss", "\n", simOpt, dblptr:&(rfsimulator->chan_pathloss), defdblval:0, TYPE_DOUBLE, 0 },\ + {"forgetfact", "\n", simOpt, dblptr:&(rfsimulator->chan_forgetfact), defdblval:0, TYPE_DOUBLE, 0 },\ + {"offset", "\n", simOpt, iptr:&(rfsimulator->chan_offset), defintval:0, TYPE_INT, 0 }\ }; static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg); static telnetshell_cmddef_t rfsimu_cmdarray[] = { - {"setmodel","",(cmdfunc_t)rfsimu_setchanmod_cmd,TELNETSRV_CMDFLAG_PUSHINTPOOLQ}, + {"setmodel"," ",(cmdfunc_t)rfsimu_setchanmod_cmd,TELNETSRV_CMDFLAG_PUSHINTPOOLQ}, {"","",NULL}, }; @@ -183,16 +185,9 @@ static void allocCirBuf(rfsimulator_state_t *bridge, int sock) { tableNor(rand); init_done=true; } - - ptr->channel_model=new_channel_desc_scm(bridge->tx_num_channels,bridge->rx_num_channels, - bridge->channelmod, - bridge->sample_rate, - bridge->tx_bw, - 30e-9, // TDL delay-spread parameter - bridge->chan_forgetfact, // forgetting_factor - bridge->chan_offset, // maybe used for TA - bridge->chan_pathloss, - bridge->noise_power_dB); // path_loss in dB + char *modelname = (bridge->typeStamp == ENB_MAGICDL) ? "rfsimu_channel_ue0":"rfsimu_channel_enB0"; + ptr->channel_model=find_channel_desc_fromname(modelname); // path_loss in dB + AssertFatal((ptr->channel_model!= NULL),"Channel model %s not found, check config file\n",modelname); set_channeldesc_owner(ptr->channel_model, RFSIMU_MODULEID); random_channel(ptr->channel_model,false); } @@ -301,7 +296,8 @@ static void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) { break; } else if (strcmp(rfsimu_params[p].strlistptr[i],"chanmod") == 0) { init_channelmod(); - rfsimulator->channelmod=modelid_fromname(modelname); + load_channellist(rfsimulator->tx_num_channels, rfsimulator->rx_num_channels, rfsimulator->sample_rate, rfsimulator->tx_bw); + rfsimulator->channelmod=true; } else { fprintf(stderr,"Unknown rfsimulator option: %s\n",rfsimu_params[p].strlistptr[i]); exit(-1); @@ -322,20 +318,27 @@ static void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) { static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg) { char *modelname=NULL; - int s = sscanf(buff,"%ms\n",&modelname); + char *modeltype=NULL; + if (debug) + prnt("rfsimu_setchanmod_cmd buffer \"%s\"\n",buff); + int s = sscanf(buff,"%m[^ ] %ms\n",&modelname, &modeltype); - if (s == 1) { - int channelmod=modelid_fromname(modelname); + if (s == 2) { + int channelmod=modelid_fromstrtype(modeltype); if (channelmod<0) - prnt("ERROR: model %s unknown\n",modelname); + prnt("ERROR: model type %s unknown\n",modeltype); else { rfsimulator_state_t *t = (rfsimulator_state_t *)arg; - + int found=0; for (int i=0; ibuf[i]; + if ( b->channel_model==NULL) + continue; + if (b->channel_model->model_name==NULL) + continue; + if (b->conn_sock >= 0 && (strcmp(b->channel_model->model_name,modelname)==0)) { - if (b->conn_sock >= 0 ) { channel_desc_t *newmodel=new_channel_desc_scm(t->tx_num_channels,t->rx_num_channels, channelmod, t->sample_rate, @@ -343,23 +346,29 @@ static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, 30e-9, // TDL delay-spread parameter t->chan_forgetfact, // forgetting_factor t->chan_offset, // maybe used for TA - t->chan_pathloss, - t->noise_power_dB - ); // path_loss in dB + t->chan_pathloss, + t->noise_power_dB + ); // path_loss in dB set_channeldesc_owner(newmodel, RFSIMU_MODULEID); + set_channeldesc_name(newmodel,modelname); random_channel(newmodel,false); channel_desc_t *oldmodel=b->channel_model; b->channel_model=newmodel; free_channel_desc_scm(oldmodel); - prnt("New model %s applied to channel connected to sock %d\n",modelname,i); + prnt("New model type %s applied to channel %s connected to sock %d\n",modeltype,modelname,i); + found=1; + break; } - } + } /* for */ + if (found==0) + prnt("Channel %s not found or not currently used\n",modelname); } } else { - prnt("ERROR: no model specified\n"); + prnt("ERROR: 2 parameters required: model name and model type (%i found)\n",s); } free(modelname); + free(modeltype); return CMDSTATUS_FOUND; } @@ -778,6 +787,11 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { // to change the log level, use this on command line // --log_config.hw_log_level debug rfsimulator_state_t *rfsimulator = (rfsimulator_state_t *)calloc(sizeof(rfsimulator_state_t),1); + // initialize channel simulation + rfsimulator->tx_num_channels=openair0_cfg->tx_num_channels; + rfsimulator->rx_num_channels=openair0_cfg->rx_num_channels; + rfsimulator->sample_rate=openair0_cfg->sample_rate; + rfsimulator->tx_bw=openair0_cfg->tx_bw; rfsimulator_readconfig(rfsimulator); pthread_mutex_init(&Sockmutex, NULL); LOG_I(HW,"rfsimulator: running as %s\n", rfsimulator-> typeStamp == ENB_MAGICDL ? "server waiting opposite rfsimulators to connect" : "client: will connect to a rfsimulator server side"); @@ -802,11 +816,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { rfsimulator->buf[i].conn_sock=-1; AssertFatal((rfsimulator->epollfd = epoll_create1(0)) != -1,""); - // initialize channel simulation - rfsimulator->tx_num_channels=openair0_cfg->tx_num_channels; - rfsimulator->rx_num_channels=openair0_cfg->rx_num_channels; - rfsimulator->sample_rate=openair0_cfg->sample_rate; - rfsimulator->tx_bw=openair0_cfg->tx_bw; + //randominit(0); set_taus_seed(0); /* look for telnet server, if it is loaded, add the channel modeling commands to it */ From 982a05463148e51dd5e7945e726b509da2f84da5 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 10 Mar 2021 10:42:11 +0000 Subject: [PATCH 044/125] Add support for PUSCH DMRS sequence generation when BWPStart>0 --- .../PHY/NR_ESTIMATION/nr_ul_channel_estimation.c | 6 +++--- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 1 + openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 2 +- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 15 ++++++++------- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 38b35dcf6d..f4a70b1323 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -124,9 +124,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, //------------------generate DMRS------------------// - if (pusch_pdu->transform_precoding == transform_precoder_disabled) - nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, pusch_pdu->rb_start*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type); - + if (pusch_pdu->transform_precoding == transform_precoder_disabled) + nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, (pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type); + else { // if transform precoding or SC-FDMA is enabled in Uplink // NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 4fb9065aa5..a8ceb2aef3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -268,6 +268,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB, //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007 /// DMRS QPSK modulation + // TODO: performance improvement, we can skip the modulation of DMRS symbols outside the bandwidth part for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) { if (rel15->dlDmrsSymbPos & (1 << l)) { nr_modulation(pdsch_dmrs[l][0], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs[l]); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index abc944bc00..917a41c9e6 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -917,7 +917,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue, n_rnti = rel15->rnti; if (crc == n_rnti) { - LOG_D(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %d,n_CCE %d,payloadSize %d,payload %llx)\n", + LOG_I(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %d,n_CCE %d,payloadSize %d,payload %llx)\n", proc->frame_rx, proc->nr_slot_rx,n_rnti,rel15->dci_format_options[k],CCEind,dci_length,*(unsigned long long*)dci_estimation); dci_ind->SFN = proc->frame_rx; dci_ind->slot = proc->nr_slot_rx; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 208901f289..4a9a81f657 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -195,7 +195,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /////////////////////////DMRS Modulation///////////////////////// /////////// uint32_t ***pusch_dmrs = UE->nr_gold_pusch_dmrs[slot]; - uint16_t n_dmrs = (start_rb+nb_rb)*((dmrs_type == pusch_dmrs_type1) ? 6:4); + uint16_t n_dmrs = (pusch_pdu->bwp_start + start_rb + nb_rb)*((dmrs_type == pusch_dmrs_type1) ? 6:4); int16_t mod_dmrs[n_dmrs<<1] __attribute((aligned(16))); /////////// //////////////////////////////////////////////////////////////////////// @@ -355,16 +355,17 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, if (pusch_pdu->transform_precoding == transform_precoder_disabled){ if (dmrs_type == pusch_dmrs_type1) - dmrs_idx = start_rb*6; + dmrs_idx = (pusch_pdu->bwp_start + start_rb)*6; else - dmrs_idx = start_rb*4; - - // Perform this on gold sequence, not required when SC FDMA operation is done, + dmrs_idx = (pusch_pdu->bwp_start + start_rb)*4; + + // TODO: performance improvement, we can skip the modulation of DMRS symbols outside the bandwidth part + // Perform this on gold sequence, not required when SC FDMA operation is done, nr_modulation(pusch_dmrs[l][0], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated } else { - dmrs_idx = 0; - } + dmrs_idx = 0; + } } else if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { From f6a1c1883fff899d054de26d576beb29c17416fb Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 10 Mar 2021 19:13:29 +0000 Subject: [PATCH 045/125] Add support for PUSCH scheduled by RAR when BWPStart>0 --- openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 4 ++-- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 2 +- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 10 ++++++---- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 3 ++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 42d6cfad7a..cc088a36d6 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -326,7 +326,7 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF, #endif uint8_t is_dmrs_re; - start_re = (frame_parms->first_carrier_offset + (pusch_pdu->rb_start * NR_NB_SC_PER_RB))%frame_parms->ofdm_symbol_size; + start_re = (frame_parms->first_carrier_offset + (pusch_pdu->rb_start + pusch_pdu->bwp_start) * NR_NB_SC_PER_RB)%frame_parms->ofdm_symbol_size; nb_re_pusch = NR_NB_SC_PER_RB * pusch_pdu->rb_size; #ifdef __AVX2__ int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7); @@ -1174,7 +1174,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, } - bwp_start_subcarrier = (rel15_ul->rb_start*NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size; + bwp_start_subcarrier = ((rel15_ul->rb_start + rel15_ul->bwp_start)*NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size; dmrs_symbol_flag = ((rel15_ul->ul_dmrs_symb_pos)>>symbol)&0x01; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 4a9a81f657..160134d329 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -137,7 +137,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, uint8_t mod_order = pusch_pdu->qam_mod_order; uint16_t rnti = pusch_pdu->rnti; uint8_t cdm_grps_no_data = pusch_pdu->num_dmrs_cdm_grps_no_data; - uint16_t start_sc = frame_parms->first_carrier_offset + start_rb*NR_NB_SC_PER_RB; + uint16_t start_sc = frame_parms->first_carrier_offset + (start_rb+pusch_pdu->bwp_start)*NR_NB_SC_PER_RB; if (start_sc >= frame_parms->ofdm_symbol_size) start_sc -= frame_parms->ofdm_symbol_size; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index d60fc55090..ff3aece24b 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -495,11 +495,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, int ibwp_size = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); // BWP start selection according to 8.3 of TS 38.213 - pusch_config_pdu->bwp_size = ibwp_size; - if ((ibwp_start < abwp_start) || (ibwp_size > abwp_size)) + if ((ibwp_start < abwp_start) || (ibwp_size > abwp_size)) { pusch_config_pdu->bwp_start = abwp_start; - else + pusch_config_pdu->bwp_size = abwp_size; + } else { pusch_config_pdu->bwp_start = ibwp_start; + pusch_config_pdu->bwp_size = ibwp_size; + } //// Resource assignment from RAR // Frequency domain allocation according to 8.3 of TS 38.213 @@ -513,7 +515,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, return -1; // virtual resource block to physical resource mapping for Msg3 PUSCH (6.3.1.7 in 38.211) - pusch_config_pdu->rb_start += ibwp_start - abwp_start; + //pusch_config_pdu->rb_start += ibwp_start - abwp_start; // Time domain allocation SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index b7614034de..5f5a92bc6a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -791,7 +791,8 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t pusch_pdu->dmrs_ports = 1; // 6.2.2 in 38.214 only port 0 to be used pusch_pdu->num_dmrs_cdm_grps_no_data = 2; // no data in dmrs symbols as in 6.2.2 in 38.214 pusch_pdu->resource_alloc = 1; //type 1 - pusch_pdu->rb_start = ra->msg3_first_rb + ibwp_start - abwp_start; // as for 6.3.1.7 in 38.211 + //pusch_pdu->rb_start = ra->msg3_first_rb + ibwp_start - abwp_start; // as for 6.3.1.7 in 38.211 + pusch_pdu->rb_start = ra->msg3_first_rb; if (ra->msg3_nb_rb > pusch_pdu->bwp_size) AssertFatal(1==0,"MSG3 allocated number of RBs exceed the BWP size\n"); else From fa79cdb5ba47edbb866cd285808c1d8d8d3144c2 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 10 Mar 2021 19:21:06 +0000 Subject: [PATCH 046/125] Revert RA preamble shift at gNB --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 0c1fde07a2..1d971a8831 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -681,7 +681,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, preamble_shift -= NCS; if (preamble_shift < 0) - preamble_shift+=((N_ZC/NCS)*NCS); + preamble_shift+=N_ZC; } } else { // This is the high-speed case new_dft = 0; From de87c02ea9f1d7d6926fd0e26939a94a985f3665 Mon Sep 17 00:00:00 2001 From: frtabu Date: Wed, 10 Mar 2021 21:39:20 +0100 Subject: [PATCH 047/125] start doc --- ci-scripts/conf_files/channelmod_rfsimu.conf | 23 +++++-- openair1/SIMULATION/TOOLS/DOC/arch.md | 9 +++ .../TOOLS/DOC/channel_simulation.md | 13 ++++ openair1/SIMULATION/TOOLS/DOC/devusage.md | 7 ++ openair1/SIMULATION/TOOLS/DOC/rtusage.md | 69 +++++++++++++++++++ openair1/SIMULATION/TOOLS/random_channel.c | 47 ------------- 6 files changed, 114 insertions(+), 54 deletions(-) create mode 100644 openair1/SIMULATION/TOOLS/DOC/arch.md create mode 100644 openair1/SIMULATION/TOOLS/DOC/channel_simulation.md create mode 100644 openair1/SIMULATION/TOOLS/DOC/devusage.md create mode 100644 openair1/SIMULATION/TOOLS/DOC/rtusage.md diff --git a/ci-scripts/conf_files/channelmod_rfsimu.conf b/ci-scripts/conf_files/channelmod_rfsimu.conf index c7abffa878..ba115df04c 100644 --- a/ci-scripts/conf_files/channelmod_rfsimu.conf +++ b/ci-scripts/conf_files/channelmod_rfsimu.conf @@ -1,6 +1,6 @@ -/* configuration for channel modelisation */ -/* To be included in main config file when */ -/* channel modelisation is used (rfsimulator with chanmod options enabled) */ +#/* configuration for channel modelisation */ +#/* To be included in main config file when */ +#/* channel modelisation is used (rfsimulator with chanmod options enabled) */ channelmod = { max_chan=10; modellist="modellist_rfsimu_1"; @@ -15,14 +15,14 @@ channelmod = { ds_tdl = 0; }, { - model_name = "rfsimu_channel_ue0" + model_name = "rfsimu_channel_ue1" type = "AWGN"; ploss_dB = 0; noise_power_dB = 0; forgetfact = 0; offset = 0; ds_tdl = 0; - }, + } ); modellist_rfsimu_2 = ( { @@ -35,14 +35,23 @@ channelmod = { ds_tdl = 0; }, { - model_name = "rfsimu_channel_ue0" + model_name = "rfsimu_channel_ue1" type = "AWGN"; ploss_dB = 0; noise_power_dB = 0; forgetfact = 0; offset = 0; ds_tdl = 0; - }, + }, + { + model_name = "rfsimu_channel_ue2" + type = "AWGN"; + ploss_dB = 0; + noise_power_dB = 0; + forgetfact = 0; + offset = 0; + ds_tdl = 0; + } ); }; diff --git a/openair1/SIMULATION/TOOLS/DOC/arch.md b/openair1/SIMULATION/TOOLS/DOC/arch.md new file mode 100644 index 0000000000..30be337829 --- /dev/null +++ b/openair1/SIMULATION/TOOLS/DOC/arch.md @@ -0,0 +1,9 @@ +# Channel simulation source files + +1. [random_channel.c](../random_channel.c) +1. [sim.h](../sim.h) + + + +[channel simulation main page](channel_simulation.md) +[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home) \ No newline at end of file diff --git a/openair1/SIMULATION/TOOLS/DOC/channel_simulation.md b/openair1/SIMULATION/TOOLS/DOC/channel_simulation.md new file mode 100644 index 0000000000..be2b987b40 --- /dev/null +++ b/openair1/SIMULATION/TOOLS/DOC/channel_simulation.md @@ -0,0 +1,13 @@ +# OAI channel simulation feature + +oai includes a channel simulation feature that any component can use to alter time domain samples of a RF channel by applying pre-defined models as defined, for example, in 3GPP TR 36.873 or TR 38.901 + +Definition, configuration and run-time modification of a channel model are implemented in common code included in UEs, gNb, eNB and used when running with the rfsimulator or the L1 simulator. Phy simulators are also using channel simulation but configuration is done via dedicated command line options. The rfsimulator is the only option to get access to all the configurations and run-time modifications features of oai channel simulation. + +## Documentation + +* [runtime usage](rtusage.md) +* [developer usage](devusage.md) +* [module architecture](arch.md) + +[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home) diff --git a/openair1/SIMULATION/TOOLS/DOC/devusage.md b/openair1/SIMULATION/TOOLS/DOC/devusage.md new file mode 100644 index 0000000000..8fa6b3fe7a --- /dev/null +++ b/openair1/SIMULATION/TOOLS/DOC/devusage.md @@ -0,0 +1,7 @@ +### channel simulation developer usage + + +[Configuring the channel simulation](rtusage.md) + +[channel simulation main page](channel_simulation.md) +[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home) \ No newline at end of file diff --git a/openair1/SIMULATION/TOOLS/DOC/rtusage.md b/openair1/SIMULATION/TOOLS/DOC/rtusage.md new file mode 100644 index 0000000000..37fc62b496 --- /dev/null +++ b/openair1/SIMULATION/TOOLS/DOC/rtusage.md @@ -0,0 +1,69 @@ +## configuring the channel simulation +Oai channel simulation is using the [config module](../../../config/config.md) to get its parameters at init time. The [telnet server](../../telnetsrv/DOC/telnetsrv.md) includes a set of commands which can be used to dynamically modify some channel model parameters + +All channel simulation parameters are defined in the `channelmod` section. Most parameters are specific to a channel model and are only used by the rfsimulator. + +### global parameters + +| name | type | default | description | +|:---:|:---:|:---:|:----| +| `max_chan` | integer | `25` | Maximum number of channel model that can be defined in the system. Must be greater than the number of model definitions in the model list loaded at init time. | +| `modellist` | character string | `DefaultChannelList` | Name of the channel models list to load at init time. | + +### Model lists + +Several model lists can be defined in the oai configuration file. One, defined by the `modellist` parameter is loaded at init time. In the configuration file each model list item describes a channel model using a group of parameters: + +| parameter name | type | default | description | +|:---:|:---:|:---:|:----| +| `model name` | character string | mandatory |name of the model, as used in the code to retrieve a model definition| +| `type` | | `AWGN` | name of the channel modelization algorithm applied on rf signal. The list of available model types can be listed via the [telnet server](../../telnetsrv/DOC/telnetsrv.md) or by entering an invalid type name | +| `ploss_dB` | real (float) | | path loss of the channel, in dB | +| `noise_power_dB` | real (double) | | noise of the channel in dB | +| `forgetfact` | real (double) | | | +| `offset` | integer | | | +| `ds_tdl` | real double | | | + +Channel simulation parameters can also be specified on the command line: + +```bash +./lte-softmodem -O ../../../ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf --noS1 --rfsim --rfsimulator.options chanmod --rfsimulator.serveraddr enb --telnetsrv --channelmod.modellist modellist_rfsimu_2 --channelmod.modellist_rfsimu_2.[1].offset 120 +``` +### Using the telnet server to modify channel simulator parameters +The telnet server includes a `channelmod` command which can be used to dynamically modify some channel model parameters. This command is only available when channel simulation is enabled (via `rfsimulator.options chanmod` option when running the rfsimulator. `channelmod` command has its own help: + +``` +$ telnet 127.0.0.1 9090 +Trying 127.0.0.1... +Connected to 127.0.0.1. +Escape character is '^]'. + +softmodem_enb> help +..................................... + module 6 = channelmod: + channelmod help + channelmod show + channelmod modify + module 7 = rfsimu: + rfsimu setmodel +softmodem_enb> channelmod help +channelmod commands can be used to display or modify channel models parameters +channelmod show predef: display predefined model algorithms available in oai +channelmod show current: display the currently used models in the running executable +channelmod modify : set the specified parameters in a current model to the given value + specifies the model, the show current model command can be used to list the current models indexes + can be one of "riceanf", "aoa", "randaoa", "ploss", "noise_power_dB", "offset", "forgetf" +softmodem_enb> + +``` + + + + + + + +The [rfsimulator documentation](../../../../targets/ARCH/rfsimulator/README.md ) has also some specific information when using the channel simulation via this tool. + +[channel simulation main page](channel_simulation.md) +[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home) \ No newline at end of file diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index d45abeb711..dfe1d6a13d 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -2029,53 +2029,6 @@ void init_channelmod(void) { } } /* init_channelmod */ -void load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) { - - paramdef_t channelmod_params[] = CHANNELMOD_PARAMS_DESC; - - int numparams=sizeof(channelmod_params)/sizeof(paramdef_t); - int ret = config_get( channelmod_params,numparams,CHANNELMOD_SECTION); - AssertFatal(ret >= 0, "configuration couldn't be performed"); - defined_channels=calloc(max_chan,sizeof( channel_desc_t*)); - AssertFatal(defined_channels!=NULL, "couldn't allocate %u channel descriptors\n",max_chan); - - - paramdef_t achannel_params[] = CHANNELMOD_MODEL_PARAMS_DESC; - paramlist_def_t channel_list; - memset(&channel_list,0,sizeof(paramlist_def_t)); - strncpy(channel_list.listname,modellist_name,MAX_OPTNAME_SIZE-1); - - numparams = sizeof(achannel_params)/sizeof(paramdef_t); - config_getlist( &channel_list,achannel_params,numparams, CHANNELMOD_SECTION); - AssertFatal(channel_list.numelt>0, "List %s.%s not found in config filee\n",CHANNELMOD_SECTION,CHANNELMOD_MODELLIST_PARANAME); - int pindex_NAME = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_NAME_PNAME); - int pindex_DT = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_DT_PNAME ); - int pindex_FF = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_FF_PNAME ); - int pindex_CO = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_CO_PNAME ); - int pindex_PL = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_PL_PNAME ); - int pindex_NP = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_NP_PNAME ); - int pindex_TYPE = config_paramidx_fromname(channelmod_params,numparams, CHANNELMOD_MODEL_TYPE_PNAME); - - for (int i=0; imodel_name = strdup(*(channel_list.paramarray[i][pindex_NAME].strptr)); - LOG_I(OCM,"Model %s type %s allocated from config file, list %s\n",*(channel_list.paramarray[i][pindex_NAME].strptr), - *(channel_list.paramarray[i][pindex_TYPE].strptr), modellist_name); - } /* for loop on channel_list */ -} /* init_channelmod */ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) { paramdef_t achannel_params[] = CHANNELMOD_MODEL_PARAMS_DESC; From e06c7276042d2ce3a7956cc5d2e68e9b0a0b3bed Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 11 Mar 2021 13:57:29 +0000 Subject: [PATCH 048/125] Revert "Revert RA preamble shift at gNB" This reverts commit fa79cdb5 --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 1d971a8831..0c1fde07a2 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -681,7 +681,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, preamble_shift -= NCS; if (preamble_shift < 0) - preamble_shift+=N_ZC; + preamble_shift+=((N_ZC/NCS)*NCS); } } else { // This is the high-speed case new_dft = 0; From acb9a6e0dcd7412684f719fecc46206d4a58f259 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 11 Mar 2021 14:11:08 +0000 Subject: [PATCH 049/125] Update band 41 config file --- openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 2 +- .../CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index 917a41c9e6..abc944bc00 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -917,7 +917,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue, n_rnti = rel15->rnti; if (crc == n_rnti) { - LOG_I(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %d,n_CCE %d,payloadSize %d,payload %llx)\n", + LOG_D(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %d,n_CCE %d,payloadSize %d,payload %llx)\n", proc->frame_rx, proc->nr_slot_rx,n_rnti,rel15->dci_format_options[k],CCEind,dci_length,*(unsigned long long*)dci_estimation); dci_ind->SFN = proc->frame_rx; dci_ind->slot = proc->nr_slot_rx; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index 5bf6779f6d..cbdd205d30 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -51,7 +51,7 @@ gNBs = #initialDownlinkBWP #genericParameters # this is RBstart=41,L=24 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 6366; # 6366 12925 12956 28875 + initialDLBWPlocationAndBandwidth = 12952; # 6366 12925 12956 28875 # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; @@ -75,17 +75,12 @@ gNBs = initialDLBWPk0_2 = 0; initialDLBWPmappingType_2 = 0; #this is SS=1,L=12 - initialDLBWPstartSymbolAndLength_2 = 95; + initialDLBWPstartSymbolAndLength_2 = 54; initialDLBWPk0_3 = 0; initialDLBWPmappingType_3 = 0; - #this is SS=2,L=7 - initialDLBWPstartSymbolAndLength_3 = 86; - - initialDLBWPk0_4 = 0; - initialDLBWPmappingType_4 = 0; - #this is SS=2,L=5 - initialDLBWPstartSymbolAndLength_4 = 58; + #this is SS=1,L=5 + initialDLBWPstartSymbolAndLength_3 = 57; #uplinkConfigCommon #frequencyInfoUL @@ -99,7 +94,7 @@ gNBs = pMax = 20; #initialUplinkBWP #genericParameters - initialULBWPlocationAndBandwidth = 6366; + initialULBWPlocationAndBandwidth = 12952; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialULBWPsubcarrierSpacing = 1; @@ -111,7 +106,7 @@ gNBs = prach_msg1_FDM = 0; prach_msg1_FrequencyStart = 0; zeroCorrelationZoneConfig = 13; - preambleReceivedTargetPower = -100; + preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) preambleTransMax = 6; #powerRampingStep From e2627f8025fb2976d8a9ee09e68e0fc9dd4dff5b Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 12 Mar 2021 13:47:59 +0000 Subject: [PATCH 050/125] Improve UE mode --- openair1/PHY/defs_common.h | 5 +++-- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 15 ++++++--------- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 6 ++++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h index 27765a8548..1a8016054a 100644 --- a/openair1/PHY/defs_common.h +++ b/openair1/PHY/defs_common.h @@ -867,8 +867,9 @@ typedef enum { NOT_SYNCHED=0, PRACH=1, RA_RESPONSE=2, - PUSCH=3, - RESYNCH=4 + RA_WAIT_CR=3, + PUSCH=4, + RESYNCH=5 } UE_MODE_t; #define FOREACH_PARALLEL(GEN) \ diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index a7bb4e0dbc..2ed9fe13cd 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -2209,17 +2209,14 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t nr_Msg1_transmitted(mod_id, ue->CC_id, frame_tx, gNB_id); } else if (nr_prach == 2) { - - LOG_D(PHY, "In %s: [UE %d] RA completed, setting UE mode to PUSCH\n", __FUNCTION__, mod_id); - + LOG_W(PHY, "In %s: [UE %d] RA waiting contention resolution\n", __FUNCTION__, mod_id); + ue->UE_mode[gNB_id] = RA_WAIT_CR; + } else if (nr_prach == 3) { + LOG_W(PHY, "In %s: [UE %d] RA completed, setting UE mode to PUSCH\n", __FUNCTION__, mod_id); ue->UE_mode[gNB_id] = PUSCH; - - } else if(nr_prach == 3){ - - LOG_D(PHY, "In %s: [UE %d] RA failed, setting UE mode to PRACH\n", __FUNCTION__, mod_id); - + } else if(nr_prach == 4){ + LOG_W(PHY, "In %s: [UE %d] RA failed, setting UE mode to PRACH\n", __FUNCTION__, mod_id); ue->UE_mode[gNB_id] = PRACH; - } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_OUT); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index ead83af58a..f51fb73c42 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -664,6 +664,8 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, } } + } else { + return 3; } if (ra->RA_contention_resolution_timer_active){ @@ -779,7 +781,7 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot){ LOG_D(MAC, "In %s: [UE %d] clearing RA_active flag...\n", __FUNCTION__, mod_id); ra->RA_active = 0; - ra->generate_nr_prach = 2; + ra->generate_nr_prach = 3; ra->ra_state = RA_SUCCEEDED; } @@ -795,7 +797,7 @@ void nr_ra_failed(uint8_t mod_id, uint8_t CC_id, NR_PRACH_RESOURCES_t *prach_res RA_config_t *ra = &mac->ra; ra->first_Msg3 = 0; - ra->generate_nr_prach = 3; + ra->generate_nr_prach = 4; ra->ra_state = RA_UE_IDLE; prach_resources->RA_PREAMBLE_TRANSMISSION_COUNTER++; From 53d0fc05caf825b7a38cefd7a823dbd98e18d0cc Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 12 Mar 2021 16:02:28 +0000 Subject: [PATCH 051/125] Add more RA_state_t to accommodate all the output values from nr_ue_get_rach --- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 14 +++++++------- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 11 +++++++---- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 18 ++++++++++-------- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 4 ++-- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 2ed9fe13cd..dc60fbcf13 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -2162,7 +2162,7 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t } - if (nr_prach == 1) { + if (nr_prach == GENERATE_PREAMBLE) { if (ue->mac_enabled == 1) { int16_t pathloss = get_nr_PL(mod_id, ue->CC_id, gNB_id); @@ -2208,14 +2208,14 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t if (ue->mac_enabled == 1) nr_Msg1_transmitted(mod_id, ue->CC_id, frame_tx, gNB_id); - } else if (nr_prach == 2) { - LOG_W(PHY, "In %s: [UE %d] RA waiting contention resolution\n", __FUNCTION__, mod_id); + } else if (nr_prach == WAIT_CONTENTION_RESOLUTION) { + LOG_D(PHY, "In %s: [UE %d] RA waiting contention resolution\n", __FUNCTION__, mod_id); ue->UE_mode[gNB_id] = RA_WAIT_CR; - } else if (nr_prach == 3) { - LOG_W(PHY, "In %s: [UE %d] RA completed, setting UE mode to PUSCH\n", __FUNCTION__, mod_id); + } else if (nr_prach == RA_SUCCEEDED) { + LOG_D(PHY, "In %s: [UE %d] RA completed, setting UE mode to PUSCH\n", __FUNCTION__, mod_id); ue->UE_mode[gNB_id] = PUSCH; - } else if(nr_prach == 4){ - LOG_W(PHY, "In %s: [UE %d] RA failed, setting UE mode to PRACH\n", __FUNCTION__, mod_id); + } else if(nr_prach == RA_FAILED){ + LOG_D(PHY, "In %s: [UE %d] RA failed, setting UE mode to PRACH\n", __FUNCTION__, mod_id); ue->UE_mode[gNB_id] = PRACH; } diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 84e8ec59b5..4c2f3f8a90 100755 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -234,9 +234,12 @@ typedef struct { typedef enum { RA_UE_IDLE = 0, - WAIT_RAR = 1, - WAIT_CONTENTION_RESOLUTION = 2, - RA_SUCCEEDED = 3 + GENERATE_IDLE = 0, + GENERATE_PREAMBLE = 1, + WAIT_RAR = 2, + WAIT_CONTENTION_RESOLUTION = 3, + RA_SUCCEEDED = 4, + RA_FAILED = 5 } RA_state_t; typedef struct { @@ -260,7 +263,7 @@ typedef struct { /// Random-access preamble index int ra_PreambleIndex; /// Flag for the Msg1 generation: enabled at every occurrence of nr prach slot - uint8_t generate_nr_prach; + RA_state_t generate_nr_prach; /// Random-access window counter int16_t RA_window_cnt; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index f51fb73c42..652715f852 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -582,7 +582,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, nr_get_RA_window(mac); // Fill in preamble and PRACH resources - if (ra->generate_nr_prach == 1) + if (ra->generate_nr_prach == GENERATE_PREAMBLE) nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated); offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus, // sdus buffer @@ -635,7 +635,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, // Reset RA_active flag: it disables Msg3 retransmission (8.3 of TS 38.213) nr_ra_succeeded(mod_id, frame, nr_slot_tx); } else { - ra->generate_nr_prach = 2; + ra->generate_nr_prach = GENERATE_IDLE; } } else if (ra->RA_window_cnt == 0 && !ra->RA_RAPID_found) { @@ -658,21 +658,23 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, ra->RA_backoff_cnt--; - if ((ra->RA_backoff_cnt > 0 && ra->generate_nr_prach == 1) || ra->RA_backoff_cnt == 0){ + if ((ra->RA_backoff_cnt > 0 && ra->generate_nr_prach == GENERATE_PREAMBLE) || ra->RA_backoff_cnt == 0){ nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated); } } } - } else { - return 3; } if (ra->RA_contention_resolution_timer_active){ nr_ue_contention_resolution(mod_id, CC_id, frame, nr_slot_tx, prach_resources); } - return ra->generate_nr_prach; + if(ra->generate_nr_prach != GENERATE_IDLE) { + return ra->generate_nr_prach; + } else { + return ra->ra_state; + } } @@ -781,7 +783,7 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot){ LOG_D(MAC, "In %s: [UE %d] clearing RA_active flag...\n", __FUNCTION__, mod_id); ra->RA_active = 0; - ra->generate_nr_prach = 3; + ra->generate_nr_prach = GENERATE_IDLE; ra->ra_state = RA_SUCCEEDED; } @@ -797,7 +799,7 @@ void nr_ra_failed(uint8_t mod_id, uint8_t CC_id, NR_PRACH_RESOURCES_t *prach_res RA_config_t *ra = &mac->ra; ra->first_Msg3 = 0; - ra->generate_nr_prach = 4; + ra->generate_nr_prach = RA_FAILED; ra->ra_state = RA_UE_IDLE; prach_resources->RA_PREAMBLE_TRANSMISSION_COUNTER++; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index ff3aece24b..0c2504149c 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -1669,7 +1669,7 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric; ra->RA_offset = 2; // to compensate the rx frame offset at the gNB - ra->generate_nr_prach = 0; // Reset flag for PRACH generation + ra->generate_nr_prach = GENERATE_IDLE; // Reset flag for PRACH generation if (is_nr_UL_slot(scc, slotP)) { @@ -1686,7 +1686,7 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s if (is_nr_prach_slot && ra->ra_state == RA_UE_IDLE) { AssertFatal(NULL != prach_occasion_info_p,"PRACH Occasion Info not returned in a valid NR Prach Slot\n"); - ra->generate_nr_prach = 1; + ra->generate_nr_prach = GENERATE_PREAMBLE; format = prach_occasion_info_p->format; format0 = format & 0xff; // single PRACH format From 732617f5aea308bf088625c037862b3c0a60f48b Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 12 Mar 2021 18:31:34 +0000 Subject: [PATCH 052/125] Fix RNTI type for Msg3 at UE --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 460f148b14..189e5e1d5c 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -73,7 +73,7 @@ int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti){ if (rnti == ra->ra_rnti) { rnti_type = NR_RNTI_RA; - } else if (rnti == ra->t_crnti && ra->ra_state == WAIT_CONTENTION_RESOLUTION) { + } else if (rnti == ra->t_crnti && (ra->ra_state == WAIT_RAR || ra->ra_state == WAIT_CONTENTION_RESOLUTION) ) { rnti_type = NR_RNTI_TC; } else if (rnti == mac->crnti) { rnti_type = NR_RNTI_C; From 8b5d5bbb47b5b4b09cc5aef1063f35b4fe0fd94d Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 12 Mar 2021 18:48:00 +0000 Subject: [PATCH 053/125] Set crnti with t_crnti value when RA succeeded --- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 652715f852..82e4f37a95 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -768,6 +768,7 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot){ LOG_I(MAC, "[UE %d][%d.%d][RAPROC] RA procedure succeeded. CF-RA: RAR successfully received.\n", mod_id, frame, slot); ra->RA_window_cnt = -1; + mac->crnti = ra->t_crnti; } else { @@ -775,6 +776,7 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot){ ra->RA_contention_resolution_cnt = -1; ra->RA_contention_resolution_timer_active = 0; + mac->crnti = ra->t_crnti; ra->t_crnti = 0; LOG_D(MAC, "In %s: [UE %d][%d.%d] CB-RA: cleared contention resolution timer...\n", __FUNCTION__, mod_id, frame, slot); From 8f28685cf38a4a052608a06d7500b947caaf7684 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 12 Mar 2021 20:15:48 +0000 Subject: [PATCH 054/125] Fix in new RA attempts after fail --- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 2 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 116 +++++++++++------- 3 files changed, 76 insertions(+), 44 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 82e4f37a95..40db20e828 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -800,7 +800,7 @@ void nr_ra_failed(uint8_t mod_id, uint8_t CC_id, NR_PRACH_RESOURCES_t *prach_res NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); RA_config_t *ra = &mac->ra; - ra->first_Msg3 = 0; + ra->first_Msg3 = 1; ra->generate_nr_prach = RA_FAILED; ra->ra_state = RA_UE_IDLE; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 189e5e1d5c..f3fd9b5db6 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2291,7 +2291,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t break; } if (rarh->E == 0) { - LOG_W(NR_MAC,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match the intended RAPID (%d)\n", mod_id, rarh->RAPID, preamble_index); + LOG_W(NR_MAC,"[UE %d][RAPROC][%d.%d] Received RAR preamble (%d) doesn't match the intended RAPID (%d)\n", mod_id, frame, slot, rarh->RAPID, preamble_index); break; } else { rarh += sizeof(NR_MAC_RAR) + 1; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 86b33236ca..3f92482e20 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -464,9 +464,19 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, UE_scheduling_control->sched_ul_bytes = 0; } } - } else { - if (!sduP) // check that CRC passed - return; + } else if(sduP) { + + bool no_sig = true; + for (int k = 0; k < sdu_lenP; k++) { + if(sduP[k]!=0) { + no_sig = false; + break; + } + } + + if(no_sig) { + LOG_W(NR_MAC, "No signal\n"); + } T(T_GNB_MAC_UL_PDU_WITH_DATA, T_INT(gnb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(-1) /* harq_pid */, @@ -480,47 +490,69 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, if (ra->state != WAIT_Msg3) continue; - // random access pusch with TC-RNTI - if (ra->rnti != current_rnti) { - LOG_W(NR_MAC, - "expected TC-RNTI %04x to match current RNTI %04x\n", - ra->rnti, - current_rnti); + if(no_sig) { + LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); + ra->state = RA_IDLE; + ra->timing_offset = 0; + ra->RRC_timer = 20; + ra->msg3_round = 0; + } else { + + // random access pusch with TC-RNTI + if (ra->rnti != current_rnti) { + LOG_W(NR_MAC, + "expected TC-RNTI %04x to match current RNTI %04x\n", + ra->rnti, + current_rnti); + continue; + } + const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->secondaryCellGroup); + UE_info->UE_beam_index[UE_id] = ra->beam_id; + LOG_I(NR_MAC, + "[gNB %d][RAPROC] PUSCH with TC-RNTI %x received correctly, " + "adding UE MAC Context UE_id %d/RNTI %04x\n", + gnb_mod_idP, + current_rnti, + UE_id, + ra->rnti); + + LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received\n"); + LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n"); + for (int k = 0; k < sdu_lenP; k++) { + LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); + } + + // UE Contention Resolution Identity + // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4 + // First byte corresponds to R/LCID MAC sub-header + memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6); + + // re-initialize ta update variables afrer RA procedure completion + UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; + + nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP); + + free(ra->preambles.preamble_list); + + ra->state = Msg4; + ra->Msg4_frame = ( frameP +2 ) % 1024; + ra->Msg4_slot = 1; + LOG_I(MAC, "Scheduling RA-Msg4 for TC-RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot); + return; + + } + } + } else { + for (int i = 0; i < NR_NB_RA_PROC_MAX; ++i) { + NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i]; + if (ra->state != WAIT_Msg3) continue; - } - const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->secondaryCellGroup); - UE_info->UE_beam_index[UE_id] = ra->beam_id; - LOG_I(NR_MAC, - "[gNB %d][RAPROC] PUSCH with TC-RNTI %x received correctly, " - "adding UE MAC Context UE_id %d/RNTI %04x\n", - gnb_mod_idP, - current_rnti, - UE_id, - ra->rnti); - LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received\n"); - LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n"); - for (int k = 0; k < sdu_lenP; k++) { - LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); - } - - // UE Contention Resolution Identity - // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4 - // First byte corresponds to R/LCID MAC sub-header - memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6); - - // re-initialize ta update variables afrer RA procedure completion - UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; - - nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP); - - free(ra->preambles.preamble_list); - - ra->state = Msg4; - ra->Msg4_frame = ( frameP +2 ) % 1024; - ra->Msg4_slot = 1; - LOG_I(MAC, "Scheduling RA-Msg4 for TC-RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot); - return; + LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); + ra->state = RA_IDLE; + ra->timing_offset = 0; + ra->RRC_timer = 20; + ra->msg3_round = 0; } } } From dff9c29b1dc5a3715fada3da1f66253d8bf8728c Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 12 Mar 2021 20:39:48 +0000 Subject: [PATCH 055/125] Fix regarding ra_PreambleIndex in new RA attempts after fail --- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 1 + 1 file changed, 1 insertion(+) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 40db20e828..0d234c2163 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -801,6 +801,7 @@ void nr_ra_failed(uint8_t mod_id, uint8_t CC_id, NR_PRACH_RESOURCES_t *prach_res RA_config_t *ra = &mac->ra; ra->first_Msg3 = 1; + ra->ra_PreambleIndex = -1; ra->generate_nr_prach = RA_FAILED; ra->ra_state = RA_UE_IDLE; From 7ef6611d7dd83cefbcae408b7b1a449fd58cdd93 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Sat, 13 Mar 2021 17:56:23 +0000 Subject: [PATCH 056/125] Remove hard code in nr_pdsch_channel_estimation --- openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 5 +++-- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 1 + openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index b498ed9c6f..97613e5428 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -650,6 +650,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB_offset, + bool is_SI, unsigned char Ns, unsigned short p, unsigned char symbol, @@ -688,8 +689,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, // generate pilot for gNB port number 1000+p uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12; - if (Ns % 20 == 0) { // FIXME: temporary fix for SIB1 - rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12 - BWPStart; + if (is_SI) { + rb_offset -= BWPStart; } uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type; int8_t delta = get_delta(p, config_type); diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index 6c461ef448..1466fabe5d 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -70,6 +70,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB_offset, + bool is_SI, unsigned char Ns, unsigned short p, unsigned char symbol, diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index dc60fbcf13..c78632a5b4 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -796,6 +796,7 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_ uint16_t pdsch_nb_rb = dlsch0_harq->nb_rb; uint16_t s0 = dlsch0_harq->start_symbol; uint16_t s1 = dlsch0_harq->nb_symbols; + bool is_SI = dlsch0->rnti_type == _SI_RNTI_; LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_slot_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",ue->Mod_id,pdsch,nr_slot_rx,harq_pid,dlsch0->harq_processes[harq_pid]->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos); @@ -805,6 +806,7 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_ nr_pdsch_channel_estimation(ue, proc, 0 /*eNB_id*/, + is_SI, nr_slot_rx, aatx /*p*/, m, From bad2a56b06715f9ee1b7d2d3f2339fd4a58a8f86 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Sat, 13 Mar 2021 20:12:57 +0000 Subject: [PATCH 057/125] Implementation of the RA-Msg4 Ack --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 93 +++++++++++++++---- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 2 - 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 5f5a92bc6a..92d9f65fef 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1068,27 +1068,52 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra uint8_t time_domain_assignment = 0; uint8_t mcsIndex = 0; - uint8_t mac_sdu[30] = {}; - uint8_t mac_pdu[100] = {}; NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1; + + int UE_id = find_nr_UE_id(module_idP, ra->rnti); + NR_UE_info_t *UE_info = &nr_mac->UE_info; + NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + int nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0; + int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + nr_mix_slots; + int first_ul_slot_tdd = tdd->nrofDownlinkSlots + nr_slots_period * (slotP / nr_slots_period); + + // HARQ management + int8_t current_harq_pid = sched_ctrl->dl_harq_pid; + if (current_harq_pid < 0) { + current_harq_pid = sched_ctrl->available_dl_harq.head; + remove_front_nr_list(&sched_ctrl->available_dl_harq); + sched_ctrl->dl_harq_pid = current_harq_pid; + } else { + if (sched_ctrl->harq_processes[current_harq_pid].round == 0) + remove_nr_list(&sched_ctrl->available_dl_harq, current_harq_pid); + else + remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid); + } + NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid]; + DevAssert(!harq->is_waiting); + add_tail_nr_list(&sched_ctrl->feedback_dl_harq, current_harq_pid); + harq->is_waiting = true; + harq->feedback_slot = first_ul_slot_tdd; + ra->harq_pid = current_harq_pid; + // Bytes to be transmitted - uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, mac_sdu); - uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, (unsigned char *)mac_pdu, 255, ra->cont_res_id); - ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->R = 0; - ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->F = 0; - ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; - ((NR_MAC_SUBHEADER_SHORT *) &mac_pdu[mac_pdu_length])->L = mac_sdu_length * 8; - mac_pdu_length += 2; - memcpy(&mac_pdu[mac_pdu_length], mac_sdu, sizeof(uint8_t) * mac_sdu_length); - mac_pdu_length += mac_sdu_length; + uint8_t *buf = (uint8_t *) harq->tb; + uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id); + uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]); + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0; + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0; + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length * 8; + mac_pdu_length = mac_pdu_length + mac_sdu_length + 2; // Calculate number of symbols int startSymbolIndex, nrOfSymbols; @@ -1124,15 +1149,14 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int rbStart = 0; int rbSize = 0; - uint32_t TBS = 0; uint8_t tb_scaling = 0; uint16_t *vrb_map = cc[CC_id].vrb_map; do { rbSize++; - TBS = nr_compute_tbs(nr_get_Qm_dl(mcsIndex, mcsTableIdx), + harq->tb_size = nr_compute_tbs(nr_get_Qm_dl(mcsIndex, mcsTableIdx), nr_get_code_rate_dl(mcsIndex, mcsTableIdx), rbSize, nrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT, 0, tb_scaling,1) >> 3; - } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && TBS < mac_pdu_length); + } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && harq->tb_size < mac_pdu_length); for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) { if (vrb_map[rbStart + i]) { @@ -1212,7 +1236,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->qamModOrder[0] = 2; pdsch_pdu_rel15->mcsIndex[0] = mcsIndex; pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx; - pdsch_pdu_rel15->rvIndex[0] = 0; + pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[harq->round]; pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; pdsch_pdu_rel15->nrOfLayers = 1; pdsch_pdu_rel15->transmissionScheme = 0; @@ -1253,6 +1277,13 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dci_payload.vrb_to_prb_mapping.val = 0; dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0]; dci_payload.tb_scaling = tb_scaling; + dci_payload.rv = pdsch_pdu_rel15->rvIndex[0]; + dci_payload.harq_pid = current_harq_pid; + dci_payload.ndi = harq->ndi; + dci_payload.dai[0].val = (sched_ctrl->sched_pucch->dai_c-1)&3; + dci_payload.tpc = sched_ctrl->tpc1; // TPC for PUCCH: table 7.2.1-1 in 38.213 + dci_payload.pucch_resource_indicator = sched_ctrl->sched_pucch->resource_indicator; + dci_payload.pdsch_to_harq_feedback_timing_indicator.val = sched_ctrl->sched_pucch->timing_indicator; LOG_D(NR_MAC, "[RAPROC] DCI type 1 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d \n", @@ -1285,11 +1316,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; - memcpy(&tx_req->TLVs[0].value.direct, mac_pdu, sizeof(uint8_t) * TBS); - tx_req->PDU_length = TBS; + memcpy(tx_req->TLVs[0].value.direct, harq->tb, sizeof(uint8_t) * harq->tb_size); + tx_req->PDU_length = harq->tb_size; tx_req->PDU_index = pduindex; tx_req->num_TLV = 1; - tx_req->TLVs[0].length = TBS + 2; + tx_req->TLVs[0].length = harq->tb_size + 2; nr_mac->TX_req[CC_id].SFN = frameP; nr_mac->TX_req[CC_id].Number_of_PDUs++; nr_mac->TX_req[CC_id].Slot = slotP; @@ -1320,8 +1351,30 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra) { - LOG_W(NR_MAC,"nr_check_Msg4_Ack() is not implemented yet!\n"); - ra->state = RA_IDLE; + + int UE_id = find_nr_UE_id(module_id, ra->rnti); + const int current_harq_pid = ra->harq_pid; + + NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; + NR_UE_harq_t *harq = &UE_info->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid]; + + LOG_D(MAC, "ue %d, rnti %d, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid); + + if (harq->is_waiting == 0) + { + if (harq->round == 0) + { + ra->state = RA_IDLE; + UE_info->active[UE_id] = true; + free(ra->preambles.preamble_list); + LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. RA procedure succeeded!\n", UE_id, ra->rnti); + } + else + { + ra->state = Msg4; + } + } + } void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP){ diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 3f92482e20..22827a690d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -532,8 +532,6 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP); - free(ra->preambles.preamble_list); - ra->state = Msg4; ra->Msg4_frame = ( frameP +2 ) % 1024; ra->Msg4_slot = 1; From a97bf1da6e732f763a9a3f3191311b9bca718d8c Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Mon, 15 Mar 2021 12:40:15 +0100 Subject: [PATCH 058/125] fix phy simulators, merge develop --- openair1/SIMULATION/LTE_PHY/dlsim.c | 4 ++-- openair1/SIMULATION/LTE_PHY/dlsim_tm4.c | 4 ++-- openair1/SIMULATION/LTE_PHY/dlsim_tm7.c | 4 ++-- openair1/SIMULATION/LTE_PHY/mbmssim.c | 4 ++-- openair1/SIMULATION/LTE_PHY/pbchsim.c | 6 +++--- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 2 +- openair1/SIMULATION/LTE_PHY/prachsim.c | 2 +- openair1/SIMULATION/LTE_PHY/pucchsim.c | 2 +- openair1/SIMULATION/LTE_PHY/scansim.c | 2 +- openair1/SIMULATION/LTE_PHY/syncsim.c | 6 +++--- openair1/SIMULATION/LTE_PHY/ulsim.c | 2 +- openair1/SIMULATION/NR_PHY/dlschsim.c | 2 +- openair1/SIMULATION/NR_PHY/dlsim.c | 2 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 2 +- openair1/SIMULATION/NR_PHY/prachsim.c | 2 +- openair1/SIMULATION/NR_PHY/pucchsim.c | 2 +- openair1/SIMULATION/NR_PHY/ulschsim.c | 2 +- openair1/SIMULATION/NR_PHY/ulsim.c | 2 +- 18 files changed, 26 insertions(+), 26 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 667913d377..aa0fcbe3a3 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -1179,7 +1179,7 @@ int main(int argc, char **argv) { DS_TDL, forgetting_factor, rx_sample_offset, - 0); + 0, 0); reset_meas(&eNB2UE[0]->random_channel); reset_meas(&eNB2UE[0]->interp_time); @@ -1193,7 +1193,7 @@ int main(int argc, char **argv) { DS_TDL, forgetting_factor, rx_sample_offset, - 0); + 0, 0); reset_meas(&eNB2UE[n]->random_channel); reset_meas(&eNB2UE[n]->interp_time); } diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c index a585e8efc6..3b4e6782da 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c @@ -988,7 +988,7 @@ int main(int argc, char **argv) N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, - 0); + 0, 0); if(num_rounds>1) { for(n=1; n<8; n++) @@ -999,7 +999,7 @@ int main(int argc, char **argv) N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, - 0); + 0, 0); } if (eNB2UE[0]==NULL) { diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c index 5973f80b55..bd164150c5 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c @@ -834,7 +834,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, - 0); + 0, 0); if(num_rounds>1) { for(n=1; n<4; n++) @@ -845,7 +845,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, - 0); + 0, 0); } if (eNB2UE[0]==NULL) { diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index b1f4d933b3..78fd1a293e 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -1290,7 +1290,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, - 0); + 0, 0); reset_meas(&eNB2UE[0]->random_channel); reset_meas(&eNB2UE[0]->interp_time); @@ -1303,7 +1303,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, - 0); + 0, 0); reset_meas(&eNB2UE[n]->random_channel); reset_meas(&eNB2UE[n]->interp_time); } diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 00ad03c52d..71286faafb 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -386,7 +386,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, - 0); + 0, 0); if (interf1>-20) eNB2UE1 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, @@ -396,7 +396,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 4, - 0); + 0, 0); if (interf2>-20) eNB2UE2 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, @@ -406,7 +406,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 8, - 0); + 0, 0); if (eNB2UE==NULL) { msg("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 004eb24243..bd2c2d66b9 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -708,7 +708,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, - 0); + 0, 0); L1_rxtx_proc_t *proc_rxtx = (subframe == 0)? &eNB->proc.L1_proc: &eNB->proc.L1_proc_tx; eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0); UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c index c997aa7639..229764a893 100644 --- a/openair1/SIMULATION/LTE_PHY/prachsim.c +++ b/openair1/SIMULATION/LTE_PHY/prachsim.c @@ -343,7 +343,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), 0.0, delay, - 0); + 0, 0); if (UE2eNB==NULL) { msg("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index 127bfcb533..083a756afb 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -323,7 +323,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), 0.0, 0, - 0); + 0, 0); if (UE2eNB==NULL) { printf("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/LTE_PHY/scansim.c b/openair1/SIMULATION/LTE_PHY/scansim.c index 5ceeee7f2f..839d30a8de 100644 --- a/openair1/SIMULATION/LTE_PHY/scansim.c +++ b/openair1/SIMULATION/LTE_PHY/scansim.c @@ -335,7 +335,7 @@ int main(int argc, char **argv) { N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), 0, 0, - 0); + 0, 0); if (eNB2UE==NULL) { msg("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c index 80598b37e4..e8ee7d3d5e 100644 --- a/openair1/SIMULATION/LTE_PHY/syncsim.c +++ b/openair1/SIMULATION/LTE_PHY/syncsim.c @@ -724,7 +724,7 @@ int main(int argc, char **argv) { BW, 0, 0, - 0); + 0, 0); if (interf1>-20) eNB2UE1 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, @@ -733,7 +733,7 @@ int main(int argc, char **argv) { BW, 0, 0, - 0); + 0, 0); if (interf2>-20) eNB2UE2 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, @@ -742,7 +742,7 @@ int main(int argc, char **argv) { BW, 0, 0, - 0); + 0, 0); if (eNB2UE==NULL) { msg("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 80beee4bed..fc5392b533 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -734,7 +734,7 @@ int main(int argc, char **argv) { 30e-9, forgetting_factor, delay, - 0); + 0, 0); // set Doppler UE2eNB->max_Doppler = maxDoppler; diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index 00983553d8..12b0b1d1f0 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -339,7 +339,7 @@ int main(int argc, char **argv) 61.44e6, //N_RB2sampling_rate(N_RB_DL), 40e6, //N_RB2channel_bandwidth(N_RB_DL), DS_TDL, - 0, 0, 0); + 0, 0, 0, 0); if (gNB2UE == NULL) { printf("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 3a989566d2..a1ace321e9 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -757,7 +757,7 @@ int main(int argc, char **argv) 30e-9, 0, 0, - 0); + 0, 0); if (gNB2UE==NULL) { printf("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 7b845c5bd3..da0c273fec 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -479,7 +479,7 @@ int main(int argc, char **argv) 300e-9, 0, 0, - 0); + 0, 0); if (gNB2UE==NULL) { printf("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index 8bd54ec345..08d86f888f 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -655,7 +655,7 @@ int main(int argc, char **argv){ DS_TDL, 0.0, delay, - 0); + 0, 0); if (UE2gNB==NULL) { printf("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index 8d79633a6f..4cef1213c9 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -418,7 +418,7 @@ int main(int argc, char **argv) printf("FFO = %lf; IFO = %d\n",eps-IFO,IFO); } - UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, fs, bw, DS_TDL,0, 0, 0); + UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, fs, bw, DS_TDL,0, 0, 0, 0); if (UE2gNB==NULL) { printf("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index 6f2af73a1d..f84e553683 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -364,7 +364,7 @@ int main(int argc, char **argv) 61.44e6, //N_RB2sampling_rate(N_RB_DL), 40e6, //N_RB2channel_bandwidth(N_RB_DL), DS_TDL, - 0,0,0); + 0,0,0, 0); if (gNB2UE == NULL) { printf("Problem generating channel model. Exiting.\n"); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 35d642e7b3..310316e0f6 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -592,7 +592,7 @@ int main(int argc, char **argv) sampling_frequency, bandwidth, DS_TDL, - 0, 0, 0); + 0, 0, 0, 0); if (UE2gNB == NULL) { printf("Problem generating channel model. Exiting.\n"); From 8ad4895f55176b7aa5cc67080f3ea72b657a8ede Mon Sep 17 00:00:00 2001 From: frtabu Date: Mon, 15 Mar 2021 12:51:49 +0100 Subject: [PATCH 059/125] Add common option telnetclt --- executables/softmodem-common.c | 10 +++++++--- executables/softmodem-common.h | 27 ++++++++++++++------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c index 1077c0e1ac..11712d6157 100644 --- a/executables/softmodem-common.c +++ b/executables/softmodem-common.c @@ -86,7 +86,7 @@ char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr) { void get_common_options(uint32_t execmask) { uint32_t online_log_messages=0; uint32_t glog_level=0 ; - uint32_t start_telnetsrv = 0; + uint32_t start_telnetsrv = 0, start_telnetclt = 0; uint32_t noS1 = 0, nokrnmod = 0, nonbiot = 0; uint32_t rfsim = 0, basicsim = 0, do_forms = 0; char *logmem_filename = NULL; @@ -99,17 +99,21 @@ void get_common_options(uint32_t execmask) { sizeof(cmdline_logparams)/sizeof(paramdef_t)); config_get( cmdline_logparams,sizeof(cmdline_logparams)/sizeof(paramdef_t),NULL); - if(config_isparamset(cmdline_logparams,CMDLINE_ONLINELOG_IDX)) { + if(config_isparamset(cmdline_logparams,config_paramidx_fromname(cmdline_logparams,numparams, CONFIG_FLOG_OPT))) { set_glog_onlinelog(online_log_messages); } - if(config_isparamset(cmdline_logparams,CMDLINE_GLOGLEVEL_IDX)) { + if(config_isparamset(cmdline_logparams,config_paramidx_fromname(cmdline_logparams,numparams, CONFIG_LOGL_OPT))) { set_glog(glog_level); } if (start_telnetsrv) { load_module_shlib("telnetsrv",NULL,0,NULL); } + + if (start_telnetclt) { + set_softmodem_optmask(SOFTMODEM_TELNETCLT_BIT); + } if (logmem_filename != NULL && strlen(logmem_filename) > 0) { log_mem_filename = &logmem_filename[0]; diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 60a761c732..ff052bf413 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -153,23 +153,22 @@ extern "C" #define CONFIG_HLP_LOGV "Set the global log verbosity \n" #define CONFIG_HLP_TELN "Start embedded telnet server \n" #define CONFIG_HLP_MSC "Enable the MSC tracing utility \n" -/*----------------------------------------------------------------------------------------------------------------------------*/ -/* command line parameters for LOG utility */ -/* optname helpstr paramflags XXXptr defXXXval type numelt */ -/*----------------------------------------------------------------------------------------------------------------------------*/ +#define CONFIG_FLOG_OPT "R" +#define CONFIG_LOGL_OPT "g" +/*-------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* command line parameters for LOG utility */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------*/ #define START_MSC softmodem_params.start_msc #define CMDLINE_LOGPARAMS_DESC { \ - {"R" , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \ - {"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \ - {"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \ - {"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \ - {"log-mem", NULL, 0, strptr:(char **)&logmem_filename, defstrval:NULL, TYPE_STRING, 0}, \ + {CONFIG_FLOG_OPT , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \ + {CONFIG_LOGL_OPT , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \ + {"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \ + {"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \ + {"log-mem", NULL, 0, strptr:(char **)&logmem_filename, defstrval:NULL, TYPE_STRING, 0}, \ + {"telnetclt", NULL, 0, uptr:&start_telnetclt, defstrval:NULL, TYPE_UINT, 0}, \ } -#define CMDLINE_ONLINELOG_IDX 0 -#define CMDLINE_GLOGLEVEL_IDX 1 -#define CMDLINE_GLOGVERBO_IDX 2 -#define CMDLINE_STARTTELN_IDX 3 /* check function for global log level */ #define CMDLINE_LOGPARAMS_CHECK_DESC { \ @@ -190,6 +189,7 @@ extern "C" #define SOFTMODEM_SIML1_BIT (1<<12) #define SOFTMODEM_DOFORMS_BIT (1<<15) #define SOFTMODEM_RECPLAY_BIT (1<<16) +#define SOFTMODEM_TELNETCLT_BIT (1<<17) #define SOFTMODEM_ENB_BIT (1<<20) #define SOFTMODEM_GNB_BIT (1<<21) #define SOFTMODEM_4GUE_BIT (1<<22) @@ -206,6 +206,7 @@ extern "C" #define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT) #define IS_SOFTMODEM_DOFORMS ( get_softmodem_optmask() & SOFTMODEM_DOFORMS_BIT) #define IS_SOFTMODEM_IQPLAYER ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT) +#define IS_SOFTMODEM_TELNETCLT_BIT ( get_softmodem_optmask() & SOFTMODEM_TELNETCLT_BIT) #define IS_SOFTMODEM_ENB_BIT ( get_softmodem_optmask() & SOFTMODEM_ENB_BIT) #define IS_SOFTMODEM_GNB_BIT ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT) #define IS_SOFTMODEM_4GUE_BIT ( get_softmodem_optmask() & SOFTMODEM_4GUE_BIT) From 98c354fedd7afce97967e6c552ce630566ccbfec Mon Sep 17 00:00:00 2001 From: frtabu Date: Mon, 15 Mar 2021 23:26:09 +0100 Subject: [PATCH 060/125] Set path for libconfig include directive, so that all config files could be located in the same directory. minor fixes in softmodem-common --- .../enb.band7.tm1.50PRB.usrpb210.conf | 2 +- common/config/config_load_configmodule.h | 8 ++++-- common/config/libconfig/config_libconfig.c | 28 +++++++++++++++---- executables/softmodem-common.c | 9 +++--- executables/softmodem-common.h | 1 + 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf index 4d89ad96da..087ee37f01 100644 --- a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf +++ b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf @@ -260,7 +260,6 @@ NETWORK_CONTROLLER : FLEXRAN_CACHE = "/mnt/oai_agent_cache"; FLEXRAN_AWAIT_RECONF = "no"; }; - log_config : { global_log_level ="info"; @@ -279,3 +278,4 @@ NETWORK_CONTROLLER : rrc_log_verbosity ="medium"; }; +@include "channelmod_rfsimu.conf" diff --git a/common/config/config_load_configmodule.h b/common/config/config_load_configmodule.h index 8baaa99bb8..0688f6531f 100644 --- a/common/config/config_load_configmodule.h +++ b/common/config/config_load_configmodule.h @@ -82,10 +82,12 @@ typedef struct configmodule_interface { #ifdef CONFIG_LOADCONFIG_MAIN configmodule_interface_t *cfgptr=NULL; -static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbgl[debugflags]> \n \ - debugflags can also be defined in the config_libconfig section of the config file\n \ +static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbgl[debugflags]><:incp[path]>\n \ + debugflags can also be defined in the config section of the config file\n \ debugflags: mask, 1->print parameters, 2->print memory allocations debug messages\n \ - 4->print command line processing debug messages\n "; + 4->print command line processing debug messages\n \ + incp parameter can be used to define the include path used for config files (@include directive)\n \ + defaults is set to the path of the main config file.\n"; #define CONFIG_SECTIONNAME "config" #define CONFIGPARAM_DEBUGFLAGS_IDX 0 diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c index eb08a70183..abd7b7b504 100644 --- a/common/config/libconfig/config_libconfig.c +++ b/common/config/libconfig/config_libconfig.c @@ -33,8 +33,9 @@ #include #include +#include + #include -#include #include "config_libconfig.h" #include "config_libconfig_private.h" @@ -347,17 +348,34 @@ int config_libconfig_init(char *cfgP[], int numP) { config_get_if()->numptrs=0; memset(config_get_if()->ptrs,0,sizeof(void *) * CONFIG_MAX_ALLOCATEDPTRS); memset(config_get_if()->ptrsAllocated, 0, sizeof(config_get_if()->ptrsAllocated)); - + /* search for include path parameter and set config file include path accordingly */ + for (int i=0; i Date: Tue, 16 Mar 2021 10:08:54 +0000 Subject: [PATCH 061/125] Send MAC NR-BCCH-SL-SCH to RRC through ITTI at UE --- openair2/RRC/NR_UE/L2_interface_ue.c | 26 +++++++++++++++++++++++++- openair2/RRC/NR_UE/rrc_UE.c | 2 +- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c index 609d526127..c78a1caf37 100644 --- a/openair2/RRC/NR_UE/L2_interface_ue.c +++ b/openair2/RRC/NR_UE/L2_interface_ue.c @@ -56,7 +56,29 @@ nr_mac_rrc_data_ind_ue( break; case NR_BCCH_DL_SCH: - AssertFatal( nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(module_id, gNB_index, (uint8_t*)pduP, pdu_len, 0, 0) == 0, "UE decode BCCH-DL-SCH error!\n"); + if (pdu_len>0) { + LOG_T(NR_RRC, "[UE %d] Received SDU for NR-BCCH-DL-SCH on SRB %u from gNB %d\n", module_id, channel & RAB_OFFSET, + gNB_index); + + MessageDef *message_p; + int msg_sdu_size = BCCH_SDU_SIZE; + + if (pdu_len > msg_sdu_size) { + LOG_E(NR_RRC, "SDU larger than NR-BCCH-DL-SCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); + sdu_size = msg_sdu_size; + } else { + sdu_size = pdu_len; + } + + message_p = itti_alloc_new_message(TASK_MAC_UE, 0, NR_RRC_MAC_BCCH_DATA_IND); + memset(NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu, 0, BCCH_SDU_SIZE); + memcpy(NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu, pduP, sdu_size); + NR_RRC_MAC_BCCH_DATA_IND (message_p).frame = frame; //frameP + NR_RRC_MAC_BCCH_DATA_IND (message_p).sub_frame = sub_frame; //sub_frameP + NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = sdu_size; + NR_RRC_MAC_BCCH_DATA_IND (message_p).gnb_index = gNB_index; + itti_send_msg_to_task(TASK_RRC_NRUE, GNB_MODULE_ID_TO_INSTANCE(module_id), message_p); + } break; case CCCH: @@ -83,6 +105,8 @@ nr_mac_rrc_data_ind_ue( NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti; //rntiP itti_send_msg_to_task (TASK_RRC_NRUE, GNB_MODULE_ID_TO_INSTANCE( module_id ), message_p); } + break; + default: break; } diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index f373d74230..703a93c847 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -2472,7 +2472,6 @@ void *rrc_nrue_task( void *args_p ) { case NR_RRC_MAC_BCCH_DATA_IND: LOG_D(NR_RRC, "[UE %d] Received %s: frameP %d, gNB %d\n", ue_mod_id, ITTI_MSG_NAME (msg_p), NR_RRC_MAC_BCCH_DATA_IND (msg_p).frame, NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index); - // PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, NOT_A_RNTI, RRC_MAC_BCCH_DATA_IND (msg_p).frame, 0); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NOT_A_RNTI, NR_RRC_MAC_BCCH_DATA_IND (msg_p).frame, 0,NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index); nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message (ctxt.module_id, NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index, @@ -2480,6 +2479,7 @@ void *rrc_nrue_task( void *args_p ) { NR_RRC_MAC_BCCH_DATA_IND (msg_p).sdu_size, NR_RRC_MAC_BCCH_DATA_IND (msg_p).rsrq, NR_RRC_MAC_BCCH_DATA_IND (msg_p).rsrp); + break; case NR_RRC_MAC_CCCH_DATA_IND: LOG_D(NR_RRC, "[UE %d] RNTI %x Received %s: frameP %d, gNB %d\n", From 8646dd0bcbc55379c2af89780b88c9a9daa6311c Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 16 Mar 2021 12:51:04 +0000 Subject: [PATCH 062/125] DRB configuration for a new crnti --- openair2/LAYER2/NR_MAC_gNB/config.c | 2 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 11 +++-------- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 10 ++-------- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 2 +- openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c | 4 +++- openair2/RRC/NR/rrc_gNB.c | 3 +++ openair2/RRC/NR_UE/rrc_UE.c | 6 +++--- 7 files changed, 16 insertions(+), 22 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 41317f8bbc..cb30d21d88 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -435,7 +435,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, } } else { ra->cfra = false; - ra->rnti = rnti; + ra->rnti = 0; ra->preambles.num_preambles = MAX_NUM_NR_PRACH_PREAMBLES; ra->preambles.preamble_list = (uint8_t *) malloc(MAX_NUM_NR_PRACH_PREAMBLES*sizeof(uint8_t)); for (int i = 0; i < MAX_NUM_NR_PRACH_PREAMBLES; i++) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 92d9f65fef..d3f8cf9693 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -575,8 +575,6 @@ void nr_initiate_ra_proc(module_id_t module_idP, LOG_D(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); - // TODO: Configure RRC with the new RNTI of the following commented lines - /* int loop = 0; if (!ra->cfra) { do { @@ -590,7 +588,6 @@ void nr_initiate_ra_proc(module_id_t module_idP, abort(); } } - */ ra->RA_rnti = ra_rnti; ra->preamble_index = preamble_index; @@ -1364,9 +1361,9 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram { if (harq->round == 0) { - ra->state = RA_IDLE; - UE_info->active[UE_id] = true; + nr_clear_ra_proc(module_id, CC_id, frame, ra); free(ra->preambles.preamble_list); + UE_info->active[UE_id] = true; LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. RA procedure succeeded!\n", UE_id, ra->rnti); } else @@ -1377,9 +1374,7 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram } -void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP){ - - NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[0]; +void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, NR_RA_t *ra){ LOG_D(MAC,"[gNB %d][RAPROC] CC_id %d Frame %d Clear Random access information rnti %x\n", module_idP, CC_id, frameP, ra->rnti); ra->state = RA_IDLE; ra->timing_offset = 0; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 22827a690d..7af74c931d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -492,10 +492,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, if(no_sig) { LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); - ra->state = RA_IDLE; - ra->timing_offset = 0; - ra->RRC_timer = 20; - ra->msg3_round = 0; + nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); } else { // random access pusch with TC-RNTI @@ -547,10 +544,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, continue; LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); - ra->state = RA_IDLE; - ra->timing_offset = 0; - ra->RRC_timer = 20; - ra->msg3_round = 0; + nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); } } } diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 823e374ceb..1fa27506a9 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -114,7 +114,7 @@ void nr_schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t slotP); void nr_initiate_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, uint16_t preamble_index, uint8_t freq_index, uint8_t symbol, int16_t timing_offset); -void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP); +void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, NR_RA_t *ra); int nr_allocate_CCEs(int module_idP, int CC_idP, frame_t frameP, sub_frame_t slotP, int test_only); diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index f14d25b145..100f1d6acc 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -796,7 +796,9 @@ void nr_DRB_preconfiguration(uint16_t crnti) rbconfig->securityConfig->keyToUse = calloc(1,sizeof(*rbconfig->securityConfig->keyToUse)); *rbconfig->securityConfig->keyToUse = NR_SecurityConfig__keyToUse_master; - xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)rbconfig); + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)rbconfig); + } NR_RLC_BearerConfig_t *RLC_BearerConfig = calloc(1,sizeof(*RLC_BearerConfig)); nr_rlc_bearer_init(RLC_BearerConfig); diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 3a70ea482a..e231cd4d47 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -1496,6 +1496,9 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP, rrc_gNB_generate_RRCSetup(ctxt_pP, rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti), CC_id); + + // FIXME: Check the best place to perform this DRB configuration + nr_DRB_preconfiguration(ctxt_pP->rnti); } break; diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 703a93c847..0d52f218a1 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -1365,10 +1365,10 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB (void **)&dl_ccch_msg, (uint8_t *)Srb_info->Rx_buffer.Payload, 100,0,0); - - // if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { xer_fprint(stdout,&asn_DEF_NR_DL_CCCH_Message,(void *)dl_ccch_msg); - // } + } if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) { LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%zu bytes)\n",ctxt_pP->module_id,ctxt_pP->frame,dec_rval.consumed); From 986a9fac1d2e251e4de27aadadf6dc92dd9959a4 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 16 Mar 2021 16:00:37 +0000 Subject: [PATCH 063/125] Fixed issues to allow coexistence of CFRA and CBRA implementations --- openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c | 14 +- openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 268 ++++++++---------- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 4 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 6 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 49 ++-- openair2/RRC/NR/rrc_gNB_reconfig.c | 98 +++---- 6 files changed, 213 insertions(+), 226 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c index 27623fe5be..2f4697c25d 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c @@ -146,17 +146,11 @@ int nr_get_Po_NOMINAL_PUSCH(NR_PRACH_RESOURCES_t *prach_resources, module_id_t m NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); NR_ServingCellConfigCommon_t *scc = mac->scc; - int8_t receivedTargerPower, delta_preamble; - long preambleReceivedTargetPower = 0; - - if (prach_resources->RA_TYPE == RA_4STEP){ - NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup; - preambleReceivedTargetPower = nr_rach_ConfigCommon->rach_ConfigGeneric.preambleReceivedTargetPower; - } else if (prach_resources->RA_TYPE == RA_2STEP){ - // msgA-PreambleReceivedTargetPower - LOG_E(MAC, "In %s:%d: missing implementation for 2-step RA...\n", __FUNCTION__, __LINE__); - } + int8_t receivedTargerPower; + int8_t delta_preamble; + NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup; + long preambleReceivedTargetPower = nr_rach_ConfigCommon->rach_ConfigGeneric.preambleReceivedTargetPower; delta_preamble = nr_get_DELTA_PREAMBLE(mod_id, CC_id, prach_resources->prach_format); receivedTargerPower = preambleReceivedTargetPower + delta_preamble + (prach_resources->RA_PREAMBLE_POWER_RAMPING_COUNTER - 1) * prach_resources->RA_PREAMBLE_POWER_RAMPING_STEP + prach_resources->POWER_OFFSET_2STEP_RA; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 0d234c2163..080a09ad51 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -103,150 +103,137 @@ void init_RA(module_id_t mod_id, LOG_E(MAC, "In %s: config not handled\n", __FUNCTION__); } - if (prach_resources->RA_TYPE == RA_2STEP){ - LOG_E(MAC, "Missing implementation of initialization of 2-step RA specific variables...\n"); - } else if (prach_resources->RA_TYPE == RA_4STEP){ - LOG_D(MAC, "Initialization of 4-step RA specific variables...\n"); - switch (rach_ConfigGeneric->powerRampingStep){ // in dB - case 0: + switch (rach_ConfigGeneric->powerRampingStep){ // in dB + case 0: prach_resources->RA_PREAMBLE_POWER_RAMPING_STEP = 0; break; - case 1: + case 1: prach_resources->RA_PREAMBLE_POWER_RAMPING_STEP = 2; break; - case 2: + case 2: prach_resources->RA_PREAMBLE_POWER_RAMPING_STEP = 4; break; - case 3: + case 3: prach_resources->RA_PREAMBLE_POWER_RAMPING_STEP = 6; break; - } - - switch (rach_ConfigGeneric->preambleTransMax) { - case 0: - ra->preambleTransMax = 3; - break; - case 1: - ra->preambleTransMax = 4; - break; - case 2: - ra->preambleTransMax = 5; - break; - case 3: - ra->preambleTransMax = 6; - break; - case 4: - ra->preambleTransMax = 7; - break; - case 5: - ra->preambleTransMax = 8; - break; - case 6: - ra->preambleTransMax = 10; - break; - case 7: - ra->preambleTransMax = 20; - break; - case 8: - ra->preambleTransMax = 50; - break; - case 9: - ra->preambleTransMax = 100; - break; - case 10: - ra->preambleTransMax = 200; - break; - } - if (nr_rach_ConfigCommon->ext1) { - if (nr_rach_ConfigCommon->ext1->ra_PrioritizationForAccessIdentity){ - LOG_D(MAC, "In %s:%d: Missing implementation for Access Identity initialization procedures\n", __FUNCTION__, __LINE__); - } - } } - return; + switch (rach_ConfigGeneric->preambleTransMax) { + case 0: + ra->preambleTransMax = 3; + break; + case 1: + ra->preambleTransMax = 4; + break; + case 2: + ra->preambleTransMax = 5; + break; + case 3: + ra->preambleTransMax = 6; + break; + case 4: + ra->preambleTransMax = 7; + break; + case 5: + ra->preambleTransMax = 8; + break; + case 6: + ra->preambleTransMax = 10; + break; + case 7: + ra->preambleTransMax = 20; + break; + case 8: + ra->preambleTransMax = 50; + break; + case 9: + ra->preambleTransMax = 100; + break; + case 10: + ra->preambleTransMax = 200; + break; + } + if (nr_rach_ConfigCommon->ext1) { + if (nr_rach_ConfigCommon->ext1->ra_PrioritizationForAccessIdentity){ + LOG_D(MAC, "In %s:%d: Missing implementation for Access Identity initialization procedures\n", __FUNCTION__, __LINE__); + } + } } void ssb_rach_config(RA_config_t *ra, NR_PRACH_RESOURCES_t *prach_resources, NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon, fapi_nr_ul_config_prach_pdu *prach_pdu){ // Determine the SSB to RACH mapping ratio // ======================================= - if (prach_resources->RA_TYPE == RA_4STEP){ - NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ssb_perRACH_config = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present; - boolean_t multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB - uint8_t ssb_rach_ratio; // Nb of SSBs per RACH or RACHs per SSB - int total_preambles_per_ssb; - uint8_t ssb_nb_in_ro; - int numberOfRA_Preambles = 64; - switch (ssb_perRACH_config){ - case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneEighth: - multiple_ssb_per_ro = false; - ssb_rach_ratio = 8; - ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneEighth + 1); - break; - case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneFourth: - multiple_ssb_per_ro = false; - ssb_rach_ratio = 4; - ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneFourth + 1); - break; - case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneHalf: - multiple_ssb_per_ro = false; - ssb_rach_ratio = 2; - ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneHalf + 1); - break; - case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one: - multiple_ssb_per_ro = true; - ssb_rach_ratio = 1; - ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.one + 1); - break; - case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_two: - multiple_ssb_per_ro = true; - ssb_rach_ratio = 2; - ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.two + 1); - break; - case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_four: - multiple_ssb_per_ro = true; - ssb_rach_ratio = 4; - ra->cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.four; - break; - case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_eight: - multiple_ssb_per_ro = true; - ssb_rach_ratio = 8; - ra->cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.eight; - break; - case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_sixteen: - multiple_ssb_per_ro = true; - ssb_rach_ratio = 16; - ra->cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.sixteen; - break; - default: - AssertFatal(1 == 0, "Unsupported ssb_perRACH_config %d\n", ssb_perRACH_config); - break; - } + NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ssb_perRACH_config = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present; + boolean_t multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB + uint8_t ssb_rach_ratio; // Nb of SSBs per RACH or RACHs per SSB + int total_preambles_per_ssb; + uint8_t ssb_nb_in_ro; + int numberOfRA_Preambles = 64; - if (nr_rach_ConfigCommon->totalNumberOfRA_Preambles) - numberOfRA_Preambles = *(nr_rach_ConfigCommon->totalNumberOfRA_Preambles); + switch (ssb_perRACH_config){ + case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneEighth: + multiple_ssb_per_ro = false; + ssb_rach_ratio = 8; + ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneEighth + 1); + break; + case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneFourth: + multiple_ssb_per_ro = false; + ssb_rach_ratio = 4; + ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneFourth + 1); + break; + case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneHalf: + multiple_ssb_per_ro = false; + ssb_rach_ratio = 2; + ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneHalf + 1); + break; + case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one: + multiple_ssb_per_ro = true; + ssb_rach_ratio = 1; + ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.one + 1); + break; + case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_two: + multiple_ssb_per_ro = true; + ssb_rach_ratio = 2; + ra->cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.two + 1); + break; + case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_four: + multiple_ssb_per_ro = true; + ssb_rach_ratio = 4; + ra->cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.four; + break; + case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_eight: + multiple_ssb_per_ro = true; + ssb_rach_ratio = 8; + ra->cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.eight; + break; + case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_sixteen: + multiple_ssb_per_ro = true; + ssb_rach_ratio = 16; + ra->cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.sixteen; + break; + default: + AssertFatal(1 == 0, "Unsupported ssb_perRACH_config %d\n", ssb_perRACH_config); + } - // Compute the proper Preamble selection params according to the selected SSB and the ssb_perRACH_OccasionAndCB_PreamblesPerSSB configuration - if ((true == multiple_ssb_per_ro) && - (ssb_rach_ratio > 1)) { - total_preambles_per_ssb = numberOfRA_Preambles / ssb_rach_ratio; + if (nr_rach_ConfigCommon->totalNumberOfRA_Preambles) + numberOfRA_Preambles = *(nr_rach_ConfigCommon->totalNumberOfRA_Preambles); - ssb_nb_in_ro = prach_pdu->ssb_nb_in_ro; - ra->starting_preamble_nb = total_preambles_per_ssb * ssb_nb_in_ro; - } - else { - total_preambles_per_ssb = numberOfRA_Preambles; - ra->starting_preamble_nb = 0; - } + // Compute the proper Preamble selection params according to the selected SSB and the ssb_perRACH_OccasionAndCB_PreamblesPerSSB configuration + if ((true == multiple_ssb_per_ro) && (ssb_rach_ratio > 1)) { + total_preambles_per_ssb = numberOfRA_Preambles / ssb_rach_ratio; + + ssb_nb_in_ro = prach_pdu->ssb_nb_in_ro; + ra->starting_preamble_nb = total_preambles_per_ssb * ssb_nb_in_ro; } else { - LOG_E(MAC, "In %s:%d: missing implementation for 2-step RA...\n", __FUNCTION__, __LINE__); + total_preambles_per_ssb = numberOfRA_Preambles; + ra->starting_preamble_nb = 0; } } -// This routine implements RA premable configuration according to +// This routine implements RA preamble configuration according to // section 5.1 (Random Access procedure) of 3GPP TS 38.321 version 16.2.1 Release 16 void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t *mac, int16_t dl_pathloss){ @@ -261,23 +248,21 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup; NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &nr_rach_ConfigCommon->rach_ConfigGeneric; - if (prach_resources->RA_TYPE == RA_4STEP){ + if (scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble){ + deltaPreamble_Msg3 = (*scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble) * 2; // dB + LOG_D(MAC, "In %s: deltaPreamble_Msg3 set to %ld\n", __FUNCTION__, deltaPreamble_Msg3); + } - if (scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble){ - deltaPreamble_Msg3 = (*scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble) * 2; // dB - LOG_D(MAC, "In %s: deltaPreamble_Msg3 set to %ld\n", __FUNCTION__, deltaPreamble_Msg3); - } - - if (!nr_rach_ConfigCommon->groupBconfigured) { - noGroupB = 1; - LOG_D(MAC, "In %s:%d: preambles group B is not configured...\n", __FUNCTION__, __LINE__); - } else { - // RA preambles group B is configured - // - Random Access Preambles group B is configured for 4-step RA type - // - Defining the number of RA preambles in RA Preamble Group A for each SSB - LOG_D(MAC, "In %s:%d: preambles group B is configured...\n", __FUNCTION__, __LINE__); - sizeOfRA_PreamblesGroupA = nr_rach_ConfigCommon->groupBconfigured->numberOfRA_PreamblesGroupA; - switch (nr_rach_ConfigCommon->groupBconfigured->ra_Msg3SizeGroupA){ + if (!nr_rach_ConfigCommon->groupBconfigured) { + noGroupB = 1; + LOG_D(MAC, "In %s:%d: preambles group B is not configured...\n", __FUNCTION__, __LINE__); + } else { + // RA preambles group B is configured + // - Random Access Preambles group B is configured for 4-step RA type + // - Defining the number of RA preambles in RA Preamble Group A for each SSB + LOG_D(MAC, "In %s:%d: preambles group B is configured...\n", __FUNCTION__, __LINE__); + sizeOfRA_PreamblesGroupA = nr_rach_ConfigCommon->groupBconfigured->numberOfRA_PreamblesGroupA; + switch (nr_rach_ConfigCommon->groupBconfigured->ra_Msg3SizeGroupA){ /* - Threshold to determine the groups of RA preambles */ case 0: messageSizeGroupA = 56; @@ -343,17 +328,12 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t break; default: AssertFatal(1 == 0,"Unknown messagePowerOffsetGroupB %lu\n", nr_rach_ConfigCommon->groupBconfigured->messagePowerOffsetGroupB); - } - - PLThreshold = prach_resources->RA_PCMAX - rach_ConfigGeneric->preambleReceivedTargetPower - deltaPreamble_Msg3 - messagePowerOffsetGroupB; - } - } else { - // todo: - // - groupB-ConfiguredTwoStepRA - // - msgA-DeltaPreamble - LOG_E(MAC, "In %s:%d: missing implementation for 2-step RA...\n", __FUNCTION__, __LINE__); + + PLThreshold = prach_resources->RA_PCMAX - rach_ConfigGeneric->preambleReceivedTargetPower - deltaPreamble_Msg3 - messagePowerOffsetGroupB; + } + /* Msg3 has not been transmitted yet */ if (ra->first_Msg3) { if(ra->ra_PreambleIndex < 0 || ra->ra_PreambleIndex > 63) { diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 0c2504149c..8e8a16948b 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -891,13 +891,12 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in uint16_t TBS_bytes = ulcfg_pdu->pusch_config_pdu.pusch_data.tb_size; - if (ra->ra_state == WAIT_RAR){ + if (ra->ra_state == WAIT_RAR && !ra->cfra){ memcpy(ulsch_input_buffer, mac->ulsch_pdu.payload, TBS_bytes); LOG_D(NR_MAC,"[RAPROC] Msg3 to be transmitted:\n"); for (int k = 0; k < TBS_bytes; k++) { LOG_D(NR_MAC,"(%i): 0x%x\n",k,mac->ulsch_pdu.payload[k]); } - LOG_I(NR_MAC,"[RAPROC] RA-Msg3 transmitted\n"); } else { if (IS_SOFTMODEM_NOS1 && (mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] != ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator)){ // Getting IP traffic to be transmitted @@ -947,6 +946,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in tx_req.tx_request_body[0].pdu = ulsch_input_buffer; if (ra->ra_state != RA_SUCCEEDED && !ra->cfra){ + LOG_I(NR_MAC,"[RAPROC] RA-Msg3 transmitted\n"); nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->gNB_index); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index d3f8cf9693..394893a15e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1033,7 +1033,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra); nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]); - LOG_I(MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception for Frame %d Subframe %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot); + if(ra->cfra) { + LOG_I(MAC, "Frame %d, Subframe %d: Setting RA-Msg3 reception for Frame %d Subframe %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot); + } T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(ra->RA_rnti), T_INT(frameP), T_INT(slotP), T_INT(0), T_BUFFER(&tx_req->TLVs[0].value.direct[0], tx_req->TLVs[0].length)); @@ -1364,7 +1366,7 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram nr_clear_ra_proc(module_id, CC_id, frame, ra); free(ra->preambles.preamble_list); UE_info->active[UE_id] = true; - LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. RA procedure succeeded!\n", UE_id, ra->rnti); + LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti); } else { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 7af74c931d..1a330da02c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -513,26 +513,37 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, UE_id, ra->rnti); - LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received\n"); - LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n"); - for (int k = 0; k < sdu_lenP; k++) { - LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); + if(ra->cfra) { + + LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti); + nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); + free(ra->preambles.preamble_list); + UE_info->active[UE_id] = true; + + } else { + + LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received\n"); + LOG_I(NR_MAC,"[RAPROC] Received Msg3:\n"); + for (int k = 0; k < sdu_lenP; k++) { + LOG_I(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); + } + + // UE Contention Resolution Identity + // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4 + // First byte corresponds to R/LCID MAC sub-header + memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6); + + // re-initialize ta update variables afrer RA procedure completion + UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; + + nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP); + + ra->state = Msg4; + ra->Msg4_frame = ( frameP +2 ) % 1024; + ra->Msg4_slot = 1; + LOG_I(MAC, "Scheduling RA-Msg4 for TC-RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot); + } - - // UE Contention Resolution Identity - // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4 - // First byte corresponds to R/LCID MAC sub-header - memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6); - - // re-initialize ta update variables afrer RA procedure completion - UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; - - nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP); - - ra->state = Msg4; - ra->Msg4_frame = ( frameP +2 ) % 1024; - ra->Msg4_slot = 1; - LOG_I(MAC, "Scheduling RA-Msg4 for TC-RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot); return; } diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 051352590a..e6780ed29e 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -228,58 +228,58 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->spCellConfig->reconfigurationWithSync->ext1 = NULL; // For 2-step contention-free random access procedure -#if 0 - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = calloc(1,sizeof(struct NR_ReconfigurationWithSync__rach_ConfigDedicated)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->present= NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink= calloc(1,sizeof(struct NR_RACH_ConfigDedicated)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra= calloc(1,sizeof(struct NR_CFRA)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->ra_Prioritization= NULL; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions= calloc(1,sizeof(struct NR_CFRA__occasions)); - memcpy(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->rach_ConfigGeneric, - &servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric, sizeof(NR_RACH_ConfigGeneric_t)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion= calloc(1,sizeof(long)); - *secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion = NR_CFRA__occasions__ssb_perRACH_Occasion_one; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.present = NR_CFRA__resources_PR_ssb; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb = calloc(1,sizeof(struct NR_CFRA__resources__ssb)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ra_ssb_OccasionMaskIndex = 0; + if(get_softmodem_params()->sa == 0) { + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = calloc(1,sizeof(struct NR_ReconfigurationWithSync__rach_ConfigDedicated)); + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->present= NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink; + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink= calloc(1,sizeof(struct NR_RACH_ConfigDedicated)); + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra= calloc(1,sizeof(struct NR_CFRA)); + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->ra_Prioritization= NULL; + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions= calloc(1,sizeof(struct NR_CFRA__occasions)); + memcpy(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->rach_ConfigGeneric, + &servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric, sizeof(NR_RACH_ConfigGeneric_t)); + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion= calloc(1,sizeof(long)); + *secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion = NR_CFRA__occasions__ssb_perRACH_Occasion_one; + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.present = NR_CFRA__resources_PR_ssb; + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb = calloc(1,sizeof(struct NR_CFRA__resources__ssb)); + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ra_ssb_OccasionMaskIndex = 0; - struct NR_CFRA_SSB_Resource *ssbElem[8]; + struct NR_CFRA_SSB_Resource *ssbElem[8]; - ssbElem[0] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[0]->ssb = 0; - ssbElem[0]->ra_PreambleIndex = 63; - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[0]); - ssbElem[1] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[1]->ssb = 1; - ssbElem[1]->ra_PreambleIndex = 62; - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[1]); - ssbElem[2] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[2]->ssb = 2; - ssbElem[2]->ra_PreambleIndex = 63; - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[2]); - ssbElem[3] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[3]->ssb = 3; - ssbElem[3]->ra_PreambleIndex = 63; - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[3]); - ssbElem[4] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[4]->ssb = 4; - ssbElem[4]->ra_PreambleIndex = 63; - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[4]); - ssbElem[5] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[5]->ssb = 5; - ssbElem[5]->ra_PreambleIndex = 63; - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[5]); - ssbElem[6] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[6]->ssb = 6; - ssbElem[6]->ra_PreambleIndex = 63; - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[6]); - ssbElem[7] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[7]->ssb = 7; - ssbElem[7]->ra_PreambleIndex = 63; - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[7]); + ssbElem[0] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[0]->ssb = 0; + ssbElem[0]->ra_PreambleIndex = 63; + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[0]); + ssbElem[1] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[1]->ssb = 1; + ssbElem[1]->ra_PreambleIndex = 62; + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[1]); + ssbElem[2] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[2]->ssb = 2; + ssbElem[2]->ra_PreambleIndex = 63; + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[2]); + ssbElem[3] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[3]->ssb = 3; + ssbElem[3]->ra_PreambleIndex = 63; + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[3]); + ssbElem[4] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[4]->ssb = 4; + ssbElem[4]->ra_PreambleIndex = 63; + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[4]); + ssbElem[5] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[5]->ssb = 5; + ssbElem[5]->ra_PreambleIndex = 63; + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[5]); + ssbElem[6] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[6]->ssb = 6; + ssbElem[6]->ra_PreambleIndex = 63; + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[6]); + ssbElem[7] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[7]->ssb = 7; + ssbElem[7]->ra_PreambleIndex = 63; + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[7]); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->ext1 = NULL; -#endif + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->ext1 = NULL; + } secondaryCellGroup->spCellConfig->rlf_TimersAndConstants = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants)); secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->present = NR_SetupRelease_RLF_TimersAndConstants_PR_setup; From 27f0414e60ace2c9db95c6b6f9e99357aae22b17 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 16 Mar 2021 16:49:30 +0000 Subject: [PATCH 064/125] Fill pusch_proc_threads in config files --- .../CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf | 5 +++-- .../CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index cbdd205d30..dd18cf624e 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -250,10 +250,11 @@ MACRLCs = ( ); L1s = ( - { + { num_cc = 1; tr_n_preference = "local_mac"; - } + pusch_proc_threads = 8; + } ); RUs = ( diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 35eb694c2b..001e5b917a 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -250,10 +250,11 @@ MACRLCs = ( ); L1s = ( - { + { num_cc = 1; tr_n_preference = "local_mac"; - } + pusch_proc_threads = 8; + } ); RUs = ( From 08274883034870c73cc416d17e267f34ed09f959 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Wed, 17 Mar 2021 19:34:27 +0100 Subject: [PATCH 065/125] noise power --- ci-scripts/conf_files/channelmod_rfsimu.conf | 4 ++-- openair1/SIMULATION/TOOLS/sim.h | 2 +- targets/ARCH/rfsimulator/apply_channelmod.c | 13 ++----------- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/ci-scripts/conf_files/channelmod_rfsimu.conf b/ci-scripts/conf_files/channelmod_rfsimu.conf index ba115df04c..9a6ded24f1 100644 --- a/ci-scripts/conf_files/channelmod_rfsimu.conf +++ b/ci-scripts/conf_files/channelmod_rfsimu.conf @@ -6,10 +6,10 @@ channelmod = { modellist="modellist_rfsimu_1"; modellist_rfsimu_1 = ( { - model_name = "rfsimu_channel_ue0" + model_name = "rfsimu_channel_enB0" type = "AWGN"; ploss_dB = 0; - noise_power_dB = 0; + noise_power_dB = -10; forgetfact = 0; offset = 0; ds_tdl = 0; diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h index 0b154dbcc4..5825a9fcc0 100644 --- a/openair1/SIMULATION/TOOLS/sim.h +++ b/openair1/SIMULATION/TOOLS/sim.h @@ -269,7 +269,7 @@ typedef enum { {CHANNELMOD_MODEL_NAME_PNAME, "name of the model\n", 0, strptr:NULL , defstrval:"", TYPE_STRING, 0 },\ {CHANNELMOD_MODEL_TYPE_PNAME, "name of the model type\n", 0, strptr:NULL , defstrval:"AWGN", TYPE_STRING, 0 },\ {CHANNELMOD_MODEL_PL_PNAME, "channel path loss in dB\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ - {CHANNELMOD_MODEL_NP_PNAME, "channel noise in dB\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ + {CHANNELMOD_MODEL_NP_PNAME, "channel noise in dB\n", 0, dblptr:NULL, defdblval:-50, TYPE_DOUBLE, 0 },\ {CHANNELMOD_MODEL_FF_PNAME, "channel forget factor ((0 to 1)\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 },\ {CHANNELMOD_MODEL_CO_PNAME, "channel offset in samps\n", 0, iptr:NULL, defintval:0, TYPE_INT, 0 },\ {CHANNELMOD_MODEL_DT_PNAME, "delay spread for TDL models\n", 0, dblptr:NULL, defdblval:0, TYPE_DOUBLE, 0 }\ diff --git a/targets/ARCH/rfsimulator/apply_channelmod.c b/targets/ARCH/rfsimulator/apply_channelmod.c index 9ff9eda4d3..ab8ae77edd 100644 --- a/targets/ARCH/rfsimulator/apply_channelmod.c +++ b/targets/ARCH/rfsimulator/apply_channelmod.c @@ -65,17 +65,8 @@ void rxAddInput( struct complex16 *input_sig, struct complex16 *after_channel_si // Fixme: not sure when it is "volts" so dB is 20*log10(...) or "power", so dB is 10*log10(...) const double pathLossLinear = pow(10,channelDesc->path_loss_dB/20.0); // Energy in one sample to calibrate input noise - //Fixme: modified the N0W computation, not understand the origin value - const double KT=1.38e-23*290; //Boltzman*temperature - // sampling rate is linked to acquisition band (the input pass band filter) - const double noise_figure_watt = KT*channelDesc->sampling_rate; - // Fixme: how to convert a noise in Watt into a 12 bits value out of the RF ADC ? - // the parameter "-s" is declared as SNR, but the input power is not well defined - // −132.24 dBm is a LTE subcarrier noise, that was used in origin code (15KHz BW thermal noise) - const double rxGain= 132.24 - channelDesc->noise_power_dB; - // sqrt(4*noise_figure_watt) is the thermal noise factor (volts) - // fixme: the last constant is pure trial results to make decent noise - const double noise_per_sample = sqrt(4*noise_figure_watt) * pow(10,rxGain/20) *10; + // the normalized OAI value seems to be 256 as average amplitude (numerical amplification = 1) + const double noise_per_sample = pow(10,channelDesc->noise_power_dB/10.0) * 256; // Fixme: we don't fill the offset length samples at begining ? // anyway, in today code, channel_offset=0 const int dd = abs(channelDesc->channel_offset); From 5c025c321e9a563c16e4aec0f97900fbb41aeb63 Mon Sep 17 00:00:00 2001 From: frtabu Date: Thu, 18 Mar 2021 00:22:11 +0100 Subject: [PATCH 066/125] set libconfig AUTOCONVERT option to true --- common/config/libconfig/config_libconfig.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c index abd7b7b504..17266246f0 100644 --- a/common/config/libconfig/config_libconfig.c +++ b/common/config/libconfig/config_libconfig.c @@ -364,7 +364,8 @@ int config_libconfig_init(char *cfgP[], int numP) { const char *incp = config_get_include_dir (&(libconfig_privdata.cfg)) ; printf("[LIBCONFIG] Path for include directive set to: %s\n", (incp!=NULL)?incp:"libconfig defaults"); - + /* set convertion option to allow integer to float conversion*/ + config_set_auto_convert (&(libconfig_privdata.cfg), CONFIG_TRUE); /* Read the file. If there is an error, report it and exit. */ if( config_read_file(&(libconfig_privdata.cfg), libconfig_privdata.configfile) == CONFIG_FALSE) { fprintf(stderr,"[LIBCONFIG] %s %d file %s - line %d: %s\n",__FILE__, __LINE__, From 9efe4187e72f25fd2936be5b9e4daa5473383afb Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 18 Mar 2021 01:20:59 +0000 Subject: [PATCH 067/125] Fix preamble sequence --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_prach.h | 285 ++++++++++++++++++ openair1/PHY/NR_TRANSPORT/nr_prach_common.c | 27 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 4 +- 4 files changed, 313 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 1d971a8831..0c1fde07a2 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -681,7 +681,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, preamble_shift -= NCS; if (preamble_shift < 0) - preamble_shift+=N_ZC; + preamble_shift+=((N_ZC/NCS)*NCS); } } else { // This is the high-speed case new_dft = 0; diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.h b/openair1/PHY/NR_TRANSPORT/nr_prach.h index d158e04c79..d97689a5a6 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.h +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.h @@ -93,3 +93,288 @@ uint16_t prach_root_sequence_map_abc[138] = { 51, 88 , 52, 87 , 53, 86 , 54, 85 , 55, 84 , 56, 83 , 57, 82 , 58, 81 , 59, 80 , 60, 79 , 61, 78 , 62, 77 , 63, 76 , 64, 75 , 65, 74 , 66, 73 , 67, 72 , 68, 71 , 69, 70 }; + +int16_t prach_fft139_re[139][139] = { +{32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767}, +{32767, 32733, 32633, 32466, 32232, 31933, 31569, 31140, 30647, 30092, 29475, 28799, 28063, 27270, 26421, 25519, 24564, 23559, 22506, 21406, 20264, 19079, 17856, 16596, 15303, 13978, 12624, 11245, 9843, 8421, 6981, 5527, 4062, 2589, 1110, -371, -1851, -3327, -4797, -6257, -7704, -9135, -10548, -11939, -13305, -14645, -15955, -17232, -18473, -19677, -20841, -21963, -23039, -24068, -25049, -25978, -26853, -27675, -28439, -29146, -29792, -30378, -30902, -31363, -31760, -32092, -32358, -32558, -32692, -32759, -32759, -32692, -32558, -32358, -32092, -31760, -31363, -30902, -30378, -29792, -29146, -28439, -27675, -26853, -25978, -25049, -24068, -23039, -21963, -20841, -19677, -18473, -17232, -15955, -14645, -13305, -11939, -10548, -9135, -7704, -6257, -4797, -3327, -1851, -371, 1110, 2589, 4062, 5527, 6981, 8421, 9843, 11245, 12624, 13978, 15303, 16596, 17856, 19079, 20264, 21406, 22506, 23559, 24564, 25519, 26421, 27270, 28063, 28799, 29475, 30092, 30647, 31140, 31569, 31933, 32232, 32466, 32633, 32733}, +{32767, 32633, 32232, 31569, 30647, 29475, 28063, 26421, 24564, 22506, 20264, 17856, 15303, 12624, 9843, 6981, 4062, 1110, -1851, -4797, -7704, -10548, -13305, -15955, -18473, -20841, -23039, -25049, -26853, -28439, -29792, -30902, -31760, -32358, -32692, -32759, -32558, -32092, -31363, -30378, -29146, -27675, -25978, -24068, -21963, -19677, -17232, -14645, -11939, -9135, -6257, -3327, -371, 2589, 5527, 8421, 11245, 13978, 16596, 19079, 21406, 23559, 25519, 27270, 28799, 30092, 31140, 31933, 32466, 32733, 32733, 32466, 31933, 31140, 30092, 28799, 27270, 25519, 23559, 21406, 19079, 16596, 13978, 11245, 8421, 5527, 2589, -371, -3327, -6257, -9135, -11939, -14645, -17232, -19677, -21963, -24068, -25978, -27675, -29146, -30378, -31363, -32092, -32558, -32759, -32692, -32358, -31760, -30902, -29792, -28439, -26853, -25049, -23039, -20841, -18473, -15955, -13305, -10548, -7704, -4797, -1851, 1110, 4062, 6981, 9843, 12624, 15303, 17856, 20264, 22506, 24564, 26421, 28063, 29475, 30647, 31569, 32232, 32633}, +{32767, 32466, 31569, 30092, 28063, 25519, 22506, 19079, 15303, 11245, 6981, 2589, -1851, -6257, -10548, -14645, -18473, -21963, -25049, -27675, -29792, -31363, -32358, -32759, -32558, -31760, -30378, -28439, -25978, -23039, -19677, -15955, -11939, -7704, -3327, 1110, 5527, 9843, 13978, 17856, 21406, 24564, 27270, 29475, 31140, 32232, 32733, 32633, 31933, 30647, 28799, 26421, 23559, 20264, 16596, 12624, 8421, 4062, -371, -4797, -9135, -13305, -17232, -20841, -24068, -26853, -29146, -30902, -32092, -32692, -32692, -32092, -30902, -29146, -26853, -24068, -20841, -17232, -13305, -9135, -4797, -371, 4062, 8421, 12624, 16596, 20264, 23559, 26421, 28799, 30647, 31933, 32633, 32733, 32232, 31140, 29475, 27270, 24564, 21406, 17856, 13978, 9843, 5527, 1110, -3327, -7704, -11939, -15955, -19677, -23039, -25978, -28439, -30378, -31760, -32558, -32759, -32358, -31363, -29792, -27675, -25049, -21963, -18473, -14645, -10548, -6257, -1851, 2589, 6981, 11245, 15303, 19079, 22506, 25519, 28063, 30092, 31569, 32466}, +{32767, 32232, 30647, 28063, 24564, 20264, 15303, 9843, 4062, -1851, -7704, -13305, -18473, -23039, -26853, -29792, -31760, -32692, -32558, -31363, -29146, -25978, -21963, -17232, -11939, -6257, -371, 5527, 11245, 16596, 21406, 25519, 28799, 31140, 32466, 32733, 31933, 30092, 27270, 23559, 19079, 13978, 8421, 2589, -3327, -9135, -14645, -19677, -24068, -27675, -30378, -32092, -32759, -32358, -30902, -28439, -25049, -20841, -15955, -10548, -4797, 1110, 6981, 12624, 17856, 22506, 26421, 29475, 31569, 32633, 32633, 31569, 29475, 26421, 22506, 17856, 12624, 6981, 1110, -4797, -10548, -15955, -20841, -25049, -28439, -30902, -32358, -32759, -32092, -30378, -27675, -24068, -19677, -14645, -9135, -3327, 2589, 8421, 13978, 19079, 23559, 27270, 30092, 31933, 32733, 32466, 31140, 28799, 25519, 21406, 16596, 11245, 5527, -371, -6257, -11939, -17232, -21963, -25978, -29146, -31363, -32558, -32692, -31760, -29792, -26853, -23039, -18473, -13305, -7704, -1851, 4062, 9843, 15303, 20264, 24564, 28063, 30647, 32232}, +{32767, 31933, 29475, 25519, 20264, 13978, 6981, -371, -7704, -14645, -20841, -25978, -29792, -32092, -32759, -31760, -29146, -25049, -19677, -13305, -6257, 1110, 8421, 15303, 21406, 26421, 30092, 32232, 32733, 31569, 28799, 24564, 19079, 12624, 5527, -1851, -9135, -15955, -21963, -26853, -30378, -32358, -32692, -31363, -28439, -24068, -18473, -11939, -4797, 2589, 9843, 16596, 22506, 27270, 30647, 32466, 32633, 31140, 28063, 23559, 17856, 11245, 4062, -3327, -10548, -17232, -23039, -27675, -30902, -32558, -32558, -30902, -27675, -23039, -17232, -10548, -3327, 4062, 11245, 17856, 23559, 28063, 31140, 32633, 32466, 30647, 27270, 22506, 16596, 9843, 2589, -4797, -11939, -18473, -24068, -28439, -31363, -32692, -32358, -30378, -26853, -21963, -15955, -9135, -1851, 5527, 12624, 19079, 24564, 28799, 31569, 32733, 32232, 30092, 26421, 21406, 15303, 8421, 1110, -6257, -13305, -19677, -25049, -29146, -31760, -32759, -32092, -29792, -25978, -20841, -14645, -7704, -371, 6981, 13978, 20264, 25519, 29475, 31933}, +{32767, 31569, 28063, 22506, 15303, 6981, -1851, -10548, -18473, -25049, -29792, -32358, -32558, -30378, -25978, -19677, -11939, -3327, 5527, 13978, 21406, 27270, 31140, 32733, 31933, 28799, 23559, 16596, 8421, -371, -9135, -17232, -24068, -29146, -32092, -32692, -30902, -26853, -20841, -13305, -4797, 4062, 12624, 20264, 26421, 30647, 32633, 32232, 29475, 24564, 17856, 9843, 1110, -7704, -15955, -23039, -28439, -31760, -32759, -31363, -27675, -21963, -14645, -6257, 2589, 11245, 19079, 25519, 30092, 32466, 32466, 30092, 25519, 19079, 11245, 2589, -6257, -14645, -21963, -27675, -31363, -32759, -31760, -28439, -23039, -15955, -7704, 1110, 9843, 17856, 24564, 29475, 32232, 32633, 30647, 26421, 20264, 12624, 4062, -4797, -13305, -20841, -26853, -30902, -32692, -32092, -29146, -24068, -17232, -9135, -371, 8421, 16596, 23559, 28799, 31933, 32733, 31140, 27270, 21406, 13978, 5527, -3327, -11939, -19677, -25978, -30378, -32558, -32358, -29792, -25049, -18473, -10548, -1851, 6981, 15303, 22506, 28063, 31569}, +{32767, 31140, 26421, 19079, 9843, -371, -10548, -19677, -26853, -31363, -32759, -30902, -25978, -18473, -9135, 1110, 11245, 20264, 27270, 31569, 32733, 30647, 25519, 17856, 8421, -1851, -11939, -20841, -27675, -31760, -32692, -30378, -25049, -17232, -7704, 2589, 12624, 21406, 28063, 31933, 32633, 30092, 24564, 16596, 6981, -3327, -13305, -21963, -28439, -32092, -32558, -29792, -24068, -15955, -6257, 4062, 13978, 22506, 28799, 32232, 32466, 29475, 23559, 15303, 5527, -4797, -14645, -23039, -29146, -32358, -32358, -29146, -23039, -14645, -4797, 5527, 15303, 23559, 29475, 32466, 32232, 28799, 22506, 13978, 4062, -6257, -15955, -24068, -29792, -32558, -32092, -28439, -21963, -13305, -3327, 6981, 16596, 24564, 30092, 32633, 31933, 28063, 21406, 12624, 2589, -7704, -17232, -25049, -30378, -32692, -31760, -27675, -20841, -11939, -1851, 8421, 17856, 25519, 30647, 32733, 31569, 27270, 20264, 11245, 1110, -9135, -18473, -25978, -30902, -32759, -31363, -26853, -19677, -10548, -371, 9843, 19079, 26421, 31140}, +{32767, 30647, 24564, 15303, 4062, -7704, -18473, -26853, -31760, -32558, -29146, -21963, -11939, -371, 11245, 21406, 28799, 32466, 31933, 27270, 19079, 8421, -3327, -14645, -24068, -30378, -32759, -30902, -25049, -15955, -4797, 6981, 17856, 26421, 31569, 32633, 29475, 22506, 12624, 1110, -10548, -20841, -28439, -32358, -32092, -27675, -19677, -9135, 2589, 13978, 23559, 30092, 32733, 31140, 25519, 16596, 5527, -6257, -17232, -25978, -31363, -32692, -29792, -23039, -13305, -1851, 9843, 20264, 28063, 32232, 32232, 28063, 20264, 9843, -1851, -13305, -23039, -29792, -32692, -31363, -25978, -17232, -6257, 5527, 16596, 25519, 31140, 32733, 30092, 23559, 13978, 2589, -9135, -19677, -27675, -32092, -32358, -28439, -20841, -10548, 1110, 12624, 22506, 29475, 32633, 31569, 26421, 17856, 6981, -4797, -15955, -25049, -30902, -32759, -30378, -24068, -14645, -3327, 8421, 19079, 27270, 31933, 32466, 28799, 21406, 11245, -371, -11939, -21963, -29146, -32558, -31760, -26853, -18473, -7704, 4062, 15303, 24564, 30647}, +{32767, 30092, 22506, 11245, -1851, -14645, -25049, -31363, -32558, -28439, -19677, -7704, 5527, 17856, 27270, 32232, 31933, 26421, 16596, 4062, -9135, -20841, -29146, -32692, -30902, -24068, -13305, -371, 12624, 23559, 30647, 32733, 29475, 21406, 9843, -3327, -15955, -25978, -31760, -32358, -27675, -18473, -6257, 6981, 19079, 28063, 32466, 31569, 25519, 15303, 2589, -10548, -21963, -29792, -32759, -30378, -23039, -11939, 1110, 13978, 24564, 31140, 32633, 28799, 20264, 8421, -4797, -17232, -26853, -32092, -32092, -26853, -17232, -4797, 8421, 20264, 28799, 32633, 31140, 24564, 13978, 1110, -11939, -23039, -30378, -32759, -29792, -21963, -10548, 2589, 15303, 25519, 31569, 32466, 28063, 19079, 6981, -6257, -18473, -27675, -32358, -31760, -25978, -15955, -3327, 9843, 21406, 29475, 32733, 30647, 23559, 12624, -371, -13305, -24068, -30902, -32692, -29146, -20841, -9135, 4062, 16596, 26421, 31933, 32232, 27270, 17856, 5527, -7704, -19677, -28439, -32558, -31363, -25049, -14645, -1851, 11245, 22506, 30092}, +{32767, 29475, 20264, 6981, -7704, -20841, -29792, -32759, -29146, -19677, -6257, 8421, 21406, 30092, 32733, 28799, 19079, 5527, -9135, -21963, -30378, -32692, -28439, -18473, -4797, 9843, 22506, 30647, 32633, 28063, 17856, 4062, -10548, -23039, -30902, -32558, -27675, -17232, -3327, 11245, 23559, 31140, 32466, 27270, 16596, 2589, -11939, -24068, -31363, -32358, -26853, -15955, -1851, 12624, 24564, 31569, 32232, 26421, 15303, 1110, -13305, -25049, -31760, -32092, -25978, -14645, -371, 13978, 25519, 31933, 31933, 25519, 13978, -371, -14645, -25978, -32092, -31760, -25049, -13305, 1110, 15303, 26421, 32232, 31569, 24564, 12624, -1851, -15955, -26853, -32358, -31363, -24068, -11939, 2589, 16596, 27270, 32466, 31140, 23559, 11245, -3327, -17232, -27675, -32558, -30902, -23039, -10548, 4062, 17856, 28063, 32633, 30647, 22506, 9843, -4797, -18473, -28439, -32692, -30378, -21963, -9135, 5527, 19079, 28799, 32733, 30092, 21406, 8421, -6257, -19677, -29146, -32759, -29792, -20841, -7704, 6981, 20264, 29475}, +{32767, 28799, 17856, 2589, -13305, -25978, -32358, -30902, -21963, -7704, 8421, 22506, 31140, 32232, 25519, 12624, -3327, -18473, -29146, -32759, -28439, -17232, -1851, 13978, 26421, 32466, 30647, 21406, 6981, -9135, -23039, -31363, -32092, -25049, -11939, 4062, 19079, 29475, 32733, 28063, 16596, 1110, -14645, -26853, -32558, -30378, -20841, -6257, 9843, 23559, 31569, 31933, 24564, 11245, -4797, -19677, -29792, -32692, -27675, -15955, -371, 15303, 27270, 32633, 30092, 20264, 5527, -10548, -24068, -31760, -31760, -24068, -10548, 5527, 20264, 30092, 32633, 27270, 15303, -371, -15955, -27675, -32692, -29792, -19677, -4797, 11245, 24564, 31933, 31569, 23559, 9843, -6257, -20841, -30378, -32558, -26853, -14645, 1110, 16596, 28063, 32733, 29475, 19079, 4062, -11939, -25049, -32092, -31363, -23039, -9135, 6981, 21406, 30647, 32466, 26421, 13978, -1851, -17232, -28439, -32759, -29146, -18473, -3327, 12624, 25519, 32232, 31140, 22506, 8421, -7704, -21963, -30902, -32358, -25978, -13305, 2589, 17856, 28799}, +{32767, 28063, 15303, -1851, -18473, -29792, -32558, -25978, -11939, 5527, 21406, 31140, 31933, 23559, 8421, -9135, -24068, -32092, -30902, -20841, -4797, 12624, 26421, 32633, 29475, 17856, 1110, -15955, -28439, -32759, -27675, -14645, 2589, 19079, 30092, 32466, 25519, 11245, -6257, -21963, -31363, -31760, -23039, -7704, 9843, 24564, 32232, 30647, 20264, 4062, -13305, -26853, -32692, -29146, -17232, -371, 16596, 28799, 32733, 27270, 13978, -3327, -19677, -30378, -32358, -25049, -10548, 6981, 22506, 31569, 31569, 22506, 6981, -10548, -25049, -32358, -30378, -19677, -3327, 13978, 27270, 32733, 28799, 16596, -371, -17232, -29146, -32692, -26853, -13305, 4062, 20264, 30647, 32232, 24564, 9843, -7704, -23039, -31760, -31363, -21963, -6257, 11245, 25519, 32466, 30092, 19079, 2589, -14645, -27675, -32759, -28439, -15955, 1110, 17856, 29475, 32633, 26421, 12624, -4797, -20841, -30902, -32092, -24068, -9135, 8421, 23559, 31933, 31140, 21406, 5527, -11939, -25978, -32558, -29792, -18473, -1851, 15303, 28063}, +{32767, 27270, 12624, -6257, -23039, -32092, -30378, -18473, -371, 17856, 30092, 32232, 23559, 6981, -11939, -26853, -32759, -27675, -13305, 5527, 22506, 31933, 30647, 19079, 1110, -17232, -29792, -32358, -24068, -7704, 11245, 26421, 32733, 28063, 13978, -4797, -21963, -31760, -30902, -19677, -1851, 16596, 29475, 32466, 24564, 8421, -10548, -25978, -32692, -28439, -14645, 4062, 21406, 31569, 31140, 20264, 2589, -15955, -29146, -32558, -25049, -9135, 9843, 25519, 32633, 28799, 15303, -3327, -20841, -31363, -31363, -20841, -3327, 15303, 28799, 32633, 25519, 9843, -9135, -25049, -32558, -29146, -15955, 2589, 20264, 31140, 31569, 21406, 4062, -14645, -28439, -32692, -25978, -10548, 8421, 24564, 32466, 29475, 16596, -1851, -19677, -30902, -31760, -21963, -4797, 13978, 28063, 32733, 26421, 11245, -7704, -24068, -32358, -29792, -17232, 1110, 19079, 30647, 31933, 22506, 5527, -13305, -27675, -32759, -26853, -11939, 6981, 23559, 32232, 30092, 17856, -371, -18473, -30378, -32092, -23039, -6257, 12624, 27270}, +{32767, 26421, 9843, -10548, -26853, -32759, -25978, -9135, 11245, 27270, 32733, 25519, 8421, -11939, -27675, -32692, -25049, -7704, 12624, 28063, 32633, 24564, 6981, -13305, -28439, -32558, -24068, -6257, 13978, 28799, 32466, 23559, 5527, -14645, -29146, -32358, -23039, -4797, 15303, 29475, 32232, 22506, 4062, -15955, -29792, -32092, -21963, -3327, 16596, 30092, 31933, 21406, 2589, -17232, -30378, -31760, -20841, -1851, 17856, 30647, 31569, 20264, 1110, -18473, -30902, -31363, -19677, -371, 19079, 31140, 31140, 19079, -371, -19677, -31363, -30902, -18473, 1110, 20264, 31569, 30647, 17856, -1851, -20841, -31760, -30378, -17232, 2589, 21406, 31933, 30092, 16596, -3327, -21963, -32092, -29792, -15955, 4062, 22506, 32232, 29475, 15303, -4797, -23039, -32358, -29146, -14645, 5527, 23559, 32466, 28799, 13978, -6257, -24068, -32558, -28439, -13305, 6981, 24564, 32633, 28063, 12624, -7704, -25049, -32692, -27675, -11939, 8421, 25519, 32733, 27270, 11245, -9135, -25978, -32759, -26853, -10548, 9843, 26421}, +{32767, 25519, 6981, -14645, -29792, -31760, -19677, 1110, 21406, 32232, 28799, 12624, -9135, -26853, -32692, -24068, -4797, 16596, 30647, 31140, 17856, -3327, -23039, -32558, -27675, -10548, 11245, 28063, 32466, 22506, 2589, -18473, -31363, -30378, -15955, 5527, 24564, 32733, 26421, 8421, -13305, -29146, -32092, -20841, -371, 20264, 31933, 29475, 13978, -7704, -25978, -32759, -25049, -6257, 15303, 30092, 31569, 19079, -1851, -21963, -32358, -28439, -11939, 9843, 27270, 32633, 23559, 4062, -17232, -30902, -30902, -17232, 4062, 23559, 32633, 27270, 9843, -11939, -28439, -32358, -21963, -1851, 19079, 31569, 30092, 15303, -6257, -25049, -32759, -25978, -7704, 13978, 29475, 31933, 20264, -371, -20841, -32092, -29146, -13305, 8421, 26421, 32733, 24564, 5527, -15955, -30378, -31363, -18473, 2589, 22506, 32466, 28063, 11245, -10548, -27675, -32558, -23039, -3327, 17856, 31140, 30647, 16596, -4797, -24068, -32692, -26853, -9135, 12624, 28799, 32232, 21406, 1110, -19677, -31760, -29792, -14645, 6981, 25519}, +{32767, 24564, 4062, -18473, -31760, -29146, -11939, 11245, 28799, 31933, 19079, -3327, -24068, -32759, -25049, -4797, 17856, 31569, 29475, 12624, -10548, -28439, -32092, -19677, 2589, 23559, 32733, 25519, 5527, -17232, -31363, -29792, -13305, 9843, 28063, 32232, 20264, -1851, -23039, -32692, -25978, -6257, 16596, 31140, 30092, 13978, -9135, -27675, -32358, -20841, 1110, 22506, 32633, 26421, 6981, -15955, -30902, -30378, -14645, 8421, 27270, 32466, 21406, -371, -21963, -32558, -26853, -7704, 15303, 30647, 30647, 15303, -7704, -26853, -32558, -21963, -371, 21406, 32466, 27270, 8421, -14645, -30378, -30902, -15955, 6981, 26421, 32633, 22506, 1110, -20841, -32358, -27675, -9135, 13978, 30092, 31140, 16596, -6257, -25978, -32692, -23039, -1851, 20264, 32232, 28063, 9843, -13305, -29792, -31363, -17232, 5527, 25519, 32733, 23559, 2589, -19677, -32092, -28439, -10548, 12624, 29475, 31569, 17856, -4797, -25049, -32759, -24068, -3327, 19079, 31933, 28799, 11245, -11939, -29146, -31760, -18473, 4062, 24564}, +{32767, 23559, 1110, -21963, -32692, -25049, -3327, 20264, 32466, 26421, 5527, -18473, -32092, -27675, -7704, 16596, 31569, 28799, 9843, -14645, -30902, -29792, -11939, 12624, 30092, 30647, 13978, -10548, -29146, -31363, -15955, 8421, 28063, 31933, 17856, -6257, -26853, -32358, -19677, 4062, 25519, 32633, 21406, -1851, -24068, -32759, -23039, -371, 22506, 32733, 24564, 2589, -20841, -32558, -25978, -4797, 19079, 32232, 27270, 6981, -17232, -31760, -28439, -9135, 15303, 31140, 29475, 11245, -13305, -30378, -30378, -13305, 11245, 29475, 31140, 15303, -9135, -28439, -31760, -17232, 6981, 27270, 32232, 19079, -4797, -25978, -32558, -20841, 2589, 24564, 32733, 22506, -371, -23039, -32759, -24068, -1851, 21406, 32633, 25519, 4062, -19677, -32358, -26853, -6257, 17856, 31933, 28063, 8421, -15955, -31363, -29146, -10548, 13978, 30647, 30092, 12624, -11939, -29792, -30902, -14645, 9843, 28799, 31569, 16596, -7704, -27675, -32092, -18473, 5527, 26421, 32466, 20264, -3327, -25049, -32692, -21963, 1110, 23559}, +{32767, 22506, -1851, -25049, -32558, -19677, 5527, 27270, 31933, 16596, -9135, -29146, -30902, -13305, 12624, 30647, 29475, 9843, -15955, -31760, -27675, -6257, 19079, 32466, 25519, 2589, -21963, -32759, -23039, 1110, 24564, 32633, 20264, -4797, -26853, -32092, -17232, 8421, 28799, 31140, 13978, -11939, -30378, -29792, -10548, 15303, 31569, 28063, 6981, -18473, -32358, -25978, -3327, 21406, 32733, 23559, -371, -24068, -32692, -20841, 4062, 26421, 32232, 17856, -7704, -28439, -31363, -14645, 11245, 30092, 30092, 11245, -14645, -31363, -28439, -7704, 17856, 32232, 26421, 4062, -20841, -32692, -24068, -371, 23559, 32733, 21406, -3327, -25978, -32358, -18473, 6981, 28063, 31569, 15303, -10548, -29792, -30378, -11939, 13978, 31140, 28799, 8421, -17232, -32092, -26853, -4797, 20264, 32633, 24564, 1110, -23039, -32759, -21963, 2589, 25519, 32466, 19079, -6257, -27675, -31760, -15955, 9843, 29475, 30647, 12624, -13305, -30902, -29146, -9135, 16596, 31933, 27270, 5527, -19677, -32558, -25049, -1851, 22506}, +{32767, 21406, -4797, -27675, -31363, -13305, 13978, 31569, 27270, 4062, -21963, -32759, -20841, 5527, 28063, 31140, 12624, -14645, -31760, -26853, -3327, 22506, 32733, 20264, -6257, -28439, -30902, -11939, 15303, 31933, 26421, 2589, -23039, -32692, -19677, 6981, 28799, 30647, 11245, -15955, -32092, -25978, -1851, 23559, 32633, 19079, -7704, -29146, -30378, -10548, 16596, 32232, 25519, 1110, -24068, -32558, -18473, 8421, 29475, 30092, 9843, -17232, -32358, -25049, -371, 24564, 32466, 17856, -9135, -29792, -29792, -9135, 17856, 32466, 24564, -371, -25049, -32358, -17232, 9843, 30092, 29475, 8421, -18473, -32558, -24068, 1110, 25519, 32232, 16596, -10548, -30378, -29146, -7704, 19079, 32633, 23559, -1851, -25978, -32092, -15955, 11245, 30647, 28799, 6981, -19677, -32692, -23039, 2589, 26421, 31933, 15303, -11939, -30902, -28439, -6257, 20264, 32733, 22506, -3327, -26853, -31760, -14645, 12624, 31140, 28063, 5527, -20841, -32759, -21963, 4062, 27270, 31569, 13978, -13305, -31363, -27675, -4797, 21406}, +{32767, 20264, -7704, -29792, -29146, -6257, 21406, 32733, 19079, -9135, -30378, -28439, -4797, 22506, 32633, 17856, -10548, -30902, -27675, -3327, 23559, 32466, 16596, -11939, -31363, -26853, -1851, 24564, 32232, 15303, -13305, -31760, -25978, -371, 25519, 31933, 13978, -14645, -32092, -25049, 1110, 26421, 31569, 12624, -15955, -32358, -24068, 2589, 27270, 31140, 11245, -17232, -32558, -23039, 4062, 28063, 30647, 9843, -18473, -32692, -21963, 5527, 28799, 30092, 8421, -19677, -32759, -20841, 6981, 29475, 29475, 6981, -20841, -32759, -19677, 8421, 30092, 28799, 5527, -21963, -32692, -18473, 9843, 30647, 28063, 4062, -23039, -32558, -17232, 11245, 31140, 27270, 2589, -24068, -32358, -15955, 12624, 31569, 26421, 1110, -25049, -32092, -14645, 13978, 31933, 25519, -371, -25978, -31760, -13305, 15303, 32232, 24564, -1851, -26853, -31363, -11939, 16596, 32466, 23559, -3327, -27675, -30902, -10548, 17856, 32633, 22506, -4797, -28439, -30378, -9135, 19079, 32733, 21406, -6257, -29146, -29792, -7704, 20264}, +{32767, 19079, -10548, -31363, -25978, 1110, 27270, 30647, 8421, -20841, -32692, -17232, 12624, 31933, 24564, -3327, -28439, -29792, -6257, 22506, 32466, 15303, -14645, -32358, -23039, 5527, 29475, 28799, 4062, -24068, -32092, -13305, 16596, 32633, 21406, -7704, -30378, -27675, -1851, 25519, 31569, 11245, -18473, -32759, -19677, 9843, 31140, 26421, -371, -26853, -30902, -9135, 20264, 32733, 17856, -11939, -31760, -25049, 2589, 28063, 30092, 6981, -21963, -32558, -15955, 13978, 32232, 23559, -4797, -29146, -29146, -4797, 23559, 32232, 13978, -15955, -32558, -21963, 6981, 30092, 28063, 2589, -25049, -31760, -11939, 17856, 32733, 20264, -9135, -30902, -26853, -371, 26421, 31140, 9843, -19677, -32759, -18473, 11245, 31569, 25519, -1851, -27675, -30378, -7704, 21406, 32633, 16596, -13305, -32092, -24068, 4062, 28799, 29475, 5527, -23039, -32358, -14645, 15303, 32466, 22506, -6257, -29792, -28439, -3327, 24564, 31933, 12624, -17232, -32692, -20841, 8421, 30647, 27270, 1110, -25978, -31363, -10548, 19079}, +{32767, 17856, -13305, -32358, -21963, 8421, 31140, 25519, -3327, -29146, -28439, -1851, 26421, 30647, 6981, -23039, -32092, -11939, 19079, 32733, 16596, -14645, -32558, -20841, 9843, 31569, 24564, -4797, -29792, -27675, -371, 27270, 30092, 5527, -24068, -31760, -10548, 20264, 32633, 15303, -15955, -32692, -19677, 11245, 31933, 23559, -6257, -30378, -26853, 1110, 28063, 29475, 4062, -25049, -31363, -9135, 21406, 32466, 13978, -17232, -32759, -18473, 12624, 32232, 22506, -7704, -30902, -25978, 2589, 28799, 28799, 2589, -25978, -30902, -7704, 22506, 32232, 12624, -18473, -32759, -17232, 13978, 32466, 21406, -9135, -31363, -25049, 4062, 29475, 28063, 1110, -26853, -30378, -6257, 23559, 31933, 11245, -19677, -32692, -15955, 15303, 32633, 20264, -10548, -31760, -24068, 5527, 30092, 27270, -371, -27675, -29792, -4797, 24564, 31569, 9843, -20841, -32558, -14645, 16596, 32733, 19079, -11939, -32092, -23039, 6981, 30647, 26421, -1851, -28439, -29146, -3327, 25519, 31140, 8421, -21963, -32358, -13305, 17856}, +{32767, 16596, -15955, -32759, -17232, 15303, 32733, 17856, -14645, -32692, -18473, 13978, 32633, 19079, -13305, -32558, -19677, 12624, 32466, 20264, -11939, -32358, -20841, 11245, 32232, 21406, -10548, -32092, -21963, 9843, 31933, 22506, -9135, -31760, -23039, 8421, 31569, 23559, -7704, -31363, -24068, 6981, 31140, 24564, -6257, -30902, -25049, 5527, 30647, 25519, -4797, -30378, -25978, 4062, 30092, 26421, -3327, -29792, -26853, 2589, 29475, 27270, -1851, -29146, -27675, 1110, 28799, 28063, -371, -28439, -28439, -371, 28063, 28799, 1110, -27675, -29146, -1851, 27270, 29475, 2589, -26853, -29792, -3327, 26421, 30092, 4062, -25978, -30378, -4797, 25519, 30647, 5527, -25049, -30902, -6257, 24564, 31140, 6981, -24068, -31363, -7704, 23559, 31569, 8421, -23039, -31760, -9135, 22506, 31933, 9843, -21963, -32092, -10548, 21406, 32232, 11245, -20841, -32358, -11939, 20264, 32466, 12624, -19677, -32558, -13305, 19079, 32633, 13978, -18473, -32692, -14645, 17856, 32733, 15303, -17232, -32759, -15955, 16596}, +{32767, 15303, -18473, -32558, -11939, 21406, 31933, 8421, -24068, -30902, -4797, 26421, 29475, 1110, -28439, -27675, 2589, 30092, 25519, -6257, -31363, -23039, 9843, 32232, 20264, -13305, -32692, -17232, 16596, 32733, 13978, -19677, -32358, -10548, 22506, 31569, 6981, -25049, -30378, -3327, 27270, 28799, -371, -29146, -26853, 4062, 30647, 24564, -7704, -31760, -21963, 11245, 32466, 19079, -14645, -32759, -15955, 17856, 32633, 12624, -20841, -32092, -9135, 23559, 31140, 5527, -25978, -29792, -1851, 28063, 28063, -1851, -29792, -25978, 5527, 31140, 23559, -9135, -32092, -20841, 12624, 32633, 17856, -15955, -32759, -14645, 19079, 32466, 11245, -21963, -31760, -7704, 24564, 30647, 4062, -26853, -29146, -371, 28799, 27270, -3327, -30378, -25049, 6981, 31569, 22506, -10548, -32358, -19677, 13978, 32733, 16596, -17232, -32692, -13305, 20264, 32232, 9843, -23039, -31363, -6257, 25519, 30092, 2589, -27675, -28439, 1110, 29475, 26421, -4797, -30902, -24068, 8421, 31933, 21406, -11939, -32558, -18473, 15303}, +{32767, 13978, -20841, -31760, -6257, 26421, 28799, -1851, -30378, -24068, 9843, 32466, 17856, -17232, -32558, -10548, 23559, 30647, 2589, -28439, -26853, 5527, 31569, 21406, -13305, -32759, -14645, 20264, 31933, 6981, -25978, -29146, 1110, 30092, 24564, -9135, -32358, -18473, 16596, 32633, 11245, -23039, -30902, -3327, 28063, 27270, -4797, -31363, -21963, 12624, 32733, 15303, -19677, -32092, -7704, 25519, 29475, -371, -29792, -25049, 8421, 32232, 19079, -15955, -32692, -11939, 22506, 31140, 4062, -27675, -27675, 4062, 31140, 22506, -11939, -32692, -15955, 19079, 32232, 8421, -25049, -29792, -371, 29475, 25519, -7704, -32092, -19677, 15303, 32733, 12624, -21963, -31363, -4797, 27270, 28063, -3327, -30902, -23039, 11245, 32633, 16596, -18473, -32358, -9135, 24564, 30092, 1110, -29146, -25978, 6981, 31933, 20264, -14645, -32759, -13305, 21406, 31569, 5527, -26853, -28439, 2589, 30647, 23559, -10548, -32558, -17232, 17856, 32466, 9843, -24068, -30378, -1851, 28799, 26421, -6257, -31760, -20841, 13978}, +{32767, 12624, -23039, -30378, -371, 30092, 23559, -11939, -32759, -13305, 22506, 30647, 1110, -29792, -24068, 11245, 32733, 13978, -21963, -30902, -1851, 29475, 24564, -10548, -32692, -14645, 21406, 31140, 2589, -29146, -25049, 9843, 32633, 15303, -20841, -31363, -3327, 28799, 25519, -9135, -32558, -15955, 20264, 31569, 4062, -28439, -25978, 8421, 32466, 16596, -19677, -31760, -4797, 28063, 26421, -7704, -32358, -17232, 19079, 31933, 5527, -27675, -26853, 6981, 32232, 17856, -18473, -32092, -6257, 27270, 27270, -6257, -32092, -18473, 17856, 32232, 6981, -26853, -27675, 5527, 31933, 19079, -17232, -32358, -7704, 26421, 28063, -4797, -31760, -19677, 16596, 32466, 8421, -25978, -28439, 4062, 31569, 20264, -15955, -32558, -9135, 25519, 28799, -3327, -31363, -20841, 15303, 32633, 9843, -25049, -29146, 2589, 31140, 21406, -14645, -32692, -10548, 24564, 29475, -1851, -30902, -21963, 13978, 32733, 11245, -24068, -29792, 1110, 30647, 22506, -13305, -32759, -11939, 23559, 30092, -371, -30378, -23039, 12624}, +{32767, 11245, -25049, -28439, 5527, 32232, 16596, -20841, -30902, -371, 30647, 21406, -15955, -32358, -6257, 28063, 25519, -10548, -32759, -11939, 24564, 28799, -4797, -32092, -17232, 20264, 31140, 1110, -30378, -21963, 15303, 32466, 6981, -27675, -25978, 9843, 32733, 12624, -24068, -29146, 4062, 31933, 17856, -19677, -31363, -1851, 30092, 22506, -14645, -32558, -7704, 27270, 26421, -9135, -32692, -13305, 23559, 29475, -3327, -31760, -18473, 19079, 31569, 2589, -29792, -23039, 13978, 32633, 8421, -26853, -26853, 8421, 32633, 13978, -23039, -29792, 2589, 31569, 19079, -18473, -31760, -3327, 29475, 23559, -13305, -32692, -9135, 26421, 27270, -7704, -32558, -14645, 22506, 30092, -1851, -31363, -19677, 17856, 31933, 4062, -29146, -24068, 12624, 32733, 9843, -25978, -27675, 6981, 32466, 15303, -21963, -30378, 1110, 31140, 20264, -17232, -32092, -4797, 28799, 24564, -11939, -32759, -10548, 25519, 28063, -6257, -32358, -15955, 21406, 30647, -371, -30902, -20841, 16596, 32232, 5527, -28439, -25049, 11245}, +{32767, 9843, -26853, -25978, 11245, 32733, 8421, -27675, -25049, 12624, 32633, 6981, -28439, -24068, 13978, 32466, 5527, -29146, -23039, 15303, 32232, 4062, -29792, -21963, 16596, 31933, 2589, -30378, -20841, 17856, 31569, 1110, -30902, -19677, 19079, 31140, -371, -31363, -18473, 20264, 30647, -1851, -31760, -17232, 21406, 30092, -3327, -32092, -15955, 22506, 29475, -4797, -32358, -14645, 23559, 28799, -6257, -32558, -13305, 24564, 28063, -7704, -32692, -11939, 25519, 27270, -9135, -32759, -10548, 26421, 26421, -10548, -32759, -9135, 27270, 25519, -11939, -32692, -7704, 28063, 24564, -13305, -32558, -6257, 28799, 23559, -14645, -32358, -4797, 29475, 22506, -15955, -32092, -3327, 30092, 21406, -17232, -31760, -1851, 30647, 20264, -18473, -31363, -371, 31140, 19079, -19677, -30902, 1110, 31569, 17856, -20841, -30378, 2589, 31933, 16596, -21963, -29792, 4062, 32232, 15303, -23039, -29146, 5527, 32466, 13978, -24068, -28439, 6981, 32633, 12624, -25049, -27675, 8421, 32733, 11245, -25978, -26853, 9843}, +{32767, 8421, -28439, -23039, 16596, 31569, -371, -31760, -15955, 23559, 28063, -9135, -32759, -7704, 28799, 22506, -17232, -31363, 1110, 31933, 15303, -24068, -27675, 9843, 32733, 6981, -29146, -21963, 17856, 31140, -1851, -32092, -14645, 24564, 27270, -10548, -32692, -6257, 29475, 21406, -18473, -30902, 2589, 32232, 13978, -25049, -26853, 11245, 32633, 5527, -29792, -20841, 19079, 30647, -3327, -32358, -13305, 25519, 26421, -11939, -32558, -4797, 30092, 20264, -19677, -30378, 4062, 32466, 12624, -25978, -25978, 12624, 32466, 4062, -30378, -19677, 20264, 30092, -4797, -32558, -11939, 26421, 25519, -13305, -32358, -3327, 30647, 19079, -20841, -29792, 5527, 32633, 11245, -26853, -25049, 13978, 32232, 2589, -30902, -18473, 21406, 29475, -6257, -32692, -10548, 27270, 24564, -14645, -32092, -1851, 31140, 17856, -21963, -29146, 6981, 32733, 9843, -27675, -24068, 15303, 31933, 1110, -31363, -17232, 22506, 28799, -7704, -32759, -9135, 28063, 23559, -15955, -31760, -371, 31569, 16596, -23039, -28439, 8421}, +{32767, 6981, -29792, -19677, 21406, 28799, -9135, -32692, -4797, 30647, 17856, -23039, -27675, 11245, 32466, 2589, -31363, -15955, 24564, 26421, -13305, -32092, -371, 31933, 13978, -25978, -25049, 15303, 31569, -1851, -32358, -11939, 27270, 23559, -17232, -30902, 4062, 32633, 9843, -28439, -21963, 19079, 30092, -6257, -32759, -7704, 29475, 20264, -20841, -29146, 8421, 32733, 5527, -30378, -18473, 22506, 28063, -10548, -32558, -3327, 31140, 16596, -24068, -26853, 12624, 32232, 1110, -31760, -14645, 25519, 25519, -14645, -31760, 1110, 32232, 12624, -26853, -24068, 16596, 31140, -3327, -32558, -10548, 28063, 22506, -18473, -30378, 5527, 32733, 8421, -29146, -20841, 20264, 29475, -7704, -32759, -6257, 30092, 19079, -21963, -28439, 9843, 32633, 4062, -30902, -17232, 23559, 27270, -11939, -32358, -1851, 31569, 15303, -25049, -25978, 13978, 31933, -371, -32092, -13305, 26421, 24564, -15955, -31363, 2589, 32466, 11245, -27675, -23039, 17856, 30647, -4797, -32692, -9135, 28799, 21406, -19677, -29792, 6981}, +{32767, 5527, -30902, -15955, 25519, 24564, -17232, -30378, 6981, 32733, 4062, -31363, -14645, 26421, 23559, -18473, -29792, 8421, 32633, 2589, -31760, -13305, 27270, 22506, -19677, -29146, 9843, 32466, 1110, -32092, -11939, 28063, 21406, -20841, -28439, 11245, 32232, -371, -32358, -10548, 28799, 20264, -21963, -27675, 12624, 31933, -1851, -32558, -9135, 29475, 19079, -23039, -26853, 13978, 31569, -3327, -32692, -7704, 30092, 17856, -24068, -25978, 15303, 31140, -4797, -32759, -6257, 30647, 16596, -25049, -25049, 16596, 30647, -6257, -32759, -4797, 31140, 15303, -25978, -24068, 17856, 30092, -7704, -32692, -3327, 31569, 13978, -26853, -23039, 19079, 29475, -9135, -32558, -1851, 31933, 12624, -27675, -21963, 20264, 28799, -10548, -32358, -371, 32232, 11245, -28439, -20841, 21406, 28063, -11939, -32092, 1110, 32466, 9843, -29146, -19677, 22506, 27270, -13305, -31760, 2589, 32633, 8421, -29792, -18473, 23559, 26421, -14645, -31363, 4062, 32733, 6981, -30378, -17232, 24564, 25519, -15955, -30902, 5527}, +{32767, 4062, -31760, -11939, 28799, 19079, -24068, -25049, 17856, 29475, -10548, -32092, 2589, 32733, 5527, -31363, -13305, 28063, 20264, -23039, -25978, 16596, 30092, -9135, -32358, 1110, 32633, 6981, -30902, -14645, 27270, 21406, -21963, -26853, 15303, 30647, -7704, -32558, -371, 32466, 8421, -30378, -15955, 26421, 22506, -20841, -27675, 13978, 31140, -6257, -32692, -1851, 32232, 9843, -29792, -17232, 25519, 23559, -19677, -28439, 12624, 31569, -4797, -32759, -3327, 31933, 11245, -29146, -18473, 24564, 24564, -18473, -29146, 11245, 31933, -3327, -32759, -4797, 31569, 12624, -28439, -19677, 23559, 25519, -17232, -29792, 9843, 32232, -1851, -32692, -6257, 31140, 13978, -27675, -20841, 22506, 26421, -15955, -30378, 8421, 32466, -371, -32558, -7704, 30647, 15303, -26853, -21963, 21406, 27270, -14645, -30902, 6981, 32633, 1110, -32358, -9135, 30092, 16596, -25978, -23039, 20264, 28063, -13305, -31363, 5527, 32733, 2589, -32092, -10548, 29475, 17856, -25049, -24068, 19079, 28799, -11939, -31760, 4062}, +{32767, 2589, -32358, -7704, 31140, 12624, -29146, -17232, 26421, 21406, -23039, -25049, 19079, 28063, -14645, -30378, 9843, 31933, -4797, -32692, -371, 32633, 5527, -31760, -10548, 30092, 15303, -27675, -19677, 24564, 23559, -20841, -26853, 16596, 29475, -11939, -31363, 6981, 32466, -1851, -32759, -3327, 32232, 8421, -30902, -13305, 28799, 17856, -25978, -21963, 22506, 25519, -18473, -28439, 13978, 30647, -9135, -32092, 4062, 32733, 1110, -32558, -6257, 31569, 11245, -29792, -15955, 27270, 20264, -24068, -24068, 20264, 27270, -15955, -29792, 11245, 31569, -6257, -32558, 1110, 32733, 4062, -32092, -9135, 30647, 13978, -28439, -18473, 25519, 22506, -21963, -25978, 17856, 28799, -13305, -30902, 8421, 32232, -3327, -32759, -1851, 32466, 6981, -31363, -11939, 29475, 16596, -26853, -20841, 23559, 24564, -19677, -27675, 15303, 30092, -10548, -31760, 5527, 32633, -371, -32692, -4797, 31933, 9843, -30378, -14645, 28063, 19079, -25049, -23039, 21406, 26421, -17232, -29146, 12624, 31140, -7704, -32358, 2589}, +{32767, 1110, -32692, -3327, 32466, 5527, -32092, -7704, 31569, 9843, -30902, -11939, 30092, 13978, -29146, -15955, 28063, 17856, -26853, -19677, 25519, 21406, -24068, -23039, 22506, 24564, -20841, -25978, 19079, 27270, -17232, -28439, 15303, 29475, -13305, -30378, 11245, 31140, -9135, -31760, 6981, 32232, -4797, -32558, 2589, 32733, -371, -32759, -1851, 32633, 4062, -32358, -6257, 31933, 8421, -31363, -10548, 30647, 12624, -29792, -14645, 28799, 16596, -27675, -18473, 26421, 20264, -25049, -21963, 23559, 23559, -21963, -25049, 20264, 26421, -18473, -27675, 16596, 28799, -14645, -29792, 12624, 30647, -10548, -31363, 8421, 31933, -6257, -32358, 4062, 32633, -1851, -32759, -371, 32733, 2589, -32558, -4797, 32232, 6981, -31760, -9135, 31140, 11245, -30378, -13305, 29475, 15303, -28439, -17232, 27270, 19079, -25978, -20841, 24564, 22506, -23039, -24068, 21406, 25519, -19677, -26853, 17856, 28063, -15955, -29146, 13978, 30092, -11939, -30902, 9843, 31569, -7704, -32092, 5527, 32466, -3327, -32692, 1110}, +{32767, -371, -32759, 1110, 32733, -1851, -32692, 2589, 32633, -3327, -32558, 4062, 32466, -4797, -32358, 5527, 32232, -6257, -32092, 6981, 31933, -7704, -31760, 8421, 31569, -9135, -31363, 9843, 31140, -10548, -30902, 11245, 30647, -11939, -30378, 12624, 30092, -13305, -29792, 13978, 29475, -14645, -29146, 15303, 28799, -15955, -28439, 16596, 28063, -17232, -27675, 17856, 27270, -18473, -26853, 19079, 26421, -19677, -25978, 20264, 25519, -20841, -25049, 21406, 24564, -21963, -24068, 22506, 23559, -23039, -23039, 23559, 22506, -24068, -21963, 24564, 21406, -25049, -20841, 25519, 20264, -25978, -19677, 26421, 19079, -26853, -18473, 27270, 17856, -27675, -17232, 28063, 16596, -28439, -15955, 28799, 15303, -29146, -14645, 29475, 13978, -29792, -13305, 30092, 12624, -30378, -11939, 30647, 11245, -30902, -10548, 31140, 9843, -31363, -9135, 31569, 8421, -31760, -7704, 31933, 6981, -32092, -6257, 32232, 5527, -32358, -4797, 32466, 4062, -32558, -3327, 32633, 2589, -32692, -1851, 32733, 1110, -32759, -371}, +{32767, -1851, -32558, 5527, 31933, -9135, -30902, 12624, 29475, -15955, -27675, 19079, 25519, -21963, -23039, 24564, 20264, -26853, -17232, 28799, 13978, -30378, -10548, 31569, 6981, -32358, -3327, 32733, -371, -32692, 4062, 32232, -7704, -31363, 11245, 30092, -14645, -28439, 17856, 26421, -20841, -24068, 23559, 21406, -25978, -18473, 28063, 15303, -29792, -11939, 31140, 8421, -32092, -4797, 32633, 1110, -32759, 2589, 32466, -6257, -31760, 9843, 30647, -13305, -29146, 16596, 27270, -19677, -25049, 22506, 22506, -25049, -19677, 27270, 16596, -29146, -13305, 30647, 9843, -31760, -6257, 32466, 2589, -32759, 1110, 32633, -4797, -32092, 8421, 31140, -11939, -29792, 15303, 28063, -18473, -25978, 21406, 23559, -24068, -20841, 26421, 17856, -28439, -14645, 30092, 11245, -31363, -7704, 32232, 4062, -32692, -371, 32733, -3327, -32358, 6981, 31569, -10548, -30378, 13978, 28799, -17232, -26853, 20264, 24564, -23039, -21963, 25519, 19079, -27675, -15955, 29475, 12624, -30902, -9135, 31933, 5527, -32558, -1851}, +{32767, -3327, -32092, 9843, 30092, -15955, -26853, 21406, 22506, -25978, -17232, 29475, 11245, -31760, -4797, 32733, -1851, -32358, 8421, 30647, -14645, -27675, 20264, 23559, -25049, -18473, 28799, 12624, -31363, -6257, 32633, -371, -32558, 6981, 31140, -13305, -28439, 19079, 24564, -24068, -19677, 28063, 13978, -30902, -7704, 32466, 1110, -32692, 5527, 31569, -11939, -29146, 17856, 25519, -23039, -20841, 27270, 15303, -30378, -9135, 32232, 2589, -32759, 4062, 31933, -10548, -29792, 16596, 26421, -21963, -21963, 26421, 16596, -29792, -10548, 31933, 4062, -32759, 2589, 32232, -9135, -30378, 15303, 27270, -20841, -23039, 25519, 17856, -29146, -11939, 31569, 5527, -32692, 1110, 32466, -7704, -30902, 13978, 28063, -19677, -24068, 24564, 19079, -28439, -13305, 31140, 6981, -32558, -371, 32633, -6257, -31363, 12624, 28799, -18473, -25049, 23559, 20264, -27675, -14645, 30647, 8421, -32358, -1851, 32733, -4797, -31760, 11245, 29475, -17232, -25978, 22506, 21406, -26853, -15955, 30092, 9843, -32092, -3327}, +{32767, -4797, -31363, 13978, 27270, -21963, -20841, 28063, 12624, -31760, -3327, 32733, -6257, -30902, 15303, 26421, -23039, -19677, 28799, 11245, -32092, -1851, 32633, -7704, -30378, 16596, 25519, -24068, -18473, 29475, 9843, -32358, -371, 32466, -9135, -29792, 17856, 24564, -25049, -17232, 30092, 8421, -32558, 1110, 32232, -10548, -29146, 19079, 23559, -25978, -15955, 30647, 6981, -32692, 2589, 31933, -11939, -28439, 20264, 22506, -26853, -14645, 31140, 5527, -32759, 4062, 31569, -13305, -27675, 21406, 21406, -27675, -13305, 31569, 4062, -32759, 5527, 31140, -14645, -26853, 22506, 20264, -28439, -11939, 31933, 2589, -32692, 6981, 30647, -15955, -25978, 23559, 19079, -29146, -10548, 32232, 1110, -32558, 8421, 30092, -17232, -25049, 24564, 17856, -29792, -9135, 32466, -371, -32358, 9843, 29475, -18473, -24068, 25519, 16596, -30378, -7704, 32633, -1851, -32092, 11245, 28799, -19677, -23039, 26421, 15303, -30902, -6257, 32733, -3327, -31760, 12624, 28063, -20841, -21963, 27270, 13978, -31363, -4797}, +{32767, -6257, -30378, 17856, 23559, -26853, -13305, 31933, 1110, -32358, 11245, 28063, -21963, -19677, 29475, 8421, -32692, 4062, 31140, -15955, -25049, 25519, 15303, -31363, -3327, 32633, -9135, -29146, 20264, 21406, -28439, -10548, 32466, -1851, -31760, 13978, 26421, -24068, -17232, 30647, 5527, -32759, 6981, 30092, -18473, -23039, 27270, 12624, -32092, -371, 32232, -11939, -27675, 22506, 19079, -29792, -7704, 32733, -4797, -30902, 16596, 24564, -25978, -14645, 31569, 2589, -32558, 9843, 28799, -20841, -20841, 28799, 9843, -32558, 2589, 31569, -14645, -25978, 24564, 16596, -30902, -4797, 32733, -7704, -29792, 19079, 22506, -27675, -11939, 32232, -371, -32092, 12624, 27270, -23039, -18473, 30092, 6981, -32759, 5527, 30647, -17232, -24068, 26421, 13978, -31760, -1851, 32466, -10548, -28439, 21406, 20264, -29146, -9135, 32633, -3327, -31363, 15303, 25519, -25049, -15955, 31140, 4062, -32692, 8421, 29475, -19677, -21963, 28063, 11245, -32358, 1110, 31933, -13305, -26853, 23559, 17856, -30378, -6257}, +{32767, -7704, -29146, 21406, 19079, -30378, -4797, 32633, -10548, -27675, 23559, 16596, -31363, -1851, 32232, -13305, -25978, 25519, 13978, -32092, 1110, 31569, -15955, -24068, 27270, 11245, -32558, 4062, 30647, -18473, -21963, 28799, 8421, -32759, 6981, 29475, -20841, -19677, 30092, 5527, -32692, 9843, 28063, -23039, -17232, 31140, 2589, -32358, 12624, 26421, -25049, -14645, 31933, -371, -31760, 15303, 24564, -26853, -11939, 32466, -3327, -30902, 17856, 22506, -28439, -9135, 32733, -6257, -29792, 20264, 20264, -29792, -6257, 32733, -9135, -28439, 22506, 17856, -30902, -3327, 32466, -11939, -26853, 24564, 15303, -31760, -371, 31933, -14645, -25049, 26421, 12624, -32358, 2589, 31140, -17232, -23039, 28063, 9843, -32692, 5527, 30092, -19677, -20841, 29475, 6981, -32759, 8421, 28799, -21963, -18473, 30647, 4062, -32558, 11245, 27270, -24068, -15955, 31569, 1110, -32092, 13978, 25519, -25978, -13305, 32232, -1851, -31363, 16596, 23559, -27675, -10548, 32633, -4797, -30378, 19079, 21406, -29146, -7704}, +{32767, -9135, -27675, 24564, 13978, -32358, 4062, 30092, -20841, -18473, 31140, 1110, -31760, 16596, 22506, -29146, -6257, 32633, -11939, -25978, 26421, 11245, -32692, 6981, 28799, -23039, -15955, 31933, -1851, -30902, 19079, 20264, -30378, -3327, 32232, -14645, -24068, 28063, 8421, -32759, 9843, 27270, -25049, -13305, 32466, -4797, -29792, 21406, 17856, -31363, -371, 31569, -17232, -21963, 29475, 5527, -32558, 12624, 25519, -26853, -10548, 32733, -7704, -28439, 23559, 15303, -32092, 2589, 30647, -19677, -19677, 30647, 2589, -32092, 15303, 23559, -28439, -7704, 32733, -10548, -26853, 25519, 12624, -32558, 5527, 29475, -21963, -17232, 31569, -371, -31363, 17856, 21406, -29792, -4797, 32466, -13305, -25049, 27270, 9843, -32759, 8421, 28063, -24068, -14645, 32232, -3327, -30378, 20264, 19079, -30902, -1851, 31933, -15955, -23039, 28799, 6981, -32692, 11245, 26421, -25978, -11939, 32633, -6257, -29146, 22506, 16596, -31760, 1110, 31140, -18473, -20841, 30092, 4062, -32358, 13978, 24564, -27675, -9135}, +{32767, -10548, -25978, 27270, 8421, -32692, 12624, 24564, -28439, -6257, 32466, -14645, -23039, 29475, 4062, -32092, 16596, 21406, -30378, -1851, 31569, -18473, -19677, 31140, -371, -30902, 20264, 17856, -31760, 2589, 30092, -21963, -15955, 32232, -4797, -29146, 23559, 13978, -32558, 6981, 28063, -25049, -11939, 32733, -9135, -26853, 26421, 9843, -32759, 11245, 25519, -27675, -7704, 32633, -13305, -24068, 28799, 5527, -32358, 15303, 22506, -29792, -3327, 31933, -17232, -20841, 30647, 1110, -31363, 19079, 19079, -31363, 1110, 30647, -20841, -17232, 31933, -3327, -29792, 22506, 15303, -32358, 5527, 28799, -24068, -13305, 32633, -7704, -27675, 25519, 11245, -32759, 9843, 26421, -26853, -9135, 32733, -11939, -25049, 28063, 6981, -32558, 13978, 23559, -29146, -4797, 32232, -15955, -21963, 30092, 2589, -31760, 17856, 20264, -30902, -371, 31140, -19677, -18473, 31569, -1851, -30378, 21406, 16596, -32092, 4062, 29475, -23039, -14645, 32466, -6257, -28439, 24564, 12624, -32692, 8421, 27270, -25978, -10548}, +{32767, -11939, -24068, 29475, 2589, -31363, 20264, 16596, -32358, 6981, 27270, -26853, -7704, 32466, -15955, -20841, 31140, -1851, -29792, 23559, 12624, -32759, 11245, 24564, -29146, -3327, 31569, -19677, -17232, 32232, -6257, -27675, 26421, 8421, -32558, 15303, 21406, -30902, 1110, 30092, -23039, -13305, 32733, -10548, -25049, 28799, 4062, -31760, 19079, 17856, -32092, 5527, 28063, -25978, -9135, 32633, -14645, -21963, 30647, -371, -30378, 22506, 13978, -32692, 9843, 25519, -28439, -4797, 31933, -18473, -18473, 31933, -4797, -28439, 25519, 9843, -32692, 13978, 22506, -30378, -371, 30647, -21963, -14645, 32633, -9135, -25978, 28063, 5527, -32092, 17856, 19079, -31760, 4062, 28799, -25049, -10548, 32733, -13305, -23039, 30092, 1110, -30902, 21406, 15303, -32558, 8421, 26421, -27675, -6257, 32232, -17232, -19677, 31569, -3327, -29146, 24564, 11245, -32759, 12624, 23559, -29792, -1851, 31140, -20841, -15955, 32466, -7704, -26853, 27270, 6981, -32358, 16596, 20264, -31363, 2589, 29475, -24068, -11939}, +{32767, -13305, -21963, 31140, -3327, -28439, 26421, 6981, -32092, 19079, 16596, -32558, 9843, 24564, -29792, -371, 30092, -24068, -10548, 32633, -15955, -19677, 31933, -6257, -26853, 28063, 4062, -31363, 21406, 13978, -32759, 12624, 22506, -30902, 2589, 28799, -25978, -7704, 32232, -18473, -17232, 32466, -9135, -25049, 29475, 1110, -30378, 23559, 11245, -32692, 15303, 20264, -31760, 5527, 27270, -27675, -4797, 31569, -20841, -14645, 32733, -11939, -23039, 30647, -1851, -29146, 25519, 8421, -32358, 17856, 17856, -32358, 8421, 25519, -29146, -1851, 30647, -23039, -11939, 32733, -14645, -20841, 31569, -4797, -27675, 27270, 5527, -31760, 20264, 15303, -32692, 11245, 23559, -30378, 1110, 29475, -25049, -9135, 32466, -17232, -18473, 32232, -7704, -25978, 28799, 2589, -30902, 22506, 12624, -32759, 13978, 21406, -31363, 4062, 28063, -26853, -6257, 31933, -19677, -15955, 32633, -10548, -24068, 30092, -371, -29792, 24564, 9843, -32558, 16596, 19079, -32092, 6981, 26421, -28439, -3327, 31140, -21963, -13305}, +{32767, -14645, -19677, 32232, -9135, -24068, 30647, -3327, -27675, 28063, 2589, -30378, 24564, 8421, -32092, 20264, 13978, -32759, 15303, 19079, -32358, 9843, 23559, -30902, 4062, 27270, -28439, -1851, 30092, -25049, -7704, 31933, -20841, -13305, 32733, -15955, -18473, 32466, -10548, -23039, 31140, -4797, -26853, 28799, 1110, -29792, 25519, 6981, -31760, 21406, 12624, -32692, 16596, 17856, -32558, 11245, 22506, -31363, 5527, 26421, -29146, -371, 29475, -25978, -6257, 31569, -21963, -11939, 32633, -17232, -17232, 32633, -11939, -21963, 31569, -6257, -25978, 29475, -371, -29146, 26421, 5527, -31363, 22506, 11245, -32558, 17856, 16596, -32692, 12624, 21406, -31760, 6981, 25519, -29792, 1110, 28799, -26853, -4797, 31140, -23039, -10548, 32466, -18473, -15955, 32733, -13305, -20841, 31933, -7704, -25049, 30092, -1851, -28439, 27270, 4062, -30902, 23559, 9843, -32358, 19079, 15303, -32759, 13978, 20264, -32092, 8421, 24564, -30378, 2589, 28063, -27675, -3327, 30647, -24068, -9135, 32232, -19677, -14645}, +{32767, -15955, -17232, 32733, -14645, -18473, 32633, -13305, -19677, 32466, -11939, -20841, 32232, -10548, -21963, 31933, -9135, -23039, 31569, -7704, -24068, 31140, -6257, -25049, 30647, -4797, -25978, 30092, -3327, -26853, 29475, -1851, -27675, 28799, -371, -28439, 28063, 1110, -29146, 27270, 2589, -29792, 26421, 4062, -30378, 25519, 5527, -30902, 24564, 6981, -31363, 23559, 8421, -31760, 22506, 9843, -32092, 21406, 11245, -32358, 20264, 12624, -32558, 19079, 13978, -32692, 17856, 15303, -32759, 16596, 16596, -32759, 15303, 17856, -32692, 13978, 19079, -32558, 12624, 20264, -32358, 11245, 21406, -32092, 9843, 22506, -31760, 8421, 23559, -31363, 6981, 24564, -30902, 5527, 25519, -30378, 4062, 26421, -29792, 2589, 27270, -29146, 1110, 28063, -28439, -371, 28799, -27675, -1851, 29475, -26853, -3327, 30092, -25978, -4797, 30647, -25049, -6257, 31140, -24068, -7704, 31569, -23039, -9135, 31933, -21963, -10548, 32232, -20841, -11939, 32466, -19677, -13305, 32633, -18473, -14645, 32733, -17232, -15955}, +{32767, -17232, -14645, 32633, -19677, -11939, 32232, -21963, -9135, 31569, -24068, -6257, 30647, -25978, -3327, 29475, -27675, -371, 28063, -29146, 2589, 26421, -30378, 5527, 24564, -31363, 8421, 22506, -32092, 11245, 20264, -32558, 13978, 17856, -32759, 16596, 15303, -32692, 19079, 12624, -32358, 21406, 9843, -31760, 23559, 6981, -30902, 25519, 4062, -29792, 27270, 1110, -28439, 28799, -1851, -26853, 30092, -4797, -25049, 31140, -7704, -23039, 31933, -10548, -20841, 32466, -13305, -18473, 32733, -15955, -15955, 32733, -18473, -13305, 32466, -20841, -10548, 31933, -23039, -7704, 31140, -25049, -4797, 30092, -26853, -1851, 28799, -28439, 1110, 27270, -29792, 4062, 25519, -30902, 6981, 23559, -31760, 9843, 21406, -32358, 12624, 19079, -32692, 15303, 16596, -32759, 17856, 13978, -32558, 20264, 11245, -32092, 22506, 8421, -31363, 24564, 5527, -30378, 26421, 2589, -29146, 28063, -371, -27675, 29475, -3327, -25978, 30647, -6257, -24068, 31569, -9135, -21963, 32232, -11939, -19677, 32633, -14645, -17232}, +{32767, -18473, -11939, 31933, -24068, -4797, 29475, -28439, 2589, 25519, -31363, 9843, 20264, -32692, 16596, 13978, -32358, 22506, 6981, -30378, 27270, -371, -26853, 30647, -7704, -21963, 32466, -14645, -15955, 32633, -20841, -9135, 31140, -25978, -1851, 28063, -29792, 5527, 23559, -32092, 12624, 17856, -32759, 19079, 11245, -31760, 24564, 4062, -29146, 28799, -3327, -25049, 31569, -10548, -19677, 32733, -17232, -13305, 32232, -23039, -6257, 30092, -27675, 1110, 26421, -30902, 8421, 21406, -32558, 15303, 15303, -32558, 21406, 8421, -30902, 26421, 1110, -27675, 30092, -6257, -23039, 32232, -13305, -17232, 32733, -19677, -10548, 31569, -25049, -3327, 28799, -29146, 4062, 24564, -31760, 11245, 19079, -32759, 17856, 12624, -32092, 23559, 5527, -29792, 28063, -1851, -25978, 31140, -9135, -20841, 32633, -15955, -14645, 32466, -21963, -7704, 30647, -26853, -371, 27270, -30378, 6981, 22506, -32358, 13978, 16596, -32692, 20264, 9843, -31363, 25519, 2589, -28439, 29475, -4797, -24068, 31933, -11939, -18473}, +{32767, -19677, -9135, 30647, -27675, 2589, 24564, -32092, 13978, 15303, -32358, 23559, 4062, -28439, 30092, -7704, -20841, 32733, -18473, -10548, 31140, -26853, 1110, 25519, -31760, 12624, 16596, -32558, 22506, 5527, -29146, 29475, -6257, -21963, 32633, -17232, -11939, 31569, -25978, -371, 26421, -31363, 11245, 17856, -32692, 21406, 6981, -29792, 28799, -4797, -23039, 32466, -15955, -13305, 31933, -25049, -1851, 27270, -30902, 9843, 19079, -32759, 20264, 8421, -30378, 28063, -3327, -24068, 32232, -14645, -14645, 32232, -24068, -3327, 28063, -30378, 8421, 20264, -32759, 19079, 9843, -30902, 27270, -1851, -25049, 31933, -13305, -15955, 32466, -23039, -4797, 28799, -29792, 6981, 21406, -32692, 17856, 11245, -31363, 26421, -371, -25978, 31569, -11939, -17232, 32633, -21963, -6257, 29475, -29146, 5527, 22506, -32558, 16596, 12624, -31760, 25519, 1110, -26853, 31140, -10548, -18473, 32733, -20841, -7704, 30092, -28439, 4062, 23559, -32358, 15303, 13978, -32092, 24564, 2589, -27675, 30647, -9135, -19677}, +{32767, -20841, -6257, 28799, -30378, 9843, 17856, -32558, 23559, 2589, -26853, 31569, -13305, -14645, 31933, -25978, 1110, 24564, -32358, 16596, 11245, -30902, 28063, -4797, -21963, 32733, -19677, -7704, 29475, -29792, 8421, 19079, -32692, 22506, 4062, -27675, 31140, -11939, -15955, 32232, -25049, -371, 25519, -32092, 15303, 12624, -31363, 27270, -3327, -23039, 32633, -18473, -9135, 30092, -29146, 6981, 20264, -32759, 21406, 5527, -28439, 30647, -10548, -17232, 32466, -24068, -1851, 26421, -31760, 13978, 13978, -31760, 26421, -1851, -24068, 32466, -17232, -10548, 30647, -28439, 5527, 21406, -32759, 20264, 6981, -29146, 30092, -9135, -18473, 32633, -23039, -3327, 27270, -31363, 12624, 15303, -32092, 25519, -371, -25049, 32232, -15955, -11939, 31140, -27675, 4062, 22506, -32692, 19079, 8421, -29792, 29475, -7704, -19677, 32733, -21963, -4797, 28063, -30902, 11245, 16596, -32358, 24564, 1110, -25978, 31933, -14645, -13305, 31569, -26853, 2589, 23559, -32558, 17856, 9843, -30378, 28799, -6257, -20841}, +{32767, -21963, -3327, 26421, -32092, 16596, 9843, -29792, 30092, -10548, -15955, 31933, -26853, 4062, 21406, -32759, 22506, 2589, -25978, 32232, -17232, -9135, 29475, -30378, 11245, 15303, -31760, 27270, -4797, -20841, 32733, -23039, -1851, 25519, -32358, 17856, 8421, -29146, 30647, -11939, -14645, 31569, -27675, 5527, 20264, -32692, 23559, 1110, -25049, 32466, -18473, -7704, 28799, -30902, 12624, 13978, -31363, 28063, -6257, -19677, 32633, -24068, -371, 24564, -32558, 19079, 6981, -28439, 31140, -13305, -13305, 31140, -28439, 6981, 19079, -32558, 24564, -371, -24068, 32633, -19677, -6257, 28063, -31363, 13978, 12624, -30902, 28799, -7704, -18473, 32466, -25049, 1110, 23559, -32692, 20264, 5527, -27675, 31569, -14645, -11939, 30647, -29146, 8421, 17856, -32358, 25519, -1851, -23039, 32733, -20841, -4797, 27270, -31760, 15303, 11245, -30378, 29475, -9135, -17232, 32232, -25978, 2589, 22506, -32759, 21406, 4062, -26853, 31933, -15955, -10548, 30092, -29792, 9843, 16596, -32092, 26421, -3327, -21963}, +{32767, -23039, -371, 23559, -32759, 22506, 1110, -24068, 32733, -21963, -1851, 24564, -32692, 21406, 2589, -25049, 32633, -20841, -3327, 25519, -32558, 20264, 4062, -25978, 32466, -19677, -4797, 26421, -32358, 19079, 5527, -26853, 32232, -18473, -6257, 27270, -32092, 17856, 6981, -27675, 31933, -17232, -7704, 28063, -31760, 16596, 8421, -28439, 31569, -15955, -9135, 28799, -31363, 15303, 9843, -29146, 31140, -14645, -10548, 29475, -30902, 13978, 11245, -29792, 30647, -13305, -11939, 30092, -30378, 12624, 12624, -30378, 30092, -11939, -13305, 30647, -29792, 11245, 13978, -30902, 29475, -10548, -14645, 31140, -29146, 9843, 15303, -31363, 28799, -9135, -15955, 31569, -28439, 8421, 16596, -31760, 28063, -7704, -17232, 31933, -27675, 6981, 17856, -32092, 27270, -6257, -18473, 32232, -26853, 5527, 19079, -32358, 26421, -4797, -19677, 32466, -25978, 4062, 20264, -32558, 25519, -3327, -20841, 32633, -25049, 2589, 21406, -32692, 24564, -1851, -21963, 32733, -24068, 1110, 22506, -32759, 23559, -371, -23039}, +{32767, -24068, 2589, 20264, -32358, 27270, -7704, -15955, 31140, -29792, 12624, 11245, -29146, 31569, -17232, -6257, 26421, -32558, 21406, 1110, -23039, 32733, -25049, 4062, 19079, -32092, 28063, -9135, -14645, 30647, -30378, 13978, 9843, -28439, 31933, -18473, -4797, 25519, -32692, 22506, -371, -21963, 32633, -25978, 5527, 17856, -31760, 28799, -10548, -13305, 30092, -30902, 15303, 8421, -27675, 32232, -19677, -3327, 24564, -32759, 23559, -1851, -20841, 32466, -26853, 6981, 16596, -31363, 29475, -11939, -11939, 29475, -31363, 16596, 6981, -26853, 32466, -20841, -1851, 23559, -32759, 24564, -3327, -19677, 32232, -27675, 8421, 15303, -30902, 30092, -13305, -10548, 28799, -31760, 17856, 5527, -25978, 32633, -21963, -371, 22506, -32692, 25519, -4797, -18473, 31933, -28439, 9843, 13978, -30378, 30647, -14645, -9135, 28063, -32092, 19079, 4062, -25049, 32733, -23039, 1110, 21406, -32558, 26421, -6257, -17232, 31569, -29146, 11245, 12624, -29792, 31140, -15955, -7704, 27270, -32358, 20264, 2589, -24068}, +{32767, -25049, 5527, 16596, -30902, 30647, -15955, -6257, 25519, -32759, 24564, -4797, -17232, 31140, -30378, 15303, 6981, -25978, 32733, -24068, 4062, 17856, -31363, 30092, -14645, -7704, 26421, -32692, 23559, -3327, -18473, 31569, -29792, 13978, 8421, -26853, 32633, -23039, 2589, 19079, -31760, 29475, -13305, -9135, 27270, -32558, 22506, -1851, -19677, 31933, -29146, 12624, 9843, -27675, 32466, -21963, 1110, 20264, -32092, 28799, -11939, -10548, 28063, -32358, 21406, -371, -20841, 32232, -28439, 11245, 11245, -28439, 32232, -20841, -371, 21406, -32358, 28063, -10548, -11939, 28799, -32092, 20264, 1110, -21963, 32466, -27675, 9843, 12624, -29146, 31933, -19677, -1851, 22506, -32558, 27270, -9135, -13305, 29475, -31760, 19079, 2589, -23039, 32633, -26853, 8421, 13978, -29792, 31569, -18473, -3327, 23559, -32692, 26421, -7704, -14645, 30092, -31363, 17856, 4062, -24068, 32733, -25978, 6981, 15303, -30378, 31140, -17232, -4797, 24564, -32759, 25519, -6257, -15955, 30647, -30902, 16596, 5527, -25049}, +{32767, -25978, 8421, 12624, -28439, 32466, -23039, 4062, 16596, -30378, 31569, -19677, -371, 20264, -31760, 30092, -15955, -4797, 23559, -32558, 28063, -11939, -9135, 26421, -32759, 25519, -7704, -13305, 28799, -32358, 22506, -3327, -17232, 30647, -31363, 19079, 1110, -20841, 31933, -29792, 15303, 5527, -24068, 32633, -27675, 11245, 9843, -26853, 32733, -25049, 6981, 13978, -29146, 32232, -21963, 2589, 17856, -30902, 31140, -18473, -1851, 21406, -32092, 29475, -14645, -6257, 24564, -32692, 27270, -10548, -10548, 27270, -32692, 24564, -6257, -14645, 29475, -32092, 21406, -1851, -18473, 31140, -30902, 17856, 2589, -21963, 32232, -29146, 13978, 6981, -25049, 32733, -26853, 9843, 11245, -27675, 32633, -24068, 5527, 15303, -29792, 31933, -20841, 1110, 19079, -31363, 30647, -17232, -3327, 22506, -32358, 28799, -13305, -7704, 25519, -32759, 26421, -9135, -11939, 28063, -32558, 23559, -4797, -15955, 30092, -31760, 20264, -371, -19677, 31569, -30378, 16596, 4062, -23039, 32466, -28439, 12624, 8421, -25978}, +{32767, -26853, 11245, 8421, -25049, 32633, -28439, 13978, 5527, -23039, 32232, -29792, 16596, 2589, -20841, 31569, -30902, 19079, -371, -18473, 30647, -31760, 21406, -3327, -15955, 29475, -32358, 23559, -6257, -13305, 28063, -32692, 25519, -9135, -10548, 26421, -32759, 27270, -11939, -7704, 24564, -32558, 28799, -14645, -4797, 22506, -32092, 30092, -17232, -1851, 20264, -31363, 31140, -19677, 1110, 17856, -30378, 31933, -21963, 4062, 15303, -29146, 32466, -24068, 6981, 12624, -27675, 32733, -25978, 9843, 9843, -25978, 32733, -27675, 12624, 6981, -24068, 32466, -29146, 15303, 4062, -21963, 31933, -30378, 17856, 1110, -19677, 31140, -31363, 20264, -1851, -17232, 30092, -32092, 22506, -4797, -14645, 28799, -32558, 24564, -7704, -11939, 27270, -32759, 26421, -10548, -9135, 25519, -32692, 28063, -13305, -6257, 23559, -32358, 29475, -15955, -3327, 21406, -31760, 30647, -18473, -371, 19079, -30902, 31569, -20841, 2589, 16596, -29792, 32232, -23039, 5527, 13978, -28439, 32633, -25049, 8421, 11245, -26853}, +{32767, -27675, 13978, 4062, -20841, 31140, -31760, 22506, -6257, -11939, 26421, -32692, 28799, -15955, -1851, 19079, -30378, 32232, -24068, 8421, 9843, -25049, 32466, -29792, 17856, -371, -17232, 29475, -32558, 25519, -10548, -7704, 23559, -32092, 30647, -19677, 2589, 15303, -28439, 32733, -26853, 12624, 5527, -21963, 31569, -31363, 21406, -4797, -13305, 27270, -32759, 28063, -14645, -3327, 20264, -30902, 31933, -23039, 6981, 11245, -25978, 32633, -29146, 16596, 1110, -18473, 30092, -32358, 24564, -9135, -9135, 24564, -32358, 30092, -18473, 1110, 16596, -29146, 32633, -25978, 11245, 6981, -23039, 31933, -30902, 20264, -3327, -14645, 28063, -32759, 27270, -13305, -4797, 21406, -31363, 31569, -21963, 5527, 12624, -26853, 32733, -28439, 15303, 2589, -19677, 30647, -32092, 23559, -7704, -10548, 25519, -32558, 29475, -17232, -371, 17856, -29792, 32466, -25049, 9843, 8421, -24068, 32232, -30378, 19079, -1851, -15955, 28799, -32692, 26421, -11939, -6257, 22506, -31760, 31140, -20841, 4062, 13978, -27675}, +{32767, -28439, 16596, -371, -15955, 28063, -32759, 28799, -17232, 1110, 15303, -27675, 32733, -29146, 17856, -1851, -14645, 27270, -32692, 29475, -18473, 2589, 13978, -26853, 32633, -29792, 19079, -3327, -13305, 26421, -32558, 30092, -19677, 4062, 12624, -25978, 32466, -30378, 20264, -4797, -11939, 25519, -32358, 30647, -20841, 5527, 11245, -25049, 32232, -30902, 21406, -6257, -10548, 24564, -32092, 31140, -21963, 6981, 9843, -24068, 31933, -31363, 22506, -7704, -9135, 23559, -31760, 31569, -23039, 8421, 8421, -23039, 31569, -31760, 23559, -9135, -7704, 22506, -31363, 31933, -24068, 9843, 6981, -21963, 31140, -32092, 24564, -10548, -6257, 21406, -30902, 32232, -25049, 11245, 5527, -20841, 30647, -32358, 25519, -11939, -4797, 20264, -30378, 32466, -25978, 12624, 4062, -19677, 30092, -32558, 26421, -13305, -3327, 19079, -29792, 32633, -26853, 13978, 2589, -18473, 29475, -32692, 27270, -14645, -1851, 17856, -29146, 32733, -27675, 15303, 1110, -17232, 28799, -32759, 28063, -15955, -371, 16596, -28439}, +{32767, -29146, 19079, -4797, -10548, 23559, -31363, 32232, -25978, 13978, 1110, -15955, 27270, -32558, 30647, -21963, 8421, 6981, -20841, 30092, -32692, 28063, -17232, 2589, 12624, -25049, 31933, -31760, 24564, -11939, -3327, 17856, -28439, 32733, -29792, 20264, -6257, -9135, 22506, -30902, 32466, -26853, 15303, -371, -14645, 26421, -32358, 31140, -23039, 9843, 5527, -19677, 29475, -32759, 28799, -18473, 4062, 11245, -24068, 31569, -32092, 25519, -13305, -1851, 16596, -27675, 32633, -30378, 21406, -7704, -7704, 21406, -30378, 32633, -27675, 16596, -1851, -13305, 25519, -32092, 31569, -24068, 11245, 4062, -18473, 28799, -32759, 29475, -19677, 5527, 9843, -23039, 31140, -32358, 26421, -14645, -371, 15303, -26853, 32466, -30902, 22506, -9135, -6257, 20264, -29792, 32733, -28439, 17856, -3327, -11939, 24564, -31760, 31933, -25049, 12624, 2589, -17232, 28063, -32692, 30092, -20841, 6981, 8421, -21963, 30647, -32558, 27270, -15955, 1110, 13978, -25978, 32232, -31363, 23559, -10548, -4797, 19079, -29146}, +{32767, -29792, 21406, -9135, -4797, 17856, -27675, 32466, -31363, 24564, -13305, -371, 13978, -25049, 31569, -32358, 27270, -17232, 4062, 9843, -21963, 30092, -32759, 29475, -20841, 8421, 5527, -18473, 28063, -32558, 31140, -24068, 12624, 1110, -14645, 25519, -31760, 32232, -26853, 16596, -3327, -10548, 22506, -30378, 32733, -29146, 20264, -7704, -6257, 19079, -28439, 32633, -30902, 23559, -11939, -1851, 15303, -25978, 31933, -32092, 26421, -15955, 2589, 11245, -23039, 30647, -32692, 28799, -19677, 6981, 6981, -19677, 28799, -32692, 30647, -23039, 11245, 2589, -15955, 26421, -32092, 31933, -25978, 15303, -1851, -11939, 23559, -30902, 32633, -28439, 19079, -6257, -7704, 20264, -29146, 32733, -30378, 22506, -10548, -3327, 16596, -26853, 32232, -31760, 25519, -14645, 1110, 12624, -24068, 31140, -32558, 28063, -18473, 5527, 8421, -20841, 29475, -32759, 30092, -21963, 9843, 4062, -17232, 27270, -32358, 31569, -25049, 13978, -371, -13305, 24564, -31363, 32466, -27675, 17856, -4797, -9135, 21406, -29792}, +{32767, -30378, 23559, -13305, 1110, 11245, -21963, 29475, -32692, 31140, -25049, 15303, -3327, -9135, 20264, -28439, 32466, -31760, 26421, -17232, 5527, 6981, -18473, 27270, -32092, 32232, -27675, 19079, -7704, -4797, 16596, -25978, 31569, -32558, 28799, -20841, 9843, 2589, -14645, 24564, -30902, 32733, -29792, 22506, -11939, -371, 12624, -23039, 30092, -32759, 30647, -24068, 13978, -1851, -10548, 21406, -29146, 32633, -31363, 25519, -15955, 4062, 8421, -19677, 28063, -32358, 31933, -26853, 17856, -6257, -6257, 17856, -26853, 31933, -32358, 28063, -19677, 8421, 4062, -15955, 25519, -31363, 32633, -29146, 21406, -10548, -1851, 13978, -24068, 30647, -32759, 30092, -23039, 12624, -371, -11939, 22506, -29792, 32733, -30902, 24564, -14645, 2589, 9843, -20841, 28799, -32558, 31569, -25978, 16596, -4797, -7704, 19079, -27675, 32232, -32092, 27270, -18473, 6981, 5527, -17232, 26421, -31760, 32466, -28439, 20264, -9135, -3327, 15303, -25049, 31140, -32692, 29475, -21963, 11245, 1110, -13305, 23559, -30378}, +{32767, -30902, 25519, -17232, 6981, 4062, -14645, 23559, -29792, 32633, -31760, 27270, -19677, 9843, 1110, -11939, 21406, -28439, 32232, -32358, 28799, -21963, 12624, -1851, -9135, 19079, -26853, 31569, -32692, 30092, -24068, 15303, -4797, -6257, 16596, -25049, 30647, -32759, 31140, -25978, 17856, -7704, -3327, 13978, -23039, 29475, -32558, 31933, -27675, 20264, -10548, -371, 11245, -20841, 28063, -32092, 32466, -29146, 22506, -13305, 2589, 8421, -18473, 26421, -31363, 32733, -30378, 24564, -15955, 5527, 5527, -15955, 24564, -30378, 32733, -31363, 26421, -18473, 8421, 2589, -13305, 22506, -29146, 32466, -32092, 28063, -20841, 11245, -371, -10548, 20264, -27675, 31933, -32558, 29475, -23039, 13978, -3327, -7704, 17856, -25978, 31140, -32759, 30647, -25049, 16596, -6257, -4797, 15303, -24068, 30092, -32692, 31569, -26853, 19079, -9135, -1851, 12624, -21963, 28799, -32358, 32232, -28439, 21406, -11939, 1110, 9843, -19677, 27270, -31760, 32633, -29792, 23559, -14645, 4062, 6981, -17232, 25519, -30902}, +{32767, -31363, 27270, -20841, 12624, -3327, -6257, 15303, -23039, 28799, -32092, 32633, -30378, 25519, -18473, 9843, -371, -9135, 17856, -25049, 30092, -32558, 32232, -29146, 23559, -15955, 6981, 2589, -11939, 20264, -26853, 31140, -32759, 31569, -27675, 21406, -13305, 4062, 5527, -14645, 22506, -28439, 31933, -32692, 30647, -25978, 19079, -10548, 1110, 8421, -17232, 24564, -29792, 32466, -32358, 29475, -24068, 16596, -7704, -1851, 11245, -19677, 26421, -30902, 32733, -31760, 28063, -21963, 13978, -4797, -4797, 13978, -21963, 28063, -31760, 32733, -30902, 26421, -19677, 11245, -1851, -7704, 16596, -24068, 29475, -32358, 32466, -29792, 24564, -17232, 8421, 1110, -10548, 19079, -25978, 30647, -32692, 31933, -28439, 22506, -14645, 5527, 4062, -13305, 21406, -27675, 31569, -32759, 31140, -26853, 20264, -11939, 2589, 6981, -15955, 23559, -29146, 32232, -32558, 30092, -25049, 17856, -9135, -371, 9843, -18473, 25519, -30378, 32633, -32092, 28799, -23039, 15303, -6257, -3327, 12624, -20841, 27270, -31363}, +{32767, -31760, 28799, -24068, 17856, -10548, 2589, 5527, -13305, 20264, -25978, 30092, -32358, 32633, -30902, 27270, -21963, 15303, -7704, -371, 8421, -15955, 22506, -27675, 31140, -32692, 32232, -29792, 25519, -19677, 12624, -4797, -3327, 11245, -18473, 24564, -29146, 31933, -32759, 31569, -28439, 23559, -17232, 9843, -1851, -6257, 13978, -20841, 26421, -30378, 32466, -32558, 30647, -26853, 21406, -14645, 6981, 1110, -9135, 16596, -23039, 28063, -31363, 32733, -32092, 29475, -25049, 19079, -11939, 4062, 4062, -11939, 19079, -25049, 29475, -32092, 32733, -31363, 28063, -23039, 16596, -9135, 1110, 6981, -14645, 21406, -26853, 30647, -32558, 32466, -30378, 26421, -20841, 13978, -6257, -1851, 9843, -17232, 23559, -28439, 31569, -32759, 31933, -29146, 24564, -18473, 11245, -3327, -4797, 12624, -19677, 25519, -29792, 32232, -32692, 31140, -27675, 22506, -15955, 8421, -371, -7704, 15303, -21963, 27270, -30902, 32633, -32358, 30092, -25978, 20264, -13305, 5527, 2589, -10548, 17856, -24068, 28799, -31760}, +{32767, -32092, 30092, -26853, 22506, -17232, 11245, -4797, -1851, 8421, -14645, 20264, -25049, 28799, -31363, 32633, -32558, 31140, -28439, 24564, -19677, 13978, -7704, 1110, 5527, -11939, 17856, -23039, 27270, -30378, 32232, -32759, 31933, -29792, 26421, -21963, 16596, -10548, 4062, 2589, -9135, 15303, -20841, 25519, -29146, 31569, -32692, 32466, -30902, 28063, -24068, 19079, -13305, 6981, -371, -6257, 12624, -18473, 23559, -27675, 30647, -32358, 32733, -31760, 29475, -25978, 21406, -15955, 9843, -3327, -3327, 9843, -15955, 21406, -25978, 29475, -31760, 32733, -32358, 30647, -27675, 23559, -18473, 12624, -6257, -371, 6981, -13305, 19079, -24068, 28063, -30902, 32466, -32692, 31569, -29146, 25519, -20841, 15303, -9135, 2589, 4062, -10548, 16596, -21963, 26421, -29792, 31933, -32759, 32232, -30378, 27270, -23039, 17856, -11939, 5527, 1110, -7704, 13978, -19677, 24564, -28439, 31140, -32558, 32633, -31363, 28799, -25049, 20264, -14645, 8421, -1851, -4797, 11245, -17232, 22506, -26853, 30092, -32092}, +{32767, -32358, 31140, -29146, 26421, -23039, 19079, -14645, 9843, -4797, -371, 5527, -10548, 15303, -19677, 23559, -26853, 29475, -31363, 32466, -32759, 32232, -30902, 28799, -25978, 22506, -18473, 13978, -9135, 4062, 1110, -6257, 11245, -15955, 20264, -24068, 27270, -29792, 31569, -32558, 32733, -32092, 30647, -28439, 25519, -21963, 17856, -13305, 8421, -3327, -1851, 6981, -11939, 16596, -20841, 24564, -27675, 30092, -31760, 32633, -32692, 31933, -30378, 28063, -25049, 21406, -17232, 12624, -7704, 2589, 2589, -7704, 12624, -17232, 21406, -25049, 28063, -30378, 31933, -32692, 32633, -31760, 30092, -27675, 24564, -20841, 16596, -11939, 6981, -1851, -3327, 8421, -13305, 17856, -21963, 25519, -28439, 30647, -32092, 32733, -32558, 31569, -29792, 27270, -24068, 20264, -15955, 11245, -6257, 1110, 4062, -9135, 13978, -18473, 22506, -25978, 28799, -30902, 32232, -32759, 32466, -31363, 29475, -26853, 23559, -19677, 15303, -10548, 5527, -371, -4797, 9843, -14645, 19079, -23039, 26421, -29146, 31140, -32358}, +{32767, -32558, 31933, -30902, 29475, -27675, 25519, -23039, 20264, -17232, 13978, -10548, 6981, -3327, -371, 4062, -7704, 11245, -14645, 17856, -20841, 23559, -25978, 28063, -29792, 31140, -32092, 32633, -32759, 32466, -31760, 30647, -29146, 27270, -25049, 22506, -19677, 16596, -13305, 9843, -6257, 2589, 1110, -4797, 8421, -11939, 15303, -18473, 21406, -24068, 26421, -28439, 30092, -31363, 32232, -32692, 32733, -32358, 31569, -30378, 28799, -26853, 24564, -21963, 19079, -15955, 12624, -9135, 5527, -1851, -1851, 5527, -9135, 12624, -15955, 19079, -21963, 24564, -26853, 28799, -30378, 31569, -32358, 32733, -32692, 32232, -31363, 30092, -28439, 26421, -24068, 21406, -18473, 15303, -11939, 8421, -4797, 1110, 2589, -6257, 9843, -13305, 16596, -19677, 22506, -25049, 27270, -29146, 30647, -31760, 32466, -32759, 32633, -32092, 31140, -29792, 28063, -25978, 23559, -20841, 17856, -14645, 11245, -7704, 4062, -371, -3327, 6981, -10548, 13978, -17232, 20264, -23039, 25519, -27675, 29475, -30902, 31933, -32558}, +{32767, -32692, 32466, -32092, 31569, -30902, 30092, -29146, 28063, -26853, 25519, -24068, 22506, -20841, 19079, -17232, 15303, -13305, 11245, -9135, 6981, -4797, 2589, -371, -1851, 4062, -6257, 8421, -10548, 12624, -14645, 16596, -18473, 20264, -21963, 23559, -25049, 26421, -27675, 28799, -29792, 30647, -31363, 31933, -32358, 32633, -32759, 32733, -32558, 32232, -31760, 31140, -30378, 29475, -28439, 27270, -25978, 24564, -23039, 21406, -19677, 17856, -15955, 13978, -11939, 9843, -7704, 5527, -3327, 1110, 1110, -3327, 5527, -7704, 9843, -11939, 13978, -15955, 17856, -19677, 21406, -23039, 24564, -25978, 27270, -28439, 29475, -30378, 31140, -31760, 32232, -32558, 32733, -32759, 32633, -32358, 31933, -31363, 30647, -29792, 28799, -27675, 26421, -25049, 23559, -21963, 20264, -18473, 16596, -14645, 12624, -10548, 8421, -6257, 4062, -1851, -371, 2589, -4797, 6981, -9135, 11245, -13305, 15303, -17232, 19079, -20841, 22506, -24068, 25519, -26853, 28063, -29146, 30092, -30902, 31569, -32092, 32466, -32692}, +{32767, -32759, 32733, -32692, 32633, -32558, 32466, -32358, 32232, -32092, 31933, -31760, 31569, -31363, 31140, -30902, 30647, -30378, 30092, -29792, 29475, -29146, 28799, -28439, 28063, -27675, 27270, -26853, 26421, -25978, 25519, -25049, 24564, -24068, 23559, -23039, 22506, -21963, 21406, -20841, 20264, -19677, 19079, -18473, 17856, -17232, 16596, -15955, 15303, -14645, 13978, -13305, 12624, -11939, 11245, -10548, 9843, -9135, 8421, -7704, 6981, -6257, 5527, -4797, 4062, -3327, 2589, -1851, 1110, -371, -371, 1110, -1851, 2589, -3327, 4062, -4797, 5527, -6257, 6981, -7704, 8421, -9135, 9843, -10548, 11245, -11939, 12624, -13305, 13978, -14645, 15303, -15955, 16596, -17232, 17856, -18473, 19079, -19677, 20264, -20841, 21406, -21963, 22506, -23039, 23559, -24068, 24564, -25049, 25519, -25978, 26421, -26853, 27270, -27675, 28063, -28439, 28799, -29146, 29475, -29792, 30092, -30378, 30647, -30902, 31140, -31363, 31569, -31760, 31933, -32092, 32232, -32358, 32466, -32558, 32633, -32692, 32733, -32759}, +{32767, -32759, 32733, -32692, 32633, -32558, 32466, -32358, 32232, -32092, 31933, -31760, 31569, -31363, 31140, -30902, 30647, -30378, 30092, -29792, 29475, -29146, 28799, -28439, 28063, -27675, 27270, -26853, 26421, -25978, 25519, -25049, 24564, -24068, 23559, -23039, 22506, -21963, 21406, -20841, 20264, -19677, 19079, -18473, 17856, -17232, 16596, -15955, 15303, -14645, 13978, -13305, 12624, -11939, 11245, -10548, 9843, -9135, 8421, -7704, 6981, -6257, 5527, -4797, 4062, -3327, 2589, -1851, 1110, -371, -371, 1110, -1851, 2589, -3327, 4062, -4797, 5527, -6257, 6981, -7704, 8421, -9135, 9843, -10548, 11245, -11939, 12624, -13305, 13978, -14645, 15303, -15955, 16596, -17232, 17856, -18473, 19079, -19677, 20264, -20841, 21406, -21963, 22506, -23039, 23559, -24068, 24564, -25049, 25519, -25978, 26421, -26853, 27270, -27675, 28063, -28439, 28799, -29146, 29475, -29792, 30092, -30378, 30647, -30902, 31140, -31363, 31569, -31760, 31933, -32092, 32232, -32358, 32466, -32558, 32633, -32692, 32733, -32759}, +{32767, -32692, 32466, -32092, 31569, -30902, 30092, -29146, 28063, -26853, 25519, -24068, 22506, -20841, 19079, -17232, 15303, -13305, 11245, -9135, 6981, -4797, 2589, -371, -1851, 4062, -6257, 8421, -10548, 12624, -14645, 16596, -18473, 20264, -21963, 23559, -25049, 26421, -27675, 28799, -29792, 30647, -31363, 31933, -32358, 32633, -32759, 32733, -32558, 32232, -31760, 31140, -30378, 29475, -28439, 27270, -25978, 24564, -23039, 21406, -19677, 17856, -15955, 13978, -11939, 9843, -7704, 5527, -3327, 1110, 1110, -3327, 5527, -7704, 9843, -11939, 13978, -15955, 17856, -19677, 21406, -23039, 24564, -25978, 27270, -28439, 29475, -30378, 31140, -31760, 32232, -32558, 32733, -32759, 32633, -32358, 31933, -31363, 30647, -29792, 28799, -27675, 26421, -25049, 23559, -21963, 20264, -18473, 16596, -14645, 12624, -10548, 8421, -6257, 4062, -1851, -371, 2589, -4797, 6981, -9135, 11245, -13305, 15303, -17232, 19079, -20841, 22506, -24068, 25519, -26853, 28063, -29146, 30092, -30902, 31569, -32092, 32466, -32692}, +{32767, -32558, 31933, -30902, 29475, -27675, 25519, -23039, 20264, -17232, 13978, -10548, 6981, -3327, -371, 4062, -7704, 11245, -14645, 17856, -20841, 23559, -25978, 28063, -29792, 31140, -32092, 32633, -32759, 32466, -31760, 30647, -29146, 27270, -25049, 22506, -19677, 16596, -13305, 9843, -6257, 2589, 1110, -4797, 8421, -11939, 15303, -18473, 21406, -24068, 26421, -28439, 30092, -31363, 32232, -32692, 32733, -32358, 31569, -30378, 28799, -26853, 24564, -21963, 19079, -15955, 12624, -9135, 5527, -1851, -1851, 5527, -9135, 12624, -15955, 19079, -21963, 24564, -26853, 28799, -30378, 31569, -32358, 32733, -32692, 32232, -31363, 30092, -28439, 26421, -24068, 21406, -18473, 15303, -11939, 8421, -4797, 1110, 2589, -6257, 9843, -13305, 16596, -19677, 22506, -25049, 27270, -29146, 30647, -31760, 32466, -32759, 32633, -32092, 31140, -29792, 28063, -25978, 23559, -20841, 17856, -14645, 11245, -7704, 4062, -371, -3327, 6981, -10548, 13978, -17232, 20264, -23039, 25519, -27675, 29475, -30902, 31933, -32558}, +{32767, -32358, 31140, -29146, 26421, -23039, 19079, -14645, 9843, -4797, -371, 5527, -10548, 15303, -19677, 23559, -26853, 29475, -31363, 32466, -32759, 32232, -30902, 28799, -25978, 22506, -18473, 13978, -9135, 4062, 1110, -6257, 11245, -15955, 20264, -24068, 27270, -29792, 31569, -32558, 32733, -32092, 30647, -28439, 25519, -21963, 17856, -13305, 8421, -3327, -1851, 6981, -11939, 16596, -20841, 24564, -27675, 30092, -31760, 32633, -32692, 31933, -30378, 28063, -25049, 21406, -17232, 12624, -7704, 2589, 2589, -7704, 12624, -17232, 21406, -25049, 28063, -30378, 31933, -32692, 32633, -31760, 30092, -27675, 24564, -20841, 16596, -11939, 6981, -1851, -3327, 8421, -13305, 17856, -21963, 25519, -28439, 30647, -32092, 32733, -32558, 31569, -29792, 27270, -24068, 20264, -15955, 11245, -6257, 1110, 4062, -9135, 13978, -18473, 22506, -25978, 28799, -30902, 32232, -32759, 32466, -31363, 29475, -26853, 23559, -19677, 15303, -10548, 5527, -371, -4797, 9843, -14645, 19079, -23039, 26421, -29146, 31140, -32358}, +{32767, -32092, 30092, -26853, 22506, -17232, 11245, -4797, -1851, 8421, -14645, 20264, -25049, 28799, -31363, 32633, -32558, 31140, -28439, 24564, -19677, 13978, -7704, 1110, 5527, -11939, 17856, -23039, 27270, -30378, 32232, -32759, 31933, -29792, 26421, -21963, 16596, -10548, 4062, 2589, -9135, 15303, -20841, 25519, -29146, 31569, -32692, 32466, -30902, 28063, -24068, 19079, -13305, 6981, -371, -6257, 12624, -18473, 23559, -27675, 30647, -32358, 32733, -31760, 29475, -25978, 21406, -15955, 9843, -3327, -3327, 9843, -15955, 21406, -25978, 29475, -31760, 32733, -32358, 30647, -27675, 23559, -18473, 12624, -6257, -371, 6981, -13305, 19079, -24068, 28063, -30902, 32466, -32692, 31569, -29146, 25519, -20841, 15303, -9135, 2589, 4062, -10548, 16596, -21963, 26421, -29792, 31933, -32759, 32232, -30378, 27270, -23039, 17856, -11939, 5527, 1110, -7704, 13978, -19677, 24564, -28439, 31140, -32558, 32633, -31363, 28799, -25049, 20264, -14645, 8421, -1851, -4797, 11245, -17232, 22506, -26853, 30092, -32092}, +{32767, -31760, 28799, -24068, 17856, -10548, 2589, 5527, -13305, 20264, -25978, 30092, -32358, 32633, -30902, 27270, -21963, 15303, -7704, -371, 8421, -15955, 22506, -27675, 31140, -32692, 32232, -29792, 25519, -19677, 12624, -4797, -3327, 11245, -18473, 24564, -29146, 31933, -32759, 31569, -28439, 23559, -17232, 9843, -1851, -6257, 13978, -20841, 26421, -30378, 32466, -32558, 30647, -26853, 21406, -14645, 6981, 1110, -9135, 16596, -23039, 28063, -31363, 32733, -32092, 29475, -25049, 19079, -11939, 4062, 4062, -11939, 19079, -25049, 29475, -32092, 32733, -31363, 28063, -23039, 16596, -9135, 1110, 6981, -14645, 21406, -26853, 30647, -32558, 32466, -30378, 26421, -20841, 13978, -6257, -1851, 9843, -17232, 23559, -28439, 31569, -32759, 31933, -29146, 24564, -18473, 11245, -3327, -4797, 12624, -19677, 25519, -29792, 32232, -32692, 31140, -27675, 22506, -15955, 8421, -371, -7704, 15303, -21963, 27270, -30902, 32633, -32358, 30092, -25978, 20264, -13305, 5527, 2589, -10548, 17856, -24068, 28799, -31760}, +{32767, -31363, 27270, -20841, 12624, -3327, -6257, 15303, -23039, 28799, -32092, 32633, -30378, 25519, -18473, 9843, -371, -9135, 17856, -25049, 30092, -32558, 32232, -29146, 23559, -15955, 6981, 2589, -11939, 20264, -26853, 31140, -32759, 31569, -27675, 21406, -13305, 4062, 5527, -14645, 22506, -28439, 31933, -32692, 30647, -25978, 19079, -10548, 1110, 8421, -17232, 24564, -29792, 32466, -32358, 29475, -24068, 16596, -7704, -1851, 11245, -19677, 26421, -30902, 32733, -31760, 28063, -21963, 13978, -4797, -4797, 13978, -21963, 28063, -31760, 32733, -30902, 26421, -19677, 11245, -1851, -7704, 16596, -24068, 29475, -32358, 32466, -29792, 24564, -17232, 8421, 1110, -10548, 19079, -25978, 30647, -32692, 31933, -28439, 22506, -14645, 5527, 4062, -13305, 21406, -27675, 31569, -32759, 31140, -26853, 20264, -11939, 2589, 6981, -15955, 23559, -29146, 32232, -32558, 30092, -25049, 17856, -9135, -371, 9843, -18473, 25519, -30378, 32633, -32092, 28799, -23039, 15303, -6257, -3327, 12624, -20841, 27270, -31363}, +{32767, -30902, 25519, -17232, 6981, 4062, -14645, 23559, -29792, 32633, -31760, 27270, -19677, 9843, 1110, -11939, 21406, -28439, 32232, -32358, 28799, -21963, 12624, -1851, -9135, 19079, -26853, 31569, -32692, 30092, -24068, 15303, -4797, -6257, 16596, -25049, 30647, -32759, 31140, -25978, 17856, -7704, -3327, 13978, -23039, 29475, -32558, 31933, -27675, 20264, -10548, -371, 11245, -20841, 28063, -32092, 32466, -29146, 22506, -13305, 2589, 8421, -18473, 26421, -31363, 32733, -30378, 24564, -15955, 5527, 5527, -15955, 24564, -30378, 32733, -31363, 26421, -18473, 8421, 2589, -13305, 22506, -29146, 32466, -32092, 28063, -20841, 11245, -371, -10548, 20264, -27675, 31933, -32558, 29475, -23039, 13978, -3327, -7704, 17856, -25978, 31140, -32759, 30647, -25049, 16596, -6257, -4797, 15303, -24068, 30092, -32692, 31569, -26853, 19079, -9135, -1851, 12624, -21963, 28799, -32358, 32232, -28439, 21406, -11939, 1110, 9843, -19677, 27270, -31760, 32633, -29792, 23559, -14645, 4062, 6981, -17232, 25519, -30902}, +{32767, -30378, 23559, -13305, 1110, 11245, -21963, 29475, -32692, 31140, -25049, 15303, -3327, -9135, 20264, -28439, 32466, -31760, 26421, -17232, 5527, 6981, -18473, 27270, -32092, 32232, -27675, 19079, -7704, -4797, 16596, -25978, 31569, -32558, 28799, -20841, 9843, 2589, -14645, 24564, -30902, 32733, -29792, 22506, -11939, -371, 12624, -23039, 30092, -32759, 30647, -24068, 13978, -1851, -10548, 21406, -29146, 32633, -31363, 25519, -15955, 4062, 8421, -19677, 28063, -32358, 31933, -26853, 17856, -6257, -6257, 17856, -26853, 31933, -32358, 28063, -19677, 8421, 4062, -15955, 25519, -31363, 32633, -29146, 21406, -10548, -1851, 13978, -24068, 30647, -32759, 30092, -23039, 12624, -371, -11939, 22506, -29792, 32733, -30902, 24564, -14645, 2589, 9843, -20841, 28799, -32558, 31569, -25978, 16596, -4797, -7704, 19079, -27675, 32232, -32092, 27270, -18473, 6981, 5527, -17232, 26421, -31760, 32466, -28439, 20264, -9135, -3327, 15303, -25049, 31140, -32692, 29475, -21963, 11245, 1110, -13305, 23559, -30378}, +{32767, -29792, 21406, -9135, -4797, 17856, -27675, 32466, -31363, 24564, -13305, -371, 13978, -25049, 31569, -32358, 27270, -17232, 4062, 9843, -21963, 30092, -32759, 29475, -20841, 8421, 5527, -18473, 28063, -32558, 31140, -24068, 12624, 1110, -14645, 25519, -31760, 32232, -26853, 16596, -3327, -10548, 22506, -30378, 32733, -29146, 20264, -7704, -6257, 19079, -28439, 32633, -30902, 23559, -11939, -1851, 15303, -25978, 31933, -32092, 26421, -15955, 2589, 11245, -23039, 30647, -32692, 28799, -19677, 6981, 6981, -19677, 28799, -32692, 30647, -23039, 11245, 2589, -15955, 26421, -32092, 31933, -25978, 15303, -1851, -11939, 23559, -30902, 32633, -28439, 19079, -6257, -7704, 20264, -29146, 32733, -30378, 22506, -10548, -3327, 16596, -26853, 32232, -31760, 25519, -14645, 1110, 12624, -24068, 31140, -32558, 28063, -18473, 5527, 8421, -20841, 29475, -32759, 30092, -21963, 9843, 4062, -17232, 27270, -32358, 31569, -25049, 13978, -371, -13305, 24564, -31363, 32466, -27675, 17856, -4797, -9135, 21406, -29792}, +{32767, -29146, 19079, -4797, -10548, 23559, -31363, 32232, -25978, 13978, 1110, -15955, 27270, -32558, 30647, -21963, 8421, 6981, -20841, 30092, -32692, 28063, -17232, 2589, 12624, -25049, 31933, -31760, 24564, -11939, -3327, 17856, -28439, 32733, -29792, 20264, -6257, -9135, 22506, -30902, 32466, -26853, 15303, -371, -14645, 26421, -32358, 31140, -23039, 9843, 5527, -19677, 29475, -32759, 28799, -18473, 4062, 11245, -24068, 31569, -32092, 25519, -13305, -1851, 16596, -27675, 32633, -30378, 21406, -7704, -7704, 21406, -30378, 32633, -27675, 16596, -1851, -13305, 25519, -32092, 31569, -24068, 11245, 4062, -18473, 28799, -32759, 29475, -19677, 5527, 9843, -23039, 31140, -32358, 26421, -14645, -371, 15303, -26853, 32466, -30902, 22506, -9135, -6257, 20264, -29792, 32733, -28439, 17856, -3327, -11939, 24564, -31760, 31933, -25049, 12624, 2589, -17232, 28063, -32692, 30092, -20841, 6981, 8421, -21963, 30647, -32558, 27270, -15955, 1110, 13978, -25978, 32232, -31363, 23559, -10548, -4797, 19079, -29146}, +{32767, -28439, 16596, -371, -15955, 28063, -32759, 28799, -17232, 1110, 15303, -27675, 32733, -29146, 17856, -1851, -14645, 27270, -32692, 29475, -18473, 2589, 13978, -26853, 32633, -29792, 19079, -3327, -13305, 26421, -32558, 30092, -19677, 4062, 12624, -25978, 32466, -30378, 20264, -4797, -11939, 25519, -32358, 30647, -20841, 5527, 11245, -25049, 32232, -30902, 21406, -6257, -10548, 24564, -32092, 31140, -21963, 6981, 9843, -24068, 31933, -31363, 22506, -7704, -9135, 23559, -31760, 31569, -23039, 8421, 8421, -23039, 31569, -31760, 23559, -9135, -7704, 22506, -31363, 31933, -24068, 9843, 6981, -21963, 31140, -32092, 24564, -10548, -6257, 21406, -30902, 32232, -25049, 11245, 5527, -20841, 30647, -32358, 25519, -11939, -4797, 20264, -30378, 32466, -25978, 12624, 4062, -19677, 30092, -32558, 26421, -13305, -3327, 19079, -29792, 32633, -26853, 13978, 2589, -18473, 29475, -32692, 27270, -14645, -1851, 17856, -29146, 32733, -27675, 15303, 1110, -17232, 28799, -32759, 28063, -15955, -371, 16596, -28439}, +{32767, -27675, 13978, 4062, -20841, 31140, -31760, 22506, -6257, -11939, 26421, -32692, 28799, -15955, -1851, 19079, -30378, 32232, -24068, 8421, 9843, -25049, 32466, -29792, 17856, -371, -17232, 29475, -32558, 25519, -10548, -7704, 23559, -32092, 30647, -19677, 2589, 15303, -28439, 32733, -26853, 12624, 5527, -21963, 31569, -31363, 21406, -4797, -13305, 27270, -32759, 28063, -14645, -3327, 20264, -30902, 31933, -23039, 6981, 11245, -25978, 32633, -29146, 16596, 1110, -18473, 30092, -32358, 24564, -9135, -9135, 24564, -32358, 30092, -18473, 1110, 16596, -29146, 32633, -25978, 11245, 6981, -23039, 31933, -30902, 20264, -3327, -14645, 28063, -32759, 27270, -13305, -4797, 21406, -31363, 31569, -21963, 5527, 12624, -26853, 32733, -28439, 15303, 2589, -19677, 30647, -32092, 23559, -7704, -10548, 25519, -32558, 29475, -17232, -371, 17856, -29792, 32466, -25049, 9843, 8421, -24068, 32232, -30378, 19079, -1851, -15955, 28799, -32692, 26421, -11939, -6257, 22506, -31760, 31140, -20841, 4062, 13978, -27675}, +{32767, -26853, 11245, 8421, -25049, 32633, -28439, 13978, 5527, -23039, 32232, -29792, 16596, 2589, -20841, 31569, -30902, 19079, -371, -18473, 30647, -31760, 21406, -3327, -15955, 29475, -32358, 23559, -6257, -13305, 28063, -32692, 25519, -9135, -10548, 26421, -32759, 27270, -11939, -7704, 24564, -32558, 28799, -14645, -4797, 22506, -32092, 30092, -17232, -1851, 20264, -31363, 31140, -19677, 1110, 17856, -30378, 31933, -21963, 4062, 15303, -29146, 32466, -24068, 6981, 12624, -27675, 32733, -25978, 9843, 9843, -25978, 32733, -27675, 12624, 6981, -24068, 32466, -29146, 15303, 4062, -21963, 31933, -30378, 17856, 1110, -19677, 31140, -31363, 20264, -1851, -17232, 30092, -32092, 22506, -4797, -14645, 28799, -32558, 24564, -7704, -11939, 27270, -32759, 26421, -10548, -9135, 25519, -32692, 28063, -13305, -6257, 23559, -32358, 29475, -15955, -3327, 21406, -31760, 30647, -18473, -371, 19079, -30902, 31569, -20841, 2589, 16596, -29792, 32232, -23039, 5527, 13978, -28439, 32633, -25049, 8421, 11245, -26853}, +{32767, -25978, 8421, 12624, -28439, 32466, -23039, 4062, 16596, -30378, 31569, -19677, -371, 20264, -31760, 30092, -15955, -4797, 23559, -32558, 28063, -11939, -9135, 26421, -32759, 25519, -7704, -13305, 28799, -32358, 22506, -3327, -17232, 30647, -31363, 19079, 1110, -20841, 31933, -29792, 15303, 5527, -24068, 32633, -27675, 11245, 9843, -26853, 32733, -25049, 6981, 13978, -29146, 32232, -21963, 2589, 17856, -30902, 31140, -18473, -1851, 21406, -32092, 29475, -14645, -6257, 24564, -32692, 27270, -10548, -10548, 27270, -32692, 24564, -6257, -14645, 29475, -32092, 21406, -1851, -18473, 31140, -30902, 17856, 2589, -21963, 32232, -29146, 13978, 6981, -25049, 32733, -26853, 9843, 11245, -27675, 32633, -24068, 5527, 15303, -29792, 31933, -20841, 1110, 19079, -31363, 30647, -17232, -3327, 22506, -32358, 28799, -13305, -7704, 25519, -32759, 26421, -9135, -11939, 28063, -32558, 23559, -4797, -15955, 30092, -31760, 20264, -371, -19677, 31569, -30378, 16596, 4062, -23039, 32466, -28439, 12624, 8421, -25978}, +{32767, -25049, 5527, 16596, -30902, 30647, -15955, -6257, 25519, -32759, 24564, -4797, -17232, 31140, -30378, 15303, 6981, -25978, 32733, -24068, 4062, 17856, -31363, 30092, -14645, -7704, 26421, -32692, 23559, -3327, -18473, 31569, -29792, 13978, 8421, -26853, 32633, -23039, 2589, 19079, -31760, 29475, -13305, -9135, 27270, -32558, 22506, -1851, -19677, 31933, -29146, 12624, 9843, -27675, 32466, -21963, 1110, 20264, -32092, 28799, -11939, -10548, 28063, -32358, 21406, -371, -20841, 32232, -28439, 11245, 11245, -28439, 32232, -20841, -371, 21406, -32358, 28063, -10548, -11939, 28799, -32092, 20264, 1110, -21963, 32466, -27675, 9843, 12624, -29146, 31933, -19677, -1851, 22506, -32558, 27270, -9135, -13305, 29475, -31760, 19079, 2589, -23039, 32633, -26853, 8421, 13978, -29792, 31569, -18473, -3327, 23559, -32692, 26421, -7704, -14645, 30092, -31363, 17856, 4062, -24068, 32733, -25978, 6981, 15303, -30378, 31140, -17232, -4797, 24564, -32759, 25519, -6257, -15955, 30647, -30902, 16596, 5527, -25049}, +{32767, -24068, 2589, 20264, -32358, 27270, -7704, -15955, 31140, -29792, 12624, 11245, -29146, 31569, -17232, -6257, 26421, -32558, 21406, 1110, -23039, 32733, -25049, 4062, 19079, -32092, 28063, -9135, -14645, 30647, -30378, 13978, 9843, -28439, 31933, -18473, -4797, 25519, -32692, 22506, -371, -21963, 32633, -25978, 5527, 17856, -31760, 28799, -10548, -13305, 30092, -30902, 15303, 8421, -27675, 32232, -19677, -3327, 24564, -32759, 23559, -1851, -20841, 32466, -26853, 6981, 16596, -31363, 29475, -11939, -11939, 29475, -31363, 16596, 6981, -26853, 32466, -20841, -1851, 23559, -32759, 24564, -3327, -19677, 32232, -27675, 8421, 15303, -30902, 30092, -13305, -10548, 28799, -31760, 17856, 5527, -25978, 32633, -21963, -371, 22506, -32692, 25519, -4797, -18473, 31933, -28439, 9843, 13978, -30378, 30647, -14645, -9135, 28063, -32092, 19079, 4062, -25049, 32733, -23039, 1110, 21406, -32558, 26421, -6257, -17232, 31569, -29146, 11245, 12624, -29792, 31140, -15955, -7704, 27270, -32358, 20264, 2589, -24068}, +{32767, -23039, -371, 23559, -32759, 22506, 1110, -24068, 32733, -21963, -1851, 24564, -32692, 21406, 2589, -25049, 32633, -20841, -3327, 25519, -32558, 20264, 4062, -25978, 32466, -19677, -4797, 26421, -32358, 19079, 5527, -26853, 32232, -18473, -6257, 27270, -32092, 17856, 6981, -27675, 31933, -17232, -7704, 28063, -31760, 16596, 8421, -28439, 31569, -15955, -9135, 28799, -31363, 15303, 9843, -29146, 31140, -14645, -10548, 29475, -30902, 13978, 11245, -29792, 30647, -13305, -11939, 30092, -30378, 12624, 12624, -30378, 30092, -11939, -13305, 30647, -29792, 11245, 13978, -30902, 29475, -10548, -14645, 31140, -29146, 9843, 15303, -31363, 28799, -9135, -15955, 31569, -28439, 8421, 16596, -31760, 28063, -7704, -17232, 31933, -27675, 6981, 17856, -32092, 27270, -6257, -18473, 32232, -26853, 5527, 19079, -32358, 26421, -4797, -19677, 32466, -25978, 4062, 20264, -32558, 25519, -3327, -20841, 32633, -25049, 2589, 21406, -32692, 24564, -1851, -21963, 32733, -24068, 1110, 22506, -32759, 23559, -371, -23039}, +{32767, -21963, -3327, 26421, -32092, 16596, 9843, -29792, 30092, -10548, -15955, 31933, -26853, 4062, 21406, -32759, 22506, 2589, -25978, 32232, -17232, -9135, 29475, -30378, 11245, 15303, -31760, 27270, -4797, -20841, 32733, -23039, -1851, 25519, -32358, 17856, 8421, -29146, 30647, -11939, -14645, 31569, -27675, 5527, 20264, -32692, 23559, 1110, -25049, 32466, -18473, -7704, 28799, -30902, 12624, 13978, -31363, 28063, -6257, -19677, 32633, -24068, -371, 24564, -32558, 19079, 6981, -28439, 31140, -13305, -13305, 31140, -28439, 6981, 19079, -32558, 24564, -371, -24068, 32633, -19677, -6257, 28063, -31363, 13978, 12624, -30902, 28799, -7704, -18473, 32466, -25049, 1110, 23559, -32692, 20264, 5527, -27675, 31569, -14645, -11939, 30647, -29146, 8421, 17856, -32358, 25519, -1851, -23039, 32733, -20841, -4797, 27270, -31760, 15303, 11245, -30378, 29475, -9135, -17232, 32232, -25978, 2589, 22506, -32759, 21406, 4062, -26853, 31933, -15955, -10548, 30092, -29792, 9843, 16596, -32092, 26421, -3327, -21963}, +{32767, -20841, -6257, 28799, -30378, 9843, 17856, -32558, 23559, 2589, -26853, 31569, -13305, -14645, 31933, -25978, 1110, 24564, -32358, 16596, 11245, -30902, 28063, -4797, -21963, 32733, -19677, -7704, 29475, -29792, 8421, 19079, -32692, 22506, 4062, -27675, 31140, -11939, -15955, 32232, -25049, -371, 25519, -32092, 15303, 12624, -31363, 27270, -3327, -23039, 32633, -18473, -9135, 30092, -29146, 6981, 20264, -32759, 21406, 5527, -28439, 30647, -10548, -17232, 32466, -24068, -1851, 26421, -31760, 13978, 13978, -31760, 26421, -1851, -24068, 32466, -17232, -10548, 30647, -28439, 5527, 21406, -32759, 20264, 6981, -29146, 30092, -9135, -18473, 32633, -23039, -3327, 27270, -31363, 12624, 15303, -32092, 25519, -371, -25049, 32232, -15955, -11939, 31140, -27675, 4062, 22506, -32692, 19079, 8421, -29792, 29475, -7704, -19677, 32733, -21963, -4797, 28063, -30902, 11245, 16596, -32358, 24564, 1110, -25978, 31933, -14645, -13305, 31569, -26853, 2589, 23559, -32558, 17856, 9843, -30378, 28799, -6257, -20841}, +{32767, -19677, -9135, 30647, -27675, 2589, 24564, -32092, 13978, 15303, -32358, 23559, 4062, -28439, 30092, -7704, -20841, 32733, -18473, -10548, 31140, -26853, 1110, 25519, -31760, 12624, 16596, -32558, 22506, 5527, -29146, 29475, -6257, -21963, 32633, -17232, -11939, 31569, -25978, -371, 26421, -31363, 11245, 17856, -32692, 21406, 6981, -29792, 28799, -4797, -23039, 32466, -15955, -13305, 31933, -25049, -1851, 27270, -30902, 9843, 19079, -32759, 20264, 8421, -30378, 28063, -3327, -24068, 32232, -14645, -14645, 32232, -24068, -3327, 28063, -30378, 8421, 20264, -32759, 19079, 9843, -30902, 27270, -1851, -25049, 31933, -13305, -15955, 32466, -23039, -4797, 28799, -29792, 6981, 21406, -32692, 17856, 11245, -31363, 26421, -371, -25978, 31569, -11939, -17232, 32633, -21963, -6257, 29475, -29146, 5527, 22506, -32558, 16596, 12624, -31760, 25519, 1110, -26853, 31140, -10548, -18473, 32733, -20841, -7704, 30092, -28439, 4062, 23559, -32358, 15303, 13978, -32092, 24564, 2589, -27675, 30647, -9135, -19677}, +{32767, -18473, -11939, 31933, -24068, -4797, 29475, -28439, 2589, 25519, -31363, 9843, 20264, -32692, 16596, 13978, -32358, 22506, 6981, -30378, 27270, -371, -26853, 30647, -7704, -21963, 32466, -14645, -15955, 32633, -20841, -9135, 31140, -25978, -1851, 28063, -29792, 5527, 23559, -32092, 12624, 17856, -32759, 19079, 11245, -31760, 24564, 4062, -29146, 28799, -3327, -25049, 31569, -10548, -19677, 32733, -17232, -13305, 32232, -23039, -6257, 30092, -27675, 1110, 26421, -30902, 8421, 21406, -32558, 15303, 15303, -32558, 21406, 8421, -30902, 26421, 1110, -27675, 30092, -6257, -23039, 32232, -13305, -17232, 32733, -19677, -10548, 31569, -25049, -3327, 28799, -29146, 4062, 24564, -31760, 11245, 19079, -32759, 17856, 12624, -32092, 23559, 5527, -29792, 28063, -1851, -25978, 31140, -9135, -20841, 32633, -15955, -14645, 32466, -21963, -7704, 30647, -26853, -371, 27270, -30378, 6981, 22506, -32358, 13978, 16596, -32692, 20264, 9843, -31363, 25519, 2589, -28439, 29475, -4797, -24068, 31933, -11939, -18473}, +{32767, -17232, -14645, 32633, -19677, -11939, 32232, -21963, -9135, 31569, -24068, -6257, 30647, -25978, -3327, 29475, -27675, -371, 28063, -29146, 2589, 26421, -30378, 5527, 24564, -31363, 8421, 22506, -32092, 11245, 20264, -32558, 13978, 17856, -32759, 16596, 15303, -32692, 19079, 12624, -32358, 21406, 9843, -31760, 23559, 6981, -30902, 25519, 4062, -29792, 27270, 1110, -28439, 28799, -1851, -26853, 30092, -4797, -25049, 31140, -7704, -23039, 31933, -10548, -20841, 32466, -13305, -18473, 32733, -15955, -15955, 32733, -18473, -13305, 32466, -20841, -10548, 31933, -23039, -7704, 31140, -25049, -4797, 30092, -26853, -1851, 28799, -28439, 1110, 27270, -29792, 4062, 25519, -30902, 6981, 23559, -31760, 9843, 21406, -32358, 12624, 19079, -32692, 15303, 16596, -32759, 17856, 13978, -32558, 20264, 11245, -32092, 22506, 8421, -31363, 24564, 5527, -30378, 26421, 2589, -29146, 28063, -371, -27675, 29475, -3327, -25978, 30647, -6257, -24068, 31569, -9135, -21963, 32232, -11939, -19677, 32633, -14645, -17232}, +{32767, -15955, -17232, 32733, -14645, -18473, 32633, -13305, -19677, 32466, -11939, -20841, 32232, -10548, -21963, 31933, -9135, -23039, 31569, -7704, -24068, 31140, -6257, -25049, 30647, -4797, -25978, 30092, -3327, -26853, 29475, -1851, -27675, 28799, -371, -28439, 28063, 1110, -29146, 27270, 2589, -29792, 26421, 4062, -30378, 25519, 5527, -30902, 24564, 6981, -31363, 23559, 8421, -31760, 22506, 9843, -32092, 21406, 11245, -32358, 20264, 12624, -32558, 19079, 13978, -32692, 17856, 15303, -32759, 16596, 16596, -32759, 15303, 17856, -32692, 13978, 19079, -32558, 12624, 20264, -32358, 11245, 21406, -32092, 9843, 22506, -31760, 8421, 23559, -31363, 6981, 24564, -30902, 5527, 25519, -30378, 4062, 26421, -29792, 2589, 27270, -29146, 1110, 28063, -28439, -371, 28799, -27675, -1851, 29475, -26853, -3327, 30092, -25978, -4797, 30647, -25049, -6257, 31140, -24068, -7704, 31569, -23039, -9135, 31933, -21963, -10548, 32232, -20841, -11939, 32466, -19677, -13305, 32633, -18473, -14645, 32733, -17232, -15955}, +{32767, -14645, -19677, 32232, -9135, -24068, 30647, -3327, -27675, 28063, 2589, -30378, 24564, 8421, -32092, 20264, 13978, -32759, 15303, 19079, -32358, 9843, 23559, -30902, 4062, 27270, -28439, -1851, 30092, -25049, -7704, 31933, -20841, -13305, 32733, -15955, -18473, 32466, -10548, -23039, 31140, -4797, -26853, 28799, 1110, -29792, 25519, 6981, -31760, 21406, 12624, -32692, 16596, 17856, -32558, 11245, 22506, -31363, 5527, 26421, -29146, -371, 29475, -25978, -6257, 31569, -21963, -11939, 32633, -17232, -17232, 32633, -11939, -21963, 31569, -6257, -25978, 29475, -371, -29146, 26421, 5527, -31363, 22506, 11245, -32558, 17856, 16596, -32692, 12624, 21406, -31760, 6981, 25519, -29792, 1110, 28799, -26853, -4797, 31140, -23039, -10548, 32466, -18473, -15955, 32733, -13305, -20841, 31933, -7704, -25049, 30092, -1851, -28439, 27270, 4062, -30902, 23559, 9843, -32358, 19079, 15303, -32759, 13978, 20264, -32092, 8421, 24564, -30378, 2589, 28063, -27675, -3327, 30647, -24068, -9135, 32232, -19677, -14645}, +{32767, -13305, -21963, 31140, -3327, -28439, 26421, 6981, -32092, 19079, 16596, -32558, 9843, 24564, -29792, -371, 30092, -24068, -10548, 32633, -15955, -19677, 31933, -6257, -26853, 28063, 4062, -31363, 21406, 13978, -32759, 12624, 22506, -30902, 2589, 28799, -25978, -7704, 32232, -18473, -17232, 32466, -9135, -25049, 29475, 1110, -30378, 23559, 11245, -32692, 15303, 20264, -31760, 5527, 27270, -27675, -4797, 31569, -20841, -14645, 32733, -11939, -23039, 30647, -1851, -29146, 25519, 8421, -32358, 17856, 17856, -32358, 8421, 25519, -29146, -1851, 30647, -23039, -11939, 32733, -14645, -20841, 31569, -4797, -27675, 27270, 5527, -31760, 20264, 15303, -32692, 11245, 23559, -30378, 1110, 29475, -25049, -9135, 32466, -17232, -18473, 32232, -7704, -25978, 28799, 2589, -30902, 22506, 12624, -32759, 13978, 21406, -31363, 4062, 28063, -26853, -6257, 31933, -19677, -15955, 32633, -10548, -24068, 30092, -371, -29792, 24564, 9843, -32558, 16596, 19079, -32092, 6981, 26421, -28439, -3327, 31140, -21963, -13305}, +{32767, -11939, -24068, 29475, 2589, -31363, 20264, 16596, -32358, 6981, 27270, -26853, -7704, 32466, -15955, -20841, 31140, -1851, -29792, 23559, 12624, -32759, 11245, 24564, -29146, -3327, 31569, -19677, -17232, 32232, -6257, -27675, 26421, 8421, -32558, 15303, 21406, -30902, 1110, 30092, -23039, -13305, 32733, -10548, -25049, 28799, 4062, -31760, 19079, 17856, -32092, 5527, 28063, -25978, -9135, 32633, -14645, -21963, 30647, -371, -30378, 22506, 13978, -32692, 9843, 25519, -28439, -4797, 31933, -18473, -18473, 31933, -4797, -28439, 25519, 9843, -32692, 13978, 22506, -30378, -371, 30647, -21963, -14645, 32633, -9135, -25978, 28063, 5527, -32092, 17856, 19079, -31760, 4062, 28799, -25049, -10548, 32733, -13305, -23039, 30092, 1110, -30902, 21406, 15303, -32558, 8421, 26421, -27675, -6257, 32232, -17232, -19677, 31569, -3327, -29146, 24564, 11245, -32759, 12624, 23559, -29792, -1851, 31140, -20841, -15955, 32466, -7704, -26853, 27270, 6981, -32358, 16596, 20264, -31363, 2589, 29475, -24068, -11939}, +{32767, -10548, -25978, 27270, 8421, -32692, 12624, 24564, -28439, -6257, 32466, -14645, -23039, 29475, 4062, -32092, 16596, 21406, -30378, -1851, 31569, -18473, -19677, 31140, -371, -30902, 20264, 17856, -31760, 2589, 30092, -21963, -15955, 32232, -4797, -29146, 23559, 13978, -32558, 6981, 28063, -25049, -11939, 32733, -9135, -26853, 26421, 9843, -32759, 11245, 25519, -27675, -7704, 32633, -13305, -24068, 28799, 5527, -32358, 15303, 22506, -29792, -3327, 31933, -17232, -20841, 30647, 1110, -31363, 19079, 19079, -31363, 1110, 30647, -20841, -17232, 31933, -3327, -29792, 22506, 15303, -32358, 5527, 28799, -24068, -13305, 32633, -7704, -27675, 25519, 11245, -32759, 9843, 26421, -26853, -9135, 32733, -11939, -25049, 28063, 6981, -32558, 13978, 23559, -29146, -4797, 32232, -15955, -21963, 30092, 2589, -31760, 17856, 20264, -30902, -371, 31140, -19677, -18473, 31569, -1851, -30378, 21406, 16596, -32092, 4062, 29475, -23039, -14645, 32466, -6257, -28439, 24564, 12624, -32692, 8421, 27270, -25978, -10548}, +{32767, -9135, -27675, 24564, 13978, -32358, 4062, 30092, -20841, -18473, 31140, 1110, -31760, 16596, 22506, -29146, -6257, 32633, -11939, -25978, 26421, 11245, -32692, 6981, 28799, -23039, -15955, 31933, -1851, -30902, 19079, 20264, -30378, -3327, 32232, -14645, -24068, 28063, 8421, -32759, 9843, 27270, -25049, -13305, 32466, -4797, -29792, 21406, 17856, -31363, -371, 31569, -17232, -21963, 29475, 5527, -32558, 12624, 25519, -26853, -10548, 32733, -7704, -28439, 23559, 15303, -32092, 2589, 30647, -19677, -19677, 30647, 2589, -32092, 15303, 23559, -28439, -7704, 32733, -10548, -26853, 25519, 12624, -32558, 5527, 29475, -21963, -17232, 31569, -371, -31363, 17856, 21406, -29792, -4797, 32466, -13305, -25049, 27270, 9843, -32759, 8421, 28063, -24068, -14645, 32232, -3327, -30378, 20264, 19079, -30902, -1851, 31933, -15955, -23039, 28799, 6981, -32692, 11245, 26421, -25978, -11939, 32633, -6257, -29146, 22506, 16596, -31760, 1110, 31140, -18473, -20841, 30092, 4062, -32358, 13978, 24564, -27675, -9135}, +{32767, -7704, -29146, 21406, 19079, -30378, -4797, 32633, -10548, -27675, 23559, 16596, -31363, -1851, 32232, -13305, -25978, 25519, 13978, -32092, 1110, 31569, -15955, -24068, 27270, 11245, -32558, 4062, 30647, -18473, -21963, 28799, 8421, -32759, 6981, 29475, -20841, -19677, 30092, 5527, -32692, 9843, 28063, -23039, -17232, 31140, 2589, -32358, 12624, 26421, -25049, -14645, 31933, -371, -31760, 15303, 24564, -26853, -11939, 32466, -3327, -30902, 17856, 22506, -28439, -9135, 32733, -6257, -29792, 20264, 20264, -29792, -6257, 32733, -9135, -28439, 22506, 17856, -30902, -3327, 32466, -11939, -26853, 24564, 15303, -31760, -371, 31933, -14645, -25049, 26421, 12624, -32358, 2589, 31140, -17232, -23039, 28063, 9843, -32692, 5527, 30092, -19677, -20841, 29475, 6981, -32759, 8421, 28799, -21963, -18473, 30647, 4062, -32558, 11245, 27270, -24068, -15955, 31569, 1110, -32092, 13978, 25519, -25978, -13305, 32232, -1851, -31363, 16596, 23559, -27675, -10548, 32633, -4797, -30378, 19079, 21406, -29146, -7704}, +{32767, -6257, -30378, 17856, 23559, -26853, -13305, 31933, 1110, -32358, 11245, 28063, -21963, -19677, 29475, 8421, -32692, 4062, 31140, -15955, -25049, 25519, 15303, -31363, -3327, 32633, -9135, -29146, 20264, 21406, -28439, -10548, 32466, -1851, -31760, 13978, 26421, -24068, -17232, 30647, 5527, -32759, 6981, 30092, -18473, -23039, 27270, 12624, -32092, -371, 32232, -11939, -27675, 22506, 19079, -29792, -7704, 32733, -4797, -30902, 16596, 24564, -25978, -14645, 31569, 2589, -32558, 9843, 28799, -20841, -20841, 28799, 9843, -32558, 2589, 31569, -14645, -25978, 24564, 16596, -30902, -4797, 32733, -7704, -29792, 19079, 22506, -27675, -11939, 32232, -371, -32092, 12624, 27270, -23039, -18473, 30092, 6981, -32759, 5527, 30647, -17232, -24068, 26421, 13978, -31760, -1851, 32466, -10548, -28439, 21406, 20264, -29146, -9135, 32633, -3327, -31363, 15303, 25519, -25049, -15955, 31140, 4062, -32692, 8421, 29475, -19677, -21963, 28063, 11245, -32358, 1110, 31933, -13305, -26853, 23559, 17856, -30378, -6257}, +{32767, -4797, -31363, 13978, 27270, -21963, -20841, 28063, 12624, -31760, -3327, 32733, -6257, -30902, 15303, 26421, -23039, -19677, 28799, 11245, -32092, -1851, 32633, -7704, -30378, 16596, 25519, -24068, -18473, 29475, 9843, -32358, -371, 32466, -9135, -29792, 17856, 24564, -25049, -17232, 30092, 8421, -32558, 1110, 32232, -10548, -29146, 19079, 23559, -25978, -15955, 30647, 6981, -32692, 2589, 31933, -11939, -28439, 20264, 22506, -26853, -14645, 31140, 5527, -32759, 4062, 31569, -13305, -27675, 21406, 21406, -27675, -13305, 31569, 4062, -32759, 5527, 31140, -14645, -26853, 22506, 20264, -28439, -11939, 31933, 2589, -32692, 6981, 30647, -15955, -25978, 23559, 19079, -29146, -10548, 32232, 1110, -32558, 8421, 30092, -17232, -25049, 24564, 17856, -29792, -9135, 32466, -371, -32358, 9843, 29475, -18473, -24068, 25519, 16596, -30378, -7704, 32633, -1851, -32092, 11245, 28799, -19677, -23039, 26421, 15303, -30902, -6257, 32733, -3327, -31760, 12624, 28063, -20841, -21963, 27270, 13978, -31363, -4797}, +{32767, -3327, -32092, 9843, 30092, -15955, -26853, 21406, 22506, -25978, -17232, 29475, 11245, -31760, -4797, 32733, -1851, -32358, 8421, 30647, -14645, -27675, 20264, 23559, -25049, -18473, 28799, 12624, -31363, -6257, 32633, -371, -32558, 6981, 31140, -13305, -28439, 19079, 24564, -24068, -19677, 28063, 13978, -30902, -7704, 32466, 1110, -32692, 5527, 31569, -11939, -29146, 17856, 25519, -23039, -20841, 27270, 15303, -30378, -9135, 32232, 2589, -32759, 4062, 31933, -10548, -29792, 16596, 26421, -21963, -21963, 26421, 16596, -29792, -10548, 31933, 4062, -32759, 2589, 32232, -9135, -30378, 15303, 27270, -20841, -23039, 25519, 17856, -29146, -11939, 31569, 5527, -32692, 1110, 32466, -7704, -30902, 13978, 28063, -19677, -24068, 24564, 19079, -28439, -13305, 31140, 6981, -32558, -371, 32633, -6257, -31363, 12624, 28799, -18473, -25049, 23559, 20264, -27675, -14645, 30647, 8421, -32358, -1851, 32733, -4797, -31760, 11245, 29475, -17232, -25978, 22506, 21406, -26853, -15955, 30092, 9843, -32092, -3327}, +{32767, -1851, -32558, 5527, 31933, -9135, -30902, 12624, 29475, -15955, -27675, 19079, 25519, -21963, -23039, 24564, 20264, -26853, -17232, 28799, 13978, -30378, -10548, 31569, 6981, -32358, -3327, 32733, -371, -32692, 4062, 32232, -7704, -31363, 11245, 30092, -14645, -28439, 17856, 26421, -20841, -24068, 23559, 21406, -25978, -18473, 28063, 15303, -29792, -11939, 31140, 8421, -32092, -4797, 32633, 1110, -32759, 2589, 32466, -6257, -31760, 9843, 30647, -13305, -29146, 16596, 27270, -19677, -25049, 22506, 22506, -25049, -19677, 27270, 16596, -29146, -13305, 30647, 9843, -31760, -6257, 32466, 2589, -32759, 1110, 32633, -4797, -32092, 8421, 31140, -11939, -29792, 15303, 28063, -18473, -25978, 21406, 23559, -24068, -20841, 26421, 17856, -28439, -14645, 30092, 11245, -31363, -7704, 32232, 4062, -32692, -371, 32733, -3327, -32358, 6981, 31569, -10548, -30378, 13978, 28799, -17232, -26853, 20264, 24564, -23039, -21963, 25519, 19079, -27675, -15955, 29475, 12624, -30902, -9135, 31933, 5527, -32558, -1851}, +{32767, -371, -32759, 1110, 32733, -1851, -32692, 2589, 32633, -3327, -32558, 4062, 32466, -4797, -32358, 5527, 32232, -6257, -32092, 6981, 31933, -7704, -31760, 8421, 31569, -9135, -31363, 9843, 31140, -10548, -30902, 11245, 30647, -11939, -30378, 12624, 30092, -13305, -29792, 13978, 29475, -14645, -29146, 15303, 28799, -15955, -28439, 16596, 28063, -17232, -27675, 17856, 27270, -18473, -26853, 19079, 26421, -19677, -25978, 20264, 25519, -20841, -25049, 21406, 24564, -21963, -24068, 22506, 23559, -23039, -23039, 23559, 22506, -24068, -21963, 24564, 21406, -25049, -20841, 25519, 20264, -25978, -19677, 26421, 19079, -26853, -18473, 27270, 17856, -27675, -17232, 28063, 16596, -28439, -15955, 28799, 15303, -29146, -14645, 29475, 13978, -29792, -13305, 30092, 12624, -30378, -11939, 30647, 11245, -30902, -10548, 31140, 9843, -31363, -9135, 31569, 8421, -31760, -7704, 31933, 6981, -32092, -6257, 32232, 5527, -32358, -4797, 32466, 4062, -32558, -3327, 32633, 2589, -32692, -1851, 32733, 1110, -32759, -371}, +{32767, 1110, -32692, -3327, 32466, 5527, -32092, -7704, 31569, 9843, -30902, -11939, 30092, 13978, -29146, -15955, 28063, 17856, -26853, -19677, 25519, 21406, -24068, -23039, 22506, 24564, -20841, -25978, 19079, 27270, -17232, -28439, 15303, 29475, -13305, -30378, 11245, 31140, -9135, -31760, 6981, 32232, -4797, -32558, 2589, 32733, -371, -32759, -1851, 32633, 4062, -32358, -6257, 31933, 8421, -31363, -10548, 30647, 12624, -29792, -14645, 28799, 16596, -27675, -18473, 26421, 20264, -25049, -21963, 23559, 23559, -21963, -25049, 20264, 26421, -18473, -27675, 16596, 28799, -14645, -29792, 12624, 30647, -10548, -31363, 8421, 31933, -6257, -32358, 4062, 32633, -1851, -32759, -371, 32733, 2589, -32558, -4797, 32232, 6981, -31760, -9135, 31140, 11245, -30378, -13305, 29475, 15303, -28439, -17232, 27270, 19079, -25978, -20841, 24564, 22506, -23039, -24068, 21406, 25519, -19677, -26853, 17856, 28063, -15955, -29146, 13978, 30092, -11939, -30902, 9843, 31569, -7704, -32092, 5527, 32466, -3327, -32692, 1110}, +{32767, 2589, -32358, -7704, 31140, 12624, -29146, -17232, 26421, 21406, -23039, -25049, 19079, 28063, -14645, -30378, 9843, 31933, -4797, -32692, -371, 32633, 5527, -31760, -10548, 30092, 15303, -27675, -19677, 24564, 23559, -20841, -26853, 16596, 29475, -11939, -31363, 6981, 32466, -1851, -32759, -3327, 32232, 8421, -30902, -13305, 28799, 17856, -25978, -21963, 22506, 25519, -18473, -28439, 13978, 30647, -9135, -32092, 4062, 32733, 1110, -32558, -6257, 31569, 11245, -29792, -15955, 27270, 20264, -24068, -24068, 20264, 27270, -15955, -29792, 11245, 31569, -6257, -32558, 1110, 32733, 4062, -32092, -9135, 30647, 13978, -28439, -18473, 25519, 22506, -21963, -25978, 17856, 28799, -13305, -30902, 8421, 32232, -3327, -32759, -1851, 32466, 6981, -31363, -11939, 29475, 16596, -26853, -20841, 23559, 24564, -19677, -27675, 15303, 30092, -10548, -31760, 5527, 32633, -371, -32692, -4797, 31933, 9843, -30378, -14645, 28063, 19079, -25049, -23039, 21406, 26421, -17232, -29146, 12624, 31140, -7704, -32358, 2589}, +{32767, 4062, -31760, -11939, 28799, 19079, -24068, -25049, 17856, 29475, -10548, -32092, 2589, 32733, 5527, -31363, -13305, 28063, 20264, -23039, -25978, 16596, 30092, -9135, -32358, 1110, 32633, 6981, -30902, -14645, 27270, 21406, -21963, -26853, 15303, 30647, -7704, -32558, -371, 32466, 8421, -30378, -15955, 26421, 22506, -20841, -27675, 13978, 31140, -6257, -32692, -1851, 32232, 9843, -29792, -17232, 25519, 23559, -19677, -28439, 12624, 31569, -4797, -32759, -3327, 31933, 11245, -29146, -18473, 24564, 24564, -18473, -29146, 11245, 31933, -3327, -32759, -4797, 31569, 12624, -28439, -19677, 23559, 25519, -17232, -29792, 9843, 32232, -1851, -32692, -6257, 31140, 13978, -27675, -20841, 22506, 26421, -15955, -30378, 8421, 32466, -371, -32558, -7704, 30647, 15303, -26853, -21963, 21406, 27270, -14645, -30902, 6981, 32633, 1110, -32358, -9135, 30092, 16596, -25978, -23039, 20264, 28063, -13305, -31363, 5527, 32733, 2589, -32092, -10548, 29475, 17856, -25049, -24068, 19079, 28799, -11939, -31760, 4062}, +{32767, 5527, -30902, -15955, 25519, 24564, -17232, -30378, 6981, 32733, 4062, -31363, -14645, 26421, 23559, -18473, -29792, 8421, 32633, 2589, -31760, -13305, 27270, 22506, -19677, -29146, 9843, 32466, 1110, -32092, -11939, 28063, 21406, -20841, -28439, 11245, 32232, -371, -32358, -10548, 28799, 20264, -21963, -27675, 12624, 31933, -1851, -32558, -9135, 29475, 19079, -23039, -26853, 13978, 31569, -3327, -32692, -7704, 30092, 17856, -24068, -25978, 15303, 31140, -4797, -32759, -6257, 30647, 16596, -25049, -25049, 16596, 30647, -6257, -32759, -4797, 31140, 15303, -25978, -24068, 17856, 30092, -7704, -32692, -3327, 31569, 13978, -26853, -23039, 19079, 29475, -9135, -32558, -1851, 31933, 12624, -27675, -21963, 20264, 28799, -10548, -32358, -371, 32232, 11245, -28439, -20841, 21406, 28063, -11939, -32092, 1110, 32466, 9843, -29146, -19677, 22506, 27270, -13305, -31760, 2589, 32633, 8421, -29792, -18473, 23559, 26421, -14645, -31363, 4062, 32733, 6981, -30378, -17232, 24564, 25519, -15955, -30902, 5527}, +{32767, 6981, -29792, -19677, 21406, 28799, -9135, -32692, -4797, 30647, 17856, -23039, -27675, 11245, 32466, 2589, -31363, -15955, 24564, 26421, -13305, -32092, -371, 31933, 13978, -25978, -25049, 15303, 31569, -1851, -32358, -11939, 27270, 23559, -17232, -30902, 4062, 32633, 9843, -28439, -21963, 19079, 30092, -6257, -32759, -7704, 29475, 20264, -20841, -29146, 8421, 32733, 5527, -30378, -18473, 22506, 28063, -10548, -32558, -3327, 31140, 16596, -24068, -26853, 12624, 32232, 1110, -31760, -14645, 25519, 25519, -14645, -31760, 1110, 32232, 12624, -26853, -24068, 16596, 31140, -3327, -32558, -10548, 28063, 22506, -18473, -30378, 5527, 32733, 8421, -29146, -20841, 20264, 29475, -7704, -32759, -6257, 30092, 19079, -21963, -28439, 9843, 32633, 4062, -30902, -17232, 23559, 27270, -11939, -32358, -1851, 31569, 15303, -25049, -25978, 13978, 31933, -371, -32092, -13305, 26421, 24564, -15955, -31363, 2589, 32466, 11245, -27675, -23039, 17856, 30647, -4797, -32692, -9135, 28799, 21406, -19677, -29792, 6981}, +{32767, 8421, -28439, -23039, 16596, 31569, -371, -31760, -15955, 23559, 28063, -9135, -32759, -7704, 28799, 22506, -17232, -31363, 1110, 31933, 15303, -24068, -27675, 9843, 32733, 6981, -29146, -21963, 17856, 31140, -1851, -32092, -14645, 24564, 27270, -10548, -32692, -6257, 29475, 21406, -18473, -30902, 2589, 32232, 13978, -25049, -26853, 11245, 32633, 5527, -29792, -20841, 19079, 30647, -3327, -32358, -13305, 25519, 26421, -11939, -32558, -4797, 30092, 20264, -19677, -30378, 4062, 32466, 12624, -25978, -25978, 12624, 32466, 4062, -30378, -19677, 20264, 30092, -4797, -32558, -11939, 26421, 25519, -13305, -32358, -3327, 30647, 19079, -20841, -29792, 5527, 32633, 11245, -26853, -25049, 13978, 32232, 2589, -30902, -18473, 21406, 29475, -6257, -32692, -10548, 27270, 24564, -14645, -32092, -1851, 31140, 17856, -21963, -29146, 6981, 32733, 9843, -27675, -24068, 15303, 31933, 1110, -31363, -17232, 22506, 28799, -7704, -32759, -9135, 28063, 23559, -15955, -31760, -371, 31569, 16596, -23039, -28439, 8421}, +{32767, 9843, -26853, -25978, 11245, 32733, 8421, -27675, -25049, 12624, 32633, 6981, -28439, -24068, 13978, 32466, 5527, -29146, -23039, 15303, 32232, 4062, -29792, -21963, 16596, 31933, 2589, -30378, -20841, 17856, 31569, 1110, -30902, -19677, 19079, 31140, -371, -31363, -18473, 20264, 30647, -1851, -31760, -17232, 21406, 30092, -3327, -32092, -15955, 22506, 29475, -4797, -32358, -14645, 23559, 28799, -6257, -32558, -13305, 24564, 28063, -7704, -32692, -11939, 25519, 27270, -9135, -32759, -10548, 26421, 26421, -10548, -32759, -9135, 27270, 25519, -11939, -32692, -7704, 28063, 24564, -13305, -32558, -6257, 28799, 23559, -14645, -32358, -4797, 29475, 22506, -15955, -32092, -3327, 30092, 21406, -17232, -31760, -1851, 30647, 20264, -18473, -31363, -371, 31140, 19079, -19677, -30902, 1110, 31569, 17856, -20841, -30378, 2589, 31933, 16596, -21963, -29792, 4062, 32232, 15303, -23039, -29146, 5527, 32466, 13978, -24068, -28439, 6981, 32633, 12624, -25049, -27675, 8421, 32733, 11245, -25978, -26853, 9843}, +{32767, 11245, -25049, -28439, 5527, 32232, 16596, -20841, -30902, -371, 30647, 21406, -15955, -32358, -6257, 28063, 25519, -10548, -32759, -11939, 24564, 28799, -4797, -32092, -17232, 20264, 31140, 1110, -30378, -21963, 15303, 32466, 6981, -27675, -25978, 9843, 32733, 12624, -24068, -29146, 4062, 31933, 17856, -19677, -31363, -1851, 30092, 22506, -14645, -32558, -7704, 27270, 26421, -9135, -32692, -13305, 23559, 29475, -3327, -31760, -18473, 19079, 31569, 2589, -29792, -23039, 13978, 32633, 8421, -26853, -26853, 8421, 32633, 13978, -23039, -29792, 2589, 31569, 19079, -18473, -31760, -3327, 29475, 23559, -13305, -32692, -9135, 26421, 27270, -7704, -32558, -14645, 22506, 30092, -1851, -31363, -19677, 17856, 31933, 4062, -29146, -24068, 12624, 32733, 9843, -25978, -27675, 6981, 32466, 15303, -21963, -30378, 1110, 31140, 20264, -17232, -32092, -4797, 28799, 24564, -11939, -32759, -10548, 25519, 28063, -6257, -32358, -15955, 21406, 30647, -371, -30902, -20841, 16596, 32232, 5527, -28439, -25049, 11245}, +{32767, 12624, -23039, -30378, -371, 30092, 23559, -11939, -32759, -13305, 22506, 30647, 1110, -29792, -24068, 11245, 32733, 13978, -21963, -30902, -1851, 29475, 24564, -10548, -32692, -14645, 21406, 31140, 2589, -29146, -25049, 9843, 32633, 15303, -20841, -31363, -3327, 28799, 25519, -9135, -32558, -15955, 20264, 31569, 4062, -28439, -25978, 8421, 32466, 16596, -19677, -31760, -4797, 28063, 26421, -7704, -32358, -17232, 19079, 31933, 5527, -27675, -26853, 6981, 32232, 17856, -18473, -32092, -6257, 27270, 27270, -6257, -32092, -18473, 17856, 32232, 6981, -26853, -27675, 5527, 31933, 19079, -17232, -32358, -7704, 26421, 28063, -4797, -31760, -19677, 16596, 32466, 8421, -25978, -28439, 4062, 31569, 20264, -15955, -32558, -9135, 25519, 28799, -3327, -31363, -20841, 15303, 32633, 9843, -25049, -29146, 2589, 31140, 21406, -14645, -32692, -10548, 24564, 29475, -1851, -30902, -21963, 13978, 32733, 11245, -24068, -29792, 1110, 30647, 22506, -13305, -32759, -11939, 23559, 30092, -371, -30378, -23039, 12624}, +{32767, 13978, -20841, -31760, -6257, 26421, 28799, -1851, -30378, -24068, 9843, 32466, 17856, -17232, -32558, -10548, 23559, 30647, 2589, -28439, -26853, 5527, 31569, 21406, -13305, -32759, -14645, 20264, 31933, 6981, -25978, -29146, 1110, 30092, 24564, -9135, -32358, -18473, 16596, 32633, 11245, -23039, -30902, -3327, 28063, 27270, -4797, -31363, -21963, 12624, 32733, 15303, -19677, -32092, -7704, 25519, 29475, -371, -29792, -25049, 8421, 32232, 19079, -15955, -32692, -11939, 22506, 31140, 4062, -27675, -27675, 4062, 31140, 22506, -11939, -32692, -15955, 19079, 32232, 8421, -25049, -29792, -371, 29475, 25519, -7704, -32092, -19677, 15303, 32733, 12624, -21963, -31363, -4797, 27270, 28063, -3327, -30902, -23039, 11245, 32633, 16596, -18473, -32358, -9135, 24564, 30092, 1110, -29146, -25978, 6981, 31933, 20264, -14645, -32759, -13305, 21406, 31569, 5527, -26853, -28439, 2589, 30647, 23559, -10548, -32558, -17232, 17856, 32466, 9843, -24068, -30378, -1851, 28799, 26421, -6257, -31760, -20841, 13978}, +{32767, 15303, -18473, -32558, -11939, 21406, 31933, 8421, -24068, -30902, -4797, 26421, 29475, 1110, -28439, -27675, 2589, 30092, 25519, -6257, -31363, -23039, 9843, 32232, 20264, -13305, -32692, -17232, 16596, 32733, 13978, -19677, -32358, -10548, 22506, 31569, 6981, -25049, -30378, -3327, 27270, 28799, -371, -29146, -26853, 4062, 30647, 24564, -7704, -31760, -21963, 11245, 32466, 19079, -14645, -32759, -15955, 17856, 32633, 12624, -20841, -32092, -9135, 23559, 31140, 5527, -25978, -29792, -1851, 28063, 28063, -1851, -29792, -25978, 5527, 31140, 23559, -9135, -32092, -20841, 12624, 32633, 17856, -15955, -32759, -14645, 19079, 32466, 11245, -21963, -31760, -7704, 24564, 30647, 4062, -26853, -29146, -371, 28799, 27270, -3327, -30378, -25049, 6981, 31569, 22506, -10548, -32358, -19677, 13978, 32733, 16596, -17232, -32692, -13305, 20264, 32232, 9843, -23039, -31363, -6257, 25519, 30092, 2589, -27675, -28439, 1110, 29475, 26421, -4797, -30902, -24068, 8421, 31933, 21406, -11939, -32558, -18473, 15303}, +{32767, 16596, -15955, -32759, -17232, 15303, 32733, 17856, -14645, -32692, -18473, 13978, 32633, 19079, -13305, -32558, -19677, 12624, 32466, 20264, -11939, -32358, -20841, 11245, 32232, 21406, -10548, -32092, -21963, 9843, 31933, 22506, -9135, -31760, -23039, 8421, 31569, 23559, -7704, -31363, -24068, 6981, 31140, 24564, -6257, -30902, -25049, 5527, 30647, 25519, -4797, -30378, -25978, 4062, 30092, 26421, -3327, -29792, -26853, 2589, 29475, 27270, -1851, -29146, -27675, 1110, 28799, 28063, -371, -28439, -28439, -371, 28063, 28799, 1110, -27675, -29146, -1851, 27270, 29475, 2589, -26853, -29792, -3327, 26421, 30092, 4062, -25978, -30378, -4797, 25519, 30647, 5527, -25049, -30902, -6257, 24564, 31140, 6981, -24068, -31363, -7704, 23559, 31569, 8421, -23039, -31760, -9135, 22506, 31933, 9843, -21963, -32092, -10548, 21406, 32232, 11245, -20841, -32358, -11939, 20264, 32466, 12624, -19677, -32558, -13305, 19079, 32633, 13978, -18473, -32692, -14645, 17856, 32733, 15303, -17232, -32759, -15955, 16596}, +{32767, 17856, -13305, -32358, -21963, 8421, 31140, 25519, -3327, -29146, -28439, -1851, 26421, 30647, 6981, -23039, -32092, -11939, 19079, 32733, 16596, -14645, -32558, -20841, 9843, 31569, 24564, -4797, -29792, -27675, -371, 27270, 30092, 5527, -24068, -31760, -10548, 20264, 32633, 15303, -15955, -32692, -19677, 11245, 31933, 23559, -6257, -30378, -26853, 1110, 28063, 29475, 4062, -25049, -31363, -9135, 21406, 32466, 13978, -17232, -32759, -18473, 12624, 32232, 22506, -7704, -30902, -25978, 2589, 28799, 28799, 2589, -25978, -30902, -7704, 22506, 32232, 12624, -18473, -32759, -17232, 13978, 32466, 21406, -9135, -31363, -25049, 4062, 29475, 28063, 1110, -26853, -30378, -6257, 23559, 31933, 11245, -19677, -32692, -15955, 15303, 32633, 20264, -10548, -31760, -24068, 5527, 30092, 27270, -371, -27675, -29792, -4797, 24564, 31569, 9843, -20841, -32558, -14645, 16596, 32733, 19079, -11939, -32092, -23039, 6981, 30647, 26421, -1851, -28439, -29146, -3327, 25519, 31140, 8421, -21963, -32358, -13305, 17856}, +{32767, 19079, -10548, -31363, -25978, 1110, 27270, 30647, 8421, -20841, -32692, -17232, 12624, 31933, 24564, -3327, -28439, -29792, -6257, 22506, 32466, 15303, -14645, -32358, -23039, 5527, 29475, 28799, 4062, -24068, -32092, -13305, 16596, 32633, 21406, -7704, -30378, -27675, -1851, 25519, 31569, 11245, -18473, -32759, -19677, 9843, 31140, 26421, -371, -26853, -30902, -9135, 20264, 32733, 17856, -11939, -31760, -25049, 2589, 28063, 30092, 6981, -21963, -32558, -15955, 13978, 32232, 23559, -4797, -29146, -29146, -4797, 23559, 32232, 13978, -15955, -32558, -21963, 6981, 30092, 28063, 2589, -25049, -31760, -11939, 17856, 32733, 20264, -9135, -30902, -26853, -371, 26421, 31140, 9843, -19677, -32759, -18473, 11245, 31569, 25519, -1851, -27675, -30378, -7704, 21406, 32633, 16596, -13305, -32092, -24068, 4062, 28799, 29475, 5527, -23039, -32358, -14645, 15303, 32466, 22506, -6257, -29792, -28439, -3327, 24564, 31933, 12624, -17232, -32692, -20841, 8421, 30647, 27270, 1110, -25978, -31363, -10548, 19079}, +{32767, 20264, -7704, -29792, -29146, -6257, 21406, 32733, 19079, -9135, -30378, -28439, -4797, 22506, 32633, 17856, -10548, -30902, -27675, -3327, 23559, 32466, 16596, -11939, -31363, -26853, -1851, 24564, 32232, 15303, -13305, -31760, -25978, -371, 25519, 31933, 13978, -14645, -32092, -25049, 1110, 26421, 31569, 12624, -15955, -32358, -24068, 2589, 27270, 31140, 11245, -17232, -32558, -23039, 4062, 28063, 30647, 9843, -18473, -32692, -21963, 5527, 28799, 30092, 8421, -19677, -32759, -20841, 6981, 29475, 29475, 6981, -20841, -32759, -19677, 8421, 30092, 28799, 5527, -21963, -32692, -18473, 9843, 30647, 28063, 4062, -23039, -32558, -17232, 11245, 31140, 27270, 2589, -24068, -32358, -15955, 12624, 31569, 26421, 1110, -25049, -32092, -14645, 13978, 31933, 25519, -371, -25978, -31760, -13305, 15303, 32232, 24564, -1851, -26853, -31363, -11939, 16596, 32466, 23559, -3327, -27675, -30902, -10548, 17856, 32633, 22506, -4797, -28439, -30378, -9135, 19079, 32733, 21406, -6257, -29146, -29792, -7704, 20264}, +{32767, 21406, -4797, -27675, -31363, -13305, 13978, 31569, 27270, 4062, -21963, -32759, -20841, 5527, 28063, 31140, 12624, -14645, -31760, -26853, -3327, 22506, 32733, 20264, -6257, -28439, -30902, -11939, 15303, 31933, 26421, 2589, -23039, -32692, -19677, 6981, 28799, 30647, 11245, -15955, -32092, -25978, -1851, 23559, 32633, 19079, -7704, -29146, -30378, -10548, 16596, 32232, 25519, 1110, -24068, -32558, -18473, 8421, 29475, 30092, 9843, -17232, -32358, -25049, -371, 24564, 32466, 17856, -9135, -29792, -29792, -9135, 17856, 32466, 24564, -371, -25049, -32358, -17232, 9843, 30092, 29475, 8421, -18473, -32558, -24068, 1110, 25519, 32232, 16596, -10548, -30378, -29146, -7704, 19079, 32633, 23559, -1851, -25978, -32092, -15955, 11245, 30647, 28799, 6981, -19677, -32692, -23039, 2589, 26421, 31933, 15303, -11939, -30902, -28439, -6257, 20264, 32733, 22506, -3327, -26853, -31760, -14645, 12624, 31140, 28063, 5527, -20841, -32759, -21963, 4062, 27270, 31569, 13978, -13305, -31363, -27675, -4797, 21406}, +{32767, 22506, -1851, -25049, -32558, -19677, 5527, 27270, 31933, 16596, -9135, -29146, -30902, -13305, 12624, 30647, 29475, 9843, -15955, -31760, -27675, -6257, 19079, 32466, 25519, 2589, -21963, -32759, -23039, 1110, 24564, 32633, 20264, -4797, -26853, -32092, -17232, 8421, 28799, 31140, 13978, -11939, -30378, -29792, -10548, 15303, 31569, 28063, 6981, -18473, -32358, -25978, -3327, 21406, 32733, 23559, -371, -24068, -32692, -20841, 4062, 26421, 32232, 17856, -7704, -28439, -31363, -14645, 11245, 30092, 30092, 11245, -14645, -31363, -28439, -7704, 17856, 32232, 26421, 4062, -20841, -32692, -24068, -371, 23559, 32733, 21406, -3327, -25978, -32358, -18473, 6981, 28063, 31569, 15303, -10548, -29792, -30378, -11939, 13978, 31140, 28799, 8421, -17232, -32092, -26853, -4797, 20264, 32633, 24564, 1110, -23039, -32759, -21963, 2589, 25519, 32466, 19079, -6257, -27675, -31760, -15955, 9843, 29475, 30647, 12624, -13305, -30902, -29146, -9135, 16596, 31933, 27270, 5527, -19677, -32558, -25049, -1851, 22506}, +{32767, 23559, 1110, -21963, -32692, -25049, -3327, 20264, 32466, 26421, 5527, -18473, -32092, -27675, -7704, 16596, 31569, 28799, 9843, -14645, -30902, -29792, -11939, 12624, 30092, 30647, 13978, -10548, -29146, -31363, -15955, 8421, 28063, 31933, 17856, -6257, -26853, -32358, -19677, 4062, 25519, 32633, 21406, -1851, -24068, -32759, -23039, -371, 22506, 32733, 24564, 2589, -20841, -32558, -25978, -4797, 19079, 32232, 27270, 6981, -17232, -31760, -28439, -9135, 15303, 31140, 29475, 11245, -13305, -30378, -30378, -13305, 11245, 29475, 31140, 15303, -9135, -28439, -31760, -17232, 6981, 27270, 32232, 19079, -4797, -25978, -32558, -20841, 2589, 24564, 32733, 22506, -371, -23039, -32759, -24068, -1851, 21406, 32633, 25519, 4062, -19677, -32358, -26853, -6257, 17856, 31933, 28063, 8421, -15955, -31363, -29146, -10548, 13978, 30647, 30092, 12624, -11939, -29792, -30902, -14645, 9843, 28799, 31569, 16596, -7704, -27675, -32092, -18473, 5527, 26421, 32466, 20264, -3327, -25049, -32692, -21963, 1110, 23559}, +{32767, 24564, 4062, -18473, -31760, -29146, -11939, 11245, 28799, 31933, 19079, -3327, -24068, -32759, -25049, -4797, 17856, 31569, 29475, 12624, -10548, -28439, -32092, -19677, 2589, 23559, 32733, 25519, 5527, -17232, -31363, -29792, -13305, 9843, 28063, 32232, 20264, -1851, -23039, -32692, -25978, -6257, 16596, 31140, 30092, 13978, -9135, -27675, -32358, -20841, 1110, 22506, 32633, 26421, 6981, -15955, -30902, -30378, -14645, 8421, 27270, 32466, 21406, -371, -21963, -32558, -26853, -7704, 15303, 30647, 30647, 15303, -7704, -26853, -32558, -21963, -371, 21406, 32466, 27270, 8421, -14645, -30378, -30902, -15955, 6981, 26421, 32633, 22506, 1110, -20841, -32358, -27675, -9135, 13978, 30092, 31140, 16596, -6257, -25978, -32692, -23039, -1851, 20264, 32232, 28063, 9843, -13305, -29792, -31363, -17232, 5527, 25519, 32733, 23559, 2589, -19677, -32092, -28439, -10548, 12624, 29475, 31569, 17856, -4797, -25049, -32759, -24068, -3327, 19079, 31933, 28799, 11245, -11939, -29146, -31760, -18473, 4062, 24564}, +{32767, 25519, 6981, -14645, -29792, -31760, -19677, 1110, 21406, 32232, 28799, 12624, -9135, -26853, -32692, -24068, -4797, 16596, 30647, 31140, 17856, -3327, -23039, -32558, -27675, -10548, 11245, 28063, 32466, 22506, 2589, -18473, -31363, -30378, -15955, 5527, 24564, 32733, 26421, 8421, -13305, -29146, -32092, -20841, -371, 20264, 31933, 29475, 13978, -7704, -25978, -32759, -25049, -6257, 15303, 30092, 31569, 19079, -1851, -21963, -32358, -28439, -11939, 9843, 27270, 32633, 23559, 4062, -17232, -30902, -30902, -17232, 4062, 23559, 32633, 27270, 9843, -11939, -28439, -32358, -21963, -1851, 19079, 31569, 30092, 15303, -6257, -25049, -32759, -25978, -7704, 13978, 29475, 31933, 20264, -371, -20841, -32092, -29146, -13305, 8421, 26421, 32733, 24564, 5527, -15955, -30378, -31363, -18473, 2589, 22506, 32466, 28063, 11245, -10548, -27675, -32558, -23039, -3327, 17856, 31140, 30647, 16596, -4797, -24068, -32692, -26853, -9135, 12624, 28799, 32232, 21406, 1110, -19677, -31760, -29792, -14645, 6981, 25519}, +{32767, 26421, 9843, -10548, -26853, -32759, -25978, -9135, 11245, 27270, 32733, 25519, 8421, -11939, -27675, -32692, -25049, -7704, 12624, 28063, 32633, 24564, 6981, -13305, -28439, -32558, -24068, -6257, 13978, 28799, 32466, 23559, 5527, -14645, -29146, -32358, -23039, -4797, 15303, 29475, 32232, 22506, 4062, -15955, -29792, -32092, -21963, -3327, 16596, 30092, 31933, 21406, 2589, -17232, -30378, -31760, -20841, -1851, 17856, 30647, 31569, 20264, 1110, -18473, -30902, -31363, -19677, -371, 19079, 31140, 31140, 19079, -371, -19677, -31363, -30902, -18473, 1110, 20264, 31569, 30647, 17856, -1851, -20841, -31760, -30378, -17232, 2589, 21406, 31933, 30092, 16596, -3327, -21963, -32092, -29792, -15955, 4062, 22506, 32232, 29475, 15303, -4797, -23039, -32358, -29146, -14645, 5527, 23559, 32466, 28799, 13978, -6257, -24068, -32558, -28439, -13305, 6981, 24564, 32633, 28063, 12624, -7704, -25049, -32692, -27675, -11939, 8421, 25519, 32733, 27270, 11245, -9135, -25978, -32759, -26853, -10548, 9843, 26421}, +{32767, 27270, 12624, -6257, -23039, -32092, -30378, -18473, -371, 17856, 30092, 32232, 23559, 6981, -11939, -26853, -32759, -27675, -13305, 5527, 22506, 31933, 30647, 19079, 1110, -17232, -29792, -32358, -24068, -7704, 11245, 26421, 32733, 28063, 13978, -4797, -21963, -31760, -30902, -19677, -1851, 16596, 29475, 32466, 24564, 8421, -10548, -25978, -32692, -28439, -14645, 4062, 21406, 31569, 31140, 20264, 2589, -15955, -29146, -32558, -25049, -9135, 9843, 25519, 32633, 28799, 15303, -3327, -20841, -31363, -31363, -20841, -3327, 15303, 28799, 32633, 25519, 9843, -9135, -25049, -32558, -29146, -15955, 2589, 20264, 31140, 31569, 21406, 4062, -14645, -28439, -32692, -25978, -10548, 8421, 24564, 32466, 29475, 16596, -1851, -19677, -30902, -31760, -21963, -4797, 13978, 28063, 32733, 26421, 11245, -7704, -24068, -32358, -29792, -17232, 1110, 19079, 30647, 31933, 22506, 5527, -13305, -27675, -32759, -26853, -11939, 6981, 23559, 32232, 30092, 17856, -371, -18473, -30378, -32092, -23039, -6257, 12624, 27270}, +{32767, 28063, 15303, -1851, -18473, -29792, -32558, -25978, -11939, 5527, 21406, 31140, 31933, 23559, 8421, -9135, -24068, -32092, -30902, -20841, -4797, 12624, 26421, 32633, 29475, 17856, 1110, -15955, -28439, -32759, -27675, -14645, 2589, 19079, 30092, 32466, 25519, 11245, -6257, -21963, -31363, -31760, -23039, -7704, 9843, 24564, 32232, 30647, 20264, 4062, -13305, -26853, -32692, -29146, -17232, -371, 16596, 28799, 32733, 27270, 13978, -3327, -19677, -30378, -32358, -25049, -10548, 6981, 22506, 31569, 31569, 22506, 6981, -10548, -25049, -32358, -30378, -19677, -3327, 13978, 27270, 32733, 28799, 16596, -371, -17232, -29146, -32692, -26853, -13305, 4062, 20264, 30647, 32232, 24564, 9843, -7704, -23039, -31760, -31363, -21963, -6257, 11245, 25519, 32466, 30092, 19079, 2589, -14645, -27675, -32759, -28439, -15955, 1110, 17856, 29475, 32633, 26421, 12624, -4797, -20841, -30902, -32092, -24068, -9135, 8421, 23559, 31933, 31140, 21406, 5527, -11939, -25978, -32558, -29792, -18473, -1851, 15303, 28063}, +{32767, 28799, 17856, 2589, -13305, -25978, -32358, -30902, -21963, -7704, 8421, 22506, 31140, 32232, 25519, 12624, -3327, -18473, -29146, -32759, -28439, -17232, -1851, 13978, 26421, 32466, 30647, 21406, 6981, -9135, -23039, -31363, -32092, -25049, -11939, 4062, 19079, 29475, 32733, 28063, 16596, 1110, -14645, -26853, -32558, -30378, -20841, -6257, 9843, 23559, 31569, 31933, 24564, 11245, -4797, -19677, -29792, -32692, -27675, -15955, -371, 15303, 27270, 32633, 30092, 20264, 5527, -10548, -24068, -31760, -31760, -24068, -10548, 5527, 20264, 30092, 32633, 27270, 15303, -371, -15955, -27675, -32692, -29792, -19677, -4797, 11245, 24564, 31933, 31569, 23559, 9843, -6257, -20841, -30378, -32558, -26853, -14645, 1110, 16596, 28063, 32733, 29475, 19079, 4062, -11939, -25049, -32092, -31363, -23039, -9135, 6981, 21406, 30647, 32466, 26421, 13978, -1851, -17232, -28439, -32759, -29146, -18473, -3327, 12624, 25519, 32232, 31140, 22506, 8421, -7704, -21963, -30902, -32358, -25978, -13305, 2589, 17856, 28799}, +{32767, 29475, 20264, 6981, -7704, -20841, -29792, -32759, -29146, -19677, -6257, 8421, 21406, 30092, 32733, 28799, 19079, 5527, -9135, -21963, -30378, -32692, -28439, -18473, -4797, 9843, 22506, 30647, 32633, 28063, 17856, 4062, -10548, -23039, -30902, -32558, -27675, -17232, -3327, 11245, 23559, 31140, 32466, 27270, 16596, 2589, -11939, -24068, -31363, -32358, -26853, -15955, -1851, 12624, 24564, 31569, 32232, 26421, 15303, 1110, -13305, -25049, -31760, -32092, -25978, -14645, -371, 13978, 25519, 31933, 31933, 25519, 13978, -371, -14645, -25978, -32092, -31760, -25049, -13305, 1110, 15303, 26421, 32232, 31569, 24564, 12624, -1851, -15955, -26853, -32358, -31363, -24068, -11939, 2589, 16596, 27270, 32466, 31140, 23559, 11245, -3327, -17232, -27675, -32558, -30902, -23039, -10548, 4062, 17856, 28063, 32633, 30647, 22506, 9843, -4797, -18473, -28439, -32692, -30378, -21963, -9135, 5527, 19079, 28799, 32733, 30092, 21406, 8421, -6257, -19677, -29146, -32759, -29792, -20841, -7704, 6981, 20264, 29475}, +{32767, 30092, 22506, 11245, -1851, -14645, -25049, -31363, -32558, -28439, -19677, -7704, 5527, 17856, 27270, 32232, 31933, 26421, 16596, 4062, -9135, -20841, -29146, -32692, -30902, -24068, -13305, -371, 12624, 23559, 30647, 32733, 29475, 21406, 9843, -3327, -15955, -25978, -31760, -32358, -27675, -18473, -6257, 6981, 19079, 28063, 32466, 31569, 25519, 15303, 2589, -10548, -21963, -29792, -32759, -30378, -23039, -11939, 1110, 13978, 24564, 31140, 32633, 28799, 20264, 8421, -4797, -17232, -26853, -32092, -32092, -26853, -17232, -4797, 8421, 20264, 28799, 32633, 31140, 24564, 13978, 1110, -11939, -23039, -30378, -32759, -29792, -21963, -10548, 2589, 15303, 25519, 31569, 32466, 28063, 19079, 6981, -6257, -18473, -27675, -32358, -31760, -25978, -15955, -3327, 9843, 21406, 29475, 32733, 30647, 23559, 12624, -371, -13305, -24068, -30902, -32692, -29146, -20841, -9135, 4062, 16596, 26421, 31933, 32232, 27270, 17856, 5527, -7704, -19677, -28439, -32558, -31363, -25049, -14645, -1851, 11245, 22506, 30092}, +{32767, 30647, 24564, 15303, 4062, -7704, -18473, -26853, -31760, -32558, -29146, -21963, -11939, -371, 11245, 21406, 28799, 32466, 31933, 27270, 19079, 8421, -3327, -14645, -24068, -30378, -32759, -30902, -25049, -15955, -4797, 6981, 17856, 26421, 31569, 32633, 29475, 22506, 12624, 1110, -10548, -20841, -28439, -32358, -32092, -27675, -19677, -9135, 2589, 13978, 23559, 30092, 32733, 31140, 25519, 16596, 5527, -6257, -17232, -25978, -31363, -32692, -29792, -23039, -13305, -1851, 9843, 20264, 28063, 32232, 32232, 28063, 20264, 9843, -1851, -13305, -23039, -29792, -32692, -31363, -25978, -17232, -6257, 5527, 16596, 25519, 31140, 32733, 30092, 23559, 13978, 2589, -9135, -19677, -27675, -32092, -32358, -28439, -20841, -10548, 1110, 12624, 22506, 29475, 32633, 31569, 26421, 17856, 6981, -4797, -15955, -25049, -30902, -32759, -30378, -24068, -14645, -3327, 8421, 19079, 27270, 31933, 32466, 28799, 21406, 11245, -371, -11939, -21963, -29146, -32558, -31760, -26853, -18473, -7704, 4062, 15303, 24564, 30647}, +{32767, 31140, 26421, 19079, 9843, -371, -10548, -19677, -26853, -31363, -32759, -30902, -25978, -18473, -9135, 1110, 11245, 20264, 27270, 31569, 32733, 30647, 25519, 17856, 8421, -1851, -11939, -20841, -27675, -31760, -32692, -30378, -25049, -17232, -7704, 2589, 12624, 21406, 28063, 31933, 32633, 30092, 24564, 16596, 6981, -3327, -13305, -21963, -28439, -32092, -32558, -29792, -24068, -15955, -6257, 4062, 13978, 22506, 28799, 32232, 32466, 29475, 23559, 15303, 5527, -4797, -14645, -23039, -29146, -32358, -32358, -29146, -23039, -14645, -4797, 5527, 15303, 23559, 29475, 32466, 32232, 28799, 22506, 13978, 4062, -6257, -15955, -24068, -29792, -32558, -32092, -28439, -21963, -13305, -3327, 6981, 16596, 24564, 30092, 32633, 31933, 28063, 21406, 12624, 2589, -7704, -17232, -25049, -30378, -32692, -31760, -27675, -20841, -11939, -1851, 8421, 17856, 25519, 30647, 32733, 31569, 27270, 20264, 11245, 1110, -9135, -18473, -25978, -30902, -32759, -31363, -26853, -19677, -10548, -371, 9843, 19079, 26421, 31140}, +{32767, 31569, 28063, 22506, 15303, 6981, -1851, -10548, -18473, -25049, -29792, -32358, -32558, -30378, -25978, -19677, -11939, -3327, 5527, 13978, 21406, 27270, 31140, 32733, 31933, 28799, 23559, 16596, 8421, -371, -9135, -17232, -24068, -29146, -32092, -32692, -30902, -26853, -20841, -13305, -4797, 4062, 12624, 20264, 26421, 30647, 32633, 32232, 29475, 24564, 17856, 9843, 1110, -7704, -15955, -23039, -28439, -31760, -32759, -31363, -27675, -21963, -14645, -6257, 2589, 11245, 19079, 25519, 30092, 32466, 32466, 30092, 25519, 19079, 11245, 2589, -6257, -14645, -21963, -27675, -31363, -32759, -31760, -28439, -23039, -15955, -7704, 1110, 9843, 17856, 24564, 29475, 32232, 32633, 30647, 26421, 20264, 12624, 4062, -4797, -13305, -20841, -26853, -30902, -32692, -32092, -29146, -24068, -17232, -9135, -371, 8421, 16596, 23559, 28799, 31933, 32733, 31140, 27270, 21406, 13978, 5527, -3327, -11939, -19677, -25978, -30378, -32558, -32358, -29792, -25049, -18473, -10548, -1851, 6981, 15303, 22506, 28063, 31569}, +{32767, 31933, 29475, 25519, 20264, 13978, 6981, -371, -7704, -14645, -20841, -25978, -29792, -32092, -32759, -31760, -29146, -25049, -19677, -13305, -6257, 1110, 8421, 15303, 21406, 26421, 30092, 32232, 32733, 31569, 28799, 24564, 19079, 12624, 5527, -1851, -9135, -15955, -21963, -26853, -30378, -32358, -32692, -31363, -28439, -24068, -18473, -11939, -4797, 2589, 9843, 16596, 22506, 27270, 30647, 32466, 32633, 31140, 28063, 23559, 17856, 11245, 4062, -3327, -10548, -17232, -23039, -27675, -30902, -32558, -32558, -30902, -27675, -23039, -17232, -10548, -3327, 4062, 11245, 17856, 23559, 28063, 31140, 32633, 32466, 30647, 27270, 22506, 16596, 9843, 2589, -4797, -11939, -18473, -24068, -28439, -31363, -32692, -32358, -30378, -26853, -21963, -15955, -9135, -1851, 5527, 12624, 19079, 24564, 28799, 31569, 32733, 32232, 30092, 26421, 21406, 15303, 8421, 1110, -6257, -13305, -19677, -25049, -29146, -31760, -32759, -32092, -29792, -25978, -20841, -14645, -7704, -371, 6981, 13978, 20264, 25519, 29475, 31933}, +{32767, 32232, 30647, 28063, 24564, 20264, 15303, 9843, 4062, -1851, -7704, -13305, -18473, -23039, -26853, -29792, -31760, -32692, -32558, -31363, -29146, -25978, -21963, -17232, -11939, -6257, -371, 5527, 11245, 16596, 21406, 25519, 28799, 31140, 32466, 32733, 31933, 30092, 27270, 23559, 19079, 13978, 8421, 2589, -3327, -9135, -14645, -19677, -24068, -27675, -30378, -32092, -32759, -32358, -30902, -28439, -25049, -20841, -15955, -10548, -4797, 1110, 6981, 12624, 17856, 22506, 26421, 29475, 31569, 32633, 32633, 31569, 29475, 26421, 22506, 17856, 12624, 6981, 1110, -4797, -10548, -15955, -20841, -25049, -28439, -30902, -32358, -32759, -32092, -30378, -27675, -24068, -19677, -14645, -9135, -3327, 2589, 8421, 13978, 19079, 23559, 27270, 30092, 31933, 32733, 32466, 31140, 28799, 25519, 21406, 16596, 11245, 5527, -371, -6257, -11939, -17232, -21963, -25978, -29146, -31363, -32558, -32692, -31760, -29792, -26853, -23039, -18473, -13305, -7704, -1851, 4062, 9843, 15303, 20264, 24564, 28063, 30647, 32232}, +{32767, 32466, 31569, 30092, 28063, 25519, 22506, 19079, 15303, 11245, 6981, 2589, -1851, -6257, -10548, -14645, -18473, -21963, -25049, -27675, -29792, -31363, -32358, -32759, -32558, -31760, -30378, -28439, -25978, -23039, -19677, -15955, -11939, -7704, -3327, 1110, 5527, 9843, 13978, 17856, 21406, 24564, 27270, 29475, 31140, 32232, 32733, 32633, 31933, 30647, 28799, 26421, 23559, 20264, 16596, 12624, 8421, 4062, -371, -4797, -9135, -13305, -17232, -20841, -24068, -26853, -29146, -30902, -32092, -32692, -32692, -32092, -30902, -29146, -26853, -24068, -20841, -17232, -13305, -9135, -4797, -371, 4062, 8421, 12624, 16596, 20264, 23559, 26421, 28799, 30647, 31933, 32633, 32733, 32232, 31140, 29475, 27270, 24564, 21406, 17856, 13978, 9843, 5527, 1110, -3327, -7704, -11939, -15955, -19677, -23039, -25978, -28439, -30378, -31760, -32558, -32759, -32358, -31363, -29792, -27675, -25049, -21963, -18473, -14645, -10548, -6257, -1851, 2589, 6981, 11245, 15303, 19079, 22506, 25519, 28063, 30092, 31569, 32466}, +{32767, 32633, 32232, 31569, 30647, 29475, 28063, 26421, 24564, 22506, 20264, 17856, 15303, 12624, 9843, 6981, 4062, 1110, -1851, -4797, -7704, -10548, -13305, -15955, -18473, -20841, -23039, -25049, -26853, -28439, -29792, -30902, -31760, -32358, -32692, -32759, -32558, -32092, -31363, -30378, -29146, -27675, -25978, -24068, -21963, -19677, -17232, -14645, -11939, -9135, -6257, -3327, -371, 2589, 5527, 8421, 11245, 13978, 16596, 19079, 21406, 23559, 25519, 27270, 28799, 30092, 31140, 31933, 32466, 32733, 32733, 32466, 31933, 31140, 30092, 28799, 27270, 25519, 23559, 21406, 19079, 16596, 13978, 11245, 8421, 5527, 2589, -371, -3327, -6257, -9135, -11939, -14645, -17232, -19677, -21963, -24068, -25978, -27675, -29146, -30378, -31363, -32092, -32558, -32759, -32692, -32358, -31760, -30902, -29792, -28439, -26853, -25049, -23039, -20841, -18473, -15955, -13305, -10548, -7704, -4797, -1851, 1110, 4062, 6981, 9843, 12624, 15303, 17856, 20264, 22506, 24564, 26421, 28063, 29475, 30647, 31569, 32232, 32633}, +{32767, 32733, 32633, 32466, 32232, 31933, 31569, 31140, 30647, 30092, 29475, 28799, 28063, 27270, 26421, 25519, 24564, 23559, 22506, 21406, 20264, 19079, 17856, 16596, 15303, 13978, 12624, 11245, 9843, 8421, 6981, 5527, 4062, 2589, 1110, -371, -1851, -3327, -4797, -6257, -7704, -9135, -10548, -11939, -13305, -14645, -15955, -17232, -18473, -19677, -20841, -21963, -23039, -24068, -25049, -25978, -26853, -27675, -28439, -29146, -29792, -30378, -30902, -31363, -31760, -32092, -32358, -32558, -32692, -32759, -32759, -32692, -32558, -32358, -32092, -31760, -31363, -30902, -30378, -29792, -29146, -28439, -27675, -26853, -25978, -25049, -24068, -23039, -21963, -20841, -19677, -18473, -17232, -15955, -14645, -13305, -11939, -10548, -9135, -7704, -6257, -4797, -3327, -1851, -371, 1110, 2589, 4062, 5527, 6981, 8421, 9843, 11245, 12624, 13978, 15303, 16596, 17856, 19079, 20264, 21406, 22506, 23559, 24564, 25519, 26421, 27270, 28063, 28799, 29475, 30092, 30647, 31140, 31569, 31933, 32232, 32466, 32633, 32733} +}; + + +int16_t prach_fft139_im[139][139] = { +{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{0, -1481, -2959, -4430, -5893, -7343, -8779, -10196, -11593, -12966, -14313, -15630, -16916, -18166, -19380, -20554, -21686, -22774, -23816, -24808, -25750, -26640, -27474, -28253, -28974, -29636, -30238, -30777, -31254, -31667, -32015, -32298, -32515, -32665, -32749, -32765, -32715, -32598, -32415, -32165, -31849, -31469, -31024, -30515, -29945, -29313, -28621, -27871, -27064, -26202, -25286, -24318, -23301, -22236, -21126, -19972, -18778, -17545, -16277, -14975, -13643, -12283, -10898, -9490, -8063, -6620, -5163, -3696, -2221, -741, 740, 2220, 3695, 5162, 6619, 8062, 9489, 10897, 12282, 13642, 14974, 16276, 17544, 18777, 19971, 21125, 22235, 23300, 24317, 25285, 26201, 27063, 27870, 28620, 29312, 29944, 30514, 31023, 31468, 31848, 32164, 32414, 32597, 32714, 32764, 32748, 32664, 32514, 32297, 32014, 31666, 31253, 30776, 30237, 29635, 28973, 28252, 27473, 26639, 25749, 24807, 23815, 22773, 21685, 20553, 19379, 18165, 16915, 15629, 14312, 12965, 11592, 10195, 8778, 7342, 5892, 4429, 2958, 1480}, +{0, -2959, -5893, -8779, -11593, -14313, -16916, -19380, -21686, -23816, -25750, -27474, -28974, -30238, -31254, -32015, -32515, -32749, -32715, -32415, -31849, -31024, -29945, -28621, -27064, -25286, -23301, -21126, -18778, -16277, -13643, -10898, -8063, -5163, -2221, 740, 3695, 6619, 9489, 12282, 14974, 17544, 19971, 22235, 24317, 26201, 27870, 29312, 30514, 31468, 32164, 32597, 32764, 32664, 32297, 31666, 30776, 29635, 28252, 26639, 24807, 22773, 20553, 18165, 15629, 12965, 10195, 7342, 4429, 1480, -1481, -4430, -7343, -10196, -12966, -15630, -18166, -20554, -22774, -24808, -26640, -28253, -29636, -30777, -31667, -32298, -32665, -32765, -32598, -32165, -31469, -30515, -29313, -27871, -26202, -24318, -22236, -19972, -17545, -14975, -12283, -9490, -6620, -3696, -741, 2220, 5162, 8062, 10897, 13642, 16276, 18777, 21125, 23300, 25285, 27063, 28620, 29944, 31023, 31848, 32414, 32714, 32748, 32514, 32014, 31253, 30237, 28973, 27473, 25749, 23815, 21685, 19379, 16915, 14312, 11592, 8778, 5892, 2958}, +{0, -4430, -8779, -12966, -16916, -20554, -23816, -26640, -28974, -30777, -32015, -32665, -32715, -32165, -31024, -29313, -27064, -24318, -21126, -17545, -13643, -9490, -5163, -741, 3695, 8062, 12282, 16276, 19971, 23300, 26201, 28620, 30514, 31848, 32597, 32748, 32297, 31253, 29635, 27473, 24807, 21685, 18165, 14312, 10195, 5892, 1480, -2959, -7343, -11593, -15630, -19380, -22774, -25750, -28253, -30238, -31667, -32515, -32765, -32415, -31469, -29945, -27871, -25286, -22236, -18778, -14975, -10898, -6620, -2221, 2220, 6619, 10897, 14974, 18777, 22235, 25285, 27870, 29944, 31468, 32414, 32764, 32514, 31666, 30237, 28252, 25749, 22773, 19379, 15629, 11592, 7342, 2958, -1481, -5893, -10196, -14313, -18166, -21686, -24808, -27474, -29636, -31254, -32298, -32749, -32598, -31849, -30515, -28621, -26202, -23301, -19972, -16277, -12283, -8063, -3696, 740, 5162, 9489, 13642, 17544, 21125, 24317, 27063, 29312, 31023, 32164, 32714, 32664, 32014, 30776, 28973, 26639, 23815, 20553, 16915, 12965, 8778, 4429}, +{0, -5893, -11593, -16916, -21686, -25750, -28974, -31254, -32515, -32715, -31849, -29945, -27064, -23301, -18778, -13643, -8063, -2221, 3695, 9489, 14974, 19971, 24317, 27870, 30514, 32164, 32764, 32297, 30776, 28252, 24807, 20553, 15629, 10195, 4429, -1481, -7343, -12966, -18166, -22774, -26640, -29636, -31667, -32665, -32598, -31469, -29313, -26202, -22236, -17545, -12283, -6620, -741, 5162, 10897, 16276, 21125, 25285, 28620, 31023, 32414, 32748, 32014, 30237, 27473, 23815, 19379, 14312, 8778, 2958, -2959, -8779, -14313, -19380, -23816, -27474, -30238, -32015, -32749, -32415, -31024, -28621, -25286, -21126, -16277, -10898, -5163, 740, 6619, 12282, 17544, 22235, 26201, 29312, 31468, 32597, 32664, 31666, 29635, 26639, 22773, 18165, 12965, 7342, 1480, -4430, -10196, -15630, -20554, -24808, -28253, -30777, -32298, -32765, -32165, -30515, -27871, -24318, -19972, -14975, -9490, -3696, 2220, 8062, 13642, 18777, 23300, 27063, 29944, 31848, 32714, 32514, 31253, 28973, 25749, 21685, 16915, 11592, 5892}, +{0, -7343, -14313, -20554, -25750, -29636, -32015, -32765, -31849, -29313, -25286, -19972, -13643, -6620, 740, 8062, 14974, 21125, 26201, 29944, 32164, 32748, 31666, 28973, 24807, 19379, 12965, 5892, -1481, -8779, -15630, -21686, -26640, -30238, -32298, -32715, -31469, -28621, -24318, -18778, -12283, -5163, 2220, 9489, 16276, 22235, 27063, 30514, 32414, 32664, 31253, 28252, 23815, 18165, 11592, 4429, -2959, -10196, -16916, -22774, -27474, -30777, -32515, -32598, -31024, -27871, -23301, -17545, -10898, -3696, 3695, 10897, 17544, 23300, 27870, 31023, 32597, 32514, 30776, 27473, 22773, 16915, 10195, 2958, -4430, -11593, -18166, -23816, -28253, -31254, -32665, -32415, -30515, -27064, -22236, -16277, -9490, -2221, 5162, 12282, 18777, 24317, 28620, 31468, 32714, 32297, 30237, 26639, 21685, 15629, 8778, 1480, -5893, -12966, -19380, -24808, -28974, -31667, -32749, -32165, -29945, -26202, -21126, -14975, -8063, -741, 6619, 13642, 19971, 25285, 29312, 31848, 32764, 32014, 29635, 25749, 20553, 14312, 7342}, +{0, -8779, -16916, -23816, -28974, -32015, -32715, -31024, -27064, -21126, -13643, -5163, 3695, 12282, 19971, 26201, 30514, 32597, 32297, 29635, 24807, 18165, 10195, 1480, -7343, -15630, -22774, -28253, -31667, -32765, -31469, -27871, -22236, -14975, -6620, 2220, 10897, 18777, 25285, 29944, 32414, 32514, 30237, 25749, 19379, 11592, 2958, -5893, -14313, -21686, -27474, -31254, -32749, -31849, -28621, -23301, -16277, -8063, 740, 9489, 17544, 24317, 29312, 32164, 32664, 30776, 26639, 20553, 12965, 4429, -4430, -12966, -20554, -26640, -30777, -32665, -32165, -29313, -24318, -17545, -9490, -741, 8062, 16276, 23300, 28620, 31848, 32748, 31253, 27473, 21685, 14312, 5892, -2959, -11593, -19380, -25750, -30238, -32515, -32415, -29945, -25286, -18778, -10898, -2221, 6619, 14974, 22235, 27870, 31468, 32764, 31666, 28252, 22773, 15629, 7342, -1481, -10196, -18166, -24808, -29636, -32298, -32598, -30515, -26202, -19972, -12283, -3696, 5162, 13642, 21125, 27063, 31023, 32714, 32014, 28973, 23815, 16915, 8778}, +{0, -10196, -19380, -26640, -31254, -32765, -31024, -26202, -18778, -9490, 740, 10897, 19971, 27063, 31468, 32748, 30776, 25749, 18165, 8778, -1481, -11593, -20554, -27474, -31667, -32715, -30515, -25286, -17545, -8063, 2220, 12282, 21125, 27870, 31848, 32664, 30237, 24807, 16915, 7342, -2959, -12966, -21686, -28253, -32015, -32598, -29945, -24318, -16277, -6620, 3695, 13642, 22235, 28620, 32164, 32514, 29635, 23815, 15629, 5892, -4430, -14313, -22774, -28974, -32298, -32415, -29313, -23301, -14975, -5163, 5162, 14974, 23300, 29312, 32414, 32297, 28973, 22773, 14312, 4429, -5893, -15630, -23816, -29636, -32515, -32165, -28621, -22236, -13643, -3696, 6619, 16276, 24317, 29944, 32597, 32014, 28252, 21685, 12965, 2958, -7343, -16916, -24808, -30238, -32665, -31849, -27871, -21126, -12283, -2221, 8062, 17544, 25285, 30514, 32714, 31666, 27473, 20553, 11592, 1480, -8779, -18166, -25750, -30777, -32749, -31469, -27064, -19972, -10898, -741, 9489, 18777, 26201, 31023, 32764, 31253, 26639, 19379, 10195}, +{0, -11593, -21686, -28974, -32515, -31849, -27064, -18778, -8063, 3695, 14974, 24317, 30514, 32764, 30776, 24807, 15629, 4429, -7343, -18166, -26640, -31667, -32598, -29313, -22236, -12283, -741, 10897, 21125, 28620, 32414, 32014, 27473, 19379, 8778, -2959, -14313, -23816, -30238, -32749, -31024, -25286, -16277, -5163, 6619, 17544, 26201, 31468, 32664, 29635, 22773, 12965, 1480, -10196, -20554, -28253, -32298, -32165, -27871, -19972, -9490, 2220, 13642, 23300, 29944, 32714, 31253, 25749, 16915, 5892, -5893, -16916, -25750, -31254, -32715, -29945, -23301, -13643, -2221, 9489, 19971, 27870, 32164, 32297, 28252, 20553, 10195, -1481, -12966, -22774, -29636, -32665, -31469, -26202, -17545, -6620, 5162, 16276, 25285, 31023, 32748, 30237, 23815, 14312, 2958, -8779, -19380, -27474, -32015, -32415, -28621, -21126, -10898, 740, 12282, 22235, 29312, 32597, 31666, 26639, 18165, 7342, -4430, -15630, -24808, -30777, -32765, -30515, -24318, -14975, -3696, 8062, 18777, 27063, 31848, 32514, 28973, 21685, 11592}, +{0, -12966, -23816, -30777, -32715, -29313, -21126, -9490, 3695, 16276, 26201, 31848, 32297, 27473, 18165, 5892, -7343, -19380, -28253, -32515, -31469, -25286, -14975, -2221, 10897, 22235, 29944, 32764, 30237, 22773, 11592, -1481, -14313, -24808, -31254, -32598, -28621, -19972, -8063, 5162, 17544, 27063, 32164, 32014, 26639, 16915, 4429, -8779, -20554, -28974, -32665, -31024, -24318, -13643, -741, 12282, 23300, 30514, 32748, 29635, 21685, 10195, -2959, -15630, -25750, -31667, -32415, -27871, -18778, -6620, 6619, 18777, 27870, 32414, 31666, 25749, 15629, 2958, -10196, -21686, -29636, -32749, -30515, -23301, -12283, 740, 13642, 24317, 31023, 32664, 28973, 20553, 8778, -4430, -16916, -26640, -32015, -32165, -27064, -17545, -5163, 8062, 19971, 28620, 32597, 31253, 24807, 14312, 1480, -11593, -22774, -30238, -32765, -29945, -22236, -10898, 2220, 14974, 25285, 31468, 32514, 28252, 19379, 7342, -5893, -18166, -27474, -32298, -31849, -26202, -16277, -3696, 9489, 21125, 29312, 32714, 30776, 23815, 12965}, +{0, -14313, -25750, -32015, -31849, -25286, -13643, 740, 14974, 26201, 32164, 31666, 24807, 12965, -1481, -15630, -26640, -32298, -31469, -24318, -12283, 2220, 16276, 27063, 32414, 31253, 23815, 11592, -2959, -16916, -27474, -32515, -31024, -23301, -10898, 3695, 17544, 27870, 32597, 30776, 22773, 10195, -4430, -18166, -28253, -32665, -30515, -22236, -9490, 5162, 18777, 28620, 32714, 30237, 21685, 8778, -5893, -19380, -28974, -32749, -29945, -21126, -8063, 6619, 19971, 29312, 32764, 29635, 20553, 7342, -7343, -20554, -29636, -32765, -29313, -19972, -6620, 8062, 21125, 29944, 32748, 28973, 19379, 5892, -8779, -21686, -30238, -32715, -28621, -18778, -5163, 9489, 22235, 30514, 32664, 28252, 18165, 4429, -10196, -22774, -30777, -32598, -27871, -17545, -3696, 10897, 23300, 31023, 32514, 27473, 16915, 2958, -11593, -23816, -31254, -32415, -27064, -16277, -2221, 12282, 24317, 31468, 32297, 26639, 15629, 1480, -12966, -24808, -31667, -32165, -26202, -14975, -741, 13642, 25285, 31848, 32014, 25749, 14312}, +{0, -15630, -27474, -32665, -29945, -19972, -5163, 10897, 24317, 31848, 31666, 23815, 10195, -5893, -20554, -30238, -32598, -27064, -14975, 740, 16276, 27870, 32714, 29635, 19379, 4429, -11593, -24808, -32015, -31469, -23301, -9490, 6619, 21125, 30514, 32514, 26639, 14312, -1481, -16916, -28253, -32749, -29313, -18778, -3696, 12282, 25285, 32164, 31253, 22773, 8778, -7343, -21686, -30777, -32415, -26202, -13643, 2220, 17544, 28620, 32764, 28973, 18165, 2958, -12966, -25750, -32298, -31024, -22236, -8063, 8062, 22235, 31023, 32297, 25749, 12965, -2959, -18166, -28974, -32765, -28621, -17545, -2221, 13642, 26201, 32414, 30776, 21685, 7342, -8779, -22774, -31254, -32165, -25286, -12283, 3695, 18777, 29312, 32748, 28252, 16915, 1480, -14313, -26640, -32515, -30515, -21126, -6620, 9489, 23300, 31468, 32014, 24807, 11592, -4430, -19380, -29636, -32715, -27871, -16277, -741, 14974, 27063, 32597, 30237, 20553, 5892, -10196, -23816, -31667, -31849, -24318, -10898, 5162, 19971, 29944, 32664, 27473, 15629}, +{0, -16916, -28974, -32715, -27064, -13643, 3695, 19971, 30514, 32297, 24807, 10195, -7343, -22774, -31667, -31469, -22236, -6620, 10897, 25285, 32414, 30237, 19379, 2958, -14313, -27474, -32749, -28621, -16277, 740, 17544, 29312, 32664, 26639, 12965, -4430, -20554, -30777, -32165, -24318, -9490, 8062, 23300, 31848, 31253, 21685, 5892, -11593, -25750, -32515, -29945, -18778, -2221, 14974, 27870, 32764, 28252, 15629, -1481, -18166, -29636, -32598, -26202, -12283, 5162, 21125, 31023, 32014, 23815, 8778, -8779, -23816, -32015, -31024, -21126, -5163, 12282, 26201, 32597, 29635, 18165, 1480, -15630, -28253, -32765, -27871, -14975, 2220, 18777, 29944, 32514, 25749, 11592, -5893, -21686, -31254, -31849, -23301, -8063, 9489, 24317, 32164, 30776, 20553, 4429, -12966, -26640, -32665, -29313, -17545, -741, 16276, 28620, 32748, 27473, 14312, -2959, -19380, -30238, -32415, -25286, -10898, 6619, 22235, 31468, 31666, 22773, 7342, -10196, -24808, -32298, -30515, -19972, -3696, 13642, 27063, 32714, 28973, 16915}, +{0, -18166, -30238, -32165, -23301, -6620, 12282, 27063, 32764, 27473, 12965, -5893, -22774, -32015, -30515, -18778, -741, 17544, 29944, 32297, 23815, 7342, -11593, -26640, -32749, -27871, -13643, 5162, 22235, 31848, 30776, 19379, 1480, -16916, -29636, -32415, -24318, -8063, 10897, 26201, 32714, 28252, 14312, -4430, -21686, -31667, -31024, -19972, -2221, 16276, 29312, 32514, 24807, 8778, -10196, -25750, -32665, -28621, -14975, 3695, 21125, 31468, 31253, 20553, 2958, -15630, -28974, -32598, -25286, -9490, 9489, 25285, 32597, 28973, 15629, -2959, -20554, -31254, -31469, -21126, -3696, 14974, 28620, 32664, 25749, 10195, -8779, -24808, -32515, -29313, -16277, 2220, 19971, 31023, 31666, 21685, 4429, -14313, -28253, -32715, -26202, -10898, 8062, 24317, 32414, 29635, 16915, -1481, -19380, -30777, -31849, -22236, -5163, 13642, 27870, 32748, 26639, 11592, -7343, -23816, -32298, -29945, -17545, 740, 18777, 30514, 32014, 22773, 5892, -12966, -27474, -32765, -27064, -12283, 6619, 23300, 32164, 30237, 18165}, +{0, -19380, -31254, -31024, -18778, 740, 19971, 31468, 30776, 18165, -1481, -20554, -31667, -30515, -17545, 2220, 21125, 31848, 30237, 16915, -2959, -21686, -32015, -29945, -16277, 3695, 22235, 32164, 29635, 15629, -4430, -22774, -32298, -29313, -14975, 5162, 23300, 32414, 28973, 14312, -5893, -23816, -32515, -28621, -13643, 6619, 24317, 32597, 28252, 12965, -7343, -24808, -32665, -27871, -12283, 8062, 25285, 32714, 27473, 11592, -8779, -25750, -32749, -27064, -10898, 9489, 26201, 32764, 26639, 10195, -10196, -26640, -32765, -26202, -9490, 10897, 27063, 32748, 25749, 8778, -11593, -27474, -32715, -25286, -8063, 12282, 27870, 32664, 24807, 7342, -12966, -28253, -32598, -24318, -6620, 13642, 28620, 32514, 23815, 5892, -14313, -28974, -32415, -23301, -5163, 14974, 29312, 32297, 22773, 4429, -15630, -29636, -32165, -22236, -3696, 16276, 29944, 32014, 21685, 2958, -16916, -30238, -31849, -21126, -2221, 17544, 30514, 31666, 20553, 1480, -18166, -30777, -31469, -19972, -741, 18777, 31023, 31253, 19379}, +{0, -20554, -32015, -29313, -13643, 8062, 26201, 32748, 24807, 5892, -15630, -30238, -31469, -18778, 2220, 22235, 32414, 28252, 11592, -10196, -27474, -32598, -23301, -3696, 17544, 31023, 30776, 16915, -4430, -23816, -32665, -27064, -9490, 12282, 28620, 32297, 21685, 1480, -19380, -31667, -29945, -14975, 6619, 25285, 32764, 25749, 7342, -14313, -29636, -31849, -19972, 740, 21125, 32164, 28973, 12965, -8779, -26640, -32715, -24318, -5163, 16276, 30514, 31253, 18165, -2959, -22774, -32515, -27871, -10898, 10897, 27870, 32514, 22773, 2958, -18166, -31254, -30515, -16277, 5162, 24317, 32714, 26639, 8778, -12966, -28974, -32165, -21126, -741, 19971, 31848, 29635, 14312, -7343, -25750, -32765, -25286, -6620, 14974, 29944, 31666, 19379, -1481, -21686, -32298, -28621, -12283, 9489, 27063, 32664, 23815, 4429, -16916, -30777, -31024, -17545, 3695, 23300, 32597, 27473, 10195, -11593, -28253, -32415, -22236, -2221, 18777, 31468, 30237, 15629, -5893, -24808, -32749, -26202, -8063, 13642, 29312, 32014, 20553}, +{0, -21686, -32515, -27064, -8063, 14974, 30514, 30776, 15629, -7343, -26640, -32598, -22236, -741, 21125, 32414, 27473, 8778, -14313, -30238, -31024, -16277, 6619, 26201, 32664, 22773, 1480, -20554, -32298, -27871, -9490, 13642, 29944, 31253, 16915, -5893, -25750, -32715, -23301, -2221, 19971, 32164, 28252, 10195, -12966, -29636, -31469, -17545, 5162, 25285, 32748, 23815, 2958, -19380, -32015, -28621, -10898, 12282, 29312, 31666, 18165, -4430, -24808, -32765, -24318, -3696, 18777, 31848, 28973, 11592, -11593, -28974, -31849, -18778, 3695, 24317, 32764, 24807, 4429, -18166, -31667, -29313, -12283, 10897, 28620, 32014, 19379, -2959, -23816, -32749, -25286, -5163, 17544, 31468, 29635, 12965, -10196, -28253, -32165, -19972, 2220, 23300, 32714, 25749, 5892, -16916, -31254, -29945, -13643, 9489, 27870, 32297, 20553, -1481, -22774, -32665, -26202, -6620, 16276, 31023, 30237, 14312, -8779, -27474, -32415, -21126, 740, 22235, 32597, 26639, 7342, -15630, -30777, -30515, -14975, 8062, 27063, 32514, 21685}, +{0, -22774, -32749, -24318, -2221, 21125, 32597, 25749, 4429, -19380, -32298, -27064, -6620, 17544, 31848, 28252, 8778, -15630, -31254, -29313, -10898, 13642, 30514, 30237, 12965, -11593, -29636, -31024, -14975, 9489, 28620, 31666, 16915, -7343, -27474, -32165, -18778, 5162, 26201, 32514, 20553, -2959, -24808, -32715, -22236, 740, 23300, 32764, 23815, 1480, -21686, -32665, -25286, -3696, 19971, 32414, 26639, 5892, -18166, -32015, -27871, -8063, 16276, 31468, 28973, 10195, -14313, -30777, -29945, -12283, 12282, 29944, 30776, 14312, -10196, -28974, -31469, -16277, 8062, 27870, 32014, 18165, -5893, -26640, -32415, -19972, 3695, 25285, 32664, 21685, -1481, -23816, -32765, -23301, -741, 22235, 32714, 24807, 2958, -20554, -32515, -26202, -5163, 18777, 32164, 27473, 7342, -16916, -31667, -28621, -9490, 14974, 31023, 29635, 11592, -12966, -30238, -30515, -13643, 10897, 29312, 31253, 15629, -8779, -28253, -31849, -17545, 6619, 27063, 32297, 19379, -4430, -25750, -32598, -21126, 2220, 24317, 32748, 22773}, +{0, -23816, -32715, -21126, 3695, 26201, 32297, 18165, -7343, -28253, -31469, -14975, 10897, 29944, 30237, 11592, -14313, -31254, -28621, -8063, 17544, 32164, 26639, 4429, -20554, -32665, -24318, -741, 23300, 32748, 21685, -2959, -25750, -32415, -18778, 6619, 27870, 31666, 15629, -10196, -29636, -30515, -12283, 13642, 31023, 28973, 8778, -16916, -32015, -27064, -5163, 19971, 32597, 24807, 1480, -22774, -32765, -22236, 2220, 25285, 32514, 19379, -5893, -27474, -31849, -16277, 9489, 29312, 30776, 12965, -12966, -30777, -29313, -9490, 16276, 31848, 27473, 5892, -19380, -32515, -25286, -2221, 22235, 32764, 22773, -1481, -24808, -32598, -19972, 5162, 27063, 32014, 16915, -8779, -28974, -31024, -13643, 12282, 30514, 29635, 10195, -15630, -31667, -27871, -6620, 18777, 32414, 25749, 2958, -21686, -32749, -23301, 740, 24317, 32664, 20553, -4430, -26640, -32165, -17545, 8062, 28620, 31253, 14312, -11593, -30238, -29945, -10898, 14974, 31468, 28252, 7342, -18166, -32298, -26202, -3696, 21125, 32714, 23815}, +{0, -24808, -32415, -17545, 9489, 29944, 29635, 8778, -18166, -32515, -24318, 740, 25285, 32297, 16915, -10196, -30238, -29313, -8063, 18777, 32597, 23815, -1481, -25750, -32165, -16277, 10897, 30514, 28973, 7342, -19380, -32665, -23301, 2220, 26201, 32014, 15629, -11593, -30777, -28621, -6620, 19971, 32714, 22773, -2959, -26640, -31849, -14975, 12282, 31023, 28252, 5892, -20554, -32749, -22236, 3695, 27063, 31666, 14312, -12966, -31254, -27871, -5163, 21125, 32764, 21685, -4430, -27474, -31469, -13643, 13642, 31468, 27473, 4429, -21686, -32765, -21126, 5162, 27870, 31253, 12965, -14313, -31667, -27064, -3696, 22235, 32748, 20553, -5893, -28253, -31024, -12283, 14974, 31848, 26639, 2958, -22774, -32715, -19972, 6619, 28620, 30776, 11592, -15630, -32015, -26202, -2221, 23300, 32664, 19379, -7343, -28974, -30515, -10898, 16276, 32164, 25749, 1480, -23816, -32598, -18778, 8062, 29312, 30237, 10195, -16916, -32298, -25286, -741, 24317, 32514, 18165, -8779, -29636, -29945, -9490, 17544, 32414, 24807}, +{0, -25750, -31849, -13643, 14974, 32164, 24807, -1481, -26640, -31469, -12283, 16276, 32414, 23815, -2959, -27474, -31024, -10898, 17544, 32597, 22773, -4430, -28253, -30515, -9490, 18777, 32714, 21685, -5893, -28974, -29945, -8063, 19971, 32764, 20553, -7343, -29636, -29313, -6620, 21125, 32748, 19379, -8779, -30238, -28621, -5163, 22235, 32664, 18165, -10196, -30777, -27871, -3696, 23300, 32514, 16915, -11593, -31254, -27064, -2221, 24317, 32297, 15629, -12966, -31667, -26202, -741, 25285, 32014, 14312, -14313, -32015, -25286, 740, 26201, 31666, 12965, -15630, -32298, -24318, 2220, 27063, 31253, 11592, -16916, -32515, -23301, 3695, 27870, 30776, 10195, -18166, -32665, -22236, 5162, 28620, 30237, 8778, -19380, -32749, -21126, 6619, 29312, 29635, 7342, -20554, -32765, -19972, 8062, 29944, 28973, 5892, -21686, -32715, -18778, 9489, 30514, 28252, 4429, -22774, -32598, -17545, 10897, 31023, 27473, 2958, -23816, -32415, -16277, 12282, 31468, 26639, 1480, -24808, -32165, -14975, 13642, 31848, 25749}, +{0, -26640, -31024, -9490, 19971, 32748, 18165, -11593, -31667, -25286, 2220, 27870, 30237, 7342, -21686, -32598, -16277, 13642, 32164, 23815, -4430, -28974, -29313, -5163, 23300, 32297, 14312, -15630, -32515, -22236, 6619, 29944, 28252, 2958, -24808, -31849, -12283, 17544, 32714, 20553, -8779, -30777, -27064, -741, 26201, 31253, 10195, -19380, -32765, -18778, 10897, 31468, 25749, -1481, -27474, -30515, -8063, 21125, 32664, 16915, -12966, -32015, -24318, 3695, 28620, 29635, 5892, -22774, -32415, -14975, 14974, 32414, 22773, -5893, -29636, -28621, -3696, 24317, 32014, 12965, -16916, -32665, -21126, 8062, 30514, 27473, 1480, -25750, -31469, -10898, 18777, 32764, 19379, -10196, -31254, -26202, 740, 27063, 30776, 8778, -20554, -32715, -17545, 12282, 31848, 24807, -2959, -28253, -29945, -6620, 22235, 32514, 15629, -14313, -32298, -23301, 5162, 29312, 28973, 4429, -23816, -32165, -13643, 16276, 32597, 21685, -7343, -30238, -27871, -2221, 25285, 31666, 11592, -18166, -32749, -19972, 9489, 31023, 26639}, +{0, -27474, -29945, -5163, 24317, 31666, 10195, -20554, -32598, -14975, 16276, 32714, 19379, -11593, -32015, -23301, 6619, 30514, 26639, -1481, -28253, -29313, -3696, 25285, 31253, 8778, -21686, -32415, -13643, 17544, 32764, 18165, -12966, -32298, -22236, 8062, 31023, 25749, -2959, -28974, -28621, -2221, 26201, 30776, 7342, -22774, -32165, -12283, 18777, 32748, 16915, -14313, -32515, -21126, 9489, 31468, 24807, -4430, -29636, -27871, -741, 27063, 30237, 5892, -23816, -31849, -10898, 19971, 32664, 15629, -15630, -32665, -19972, 10897, 31848, 23815, -5893, -30238, -27064, 740, 27870, 29635, 4429, -24808, -31469, -9490, 21125, 32514, 14312, -16916, -32749, -18778, 12282, 32164, 22773, -7343, -30777, -26202, 2220, 28620, 28973, 2958, -25750, -31024, -8063, 22235, 32297, 12965, -18166, -32765, -17545, 13642, 32414, 21685, -8779, -31254, -25286, 3695, 29312, 28252, 1480, -26640, -30515, -6620, 23300, 32014, 11592, -19380, -32715, -16277, 14974, 32597, 20553, -10196, -31667, -24318, 5162, 29944, 27473}, +{0, -28253, -28621, -741, 27870, 28973, 1480, -27474, -29313, -2221, 27063, 29635, 2958, -26640, -29945, -3696, 26201, 30237, 4429, -25750, -30515, -5163, 25285, 30776, 5892, -24808, -31024, -6620, 24317, 31253, 7342, -23816, -31469, -8063, 23300, 31666, 8778, -22774, -31849, -9490, 22235, 32014, 10195, -21686, -32165, -10898, 21125, 32297, 11592, -20554, -32415, -12283, 19971, 32514, 12965, -19380, -32598, -13643, 18777, 32664, 14312, -18166, -32715, -14975, 17544, 32748, 15629, -16916, -32765, -16277, 16276, 32764, 16915, -15630, -32749, -17545, 14974, 32714, 18165, -14313, -32665, -18778, 13642, 32597, 19379, -12966, -32515, -19972, 12282, 32414, 20553, -11593, -32298, -21126, 10897, 32164, 21685, -10196, -32015, -22236, 9489, 31848, 22773, -8779, -31667, -23301, 8062, 31468, 23815, -7343, -31254, -24318, 6619, 31023, 24807, -5893, -30777, -25286, 5162, 30514, 25749, -4430, -30238, -26202, 3695, 29944, 26639, -2959, -29636, -27064, 2220, 29312, 27473, -1481, -28974, -27871, 740, 28620, 28252}, +{0, -28974, -27064, 3695, 30514, 24807, -7343, -31667, -22236, 10897, 32414, 19379, -14313, -32749, -16277, 17544, 32664, 12965, -20554, -32165, -9490, 23300, 31253, 5892, -25750, -29945, -2221, 27870, 28252, -1481, -29636, -26202, 5162, 31023, 23815, -8779, -32015, -21126, 12282, 32597, 18165, -15630, -32765, -14975, 18777, 32514, 11592, -21686, -31849, -8063, 24317, 30776, 4429, -26640, -29313, -741, 28620, 27473, -2959, -30238, -25286, 6619, 31468, 22773, -10196, -32298, -19972, 13642, 32714, 16915, -16916, -32715, -13643, 19971, 32297, 10195, -22774, -31469, -6620, 25285, 30237, 2958, -27474, -28621, 740, 29312, 26639, -4430, -30777, -24318, 8062, 31848, 21685, -11593, -32515, -18778, 14974, 32764, 15629, -18166, -32598, -12283, 21125, 32014, 8778, -23816, -31024, -5163, 26201, 29635, 1480, -28253, -27871, 2220, 29944, 25749, -5893, -31254, -23301, 9489, 32164, 20553, -12966, -32665, -17545, 16276, 32748, 14312, -19380, -32415, -10898, 22235, 31666, 7342, -24808, -30515, -3696, 27063, 28973}, +{0, -29636, -25286, 8062, 32164, 19379, -15630, -32715, -12283, 22235, 31253, 4429, -27474, -27871, 3695, 31023, 22773, -11593, -32665, -16277, 18777, 32297, 8778, -24808, -29945, -741, 29312, 25749, -7343, -32015, -19972, 14974, 32748, 12965, -21686, -31469, -5163, 27063, 28252, -2959, -30777, -23301, 10897, 32597, 16915, -18166, -32415, -9490, 24317, 30237, 1480, -28974, -26202, 6619, 31848, 20553, -14313, -32765, -13643, 21125, 31666, 5892, -26640, -28621, 2220, 30514, 23815, -10196, -32515, -17545, 17544, 32514, 10195, -23816, -30515, -2221, 28620, 26639, -5893, -31667, -21126, 13642, 32764, 14312, -20554, -31849, -6620, 26201, 28973, -1481, -30238, -24318, 9489, 32414, 18165, -16916, -32598, -10898, 23300, 30776, 2958, -28253, -27064, 5162, 31468, 21685, -12966, -32749, -14975, 19971, 32014, 7342, -25750, -29313, 740, 29944, 24807, -8779, -32298, -18778, 16276, 32664, 11592, -22774, -31024, -3696, 27870, 27473, -4430, -31254, -22236, 12282, 32714, 15629, -19380, -32165, -8063, 25285, 29635}, +{0, -30238, -23301, 12282, 32764, 12965, -22774, -30515, -741, 29944, 23815, -11593, -32749, -13643, 22235, 30776, 1480, -29636, -24318, 10897, 32714, 14312, -21686, -31024, -2221, 29312, 24807, -10196, -32665, -14975, 21125, 31253, 2958, -28974, -25286, 9489, 32597, 15629, -20554, -31469, -3696, 28620, 25749, -8779, -32515, -16277, 19971, 31666, 4429, -28253, -26202, 8062, 32414, 16915, -19380, -31849, -5163, 27870, 26639, -7343, -32298, -17545, 18777, 32014, 5892, -27474, -27064, 6619, 32164, 18165, -18166, -32165, -6620, 27063, 27473, -5893, -32015, -18778, 17544, 32297, 7342, -26640, -27871, 5162, 31848, 19379, -16916, -32415, -8063, 26201, 28252, -4430, -31667, -19972, 16276, 32514, 8778, -25750, -28621, 3695, 31468, 20553, -15630, -32598, -9490, 25285, 28973, -2959, -31254, -21126, 14974, 32664, 10195, -24808, -29313, 2220, 31023, 21685, -14313, -32715, -10898, 24317, 29635, -1481, -30777, -22236, 13642, 32748, 11592, -23816, -29945, 740, 30514, 22773, -12966, -32765, -12283, 23300, 30237}, +{0, -30777, -21126, 16276, 32297, 5892, -28253, -25286, 10897, 32764, 11592, -24808, -28621, 5162, 32164, 16915, -20554, -31024, -741, 30514, 21685, -15630, -32415, -6620, 27870, 25749, -10196, -32749, -12283, 24317, 28973, -4430, -32015, -17545, 19971, 31253, 1480, -30238, -22236, 14974, 32514, 7342, -27474, -26202, 9489, 32714, 12965, -23816, -29313, 3695, 31848, 18165, -19380, -31469, -2221, 29944, 22773, -14313, -32598, -8063, 27063, 26639, -8779, -32665, -13643, 23300, 29635, -2959, -31667, -18778, 18777, 31666, 2958, -29636, -23301, 13642, 32664, 8778, -26640, -27064, 8062, 32597, 14312, -22774, -29945, 2220, 31468, 19379, -18166, -31849, -3696, 29312, 23815, -12966, -32715, -9490, 26201, 27473, -7343, -32515, -14975, 22235, 30237, -1481, -31254, -19972, 17544, 32014, 4429, -28974, -24318, 12282, 32748, 10195, -25750, -27871, 6619, 32414, 15629, -21686, -30515, 740, 31023, 20553, -16916, -32165, -5163, 28620, 24807, -11593, -32765, -10898, 25285, 28252, -5893, -32298, -16277, 21125, 30776}, +{0, -31254, -18778, 19971, 30776, -1481, -31667, -17545, 21125, 30237, -2959, -32015, -16277, 22235, 29635, -4430, -32298, -14975, 23300, 28973, -5893, -32515, -13643, 24317, 28252, -7343, -32665, -12283, 25285, 27473, -8779, -32749, -10898, 26201, 26639, -10196, -32765, -9490, 27063, 25749, -11593, -32715, -8063, 27870, 24807, -12966, -32598, -6620, 28620, 23815, -14313, -32415, -5163, 29312, 22773, -15630, -32165, -3696, 29944, 21685, -16916, -31849, -2221, 30514, 20553, -18166, -31469, -741, 31023, 19379, -19380, -31024, 740, 31468, 18165, -20554, -30515, 2220, 31848, 16915, -21686, -29945, 3695, 32164, 15629, -22774, -29313, 5162, 32414, 14312, -23816, -28621, 6619, 32597, 12965, -24808, -27871, 8062, 32714, 11592, -25750, -27064, 9489, 32764, 10195, -26640, -26202, 10897, 32748, 8778, -27474, -25286, 12282, 32664, 7342, -28253, -24318, 13642, 32514, 5892, -28974, -23301, 14974, 32297, 4429, -29636, -22236, 16276, 32014, 2958, -30238, -21126, 17544, 31666, 1480, -30777, -19972, 18777, 31253}, +{0, -31667, -16277, 23300, 28252, -8779, -32765, -8063, 28620, 22773, -16916, -31469, 740, 31848, 15629, -23816, -27871, 9489, 32748, 7342, -28974, -22236, 17544, 31253, -1481, -32015, -14975, 24317, 27473, -10196, -32715, -6620, 29312, 21685, -18166, -31024, 2220, 32164, 14312, -24808, -27064, 10897, 32664, 5892, -29636, -21126, 18777, 30776, -2959, -32298, -13643, 25285, 26639, -11593, -32598, -5163, 29944, 20553, -19380, -30515, 3695, 32414, 12965, -25750, -26202, 12282, 32514, 4429, -30238, -19972, 19971, 30237, -4430, -32515, -12283, 26201, 25749, -12966, -32415, -3696, 30514, 19379, -20554, -29945, 5162, 32597, 11592, -26640, -25286, 13642, 32297, 2958, -30777, -18778, 21125, 29635, -5893, -32665, -10898, 27063, 24807, -14313, -32165, -2221, 31023, 18165, -21686, -29313, 6619, 32714, 10195, -27474, -24318, 14974, 32014, 1480, -31254, -17545, 22235, 28973, -7343, -32749, -9490, 27870, 23815, -15630, -31849, -741, 31468, 16915, -22774, -28621, 8062, 32764, 8778, -28253, -23301, 16276, 31666}, +{0, -32015, -13643, 26201, 24807, -15630, -31469, 2220, 32414, 11592, -27474, -23301, 17544, 30776, -4430, -32665, -9490, 28620, 21685, -19380, -29945, 6619, 32764, 7342, -29636, -19972, 21125, 28973, -8779, -32715, -5163, 30514, 18165, -22774, -27871, 10897, 32514, 2958, -31254, -16277, 24317, 26639, -12966, -32165, -741, 31848, 14312, -25750, -25286, 14974, 31666, -1481, -32298, -12283, 27063, 23815, -16916, -31024, 3695, 32597, 10195, -28253, -22236, 18777, 30237, -5893, -32749, -8063, 29312, 20553, -20554, -29313, 8062, 32748, 5892, -30238, -18778, 22235, 28252, -10196, -32598, -3696, 31023, 16915, -23816, -27064, 12282, 32297, 1480, -31667, -14975, 25285, 25749, -14313, -31849, 740, 32164, 12965, -26640, -24318, 16276, 31253, -2959, -32515, -10898, 27870, 22773, -18166, -30515, 5162, 32714, 8778, -28974, -21126, 19971, 29635, -7343, -32765, -6620, 29944, 19379, -21686, -28621, 9489, 32664, 4429, -30777, -17545, 23300, 27473, -11593, -32415, -2221, 31468, 15629, -24808, -26202, 13642, 32014}, +{0, -32298, -10898, 28620, 20553, -21686, -27871, 12282, 32014, -1481, -32515, -9490, 29312, 19379, -22774, -27064, 13642, 31666, -2959, -32665, -8063, 29944, 18165, -23816, -26202, 14974, 31253, -4430, -32749, -6620, 30514, 16915, -24808, -25286, 16276, 30776, -5893, -32765, -5163, 31023, 15629, -25750, -24318, 17544, 30237, -7343, -32715, -3696, 31468, 14312, -26640, -23301, 18777, 29635, -8779, -32598, -2221, 31848, 12965, -27474, -22236, 19971, 28973, -10196, -32415, -741, 32164, 11592, -28253, -21126, 21125, 28252, -11593, -32165, 740, 32414, 10195, -28974, -19972, 22235, 27473, -12966, -31849, 2220, 32597, 8778, -29636, -18778, 23300, 26639, -14313, -31469, 3695, 32714, 7342, -30238, -17545, 24317, 25749, -15630, -31024, 5162, 32764, 5892, -30777, -16277, 25285, 24807, -16916, -30515, 6619, 32748, 4429, -31254, -14975, 26201, 23815, -18166, -29945, 8062, 32664, 2958, -31667, -13643, 27063, 22773, -19380, -29313, 9489, 32514, 1480, -32015, -12283, 27870, 21685, -20554, -28621, 10897, 32297}, +{0, -32515, -8063, 30514, 15629, -26640, -22236, 21125, 27473, -14313, -31024, 6619, 32664, 1480, -32298, -9490, 29944, 16915, -25750, -23301, 19971, 28252, -12966, -31469, 5162, 32748, 2958, -32015, -10898, 29312, 18165, -24808, -24318, 18777, 28973, -11593, -31849, 3695, 32764, 4429, -31667, -12283, 28620, 19379, -23816, -25286, 17544, 29635, -10196, -32165, 2220, 32714, 5892, -31254, -13643, 27870, 20553, -22774, -26202, 16276, 30237, -8779, -32415, 740, 32597, 7342, -30777, -14975, 27063, 21685, -21686, -27064, 14974, 30776, -7343, -32598, -741, 32414, 8778, -30238, -16277, 26201, 22773, -20554, -27871, 13642, 31253, -5893, -32715, -2221, 32164, 10195, -29636, -17545, 25285, 23815, -19380, -28621, 12282, 31666, -4430, -32765, -3696, 31848, 11592, -28974, -18778, 24317, 24807, -18166, -29313, 10897, 32014, -2959, -32749, -5163, 31468, 12965, -28253, -19972, 23300, 25749, -16916, -29945, 9489, 32297, -1481, -32665, -6620, 31023, 14312, -27474, -21126, 22235, 26639, -15630, -30515, 8062, 32514}, +{0, -32665, -5163, 31848, 10195, -30238, -14975, 27870, 19379, -24808, -23301, 21125, 26639, -16916, -29313, 12282, 31253, -7343, -32415, 2220, 32764, 2958, -32298, -8063, 31023, 12965, -28974, -17545, 26201, 21685, -22774, -25286, 18777, 28252, -14313, -30515, 9489, 32014, -4430, -32715, -741, 32597, 5892, -31667, -10898, 29944, 15629, -27474, -19972, 24317, 23815, -20554, -27064, 16276, 29635, -11593, -31469, 6619, 32514, -1481, -32749, -3696, 32164, 8778, -30777, -13643, 28620, 18165, -25750, -22236, 22235, 25749, -18166, -28621, 13642, 30776, -8779, -32165, 3695, 32748, 1480, -32515, -6620, 31468, 11592, -29636, -16277, 27063, 20553, -23816, -24318, 19971, 27473, -15630, -29945, 10897, 31666, -5893, -32598, 740, 32714, 4429, -32015, -9490, 30514, 14312, -28253, -18778, 25285, 22773, -21686, -26202, 17544, 28973, -12966, -31024, 8062, 32297, -2959, -32765, -2221, 32414, 7342, -31254, -12283, 29312, 16915, -26640, -21126, 23300, 24807, -19380, -27871, 14974, 30237, -10196, -31849, 5162, 32664}, +{0, -32749, -2221, 32597, 4429, -32298, -6620, 31848, 8778, -31254, -10898, 30514, 12965, -29636, -14975, 28620, 16915, -27474, -18778, 26201, 20553, -24808, -22236, 23300, 23815, -21686, -25286, 19971, 26639, -18166, -27871, 16276, 28973, -14313, -29945, 12282, 30776, -10196, -31469, 8062, 32014, -5893, -32415, 3695, 32664, -1481, -32765, -741, 32714, 2958, -32515, -5163, 32164, 7342, -31667, -9490, 31023, 11592, -30238, -13643, 29312, 15629, -28253, -17545, 27063, 19379, -25750, -21126, 24317, 22773, -22774, -24318, 21125, 25749, -19380, -27064, 17544, 28252, -15630, -29313, 13642, 30237, -11593, -31024, 9489, 31666, -7343, -32165, 5162, 32514, -2959, -32715, 740, 32764, 1480, -32665, -3696, 32414, 5892, -32015, -8063, 31468, 10195, -30777, -12283, 29944, 14312, -28974, -16277, 27870, 18165, -26640, -19972, 25285, 21685, -23816, -23301, 22235, 24807, -20554, -26202, 18777, 27473, -16916, -28621, 14974, 29635, -12966, -30515, 10897, 31253, -8779, -31849, 6619, 32297, -4430, -32598, 2220, 32748}, +{0, -32765, 740, 32748, -1481, -32715, 2220, 32664, -2959, -32598, 3695, 32514, -4430, -32415, 5162, 32297, -5893, -32165, 6619, 32014, -7343, -31849, 8062, 31666, -8779, -31469, 9489, 31253, -10196, -31024, 10897, 30776, -11593, -30515, 12282, 30237, -12966, -29945, 13642, 29635, -14313, -29313, 14974, 28973, -15630, -28621, 16276, 28252, -16916, -27871, 17544, 27473, -18166, -27064, 18777, 26639, -19380, -26202, 19971, 25749, -20554, -25286, 21125, 24807, -21686, -24318, 22235, 23815, -22774, -23301, 23300, 22773, -23816, -22236, 24317, 21685, -24808, -21126, 25285, 20553, -25750, -19972, 26201, 19379, -26640, -18778, 27063, 18165, -27474, -17545, 27870, 16915, -28253, -16277, 28620, 15629, -28974, -14975, 29312, 14312, -29636, -13643, 29944, 12965, -30238, -12283, 30514, 11592, -30777, -10898, 31023, 10195, -31254, -9490, 31468, 8778, -31667, -8063, 31848, 7342, -32015, -6620, 32164, 5892, -32298, -5163, 32414, 4429, -32515, -3696, 32597, 2958, -32665, -2221, 32714, 1480, -32749, -741, 32764}, +{0, -32715, 3695, 32297, -7343, -31469, 10897, 30237, -14313, -28621, 17544, 26639, -20554, -24318, 23300, 21685, -25750, -18778, 27870, 15629, -29636, -12283, 31023, 8778, -32015, -5163, 32597, 1480, -32765, 2220, 32514, -5893, -31849, 9489, 30776, -12966, -29313, 16276, 27473, -19380, -25286, 22235, 22773, -24808, -19972, 27063, 16915, -28974, -13643, 30514, 10195, -31667, -6620, 32414, 2958, -32749, 740, 32664, -4430, -32165, 8062, 31253, -11593, -29945, 14974, 28252, -18166, -26202, 21125, 23815, -23816, -21126, 26201, 18165, -28253, -14975, 29944, 11592, -31254, -8063, 32164, 4429, -32665, -741, 32748, -2959, -32415, 6619, 31666, -10196, -30515, 13642, 28973, -16916, -27064, 19971, 24807, -22774, -22236, 25285, 19379, -27474, -16277, 29312, 12965, -30777, -9490, 31848, 5892, -32515, -2221, 32764, -1481, -32598, 5162, 32014, -8779, -31024, 12282, 29635, -15630, -27871, 18777, 25749, -21686, -23301, 24317, 20553, -26640, -17545, 28620, 14312, -30238, -10898, 31468, 7342, -32298, -3696, 32714}, +{0, -32598, 6619, 31253, -12966, -28621, 18777, 24807, -23816, -19972, 27870, 14312, -30777, -8063, 32414, 1480, -32715, 5162, 31666, -11593, -29313, 17544, 25749, -22774, -21126, 27063, 15629, -30238, -9490, 32164, 2958, -32765, 3695, 32014, -10196, -29945, 16276, 26639, -21686, -22236, 26201, 16915, -29636, -10898, 31848, 4429, -32749, 2220, 32297, -8779, -30515, 14974, 27473, -20554, -23301, 25285, 18165, -28974, -12283, 31468, 5892, -32665, 740, 32514, -7343, -31024, 13642, 28252, -19380, -24318, 24317, 19379, -28253, -13643, 31023, 7342, -32515, -741, 32664, -5893, -31469, 12282, 28973, -18166, -25286, 23300, 20553, -27474, -14975, 30514, 8778, -32298, -2221, 32748, -4430, -31849, 10897, 29635, -16916, -26202, 22235, 21685, -26640, -16277, 29944, 10195, -32015, -3696, 32764, -2959, -32165, 9489, 30237, -15630, -27064, 21125, 22773, -25750, -17545, 29312, 11592, -31667, -5163, 32714, -1481, -32415, 8062, 30776, -14313, -27871, 19971, 23815, -24808, -18778, 28620, 12965, -31254, -6620, 32597}, +{0, -32415, 9489, 29635, -18166, -24318, 25285, 16915, -30238, -8063, 32597, -1481, -32165, 10897, 28973, -19380, -23301, 26201, 15629, -30777, -6620, 32714, -2959, -31849, 12282, 28252, -20554, -22236, 27063, 14312, -31254, -5163, 32764, -4430, -31469, 13642, 27473, -21686, -21126, 27870, 12965, -31667, -3696, 32748, -5893, -31024, 14974, 26639, -22774, -19972, 28620, 11592, -32015, -2221, 32664, -7343, -30515, 16276, 25749, -23816, -18778, 29312, 10195, -32298, -741, 32514, -8779, -29945, 17544, 24807, -24808, -17545, 29944, 8778, -32515, 740, 32297, -10196, -29313, 18777, 23815, -25750, -16277, 30514, 7342, -32665, 2220, 32014, -11593, -28621, 19971, 22773, -26640, -14975, 31023, 5892, -32749, 3695, 31666, -12966, -27871, 21125, 21685, -27474, -13643, 31468, 4429, -32765, 5162, 31253, -14313, -27064, 22235, 20553, -28253, -12283, 31848, 2958, -32715, 6619, 30776, -15630, -26202, 23300, 19379, -28974, -10898, 32164, 1480, -32598, 8062, 30237, -16916, -25286, 24317, 18165, -29636, -9490, 32414}, +{0, -32165, 12282, 27473, -22774, -18778, 29944, 7342, -32749, 5162, 30776, -16916, -24318, 26201, 14312, -31667, -2221, 32514, -10196, -28621, 21125, 20553, -28974, -9490, 32597, -2959, -31469, 14974, 25749, -24808, -16277, 31023, 4429, -32715, 8062, 29635, -19380, -22236, 27870, 11592, -32298, 740, 32014, -12966, -27064, 23300, 18165, -30238, -6620, 32764, -5893, -30515, 17544, 23815, -26640, -13643, 31848, 1480, -32415, 10897, 28252, -21686, -19972, 29312, 8778, -32665, 3695, 31253, -15630, -25286, 25285, 15629, -31254, -3696, 32664, -8779, -29313, 19971, 21685, -28253, -10898, 32414, -1481, -31849, 13642, 26639, -23816, -17545, 30514, 5892, -32765, 6619, 30237, -18166, -23301, 27063, 12965, -32015, -741, 32297, -11593, -27871, 22235, 19379, -29636, -8063, 32714, -4430, -31024, 16276, 24807, -25750, -14975, 31468, 2958, -32598, 9489, 28973, -20554, -21126, 28620, 10195, -32515, 2220, 31666, -14313, -26202, 24317, 16915, -30777, -5163, 32748, -7343, -29945, 18777, 22773, -27474, -12283, 32164}, +{0, -31849, 14974, 24807, -26640, -12283, 32414, -2959, -31024, 17544, 22773, -28253, -9490, 32714, -5893, -29945, 19971, 20553, -29636, -6620, 32748, -8779, -28621, 22235, 18165, -30777, -3696, 32514, -11593, -27064, 24317, 15629, -31667, -741, 32014, -14313, -25286, 26201, 12965, -32298, 2220, 31253, -16916, -23301, 27870, 10195, -32665, 5162, 30237, -19380, -21126, 29312, 7342, -32765, 8062, 28973, -21686, -18778, 30514, 4429, -32598, 10897, 27473, -23816, -16277, 31468, 1480, -32165, 13642, 25749, -25750, -13643, 32164, -1481, -31469, 16276, 23815, -27474, -10898, 32597, -4430, -30515, 18777, 21685, -28974, -8063, 32764, -7343, -29313, 21125, 19379, -30238, -5163, 32664, -10196, -27871, 23300, 16915, -31254, -2221, 32297, -12966, -26202, 25285, 14312, -32015, 740, 31666, -15630, -24318, 27063, 11592, -32515, 3695, 30776, -18166, -22236, 28620, 8778, -32749, 6619, 29635, -20554, -19972, 29944, 5892, -32715, 9489, 28252, -22774, -17545, 31023, 2958, -32415, 12282, 26639, -24808, -14975, 31848}, +{0, -31469, 17544, 21685, -29636, -5163, 32514, -12966, -25286, 27063, 10195, -32749, 8062, 28252, -23816, -14975, 32164, -2959, -30515, 19971, 19379, -30777, -2221, 32014, -15630, -23301, 28620, 7342, -32715, 10897, 26639, -25750, -12283, 32597, -5893, -29313, 22235, 16915, -31667, 740, 31253, -18166, -21126, 29944, 4429, -32415, 13642, 24807, -27474, -9490, 32764, -8779, -27871, 24317, 14312, -32298, 3695, 30237, -20554, -18778, 31023, 1480, -31849, 16276, 22773, -28974, -6620, 32664, -11593, -26202, 26201, 11592, -32665, 6619, 28973, -22774, -16277, 31848, -1481, -31024, 18777, 20553, -30238, -3696, 32297, -14313, -24318, 27870, 8778, -32765, 9489, 27473, -24808, -13643, 32414, -4430, -29945, 21125, 18165, -31254, -741, 31666, -16916, -22236, 29312, 5892, -32598, 12282, 25749, -26640, -10898, 32714, -7343, -28621, 23300, 15629, -32015, 2220, 30776, -19380, -19972, 30514, 2958, -32165, 14974, 23815, -28253, -8063, 32748, -10196, -27064, 25285, 12965, -32515, 5162, 29635, -21686, -17545, 31468}, +{0, -31024, 19971, 18165, -31667, 2220, 30237, -21686, -16277, 32164, -4430, -29313, 23300, 14312, -32515, 6619, 28252, -24808, -12283, 32714, -8779, -27064, 26201, 10195, -32765, 10897, 25749, -27474, -8063, 32664, -12966, -24318, 28620, 5892, -32415, 14974, 22773, -29636, -3696, 32014, -16916, -21126, 30514, 1480, -31469, 18777, 19379, -31254, 740, 30776, -20554, -17545, 31848, -2959, -29945, 22235, 15629, -32298, 5162, 28973, -23816, -13643, 32597, -7343, -27871, 25285, 11592, -32749, 9489, 26639, -26640, -9490, 32748, -11593, -25286, 27870, 7342, -32598, 13642, 23815, -28974, -5163, 32297, -15630, -22236, 29944, 2958, -31849, 17544, 20553, -30777, -741, 31253, -19380, -18778, 31468, -1481, -30515, 21125, 16915, -32015, 3695, 29635, -22774, -14975, 32414, -5893, -28621, 24317, 12965, -32665, 8062, 27473, -25750, -10898, 32764, -10196, -26202, 27063, 8778, -32715, 12282, 24807, -28253, -6620, 32514, -14313, -23301, 29312, 4429, -32165, 16276, 21685, -30238, -2221, 31666, -18166, -19972, 31023}, +{0, -30515, 22235, 14312, -32665, 9489, 25749, -28253, -5163, 32014, -18166, -18778, 31848, -4430, -28621, 25285, 10195, -32715, 13642, 22773, -30238, -741, 30776, -21686, -14975, 32597, -8779, -26202, 27870, 5892, -32165, 17544, 19379, -31667, 3695, 28973, -24808, -10898, 32748, -12966, -23301, 29944, 1480, -31024, 21125, 15629, -32515, 8062, 26639, -27474, -6620, 32297, -16916, -19972, 31468, -2959, -29313, 24317, 11592, -32765, 12282, 23815, -29636, -2221, 31253, -20554, -16277, 32414, -7343, -27064, 27063, 7342, -32415, 16276, 20553, -31254, 2220, 29635, -23816, -12283, 32764, -11593, -24318, 29312, 2958, -31469, 19971, 16915, -32298, 6619, 27473, -26640, -8063, 32514, -15630, -21126, 31023, -1481, -29945, 23300, 12965, -32749, 10897, 24807, -28974, -3696, 31666, -19380, -17545, 32164, -5893, -27871, 26201, 8778, -32598, 14974, 21685, -30777, 740, 30237, -22774, -13643, 32714, -10196, -25286, 28620, 4429, -31849, 18777, 18165, -32015, 5162, 28252, -25750, -9490, 32664, -14313, -22236, 30514}, +{0, -29945, 24317, 10195, -32598, 16276, 19379, -32015, 6619, 26639, -28253, -3696, 31253, -21686, -13643, 32764, -12966, -22236, 31023, -2959, -28621, 26201, 7342, -32165, 18777, 16915, -32515, 9489, 24807, -29636, -741, 30237, -23816, -10898, 32664, -15630, -19972, 31848, -5893, -27064, 27870, 4429, -31469, 21125, 14312, -32749, 12282, 22773, -30777, 2220, 28973, -25750, -8063, 32297, -18166, -17545, 32414, -8779, -25286, 29312, 1480, -30515, 23300, 11592, -32715, 14974, 20553, -31667, 5162, 27473, -27474, -5163, 31666, -20554, -14975, 32714, -11593, -23301, 30514, -1481, -29313, 25285, 8778, -32415, 17544, 18165, -32298, 8062, 25749, -28974, -2221, 30776, -22774, -12283, 32748, -14313, -21126, 31468, -4430, -27871, 27063, 5892, -31849, 19971, 15629, -32665, 10897, 23815, -30238, 740, 29635, -24808, -9490, 32514, -16916, -18778, 32164, -7343, -26202, 28620, 2958, -31024, 22235, 12965, -32765, 13642, 21685, -31254, 3695, 28252, -26640, -6620, 32014, -19380, -16277, 32597, -10196, -24318, 29944}, +{0, -29313, 26201, 5892, -31469, 22235, 11592, -32598, 17544, 16915, -32665, 12282, 21685, -31667, 6619, 25749, -29636, 740, 28973, -26640, -5163, 31253, -22774, -10898, 32514, -18166, -16277, 32714, -12966, -21126, 31848, -7343, -25286, 29944, -1481, -28621, 27063, 4429, -31024, 23300, 10195, -32415, 18777, 15629, -32749, 13642, 20553, -32015, 8062, 24807, -30238, 2220, 28252, -27474, -3696, 30776, -23816, -9490, 32297, -19380, -14975, 32764, -14313, -19972, 32164, -8779, -24318, 30514, -2959, -27871, 27870, 2958, -30515, 24317, 8778, -32165, 19971, 14312, -32765, 14974, 19379, -32298, 9489, 23815, -30777, 3695, 27473, -28253, -2221, 30237, -24808, -8063, 32014, -20554, -13643, 32748, -15630, -18778, 32414, -10196, -23301, 31023, -4430, -27064, 28620, 1480, -29945, 25285, 7342, -31849, 21125, 12965, -32715, 16276, 18165, -32515, 10897, 22773, -31254, 5162, 26639, -28974, -741, 29635, -25750, -6620, 31666, -21686, -12283, 32664, -16916, -17545, 32597, -11593, -22236, 31468, -5893, -26202, 29312}, +{0, -28621, 27870, 1480, -29313, 27063, 2958, -29945, 26201, 4429, -30515, 25285, 5892, -31024, 24317, 7342, -31469, 23300, 8778, -31849, 22235, 10195, -32165, 21125, 11592, -32415, 19971, 12965, -32598, 18777, 14312, -32715, 17544, 15629, -32765, 16276, 16915, -32749, 14974, 18165, -32665, 13642, 19379, -32515, 12282, 20553, -32298, 10897, 21685, -32015, 9489, 22773, -31667, 8062, 23815, -31254, 6619, 24807, -30777, 5162, 25749, -30238, 3695, 26639, -29636, 2220, 27473, -28974, 740, 28252, -28253, -741, 28973, -27474, -2221, 29635, -26640, -3696, 30237, -25750, -5163, 30776, -24808, -6620, 31253, -23816, -8063, 31666, -22774, -9490, 32014, -21686, -10898, 32297, -20554, -12283, 32514, -19380, -13643, 32664, -18166, -14975, 32748, -16916, -16277, 32764, -15630, -17545, 32714, -14313, -18778, 32597, -12966, -19972, 32414, -11593, -21126, 32164, -10196, -22236, 31848, -8779, -23301, 31468, -7343, -24318, 31023, -5893, -25286, 30514, -4430, -26202, 29944, -2959, -27064, 29312, -1481, -27871, 28620}, +{0, -27871, 29312, -2959, -26202, 30514, -5893, -24318, 31468, -8779, -22236, 32164, -11593, -19972, 32597, -14313, -17545, 32764, -16916, -14975, 32664, -19380, -12283, 32297, -21686, -9490, 31666, -23816, -6620, 30776, -25750, -3696, 29635, -27474, -741, 28252, -28974, 2220, 26639, -30238, 5162, 24807, -31254, 8062, 22773, -32015, 10897, 20553, -32515, 13642, 18165, -32749, 16276, 15629, -32715, 18777, 12965, -32415, 21125, 10195, -31849, 23300, 7342, -31024, 25285, 4429, -29945, 27063, 1480, -28621, 28620, -1481, -27064, 29944, -4430, -25286, 31023, -7343, -23301, 31848, -10196, -21126, 32414, -12966, -18778, 32714, -15630, -16277, 32748, -18166, -13643, 32514, -20554, -10898, 32014, -22774, -8063, 31253, -24808, -5163, 30237, -26640, -2221, 28973, -28253, 740, 27473, -29636, 3695, 25749, -30777, 6619, 23815, -31667, 9489, 21685, -32298, 12282, 19379, -32665, 14974, 16915, -32765, 17544, 14312, -32598, 19971, 11592, -32165, 22235, 8778, -31469, 24317, 5892, -30515, 26201, 2958, -29313, 27870}, +{0, -27064, 30514, -7343, -22236, 32414, -14313, -16277, 32664, -20554, -9490, 31253, -25750, -2221, 28252, -29636, 5162, 23815, -32015, 12282, 18165, -32765, 18777, 11592, -31849, 24317, 4429, -29313, 28620, -2959, -25286, 31468, -10196, -19972, 32714, -16916, -13643, 32297, -22774, -6620, 30237, -27474, 740, 26639, -30777, 8062, 21685, -32515, 14974, 15629, -32598, 21125, 8778, -31024, 26201, 1480, -27871, 29944, -5893, -23301, 32164, -12966, -17545, 32748, -19380, -10898, 31666, -24808, -3696, 28973, -28974, 3695, 24807, -31667, 10897, 19379, -32749, 17544, 12965, -32165, 23300, 5892, -29945, 27870, -1481, -26202, 31023, -8779, -21126, 32597, -15630, -14975, 32514, -21686, -8063, 30776, -26640, -741, 27473, -30238, 6619, 22773, -32298, 13642, 16915, -32715, 19971, 10195, -31469, 25285, 2958, -28621, 29312, -4430, -24318, 31848, -11593, -18778, 32764, -18166, -12283, 32014, -23816, -5163, 29635, -28253, 2220, 25749, -31254, 9489, 20553, -32665, 16276, 14312, -32415, 22235, 7342, -30515, 27063}, +{0, -26202, 31468, -11593, -17545, 32664, -21686, -6620, 29635, -28974, 5162, 22773, -32515, 16276, 12965, -31849, 25285, 1480, -27064, 31023, -10196, -18778, 32748, -20554, -8063, 30237, -28253, 3695, 23815, -32298, 14974, 14312, -32165, 24317, 2958, -27871, 30514, -8779, -19972, 32764, -19380, -9490, 30776, -27474, 2220, 24807, -32015, 13642, 15629, -32415, 23300, 4429, -28621, 29944, -7343, -21126, 32714, -18166, -10898, 31253, -26640, 740, 25749, -31667, 12282, 16915, -32598, 22235, 5892, -29313, 29312, -5893, -22236, 32597, -16916, -12283, 31666, -25750, -741, 26639, -31254, 10897, 18165, -32715, 21125, 7342, -29945, 28620, -4430, -23301, 32414, -15630, -13643, 32014, -24808, -2221, 27473, -30777, 9489, 19379, -32765, 19971, 8778, -30515, 27870, -2959, -24318, 32164, -14313, -14975, 32297, -23816, -3696, 28252, -30238, 8062, 20553, -32749, 18777, 10195, -31024, 27063, -1481, -25286, 31848, -12966, -16277, 32514, -22774, -5163, 28973, -29636, 6619, 21685, -32665, 17544, 11592, -31469, 26201}, +{0, -25286, 32164, -15630, -12283, 31253, -27474, 3695, 22773, -32665, 18777, 8778, -29945, 29312, -7343, -19972, 32748, -21686, -5163, 28252, -30777, 10897, 16915, -32415, 24317, 1480, -26202, 31848, -14313, -13643, 31666, -26640, 2220, 23815, -32515, 17544, 10195, -30515, 28620, -5893, -21126, 32764, -20554, -6620, 28973, -30238, 9489, 18165, -32598, 23300, 2958, -27064, 31468, -12966, -14975, 32014, -25750, 740, 24807, -32298, 16276, 11592, -31024, 27870, -4430, -22236, 32714, -19380, -8063, 29635, -29636, 8062, 19379, -32715, 22235, 4429, -27871, 31023, -11593, -16277, 32297, -24808, -741, 25749, -32015, 14974, 12965, -31469, 27063, -2959, -23301, 32597, -18166, -9490, 30237, -28974, 6619, 20553, -32765, 21125, 5892, -28621, 30514, -10196, -17545, 32514, -23816, -2221, 26639, -31667, 13642, 14312, -31849, 26201, -1481, -24318, 32414, -16916, -10898, 30776, -28253, 5162, 21685, -32749, 19971, 7342, -29313, 29944, -8779, -18778, 32664, -22774, -3696, 27473, -31254, 12282, 15629, -32165, 25285}, +{0, -24318, 32597, -19380, -6620, 28252, -31254, 13642, 12965, -31024, 28620, -7343, -18778, 32514, -24808, 740, 23815, -32665, 19971, 5892, -27871, 31468, -14313, -12283, 30776, -28974, 8062, 18165, -32415, 25285, -1481, -23301, 32714, -20554, -5163, 27473, -31667, 14974, 11592, -30515, 29312, -8779, -17545, 32297, -25750, 2220, 22773, -32749, 21125, 4429, -27064, 31848, -15630, -10898, 30237, -29636, 9489, 16915, -32165, 26201, -2959, -22236, 32764, -21686, -3696, 26639, -32015, 16276, 10195, -29945, 29944, -10196, -16277, 32014, -26640, 3695, 21685, -32765, 22235, 2958, -26202, 32164, -16916, -9490, 29635, -30238, 10897, 15629, -31849, 27063, -4430, -21126, 32748, -22774, -2221, 25749, -32298, 17544, 8778, -29313, 30514, -11593, -14975, 31666, -27474, 5162, 20553, -32715, 23300, 1480, -25286, 32414, -18166, -8063, 28973, -30777, 12282, 14312, -31469, 27870, -5893, -19972, 32664, -23816, -741, 24807, -32515, 18777, 7342, -28621, 31023, -12966, -13643, 31253, -28253, 6619, 19379, -32598, 24317}, +{0, -23301, 32764, -22774, -741, 23815, -32749, 22235, 1480, -24318, 32714, -21686, -2221, 24807, -32665, 21125, 2958, -25286, 32597, -20554, -3696, 25749, -32515, 19971, 4429, -26202, 32414, -19380, -5163, 26639, -32298, 18777, 5892, -27064, 32164, -18166, -6620, 27473, -32015, 17544, 7342, -27871, 31848, -16916, -8063, 28252, -31667, 16276, 8778, -28621, 31468, -15630, -9490, 28973, -31254, 14974, 10195, -29313, 31023, -14313, -10898, 29635, -30777, 13642, 11592, -29945, 30514, -12966, -12283, 30237, -30238, 12282, 12965, -30515, 29944, -11593, -13643, 30776, -29636, 10897, 14312, -31024, 29312, -10196, -14975, 31253, -28974, 9489, 15629, -31469, 28620, -8779, -16277, 31666, -28253, 8062, 16915, -31849, 27870, -7343, -17545, 32014, -27474, 6619, 18165, -32165, 27063, -5893, -18778, 32297, -26640, 5162, 19379, -32415, 26201, -4430, -19972, 32514, -25750, 3695, 20553, -32598, 25285, -2959, -21126, 32664, -24808, 2220, 21685, -32715, 24317, -1481, -22236, 32748, -23816, 740, 22773, -32765, 23300}, +{0, -22236, 32664, -25750, 5162, 18165, -31849, 28620, -10196, -13643, 30237, -30777, 14974, 8778, -27871, 32164, -19380, -3696, 24807, -32749, 23300, -1481, -21126, 32514, -26640, 6619, 16915, -31469, 29312, -11593, -12283, 29635, -31254, 16276, 7342, -27064, 32414, -20554, -2221, 23815, -32765, 24317, -2959, -19972, 32297, -27474, 8062, 15629, -31024, 29944, -12966, -10898, 28973, -31667, 17544, 5892, -26202, 32597, -21686, -741, 22773, -32715, 25285, -4430, -18778, 32014, -28253, 9489, 14312, -30515, 30514, -14313, -9490, 28252, -32015, 18777, 4429, -25286, 32714, -22774, 740, 21685, -32598, 26201, -5893, -17545, 31666, -28974, 10897, 12965, -29945, 31023, -15630, -8063, 27473, -32298, 19971, 2958, -24318, 32764, -23816, 2220, 20553, -32415, 27063, -7343, -16277, 31253, -29636, 12282, 11592, -29313, 31468, -16916, -6620, 26639, -32515, 21125, 1480, -23301, 32748, -24808, 3695, 19379, -32165, 27870, -8779, -14975, 30776, -30238, 13642, 10195, -28621, 31848, -18166, -5163, 25749, -32665, 22235}, +{0, -21126, 32297, -28253, 10897, 11592, -28621, 32164, -20554, -741, 21685, -32415, 27870, -10196, -12283, 28973, -32015, 19971, 1480, -22236, 32514, -27474, 9489, 12965, -29313, 31848, -19380, -2221, 22773, -32598, 27063, -8779, -13643, 29635, -31667, 18777, 2958, -23301, 32664, -26640, 8062, 14312, -29945, 31468, -18166, -3696, 23815, -32715, 26201, -7343, -14975, 30237, -31254, 17544, 4429, -24318, 32748, -25750, 6619, 15629, -30515, 31023, -16916, -5163, 24807, -32765, 25285, -5893, -16277, 30776, -30777, 16276, 5892, -25286, 32764, -24808, 5162, 16915, -31024, 30514, -15630, -6620, 25749, -32749, 24317, -4430, -17545, 31253, -30238, 14974, 7342, -26202, 32714, -23816, 3695, 18165, -31469, 29944, -14313, -8063, 26639, -32665, 23300, -2959, -18778, 31666, -29636, 13642, 8778, -27064, 32597, -22774, 2220, 19379, -31849, 29312, -12966, -9490, 27473, -32515, 22235, -1481, -19972, 32014, -28974, 12282, 10195, -27871, 32414, -21686, 740, 20553, -32165, 28620, -11593, -10898, 28252, -32298, 21125}, +{0, -19972, 31666, -30238, 16276, 4429, -23301, 32514, -28253, 12282, 8778, -26202, 32764, -25750, 8062, 12965, -28621, 32414, -22774, 3695, 16915, -30515, 31468, -19380, -741, 20553, -31849, 29944, -15630, -5163, 23815, -32598, 27870, -11593, -9490, 26639, -32749, 25285, -7343, -13643, 28973, -32298, 22235, -2959, -17545, 30776, -31254, 18777, 1480, -21126, 32014, -29636, 14974, 5892, -24318, 32664, -27474, 10897, 10195, -27064, 32714, -24808, 6619, 14312, -29313, 32164, -21686, 2220, 18165, -31024, 31023, -18166, -2221, 21685, -32165, 29312, -14313, -6620, 24807, -32715, 27063, -10196, -10898, 27473, -32665, 24317, -5893, -14975, 29635, -32015, 21125, -1481, -18778, 31253, -30777, 17544, 2958, -22236, 32297, -28974, 13642, 7342, -25286, 32748, -26640, 9489, 11592, -27871, 32597, -23816, 5162, 15629, -29945, 31848, -20554, 740, 19379, -31469, 30514, -16916, -3696, 22773, -32415, 28620, -12966, -8063, 25749, -32765, 26201, -8779, -12283, 28252, -32515, 23300, -4430, -16277, 30237, -31667, 19971}, +{0, -18778, 30776, -31667, 21125, -2959, -16277, 29635, -32298, 23300, -5893, -13643, 28252, -32665, 25285, -8779, -10898, 26639, -32765, 27063, -11593, -8063, 24807, -32598, 28620, -14313, -5163, 22773, -32165, 29944, -16916, -2221, 20553, -31469, 31023, -19380, 740, 18165, -30515, 31848, -21686, 3695, 15629, -29313, 32414, -23816, 6619, 12965, -27871, 32714, -25750, 9489, 10195, -26202, 32748, -27474, 12282, 7342, -24318, 32514, -28974, 14974, 4429, -22236, 32014, -30238, 17544, 1480, -19972, 31253, -31254, 19971, -1481, -17545, 30237, -32015, 22235, -4430, -14975, 28973, -32515, 24317, -7343, -12283, 27473, -32749, 26201, -10196, -9490, 25749, -32715, 27870, -12966, -6620, 23815, -32415, 29312, -15630, -3696, 21685, -31849, 30514, -18166, -741, 19379, -31024, 31468, -20554, 2220, 16915, -29945, 32164, -22774, 5162, 14312, -28621, 32597, -24808, 8062, 11592, -27064, 32764, -26640, 10897, 8778, -25286, 32664, -28253, 13642, 5892, -23301, 32297, -29636, 16276, 2958, -21126, 31666, -30777, 18777}, +{0, -17545, 29635, -32515, 25285, -10196, -8063, 23815, -32165, 30514, -19380, 2220, 15629, -28621, 32714, -26640, 12282, 5892, -22236, 31666, -31254, 21125, -4430, -13643, 27473, -32765, 27870, -14313, -3696, 20553, -31024, 31848, -22774, 6619, 11592, -26202, 32664, -28974, 16276, 1480, -18778, 30237, -32298, 24317, -8779, -9490, 24807, -32415, 29944, -18166, 740, 16915, -29313, 32597, -25750, 10897, 7342, -23301, 32014, -30777, 19971, -2959, -14975, 28252, -32749, 27063, -12966, -5163, 21685, -31469, 31468, -21686, 5162, 12965, -27064, 32748, -28253, 14974, 2958, -19972, 30776, -32015, 23300, -7343, -10898, 25749, -32598, 29312, -16916, -741, 18165, -29945, 32414, -24808, 9489, 8778, -24318, 32297, -30238, 18777, -1481, -16277, 28973, -32665, 26201, -11593, -6620, 22773, -31849, 31023, -20554, 3695, 14312, -27871, 32764, -27474, 13642, 4429, -21126, 31253, -31667, 22235, -5893, -12283, 26639, -32715, 28620, -15630, -2221, 19379, -30515, 32164, -23816, 8062, 10195, -25286, 32514, -29636, 17544}, +{0, -16277, 28252, -32765, 28620, -16916, 740, 15629, -27871, 32748, -28974, 17544, -1481, -14975, 27473, -32715, 29312, -18166, 2220, 14312, -27064, 32664, -29636, 18777, -2959, -13643, 26639, -32598, 29944, -19380, 3695, 12965, -26202, 32514, -30238, 19971, -4430, -12283, 25749, -32415, 30514, -20554, 5162, 11592, -25286, 32297, -30777, 21125, -5893, -10898, 24807, -32165, 31023, -21686, 6619, 10195, -24318, 32014, -31254, 22235, -7343, -9490, 23815, -31849, 31468, -22774, 8062, 8778, -23301, 31666, -31667, 23300, -8779, -8063, 22773, -31469, 31848, -23816, 9489, 7342, -22236, 31253, -32015, 24317, -10196, -6620, 21685, -31024, 32164, -24808, 10897, 5892, -21126, 30776, -32298, 25285, -11593, -5163, 20553, -30515, 32414, -25750, 12282, 4429, -19972, 30237, -32515, 26201, -12966, -3696, 19379, -29945, 32597, -26640, 13642, 2958, -18778, 29635, -32665, 27063, -14313, -2221, 18165, -29313, 32714, -27474, 14974, 1480, -17545, 28973, -32749, 27870, -15630, -741, 16915, -28621, 32764, -28253, 16276}, +{0, -14975, 26639, -32415, 31023, -22774, 9489, 5892, -19972, 29635, -32749, 28620, -18166, 3695, 11592, -24318, 31666, -32015, 25285, -12966, -2221, 16915, -27871, 32664, -30238, 21125, -7343, -8063, 21685, -30515, 32597, -27474, 16276, -1481, -13643, 25749, -32165, 31468, -23816, 10897, 4429, -18778, 28973, -32765, 29312, -19380, 5162, 10195, -23301, 31253, -32298, 26201, -14313, -741, 15629, -27064, 32514, -30777, 22235, -8779, -6620, 20553, -29945, 32714, -28253, 17544, -2959, -12283, 24807, -31849, 31848, -24808, 12282, 2958, -17545, 28252, -32715, 29944, -20554, 6619, 8778, -22236, 30776, -32515, 27063, -15630, 740, 14312, -26202, 32297, -31254, 23300, -10196, -5163, 19379, -29313, 32764, -28974, 18777, -4430, -10898, 23815, -31469, 32164, -25750, 13642, 1480, -16277, 27473, -32598, 30514, -21686, 8062, 7342, -21126, 30237, -32665, 27870, -16916, 2220, 12965, -25286, 32014, -31667, 24317, -11593, -3696, 18165, -28621, 32748, -29636, 19971, -5893, -9490, 22773, -31024, 32414, -26640, 14974}, +{0, -13643, 24807, -31469, 32414, -27474, 17544, -4430, -9490, 21685, -29945, 32764, -29636, 21125, -8779, -5163, 18165, -27871, 32514, -31254, 24317, -12966, -741, 14312, -25286, 31666, -32298, 27063, -16916, 3695, 10195, -22236, 30237, -32749, 29312, -20554, 8062, 5892, -18778, 28252, -32598, 31023, -23816, 12282, 1480, -14975, 25749, -31849, 32164, -26640, 16276, -2959, -10898, 22773, -30515, 32714, -28974, 19971, -7343, -6620, 19379, -28621, 32664, -30777, 23300, -11593, -2221, 15629, -26202, 32014, -32015, 26201, -15630, 2220, 11592, -23301, 30776, -32665, 28620, -19380, 6619, 7342, -19972, 28973, -32715, 30514, -22774, 10897, 2958, -16277, 26639, -32165, 31848, -25750, 14974, -1481, -12283, 23815, -31024, 32597, -28253, 18777, -5893, -8063, 20553, -29313, 32748, -30238, 22235, -10196, -3696, 16915, -27064, 32297, -31667, 25285, -14313, 740, 12965, -24318, 31253, -32515, 27870, -18166, 5162, 8778, -21126, 29635, -32765, 29944, -21686, 9489, 4429, -17545, 27473, -32415, 31468, -24808, 13642}, +{0, -12283, 22773, -29945, 32748, -30777, 24317, -14313, 2220, 10195, -21126, 28973, -32598, 31468, -25750, 16276, -4430, -8063, 19379, -27871, 32297, -32015, 27063, -18166, 6619, 5892, -17545, 26639, -31849, 32414, -28253, 19971, -8779, -3696, 15629, -25286, 31253, -32665, 29312, -21686, 10897, 1480, -13643, 23815, -30515, 32764, -30238, 23300, -12966, 740, 11592, -22236, 29635, -32715, 31023, -24808, 14974, -2959, -9490, 20553, -28621, 32514, -31667, 26201, -16916, 5162, 7342, -18778, 27473, -32165, 32164, -27474, 18777, -7343, -5163, 16915, -26202, 31666, -32515, 28620, -20554, 9489, 2958, -14975, 24807, -31024, 32714, -29636, 22235, -11593, -741, 12965, -23301, 30237, -32765, 30514, -23816, 13642, -1481, -10898, 21685, -29313, 32664, -31254, 25285, -15630, 3695, 8778, -19972, 28252, -32415, 31848, -26640, 17544, -5893, -6620, 18165, -27064, 32014, -32298, 27870, -19380, 8062, 4429, -16277, 25749, -31469, 32597, -28974, 21125, -10196, -2221, 14312, -24318, 30776, -32749, 29944, -22774, 12282}, +{0, -10898, 20553, -27871, 32014, -32515, 29312, -22774, 13642, -2959, -8063, 18165, -26202, 31253, -32749, 30514, -24808, 16276, -5893, -5163, 15629, -24318, 30237, -32715, 31468, -26640, 18777, -8779, -2221, 12965, -22236, 28973, -32415, 32164, -28253, 21125, -11593, 740, 10195, -19972, 27473, -31849, 32597, -29636, 23300, -14313, 3695, 7342, -17545, 25749, -31024, 32764, -30777, 25285, -16916, 6619, 4429, -14975, 23815, -29945, 32664, -31667, 27063, -19380, 9489, 1480, -12283, 21685, -28621, 32297, -32298, 28620, -21686, 12282, -1481, -9490, 19379, -27064, 31666, -32665, 29944, -23816, 14974, -4430, -6620, 16915, -25286, 30776, -32765, 31023, -25750, 17544, -7343, -3696, 14312, -23301, 29635, -32598, 31848, -27474, 19971, -10196, -741, 11592, -21126, 28252, -32165, 32414, -28974, 22235, -12966, 2220, 8778, -18778, 26639, -31469, 32714, -30238, 24317, -15630, 5162, 5892, -16277, 24807, -30515, 32748, -31254, 26201, -18166, 8062, 2958, -13643, 22773, -29313, 32514, -32015, 27870, -20554, 10897}, +{0, -9490, 18165, -25286, 30237, -32598, 32164, -28974, 23300, -15630, 6619, 2958, -12283, 20553, -27064, 31253, -32765, 31468, -27474, 21125, -12966, 3695, 5892, -14975, 22773, -28621, 32014, -32665, 30514, -25750, 18777, -10196, 740, 8778, -17545, 24807, -29945, 32514, -32298, 29312, -23816, 16276, -7343, -2221, 11592, -19972, 26639, -31024, 32748, -31667, 27870, -21686, 13642, -4430, -5163, 14312, -22236, 28252, -31849, 32714, -30777, 26201, -19380, 10897, -1481, -8063, 16915, -24318, 29635, -32415, 32414, -29636, 24317, -16916, 8062, 1480, -10898, 19379, -26202, 30776, -32715, 31848, -28253, 22235, -14313, 5162, 4429, -13643, 21685, -27871, 31666, -32749, 31023, -26640, 19971, -11593, 2220, 7342, -16277, 23815, -29313, 32297, -32515, 29944, -24808, 17544, -8779, -741, 10195, -18778, 25749, -30515, 32664, -32015, 28620, -22774, 14974, -5893, -3696, 12965, -21126, 27473, -31469, 32764, -31254, 27063, -20554, 12282, -2959, -6620, 15629, -23301, 28973, -32165, 32597, -30238, 25285, -18166, 9489}, +{0, -8063, 15629, -22236, 27473, -31024, 32664, -32298, 29944, -25750, 19971, -12966, 5162, 2958, -10898, 18165, -24318, 28973, -31849, 32764, -31667, 28620, -23816, 17544, -10196, 2220, 5892, -13643, 20553, -26202, 30237, -32415, 32597, -30777, 27063, -21686, 14974, -7343, -741, 8778, -16277, 22773, -27871, 31253, -32715, 32164, -29636, 25285, -19380, 12282, -4430, -3696, 11592, -18778, 24807, -29313, 32014, -32749, 31468, -28253, 23300, -16916, 9489, -1481, -6620, 14312, -21126, 26639, -30515, 32514, -32515, 30514, -26640, 21125, -14313, 6619, 1480, -9490, 16915, -23301, 28252, -31469, 32748, -32015, 29312, -24808, 18777, -11593, 3695, 4429, -12283, 19379, -25286, 29635, -32165, 32714, -31254, 27870, -22774, 16276, -8779, 740, 7342, -14975, 21685, -27064, 30776, -32598, 32414, -30238, 26201, -20554, 13642, -5893, -2221, 10195, -17545, 23815, -28621, 31666, -32765, 31848, -28974, 24317, -18166, 10897, -2959, -5163, 12965, -19972, 25749, -29945, 32297, -32665, 31023, -27474, 22235, -15630, 8062}, +{0, -6620, 12965, -18778, 23815, -27871, 30776, -32415, 32714, -31667, 29312, -25750, 21125, -15630, 9489, -2959, -3696, 10195, -16277, 21685, -26202, 29635, -31849, 32748, -32298, 30514, -27474, 23300, -18166, 12282, -5893, -741, 7342, -13643, 19379, -24318, 28252, -31024, 32514, -32665, 31468, -28974, 25285, -20554, 14974, -8779, 2220, 4429, -10898, 16915, -22236, 26639, -29945, 32014, -32765, 32164, -30238, 27063, -22774, 17544, -11593, 5162, 1480, -8063, 14312, -19972, 24807, -28621, 31253, -32598, 32597, -31254, 28620, -24808, 19971, -14313, 8062, -1481, -5163, 11592, -17545, 22773, -27064, 30237, -32165, 32764, -32015, 29944, -26640, 22235, -16916, 10897, -4430, -2221, 8778, -14975, 20553, -25286, 28973, -31469, 32664, -32515, 31023, -28253, 24317, -19380, 13642, -7343, 740, 5892, -12283, 18165, -23301, 27473, -30515, 32297, -32749, 31848, -29636, 26201, -21686, 16276, -10196, 3695, 2958, -9490, 15629, -21126, 25749, -29313, 31666, -32715, 32414, -30777, 27870, -23816, 18777, -12966, 6619}, +{0, -5163, 10195, -14975, 19379, -23301, 26639, -29313, 31253, -32415, 32764, -32298, 31023, -28974, 26201, -22774, 18777, -14313, 9489, -4430, -741, 5892, -10898, 15629, -19972, 23815, -27064, 29635, -31469, 32514, -32749, 32164, -30777, 28620, -25750, 22235, -18166, 13642, -8779, 3695, 1480, -6620, 11592, -16277, 20553, -24318, 27473, -29945, 31666, -32598, 32714, -32015, 30514, -28253, 25285, -21686, 17544, -12966, 8062, -2959, -2221, 7342, -12283, 16915, -21126, 24807, -27871, 30237, -31849, 32664, -32665, 31848, -30238, 27870, -24808, 21125, -16916, 12282, -7343, 2220, 2958, -8063, 12965, -17545, 21685, -25286, 28252, -30515, 32014, -32715, 32597, -31667, 29944, -27474, 24317, -20554, 16276, -11593, 6619, -1481, -3696, 8778, -13643, 18165, -22236, 25749, -28621, 30776, -32165, 32748, -32515, 31468, -29636, 27063, -23816, 19971, -15630, 10897, -5893, 740, 4429, -9490, 14312, -18778, 22773, -26202, 28973, -31024, 32297, -32765, 32414, -31254, 29312, -26640, 23300, -19380, 14974, -10196, 5162}, +{0, -3696, 7342, -10898, 14312, -17545, 20553, -23301, 25749, -27871, 29635, -31024, 32014, -32598, 32764, -32515, 31848, -30777, 29312, -27474, 25285, -22774, 19971, -16916, 13642, -10196, 6619, -2959, -741, 4429, -8063, 11592, -14975, 18165, -21126, 23815, -26202, 28252, -29945, 31253, -32165, 32664, -32749, 32414, -31667, 30514, -28974, 27063, -24808, 22235, -19380, 16276, -12966, 9489, -5893, 2220, 1480, -5163, 8778, -12283, 15629, -18778, 21685, -24318, 26639, -28621, 30237, -31469, 32297, -32715, 32714, -32298, 31468, -30238, 28620, -26640, 24317, -21686, 18777, -15630, 12282, -8779, 5162, -1481, -2221, 5892, -9490, 12965, -16277, 19379, -22236, 24807, -27064, 28973, -30515, 31666, -32415, 32748, -32665, 32164, -31254, 29944, -28253, 26201, -23816, 21125, -18166, 14974, -11593, 8062, -4430, 740, 2958, -6620, 10195, -13643, 16915, -19972, 22773, -25286, 27473, -29313, 30776, -31849, 32514, -32765, 32597, -32015, 31023, -29636, 27870, -25750, 23300, -20554, 17544, -14313, 10897, -7343, 3695}, +{0, -2221, 4429, -6620, 8778, -10898, 12965, -14975, 16915, -18778, 20553, -22236, 23815, -25286, 26639, -27871, 28973, -29945, 30776, -31469, 32014, -32415, 32664, -32765, 32714, -32515, 32164, -31667, 31023, -30238, 29312, -28253, 27063, -25750, 24317, -22774, 21125, -19380, 17544, -15630, 13642, -11593, 9489, -7343, 5162, -2959, 740, 1480, -3696, 5892, -8063, 10195, -12283, 14312, -16277, 18165, -19972, 21685, -23301, 24807, -26202, 27473, -28621, 29635, -30515, 31253, -31849, 32297, -32598, 32748, -32749, 32597, -32298, 31848, -31254, 30514, -29636, 28620, -27474, 26201, -24808, 23300, -21686, 19971, -18166, 16276, -14313, 12282, -10196, 8062, -5893, 3695, -1481, -741, 2958, -5163, 7342, -9490, 11592, -13643, 15629, -17545, 19379, -21126, 22773, -24318, 25749, -27064, 28252, -29313, 30237, -31024, 31666, -32165, 32514, -32715, 32764, -32665, 32414, -32015, 31468, -30777, 29944, -28974, 27870, -26640, 25285, -23816, 22235, -20554, 18777, -16916, 14974, -12966, 10897, -8779, 6619, -4430, 2220}, +{0, -741, 1480, -2221, 2958, -3696, 4429, -5163, 5892, -6620, 7342, -8063, 8778, -9490, 10195, -10898, 11592, -12283, 12965, -13643, 14312, -14975, 15629, -16277, 16915, -17545, 18165, -18778, 19379, -19972, 20553, -21126, 21685, -22236, 22773, -23301, 23815, -24318, 24807, -25286, 25749, -26202, 26639, -27064, 27473, -27871, 28252, -28621, 28973, -29313, 29635, -29945, 30237, -30515, 30776, -31024, 31253, -31469, 31666, -31849, 32014, -32165, 32297, -32415, 32514, -32598, 32664, -32715, 32748, -32765, 32764, -32749, 32714, -32665, 32597, -32515, 32414, -32298, 32164, -32015, 31848, -31667, 31468, -31254, 31023, -30777, 30514, -30238, 29944, -29636, 29312, -28974, 28620, -28253, 27870, -27474, 27063, -26640, 26201, -25750, 25285, -24808, 24317, -23816, 23300, -22774, 22235, -21686, 21125, -20554, 19971, -19380, 18777, -18166, 17544, -16916, 16276, -15630, 14974, -14313, 13642, -12966, 12282, -11593, 10897, -10196, 9489, -8779, 8062, -7343, 6619, -5893, 5162, -4430, 3695, -2959, 2220, -1481, 740}, +{0, 740, -1481, 2220, -2959, 3695, -4430, 5162, -5893, 6619, -7343, 8062, -8779, 9489, -10196, 10897, -11593, 12282, -12966, 13642, -14313, 14974, -15630, 16276, -16916, 17544, -18166, 18777, -19380, 19971, -20554, 21125, -21686, 22235, -22774, 23300, -23816, 24317, -24808, 25285, -25750, 26201, -26640, 27063, -27474, 27870, -28253, 28620, -28974, 29312, -29636, 29944, -30238, 30514, -30777, 31023, -31254, 31468, -31667, 31848, -32015, 32164, -32298, 32414, -32515, 32597, -32665, 32714, -32749, 32764, -32765, 32748, -32715, 32664, -32598, 32514, -32415, 32297, -32165, 32014, -31849, 31666, -31469, 31253, -31024, 30776, -30515, 30237, -29945, 29635, -29313, 28973, -28621, 28252, -27871, 27473, -27064, 26639, -26202, 25749, -25286, 24807, -24318, 23815, -23301, 22773, -22236, 21685, -21126, 20553, -19972, 19379, -18778, 18165, -17545, 16915, -16277, 15629, -14975, 14312, -13643, 12965, -12283, 11592, -10898, 10195, -9490, 8778, -8063, 7342, -6620, 5892, -5163, 4429, -3696, 2958, -2221, 1480, -741}, +{0, 2220, -4430, 6619, -8779, 10897, -12966, 14974, -16916, 18777, -20554, 22235, -23816, 25285, -26640, 27870, -28974, 29944, -30777, 31468, -32015, 32414, -32665, 32764, -32715, 32514, -32165, 31666, -31024, 30237, -29313, 28252, -27064, 25749, -24318, 22773, -21126, 19379, -17545, 15629, -13643, 11592, -9490, 7342, -5163, 2958, -741, -1481, 3695, -5893, 8062, -10196, 12282, -14313, 16276, -18166, 19971, -21686, 23300, -24808, 26201, -27474, 28620, -29636, 30514, -31254, 31848, -32298, 32597, -32749, 32748, -32598, 32297, -31849, 31253, -30515, 29635, -28621, 27473, -26202, 24807, -23301, 21685, -19972, 18165, -16277, 14312, -12283, 10195, -8063, 5892, -3696, 1480, 740, -2959, 5162, -7343, 9489, -11593, 13642, -15630, 17544, -19380, 21125, -22774, 24317, -25750, 27063, -28253, 29312, -30238, 31023, -31667, 32164, -32515, 32714, -32765, 32664, -32415, 32014, -31469, 30776, -29945, 28973, -27871, 26639, -25286, 23815, -22236, 20553, -18778, 16915, -14975, 12965, -10898, 8778, -6620, 4429, -2221}, +{0, 3695, -7343, 10897, -14313, 17544, -20554, 23300, -25750, 27870, -29636, 31023, -32015, 32597, -32765, 32514, -31849, 30776, -29313, 27473, -25286, 22773, -19972, 16915, -13643, 10195, -6620, 2958, 740, -4430, 8062, -11593, 14974, -18166, 21125, -23816, 26201, -28253, 29944, -31254, 32164, -32665, 32748, -32415, 31666, -30515, 28973, -27064, 24807, -22236, 19379, -16277, 12965, -9490, 5892, -2221, -1481, 5162, -8779, 12282, -15630, 18777, -21686, 24317, -26640, 28620, -30238, 31468, -32298, 32714, -32715, 32297, -31469, 30237, -28621, 26639, -24318, 21685, -18778, 15629, -12283, 8778, -5163, 1480, 2220, -5893, 9489, -12966, 16276, -19380, 22235, -24808, 27063, -28974, 30514, -31667, 32414, -32749, 32664, -32165, 31253, -29945, 28252, -26202, 23815, -21126, 18165, -14975, 11592, -8063, 4429, -741, -2959, 6619, -10196, 13642, -16916, 19971, -22774, 25285, -27474, 29312, -30777, 31848, -32515, 32764, -32598, 32014, -31024, 29635, -27871, 25749, -23301, 20553, -17545, 14312, -10898, 7342, -3696}, +{0, 5162, -10196, 14974, -19380, 23300, -26640, 29312, -31254, 32414, -32765, 32297, -31024, 28973, -26202, 22773, -18778, 14312, -9490, 4429, 740, -5893, 10897, -15630, 19971, -23816, 27063, -29636, 31468, -32515, 32748, -32165, 30776, -28621, 25749, -22236, 18165, -13643, 8778, -3696, -1481, 6619, -11593, 16276, -20554, 24317, -27474, 29944, -31667, 32597, -32715, 32014, -30515, 28252, -25286, 21685, -17545, 12965, -8063, 2958, 2220, -7343, 12282, -16916, 21125, -24808, 27870, -30238, 31848, -32665, 32664, -31849, 30237, -27871, 24807, -21126, 16915, -12283, 7342, -2221, -2959, 8062, -12966, 17544, -21686, 25285, -28253, 30514, -32015, 32714, -32598, 31666, -29945, 27473, -24318, 20553, -16277, 11592, -6620, 1480, 3695, -8779, 13642, -18166, 22235, -25750, 28620, -30777, 32164, -32749, 32514, -31469, 29635, -27064, 23815, -19972, 15629, -10898, 5892, -741, -4430, 9489, -14313, 18777, -22774, 26201, -28974, 31023, -32298, 32764, -32415, 31253, -29313, 26639, -23301, 19379, -14975, 10195, -5163}, +{0, 6619, -12966, 18777, -23816, 27870, -30777, 32414, -32715, 31666, -29313, 25749, -21126, 15629, -9490, 2958, 3695, -10196, 16276, -21686, 26201, -29636, 31848, -32749, 32297, -30515, 27473, -23301, 18165, -12283, 5892, 740, -7343, 13642, -19380, 24317, -28253, 31023, -32515, 32664, -31469, 28973, -25286, 20553, -14975, 8778, -2221, -4430, 10897, -16916, 22235, -26640, 29944, -32015, 32764, -32165, 30237, -27064, 22773, -17545, 11592, -5163, -1481, 8062, -14313, 19971, -24808, 28620, -31254, 32597, -32598, 31253, -28621, 24807, -19972, 14312, -8063, 1480, 5162, -11593, 17544, -22774, 27063, -30238, 32164, -32765, 32014, -29945, 26639, -22236, 16915, -10898, 4429, 2220, -8779, 14974, -20554, 25285, -28974, 31468, -32665, 32514, -31024, 28252, -24318, 19379, -13643, 7342, -741, -5893, 12282, -18166, 23300, -27474, 30514, -32298, 32748, -31849, 29635, -26202, 21685, -16277, 10195, -3696, -2959, 9489, -15630, 21125, -25750, 29312, -31667, 32714, -32415, 30776, -27871, 23815, -18778, 12965, -6620}, +{0, 8062, -15630, 22235, -27474, 31023, -32665, 32297, -29945, 25749, -19972, 12965, -5163, -2959, 10897, -18166, 24317, -28974, 31848, -32765, 31666, -28621, 23815, -17545, 10195, -2221, -5893, 13642, -20554, 26201, -30238, 32414, -32598, 30776, -27064, 21685, -14975, 7342, 740, -8779, 16276, -22774, 27870, -31254, 32714, -32165, 29635, -25286, 19379, -12283, 4429, 3695, -11593, 18777, -24808, 29312, -32015, 32748, -31469, 28252, -23301, 16915, -9490, 1480, 6619, -14313, 21125, -26640, 30514, -32515, 32514, -30515, 26639, -21126, 14312, -6620, -1481, 9489, -16916, 23300, -28253, 31468, -32749, 32014, -29313, 24807, -18778, 11592, -3696, -4430, 12282, -19380, 25285, -29636, 32164, -32715, 31253, -27871, 22773, -16277, 8778, -741, -7343, 14974, -21686, 27063, -30777, 32597, -32415, 30237, -26202, 20553, -13643, 5892, 2220, -10196, 17544, -23816, 28620, -31667, 32764, -31849, 28973, -24318, 18165, -10898, 2958, 5162, -12966, 19971, -25750, 29944, -32298, 32664, -31024, 27473, -22236, 15629, -8063}, +{0, 9489, -18166, 25285, -30238, 32597, -32165, 28973, -23301, 15629, -6620, -2959, 12282, -20554, 27063, -31254, 32764, -31469, 27473, -21126, 12965, -3696, -5893, 14974, -22774, 28620, -32015, 32664, -30515, 25749, -18778, 10195, -741, -8779, 17544, -24808, 29944, -32515, 32297, -29313, 23815, -16277, 7342, 2220, -11593, 19971, -26640, 31023, -32749, 31666, -27871, 21685, -13643, 4429, 5162, -14313, 22235, -28253, 31848, -32715, 30776, -26202, 19379, -10898, 1480, 8062, -16916, 24317, -29636, 32414, -32415, 29635, -24318, 16915, -8063, -1481, 10897, -19380, 26201, -30777, 32714, -31849, 28252, -22236, 14312, -5163, -4430, 13642, -21686, 27870, -31667, 32748, -31024, 26639, -19972, 11592, -2221, -7343, 16276, -23816, 29312, -32298, 32514, -29945, 24807, -17545, 8778, 740, -10196, 18777, -25750, 30514, -32665, 32014, -28621, 22773, -14975, 5892, 3695, -12966, 21125, -27474, 31468, -32765, 31253, -27064, 20553, -12283, 2958, 6619, -15630, 23300, -28974, 32164, -32598, 30237, -25286, 18165, -9490}, +{0, 10897, -20554, 27870, -32015, 32514, -29313, 22773, -13643, 2958, 8062, -18166, 26201, -31254, 32748, -30515, 24807, -16277, 5892, 5162, -15630, 24317, -30238, 32714, -31469, 26639, -18778, 8778, 2220, -12966, 22235, -28974, 32414, -32165, 28252, -21126, 11592, -741, -10196, 19971, -27474, 31848, -32598, 29635, -23301, 14312, -3696, -7343, 17544, -25750, 31023, -32765, 30776, -25286, 16915, -6620, -4430, 14974, -23816, 29944, -32665, 31666, -27064, 19379, -9490, -1481, 12282, -21686, 28620, -32298, 32297, -28621, 21685, -12283, 1480, 9489, -19380, 27063, -31667, 32664, -29945, 23815, -14975, 4429, 6619, -16916, 25285, -30777, 32764, -31024, 25749, -17545, 7342, 3695, -14313, 23300, -29636, 32597, -31849, 27473, -19972, 10195, 740, -11593, 21125, -28253, 32164, -32415, 28973, -22236, 12965, -2221, -8779, 18777, -26640, 31468, -32715, 30237, -24318, 15629, -5163, -5893, 16276, -24808, 30514, -32749, 31253, -26202, 18165, -8063, -2959, 13642, -22774, 29312, -32515, 32014, -27871, 20553, -10898}, +{0, 12282, -22774, 29944, -32749, 30776, -24318, 14312, -2221, -10196, 21125, -28974, 32597, -31469, 25749, -16277, 4429, 8062, -19380, 27870, -32298, 32014, -27064, 18165, -6620, -5893, 17544, -26640, 31848, -32415, 28252, -19972, 8778, 3695, -15630, 25285, -31254, 32664, -29313, 21685, -10898, -1481, 13642, -23816, 30514, -32765, 30237, -23301, 12965, -741, -11593, 22235, -29636, 32714, -31024, 24807, -14975, 2958, 9489, -20554, 28620, -32515, 31666, -26202, 16915, -5163, -7343, 18777, -27474, 32164, -32165, 27473, -18778, 7342, 5162, -16916, 26201, -31667, 32514, -28621, 20553, -9490, -2959, 14974, -24808, 31023, -32715, 29635, -22236, 11592, 740, -12966, 23300, -30238, 32764, -30515, 23815, -13643, 1480, 10897, -21686, 29312, -32665, 31253, -25286, 15629, -3696, -8779, 19971, -28253, 32414, -31849, 26639, -17545, 5892, 6619, -18166, 27063, -32015, 32297, -27871, 19379, -8063, -4430, 16276, -25750, 31468, -32598, 28973, -21126, 10195, 2220, -14313, 24317, -30777, 32748, -29945, 22773, -12283}, +{0, 13642, -24808, 31468, -32415, 27473, -17545, 4429, 9489, -21686, 29944, -32765, 29635, -21126, 8778, 5162, -18166, 27870, -32515, 31253, -24318, 12965, 740, -14313, 25285, -31667, 32297, -27064, 16915, -3696, -10196, 22235, -30238, 32748, -29313, 20553, -8063, -5893, 18777, -28253, 32597, -31024, 23815, -12283, -1481, 14974, -25750, 31848, -32165, 26639, -16277, 2958, 10897, -22774, 30514, -32715, 28973, -19972, 7342, 6619, -19380, 28620, -32665, 30776, -23301, 11592, 2220, -15630, 26201, -32015, 32014, -26202, 15629, -2221, -11593, 23300, -30777, 32664, -28621, 19379, -6620, -7343, 19971, -28974, 32714, -30515, 22773, -10898, -2959, 16276, -26640, 32164, -31849, 25749, -14975, 1480, 12282, -23816, 31023, -32598, 28252, -18778, 5892, 8062, -20554, 29312, -32749, 30237, -22236, 10195, 3695, -16916, 27063, -32298, 31666, -25286, 14312, -741, -12966, 24317, -31254, 32514, -27871, 18165, -5163, -8779, 21125, -29636, 32764, -29945, 21685, -9490, -4430, 17544, -27474, 32414, -31469, 24807, -13643}, +{0, 14974, -26640, 32414, -31024, 22773, -9490, -5893, 19971, -29636, 32748, -28621, 18165, -3696, -11593, 24317, -31667, 32014, -25286, 12965, 2220, -16916, 27870, -32665, 30237, -21126, 7342, 8062, -21686, 30514, -32598, 27473, -16277, 1480, 13642, -25750, 32164, -31469, 23815, -10898, -4430, 18777, -28974, 32764, -29313, 19379, -5163, -10196, 23300, -31254, 32297, -26202, 14312, 740, -15630, 27063, -32515, 30776, -22236, 8778, 6619, -20554, 29944, -32715, 28252, -17545, 2958, 12282, -24808, 31848, -31849, 24807, -12283, -2959, 17544, -28253, 32714, -29945, 20553, -6620, -8779, 22235, -30777, 32514, -27064, 15629, -741, -14313, 26201, -32298, 31253, -23301, 10195, 5162, -19380, 29312, -32765, 28973, -18778, 4429, 10897, -23816, 31468, -32165, 25749, -13643, -1481, 16276, -27474, 32597, -30515, 21685, -8063, -7343, 21125, -30238, 32664, -27871, 16915, -2221, -12966, 25285, -32015, 31666, -24318, 11592, 3695, -18166, 28620, -32749, 29635, -19972, 5892, 9489, -22774, 31023, -32415, 26639, -14975}, +{0, 16276, -28253, 32764, -28621, 16915, -741, -15630, 27870, -32749, 28973, -17545, 1480, 14974, -27474, 32714, -29313, 18165, -2221, -14313, 27063, -32665, 29635, -18778, 2958, 13642, -26640, 32597, -29945, 19379, -3696, -12966, 26201, -32515, 30237, -19972, 4429, 12282, -25750, 32414, -30515, 20553, -5163, -11593, 25285, -32298, 30776, -21126, 5892, 10897, -24808, 32164, -31024, 21685, -6620, -10196, 24317, -32015, 31253, -22236, 7342, 9489, -23816, 31848, -31469, 22773, -8063, -8779, 23300, -31667, 31666, -23301, 8778, 8062, -22774, 31468, -31849, 23815, -9490, -7343, 22235, -31254, 32014, -24318, 10195, 6619, -21686, 31023, -32165, 24807, -10898, -5893, 21125, -30777, 32297, -25286, 11592, 5162, -20554, 30514, -32415, 25749, -12283, -4430, 19971, -30238, 32514, -26202, 12965, 3695, -19380, 29944, -32598, 26639, -13643, -2959, 18777, -29636, 32664, -27064, 14312, 2220, -18166, 29312, -32715, 27473, -14975, -1481, 17544, -28974, 32748, -27871, 15629, 740, -16916, 28620, -32765, 28252, -16277}, +{0, 17544, -29636, 32514, -25286, 10195, 8062, -23816, 32164, -30515, 19379, -2221, -15630, 28620, -32715, 26639, -12283, -5893, 22235, -31667, 31253, -21126, 4429, 13642, -27474, 32764, -27871, 14312, 3695, -20554, 31023, -31849, 22773, -6620, -11593, 26201, -32665, 28973, -16277, -1481, 18777, -30238, 32297, -24318, 8778, 9489, -24808, 32414, -29945, 18165, -741, -16916, 29312, -32598, 25749, -10898, -7343, 23300, -32015, 30776, -19972, 2958, 14974, -28253, 32748, -27064, 12965, 5162, -21686, 31468, -31469, 21685, -5163, -12966, 27063, -32749, 28252, -14975, -2959, 19971, -30777, 32014, -23301, 7342, 10897, -25750, 32597, -29313, 16915, 740, -18166, 29944, -32415, 24807, -9490, -8779, 24317, -32298, 30237, -18778, 1480, 16276, -28974, 32664, -26202, 11592, 6619, -22774, 31848, -31024, 20553, -3696, -14313, 27870, -32765, 27473, -13643, -4430, 21125, -31254, 31666, -22236, 5892, 12282, -26640, 32714, -28621, 15629, 2220, -19380, 30514, -32165, 23815, -8063, -10196, 25285, -32515, 29635, -17545}, +{0, 18777, -30777, 31666, -21126, 2958, 16276, -29636, 32297, -23301, 5892, 13642, -28253, 32664, -25286, 8778, 10897, -26640, 32764, -27064, 11592, 8062, -24808, 32597, -28621, 14312, 5162, -22774, 32164, -29945, 16915, 2220, -20554, 31468, -31024, 19379, -741, -18166, 30514, -31849, 21685, -3696, -15630, 29312, -32415, 23815, -6620, -12966, 27870, -32715, 25749, -9490, -10196, 26201, -32749, 27473, -12283, -7343, 24317, -32515, 28973, -14975, -4430, 22235, -32015, 30237, -17545, -1481, 19971, -31254, 31253, -19972, 1480, 17544, -30238, 32014, -22236, 4429, 14974, -28974, 32514, -24318, 7342, 12282, -27474, 32748, -26202, 10195, 9489, -25750, 32714, -27871, 12965, 6619, -23816, 32414, -29313, 15629, 3695, -21686, 31848, -30515, 18165, 740, -19380, 31023, -31469, 20553, -2221, -16916, 29944, -32165, 22773, -5163, -14313, 28620, -32598, 24807, -8063, -11593, 27063, -32765, 26639, -10898, -8779, 25285, -32665, 28252, -13643, -5893, 23300, -32298, 29635, -16277, -2959, 21125, -31667, 30776, -18778}, +{0, 19971, -31667, 30237, -16277, -4430, 23300, -32515, 28252, -12283, -8779, 26201, -32765, 25749, -8063, -12966, 28620, -32415, 22773, -3696, -16916, 30514, -31469, 19379, 740, -20554, 31848, -29945, 15629, 5162, -23816, 32597, -27871, 11592, 9489, -26640, 32748, -25286, 7342, 13642, -28974, 32297, -22236, 2958, 17544, -30777, 31253, -18778, -1481, 21125, -32015, 29635, -14975, -5893, 24317, -32665, 27473, -10898, -10196, 27063, -32715, 24807, -6620, -14313, 29312, -32165, 21685, -2221, -18166, 31023, -31024, 18165, 2220, -21686, 32164, -29313, 14312, 6619, -24808, 32714, -27064, 10195, 10897, -27474, 32664, -24318, 5892, 14974, -29636, 32014, -21126, 1480, 18777, -31254, 30776, -17545, -2959, 22235, -32298, 28973, -13643, -7343, 25285, -32749, 26639, -9490, -11593, 27870, -32598, 23815, -5163, -15630, 29944, -31849, 20553, -741, -19380, 31468, -30515, 16915, 3695, -22774, 32414, -28621, 12965, 8062, -25750, 32764, -26202, 8778, 12282, -28253, 32514, -23301, 4429, 16276, -30238, 31666, -19972}, +{0, 21125, -32298, 28252, -10898, -11593, 28620, -32165, 20553, 740, -21686, 32414, -27871, 10195, 12282, -28974, 32014, -19972, -1481, 22235, -32515, 27473, -9490, -12966, 29312, -31849, 19379, 2220, -22774, 32597, -27064, 8778, 13642, -29636, 31666, -18778, -2959, 23300, -32665, 26639, -8063, -14313, 29944, -31469, 18165, 3695, -23816, 32714, -26202, 7342, 14974, -30238, 31253, -17545, -4430, 24317, -32749, 25749, -6620, -15630, 30514, -31024, 16915, 5162, -24808, 32764, -25286, 5892, 16276, -30777, 30776, -16277, -5893, 25285, -32765, 24807, -5163, -16916, 31023, -30515, 15629, 6619, -25750, 32748, -24318, 4429, 17544, -31254, 30237, -14975, -7343, 26201, -32715, 23815, -3696, -18166, 31468, -29945, 14312, 8062, -26640, 32664, -23301, 2958, 18777, -31667, 29635, -13643, -8779, 27063, -32598, 22773, -2221, -19380, 31848, -29313, 12965, 9489, -27474, 32514, -22236, 1480, 19971, -32015, 28973, -12283, -10196, 27870, -32415, 21685, -741, -20554, 32164, -28621, 11592, 10897, -28253, 32297, -21126}, +{0, 22235, -32665, 25749, -5163, -18166, 31848, -28621, 10195, 13642, -30238, 30776, -14975, -8779, 27870, -32165, 19379, 3695, -24808, 32748, -23301, 1480, 21125, -32515, 26639, -6620, -16916, 31468, -29313, 11592, 12282, -29636, 31253, -16277, -7343, 27063, -32415, 20553, 2220, -23816, 32764, -24318, 2958, 19971, -32298, 27473, -8063, -15630, 31023, -29945, 12965, 10897, -28974, 31666, -17545, -5893, 26201, -32598, 21685, 740, -22774, 32714, -25286, 4429, 18777, -32015, 28252, -9490, -14313, 30514, -30515, 14312, 9489, -28253, 32014, -18778, -4430, 25285, -32715, 22773, -741, -21686, 32597, -26202, 5892, 17544, -31667, 28973, -10898, -12966, 29944, -31024, 15629, 8062, -27474, 32297, -19972, -2959, 24317, -32765, 23815, -2221, -20554, 32414, -27064, 7342, 16276, -31254, 29635, -12283, -11593, 29312, -31469, 16915, 6619, -26640, 32514, -21126, -1481, 23300, -32749, 24807, -3696, -19380, 32164, -27871, 8778, 14974, -30777, 30237, -13643, -10196, 28620, -31849, 18165, 5162, -25750, 32664, -22236}, +{0, 23300, -32765, 22773, 740, -23816, 32748, -22236, -1481, 24317, -32715, 21685, 2220, -24808, 32664, -21126, -2959, 25285, -32598, 20553, 3695, -25750, 32514, -19972, -4430, 26201, -32415, 19379, 5162, -26640, 32297, -18778, -5893, 27063, -32165, 18165, 6619, -27474, 32014, -17545, -7343, 27870, -31849, 16915, 8062, -28253, 31666, -16277, -8779, 28620, -31469, 15629, 9489, -28974, 31253, -14975, -10196, 29312, -31024, 14312, 10897, -29636, 30776, -13643, -11593, 29944, -30515, 12965, 12282, -30238, 30237, -12283, -12966, 30514, -29945, 11592, 13642, -30777, 29635, -10898, -14313, 31023, -29313, 10195, 14974, -31254, 28973, -9490, -15630, 31468, -28621, 8778, 16276, -31667, 28252, -8063, -16916, 31848, -27871, 7342, 17544, -32015, 27473, -6620, -18166, 32164, -27064, 5892, 18777, -32298, 26639, -5163, -19380, 32414, -26202, 4429, 19971, -32515, 25749, -3696, -20554, 32597, -25286, 2958, 21125, -32665, 24807, -2221, -21686, 32714, -24318, 1480, 22235, -32749, 23815, -741, -22774, 32764, -23301}, +{0, 24317, -32598, 19379, 6619, -28253, 31253, -13643, -12966, 31023, -28621, 7342, 18777, -32515, 24807, -741, -23816, 32664, -19972, -5893, 27870, -31469, 14312, 12282, -30777, 28973, -8063, -18166, 32414, -25286, 1480, 23300, -32715, 20553, 5162, -27474, 31666, -14975, -11593, 30514, -29313, 8778, 17544, -32298, 25749, -2221, -22774, 32748, -21126, -4430, 27063, -31849, 15629, 10897, -30238, 29635, -9490, -16916, 32164, -26202, 2958, 22235, -32765, 21685, 3695, -26640, 32014, -16277, -10196, 29944, -29945, 10195, 16276, -32015, 26639, -3696, -21686, 32764, -22236, -2959, 26201, -32165, 16915, 9489, -29636, 30237, -10898, -15630, 31848, -27064, 4429, 21125, -32749, 22773, 2220, -25750, 32297, -17545, -8779, 29312, -30515, 11592, 14974, -31667, 27473, -5163, -20554, 32714, -23301, -1481, 25285, -32415, 18165, 8062, -28974, 30776, -12283, -14313, 31468, -27871, 5892, 19971, -32665, 23815, 740, -24808, 32514, -18778, -7343, 28620, -31024, 12965, 13642, -31254, 28252, -6620, -19380, 32597, -24318}, +{0, 25285, -32165, 15629, 12282, -31254, 27473, -3696, -22774, 32664, -18778, -8779, 29944, -29313, 7342, 19971, -32749, 21685, 5162, -28253, 30776, -10898, -16916, 32414, -24318, -1481, 26201, -31849, 14312, 13642, -31667, 26639, -2221, -23816, 32514, -17545, -10196, 30514, -28621, 5892, 21125, -32765, 20553, 6619, -28974, 30237, -9490, -18166, 32597, -23301, -2959, 27063, -31469, 12965, 14974, -32015, 25749, -741, -24808, 32297, -16277, -11593, 31023, -27871, 4429, 22235, -32715, 19379, 8062, -29636, 29635, -8063, -19380, 32714, -22236, -4430, 27870, -31024, 11592, 16276, -32298, 24807, 740, -25750, 32014, -14975, -12966, 31468, -27064, 2958, 23300, -32598, 18165, 9489, -30238, 28973, -6620, -20554, 32764, -21126, -5893, 28620, -30515, 10195, 17544, -32515, 23815, 2220, -26640, 31666, -13643, -14313, 31848, -26202, 1480, 24317, -32415, 16915, 10897, -30777, 28252, -5163, -21686, 32748, -19972, -7343, 29312, -29945, 8778, 18777, -32665, 22773, 3695, -27474, 31253, -12283, -15630, 32164, -25286}, +{0, 26201, -31469, 11592, 17544, -32665, 21685, 6619, -29636, 28973, -5163, -22774, 32514, -16277, -12966, 31848, -25286, -1481, 27063, -31024, 10195, 18777, -32749, 20553, 8062, -30238, 28252, -3696, -23816, 32297, -14975, -14313, 32164, -24318, -2959, 27870, -30515, 8778, 19971, -32765, 19379, 9489, -30777, 27473, -2221, -24808, 32014, -13643, -15630, 32414, -23301, -4430, 28620, -29945, 7342, 21125, -32715, 18165, 10897, -31254, 26639, -741, -25750, 31666, -12283, -16916, 32597, -22236, -5893, 29312, -29313, 5892, 22235, -32598, 16915, 12282, -31667, 25749, 740, -26640, 31253, -10898, -18166, 32714, -21126, -7343, 29944, -28621, 4429, 23300, -32415, 15629, 13642, -32015, 24807, 2220, -27474, 30776, -9490, -19380, 32764, -19972, -8779, 30514, -27871, 2958, 24317, -32165, 14312, 14974, -32298, 23815, 3695, -28253, 30237, -8063, -20554, 32748, -18778, -10196, 31023, -27064, 1480, 25285, -31849, 12965, 16276, -32515, 22773, 5162, -28974, 29635, -6620, -21686, 32664, -17545, -11593, 31468, -26202}, +{0, 27063, -30515, 7342, 22235, -32415, 14312, 16276, -32665, 20553, 9489, -31254, 25749, 2220, -28253, 29635, -5163, -23816, 32014, -12283, -18166, 32764, -18778, -11593, 31848, -24318, -4430, 29312, -28621, 2958, 25285, -31469, 10195, 19971, -32715, 16915, 13642, -32298, 22773, 6619, -30238, 27473, -741, -26640, 30776, -8063, -21686, 32514, -14975, -15630, 32597, -21126, -8779, 31023, -26202, -1481, 27870, -29945, 5892, 23300, -32165, 12965, 17544, -32749, 19379, 10897, -31667, 24807, 3695, -28974, 28973, -3696, -24808, 31666, -10898, -19380, 32748, -17545, -12966, 32164, -23301, -5893, 29944, -27871, 1480, 26201, -31024, 8778, 21125, -32598, 15629, 14974, -32515, 21685, 8062, -30777, 26639, 740, -27474, 30237, -6620, -22774, 32297, -13643, -16916, 32714, -19972, -10196, 31468, -25286, -2959, 28620, -29313, 4429, 24317, -31849, 11592, 18777, -32765, 18165, 12282, -32015, 23815, 5162, -29636, 28252, -2221, -25750, 31253, -9490, -20554, 32664, -16277, -14313, 32414, -22236, -7343, 30514, -27064}, +{0, 27870, -29313, 2958, 26201, -30515, 5892, 24317, -31469, 8778, 22235, -32165, 11592, 19971, -32598, 14312, 17544, -32765, 16915, 14974, -32665, 19379, 12282, -32298, 21685, 9489, -31667, 23815, 6619, -30777, 25749, 3695, -29636, 27473, 740, -28253, 28973, -2221, -26640, 30237, -5163, -24808, 31253, -8063, -22774, 32014, -10898, -20554, 32514, -13643, -18166, 32748, -16277, -15630, 32714, -18778, -12966, 32414, -21126, -10196, 31848, -23301, -7343, 31023, -25286, -4430, 29944, -27064, -1481, 28620, -28621, 1480, 27063, -29945, 4429, 25285, -31024, 7342, 23300, -31849, 10195, 21125, -32415, 12965, 18777, -32715, 15629, 16276, -32749, 18165, 13642, -32515, 20553, 10897, -32015, 22773, 8062, -31254, 24807, 5162, -30238, 26639, 2220, -28974, 28252, -741, -27474, 29635, -3696, -25750, 30776, -6620, -23816, 31666, -9490, -21686, 32297, -12283, -19380, 32664, -14975, -16916, 32764, -17545, -14313, 32597, -19972, -11593, 32164, -22236, -8779, 31468, -24318, -5893, 30514, -26202, -2959, 29312, -27871}, +{0, 28620, -27871, -1481, 29312, -27064, -2959, 29944, -26202, -4430, 30514, -25286, -5893, 31023, -24318, -7343, 31468, -23301, -8779, 31848, -22236, -10196, 32164, -21126, -11593, 32414, -19972, -12966, 32597, -18778, -14313, 32714, -17545, -15630, 32764, -16277, -16916, 32748, -14975, -18166, 32664, -13643, -19380, 32514, -12283, -20554, 32297, -10898, -21686, 32014, -9490, -22774, 31666, -8063, -23816, 31253, -6620, -24808, 30776, -5163, -25750, 30237, -3696, -26640, 29635, -2221, -27474, 28973, -741, -28253, 28252, 740, -28974, 27473, 2220, -29636, 26639, 3695, -30238, 25749, 5162, -30777, 24807, 6619, -31254, 23815, 8062, -31667, 22773, 9489, -32015, 21685, 10897, -32298, 20553, 12282, -32515, 19379, 13642, -32665, 18165, 14974, -32749, 16915, 16276, -32765, 15629, 17544, -32715, 14312, 18777, -32598, 12965, 19971, -32415, 11592, 21125, -32165, 10195, 22235, -31849, 8778, 23300, -31469, 7342, 24317, -31024, 5892, 25285, -30515, 4429, 26201, -29945, 2958, 27063, -29313, 1480, 27870, -28621}, +{0, 29312, -26202, -5893, 31468, -22236, -11593, 32597, -17545, -16916, 32664, -12283, -21686, 31666, -6620, -25750, 29635, -741, -28974, 26639, 5162, -31254, 22773, 10897, -32515, 18165, 16276, -32715, 12965, 21125, -31849, 7342, 25285, -29945, 1480, 28620, -27064, -4430, 31023, -23301, -10196, 32414, -18778, -15630, 32748, -13643, -20554, 32014, -8063, -24808, 30237, -2221, -28253, 27473, 3695, -30777, 23815, 9489, -32298, 19379, 14974, -32765, 14312, 19971, -32165, 8778, 24317, -30515, 2958, 27870, -27871, -2959, 30514, -24318, -8779, 32164, -19972, -14313, 32764, -14975, -19380, 32297, -9490, -23816, 30776, -3696, -27474, 28252, 2220, -30238, 24807, 8062, -32015, 20553, 13642, -32749, 15629, 18777, -32415, 10195, 23300, -31024, 4429, 27063, -28621, -1481, 29944, -25286, -7343, 31848, -21126, -12966, 32714, -16277, -18166, 32514, -10898, -22774, 31253, -5163, -26640, 28973, 740, -29636, 25749, 6619, -31667, 21685, 12282, -32665, 16915, 17544, -32598, 11592, 22235, -31469, 5892, 26201, -29313}, +{0, 29944, -24318, -10196, 32597, -16277, -19380, 32014, -6620, -26640, 28252, 3695, -31254, 21685, 13642, -32765, 12965, 22235, -31024, 2958, 28620, -26202, -7343, 32164, -18778, -16916, 32514, -9490, -24808, 29635, 740, -30238, 23815, 10897, -32665, 15629, 19971, -31849, 5892, 27063, -27871, -4430, 31468, -21126, -14313, 32748, -12283, -22774, 30776, -2221, -28974, 25749, 8062, -32298, 18165, 17544, -32415, 8778, 25285, -29313, -1481, 30514, -23301, -11593, 32714, -14975, -20554, 31666, -5163, -27474, 27473, 5162, -31667, 20553, 14974, -32715, 11592, 23300, -30515, 1480, 29312, -25286, -8779, 32414, -17545, -18166, 32297, -8063, -25750, 28973, 2220, -30777, 22773, 12282, -32749, 14312, 21125, -31469, 4429, 27870, -27064, -5893, 31848, -19972, -15630, 32664, -10898, -23816, 30237, -741, -29636, 24807, 9489, -32515, 16915, 18777, -32165, 7342, 26201, -28621, -2959, 31023, -22236, -12966, 32764, -13643, -21686, 31253, -3696, -28253, 26639, 6619, -32015, 19379, 16276, -32598, 10195, 24317, -29945}, +{0, 30514, -22236, -14313, 32664, -9490, -25750, 28252, 5162, -32015, 18165, 18777, -31849, 4429, 28620, -25286, -10196, 32714, -13643, -22774, 30237, 740, -30777, 21685, 14974, -32598, 8778, 26201, -27871, -5893, 32164, -17545, -19380, 31666, -3696, -28974, 24807, 10897, -32749, 12965, 23300, -29945, -1481, 31023, -21126, -15630, 32514, -8063, -26640, 27473, 6619, -32298, 16915, 19971, -31469, 2958, 29312, -24318, -11593, 32764, -12283, -23816, 29635, 2220, -31254, 20553, 16276, -32415, 7342, 27063, -27064, -7343, 32414, -16277, -20554, 31253, -2221, -29636, 23815, 12282, -32765, 11592, 24317, -29313, -2959, 31468, -19972, -16916, 32297, -6620, -27474, 26639, 8062, -32515, 15629, 21125, -31024, 1480, 29944, -23301, -12966, 32748, -10898, -24808, 28973, 3695, -31667, 19379, 17544, -32165, 5892, 27870, -26202, -8779, 32597, -14975, -21686, 30776, -741, -30238, 22773, 13642, -32715, 10195, 25285, -28621, -4430, 31848, -18778, -18166, 32014, -5163, -28253, 25749, 9489, -32665, 14312, 22235, -30515}, +{0, 31023, -19972, -18166, 31666, -2221, -30238, 21685, 16276, -32165, 4429, 29312, -23301, -14313, 32514, -6620, -28253, 24807, 12282, -32715, 8778, 27063, -26202, -10196, 32764, -10898, -25750, 27473, 8062, -32665, 12965, 24317, -28621, -5893, 32414, -14975, -22774, 29635, 3695, -32015, 16915, 21125, -30515, -1481, 31468, -18778, -19380, 31253, -741, -30777, 20553, 17544, -31849, 2958, 29944, -22236, -15630, 32297, -5163, -28974, 23815, 13642, -32598, 7342, 27870, -25286, -11593, 32748, -9490, -26640, 26639, 9489, -32749, 11592, 25285, -27871, -7343, 32597, -13643, -23816, 28973, 5162, -32298, 15629, 22235, -29945, -2959, 31848, -17545, -20554, 30776, 740, -31254, 19379, 18777, -31469, 1480, 30514, -21126, -16916, 32014, -3696, -29636, 22773, 14974, -32415, 5892, 28620, -24318, -12966, 32664, -8063, -27474, 25749, 10897, -32765, 10195, 26201, -27064, -8779, 32714, -12283, -24808, 28252, 6619, -32515, 14312, 23300, -29313, -4430, 32164, -16277, -21686, 30237, 2220, -31667, 18165, 19971, -31024}, +{0, 31468, -17545, -21686, 29635, 5162, -32515, 12965, 25285, -27064, -10196, 32748, -8063, -28253, 23815, 14974, -32165, 2958, 30514, -19972, -19380, 30776, 2220, -32015, 15629, 23300, -28621, -7343, 32714, -10898, -26640, 25749, 12282, -32598, 5892, 29312, -22236, -16916, 31666, -741, -31254, 18165, 21125, -29945, -4430, 32414, -13643, -24808, 27473, 9489, -32765, 8778, 27870, -24318, -14313, 32297, -3696, -30238, 20553, 18777, -31024, -1481, 31848, -16277, -22774, 28973, 6619, -32665, 11592, 26201, -26202, -11593, 32664, -6620, -28974, 22773, 16276, -31849, 1480, 31023, -18778, -20554, 30237, 3695, -32298, 14312, 24317, -27871, -8779, 32764, -9490, -27474, 24807, 13642, -32415, 4429, 29944, -21126, -18166, 31253, 740, -31667, 16915, 22235, -29313, -5893, 32597, -12283, -25750, 26639, 10897, -32715, 7342, 28620, -23301, -15630, 32014, -2221, -30777, 19379, 19971, -30515, -2959, 32164, -14975, -23816, 28252, 8062, -32749, 10195, 27063, -25286, -12966, 32514, -5163, -29636, 21685, 17544, -31469}, +{0, 31848, -14975, -24808, 26639, 12282, -32415, 2958, 31023, -17545, -22774, 28252, 9489, -32715, 5892, 29944, -19972, -20554, 29635, 6619, -32749, 8778, 28620, -22236, -18166, 30776, 3695, -32515, 11592, 27063, -24318, -15630, 31666, 740, -32015, 14312, 25285, -26202, -12966, 32297, -2221, -31254, 16915, 23300, -27871, -10196, 32664, -5163, -30238, 19379, 21125, -29313, -7343, 32764, -8063, -28974, 21685, 18777, -30515, -4430, 32597, -10898, -27474, 23815, 16276, -31469, -1481, 32164, -13643, -25750, 25749, 13642, -32165, 1480, 31468, -16277, -23816, 27473, 10897, -32598, 4429, 30514, -18778, -21686, 28973, 8062, -32765, 7342, 29312, -21126, -19380, 30237, 5162, -32665, 10195, 27870, -23301, -16916, 31253, 2220, -32298, 12965, 26201, -25286, -14313, 32014, -741, -31667, 15629, 24317, -27064, -11593, 32514, -3696, -30777, 18165, 22235, -28621, -8779, 32748, -6620, -29636, 20553, 19971, -29945, -5893, 32714, -9490, -28253, 22773, 17544, -31024, -2959, 32414, -12283, -26640, 24807, 14974, -31849}, +{0, 32164, -12283, -27474, 22773, 18777, -29945, -7343, 32748, -5163, -30777, 16915, 24317, -26202, -14313, 31666, 2220, -32515, 10195, 28620, -21126, -20554, 28973, 9489, -32598, 2958, 31468, -14975, -25750, 24807, 16276, -31024, -4430, 32714, -8063, -29636, 19379, 22235, -27871, -11593, 32297, -741, -32015, 12965, 27063, -23301, -18166, 30237, 6619, -32765, 5892, 30514, -17545, -23816, 26639, 13642, -31849, -1481, 32414, -10898, -28253, 21685, 19971, -29313, -8779, 32664, -3696, -31254, 15629, 25285, -25286, -15630, 31253, 3695, -32665, 8778, 29312, -19972, -21686, 28252, 10897, -32415, 1480, 31848, -13643, -26640, 23815, 17544, -30515, -5893, 32764, -6620, -30238, 18165, 23300, -27064, -12966, 32014, 740, -32298, 11592, 27870, -22236, -19380, 29635, 8062, -32715, 4429, 31023, -16277, -24808, 25749, 14974, -31469, -2959, 32597, -9490, -28974, 20553, 21125, -28621, -10196, 32514, -2221, -31667, 14312, 26201, -24318, -16916, 30776, 5162, -32749, 7342, 29944, -18778, -22774, 27473, 12282, -32165}, +{0, 32414, -9490, -29636, 18165, 24317, -25286, -16916, 30237, 8062, -32598, 1480, 32164, -10898, -28974, 19379, 23300, -26202, -15630, 30776, 6619, -32715, 2958, 31848, -12283, -28253, 20553, 22235, -27064, -14313, 31253, 5162, -32765, 4429, 31468, -13643, -27474, 21685, 21125, -27871, -12966, 31666, 3695, -32749, 5892, 31023, -14975, -26640, 22773, 19971, -28621, -11593, 32014, 2220, -32665, 7342, 30514, -16277, -25750, 23815, 18777, -29313, -10196, 32297, 740, -32515, 8778, 29944, -17545, -24808, 24807, 17544, -29945, -8779, 32514, -741, -32298, 10195, 29312, -18778, -23816, 25749, 16276, -30515, -7343, 32664, -2221, -32015, 11592, 28620, -19972, -22774, 26639, 14974, -31024, -5893, 32748, -3696, -31667, 12965, 27870, -21126, -21686, 27473, 13642, -31469, -4430, 32764, -5163, -31254, 14312, 27063, -22236, -20554, 28252, 12282, -31849, -2959, 32714, -6620, -30777, 15629, 26201, -23301, -19380, 28973, 10897, -32165, -1481, 32597, -8063, -30238, 16915, 25285, -24318, -18166, 29635, 9489, -32415}, +{0, 32597, -6620, -31254, 12965, 28620, -18778, -24808, 23815, 19971, -27871, -14313, 30776, 8062, -32415, -1481, 32714, -5163, -31667, 11592, 29312, -17545, -25750, 22773, 21125, -27064, -15630, 30237, 9489, -32165, -2959, 32764, -3696, -32015, 10195, 29944, -16277, -26640, 21685, 22235, -26202, -16916, 29635, 10897, -31849, -4430, 32748, -2221, -32298, 8778, 30514, -14975, -27474, 20553, 23300, -25286, -18166, 28973, 12282, -31469, -5893, 32664, -741, -32515, 7342, 31023, -13643, -28253, 19379, 24317, -24318, -19380, 28252, 13642, -31024, -7343, 32514, 740, -32665, 5892, 31468, -12283, -28974, 18165, 25285, -23301, -20554, 27473, 14974, -30515, -8779, 32297, 2220, -32749, 4429, 31848, -10898, -29636, 16915, 26201, -22236, -21686, 26639, 16276, -29945, -10196, 32014, 3695, -32765, 2958, 32164, -9490, -30238, 15629, 27063, -21126, -22774, 25749, 17544, -29313, -11593, 31666, 5162, -32715, 1480, 32414, -8063, -30777, 14312, 27870, -19972, -23816, 24807, 18777, -28621, -12966, 31253, 6619, -32598}, +{0, 32714, -3696, -32298, 7342, 31468, -10898, -30238, 14312, 28620, -17545, -26640, 20553, 24317, -23301, -21686, 25749, 18777, -27871, -15630, 29635, 12282, -31024, -8779, 32014, 5162, -32598, -1481, 32764, -2221, -32515, 5892, 31848, -9490, -30777, 12965, 29312, -16277, -27474, 19379, 25285, -22236, -22774, 24807, 19971, -27064, -16916, 28973, 13642, -30515, -10196, 31666, 6619, -32415, -2959, 32748, -741, -32665, 4429, 32164, -8063, -31254, 11592, 29944, -14975, -28253, 18165, 26201, -21126, -23816, 23815, 21125, -26202, -18166, 28252, 14974, -29945, -11593, 31253, 8062, -32165, -4430, 32664, 740, -32749, 2958, 32414, -6620, -31667, 10195, 30514, -13643, -28974, 16915, 27063, -19972, -24808, 22773, 22235, -25286, -19380, 27473, 16276, -29313, -12966, 30776, 9489, -31849, -5893, 32514, 2220, -32765, 1480, 32597, -5163, -32015, 8778, 31023, -12283, -29636, 15629, 27870, -18778, -25750, 21685, 23300, -24318, -20554, 26639, 17544, -28621, -14313, 30237, 10897, -31469, -7343, 32297, 3695, -32715}, +{0, 32764, -741, -32749, 1480, 32714, -2221, -32665, 2958, 32597, -3696, -32515, 4429, 32414, -5163, -32298, 5892, 32164, -6620, -32015, 7342, 31848, -8063, -31667, 8778, 31468, -9490, -31254, 10195, 31023, -10898, -30777, 11592, 30514, -12283, -30238, 12965, 29944, -13643, -29636, 14312, 29312, -14975, -28974, 15629, 28620, -16277, -28253, 16915, 27870, -17545, -27474, 18165, 27063, -18778, -26640, 19379, 26201, -19972, -25750, 20553, 25285, -21126, -24808, 21685, 24317, -22236, -23816, 22773, 23300, -23301, -22774, 23815, 22235, -24318, -21686, 24807, 21125, -25286, -20554, 25749, 19971, -26202, -19380, 26639, 18777, -27064, -18166, 27473, 17544, -27871, -16916, 28252, 16276, -28621, -15630, 28973, 14974, -29313, -14313, 29635, 13642, -29945, -12966, 30237, 12282, -30515, -11593, 30776, 10897, -31024, -10196, 31253, 9489, -31469, -8779, 31666, 8062, -31849, -7343, 32014, 6619, -32165, -5893, 32297, 5162, -32415, -4430, 32514, 3695, -32598, -2959, 32664, 2220, -32715, -1481, 32748, 740, -32765}, +{0, 32748, 2220, -32598, -4430, 32297, 6619, -31849, -8779, 31253, 10897, -30515, -12966, 29635, 14974, -28621, -16916, 27473, 18777, -26202, -20554, 24807, 22235, -23301, -23816, 21685, 25285, -19972, -26640, 18165, 27870, -16277, -28974, 14312, 29944, -12283, -30777, 10195, 31468, -8063, -32015, 5892, 32414, -3696, -32665, 1480, 32764, 740, -32715, -2959, 32514, 5162, -32165, -7343, 31666, 9489, -31024, -11593, 30237, 13642, -29313, -15630, 28252, 17544, -27064, -19380, 25749, 21125, -24318, -22774, 22773, 24317, -21126, -25750, 19379, 27063, -17545, -28253, 15629, 29312, -13643, -30238, 11592, 31023, -9490, -31667, 7342, 32164, -5163, -32515, 2958, 32714, -741, -32765, -1481, 32664, 3695, -32415, -5893, 32014, 8062, -31469, -10196, 30776, 12282, -29945, -14313, 28973, 16276, -27871, -18166, 26639, 19971, -25286, -21686, 23815, 23300, -22236, -24808, 20553, 26201, -18778, -27474, 16915, 28620, -14975, -29636, 12965, 30514, -10898, -31254, 8778, 31848, -6620, -32298, 4429, 32597, -2221, -32749}, +{0, 32664, 5162, -31849, -10196, 30237, 14974, -27871, -19380, 24807, 23300, -21126, -26640, 16915, 29312, -12283, -31254, 7342, 32414, -2221, -32765, -2959, 32297, 8062, -31024, -12966, 28973, 17544, -26202, -21686, 22773, 25285, -18778, -28253, 14312, 30514, -9490, -32015, 4429, 32714, 740, -32598, -5893, 31666, 10897, -29945, -15630, 27473, 19971, -24318, -23816, 20553, 27063, -16277, -29636, 11592, 31468, -6620, -32515, 1480, 32748, 3695, -32165, -8779, 30776, 13642, -28621, -18166, 25749, 22235, -22236, -25750, 18165, 28620, -13643, -30777, 8778, 32164, -3696, -32749, -1481, 32514, 6619, -31469, -11593, 29635, 16276, -27064, -20554, 23815, 24317, -19972, -27474, 15629, 29944, -10898, -31667, 5892, 32597, -741, -32715, -4430, 32014, 9489, -30515, -14313, 28252, 18777, -25286, -22774, 21685, 26201, -17545, -28974, 12965, 31023, -8063, -32298, 2958, 32764, 2220, -32415, -7343, 31253, 12282, -29313, -16916, 26639, 21125, -23301, -24808, 19379, 27870, -14975, -30238, 10195, 31848, -5163, -32665}, +{0, 32514, 8062, -30515, -15630, 26639, 22235, -21126, -27474, 14312, 31023, -6620, -32665, -1481, 32297, 9489, -29945, -16916, 25749, 23300, -19972, -28253, 12965, 31468, -5163, -32749, -2959, 32014, 10897, -29313, -18166, 24807, 24317, -18778, -28974, 11592, 31848, -3696, -32765, -4430, 31666, 12282, -28621, -19380, 23815, 25285, -17545, -29636, 10195, 32164, -2221, -32715, -5893, 31253, 13642, -27871, -20554, 22773, 26201, -16277, -30238, 8778, 32414, -741, -32598, -7343, 30776, 14974, -27064, -21686, 21685, 27063, -14975, -30777, 7342, 32597, 740, -32415, -8779, 30237, 16276, -26202, -22774, 20553, 27870, -13643, -31254, 5892, 32714, 2220, -32165, -10196, 29635, 17544, -25286, -23816, 19379, 28620, -12283, -31667, 4429, 32764, 3695, -31849, -11593, 28973, 18777, -24318, -24808, 18165, 29312, -10898, -32015, 2958, 32748, 5162, -31469, -12966, 28252, 19971, -23301, -25750, 16915, 29944, -9490, -32298, 1480, 32664, 6619, -31024, -14313, 27473, 21125, -22236, -26640, 15629, 30514, -8063, -32515}, +{0, 32297, 10897, -28621, -20554, 21685, 27870, -12283, -32015, 1480, 32514, 9489, -29313, -19380, 22773, 27063, -13643, -31667, 2958, 32664, 8062, -29945, -18166, 23815, 26201, -14975, -31254, 4429, 32748, 6619, -30515, -16916, 24807, 25285, -16277, -30777, 5892, 32764, 5162, -31024, -15630, 25749, 24317, -17545, -30238, 7342, 32714, 3695, -31469, -14313, 26639, 23300, -18778, -29636, 8778, 32597, 2220, -31849, -12966, 27473, 22235, -19972, -28974, 10195, 32414, 740, -32165, -11593, 28252, 21125, -21126, -28253, 11592, 32164, -741, -32415, -10196, 28973, 19971, -22236, -27474, 12965, 31848, -2221, -32598, -8779, 29635, 18777, -23301, -26640, 14312, 31468, -3696, -32715, -7343, 30237, 17544, -24318, -25750, 15629, 31023, -5163, -32765, -5893, 30776, 16276, -25286, -24808, 16915, 30514, -6620, -32749, -4430, 31253, 14974, -26202, -23816, 18165, 29944, -8063, -32665, -2959, 31666, 13642, -27064, -22774, 19379, 29312, -9490, -32515, -1481, 32014, 12282, -27871, -21686, 20553, 28620, -10898, -32298}, +{0, 32014, 13642, -26202, -24808, 15629, 31468, -2221, -32415, -11593, 27473, 23300, -17545, -30777, 4429, 32664, 9489, -28621, -21686, 19379, 29944, -6620, -32765, -7343, 29635, 19971, -21126, -28974, 8778, 32714, 5162, -30515, -18166, 22773, 27870, -10898, -32515, -2959, 31253, 16276, -24318, -26640, 12965, 32164, 740, -31849, -14313, 25749, 25285, -14975, -31667, 1480, 32297, 12282, -27064, -23816, 16915, 31023, -3696, -32598, -10196, 28252, 22235, -18778, -30238, 5892, 32748, 8062, -29313, -20554, 20553, 29312, -8063, -32749, -5893, 30237, 18777, -22236, -28253, 10195, 32597, 3695, -31024, -16916, 23815, 27063, -12283, -32298, -1481, 31666, 14974, -25286, -25750, 14312, 31848, -741, -32165, -12966, 26639, 24317, -16277, -31254, 2958, 32514, 10897, -27871, -22774, 18165, 30514, -5163, -32715, -8779, 28973, 21125, -19972, -29636, 7342, 32764, 6619, -29945, -19380, 21685, 28620, -9490, -32665, -4430, 30776, 17544, -23301, -27474, 11592, 32414, 2220, -31469, -15630, 24807, 26201, -13643, -32015}, +{0, 31666, 16276, -23301, -28253, 8778, 32764, 8062, -28621, -22774, 16915, 31468, -741, -31849, -15630, 23815, 27870, -9490, -32749, -7343, 28973, 22235, -17545, -31254, 1480, 32014, 14974, -24318, -27474, 10195, 32714, 6619, -29313, -21686, 18165, 31023, -2221, -32165, -14313, 24807, 27063, -10898, -32665, -5893, 29635, 21125, -18778, -30777, 2958, 32297, 13642, -25286, -26640, 11592, 32597, 5162, -29945, -20554, 19379, 30514, -3696, -32415, -12966, 25749, 26201, -12283, -32515, -4430, 30237, 19971, -19972, -30238, 4429, 32514, 12282, -26202, -25750, 12965, 32414, 3695, -30515, -19380, 20553, 29944, -5163, -32598, -11593, 26639, 25285, -13643, -32298, -2959, 30776, 18777, -21126, -29636, 5892, 32664, 10897, -27064, -24808, 14312, 32164, 2220, -31024, -18166, 21685, 29312, -6620, -32715, -10196, 27473, 24317, -14975, -32015, -1481, 31253, 17544, -22236, -28974, 7342, 32748, 9489, -27871, -23816, 15629, 31848, 740, -31469, -16916, 22773, 28620, -8063, -32765, -8779, 28252, 23300, -16277, -31667}, +{0, 31253, 18777, -19972, -30777, 1480, 31666, 17544, -21126, -30238, 2958, 32014, 16276, -22236, -29636, 4429, 32297, 14974, -23301, -28974, 5892, 32514, 13642, -24318, -28253, 7342, 32664, 12282, -25286, -27474, 8778, 32748, 10897, -26202, -26640, 10195, 32764, 9489, -27064, -25750, 11592, 32714, 8062, -27871, -24808, 12965, 32597, 6619, -28621, -23816, 14312, 32414, 5162, -29313, -22774, 15629, 32164, 3695, -29945, -21686, 16915, 31848, 2220, -30515, -20554, 18165, 31468, 740, -31024, -19380, 19379, 31023, -741, -31469, -18166, 20553, 30514, -2221, -31849, -16916, 21685, 29944, -3696, -32165, -15630, 22773, 29312, -5163, -32415, -14313, 23815, 28620, -6620, -32598, -12966, 24807, 27870, -8063, -32715, -11593, 25749, 27063, -9490, -32765, -10196, 26639, 26201, -10898, -32749, -8779, 27473, 25285, -12283, -32665, -7343, 28252, 24317, -13643, -32515, -5893, 28973, 23300, -14975, -32298, -4430, 29635, 22235, -16277, -32015, -2959, 30237, 21125, -17545, -31667, -1481, 30776, 19971, -18778, -31254}, +{0, 30776, 21125, -16277, -32298, -5893, 28252, 25285, -10898, -32765, -11593, 24807, 28620, -5163, -32165, -16916, 20553, 31023, 740, -30515, -21686, 15629, 32414, 6619, -27871, -25750, 10195, 32748, 12282, -24318, -28974, 4429, 32014, 17544, -19972, -31254, -1481, 30237, 22235, -14975, -32515, -7343, 27473, 26201, -9490, -32715, -12966, 23815, 29312, -3696, -31849, -18166, 19379, 31468, 2220, -29945, -22774, 14312, 32597, 8062, -27064, -26640, 8778, 32664, 13642, -23301, -29636, 2958, 31666, 18777, -18778, -31667, -2959, 29635, 23300, -13643, -32665, -8779, 26639, 27063, -8063, -32598, -14313, 22773, 29944, -2221, -31469, -19380, 18165, 31848, 3695, -29313, -23816, 12965, 32714, 9489, -26202, -27474, 7342, 32514, 14974, -22236, -30238, 1480, 31253, 19971, -17545, -32015, -4430, 28973, 24317, -12283, -32749, -10196, 25749, 27870, -6620, -32415, -15630, 21685, 30514, -741, -31024, -20554, 16915, 32164, 5162, -28621, -24808, 11592, 32764, 10897, -25286, -28253, 5892, 32297, 16276, -21126, -30777}, +{0, 30237, 23300, -12283, -32765, -12966, 22773, 30514, 740, -29945, -23816, 11592, 32748, 13642, -22236, -30777, -1481, 29635, 24317, -10898, -32715, -14313, 21685, 31023, 2220, -29313, -24808, 10195, 32664, 14974, -21126, -31254, -2959, 28973, 25285, -9490, -32598, -15630, 20553, 31468, 3695, -28621, -25750, 8778, 32514, 16276, -19972, -31667, -4430, 28252, 26201, -8063, -32415, -16916, 19379, 31848, 5162, -27871, -26640, 7342, 32297, 17544, -18778, -32015, -5893, 27473, 27063, -6620, -32165, -18166, 18165, 32164, 6619, -27064, -27474, 5892, 32014, 18777, -17545, -32298, -7343, 26639, 27870, -5163, -31849, -19380, 16915, 32414, 8062, -26202, -28253, 4429, 31666, 19971, -16277, -32515, -8779, 25749, 28620, -3696, -31469, -20554, 15629, 32597, 9489, -25286, -28974, 2958, 31253, 21125, -14975, -32665, -10196, 24807, 29312, -2221, -31024, -21686, 14312, 32714, 10897, -24318, -29636, 1480, 30776, 22235, -13643, -32749, -11593, 23815, 29944, -741, -30515, -22774, 12965, 32764, 12282, -23301, -30238}, +{0, 29635, 25285, -8063, -32165, -19380, 15629, 32714, 12282, -22236, -31254, -4430, 27473, 27870, -3696, -31024, -22774, 11592, 32664, 16276, -18778, -32298, -8779, 24807, 29944, 740, -29313, -25750, 7342, 32014, 19971, -14975, -32749, -12966, 21685, 31468, 5162, -27064, -28253, 2958, 30776, 23300, -10898, -32598, -16916, 18165, 32414, 9489, -24318, -30238, -1481, 28973, 26201, -6620, -31849, -20554, 14312, 32764, 13642, -21126, -31667, -5893, 26639, 28620, -2221, -30515, -23816, 10195, 32514, 17544, -17545, -32515, -10196, 23815, 30514, 2220, -28621, -26640, 5892, 31666, 21125, -13643, -32765, -14313, 20553, 31848, 6619, -26202, -28974, 1480, 30237, 24317, -9490, -32415, -18166, 16915, 32597, 10897, -23301, -30777, -2959, 28252, 27063, -5163, -31469, -21686, 12965, 32748, 14974, -19972, -32015, -7343, 25749, 29312, -741, -29945, -24808, 8778, 32297, 18777, -16277, -32665, -11593, 22773, 31023, 3695, -27871, -27474, 4429, 31253, 22235, -12283, -32715, -15630, 19379, 32164, 8062, -25286, -29636}, +{0, 28973, 27063, -3696, -30515, -24808, 7342, 31666, 22235, -10898, -32415, -19380, 14312, 32748, 16276, -17545, -32665, -12966, 20553, 32164, 9489, -23301, -31254, -5893, 25749, 29944, 2220, -27871, -28253, 1480, 29635, 26201, -5163, -31024, -23816, 8778, 32014, 21125, -12283, -32598, -18166, 15629, 32764, 14974, -18778, -32515, -11593, 21685, 31848, 8062, -24318, -30777, -4430, 26639, 29312, 740, -28621, -27474, 2958, 30237, 25285, -6620, -31469, -22774, 10195, 32297, 19971, -13643, -32715, -16916, 16915, 32714, 13642, -19972, -32298, -10196, 22773, 31468, 6619, -25286, -30238, -2959, 27473, 28620, -741, -29313, -26640, 4429, 30776, 24317, -8063, -31849, -21686, 11592, 32514, 18777, -14975, -32765, -15630, 18165, 32597, 12282, -21126, -32015, -8779, 23815, 31023, 5162, -26202, -29636, -1481, 28252, 27870, -2221, -29945, -25750, 5892, 31253, 23300, -9490, -32165, -20554, 12965, 32664, 17544, -16277, -32749, -14313, 19379, 32414, 10897, -22236, -31667, -7343, 24807, 30514, 3695, -27064, -28974}, +{0, 28252, 28620, 740, -27871, -28974, -1481, 27473, 29312, 2220, -27064, -29636, -2959, 26639, 29944, 3695, -26202, -30238, -4430, 25749, 30514, 5162, -25286, -30777, -5893, 24807, 31023, 6619, -24318, -31254, -7343, 23815, 31468, 8062, -23301, -31667, -8779, 22773, 31848, 9489, -22236, -32015, -10196, 21685, 32164, 10897, -21126, -32298, -11593, 20553, 32414, 12282, -19972, -32515, -12966, 19379, 32597, 13642, -18778, -32665, -14313, 18165, 32714, 14974, -17545, -32749, -15630, 16915, 32764, 16276, -16277, -32765, -16916, 15629, 32748, 17544, -14975, -32715, -18166, 14312, 32664, 18777, -13643, -32598, -19380, 12965, 32514, 19971, -12283, -32415, -20554, 11592, 32297, 21125, -10898, -32165, -21686, 10195, 32014, 22235, -9490, -31849, -22774, 8778, 31666, 23300, -8063, -31469, -23816, 7342, 31253, 24317, -6620, -31024, -24808, 5892, 30776, 25285, -5163, -30515, -25750, 4429, 30237, 26201, -3696, -29945, -26640, 2958, 29635, 27063, -2221, -29313, -27474, 1480, 28973, 27870, -741, -28621, -28253}, +{0, 27473, 29944, 5162, -24318, -31667, -10196, 20553, 32597, 14974, -16277, -32715, -19380, 11592, 32014, 23300, -6620, -30515, -26640, 1480, 28252, 29312, 3695, -25286, -31254, -8779, 21685, 32414, 13642, -17545, -32765, -18166, 12965, 32297, 22235, -8063, -31024, -25750, 2958, 28973, 28620, 2220, -26202, -30777, -7343, 22773, 32164, 12282, -18778, -32749, -16916, 14312, 32514, 21125, -9490, -31469, -24808, 4429, 29635, 27870, 740, -27064, -30238, -5893, 23815, 31848, 10897, -19972, -32665, -15630, 15629, 32664, 19971, -10898, -31849, -23816, 5892, 30237, 27063, -741, -27871, -29636, -4430, 24807, 31468, 9489, -21126, -32515, -14313, 16915, 32748, 18777, -12283, -32165, -22774, 7342, 30776, 26201, -2221, -28621, -28974, -2959, 25749, 31023, 8062, -22236, -32298, -12966, 18165, 32764, 17544, -13643, -32415, -21686, 8778, 31253, 25285, -3696, -29313, -28253, -1481, 26639, 30514, 6619, -23301, -32015, -11593, 19379, 32714, 16276, -14975, -32598, -20554, 10195, 31666, 24317, -5163, -29945, -27474}, +{0, 26639, 31023, 9489, -19972, -32749, -18166, 11592, 31666, 25285, -2221, -27871, -30238, -7343, 21685, 32597, 16276, -13643, -32165, -23816, 4429, 28973, 29312, 5162, -23301, -32298, -14313, 15629, 32514, 22235, -6620, -29945, -28253, -2959, 24807, 31848, 12282, -17545, -32715, -20554, 8778, 30776, 27063, 740, -26202, -31254, -10196, 19379, 32764, 18777, -10898, -31469, -25750, 1480, 27473, 30514, 8062, -21126, -32665, -16916, 12965, 32014, 24317, -3696, -28621, -29636, -5893, 22773, 32414, 14974, -14975, -32415, -22774, 5892, 29635, 28620, 3695, -24318, -32015, -12966, 16915, 32664, 21125, -8063, -30515, -27474, -1481, 25749, 31468, 10897, -18778, -32765, -19380, 10195, 31253, 26201, -741, -27064, -30777, -8779, 20553, 32714, 17544, -12283, -31849, -24808, 2958, 28252, 29944, 6619, -22236, -32515, -15630, 14312, 32297, 23300, -5163, -29313, -28974, -4430, 23815, 32164, 13642, -16277, -32598, -21686, 7342, 30237, 27870, 2220, -25286, -31667, -11593, 18165, 32748, 19971, -9490, -31024, -26640}, +{0, 25749, 31848, 13642, -14975, -32165, -24808, 1480, 26639, 31468, 12282, -16277, -32415, -23816, 2958, 27473, 31023, 10897, -17545, -32598, -22774, 4429, 28252, 30514, 9489, -18778, -32715, -21686, 5892, 28973, 29944, 8062, -19972, -32765, -20554, 7342, 29635, 29312, 6619, -21126, -32749, -19380, 8778, 30237, 28620, 5162, -22236, -32665, -18166, 10195, 30776, 27870, 3695, -23301, -32515, -16916, 11592, 31253, 27063, 2220, -24318, -32298, -15630, 12965, 31666, 26201, 740, -25286, -32015, -14313, 14312, 32014, 25285, -741, -26202, -31667, -12966, 15629, 32297, 24317, -2221, -27064, -31254, -11593, 16915, 32514, 23300, -3696, -27871, -30777, -10196, 18165, 32664, 22235, -5163, -28621, -30238, -8779, 19379, 32748, 21125, -6620, -29313, -29636, -7343, 20553, 32764, 19971, -8063, -29945, -28974, -5893, 21685, 32714, 18777, -9490, -30515, -28253, -4430, 22773, 32597, 17544, -10898, -31024, -27474, -2959, 23815, 32414, 16276, -12283, -31469, -26640, -1481, 24807, 32164, 14974, -13643, -31849, -25750}, +{0, 24807, 32414, 17544, -9490, -29945, -29636, -8779, 18165, 32514, 24317, -741, -25286, -32298, -16916, 10195, 30237, 29312, 8062, -18778, -32598, -23816, 1480, 25749, 32164, 16276, -10898, -30515, -28974, -7343, 19379, 32664, 23300, -2221, -26202, -32015, -15630, 11592, 30776, 28620, 6619, -19972, -32715, -22774, 2958, 26639, 31848, 14974, -12283, -31024, -28253, -5893, 20553, 32748, 22235, -3696, -27064, -31667, -14313, 12965, 31253, 27870, 5162, -21126, -32765, -21686, 4429, 27473, 31468, 13642, -13643, -31469, -27474, -4430, 21685, 32764, 21125, -5163, -27871, -31254, -12966, 14312, 31666, 27063, 3695, -22236, -32749, -20554, 5892, 28252, 31023, 12282, -14975, -31849, -26640, -2959, 22773, 32714, 19971, -6620, -28621, -30777, -11593, 15629, 32014, 26201, 2220, -23301, -32665, -19380, 7342, 28973, 30514, 10897, -16277, -32165, -25750, -1481, 23815, 32597, 18777, -8063, -29313, -30238, -10196, 16915, 32297, 25285, 740, -24318, -32515, -18166, 8778, 29635, 29944, 9489, -17545, -32415, -24808}, +{0, 23815, 32714, 21125, -3696, -26202, -32298, -18166, 7342, 28252, 31468, 14974, -10898, -29945, -30238, -11593, 14312, 31253, 28620, 8062, -17545, -32165, -26640, -4430, 20553, 32664, 24317, 740, -23301, -32749, -21686, 2958, 25749, 32414, 18777, -6620, -27871, -31667, -15630, 10195, 29635, 30514, 12282, -13643, -31024, -28974, -8779, 16915, 32014, 27063, 5162, -19972, -32598, -24808, -1481, 22773, 32764, 22235, -2221, -25286, -32515, -19380, 5892, 27473, 31848, 16276, -9490, -29313, -30777, -12966, 12965, 30776, 29312, 9489, -16277, -31849, -27474, -5893, 19379, 32514, 25285, 2220, -22236, -32765, -22774, 1480, 24807, 32597, 19971, -5163, -27064, -32015, -16916, 8778, 28973, 31023, 13642, -12283, -30515, -29636, -10196, 15629, 31666, 27870, 6619, -18778, -32415, -25750, -2959, 21685, 32748, 23300, -741, -24318, -32665, -20554, 4429, 26639, 32164, 17544, -8063, -28621, -31254, -14313, 11592, 30237, 29944, 10897, -14975, -31469, -28253, -7343, 18165, 32297, 26201, 3695, -21126, -32715, -23816}, +{0, 22773, 32748, 24317, 2220, -21126, -32598, -25750, -4430, 19379, 32297, 27063, 6619, -17545, -31849, -28253, -8779, 15629, 31253, 29312, 10897, -13643, -30515, -30238, -12966, 11592, 29635, 31023, 14974, -9490, -28621, -31667, -16916, 7342, 27473, 32164, 18777, -5163, -26202, -32515, -20554, 2958, 24807, 32714, 22235, -741, -23301, -32765, -23816, -1481, 21685, 32664, 25285, 3695, -19972, -32415, -26640, -5893, 18165, 32014, 27870, 8062, -16277, -31469, -28974, -10196, 14312, 30776, 29944, 12282, -12283, -29945, -30777, -14313, 10195, 28973, 31468, 16276, -8063, -27871, -32015, -18166, 5892, 26639, 32414, 19971, -3696, -25286, -32665, -21686, 1480, 23815, 32764, 23300, 740, -22236, -32715, -24808, -2959, 20553, 32514, 26201, 5162, -18778, -32165, -27474, -7343, 16915, 31666, 28620, 9489, -14975, -31024, -29636, -11593, 12965, 30237, 30514, 13642, -10898, -29313, -31254, -15630, 8778, 28252, 31848, 17544, -6620, -27064, -32298, -19380, 4429, 25749, 32597, 21125, -2221, -24318, -32749, -22774}, +{0, 21685, 32514, 27063, 8062, -14975, -30515, -30777, -15630, 7342, 26639, 32597, 22235, 740, -21126, -32415, -27474, -8779, 14312, 30237, 31023, 16276, -6620, -26202, -32665, -22774, -1481, 20553, 32297, 27870, 9489, -13643, -29945, -31254, -16916, 5892, 25749, 32714, 23300, 2220, -19972, -32165, -28253, -10196, 12965, 29635, 31468, 17544, -5163, -25286, -32749, -23816, -2959, 19379, 32014, 28620, 10897, -12283, -29313, -31667, -18166, 4429, 24807, 32764, 24317, 3695, -18778, -31849, -28974, -11593, 11592, 28973, 31848, 18777, -3696, -24318, -32765, -24808, -4430, 18165, 31666, 29312, 12282, -10898, -28621, -32015, -19380, 2958, 23815, 32748, 25285, 5162, -17545, -31469, -29636, -12966, 10195, 28252, 32164, 19971, -2221, -23301, -32715, -25750, -5893, 16915, 31253, 29944, 13642, -9490, -27871, -32298, -20554, 1480, 22773, 32664, 26201, 6619, -16277, -31024, -30238, -14313, 8778, 27473, 32414, 21125, -741, -22236, -32598, -26640, -7343, 15629, 30776, 30514, 14974, -8063, -27064, -32515, -21686}, +{0, 20553, 32014, 29312, 13642, -8063, -26202, -32749, -24808, -5893, 15629, 30237, 31468, 18777, -2221, -22236, -32415, -28253, -11593, 10195, 27473, 32597, 23300, 3695, -17545, -31024, -30777, -16916, 4429, 23815, 32664, 27063, 9489, -12283, -28621, -32298, -21686, -1481, 19379, 31666, 29944, 14974, -6620, -25286, -32765, -25750, -7343, 14312, 29635, 31848, 19971, -741, -21126, -32165, -28974, -12966, 8778, 26639, 32714, 24317, 5162, -16277, -30515, -31254, -18166, 2958, 22773, 32514, 27870, 10897, -10898, -27871, -32515, -22774, -2959, 18165, 31253, 30514, 16276, -5163, -24318, -32715, -26640, -8779, 12965, 28973, 32164, 21125, 740, -19972, -31849, -29636, -14313, 7342, 25749, 32764, 25285, 6619, -14975, -29945, -31667, -19380, 1480, 21685, 32297, 28620, 12282, -9490, -27064, -32665, -23816, -4430, 16915, 30776, 31023, 17544, -3696, -23301, -32598, -27474, -10196, 11592, 28252, 32414, 22235, 2220, -18778, -31469, -30238, -15630, 5892, 24807, 32748, 26201, 8062, -13643, -29313, -32015, -20554}, +{0, 19379, 31253, 31023, 18777, -741, -19972, -31469, -30777, -18166, 1480, 20553, 31666, 30514, 17544, -2221, -21126, -31849, -30238, -16916, 2958, 21685, 32014, 29944, 16276, -3696, -22236, -32165, -29636, -15630, 4429, 22773, 32297, 29312, 14974, -5163, -23301, -32415, -28974, -14313, 5892, 23815, 32514, 28620, 13642, -6620, -24318, -32598, -28253, -12966, 7342, 24807, 32664, 27870, 12282, -8063, -25286, -32715, -27474, -11593, 8778, 25749, 32748, 27063, 10897, -9490, -26202, -32765, -26640, -10196, 10195, 26639, 32764, 26201, 9489, -10898, -27064, -32749, -25750, -8779, 11592, 27473, 32714, 25285, 8062, -12283, -27871, -32665, -24808, -7343, 12965, 28252, 32597, 24317, 6619, -13643, -28621, -32515, -23816, -5893, 14312, 28973, 32414, 23300, 5162, -14975, -29313, -32298, -22774, -4430, 15629, 29635, 32164, 22235, 3695, -16277, -29945, -32015, -21686, -2959, 16915, 30237, 31848, 21125, 2220, -17545, -30515, -31667, -20554, -1481, 18165, 30776, 31468, 19971, 740, -18778, -31024, -31254, -19380}, +{0, 18165, 30237, 32164, 23300, 6619, -12283, -27064, -32765, -27474, -12966, 5892, 22773, 32014, 30514, 18777, 740, -17545, -29945, -32298, -23816, -7343, 11592, 26639, 32748, 27870, 13642, -5163, -22236, -31849, -30777, -19380, -1481, 16915, 29635, 32414, 24317, 8062, -10898, -26202, -32715, -28253, -14313, 4429, 21685, 31666, 31023, 19971, 2220, -16277, -29313, -32515, -24808, -8779, 10195, 25749, 32664, 28620, 14974, -3696, -21126, -31469, -31254, -20554, -2959, 15629, 28973, 32597, 25285, 9489, -9490, -25286, -32598, -28974, -15630, 2958, 20553, 31253, 31468, 21125, 3695, -14975, -28621, -32665, -25750, -10196, 8778, 24807, 32514, 29312, 16276, -2221, -19972, -31024, -31667, -21686, -4430, 14312, 28252, 32714, 26201, 10897, -8063, -24318, -32415, -29636, -16916, 1480, 19379, 30776, 31848, 22235, 5162, -13643, -27871, -32749, -26640, -11593, 7342, 23815, 32297, 29944, 17544, -741, -18778, -30515, -32015, -22774, -5893, 12965, 27473, 32764, 27063, 12282, -6620, -23301, -32165, -30238, -18166}, +{0, 16915, 28973, 32714, 27063, 13642, -3696, -19972, -30515, -32298, -24808, -10196, 7342, 22773, 31666, 31468, 22235, 6619, -10898, -25286, -32415, -30238, -19380, -2959, 14312, 27473, 32748, 28620, 16276, -741, -17545, -29313, -32665, -26640, -12966, 4429, 20553, 30776, 32164, 24317, 9489, -8063, -23301, -31849, -31254, -21686, -5893, 11592, 25749, 32514, 29944, 18777, 2220, -14975, -27871, -32765, -28253, -15630, 1480, 18165, 29635, 32597, 26201, 12282, -5163, -21126, -31024, -32015, -23816, -8779, 8778, 23815, 32014, 31023, 21125, 5162, -12283, -26202, -32598, -29636, -18166, -1481, 15629, 28252, 32764, 27870, 14974, -2221, -18778, -29945, -32515, -25750, -11593, 5892, 21685, 31253, 31848, 23300, 8062, -9490, -24318, -32165, -30777, -20554, -4430, 12965, 26639, 32664, 29312, 17544, 740, -16277, -28621, -32749, -27474, -14313, 2958, 19379, 30237, 32414, 25285, 10897, -6620, -22236, -31469, -31667, -22774, -7343, 10195, 24807, 32297, 30514, 19971, 3695, -13643, -27064, -32715, -28974, -16916}, +{0, 15629, 27473, 32664, 29944, 19971, 5162, -10898, -24318, -31849, -31667, -23816, -10196, 5892, 20553, 30237, 32597, 27063, 14974, -741, -16277, -27871, -32715, -29636, -19380, -4430, 11592, 24807, 32014, 31468, 23300, 9489, -6620, -21126, -30515, -32515, -26640, -14313, 1480, 16915, 28252, 32748, 29312, 18777, 3695, -12283, -25286, -32165, -31254, -22774, -8779, 7342, 21685, 30776, 32414, 26201, 13642, -2221, -17545, -28621, -32765, -28974, -18166, -2959, 12965, 25749, 32297, 31023, 22235, 8062, -8063, -22236, -31024, -32298, -25750, -12966, 2958, 18165, 28973, 32764, 28620, 17544, 2220, -13643, -26202, -32415, -30777, -21686, -7343, 8778, 22773, 31253, 32164, 25285, 12282, -3696, -18778, -29313, -32749, -28253, -16916, -1481, 14312, 26639, 32514, 30514, 21125, 6619, -9490, -23301, -31469, -32015, -24808, -11593, 4429, 19379, 29635, 32714, 27870, 16276, 740, -14975, -27064, -32598, -30238, -20554, -5893, 10195, 23815, 31666, 31848, 24317, 10897, -5163, -19972, -29945, -32665, -27474, -15630}, +{0, 14312, 25749, 32014, 31848, 25285, 13642, -741, -14975, -26202, -32165, -31667, -24808, -12966, 1480, 15629, 26639, 32297, 31468, 24317, 12282, -2221, -16277, -27064, -32415, -31254, -23816, -11593, 2958, 16915, 27473, 32514, 31023, 23300, 10897, -3696, -17545, -27871, -32598, -30777, -22774, -10196, 4429, 18165, 28252, 32664, 30514, 22235, 9489, -5163, -18778, -28621, -32715, -30238, -21686, -8779, 5892, 19379, 28973, 32748, 29944, 21125, 8062, -6620, -19972, -29313, -32765, -29636, -20554, -7343, 7342, 20553, 29635, 32764, 29312, 19971, 6619, -8063, -21126, -29945, -32749, -28974, -19380, -5893, 8778, 21685, 30237, 32714, 28620, 18777, 5162, -9490, -22236, -30515, -32665, -28253, -18166, -4430, 10195, 22773, 30776, 32597, 27870, 17544, 3695, -10898, -23301, -31024, -32515, -27474, -16916, -2959, 11592, 23815, 31253, 32414, 27063, 16276, 2220, -12283, -24318, -31469, -32298, -26640, -15630, -1481, 12965, 24807, 31666, 32164, 26201, 14974, 740, -13643, -25286, -31849, -32015, -25750, -14313}, +{0, 12965, 23815, 30776, 32714, 29312, 21125, 9489, -3696, -16277, -26202, -31849, -32298, -27474, -18166, -5893, 7342, 19379, 28252, 32514, 31468, 25285, 14974, 2220, -10898, -22236, -29945, -32765, -30238, -22774, -11593, 1480, 14312, 24807, 31253, 32597, 28620, 19971, 8062, -5163, -17545, -27064, -32165, -32015, -26640, -16916, -4430, 8778, 20553, 28973, 32664, 31023, 24317, 13642, 740, -12283, -23301, -30515, -32749, -29636, -21686, -10196, 2958, 15629, 25749, 31666, 32414, 27870, 18777, 6619, -6620, -18778, -27871, -32415, -31667, -25750, -15630, -2959, 10195, 21685, 29635, 32748, 30514, 23300, 12282, -741, -13643, -24318, -31024, -32665, -28974, -20554, -8779, 4429, 16915, 26639, 32014, 32164, 27063, 17544, 5162, -8063, -19972, -28621, -32598, -31254, -24808, -14313, -1481, 11592, 22773, 30237, 32764, 29944, 22235, 10897, -2221, -14975, -25286, -31469, -32515, -28253, -19380, -7343, 5892, 18165, 27473, 32297, 31848, 26201, 16276, 3695, -9490, -21126, -29313, -32715, -30777, -23816, -12966}, +{0, 11592, 21685, 28973, 32514, 31848, 27063, 18777, 8062, -3696, -14975, -24318, -30515, -32765, -30777, -24808, -15630, -4430, 7342, 18165, 26639, 31666, 32597, 29312, 22235, 12282, 740, -10898, -21126, -28621, -32415, -32015, -27474, -19380, -8779, 2958, 14312, 23815, 30237, 32748, 31023, 25285, 16276, 5162, -6620, -17545, -26202, -31469, -32665, -29636, -22774, -12966, -1481, 10195, 20553, 28252, 32297, 32164, 27870, 19971, 9489, -2221, -13643, -23301, -29945, -32715, -31254, -25750, -16916, -5893, 5892, 16915, 25749, 31253, 32714, 29944, 23300, 13642, 2220, -9490, -19972, -27871, -32165, -32298, -28253, -20554, -10196, 1480, 12965, 22773, 29635, 32664, 31468, 26201, 17544, 6619, -5163, -16277, -25286, -31024, -32749, -30238, -23816, -14313, -2959, 8778, 19379, 27473, 32014, 32414, 28620, 21125, 10897, -741, -12283, -22236, -29313, -32598, -31667, -26640, -18166, -7343, 4429, 15629, 24807, 30776, 32764, 30514, 24317, 14974, 3695, -8063, -18778, -27064, -31849, -32515, -28974, -21686, -11593}, +{0, 10195, 19379, 26639, 31253, 32764, 31023, 26201, 18777, 9489, -741, -10898, -19972, -27064, -31469, -32749, -30777, -25750, -18166, -8779, 1480, 11592, 20553, 27473, 31666, 32714, 30514, 25285, 17544, 8062, -2221, -12283, -21126, -27871, -31849, -32665, -30238, -24808, -16916, -7343, 2958, 12965, 21685, 28252, 32014, 32597, 29944, 24317, 16276, 6619, -3696, -13643, -22236, -28621, -32165, -32515, -29636, -23816, -15630, -5893, 4429, 14312, 22773, 28973, 32297, 32414, 29312, 23300, 14974, 5162, -5163, -14975, -23301, -29313, -32415, -32298, -28974, -22774, -14313, -4430, 5892, 15629, 23815, 29635, 32514, 32164, 28620, 22235, 13642, 3695, -6620, -16277, -24318, -29945, -32598, -32015, -28253, -21686, -12966, -2959, 7342, 16915, 24807, 30237, 32664, 31848, 27870, 21125, 12282, 2220, -8063, -17545, -25286, -30515, -32715, -31667, -27474, -20554, -11593, -1481, 8778, 18165, 25749, 30776, 32748, 31468, 27063, 19971, 10897, 740, -9490, -18778, -26202, -31024, -32765, -31254, -26640, -19380, -10196}, +{0, 8778, 16915, 23815, 28973, 32014, 32714, 31023, 27063, 21125, 13642, 5162, -3696, -12283, -19972, -26202, -30515, -32598, -32298, -29636, -24808, -18166, -10196, -1481, 7342, 15629, 22773, 28252, 31666, 32764, 31468, 27870, 22235, 14974, 6619, -2221, -10898, -18778, -25286, -29945, -32415, -32515, -30238, -25750, -19380, -11593, -2959, 5892, 14312, 21685, 27473, 31253, 32748, 31848, 28620, 23300, 16276, 8062, -741, -9490, -17545, -24318, -29313, -32165, -32665, -30777, -26640, -20554, -12966, -4430, 4429, 12965, 20553, 26639, 30776, 32664, 32164, 29312, 24317, 17544, 9489, 740, -8063, -16277, -23301, -28621, -31849, -32749, -31254, -27474, -21686, -14313, -5893, 2958, 11592, 19379, 25749, 30237, 32514, 32414, 29944, 25285, 18777, 10897, 2220, -6620, -14975, -22236, -27871, -31469, -32765, -31667, -28253, -22774, -15630, -7343, 1480, 10195, 18165, 24807, 29635, 32297, 32597, 30514, 26201, 19971, 12282, 3695, -5163, -13643, -21126, -27064, -31024, -32715, -32015, -28974, -23816, -16916, -8779}, +{0, 7342, 14312, 20553, 25749, 29635, 32014, 32764, 31848, 29312, 25285, 19971, 13642, 6619, -741, -8063, -14975, -21126, -26202, -29945, -32165, -32749, -31667, -28974, -24808, -19380, -12966, -5893, 1480, 8778, 15629, 21685, 26639, 30237, 32297, 32714, 31468, 28620, 24317, 18777, 12282, 5162, -2221, -9490, -16277, -22236, -27064, -30515, -32415, -32665, -31254, -28253, -23816, -18166, -11593, -4430, 2958, 10195, 16915, 22773, 27473, 30776, 32514, 32597, 31023, 27870, 23300, 17544, 10897, 3695, -3696, -10898, -17545, -23301, -27871, -31024, -32598, -32515, -30777, -27474, -22774, -16916, -10196, -2959, 4429, 11592, 18165, 23815, 28252, 31253, 32664, 32414, 30514, 27063, 22235, 16276, 9489, 2220, -5163, -12283, -18778, -24318, -28621, -31469, -32715, -32298, -30238, -26640, -21686, -15630, -8779, -1481, 5892, 12965, 19379, 24807, 28973, 31666, 32748, 32164, 29944, 26201, 21125, 14974, 8062, 740, -6620, -13643, -19972, -25286, -29313, -31849, -32765, -32015, -29636, -25750, -20554, -14313, -7343}, +{0, 5892, 11592, 16915, 21685, 25749, 28973, 31253, 32514, 32714, 31848, 29944, 27063, 23300, 18777, 13642, 8062, 2220, -3696, -9490, -14975, -19972, -24318, -27871, -30515, -32165, -32765, -32298, -30777, -28253, -24808, -20554, -15630, -10196, -4430, 1480, 7342, 12965, 18165, 22773, 26639, 29635, 31666, 32664, 32597, 31468, 29312, 26201, 22235, 17544, 12282, 6619, 740, -5163, -10898, -16277, -21126, -25286, -28621, -31024, -32415, -32749, -32015, -30238, -27474, -23816, -19380, -14313, -8779, -2959, 2958, 8778, 14312, 19379, 23815, 27473, 30237, 32014, 32748, 32414, 31023, 28620, 25285, 21125, 16276, 10897, 5162, -741, -6620, -12283, -17545, -22236, -26202, -29313, -31469, -32598, -32665, -31667, -29636, -26640, -22774, -18166, -12966, -7343, -1481, 4429, 10195, 15629, 20553, 24807, 28252, 30776, 32297, 32764, 32164, 30514, 27870, 24317, 19971, 14974, 9489, 3695, -2221, -8063, -13643, -18778, -23301, -27064, -29945, -31849, -32715, -32515, -31254, -28974, -25750, -21686, -16916, -11593, -5893}, +{0, 4429, 8778, 12965, 16915, 20553, 23815, 26639, 28973, 30776, 32014, 32664, 32714, 32164, 31023, 29312, 27063, 24317, 21125, 17544, 13642, 9489, 5162, 740, -3696, -8063, -12283, -16277, -19972, -23301, -26202, -28621, -30515, -31849, -32598, -32749, -32298, -31254, -29636, -27474, -24808, -21686, -18166, -14313, -10196, -5893, -1481, 2958, 7342, 11592, 15629, 19379, 22773, 25749, 28252, 30237, 31666, 32514, 32764, 32414, 31468, 29944, 27870, 25285, 22235, 18777, 14974, 10897, 6619, 2220, -2221, -6620, -10898, -14975, -18778, -22236, -25286, -27871, -29945, -31469, -32415, -32765, -32515, -31667, -30238, -28253, -25750, -22774, -19380, -15630, -11593, -7343, -2959, 1480, 5892, 10195, 14312, 18165, 21685, 24807, 27473, 29635, 31253, 32297, 32748, 32597, 31848, 30514, 28620, 26201, 23300, 19971, 16276, 12282, 8062, 3695, -741, -5163, -9490, -13643, -17545, -21126, -24318, -27064, -29313, -31024, -32165, -32715, -32665, -32015, -30777, -28974, -26640, -23816, -20554, -16916, -12966, -8779, -4430}, +{0, 2958, 5892, 8778, 11592, 14312, 16915, 19379, 21685, 23815, 25749, 27473, 28973, 30237, 31253, 32014, 32514, 32748, 32714, 32414, 31848, 31023, 29944, 28620, 27063, 25285, 23300, 21125, 18777, 16276, 13642, 10897, 8062, 5162, 2220, -741, -3696, -6620, -9490, -12283, -14975, -17545, -19972, -22236, -24318, -26202, -27871, -29313, -30515, -31469, -32165, -32598, -32765, -32665, -32298, -31667, -30777, -29636, -28253, -26640, -24808, -22774, -20554, -18166, -15630, -12966, -10196, -7343, -4430, -1481, 1480, 4429, 7342, 10195, 12965, 15629, 18165, 20553, 22773, 24807, 26639, 28252, 29635, 30776, 31666, 32297, 32664, 32764, 32597, 32164, 31468, 30514, 29312, 27870, 26201, 24317, 22235, 19971, 17544, 14974, 12282, 9489, 6619, 3695, 740, -2221, -5163, -8063, -10898, -13643, -16277, -18778, -21126, -23301, -25286, -27064, -28621, -29945, -31024, -31849, -32415, -32715, -32749, -32515, -32015, -31254, -30238, -28974, -27474, -25750, -23816, -21686, -19380, -16916, -14313, -11593, -8779, -5893, -2959}, +{0, 1480, 2958, 4429, 5892, 7342, 8778, 10195, 11592, 12965, 14312, 15629, 16915, 18165, 19379, 20553, 21685, 22773, 23815, 24807, 25749, 26639, 27473, 28252, 28973, 29635, 30237, 30776, 31253, 31666, 32014, 32297, 32514, 32664, 32748, 32764, 32714, 32597, 32414, 32164, 31848, 31468, 31023, 30514, 29944, 29312, 28620, 27870, 27063, 26201, 25285, 24317, 23300, 22235, 21125, 19971, 18777, 17544, 16276, 14974, 13642, 12282, 10897, 9489, 8062, 6619, 5162, 3695, 2220, 740, -741, -2221, -3696, -5163, -6620, -8063, -9490, -10898, -12283, -13643, -14975, -16277, -17545, -18778, -19972, -21126, -22236, -23301, -24318, -25286, -26202, -27064, -27871, -28621, -29313, -29945, -30515, -31024, -31469, -31849, -32165, -32415, -32598, -32715, -32765, -32749, -32665, -32515, -32298, -32015, -31667, -31254, -30777, -30238, -29636, -28974, -28253, -27474, -26640, -25750, -24808, -23816, -22774, -21686, -20554, -19380, -18166, -16916, -15630, -14313, -12966, -11593, -10196, -8779, -7343, -5893, -4430, -2959, -1481} +}; \ No newline at end of file diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach_common.c b/openair1/PHY/NR_TRANSPORT/nr_prach_common.c index a95c519d43..8cc5951b19 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach_common.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach_common.c @@ -127,6 +127,8 @@ void compute_nr_prach_seq(uint8_t short_sequence, LOG_D( PHY, "compute_prach_seq: done init prach_tables\n" ); + int16_t *x_u_time = calloc(1, sizeof(int32_t)*N_ZC); + for (i=0; i>1); + x_u_time[k<<1] = (int16_t)nr_ru[nr_ru_index<<1]; + x_u_time[1+(k<<1)] = (int16_t)nr_ru[1+(nr_ru_index<<1)]; } + + int16_t *x_u_freq = (int16_t*)X_u[i]; + bzero(x_u_freq,sizeof(int32_t)*N_ZC); + for (int line=0; line>19); + x_u_freq[1+(line<<1)] = x_u_freq[1+(line<<1)] + (im>>19); + } + } + +#ifdef PRACH_DEBUG + for (k=0; k>16)); + } +#endif } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_COMPUTE_PRACH, VCD_FUNCTION_OUT); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 1a330da02c..1d8f3a9caf 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -523,9 +523,9 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, } else { LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received\n"); - LOG_I(NR_MAC,"[RAPROC] Received Msg3:\n"); + LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n"); for (int k = 0; k < sdu_lenP; k++) { - LOG_I(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); + LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); } // UE Contention Resolution Identity From 642c639406421df70a9d8826b9ead4cef91ed18c Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Thu, 18 Mar 2021 17:14:31 +0100 Subject: [PATCH 068/125] Revert "Fix preamble sequence" This reverts commit 9efe4187e72f25fd2936be5b9e4daa5473383afb --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_prach.h | 285 ------------------ openair1/PHY/NR_TRANSPORT/nr_prach_common.c | 27 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 4 +- 4 files changed, 5 insertions(+), 313 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 0c1fde07a2..1d971a8831 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -681,7 +681,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, preamble_shift -= NCS; if (preamble_shift < 0) - preamble_shift+=((N_ZC/NCS)*NCS); + preamble_shift+=N_ZC; } } else { // This is the high-speed case new_dft = 0; diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.h b/openair1/PHY/NR_TRANSPORT/nr_prach.h index d97689a5a6..d158e04c79 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.h +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.h @@ -93,288 +93,3 @@ uint16_t prach_root_sequence_map_abc[138] = { 51, 88 , 52, 87 , 53, 86 , 54, 85 , 55, 84 , 56, 83 , 57, 82 , 58, 81 , 59, 80 , 60, 79 , 61, 78 , 62, 77 , 63, 76 , 64, 75 , 65, 74 , 66, 73 , 67, 72 , 68, 71 , 69, 70 }; - -int16_t prach_fft139_re[139][139] = { -{32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767}, -{32767, 32733, 32633, 32466, 32232, 31933, 31569, 31140, 30647, 30092, 29475, 28799, 28063, 27270, 26421, 25519, 24564, 23559, 22506, 21406, 20264, 19079, 17856, 16596, 15303, 13978, 12624, 11245, 9843, 8421, 6981, 5527, 4062, 2589, 1110, -371, -1851, -3327, -4797, -6257, -7704, -9135, -10548, -11939, -13305, -14645, -15955, -17232, -18473, -19677, -20841, -21963, -23039, -24068, -25049, -25978, -26853, -27675, -28439, -29146, -29792, -30378, -30902, -31363, -31760, -32092, -32358, -32558, -32692, -32759, -32759, -32692, -32558, -32358, -32092, -31760, -31363, -30902, -30378, -29792, -29146, -28439, -27675, -26853, -25978, -25049, -24068, -23039, -21963, -20841, -19677, -18473, -17232, -15955, -14645, -13305, -11939, -10548, -9135, -7704, -6257, -4797, -3327, -1851, -371, 1110, 2589, 4062, 5527, 6981, 8421, 9843, 11245, 12624, 13978, 15303, 16596, 17856, 19079, 20264, 21406, 22506, 23559, 24564, 25519, 26421, 27270, 28063, 28799, 29475, 30092, 30647, 31140, 31569, 31933, 32232, 32466, 32633, 32733}, -{32767, 32633, 32232, 31569, 30647, 29475, 28063, 26421, 24564, 22506, 20264, 17856, 15303, 12624, 9843, 6981, 4062, 1110, -1851, -4797, -7704, -10548, -13305, -15955, -18473, -20841, -23039, -25049, -26853, -28439, -29792, -30902, -31760, -32358, -32692, -32759, -32558, -32092, -31363, -30378, -29146, -27675, -25978, -24068, -21963, -19677, -17232, -14645, -11939, -9135, -6257, -3327, -371, 2589, 5527, 8421, 11245, 13978, 16596, 19079, 21406, 23559, 25519, 27270, 28799, 30092, 31140, 31933, 32466, 32733, 32733, 32466, 31933, 31140, 30092, 28799, 27270, 25519, 23559, 21406, 19079, 16596, 13978, 11245, 8421, 5527, 2589, -371, -3327, -6257, -9135, -11939, -14645, -17232, -19677, -21963, -24068, -25978, -27675, -29146, -30378, -31363, -32092, -32558, -32759, -32692, -32358, -31760, -30902, -29792, -28439, -26853, -25049, -23039, -20841, -18473, -15955, -13305, -10548, -7704, -4797, -1851, 1110, 4062, 6981, 9843, 12624, 15303, 17856, 20264, 22506, 24564, 26421, 28063, 29475, 30647, 31569, 32232, 32633}, -{32767, 32466, 31569, 30092, 28063, 25519, 22506, 19079, 15303, 11245, 6981, 2589, -1851, -6257, -10548, -14645, -18473, -21963, -25049, -27675, -29792, -31363, -32358, -32759, -32558, -31760, -30378, -28439, -25978, -23039, -19677, -15955, -11939, -7704, -3327, 1110, 5527, 9843, 13978, 17856, 21406, 24564, 27270, 29475, 31140, 32232, 32733, 32633, 31933, 30647, 28799, 26421, 23559, 20264, 16596, 12624, 8421, 4062, -371, -4797, -9135, -13305, -17232, -20841, -24068, -26853, -29146, -30902, -32092, -32692, -32692, -32092, -30902, -29146, -26853, -24068, -20841, -17232, -13305, -9135, -4797, -371, 4062, 8421, 12624, 16596, 20264, 23559, 26421, 28799, 30647, 31933, 32633, 32733, 32232, 31140, 29475, 27270, 24564, 21406, 17856, 13978, 9843, 5527, 1110, -3327, -7704, -11939, -15955, -19677, -23039, -25978, -28439, -30378, -31760, -32558, -32759, -32358, -31363, -29792, -27675, -25049, -21963, -18473, -14645, -10548, -6257, -1851, 2589, 6981, 11245, 15303, 19079, 22506, 25519, 28063, 30092, 31569, 32466}, -{32767, 32232, 30647, 28063, 24564, 20264, 15303, 9843, 4062, -1851, -7704, -13305, -18473, -23039, -26853, -29792, -31760, -32692, -32558, -31363, -29146, -25978, -21963, -17232, -11939, -6257, -371, 5527, 11245, 16596, 21406, 25519, 28799, 31140, 32466, 32733, 31933, 30092, 27270, 23559, 19079, 13978, 8421, 2589, -3327, -9135, -14645, -19677, -24068, -27675, -30378, -32092, -32759, -32358, -30902, -28439, -25049, -20841, -15955, -10548, -4797, 1110, 6981, 12624, 17856, 22506, 26421, 29475, 31569, 32633, 32633, 31569, 29475, 26421, 22506, 17856, 12624, 6981, 1110, -4797, -10548, -15955, -20841, -25049, -28439, -30902, -32358, -32759, -32092, -30378, -27675, -24068, -19677, -14645, -9135, -3327, 2589, 8421, 13978, 19079, 23559, 27270, 30092, 31933, 32733, 32466, 31140, 28799, 25519, 21406, 16596, 11245, 5527, -371, -6257, -11939, -17232, -21963, -25978, -29146, -31363, -32558, -32692, -31760, -29792, -26853, -23039, -18473, -13305, -7704, -1851, 4062, 9843, 15303, 20264, 24564, 28063, 30647, 32232}, -{32767, 31933, 29475, 25519, 20264, 13978, 6981, -371, -7704, -14645, -20841, -25978, -29792, -32092, -32759, -31760, -29146, -25049, -19677, -13305, -6257, 1110, 8421, 15303, 21406, 26421, 30092, 32232, 32733, 31569, 28799, 24564, 19079, 12624, 5527, -1851, -9135, -15955, -21963, -26853, -30378, -32358, -32692, -31363, -28439, -24068, -18473, -11939, -4797, 2589, 9843, 16596, 22506, 27270, 30647, 32466, 32633, 31140, 28063, 23559, 17856, 11245, 4062, -3327, -10548, -17232, -23039, -27675, -30902, -32558, -32558, -30902, -27675, -23039, -17232, -10548, -3327, 4062, 11245, 17856, 23559, 28063, 31140, 32633, 32466, 30647, 27270, 22506, 16596, 9843, 2589, -4797, -11939, -18473, -24068, -28439, -31363, -32692, -32358, -30378, -26853, -21963, -15955, -9135, -1851, 5527, 12624, 19079, 24564, 28799, 31569, 32733, 32232, 30092, 26421, 21406, 15303, 8421, 1110, -6257, -13305, -19677, -25049, -29146, -31760, -32759, -32092, -29792, -25978, -20841, -14645, -7704, -371, 6981, 13978, 20264, 25519, 29475, 31933}, -{32767, 31569, 28063, 22506, 15303, 6981, -1851, -10548, -18473, -25049, -29792, -32358, -32558, -30378, -25978, -19677, -11939, -3327, 5527, 13978, 21406, 27270, 31140, 32733, 31933, 28799, 23559, 16596, 8421, -371, -9135, -17232, -24068, -29146, -32092, -32692, -30902, -26853, -20841, -13305, -4797, 4062, 12624, 20264, 26421, 30647, 32633, 32232, 29475, 24564, 17856, 9843, 1110, -7704, -15955, -23039, -28439, -31760, -32759, -31363, -27675, -21963, -14645, -6257, 2589, 11245, 19079, 25519, 30092, 32466, 32466, 30092, 25519, 19079, 11245, 2589, -6257, -14645, -21963, -27675, -31363, -32759, -31760, -28439, -23039, -15955, -7704, 1110, 9843, 17856, 24564, 29475, 32232, 32633, 30647, 26421, 20264, 12624, 4062, -4797, -13305, -20841, -26853, -30902, -32692, -32092, -29146, -24068, -17232, -9135, -371, 8421, 16596, 23559, 28799, 31933, 32733, 31140, 27270, 21406, 13978, 5527, -3327, -11939, -19677, -25978, -30378, -32558, -32358, -29792, -25049, -18473, -10548, -1851, 6981, 15303, 22506, 28063, 31569}, -{32767, 31140, 26421, 19079, 9843, -371, -10548, -19677, -26853, -31363, -32759, -30902, -25978, -18473, -9135, 1110, 11245, 20264, 27270, 31569, 32733, 30647, 25519, 17856, 8421, -1851, -11939, -20841, -27675, -31760, -32692, -30378, -25049, -17232, -7704, 2589, 12624, 21406, 28063, 31933, 32633, 30092, 24564, 16596, 6981, -3327, -13305, -21963, -28439, -32092, -32558, -29792, -24068, -15955, -6257, 4062, 13978, 22506, 28799, 32232, 32466, 29475, 23559, 15303, 5527, -4797, -14645, -23039, -29146, -32358, -32358, -29146, -23039, -14645, -4797, 5527, 15303, 23559, 29475, 32466, 32232, 28799, 22506, 13978, 4062, -6257, -15955, -24068, -29792, -32558, -32092, -28439, -21963, -13305, -3327, 6981, 16596, 24564, 30092, 32633, 31933, 28063, 21406, 12624, 2589, -7704, -17232, -25049, -30378, -32692, -31760, -27675, -20841, -11939, -1851, 8421, 17856, 25519, 30647, 32733, 31569, 27270, 20264, 11245, 1110, -9135, -18473, -25978, -30902, -32759, -31363, -26853, -19677, -10548, -371, 9843, 19079, 26421, 31140}, -{32767, 30647, 24564, 15303, 4062, -7704, -18473, -26853, -31760, -32558, -29146, -21963, -11939, -371, 11245, 21406, 28799, 32466, 31933, 27270, 19079, 8421, -3327, -14645, -24068, -30378, -32759, -30902, -25049, -15955, -4797, 6981, 17856, 26421, 31569, 32633, 29475, 22506, 12624, 1110, -10548, -20841, -28439, -32358, -32092, -27675, -19677, -9135, 2589, 13978, 23559, 30092, 32733, 31140, 25519, 16596, 5527, -6257, -17232, -25978, -31363, -32692, -29792, -23039, -13305, -1851, 9843, 20264, 28063, 32232, 32232, 28063, 20264, 9843, -1851, -13305, -23039, -29792, -32692, -31363, -25978, -17232, -6257, 5527, 16596, 25519, 31140, 32733, 30092, 23559, 13978, 2589, -9135, -19677, -27675, -32092, -32358, -28439, -20841, -10548, 1110, 12624, 22506, 29475, 32633, 31569, 26421, 17856, 6981, -4797, -15955, -25049, -30902, -32759, -30378, -24068, -14645, -3327, 8421, 19079, 27270, 31933, 32466, 28799, 21406, 11245, -371, -11939, -21963, -29146, -32558, -31760, -26853, -18473, -7704, 4062, 15303, 24564, 30647}, -{32767, 30092, 22506, 11245, -1851, -14645, -25049, -31363, -32558, -28439, -19677, -7704, 5527, 17856, 27270, 32232, 31933, 26421, 16596, 4062, -9135, -20841, -29146, -32692, -30902, -24068, -13305, -371, 12624, 23559, 30647, 32733, 29475, 21406, 9843, -3327, -15955, -25978, -31760, -32358, -27675, -18473, -6257, 6981, 19079, 28063, 32466, 31569, 25519, 15303, 2589, -10548, -21963, -29792, -32759, -30378, -23039, -11939, 1110, 13978, 24564, 31140, 32633, 28799, 20264, 8421, -4797, -17232, -26853, -32092, -32092, -26853, -17232, -4797, 8421, 20264, 28799, 32633, 31140, 24564, 13978, 1110, -11939, -23039, -30378, -32759, -29792, -21963, -10548, 2589, 15303, 25519, 31569, 32466, 28063, 19079, 6981, -6257, -18473, -27675, -32358, -31760, -25978, -15955, -3327, 9843, 21406, 29475, 32733, 30647, 23559, 12624, -371, -13305, -24068, -30902, -32692, -29146, -20841, -9135, 4062, 16596, 26421, 31933, 32232, 27270, 17856, 5527, -7704, -19677, -28439, -32558, -31363, -25049, -14645, -1851, 11245, 22506, 30092}, -{32767, 29475, 20264, 6981, -7704, -20841, -29792, -32759, -29146, -19677, -6257, 8421, 21406, 30092, 32733, 28799, 19079, 5527, -9135, -21963, -30378, -32692, -28439, -18473, -4797, 9843, 22506, 30647, 32633, 28063, 17856, 4062, -10548, -23039, -30902, -32558, -27675, -17232, -3327, 11245, 23559, 31140, 32466, 27270, 16596, 2589, -11939, -24068, -31363, -32358, -26853, -15955, -1851, 12624, 24564, 31569, 32232, 26421, 15303, 1110, -13305, -25049, -31760, -32092, -25978, -14645, -371, 13978, 25519, 31933, 31933, 25519, 13978, -371, -14645, -25978, -32092, -31760, -25049, -13305, 1110, 15303, 26421, 32232, 31569, 24564, 12624, -1851, -15955, -26853, -32358, -31363, -24068, -11939, 2589, 16596, 27270, 32466, 31140, 23559, 11245, -3327, -17232, -27675, -32558, -30902, -23039, -10548, 4062, 17856, 28063, 32633, 30647, 22506, 9843, -4797, -18473, -28439, -32692, -30378, -21963, -9135, 5527, 19079, 28799, 32733, 30092, 21406, 8421, -6257, -19677, -29146, -32759, -29792, -20841, -7704, 6981, 20264, 29475}, -{32767, 28799, 17856, 2589, -13305, -25978, -32358, -30902, -21963, -7704, 8421, 22506, 31140, 32232, 25519, 12624, -3327, -18473, -29146, -32759, -28439, -17232, -1851, 13978, 26421, 32466, 30647, 21406, 6981, -9135, -23039, -31363, -32092, -25049, -11939, 4062, 19079, 29475, 32733, 28063, 16596, 1110, -14645, -26853, -32558, -30378, -20841, -6257, 9843, 23559, 31569, 31933, 24564, 11245, -4797, -19677, -29792, -32692, -27675, -15955, -371, 15303, 27270, 32633, 30092, 20264, 5527, -10548, -24068, -31760, -31760, -24068, -10548, 5527, 20264, 30092, 32633, 27270, 15303, -371, -15955, -27675, -32692, -29792, -19677, -4797, 11245, 24564, 31933, 31569, 23559, 9843, -6257, -20841, -30378, -32558, -26853, -14645, 1110, 16596, 28063, 32733, 29475, 19079, 4062, -11939, -25049, -32092, -31363, -23039, -9135, 6981, 21406, 30647, 32466, 26421, 13978, -1851, -17232, -28439, -32759, -29146, -18473, -3327, 12624, 25519, 32232, 31140, 22506, 8421, -7704, -21963, -30902, -32358, -25978, -13305, 2589, 17856, 28799}, -{32767, 28063, 15303, -1851, -18473, -29792, -32558, -25978, -11939, 5527, 21406, 31140, 31933, 23559, 8421, -9135, -24068, -32092, -30902, -20841, -4797, 12624, 26421, 32633, 29475, 17856, 1110, -15955, -28439, -32759, -27675, -14645, 2589, 19079, 30092, 32466, 25519, 11245, -6257, -21963, -31363, -31760, -23039, -7704, 9843, 24564, 32232, 30647, 20264, 4062, -13305, -26853, -32692, -29146, -17232, -371, 16596, 28799, 32733, 27270, 13978, -3327, -19677, -30378, -32358, -25049, -10548, 6981, 22506, 31569, 31569, 22506, 6981, -10548, -25049, -32358, -30378, -19677, -3327, 13978, 27270, 32733, 28799, 16596, -371, -17232, -29146, -32692, -26853, -13305, 4062, 20264, 30647, 32232, 24564, 9843, -7704, -23039, -31760, -31363, -21963, -6257, 11245, 25519, 32466, 30092, 19079, 2589, -14645, -27675, -32759, -28439, -15955, 1110, 17856, 29475, 32633, 26421, 12624, -4797, -20841, -30902, -32092, -24068, -9135, 8421, 23559, 31933, 31140, 21406, 5527, -11939, -25978, -32558, -29792, -18473, -1851, 15303, 28063}, -{32767, 27270, 12624, -6257, -23039, -32092, -30378, -18473, -371, 17856, 30092, 32232, 23559, 6981, -11939, -26853, -32759, -27675, -13305, 5527, 22506, 31933, 30647, 19079, 1110, -17232, -29792, -32358, -24068, -7704, 11245, 26421, 32733, 28063, 13978, -4797, -21963, -31760, -30902, -19677, -1851, 16596, 29475, 32466, 24564, 8421, -10548, -25978, -32692, -28439, -14645, 4062, 21406, 31569, 31140, 20264, 2589, -15955, -29146, -32558, -25049, -9135, 9843, 25519, 32633, 28799, 15303, -3327, -20841, -31363, -31363, -20841, -3327, 15303, 28799, 32633, 25519, 9843, -9135, -25049, -32558, -29146, -15955, 2589, 20264, 31140, 31569, 21406, 4062, -14645, -28439, -32692, -25978, -10548, 8421, 24564, 32466, 29475, 16596, -1851, -19677, -30902, -31760, -21963, -4797, 13978, 28063, 32733, 26421, 11245, -7704, -24068, -32358, -29792, -17232, 1110, 19079, 30647, 31933, 22506, 5527, -13305, -27675, -32759, -26853, -11939, 6981, 23559, 32232, 30092, 17856, -371, -18473, -30378, -32092, -23039, -6257, 12624, 27270}, -{32767, 26421, 9843, -10548, -26853, -32759, -25978, -9135, 11245, 27270, 32733, 25519, 8421, -11939, -27675, -32692, -25049, -7704, 12624, 28063, 32633, 24564, 6981, -13305, -28439, -32558, -24068, -6257, 13978, 28799, 32466, 23559, 5527, -14645, -29146, -32358, -23039, -4797, 15303, 29475, 32232, 22506, 4062, -15955, -29792, -32092, -21963, -3327, 16596, 30092, 31933, 21406, 2589, -17232, -30378, -31760, -20841, -1851, 17856, 30647, 31569, 20264, 1110, -18473, -30902, -31363, -19677, -371, 19079, 31140, 31140, 19079, -371, -19677, -31363, -30902, -18473, 1110, 20264, 31569, 30647, 17856, -1851, -20841, -31760, -30378, -17232, 2589, 21406, 31933, 30092, 16596, -3327, -21963, -32092, -29792, -15955, 4062, 22506, 32232, 29475, 15303, -4797, -23039, -32358, -29146, -14645, 5527, 23559, 32466, 28799, 13978, -6257, -24068, -32558, -28439, -13305, 6981, 24564, 32633, 28063, 12624, -7704, -25049, -32692, -27675, -11939, 8421, 25519, 32733, 27270, 11245, -9135, -25978, -32759, -26853, -10548, 9843, 26421}, -{32767, 25519, 6981, -14645, -29792, -31760, -19677, 1110, 21406, 32232, 28799, 12624, -9135, -26853, -32692, -24068, -4797, 16596, 30647, 31140, 17856, -3327, -23039, -32558, -27675, -10548, 11245, 28063, 32466, 22506, 2589, -18473, -31363, -30378, -15955, 5527, 24564, 32733, 26421, 8421, -13305, -29146, -32092, -20841, -371, 20264, 31933, 29475, 13978, -7704, -25978, -32759, -25049, -6257, 15303, 30092, 31569, 19079, -1851, -21963, -32358, -28439, -11939, 9843, 27270, 32633, 23559, 4062, -17232, -30902, -30902, -17232, 4062, 23559, 32633, 27270, 9843, -11939, -28439, -32358, -21963, -1851, 19079, 31569, 30092, 15303, -6257, -25049, -32759, -25978, -7704, 13978, 29475, 31933, 20264, -371, -20841, -32092, -29146, -13305, 8421, 26421, 32733, 24564, 5527, -15955, -30378, -31363, -18473, 2589, 22506, 32466, 28063, 11245, -10548, -27675, -32558, -23039, -3327, 17856, 31140, 30647, 16596, -4797, -24068, -32692, -26853, -9135, 12624, 28799, 32232, 21406, 1110, -19677, -31760, -29792, -14645, 6981, 25519}, -{32767, 24564, 4062, -18473, -31760, -29146, -11939, 11245, 28799, 31933, 19079, -3327, -24068, -32759, -25049, -4797, 17856, 31569, 29475, 12624, -10548, -28439, -32092, -19677, 2589, 23559, 32733, 25519, 5527, -17232, -31363, -29792, -13305, 9843, 28063, 32232, 20264, -1851, -23039, -32692, -25978, -6257, 16596, 31140, 30092, 13978, -9135, -27675, -32358, -20841, 1110, 22506, 32633, 26421, 6981, -15955, -30902, -30378, -14645, 8421, 27270, 32466, 21406, -371, -21963, -32558, -26853, -7704, 15303, 30647, 30647, 15303, -7704, -26853, -32558, -21963, -371, 21406, 32466, 27270, 8421, -14645, -30378, -30902, -15955, 6981, 26421, 32633, 22506, 1110, -20841, -32358, -27675, -9135, 13978, 30092, 31140, 16596, -6257, -25978, -32692, -23039, -1851, 20264, 32232, 28063, 9843, -13305, -29792, -31363, -17232, 5527, 25519, 32733, 23559, 2589, -19677, -32092, -28439, -10548, 12624, 29475, 31569, 17856, -4797, -25049, -32759, -24068, -3327, 19079, 31933, 28799, 11245, -11939, -29146, -31760, -18473, 4062, 24564}, -{32767, 23559, 1110, -21963, -32692, -25049, -3327, 20264, 32466, 26421, 5527, -18473, -32092, -27675, -7704, 16596, 31569, 28799, 9843, -14645, -30902, -29792, -11939, 12624, 30092, 30647, 13978, -10548, -29146, -31363, -15955, 8421, 28063, 31933, 17856, -6257, -26853, -32358, -19677, 4062, 25519, 32633, 21406, -1851, -24068, -32759, -23039, -371, 22506, 32733, 24564, 2589, -20841, -32558, -25978, -4797, 19079, 32232, 27270, 6981, -17232, -31760, -28439, -9135, 15303, 31140, 29475, 11245, -13305, -30378, -30378, -13305, 11245, 29475, 31140, 15303, -9135, -28439, -31760, -17232, 6981, 27270, 32232, 19079, -4797, -25978, -32558, -20841, 2589, 24564, 32733, 22506, -371, -23039, -32759, -24068, -1851, 21406, 32633, 25519, 4062, -19677, -32358, -26853, -6257, 17856, 31933, 28063, 8421, -15955, -31363, -29146, -10548, 13978, 30647, 30092, 12624, -11939, -29792, -30902, -14645, 9843, 28799, 31569, 16596, -7704, -27675, -32092, -18473, 5527, 26421, 32466, 20264, -3327, -25049, -32692, -21963, 1110, 23559}, -{32767, 22506, -1851, -25049, -32558, -19677, 5527, 27270, 31933, 16596, -9135, -29146, -30902, -13305, 12624, 30647, 29475, 9843, -15955, -31760, -27675, -6257, 19079, 32466, 25519, 2589, -21963, -32759, -23039, 1110, 24564, 32633, 20264, -4797, -26853, -32092, -17232, 8421, 28799, 31140, 13978, -11939, -30378, -29792, -10548, 15303, 31569, 28063, 6981, -18473, -32358, -25978, -3327, 21406, 32733, 23559, -371, -24068, -32692, -20841, 4062, 26421, 32232, 17856, -7704, -28439, -31363, -14645, 11245, 30092, 30092, 11245, -14645, -31363, -28439, -7704, 17856, 32232, 26421, 4062, -20841, -32692, -24068, -371, 23559, 32733, 21406, -3327, -25978, -32358, -18473, 6981, 28063, 31569, 15303, -10548, -29792, -30378, -11939, 13978, 31140, 28799, 8421, -17232, -32092, -26853, -4797, 20264, 32633, 24564, 1110, -23039, -32759, -21963, 2589, 25519, 32466, 19079, -6257, -27675, -31760, -15955, 9843, 29475, 30647, 12624, -13305, -30902, -29146, -9135, 16596, 31933, 27270, 5527, -19677, -32558, -25049, -1851, 22506}, -{32767, 21406, -4797, -27675, -31363, -13305, 13978, 31569, 27270, 4062, -21963, -32759, -20841, 5527, 28063, 31140, 12624, -14645, -31760, -26853, -3327, 22506, 32733, 20264, -6257, -28439, -30902, -11939, 15303, 31933, 26421, 2589, -23039, -32692, -19677, 6981, 28799, 30647, 11245, -15955, -32092, -25978, -1851, 23559, 32633, 19079, -7704, -29146, -30378, -10548, 16596, 32232, 25519, 1110, -24068, -32558, -18473, 8421, 29475, 30092, 9843, -17232, -32358, -25049, -371, 24564, 32466, 17856, -9135, -29792, -29792, -9135, 17856, 32466, 24564, -371, -25049, -32358, -17232, 9843, 30092, 29475, 8421, -18473, -32558, -24068, 1110, 25519, 32232, 16596, -10548, -30378, -29146, -7704, 19079, 32633, 23559, -1851, -25978, -32092, -15955, 11245, 30647, 28799, 6981, -19677, -32692, -23039, 2589, 26421, 31933, 15303, -11939, -30902, -28439, -6257, 20264, 32733, 22506, -3327, -26853, -31760, -14645, 12624, 31140, 28063, 5527, -20841, -32759, -21963, 4062, 27270, 31569, 13978, -13305, -31363, -27675, -4797, 21406}, -{32767, 20264, -7704, -29792, -29146, -6257, 21406, 32733, 19079, -9135, -30378, -28439, -4797, 22506, 32633, 17856, -10548, -30902, -27675, -3327, 23559, 32466, 16596, -11939, -31363, -26853, -1851, 24564, 32232, 15303, -13305, -31760, -25978, -371, 25519, 31933, 13978, -14645, -32092, -25049, 1110, 26421, 31569, 12624, -15955, -32358, -24068, 2589, 27270, 31140, 11245, -17232, -32558, -23039, 4062, 28063, 30647, 9843, -18473, -32692, -21963, 5527, 28799, 30092, 8421, -19677, -32759, -20841, 6981, 29475, 29475, 6981, -20841, -32759, -19677, 8421, 30092, 28799, 5527, -21963, -32692, -18473, 9843, 30647, 28063, 4062, -23039, -32558, -17232, 11245, 31140, 27270, 2589, -24068, -32358, -15955, 12624, 31569, 26421, 1110, -25049, -32092, -14645, 13978, 31933, 25519, -371, -25978, -31760, -13305, 15303, 32232, 24564, -1851, -26853, -31363, -11939, 16596, 32466, 23559, -3327, -27675, -30902, -10548, 17856, 32633, 22506, -4797, -28439, -30378, -9135, 19079, 32733, 21406, -6257, -29146, -29792, -7704, 20264}, -{32767, 19079, -10548, -31363, -25978, 1110, 27270, 30647, 8421, -20841, -32692, -17232, 12624, 31933, 24564, -3327, -28439, -29792, -6257, 22506, 32466, 15303, -14645, -32358, -23039, 5527, 29475, 28799, 4062, -24068, -32092, -13305, 16596, 32633, 21406, -7704, -30378, -27675, -1851, 25519, 31569, 11245, -18473, -32759, -19677, 9843, 31140, 26421, -371, -26853, -30902, -9135, 20264, 32733, 17856, -11939, -31760, -25049, 2589, 28063, 30092, 6981, -21963, -32558, -15955, 13978, 32232, 23559, -4797, -29146, -29146, -4797, 23559, 32232, 13978, -15955, -32558, -21963, 6981, 30092, 28063, 2589, -25049, -31760, -11939, 17856, 32733, 20264, -9135, -30902, -26853, -371, 26421, 31140, 9843, -19677, -32759, -18473, 11245, 31569, 25519, -1851, -27675, -30378, -7704, 21406, 32633, 16596, -13305, -32092, -24068, 4062, 28799, 29475, 5527, -23039, -32358, -14645, 15303, 32466, 22506, -6257, -29792, -28439, -3327, 24564, 31933, 12624, -17232, -32692, -20841, 8421, 30647, 27270, 1110, -25978, -31363, -10548, 19079}, -{32767, 17856, -13305, -32358, -21963, 8421, 31140, 25519, -3327, -29146, -28439, -1851, 26421, 30647, 6981, -23039, -32092, -11939, 19079, 32733, 16596, -14645, -32558, -20841, 9843, 31569, 24564, -4797, -29792, -27675, -371, 27270, 30092, 5527, -24068, -31760, -10548, 20264, 32633, 15303, -15955, -32692, -19677, 11245, 31933, 23559, -6257, -30378, -26853, 1110, 28063, 29475, 4062, -25049, -31363, -9135, 21406, 32466, 13978, -17232, -32759, -18473, 12624, 32232, 22506, -7704, -30902, -25978, 2589, 28799, 28799, 2589, -25978, -30902, -7704, 22506, 32232, 12624, -18473, -32759, -17232, 13978, 32466, 21406, -9135, -31363, -25049, 4062, 29475, 28063, 1110, -26853, -30378, -6257, 23559, 31933, 11245, -19677, -32692, -15955, 15303, 32633, 20264, -10548, -31760, -24068, 5527, 30092, 27270, -371, -27675, -29792, -4797, 24564, 31569, 9843, -20841, -32558, -14645, 16596, 32733, 19079, -11939, -32092, -23039, 6981, 30647, 26421, -1851, -28439, -29146, -3327, 25519, 31140, 8421, -21963, -32358, -13305, 17856}, -{32767, 16596, -15955, -32759, -17232, 15303, 32733, 17856, -14645, -32692, -18473, 13978, 32633, 19079, -13305, -32558, -19677, 12624, 32466, 20264, -11939, -32358, -20841, 11245, 32232, 21406, -10548, -32092, -21963, 9843, 31933, 22506, -9135, -31760, -23039, 8421, 31569, 23559, -7704, -31363, -24068, 6981, 31140, 24564, -6257, -30902, -25049, 5527, 30647, 25519, -4797, -30378, -25978, 4062, 30092, 26421, -3327, -29792, -26853, 2589, 29475, 27270, -1851, -29146, -27675, 1110, 28799, 28063, -371, -28439, -28439, -371, 28063, 28799, 1110, -27675, -29146, -1851, 27270, 29475, 2589, -26853, -29792, -3327, 26421, 30092, 4062, -25978, -30378, -4797, 25519, 30647, 5527, -25049, -30902, -6257, 24564, 31140, 6981, -24068, -31363, -7704, 23559, 31569, 8421, -23039, -31760, -9135, 22506, 31933, 9843, -21963, -32092, -10548, 21406, 32232, 11245, -20841, -32358, -11939, 20264, 32466, 12624, -19677, -32558, -13305, 19079, 32633, 13978, -18473, -32692, -14645, 17856, 32733, 15303, -17232, -32759, -15955, 16596}, -{32767, 15303, -18473, -32558, -11939, 21406, 31933, 8421, -24068, -30902, -4797, 26421, 29475, 1110, -28439, -27675, 2589, 30092, 25519, -6257, -31363, -23039, 9843, 32232, 20264, -13305, -32692, -17232, 16596, 32733, 13978, -19677, -32358, -10548, 22506, 31569, 6981, -25049, -30378, -3327, 27270, 28799, -371, -29146, -26853, 4062, 30647, 24564, -7704, -31760, -21963, 11245, 32466, 19079, -14645, -32759, -15955, 17856, 32633, 12624, -20841, -32092, -9135, 23559, 31140, 5527, -25978, -29792, -1851, 28063, 28063, -1851, -29792, -25978, 5527, 31140, 23559, -9135, -32092, -20841, 12624, 32633, 17856, -15955, -32759, -14645, 19079, 32466, 11245, -21963, -31760, -7704, 24564, 30647, 4062, -26853, -29146, -371, 28799, 27270, -3327, -30378, -25049, 6981, 31569, 22506, -10548, -32358, -19677, 13978, 32733, 16596, -17232, -32692, -13305, 20264, 32232, 9843, -23039, -31363, -6257, 25519, 30092, 2589, -27675, -28439, 1110, 29475, 26421, -4797, -30902, -24068, 8421, 31933, 21406, -11939, -32558, -18473, 15303}, -{32767, 13978, -20841, -31760, -6257, 26421, 28799, -1851, -30378, -24068, 9843, 32466, 17856, -17232, -32558, -10548, 23559, 30647, 2589, -28439, -26853, 5527, 31569, 21406, -13305, -32759, -14645, 20264, 31933, 6981, -25978, -29146, 1110, 30092, 24564, -9135, -32358, -18473, 16596, 32633, 11245, -23039, -30902, -3327, 28063, 27270, -4797, -31363, -21963, 12624, 32733, 15303, -19677, -32092, -7704, 25519, 29475, -371, -29792, -25049, 8421, 32232, 19079, -15955, -32692, -11939, 22506, 31140, 4062, -27675, -27675, 4062, 31140, 22506, -11939, -32692, -15955, 19079, 32232, 8421, -25049, -29792, -371, 29475, 25519, -7704, -32092, -19677, 15303, 32733, 12624, -21963, -31363, -4797, 27270, 28063, -3327, -30902, -23039, 11245, 32633, 16596, -18473, -32358, -9135, 24564, 30092, 1110, -29146, -25978, 6981, 31933, 20264, -14645, -32759, -13305, 21406, 31569, 5527, -26853, -28439, 2589, 30647, 23559, -10548, -32558, -17232, 17856, 32466, 9843, -24068, -30378, -1851, 28799, 26421, -6257, -31760, -20841, 13978}, -{32767, 12624, -23039, -30378, -371, 30092, 23559, -11939, -32759, -13305, 22506, 30647, 1110, -29792, -24068, 11245, 32733, 13978, -21963, -30902, -1851, 29475, 24564, -10548, -32692, -14645, 21406, 31140, 2589, -29146, -25049, 9843, 32633, 15303, -20841, -31363, -3327, 28799, 25519, -9135, -32558, -15955, 20264, 31569, 4062, -28439, -25978, 8421, 32466, 16596, -19677, -31760, -4797, 28063, 26421, -7704, -32358, -17232, 19079, 31933, 5527, -27675, -26853, 6981, 32232, 17856, -18473, -32092, -6257, 27270, 27270, -6257, -32092, -18473, 17856, 32232, 6981, -26853, -27675, 5527, 31933, 19079, -17232, -32358, -7704, 26421, 28063, -4797, -31760, -19677, 16596, 32466, 8421, -25978, -28439, 4062, 31569, 20264, -15955, -32558, -9135, 25519, 28799, -3327, -31363, -20841, 15303, 32633, 9843, -25049, -29146, 2589, 31140, 21406, -14645, -32692, -10548, 24564, 29475, -1851, -30902, -21963, 13978, 32733, 11245, -24068, -29792, 1110, 30647, 22506, -13305, -32759, -11939, 23559, 30092, -371, -30378, -23039, 12624}, -{32767, 11245, -25049, -28439, 5527, 32232, 16596, -20841, -30902, -371, 30647, 21406, -15955, -32358, -6257, 28063, 25519, -10548, -32759, -11939, 24564, 28799, -4797, -32092, -17232, 20264, 31140, 1110, -30378, -21963, 15303, 32466, 6981, -27675, -25978, 9843, 32733, 12624, -24068, -29146, 4062, 31933, 17856, -19677, -31363, -1851, 30092, 22506, -14645, -32558, -7704, 27270, 26421, -9135, -32692, -13305, 23559, 29475, -3327, -31760, -18473, 19079, 31569, 2589, -29792, -23039, 13978, 32633, 8421, -26853, -26853, 8421, 32633, 13978, -23039, -29792, 2589, 31569, 19079, -18473, -31760, -3327, 29475, 23559, -13305, -32692, -9135, 26421, 27270, -7704, -32558, -14645, 22506, 30092, -1851, -31363, -19677, 17856, 31933, 4062, -29146, -24068, 12624, 32733, 9843, -25978, -27675, 6981, 32466, 15303, -21963, -30378, 1110, 31140, 20264, -17232, -32092, -4797, 28799, 24564, -11939, -32759, -10548, 25519, 28063, -6257, -32358, -15955, 21406, 30647, -371, -30902, -20841, 16596, 32232, 5527, -28439, -25049, 11245}, -{32767, 9843, -26853, -25978, 11245, 32733, 8421, -27675, -25049, 12624, 32633, 6981, -28439, -24068, 13978, 32466, 5527, -29146, -23039, 15303, 32232, 4062, -29792, -21963, 16596, 31933, 2589, -30378, -20841, 17856, 31569, 1110, -30902, -19677, 19079, 31140, -371, -31363, -18473, 20264, 30647, -1851, -31760, -17232, 21406, 30092, -3327, -32092, -15955, 22506, 29475, -4797, -32358, -14645, 23559, 28799, -6257, -32558, -13305, 24564, 28063, -7704, -32692, -11939, 25519, 27270, -9135, -32759, -10548, 26421, 26421, -10548, -32759, -9135, 27270, 25519, -11939, -32692, -7704, 28063, 24564, -13305, -32558, -6257, 28799, 23559, -14645, -32358, -4797, 29475, 22506, -15955, -32092, -3327, 30092, 21406, -17232, -31760, -1851, 30647, 20264, -18473, -31363, -371, 31140, 19079, -19677, -30902, 1110, 31569, 17856, -20841, -30378, 2589, 31933, 16596, -21963, -29792, 4062, 32232, 15303, -23039, -29146, 5527, 32466, 13978, -24068, -28439, 6981, 32633, 12624, -25049, -27675, 8421, 32733, 11245, -25978, -26853, 9843}, -{32767, 8421, -28439, -23039, 16596, 31569, -371, -31760, -15955, 23559, 28063, -9135, -32759, -7704, 28799, 22506, -17232, -31363, 1110, 31933, 15303, -24068, -27675, 9843, 32733, 6981, -29146, -21963, 17856, 31140, -1851, -32092, -14645, 24564, 27270, -10548, -32692, -6257, 29475, 21406, -18473, -30902, 2589, 32232, 13978, -25049, -26853, 11245, 32633, 5527, -29792, -20841, 19079, 30647, -3327, -32358, -13305, 25519, 26421, -11939, -32558, -4797, 30092, 20264, -19677, -30378, 4062, 32466, 12624, -25978, -25978, 12624, 32466, 4062, -30378, -19677, 20264, 30092, -4797, -32558, -11939, 26421, 25519, -13305, -32358, -3327, 30647, 19079, -20841, -29792, 5527, 32633, 11245, -26853, -25049, 13978, 32232, 2589, -30902, -18473, 21406, 29475, -6257, -32692, -10548, 27270, 24564, -14645, -32092, -1851, 31140, 17856, -21963, -29146, 6981, 32733, 9843, -27675, -24068, 15303, 31933, 1110, -31363, -17232, 22506, 28799, -7704, -32759, -9135, 28063, 23559, -15955, -31760, -371, 31569, 16596, -23039, -28439, 8421}, -{32767, 6981, -29792, -19677, 21406, 28799, -9135, -32692, -4797, 30647, 17856, -23039, -27675, 11245, 32466, 2589, -31363, -15955, 24564, 26421, -13305, -32092, -371, 31933, 13978, -25978, -25049, 15303, 31569, -1851, -32358, -11939, 27270, 23559, -17232, -30902, 4062, 32633, 9843, -28439, -21963, 19079, 30092, -6257, -32759, -7704, 29475, 20264, -20841, -29146, 8421, 32733, 5527, -30378, -18473, 22506, 28063, -10548, -32558, -3327, 31140, 16596, -24068, -26853, 12624, 32232, 1110, -31760, -14645, 25519, 25519, -14645, -31760, 1110, 32232, 12624, -26853, -24068, 16596, 31140, -3327, -32558, -10548, 28063, 22506, -18473, -30378, 5527, 32733, 8421, -29146, -20841, 20264, 29475, -7704, -32759, -6257, 30092, 19079, -21963, -28439, 9843, 32633, 4062, -30902, -17232, 23559, 27270, -11939, -32358, -1851, 31569, 15303, -25049, -25978, 13978, 31933, -371, -32092, -13305, 26421, 24564, -15955, -31363, 2589, 32466, 11245, -27675, -23039, 17856, 30647, -4797, -32692, -9135, 28799, 21406, -19677, -29792, 6981}, -{32767, 5527, -30902, -15955, 25519, 24564, -17232, -30378, 6981, 32733, 4062, -31363, -14645, 26421, 23559, -18473, -29792, 8421, 32633, 2589, -31760, -13305, 27270, 22506, -19677, -29146, 9843, 32466, 1110, -32092, -11939, 28063, 21406, -20841, -28439, 11245, 32232, -371, -32358, -10548, 28799, 20264, -21963, -27675, 12624, 31933, -1851, -32558, -9135, 29475, 19079, -23039, -26853, 13978, 31569, -3327, -32692, -7704, 30092, 17856, -24068, -25978, 15303, 31140, -4797, -32759, -6257, 30647, 16596, -25049, -25049, 16596, 30647, -6257, -32759, -4797, 31140, 15303, -25978, -24068, 17856, 30092, -7704, -32692, -3327, 31569, 13978, -26853, -23039, 19079, 29475, -9135, -32558, -1851, 31933, 12624, -27675, -21963, 20264, 28799, -10548, -32358, -371, 32232, 11245, -28439, -20841, 21406, 28063, -11939, -32092, 1110, 32466, 9843, -29146, -19677, 22506, 27270, -13305, -31760, 2589, 32633, 8421, -29792, -18473, 23559, 26421, -14645, -31363, 4062, 32733, 6981, -30378, -17232, 24564, 25519, -15955, -30902, 5527}, -{32767, 4062, -31760, -11939, 28799, 19079, -24068, -25049, 17856, 29475, -10548, -32092, 2589, 32733, 5527, -31363, -13305, 28063, 20264, -23039, -25978, 16596, 30092, -9135, -32358, 1110, 32633, 6981, -30902, -14645, 27270, 21406, -21963, -26853, 15303, 30647, -7704, -32558, -371, 32466, 8421, -30378, -15955, 26421, 22506, -20841, -27675, 13978, 31140, -6257, -32692, -1851, 32232, 9843, -29792, -17232, 25519, 23559, -19677, -28439, 12624, 31569, -4797, -32759, -3327, 31933, 11245, -29146, -18473, 24564, 24564, -18473, -29146, 11245, 31933, -3327, -32759, -4797, 31569, 12624, -28439, -19677, 23559, 25519, -17232, -29792, 9843, 32232, -1851, -32692, -6257, 31140, 13978, -27675, -20841, 22506, 26421, -15955, -30378, 8421, 32466, -371, -32558, -7704, 30647, 15303, -26853, -21963, 21406, 27270, -14645, -30902, 6981, 32633, 1110, -32358, -9135, 30092, 16596, -25978, -23039, 20264, 28063, -13305, -31363, 5527, 32733, 2589, -32092, -10548, 29475, 17856, -25049, -24068, 19079, 28799, -11939, -31760, 4062}, -{32767, 2589, -32358, -7704, 31140, 12624, -29146, -17232, 26421, 21406, -23039, -25049, 19079, 28063, -14645, -30378, 9843, 31933, -4797, -32692, -371, 32633, 5527, -31760, -10548, 30092, 15303, -27675, -19677, 24564, 23559, -20841, -26853, 16596, 29475, -11939, -31363, 6981, 32466, -1851, -32759, -3327, 32232, 8421, -30902, -13305, 28799, 17856, -25978, -21963, 22506, 25519, -18473, -28439, 13978, 30647, -9135, -32092, 4062, 32733, 1110, -32558, -6257, 31569, 11245, -29792, -15955, 27270, 20264, -24068, -24068, 20264, 27270, -15955, -29792, 11245, 31569, -6257, -32558, 1110, 32733, 4062, -32092, -9135, 30647, 13978, -28439, -18473, 25519, 22506, -21963, -25978, 17856, 28799, -13305, -30902, 8421, 32232, -3327, -32759, -1851, 32466, 6981, -31363, -11939, 29475, 16596, -26853, -20841, 23559, 24564, -19677, -27675, 15303, 30092, -10548, -31760, 5527, 32633, -371, -32692, -4797, 31933, 9843, -30378, -14645, 28063, 19079, -25049, -23039, 21406, 26421, -17232, -29146, 12624, 31140, -7704, -32358, 2589}, -{32767, 1110, -32692, -3327, 32466, 5527, -32092, -7704, 31569, 9843, -30902, -11939, 30092, 13978, -29146, -15955, 28063, 17856, -26853, -19677, 25519, 21406, -24068, -23039, 22506, 24564, -20841, -25978, 19079, 27270, -17232, -28439, 15303, 29475, -13305, -30378, 11245, 31140, -9135, -31760, 6981, 32232, -4797, -32558, 2589, 32733, -371, -32759, -1851, 32633, 4062, -32358, -6257, 31933, 8421, -31363, -10548, 30647, 12624, -29792, -14645, 28799, 16596, -27675, -18473, 26421, 20264, -25049, -21963, 23559, 23559, -21963, -25049, 20264, 26421, -18473, -27675, 16596, 28799, -14645, -29792, 12624, 30647, -10548, -31363, 8421, 31933, -6257, -32358, 4062, 32633, -1851, -32759, -371, 32733, 2589, -32558, -4797, 32232, 6981, -31760, -9135, 31140, 11245, -30378, -13305, 29475, 15303, -28439, -17232, 27270, 19079, -25978, -20841, 24564, 22506, -23039, -24068, 21406, 25519, -19677, -26853, 17856, 28063, -15955, -29146, 13978, 30092, -11939, -30902, 9843, 31569, -7704, -32092, 5527, 32466, -3327, -32692, 1110}, -{32767, -371, -32759, 1110, 32733, -1851, -32692, 2589, 32633, -3327, -32558, 4062, 32466, -4797, -32358, 5527, 32232, -6257, -32092, 6981, 31933, -7704, -31760, 8421, 31569, -9135, -31363, 9843, 31140, -10548, -30902, 11245, 30647, -11939, -30378, 12624, 30092, -13305, -29792, 13978, 29475, -14645, -29146, 15303, 28799, -15955, -28439, 16596, 28063, -17232, -27675, 17856, 27270, -18473, -26853, 19079, 26421, -19677, -25978, 20264, 25519, -20841, -25049, 21406, 24564, -21963, -24068, 22506, 23559, -23039, -23039, 23559, 22506, -24068, -21963, 24564, 21406, -25049, -20841, 25519, 20264, -25978, -19677, 26421, 19079, -26853, -18473, 27270, 17856, -27675, -17232, 28063, 16596, -28439, -15955, 28799, 15303, -29146, -14645, 29475, 13978, -29792, -13305, 30092, 12624, -30378, -11939, 30647, 11245, -30902, -10548, 31140, 9843, -31363, -9135, 31569, 8421, -31760, -7704, 31933, 6981, -32092, -6257, 32232, 5527, -32358, -4797, 32466, 4062, -32558, -3327, 32633, 2589, -32692, -1851, 32733, 1110, -32759, -371}, -{32767, -1851, -32558, 5527, 31933, -9135, -30902, 12624, 29475, -15955, -27675, 19079, 25519, -21963, -23039, 24564, 20264, -26853, -17232, 28799, 13978, -30378, -10548, 31569, 6981, -32358, -3327, 32733, -371, -32692, 4062, 32232, -7704, -31363, 11245, 30092, -14645, -28439, 17856, 26421, -20841, -24068, 23559, 21406, -25978, -18473, 28063, 15303, -29792, -11939, 31140, 8421, -32092, -4797, 32633, 1110, -32759, 2589, 32466, -6257, -31760, 9843, 30647, -13305, -29146, 16596, 27270, -19677, -25049, 22506, 22506, -25049, -19677, 27270, 16596, -29146, -13305, 30647, 9843, -31760, -6257, 32466, 2589, -32759, 1110, 32633, -4797, -32092, 8421, 31140, -11939, -29792, 15303, 28063, -18473, -25978, 21406, 23559, -24068, -20841, 26421, 17856, -28439, -14645, 30092, 11245, -31363, -7704, 32232, 4062, -32692, -371, 32733, -3327, -32358, 6981, 31569, -10548, -30378, 13978, 28799, -17232, -26853, 20264, 24564, -23039, -21963, 25519, 19079, -27675, -15955, 29475, 12624, -30902, -9135, 31933, 5527, -32558, -1851}, -{32767, -3327, -32092, 9843, 30092, -15955, -26853, 21406, 22506, -25978, -17232, 29475, 11245, -31760, -4797, 32733, -1851, -32358, 8421, 30647, -14645, -27675, 20264, 23559, -25049, -18473, 28799, 12624, -31363, -6257, 32633, -371, -32558, 6981, 31140, -13305, -28439, 19079, 24564, -24068, -19677, 28063, 13978, -30902, -7704, 32466, 1110, -32692, 5527, 31569, -11939, -29146, 17856, 25519, -23039, -20841, 27270, 15303, -30378, -9135, 32232, 2589, -32759, 4062, 31933, -10548, -29792, 16596, 26421, -21963, -21963, 26421, 16596, -29792, -10548, 31933, 4062, -32759, 2589, 32232, -9135, -30378, 15303, 27270, -20841, -23039, 25519, 17856, -29146, -11939, 31569, 5527, -32692, 1110, 32466, -7704, -30902, 13978, 28063, -19677, -24068, 24564, 19079, -28439, -13305, 31140, 6981, -32558, -371, 32633, -6257, -31363, 12624, 28799, -18473, -25049, 23559, 20264, -27675, -14645, 30647, 8421, -32358, -1851, 32733, -4797, -31760, 11245, 29475, -17232, -25978, 22506, 21406, -26853, -15955, 30092, 9843, -32092, -3327}, -{32767, -4797, -31363, 13978, 27270, -21963, -20841, 28063, 12624, -31760, -3327, 32733, -6257, -30902, 15303, 26421, -23039, -19677, 28799, 11245, -32092, -1851, 32633, -7704, -30378, 16596, 25519, -24068, -18473, 29475, 9843, -32358, -371, 32466, -9135, -29792, 17856, 24564, -25049, -17232, 30092, 8421, -32558, 1110, 32232, -10548, -29146, 19079, 23559, -25978, -15955, 30647, 6981, -32692, 2589, 31933, -11939, -28439, 20264, 22506, -26853, -14645, 31140, 5527, -32759, 4062, 31569, -13305, -27675, 21406, 21406, -27675, -13305, 31569, 4062, -32759, 5527, 31140, -14645, -26853, 22506, 20264, -28439, -11939, 31933, 2589, -32692, 6981, 30647, -15955, -25978, 23559, 19079, -29146, -10548, 32232, 1110, -32558, 8421, 30092, -17232, -25049, 24564, 17856, -29792, -9135, 32466, -371, -32358, 9843, 29475, -18473, -24068, 25519, 16596, -30378, -7704, 32633, -1851, -32092, 11245, 28799, -19677, -23039, 26421, 15303, -30902, -6257, 32733, -3327, -31760, 12624, 28063, -20841, -21963, 27270, 13978, -31363, -4797}, -{32767, -6257, -30378, 17856, 23559, -26853, -13305, 31933, 1110, -32358, 11245, 28063, -21963, -19677, 29475, 8421, -32692, 4062, 31140, -15955, -25049, 25519, 15303, -31363, -3327, 32633, -9135, -29146, 20264, 21406, -28439, -10548, 32466, -1851, -31760, 13978, 26421, -24068, -17232, 30647, 5527, -32759, 6981, 30092, -18473, -23039, 27270, 12624, -32092, -371, 32232, -11939, -27675, 22506, 19079, -29792, -7704, 32733, -4797, -30902, 16596, 24564, -25978, -14645, 31569, 2589, -32558, 9843, 28799, -20841, -20841, 28799, 9843, -32558, 2589, 31569, -14645, -25978, 24564, 16596, -30902, -4797, 32733, -7704, -29792, 19079, 22506, -27675, -11939, 32232, -371, -32092, 12624, 27270, -23039, -18473, 30092, 6981, -32759, 5527, 30647, -17232, -24068, 26421, 13978, -31760, -1851, 32466, -10548, -28439, 21406, 20264, -29146, -9135, 32633, -3327, -31363, 15303, 25519, -25049, -15955, 31140, 4062, -32692, 8421, 29475, -19677, -21963, 28063, 11245, -32358, 1110, 31933, -13305, -26853, 23559, 17856, -30378, -6257}, -{32767, -7704, -29146, 21406, 19079, -30378, -4797, 32633, -10548, -27675, 23559, 16596, -31363, -1851, 32232, -13305, -25978, 25519, 13978, -32092, 1110, 31569, -15955, -24068, 27270, 11245, -32558, 4062, 30647, -18473, -21963, 28799, 8421, -32759, 6981, 29475, -20841, -19677, 30092, 5527, -32692, 9843, 28063, -23039, -17232, 31140, 2589, -32358, 12624, 26421, -25049, -14645, 31933, -371, -31760, 15303, 24564, -26853, -11939, 32466, -3327, -30902, 17856, 22506, -28439, -9135, 32733, -6257, -29792, 20264, 20264, -29792, -6257, 32733, -9135, -28439, 22506, 17856, -30902, -3327, 32466, -11939, -26853, 24564, 15303, -31760, -371, 31933, -14645, -25049, 26421, 12624, -32358, 2589, 31140, -17232, -23039, 28063, 9843, -32692, 5527, 30092, -19677, -20841, 29475, 6981, -32759, 8421, 28799, -21963, -18473, 30647, 4062, -32558, 11245, 27270, -24068, -15955, 31569, 1110, -32092, 13978, 25519, -25978, -13305, 32232, -1851, -31363, 16596, 23559, -27675, -10548, 32633, -4797, -30378, 19079, 21406, -29146, -7704}, -{32767, -9135, -27675, 24564, 13978, -32358, 4062, 30092, -20841, -18473, 31140, 1110, -31760, 16596, 22506, -29146, -6257, 32633, -11939, -25978, 26421, 11245, -32692, 6981, 28799, -23039, -15955, 31933, -1851, -30902, 19079, 20264, -30378, -3327, 32232, -14645, -24068, 28063, 8421, -32759, 9843, 27270, -25049, -13305, 32466, -4797, -29792, 21406, 17856, -31363, -371, 31569, -17232, -21963, 29475, 5527, -32558, 12624, 25519, -26853, -10548, 32733, -7704, -28439, 23559, 15303, -32092, 2589, 30647, -19677, -19677, 30647, 2589, -32092, 15303, 23559, -28439, -7704, 32733, -10548, -26853, 25519, 12624, -32558, 5527, 29475, -21963, -17232, 31569, -371, -31363, 17856, 21406, -29792, -4797, 32466, -13305, -25049, 27270, 9843, -32759, 8421, 28063, -24068, -14645, 32232, -3327, -30378, 20264, 19079, -30902, -1851, 31933, -15955, -23039, 28799, 6981, -32692, 11245, 26421, -25978, -11939, 32633, -6257, -29146, 22506, 16596, -31760, 1110, 31140, -18473, -20841, 30092, 4062, -32358, 13978, 24564, -27675, -9135}, -{32767, -10548, -25978, 27270, 8421, -32692, 12624, 24564, -28439, -6257, 32466, -14645, -23039, 29475, 4062, -32092, 16596, 21406, -30378, -1851, 31569, -18473, -19677, 31140, -371, -30902, 20264, 17856, -31760, 2589, 30092, -21963, -15955, 32232, -4797, -29146, 23559, 13978, -32558, 6981, 28063, -25049, -11939, 32733, -9135, -26853, 26421, 9843, -32759, 11245, 25519, -27675, -7704, 32633, -13305, -24068, 28799, 5527, -32358, 15303, 22506, -29792, -3327, 31933, -17232, -20841, 30647, 1110, -31363, 19079, 19079, -31363, 1110, 30647, -20841, -17232, 31933, -3327, -29792, 22506, 15303, -32358, 5527, 28799, -24068, -13305, 32633, -7704, -27675, 25519, 11245, -32759, 9843, 26421, -26853, -9135, 32733, -11939, -25049, 28063, 6981, -32558, 13978, 23559, -29146, -4797, 32232, -15955, -21963, 30092, 2589, -31760, 17856, 20264, -30902, -371, 31140, -19677, -18473, 31569, -1851, -30378, 21406, 16596, -32092, 4062, 29475, -23039, -14645, 32466, -6257, -28439, 24564, 12624, -32692, 8421, 27270, -25978, -10548}, -{32767, -11939, -24068, 29475, 2589, -31363, 20264, 16596, -32358, 6981, 27270, -26853, -7704, 32466, -15955, -20841, 31140, -1851, -29792, 23559, 12624, -32759, 11245, 24564, -29146, -3327, 31569, -19677, -17232, 32232, -6257, -27675, 26421, 8421, -32558, 15303, 21406, -30902, 1110, 30092, -23039, -13305, 32733, -10548, -25049, 28799, 4062, -31760, 19079, 17856, -32092, 5527, 28063, -25978, -9135, 32633, -14645, -21963, 30647, -371, -30378, 22506, 13978, -32692, 9843, 25519, -28439, -4797, 31933, -18473, -18473, 31933, -4797, -28439, 25519, 9843, -32692, 13978, 22506, -30378, -371, 30647, -21963, -14645, 32633, -9135, -25978, 28063, 5527, -32092, 17856, 19079, -31760, 4062, 28799, -25049, -10548, 32733, -13305, -23039, 30092, 1110, -30902, 21406, 15303, -32558, 8421, 26421, -27675, -6257, 32232, -17232, -19677, 31569, -3327, -29146, 24564, 11245, -32759, 12624, 23559, -29792, -1851, 31140, -20841, -15955, 32466, -7704, -26853, 27270, 6981, -32358, 16596, 20264, -31363, 2589, 29475, -24068, -11939}, -{32767, -13305, -21963, 31140, -3327, -28439, 26421, 6981, -32092, 19079, 16596, -32558, 9843, 24564, -29792, -371, 30092, -24068, -10548, 32633, -15955, -19677, 31933, -6257, -26853, 28063, 4062, -31363, 21406, 13978, -32759, 12624, 22506, -30902, 2589, 28799, -25978, -7704, 32232, -18473, -17232, 32466, -9135, -25049, 29475, 1110, -30378, 23559, 11245, -32692, 15303, 20264, -31760, 5527, 27270, -27675, -4797, 31569, -20841, -14645, 32733, -11939, -23039, 30647, -1851, -29146, 25519, 8421, -32358, 17856, 17856, -32358, 8421, 25519, -29146, -1851, 30647, -23039, -11939, 32733, -14645, -20841, 31569, -4797, -27675, 27270, 5527, -31760, 20264, 15303, -32692, 11245, 23559, -30378, 1110, 29475, -25049, -9135, 32466, -17232, -18473, 32232, -7704, -25978, 28799, 2589, -30902, 22506, 12624, -32759, 13978, 21406, -31363, 4062, 28063, -26853, -6257, 31933, -19677, -15955, 32633, -10548, -24068, 30092, -371, -29792, 24564, 9843, -32558, 16596, 19079, -32092, 6981, 26421, -28439, -3327, 31140, -21963, -13305}, -{32767, -14645, -19677, 32232, -9135, -24068, 30647, -3327, -27675, 28063, 2589, -30378, 24564, 8421, -32092, 20264, 13978, -32759, 15303, 19079, -32358, 9843, 23559, -30902, 4062, 27270, -28439, -1851, 30092, -25049, -7704, 31933, -20841, -13305, 32733, -15955, -18473, 32466, -10548, -23039, 31140, -4797, -26853, 28799, 1110, -29792, 25519, 6981, -31760, 21406, 12624, -32692, 16596, 17856, -32558, 11245, 22506, -31363, 5527, 26421, -29146, -371, 29475, -25978, -6257, 31569, -21963, -11939, 32633, -17232, -17232, 32633, -11939, -21963, 31569, -6257, -25978, 29475, -371, -29146, 26421, 5527, -31363, 22506, 11245, -32558, 17856, 16596, -32692, 12624, 21406, -31760, 6981, 25519, -29792, 1110, 28799, -26853, -4797, 31140, -23039, -10548, 32466, -18473, -15955, 32733, -13305, -20841, 31933, -7704, -25049, 30092, -1851, -28439, 27270, 4062, -30902, 23559, 9843, -32358, 19079, 15303, -32759, 13978, 20264, -32092, 8421, 24564, -30378, 2589, 28063, -27675, -3327, 30647, -24068, -9135, 32232, -19677, -14645}, -{32767, -15955, -17232, 32733, -14645, -18473, 32633, -13305, -19677, 32466, -11939, -20841, 32232, -10548, -21963, 31933, -9135, -23039, 31569, -7704, -24068, 31140, -6257, -25049, 30647, -4797, -25978, 30092, -3327, -26853, 29475, -1851, -27675, 28799, -371, -28439, 28063, 1110, -29146, 27270, 2589, -29792, 26421, 4062, -30378, 25519, 5527, -30902, 24564, 6981, -31363, 23559, 8421, -31760, 22506, 9843, -32092, 21406, 11245, -32358, 20264, 12624, -32558, 19079, 13978, -32692, 17856, 15303, -32759, 16596, 16596, -32759, 15303, 17856, -32692, 13978, 19079, -32558, 12624, 20264, -32358, 11245, 21406, -32092, 9843, 22506, -31760, 8421, 23559, -31363, 6981, 24564, -30902, 5527, 25519, -30378, 4062, 26421, -29792, 2589, 27270, -29146, 1110, 28063, -28439, -371, 28799, -27675, -1851, 29475, -26853, -3327, 30092, -25978, -4797, 30647, -25049, -6257, 31140, -24068, -7704, 31569, -23039, -9135, 31933, -21963, -10548, 32232, -20841, -11939, 32466, -19677, -13305, 32633, -18473, -14645, 32733, -17232, -15955}, -{32767, -17232, -14645, 32633, -19677, -11939, 32232, -21963, -9135, 31569, -24068, -6257, 30647, -25978, -3327, 29475, -27675, -371, 28063, -29146, 2589, 26421, -30378, 5527, 24564, -31363, 8421, 22506, -32092, 11245, 20264, -32558, 13978, 17856, -32759, 16596, 15303, -32692, 19079, 12624, -32358, 21406, 9843, -31760, 23559, 6981, -30902, 25519, 4062, -29792, 27270, 1110, -28439, 28799, -1851, -26853, 30092, -4797, -25049, 31140, -7704, -23039, 31933, -10548, -20841, 32466, -13305, -18473, 32733, -15955, -15955, 32733, -18473, -13305, 32466, -20841, -10548, 31933, -23039, -7704, 31140, -25049, -4797, 30092, -26853, -1851, 28799, -28439, 1110, 27270, -29792, 4062, 25519, -30902, 6981, 23559, -31760, 9843, 21406, -32358, 12624, 19079, -32692, 15303, 16596, -32759, 17856, 13978, -32558, 20264, 11245, -32092, 22506, 8421, -31363, 24564, 5527, -30378, 26421, 2589, -29146, 28063, -371, -27675, 29475, -3327, -25978, 30647, -6257, -24068, 31569, -9135, -21963, 32232, -11939, -19677, 32633, -14645, -17232}, -{32767, -18473, -11939, 31933, -24068, -4797, 29475, -28439, 2589, 25519, -31363, 9843, 20264, -32692, 16596, 13978, -32358, 22506, 6981, -30378, 27270, -371, -26853, 30647, -7704, -21963, 32466, -14645, -15955, 32633, -20841, -9135, 31140, -25978, -1851, 28063, -29792, 5527, 23559, -32092, 12624, 17856, -32759, 19079, 11245, -31760, 24564, 4062, -29146, 28799, -3327, -25049, 31569, -10548, -19677, 32733, -17232, -13305, 32232, -23039, -6257, 30092, -27675, 1110, 26421, -30902, 8421, 21406, -32558, 15303, 15303, -32558, 21406, 8421, -30902, 26421, 1110, -27675, 30092, -6257, -23039, 32232, -13305, -17232, 32733, -19677, -10548, 31569, -25049, -3327, 28799, -29146, 4062, 24564, -31760, 11245, 19079, -32759, 17856, 12624, -32092, 23559, 5527, -29792, 28063, -1851, -25978, 31140, -9135, -20841, 32633, -15955, -14645, 32466, -21963, -7704, 30647, -26853, -371, 27270, -30378, 6981, 22506, -32358, 13978, 16596, -32692, 20264, 9843, -31363, 25519, 2589, -28439, 29475, -4797, -24068, 31933, -11939, -18473}, -{32767, -19677, -9135, 30647, -27675, 2589, 24564, -32092, 13978, 15303, -32358, 23559, 4062, -28439, 30092, -7704, -20841, 32733, -18473, -10548, 31140, -26853, 1110, 25519, -31760, 12624, 16596, -32558, 22506, 5527, -29146, 29475, -6257, -21963, 32633, -17232, -11939, 31569, -25978, -371, 26421, -31363, 11245, 17856, -32692, 21406, 6981, -29792, 28799, -4797, -23039, 32466, -15955, -13305, 31933, -25049, -1851, 27270, -30902, 9843, 19079, -32759, 20264, 8421, -30378, 28063, -3327, -24068, 32232, -14645, -14645, 32232, -24068, -3327, 28063, -30378, 8421, 20264, -32759, 19079, 9843, -30902, 27270, -1851, -25049, 31933, -13305, -15955, 32466, -23039, -4797, 28799, -29792, 6981, 21406, -32692, 17856, 11245, -31363, 26421, -371, -25978, 31569, -11939, -17232, 32633, -21963, -6257, 29475, -29146, 5527, 22506, -32558, 16596, 12624, -31760, 25519, 1110, -26853, 31140, -10548, -18473, 32733, -20841, -7704, 30092, -28439, 4062, 23559, -32358, 15303, 13978, -32092, 24564, 2589, -27675, 30647, -9135, -19677}, -{32767, -20841, -6257, 28799, -30378, 9843, 17856, -32558, 23559, 2589, -26853, 31569, -13305, -14645, 31933, -25978, 1110, 24564, -32358, 16596, 11245, -30902, 28063, -4797, -21963, 32733, -19677, -7704, 29475, -29792, 8421, 19079, -32692, 22506, 4062, -27675, 31140, -11939, -15955, 32232, -25049, -371, 25519, -32092, 15303, 12624, -31363, 27270, -3327, -23039, 32633, -18473, -9135, 30092, -29146, 6981, 20264, -32759, 21406, 5527, -28439, 30647, -10548, -17232, 32466, -24068, -1851, 26421, -31760, 13978, 13978, -31760, 26421, -1851, -24068, 32466, -17232, -10548, 30647, -28439, 5527, 21406, -32759, 20264, 6981, -29146, 30092, -9135, -18473, 32633, -23039, -3327, 27270, -31363, 12624, 15303, -32092, 25519, -371, -25049, 32232, -15955, -11939, 31140, -27675, 4062, 22506, -32692, 19079, 8421, -29792, 29475, -7704, -19677, 32733, -21963, -4797, 28063, -30902, 11245, 16596, -32358, 24564, 1110, -25978, 31933, -14645, -13305, 31569, -26853, 2589, 23559, -32558, 17856, 9843, -30378, 28799, -6257, -20841}, -{32767, -21963, -3327, 26421, -32092, 16596, 9843, -29792, 30092, -10548, -15955, 31933, -26853, 4062, 21406, -32759, 22506, 2589, -25978, 32232, -17232, -9135, 29475, -30378, 11245, 15303, -31760, 27270, -4797, -20841, 32733, -23039, -1851, 25519, -32358, 17856, 8421, -29146, 30647, -11939, -14645, 31569, -27675, 5527, 20264, -32692, 23559, 1110, -25049, 32466, -18473, -7704, 28799, -30902, 12624, 13978, -31363, 28063, -6257, -19677, 32633, -24068, -371, 24564, -32558, 19079, 6981, -28439, 31140, -13305, -13305, 31140, -28439, 6981, 19079, -32558, 24564, -371, -24068, 32633, -19677, -6257, 28063, -31363, 13978, 12624, -30902, 28799, -7704, -18473, 32466, -25049, 1110, 23559, -32692, 20264, 5527, -27675, 31569, -14645, -11939, 30647, -29146, 8421, 17856, -32358, 25519, -1851, -23039, 32733, -20841, -4797, 27270, -31760, 15303, 11245, -30378, 29475, -9135, -17232, 32232, -25978, 2589, 22506, -32759, 21406, 4062, -26853, 31933, -15955, -10548, 30092, -29792, 9843, 16596, -32092, 26421, -3327, -21963}, -{32767, -23039, -371, 23559, -32759, 22506, 1110, -24068, 32733, -21963, -1851, 24564, -32692, 21406, 2589, -25049, 32633, -20841, -3327, 25519, -32558, 20264, 4062, -25978, 32466, -19677, -4797, 26421, -32358, 19079, 5527, -26853, 32232, -18473, -6257, 27270, -32092, 17856, 6981, -27675, 31933, -17232, -7704, 28063, -31760, 16596, 8421, -28439, 31569, -15955, -9135, 28799, -31363, 15303, 9843, -29146, 31140, -14645, -10548, 29475, -30902, 13978, 11245, -29792, 30647, -13305, -11939, 30092, -30378, 12624, 12624, -30378, 30092, -11939, -13305, 30647, -29792, 11245, 13978, -30902, 29475, -10548, -14645, 31140, -29146, 9843, 15303, -31363, 28799, -9135, -15955, 31569, -28439, 8421, 16596, -31760, 28063, -7704, -17232, 31933, -27675, 6981, 17856, -32092, 27270, -6257, -18473, 32232, -26853, 5527, 19079, -32358, 26421, -4797, -19677, 32466, -25978, 4062, 20264, -32558, 25519, -3327, -20841, 32633, -25049, 2589, 21406, -32692, 24564, -1851, -21963, 32733, -24068, 1110, 22506, -32759, 23559, -371, -23039}, -{32767, -24068, 2589, 20264, -32358, 27270, -7704, -15955, 31140, -29792, 12624, 11245, -29146, 31569, -17232, -6257, 26421, -32558, 21406, 1110, -23039, 32733, -25049, 4062, 19079, -32092, 28063, -9135, -14645, 30647, -30378, 13978, 9843, -28439, 31933, -18473, -4797, 25519, -32692, 22506, -371, -21963, 32633, -25978, 5527, 17856, -31760, 28799, -10548, -13305, 30092, -30902, 15303, 8421, -27675, 32232, -19677, -3327, 24564, -32759, 23559, -1851, -20841, 32466, -26853, 6981, 16596, -31363, 29475, -11939, -11939, 29475, -31363, 16596, 6981, -26853, 32466, -20841, -1851, 23559, -32759, 24564, -3327, -19677, 32232, -27675, 8421, 15303, -30902, 30092, -13305, -10548, 28799, -31760, 17856, 5527, -25978, 32633, -21963, -371, 22506, -32692, 25519, -4797, -18473, 31933, -28439, 9843, 13978, -30378, 30647, -14645, -9135, 28063, -32092, 19079, 4062, -25049, 32733, -23039, 1110, 21406, -32558, 26421, -6257, -17232, 31569, -29146, 11245, 12624, -29792, 31140, -15955, -7704, 27270, -32358, 20264, 2589, -24068}, -{32767, -25049, 5527, 16596, -30902, 30647, -15955, -6257, 25519, -32759, 24564, -4797, -17232, 31140, -30378, 15303, 6981, -25978, 32733, -24068, 4062, 17856, -31363, 30092, -14645, -7704, 26421, -32692, 23559, -3327, -18473, 31569, -29792, 13978, 8421, -26853, 32633, -23039, 2589, 19079, -31760, 29475, -13305, -9135, 27270, -32558, 22506, -1851, -19677, 31933, -29146, 12624, 9843, -27675, 32466, -21963, 1110, 20264, -32092, 28799, -11939, -10548, 28063, -32358, 21406, -371, -20841, 32232, -28439, 11245, 11245, -28439, 32232, -20841, -371, 21406, -32358, 28063, -10548, -11939, 28799, -32092, 20264, 1110, -21963, 32466, -27675, 9843, 12624, -29146, 31933, -19677, -1851, 22506, -32558, 27270, -9135, -13305, 29475, -31760, 19079, 2589, -23039, 32633, -26853, 8421, 13978, -29792, 31569, -18473, -3327, 23559, -32692, 26421, -7704, -14645, 30092, -31363, 17856, 4062, -24068, 32733, -25978, 6981, 15303, -30378, 31140, -17232, -4797, 24564, -32759, 25519, -6257, -15955, 30647, -30902, 16596, 5527, -25049}, -{32767, -25978, 8421, 12624, -28439, 32466, -23039, 4062, 16596, -30378, 31569, -19677, -371, 20264, -31760, 30092, -15955, -4797, 23559, -32558, 28063, -11939, -9135, 26421, -32759, 25519, -7704, -13305, 28799, -32358, 22506, -3327, -17232, 30647, -31363, 19079, 1110, -20841, 31933, -29792, 15303, 5527, -24068, 32633, -27675, 11245, 9843, -26853, 32733, -25049, 6981, 13978, -29146, 32232, -21963, 2589, 17856, -30902, 31140, -18473, -1851, 21406, -32092, 29475, -14645, -6257, 24564, -32692, 27270, -10548, -10548, 27270, -32692, 24564, -6257, -14645, 29475, -32092, 21406, -1851, -18473, 31140, -30902, 17856, 2589, -21963, 32232, -29146, 13978, 6981, -25049, 32733, -26853, 9843, 11245, -27675, 32633, -24068, 5527, 15303, -29792, 31933, -20841, 1110, 19079, -31363, 30647, -17232, -3327, 22506, -32358, 28799, -13305, -7704, 25519, -32759, 26421, -9135, -11939, 28063, -32558, 23559, -4797, -15955, 30092, -31760, 20264, -371, -19677, 31569, -30378, 16596, 4062, -23039, 32466, -28439, 12624, 8421, -25978}, -{32767, -26853, 11245, 8421, -25049, 32633, -28439, 13978, 5527, -23039, 32232, -29792, 16596, 2589, -20841, 31569, -30902, 19079, -371, -18473, 30647, -31760, 21406, -3327, -15955, 29475, -32358, 23559, -6257, -13305, 28063, -32692, 25519, -9135, -10548, 26421, -32759, 27270, -11939, -7704, 24564, -32558, 28799, -14645, -4797, 22506, -32092, 30092, -17232, -1851, 20264, -31363, 31140, -19677, 1110, 17856, -30378, 31933, -21963, 4062, 15303, -29146, 32466, -24068, 6981, 12624, -27675, 32733, -25978, 9843, 9843, -25978, 32733, -27675, 12624, 6981, -24068, 32466, -29146, 15303, 4062, -21963, 31933, -30378, 17856, 1110, -19677, 31140, -31363, 20264, -1851, -17232, 30092, -32092, 22506, -4797, -14645, 28799, -32558, 24564, -7704, -11939, 27270, -32759, 26421, -10548, -9135, 25519, -32692, 28063, -13305, -6257, 23559, -32358, 29475, -15955, -3327, 21406, -31760, 30647, -18473, -371, 19079, -30902, 31569, -20841, 2589, 16596, -29792, 32232, -23039, 5527, 13978, -28439, 32633, -25049, 8421, 11245, -26853}, -{32767, -27675, 13978, 4062, -20841, 31140, -31760, 22506, -6257, -11939, 26421, -32692, 28799, -15955, -1851, 19079, -30378, 32232, -24068, 8421, 9843, -25049, 32466, -29792, 17856, -371, -17232, 29475, -32558, 25519, -10548, -7704, 23559, -32092, 30647, -19677, 2589, 15303, -28439, 32733, -26853, 12624, 5527, -21963, 31569, -31363, 21406, -4797, -13305, 27270, -32759, 28063, -14645, -3327, 20264, -30902, 31933, -23039, 6981, 11245, -25978, 32633, -29146, 16596, 1110, -18473, 30092, -32358, 24564, -9135, -9135, 24564, -32358, 30092, -18473, 1110, 16596, -29146, 32633, -25978, 11245, 6981, -23039, 31933, -30902, 20264, -3327, -14645, 28063, -32759, 27270, -13305, -4797, 21406, -31363, 31569, -21963, 5527, 12624, -26853, 32733, -28439, 15303, 2589, -19677, 30647, -32092, 23559, -7704, -10548, 25519, -32558, 29475, -17232, -371, 17856, -29792, 32466, -25049, 9843, 8421, -24068, 32232, -30378, 19079, -1851, -15955, 28799, -32692, 26421, -11939, -6257, 22506, -31760, 31140, -20841, 4062, 13978, -27675}, -{32767, -28439, 16596, -371, -15955, 28063, -32759, 28799, -17232, 1110, 15303, -27675, 32733, -29146, 17856, -1851, -14645, 27270, -32692, 29475, -18473, 2589, 13978, -26853, 32633, -29792, 19079, -3327, -13305, 26421, -32558, 30092, -19677, 4062, 12624, -25978, 32466, -30378, 20264, -4797, -11939, 25519, -32358, 30647, -20841, 5527, 11245, -25049, 32232, -30902, 21406, -6257, -10548, 24564, -32092, 31140, -21963, 6981, 9843, -24068, 31933, -31363, 22506, -7704, -9135, 23559, -31760, 31569, -23039, 8421, 8421, -23039, 31569, -31760, 23559, -9135, -7704, 22506, -31363, 31933, -24068, 9843, 6981, -21963, 31140, -32092, 24564, -10548, -6257, 21406, -30902, 32232, -25049, 11245, 5527, -20841, 30647, -32358, 25519, -11939, -4797, 20264, -30378, 32466, -25978, 12624, 4062, -19677, 30092, -32558, 26421, -13305, -3327, 19079, -29792, 32633, -26853, 13978, 2589, -18473, 29475, -32692, 27270, -14645, -1851, 17856, -29146, 32733, -27675, 15303, 1110, -17232, 28799, -32759, 28063, -15955, -371, 16596, -28439}, -{32767, -29146, 19079, -4797, -10548, 23559, -31363, 32232, -25978, 13978, 1110, -15955, 27270, -32558, 30647, -21963, 8421, 6981, -20841, 30092, -32692, 28063, -17232, 2589, 12624, -25049, 31933, -31760, 24564, -11939, -3327, 17856, -28439, 32733, -29792, 20264, -6257, -9135, 22506, -30902, 32466, -26853, 15303, -371, -14645, 26421, -32358, 31140, -23039, 9843, 5527, -19677, 29475, -32759, 28799, -18473, 4062, 11245, -24068, 31569, -32092, 25519, -13305, -1851, 16596, -27675, 32633, -30378, 21406, -7704, -7704, 21406, -30378, 32633, -27675, 16596, -1851, -13305, 25519, -32092, 31569, -24068, 11245, 4062, -18473, 28799, -32759, 29475, -19677, 5527, 9843, -23039, 31140, -32358, 26421, -14645, -371, 15303, -26853, 32466, -30902, 22506, -9135, -6257, 20264, -29792, 32733, -28439, 17856, -3327, -11939, 24564, -31760, 31933, -25049, 12624, 2589, -17232, 28063, -32692, 30092, -20841, 6981, 8421, -21963, 30647, -32558, 27270, -15955, 1110, 13978, -25978, 32232, -31363, 23559, -10548, -4797, 19079, -29146}, -{32767, -29792, 21406, -9135, -4797, 17856, -27675, 32466, -31363, 24564, -13305, -371, 13978, -25049, 31569, -32358, 27270, -17232, 4062, 9843, -21963, 30092, -32759, 29475, -20841, 8421, 5527, -18473, 28063, -32558, 31140, -24068, 12624, 1110, -14645, 25519, -31760, 32232, -26853, 16596, -3327, -10548, 22506, -30378, 32733, -29146, 20264, -7704, -6257, 19079, -28439, 32633, -30902, 23559, -11939, -1851, 15303, -25978, 31933, -32092, 26421, -15955, 2589, 11245, -23039, 30647, -32692, 28799, -19677, 6981, 6981, -19677, 28799, -32692, 30647, -23039, 11245, 2589, -15955, 26421, -32092, 31933, -25978, 15303, -1851, -11939, 23559, -30902, 32633, -28439, 19079, -6257, -7704, 20264, -29146, 32733, -30378, 22506, -10548, -3327, 16596, -26853, 32232, -31760, 25519, -14645, 1110, 12624, -24068, 31140, -32558, 28063, -18473, 5527, 8421, -20841, 29475, -32759, 30092, -21963, 9843, 4062, -17232, 27270, -32358, 31569, -25049, 13978, -371, -13305, 24564, -31363, 32466, -27675, 17856, -4797, -9135, 21406, -29792}, -{32767, -30378, 23559, -13305, 1110, 11245, -21963, 29475, -32692, 31140, -25049, 15303, -3327, -9135, 20264, -28439, 32466, -31760, 26421, -17232, 5527, 6981, -18473, 27270, -32092, 32232, -27675, 19079, -7704, -4797, 16596, -25978, 31569, -32558, 28799, -20841, 9843, 2589, -14645, 24564, -30902, 32733, -29792, 22506, -11939, -371, 12624, -23039, 30092, -32759, 30647, -24068, 13978, -1851, -10548, 21406, -29146, 32633, -31363, 25519, -15955, 4062, 8421, -19677, 28063, -32358, 31933, -26853, 17856, -6257, -6257, 17856, -26853, 31933, -32358, 28063, -19677, 8421, 4062, -15955, 25519, -31363, 32633, -29146, 21406, -10548, -1851, 13978, -24068, 30647, -32759, 30092, -23039, 12624, -371, -11939, 22506, -29792, 32733, -30902, 24564, -14645, 2589, 9843, -20841, 28799, -32558, 31569, -25978, 16596, -4797, -7704, 19079, -27675, 32232, -32092, 27270, -18473, 6981, 5527, -17232, 26421, -31760, 32466, -28439, 20264, -9135, -3327, 15303, -25049, 31140, -32692, 29475, -21963, 11245, 1110, -13305, 23559, -30378}, -{32767, -30902, 25519, -17232, 6981, 4062, -14645, 23559, -29792, 32633, -31760, 27270, -19677, 9843, 1110, -11939, 21406, -28439, 32232, -32358, 28799, -21963, 12624, -1851, -9135, 19079, -26853, 31569, -32692, 30092, -24068, 15303, -4797, -6257, 16596, -25049, 30647, -32759, 31140, -25978, 17856, -7704, -3327, 13978, -23039, 29475, -32558, 31933, -27675, 20264, -10548, -371, 11245, -20841, 28063, -32092, 32466, -29146, 22506, -13305, 2589, 8421, -18473, 26421, -31363, 32733, -30378, 24564, -15955, 5527, 5527, -15955, 24564, -30378, 32733, -31363, 26421, -18473, 8421, 2589, -13305, 22506, -29146, 32466, -32092, 28063, -20841, 11245, -371, -10548, 20264, -27675, 31933, -32558, 29475, -23039, 13978, -3327, -7704, 17856, -25978, 31140, -32759, 30647, -25049, 16596, -6257, -4797, 15303, -24068, 30092, -32692, 31569, -26853, 19079, -9135, -1851, 12624, -21963, 28799, -32358, 32232, -28439, 21406, -11939, 1110, 9843, -19677, 27270, -31760, 32633, -29792, 23559, -14645, 4062, 6981, -17232, 25519, -30902}, -{32767, -31363, 27270, -20841, 12624, -3327, -6257, 15303, -23039, 28799, -32092, 32633, -30378, 25519, -18473, 9843, -371, -9135, 17856, -25049, 30092, -32558, 32232, -29146, 23559, -15955, 6981, 2589, -11939, 20264, -26853, 31140, -32759, 31569, -27675, 21406, -13305, 4062, 5527, -14645, 22506, -28439, 31933, -32692, 30647, -25978, 19079, -10548, 1110, 8421, -17232, 24564, -29792, 32466, -32358, 29475, -24068, 16596, -7704, -1851, 11245, -19677, 26421, -30902, 32733, -31760, 28063, -21963, 13978, -4797, -4797, 13978, -21963, 28063, -31760, 32733, -30902, 26421, -19677, 11245, -1851, -7704, 16596, -24068, 29475, -32358, 32466, -29792, 24564, -17232, 8421, 1110, -10548, 19079, -25978, 30647, -32692, 31933, -28439, 22506, -14645, 5527, 4062, -13305, 21406, -27675, 31569, -32759, 31140, -26853, 20264, -11939, 2589, 6981, -15955, 23559, -29146, 32232, -32558, 30092, -25049, 17856, -9135, -371, 9843, -18473, 25519, -30378, 32633, -32092, 28799, -23039, 15303, -6257, -3327, 12624, -20841, 27270, -31363}, -{32767, -31760, 28799, -24068, 17856, -10548, 2589, 5527, -13305, 20264, -25978, 30092, -32358, 32633, -30902, 27270, -21963, 15303, -7704, -371, 8421, -15955, 22506, -27675, 31140, -32692, 32232, -29792, 25519, -19677, 12624, -4797, -3327, 11245, -18473, 24564, -29146, 31933, -32759, 31569, -28439, 23559, -17232, 9843, -1851, -6257, 13978, -20841, 26421, -30378, 32466, -32558, 30647, -26853, 21406, -14645, 6981, 1110, -9135, 16596, -23039, 28063, -31363, 32733, -32092, 29475, -25049, 19079, -11939, 4062, 4062, -11939, 19079, -25049, 29475, -32092, 32733, -31363, 28063, -23039, 16596, -9135, 1110, 6981, -14645, 21406, -26853, 30647, -32558, 32466, -30378, 26421, -20841, 13978, -6257, -1851, 9843, -17232, 23559, -28439, 31569, -32759, 31933, -29146, 24564, -18473, 11245, -3327, -4797, 12624, -19677, 25519, -29792, 32232, -32692, 31140, -27675, 22506, -15955, 8421, -371, -7704, 15303, -21963, 27270, -30902, 32633, -32358, 30092, -25978, 20264, -13305, 5527, 2589, -10548, 17856, -24068, 28799, -31760}, -{32767, -32092, 30092, -26853, 22506, -17232, 11245, -4797, -1851, 8421, -14645, 20264, -25049, 28799, -31363, 32633, -32558, 31140, -28439, 24564, -19677, 13978, -7704, 1110, 5527, -11939, 17856, -23039, 27270, -30378, 32232, -32759, 31933, -29792, 26421, -21963, 16596, -10548, 4062, 2589, -9135, 15303, -20841, 25519, -29146, 31569, -32692, 32466, -30902, 28063, -24068, 19079, -13305, 6981, -371, -6257, 12624, -18473, 23559, -27675, 30647, -32358, 32733, -31760, 29475, -25978, 21406, -15955, 9843, -3327, -3327, 9843, -15955, 21406, -25978, 29475, -31760, 32733, -32358, 30647, -27675, 23559, -18473, 12624, -6257, -371, 6981, -13305, 19079, -24068, 28063, -30902, 32466, -32692, 31569, -29146, 25519, -20841, 15303, -9135, 2589, 4062, -10548, 16596, -21963, 26421, -29792, 31933, -32759, 32232, -30378, 27270, -23039, 17856, -11939, 5527, 1110, -7704, 13978, -19677, 24564, -28439, 31140, -32558, 32633, -31363, 28799, -25049, 20264, -14645, 8421, -1851, -4797, 11245, -17232, 22506, -26853, 30092, -32092}, -{32767, -32358, 31140, -29146, 26421, -23039, 19079, -14645, 9843, -4797, -371, 5527, -10548, 15303, -19677, 23559, -26853, 29475, -31363, 32466, -32759, 32232, -30902, 28799, -25978, 22506, -18473, 13978, -9135, 4062, 1110, -6257, 11245, -15955, 20264, -24068, 27270, -29792, 31569, -32558, 32733, -32092, 30647, -28439, 25519, -21963, 17856, -13305, 8421, -3327, -1851, 6981, -11939, 16596, -20841, 24564, -27675, 30092, -31760, 32633, -32692, 31933, -30378, 28063, -25049, 21406, -17232, 12624, -7704, 2589, 2589, -7704, 12624, -17232, 21406, -25049, 28063, -30378, 31933, -32692, 32633, -31760, 30092, -27675, 24564, -20841, 16596, -11939, 6981, -1851, -3327, 8421, -13305, 17856, -21963, 25519, -28439, 30647, -32092, 32733, -32558, 31569, -29792, 27270, -24068, 20264, -15955, 11245, -6257, 1110, 4062, -9135, 13978, -18473, 22506, -25978, 28799, -30902, 32232, -32759, 32466, -31363, 29475, -26853, 23559, -19677, 15303, -10548, 5527, -371, -4797, 9843, -14645, 19079, -23039, 26421, -29146, 31140, -32358}, -{32767, -32558, 31933, -30902, 29475, -27675, 25519, -23039, 20264, -17232, 13978, -10548, 6981, -3327, -371, 4062, -7704, 11245, -14645, 17856, -20841, 23559, -25978, 28063, -29792, 31140, -32092, 32633, -32759, 32466, -31760, 30647, -29146, 27270, -25049, 22506, -19677, 16596, -13305, 9843, -6257, 2589, 1110, -4797, 8421, -11939, 15303, -18473, 21406, -24068, 26421, -28439, 30092, -31363, 32232, -32692, 32733, -32358, 31569, -30378, 28799, -26853, 24564, -21963, 19079, -15955, 12624, -9135, 5527, -1851, -1851, 5527, -9135, 12624, -15955, 19079, -21963, 24564, -26853, 28799, -30378, 31569, -32358, 32733, -32692, 32232, -31363, 30092, -28439, 26421, -24068, 21406, -18473, 15303, -11939, 8421, -4797, 1110, 2589, -6257, 9843, -13305, 16596, -19677, 22506, -25049, 27270, -29146, 30647, -31760, 32466, -32759, 32633, -32092, 31140, -29792, 28063, -25978, 23559, -20841, 17856, -14645, 11245, -7704, 4062, -371, -3327, 6981, -10548, 13978, -17232, 20264, -23039, 25519, -27675, 29475, -30902, 31933, -32558}, -{32767, -32692, 32466, -32092, 31569, -30902, 30092, -29146, 28063, -26853, 25519, -24068, 22506, -20841, 19079, -17232, 15303, -13305, 11245, -9135, 6981, -4797, 2589, -371, -1851, 4062, -6257, 8421, -10548, 12624, -14645, 16596, -18473, 20264, -21963, 23559, -25049, 26421, -27675, 28799, -29792, 30647, -31363, 31933, -32358, 32633, -32759, 32733, -32558, 32232, -31760, 31140, -30378, 29475, -28439, 27270, -25978, 24564, -23039, 21406, -19677, 17856, -15955, 13978, -11939, 9843, -7704, 5527, -3327, 1110, 1110, -3327, 5527, -7704, 9843, -11939, 13978, -15955, 17856, -19677, 21406, -23039, 24564, -25978, 27270, -28439, 29475, -30378, 31140, -31760, 32232, -32558, 32733, -32759, 32633, -32358, 31933, -31363, 30647, -29792, 28799, -27675, 26421, -25049, 23559, -21963, 20264, -18473, 16596, -14645, 12624, -10548, 8421, -6257, 4062, -1851, -371, 2589, -4797, 6981, -9135, 11245, -13305, 15303, -17232, 19079, -20841, 22506, -24068, 25519, -26853, 28063, -29146, 30092, -30902, 31569, -32092, 32466, -32692}, -{32767, -32759, 32733, -32692, 32633, -32558, 32466, -32358, 32232, -32092, 31933, -31760, 31569, -31363, 31140, -30902, 30647, -30378, 30092, -29792, 29475, -29146, 28799, -28439, 28063, -27675, 27270, -26853, 26421, -25978, 25519, -25049, 24564, -24068, 23559, -23039, 22506, -21963, 21406, -20841, 20264, -19677, 19079, -18473, 17856, -17232, 16596, -15955, 15303, -14645, 13978, -13305, 12624, -11939, 11245, -10548, 9843, -9135, 8421, -7704, 6981, -6257, 5527, -4797, 4062, -3327, 2589, -1851, 1110, -371, -371, 1110, -1851, 2589, -3327, 4062, -4797, 5527, -6257, 6981, -7704, 8421, -9135, 9843, -10548, 11245, -11939, 12624, -13305, 13978, -14645, 15303, -15955, 16596, -17232, 17856, -18473, 19079, -19677, 20264, -20841, 21406, -21963, 22506, -23039, 23559, -24068, 24564, -25049, 25519, -25978, 26421, -26853, 27270, -27675, 28063, -28439, 28799, -29146, 29475, -29792, 30092, -30378, 30647, -30902, 31140, -31363, 31569, -31760, 31933, -32092, 32232, -32358, 32466, -32558, 32633, -32692, 32733, -32759}, -{32767, -32759, 32733, -32692, 32633, -32558, 32466, -32358, 32232, -32092, 31933, -31760, 31569, -31363, 31140, -30902, 30647, -30378, 30092, -29792, 29475, -29146, 28799, -28439, 28063, -27675, 27270, -26853, 26421, -25978, 25519, -25049, 24564, -24068, 23559, -23039, 22506, -21963, 21406, -20841, 20264, -19677, 19079, -18473, 17856, -17232, 16596, -15955, 15303, -14645, 13978, -13305, 12624, -11939, 11245, -10548, 9843, -9135, 8421, -7704, 6981, -6257, 5527, -4797, 4062, -3327, 2589, -1851, 1110, -371, -371, 1110, -1851, 2589, -3327, 4062, -4797, 5527, -6257, 6981, -7704, 8421, -9135, 9843, -10548, 11245, -11939, 12624, -13305, 13978, -14645, 15303, -15955, 16596, -17232, 17856, -18473, 19079, -19677, 20264, -20841, 21406, -21963, 22506, -23039, 23559, -24068, 24564, -25049, 25519, -25978, 26421, -26853, 27270, -27675, 28063, -28439, 28799, -29146, 29475, -29792, 30092, -30378, 30647, -30902, 31140, -31363, 31569, -31760, 31933, -32092, 32232, -32358, 32466, -32558, 32633, -32692, 32733, -32759}, -{32767, -32692, 32466, -32092, 31569, -30902, 30092, -29146, 28063, -26853, 25519, -24068, 22506, -20841, 19079, -17232, 15303, -13305, 11245, -9135, 6981, -4797, 2589, -371, -1851, 4062, -6257, 8421, -10548, 12624, -14645, 16596, -18473, 20264, -21963, 23559, -25049, 26421, -27675, 28799, -29792, 30647, -31363, 31933, -32358, 32633, -32759, 32733, -32558, 32232, -31760, 31140, -30378, 29475, -28439, 27270, -25978, 24564, -23039, 21406, -19677, 17856, -15955, 13978, -11939, 9843, -7704, 5527, -3327, 1110, 1110, -3327, 5527, -7704, 9843, -11939, 13978, -15955, 17856, -19677, 21406, -23039, 24564, -25978, 27270, -28439, 29475, -30378, 31140, -31760, 32232, -32558, 32733, -32759, 32633, -32358, 31933, -31363, 30647, -29792, 28799, -27675, 26421, -25049, 23559, -21963, 20264, -18473, 16596, -14645, 12624, -10548, 8421, -6257, 4062, -1851, -371, 2589, -4797, 6981, -9135, 11245, -13305, 15303, -17232, 19079, -20841, 22506, -24068, 25519, -26853, 28063, -29146, 30092, -30902, 31569, -32092, 32466, -32692}, -{32767, -32558, 31933, -30902, 29475, -27675, 25519, -23039, 20264, -17232, 13978, -10548, 6981, -3327, -371, 4062, -7704, 11245, -14645, 17856, -20841, 23559, -25978, 28063, -29792, 31140, -32092, 32633, -32759, 32466, -31760, 30647, -29146, 27270, -25049, 22506, -19677, 16596, -13305, 9843, -6257, 2589, 1110, -4797, 8421, -11939, 15303, -18473, 21406, -24068, 26421, -28439, 30092, -31363, 32232, -32692, 32733, -32358, 31569, -30378, 28799, -26853, 24564, -21963, 19079, -15955, 12624, -9135, 5527, -1851, -1851, 5527, -9135, 12624, -15955, 19079, -21963, 24564, -26853, 28799, -30378, 31569, -32358, 32733, -32692, 32232, -31363, 30092, -28439, 26421, -24068, 21406, -18473, 15303, -11939, 8421, -4797, 1110, 2589, -6257, 9843, -13305, 16596, -19677, 22506, -25049, 27270, -29146, 30647, -31760, 32466, -32759, 32633, -32092, 31140, -29792, 28063, -25978, 23559, -20841, 17856, -14645, 11245, -7704, 4062, -371, -3327, 6981, -10548, 13978, -17232, 20264, -23039, 25519, -27675, 29475, -30902, 31933, -32558}, -{32767, -32358, 31140, -29146, 26421, -23039, 19079, -14645, 9843, -4797, -371, 5527, -10548, 15303, -19677, 23559, -26853, 29475, -31363, 32466, -32759, 32232, -30902, 28799, -25978, 22506, -18473, 13978, -9135, 4062, 1110, -6257, 11245, -15955, 20264, -24068, 27270, -29792, 31569, -32558, 32733, -32092, 30647, -28439, 25519, -21963, 17856, -13305, 8421, -3327, -1851, 6981, -11939, 16596, -20841, 24564, -27675, 30092, -31760, 32633, -32692, 31933, -30378, 28063, -25049, 21406, -17232, 12624, -7704, 2589, 2589, -7704, 12624, -17232, 21406, -25049, 28063, -30378, 31933, -32692, 32633, -31760, 30092, -27675, 24564, -20841, 16596, -11939, 6981, -1851, -3327, 8421, -13305, 17856, -21963, 25519, -28439, 30647, -32092, 32733, -32558, 31569, -29792, 27270, -24068, 20264, -15955, 11245, -6257, 1110, 4062, -9135, 13978, -18473, 22506, -25978, 28799, -30902, 32232, -32759, 32466, -31363, 29475, -26853, 23559, -19677, 15303, -10548, 5527, -371, -4797, 9843, -14645, 19079, -23039, 26421, -29146, 31140, -32358}, -{32767, -32092, 30092, -26853, 22506, -17232, 11245, -4797, -1851, 8421, -14645, 20264, -25049, 28799, -31363, 32633, -32558, 31140, -28439, 24564, -19677, 13978, -7704, 1110, 5527, -11939, 17856, -23039, 27270, -30378, 32232, -32759, 31933, -29792, 26421, -21963, 16596, -10548, 4062, 2589, -9135, 15303, -20841, 25519, -29146, 31569, -32692, 32466, -30902, 28063, -24068, 19079, -13305, 6981, -371, -6257, 12624, -18473, 23559, -27675, 30647, -32358, 32733, -31760, 29475, -25978, 21406, -15955, 9843, -3327, -3327, 9843, -15955, 21406, -25978, 29475, -31760, 32733, -32358, 30647, -27675, 23559, -18473, 12624, -6257, -371, 6981, -13305, 19079, -24068, 28063, -30902, 32466, -32692, 31569, -29146, 25519, -20841, 15303, -9135, 2589, 4062, -10548, 16596, -21963, 26421, -29792, 31933, -32759, 32232, -30378, 27270, -23039, 17856, -11939, 5527, 1110, -7704, 13978, -19677, 24564, -28439, 31140, -32558, 32633, -31363, 28799, -25049, 20264, -14645, 8421, -1851, -4797, 11245, -17232, 22506, -26853, 30092, -32092}, -{32767, -31760, 28799, -24068, 17856, -10548, 2589, 5527, -13305, 20264, -25978, 30092, -32358, 32633, -30902, 27270, -21963, 15303, -7704, -371, 8421, -15955, 22506, -27675, 31140, -32692, 32232, -29792, 25519, -19677, 12624, -4797, -3327, 11245, -18473, 24564, -29146, 31933, -32759, 31569, -28439, 23559, -17232, 9843, -1851, -6257, 13978, -20841, 26421, -30378, 32466, -32558, 30647, -26853, 21406, -14645, 6981, 1110, -9135, 16596, -23039, 28063, -31363, 32733, -32092, 29475, -25049, 19079, -11939, 4062, 4062, -11939, 19079, -25049, 29475, -32092, 32733, -31363, 28063, -23039, 16596, -9135, 1110, 6981, -14645, 21406, -26853, 30647, -32558, 32466, -30378, 26421, -20841, 13978, -6257, -1851, 9843, -17232, 23559, -28439, 31569, -32759, 31933, -29146, 24564, -18473, 11245, -3327, -4797, 12624, -19677, 25519, -29792, 32232, -32692, 31140, -27675, 22506, -15955, 8421, -371, -7704, 15303, -21963, 27270, -30902, 32633, -32358, 30092, -25978, 20264, -13305, 5527, 2589, -10548, 17856, -24068, 28799, -31760}, -{32767, -31363, 27270, -20841, 12624, -3327, -6257, 15303, -23039, 28799, -32092, 32633, -30378, 25519, -18473, 9843, -371, -9135, 17856, -25049, 30092, -32558, 32232, -29146, 23559, -15955, 6981, 2589, -11939, 20264, -26853, 31140, -32759, 31569, -27675, 21406, -13305, 4062, 5527, -14645, 22506, -28439, 31933, -32692, 30647, -25978, 19079, -10548, 1110, 8421, -17232, 24564, -29792, 32466, -32358, 29475, -24068, 16596, -7704, -1851, 11245, -19677, 26421, -30902, 32733, -31760, 28063, -21963, 13978, -4797, -4797, 13978, -21963, 28063, -31760, 32733, -30902, 26421, -19677, 11245, -1851, -7704, 16596, -24068, 29475, -32358, 32466, -29792, 24564, -17232, 8421, 1110, -10548, 19079, -25978, 30647, -32692, 31933, -28439, 22506, -14645, 5527, 4062, -13305, 21406, -27675, 31569, -32759, 31140, -26853, 20264, -11939, 2589, 6981, -15955, 23559, -29146, 32232, -32558, 30092, -25049, 17856, -9135, -371, 9843, -18473, 25519, -30378, 32633, -32092, 28799, -23039, 15303, -6257, -3327, 12624, -20841, 27270, -31363}, -{32767, -30902, 25519, -17232, 6981, 4062, -14645, 23559, -29792, 32633, -31760, 27270, -19677, 9843, 1110, -11939, 21406, -28439, 32232, -32358, 28799, -21963, 12624, -1851, -9135, 19079, -26853, 31569, -32692, 30092, -24068, 15303, -4797, -6257, 16596, -25049, 30647, -32759, 31140, -25978, 17856, -7704, -3327, 13978, -23039, 29475, -32558, 31933, -27675, 20264, -10548, -371, 11245, -20841, 28063, -32092, 32466, -29146, 22506, -13305, 2589, 8421, -18473, 26421, -31363, 32733, -30378, 24564, -15955, 5527, 5527, -15955, 24564, -30378, 32733, -31363, 26421, -18473, 8421, 2589, -13305, 22506, -29146, 32466, -32092, 28063, -20841, 11245, -371, -10548, 20264, -27675, 31933, -32558, 29475, -23039, 13978, -3327, -7704, 17856, -25978, 31140, -32759, 30647, -25049, 16596, -6257, -4797, 15303, -24068, 30092, -32692, 31569, -26853, 19079, -9135, -1851, 12624, -21963, 28799, -32358, 32232, -28439, 21406, -11939, 1110, 9843, -19677, 27270, -31760, 32633, -29792, 23559, -14645, 4062, 6981, -17232, 25519, -30902}, -{32767, -30378, 23559, -13305, 1110, 11245, -21963, 29475, -32692, 31140, -25049, 15303, -3327, -9135, 20264, -28439, 32466, -31760, 26421, -17232, 5527, 6981, -18473, 27270, -32092, 32232, -27675, 19079, -7704, -4797, 16596, -25978, 31569, -32558, 28799, -20841, 9843, 2589, -14645, 24564, -30902, 32733, -29792, 22506, -11939, -371, 12624, -23039, 30092, -32759, 30647, -24068, 13978, -1851, -10548, 21406, -29146, 32633, -31363, 25519, -15955, 4062, 8421, -19677, 28063, -32358, 31933, -26853, 17856, -6257, -6257, 17856, -26853, 31933, -32358, 28063, -19677, 8421, 4062, -15955, 25519, -31363, 32633, -29146, 21406, -10548, -1851, 13978, -24068, 30647, -32759, 30092, -23039, 12624, -371, -11939, 22506, -29792, 32733, -30902, 24564, -14645, 2589, 9843, -20841, 28799, -32558, 31569, -25978, 16596, -4797, -7704, 19079, -27675, 32232, -32092, 27270, -18473, 6981, 5527, -17232, 26421, -31760, 32466, -28439, 20264, -9135, -3327, 15303, -25049, 31140, -32692, 29475, -21963, 11245, 1110, -13305, 23559, -30378}, -{32767, -29792, 21406, -9135, -4797, 17856, -27675, 32466, -31363, 24564, -13305, -371, 13978, -25049, 31569, -32358, 27270, -17232, 4062, 9843, -21963, 30092, -32759, 29475, -20841, 8421, 5527, -18473, 28063, -32558, 31140, -24068, 12624, 1110, -14645, 25519, -31760, 32232, -26853, 16596, -3327, -10548, 22506, -30378, 32733, -29146, 20264, -7704, -6257, 19079, -28439, 32633, -30902, 23559, -11939, -1851, 15303, -25978, 31933, -32092, 26421, -15955, 2589, 11245, -23039, 30647, -32692, 28799, -19677, 6981, 6981, -19677, 28799, -32692, 30647, -23039, 11245, 2589, -15955, 26421, -32092, 31933, -25978, 15303, -1851, -11939, 23559, -30902, 32633, -28439, 19079, -6257, -7704, 20264, -29146, 32733, -30378, 22506, -10548, -3327, 16596, -26853, 32232, -31760, 25519, -14645, 1110, 12624, -24068, 31140, -32558, 28063, -18473, 5527, 8421, -20841, 29475, -32759, 30092, -21963, 9843, 4062, -17232, 27270, -32358, 31569, -25049, 13978, -371, -13305, 24564, -31363, 32466, -27675, 17856, -4797, -9135, 21406, -29792}, -{32767, -29146, 19079, -4797, -10548, 23559, -31363, 32232, -25978, 13978, 1110, -15955, 27270, -32558, 30647, -21963, 8421, 6981, -20841, 30092, -32692, 28063, -17232, 2589, 12624, -25049, 31933, -31760, 24564, -11939, -3327, 17856, -28439, 32733, -29792, 20264, -6257, -9135, 22506, -30902, 32466, -26853, 15303, -371, -14645, 26421, -32358, 31140, -23039, 9843, 5527, -19677, 29475, -32759, 28799, -18473, 4062, 11245, -24068, 31569, -32092, 25519, -13305, -1851, 16596, -27675, 32633, -30378, 21406, -7704, -7704, 21406, -30378, 32633, -27675, 16596, -1851, -13305, 25519, -32092, 31569, -24068, 11245, 4062, -18473, 28799, -32759, 29475, -19677, 5527, 9843, -23039, 31140, -32358, 26421, -14645, -371, 15303, -26853, 32466, -30902, 22506, -9135, -6257, 20264, -29792, 32733, -28439, 17856, -3327, -11939, 24564, -31760, 31933, -25049, 12624, 2589, -17232, 28063, -32692, 30092, -20841, 6981, 8421, -21963, 30647, -32558, 27270, -15955, 1110, 13978, -25978, 32232, -31363, 23559, -10548, -4797, 19079, -29146}, -{32767, -28439, 16596, -371, -15955, 28063, -32759, 28799, -17232, 1110, 15303, -27675, 32733, -29146, 17856, -1851, -14645, 27270, -32692, 29475, -18473, 2589, 13978, -26853, 32633, -29792, 19079, -3327, -13305, 26421, -32558, 30092, -19677, 4062, 12624, -25978, 32466, -30378, 20264, -4797, -11939, 25519, -32358, 30647, -20841, 5527, 11245, -25049, 32232, -30902, 21406, -6257, -10548, 24564, -32092, 31140, -21963, 6981, 9843, -24068, 31933, -31363, 22506, -7704, -9135, 23559, -31760, 31569, -23039, 8421, 8421, -23039, 31569, -31760, 23559, -9135, -7704, 22506, -31363, 31933, -24068, 9843, 6981, -21963, 31140, -32092, 24564, -10548, -6257, 21406, -30902, 32232, -25049, 11245, 5527, -20841, 30647, -32358, 25519, -11939, -4797, 20264, -30378, 32466, -25978, 12624, 4062, -19677, 30092, -32558, 26421, -13305, -3327, 19079, -29792, 32633, -26853, 13978, 2589, -18473, 29475, -32692, 27270, -14645, -1851, 17856, -29146, 32733, -27675, 15303, 1110, -17232, 28799, -32759, 28063, -15955, -371, 16596, -28439}, -{32767, -27675, 13978, 4062, -20841, 31140, -31760, 22506, -6257, -11939, 26421, -32692, 28799, -15955, -1851, 19079, -30378, 32232, -24068, 8421, 9843, -25049, 32466, -29792, 17856, -371, -17232, 29475, -32558, 25519, -10548, -7704, 23559, -32092, 30647, -19677, 2589, 15303, -28439, 32733, -26853, 12624, 5527, -21963, 31569, -31363, 21406, -4797, -13305, 27270, -32759, 28063, -14645, -3327, 20264, -30902, 31933, -23039, 6981, 11245, -25978, 32633, -29146, 16596, 1110, -18473, 30092, -32358, 24564, -9135, -9135, 24564, -32358, 30092, -18473, 1110, 16596, -29146, 32633, -25978, 11245, 6981, -23039, 31933, -30902, 20264, -3327, -14645, 28063, -32759, 27270, -13305, -4797, 21406, -31363, 31569, -21963, 5527, 12624, -26853, 32733, -28439, 15303, 2589, -19677, 30647, -32092, 23559, -7704, -10548, 25519, -32558, 29475, -17232, -371, 17856, -29792, 32466, -25049, 9843, 8421, -24068, 32232, -30378, 19079, -1851, -15955, 28799, -32692, 26421, -11939, -6257, 22506, -31760, 31140, -20841, 4062, 13978, -27675}, -{32767, -26853, 11245, 8421, -25049, 32633, -28439, 13978, 5527, -23039, 32232, -29792, 16596, 2589, -20841, 31569, -30902, 19079, -371, -18473, 30647, -31760, 21406, -3327, -15955, 29475, -32358, 23559, -6257, -13305, 28063, -32692, 25519, -9135, -10548, 26421, -32759, 27270, -11939, -7704, 24564, -32558, 28799, -14645, -4797, 22506, -32092, 30092, -17232, -1851, 20264, -31363, 31140, -19677, 1110, 17856, -30378, 31933, -21963, 4062, 15303, -29146, 32466, -24068, 6981, 12624, -27675, 32733, -25978, 9843, 9843, -25978, 32733, -27675, 12624, 6981, -24068, 32466, -29146, 15303, 4062, -21963, 31933, -30378, 17856, 1110, -19677, 31140, -31363, 20264, -1851, -17232, 30092, -32092, 22506, -4797, -14645, 28799, -32558, 24564, -7704, -11939, 27270, -32759, 26421, -10548, -9135, 25519, -32692, 28063, -13305, -6257, 23559, -32358, 29475, -15955, -3327, 21406, -31760, 30647, -18473, -371, 19079, -30902, 31569, -20841, 2589, 16596, -29792, 32232, -23039, 5527, 13978, -28439, 32633, -25049, 8421, 11245, -26853}, -{32767, -25978, 8421, 12624, -28439, 32466, -23039, 4062, 16596, -30378, 31569, -19677, -371, 20264, -31760, 30092, -15955, -4797, 23559, -32558, 28063, -11939, -9135, 26421, -32759, 25519, -7704, -13305, 28799, -32358, 22506, -3327, -17232, 30647, -31363, 19079, 1110, -20841, 31933, -29792, 15303, 5527, -24068, 32633, -27675, 11245, 9843, -26853, 32733, -25049, 6981, 13978, -29146, 32232, -21963, 2589, 17856, -30902, 31140, -18473, -1851, 21406, -32092, 29475, -14645, -6257, 24564, -32692, 27270, -10548, -10548, 27270, -32692, 24564, -6257, -14645, 29475, -32092, 21406, -1851, -18473, 31140, -30902, 17856, 2589, -21963, 32232, -29146, 13978, 6981, -25049, 32733, -26853, 9843, 11245, -27675, 32633, -24068, 5527, 15303, -29792, 31933, -20841, 1110, 19079, -31363, 30647, -17232, -3327, 22506, -32358, 28799, -13305, -7704, 25519, -32759, 26421, -9135, -11939, 28063, -32558, 23559, -4797, -15955, 30092, -31760, 20264, -371, -19677, 31569, -30378, 16596, 4062, -23039, 32466, -28439, 12624, 8421, -25978}, -{32767, -25049, 5527, 16596, -30902, 30647, -15955, -6257, 25519, -32759, 24564, -4797, -17232, 31140, -30378, 15303, 6981, -25978, 32733, -24068, 4062, 17856, -31363, 30092, -14645, -7704, 26421, -32692, 23559, -3327, -18473, 31569, -29792, 13978, 8421, -26853, 32633, -23039, 2589, 19079, -31760, 29475, -13305, -9135, 27270, -32558, 22506, -1851, -19677, 31933, -29146, 12624, 9843, -27675, 32466, -21963, 1110, 20264, -32092, 28799, -11939, -10548, 28063, -32358, 21406, -371, -20841, 32232, -28439, 11245, 11245, -28439, 32232, -20841, -371, 21406, -32358, 28063, -10548, -11939, 28799, -32092, 20264, 1110, -21963, 32466, -27675, 9843, 12624, -29146, 31933, -19677, -1851, 22506, -32558, 27270, -9135, -13305, 29475, -31760, 19079, 2589, -23039, 32633, -26853, 8421, 13978, -29792, 31569, -18473, -3327, 23559, -32692, 26421, -7704, -14645, 30092, -31363, 17856, 4062, -24068, 32733, -25978, 6981, 15303, -30378, 31140, -17232, -4797, 24564, -32759, 25519, -6257, -15955, 30647, -30902, 16596, 5527, -25049}, -{32767, -24068, 2589, 20264, -32358, 27270, -7704, -15955, 31140, -29792, 12624, 11245, -29146, 31569, -17232, -6257, 26421, -32558, 21406, 1110, -23039, 32733, -25049, 4062, 19079, -32092, 28063, -9135, -14645, 30647, -30378, 13978, 9843, -28439, 31933, -18473, -4797, 25519, -32692, 22506, -371, -21963, 32633, -25978, 5527, 17856, -31760, 28799, -10548, -13305, 30092, -30902, 15303, 8421, -27675, 32232, -19677, -3327, 24564, -32759, 23559, -1851, -20841, 32466, -26853, 6981, 16596, -31363, 29475, -11939, -11939, 29475, -31363, 16596, 6981, -26853, 32466, -20841, -1851, 23559, -32759, 24564, -3327, -19677, 32232, -27675, 8421, 15303, -30902, 30092, -13305, -10548, 28799, -31760, 17856, 5527, -25978, 32633, -21963, -371, 22506, -32692, 25519, -4797, -18473, 31933, -28439, 9843, 13978, -30378, 30647, -14645, -9135, 28063, -32092, 19079, 4062, -25049, 32733, -23039, 1110, 21406, -32558, 26421, -6257, -17232, 31569, -29146, 11245, 12624, -29792, 31140, -15955, -7704, 27270, -32358, 20264, 2589, -24068}, -{32767, -23039, -371, 23559, -32759, 22506, 1110, -24068, 32733, -21963, -1851, 24564, -32692, 21406, 2589, -25049, 32633, -20841, -3327, 25519, -32558, 20264, 4062, -25978, 32466, -19677, -4797, 26421, -32358, 19079, 5527, -26853, 32232, -18473, -6257, 27270, -32092, 17856, 6981, -27675, 31933, -17232, -7704, 28063, -31760, 16596, 8421, -28439, 31569, -15955, -9135, 28799, -31363, 15303, 9843, -29146, 31140, -14645, -10548, 29475, -30902, 13978, 11245, -29792, 30647, -13305, -11939, 30092, -30378, 12624, 12624, -30378, 30092, -11939, -13305, 30647, -29792, 11245, 13978, -30902, 29475, -10548, -14645, 31140, -29146, 9843, 15303, -31363, 28799, -9135, -15955, 31569, -28439, 8421, 16596, -31760, 28063, -7704, -17232, 31933, -27675, 6981, 17856, -32092, 27270, -6257, -18473, 32232, -26853, 5527, 19079, -32358, 26421, -4797, -19677, 32466, -25978, 4062, 20264, -32558, 25519, -3327, -20841, 32633, -25049, 2589, 21406, -32692, 24564, -1851, -21963, 32733, -24068, 1110, 22506, -32759, 23559, -371, -23039}, -{32767, -21963, -3327, 26421, -32092, 16596, 9843, -29792, 30092, -10548, -15955, 31933, -26853, 4062, 21406, -32759, 22506, 2589, -25978, 32232, -17232, -9135, 29475, -30378, 11245, 15303, -31760, 27270, -4797, -20841, 32733, -23039, -1851, 25519, -32358, 17856, 8421, -29146, 30647, -11939, -14645, 31569, -27675, 5527, 20264, -32692, 23559, 1110, -25049, 32466, -18473, -7704, 28799, -30902, 12624, 13978, -31363, 28063, -6257, -19677, 32633, -24068, -371, 24564, -32558, 19079, 6981, -28439, 31140, -13305, -13305, 31140, -28439, 6981, 19079, -32558, 24564, -371, -24068, 32633, -19677, -6257, 28063, -31363, 13978, 12624, -30902, 28799, -7704, -18473, 32466, -25049, 1110, 23559, -32692, 20264, 5527, -27675, 31569, -14645, -11939, 30647, -29146, 8421, 17856, -32358, 25519, -1851, -23039, 32733, -20841, -4797, 27270, -31760, 15303, 11245, -30378, 29475, -9135, -17232, 32232, -25978, 2589, 22506, -32759, 21406, 4062, -26853, 31933, -15955, -10548, 30092, -29792, 9843, 16596, -32092, 26421, -3327, -21963}, -{32767, -20841, -6257, 28799, -30378, 9843, 17856, -32558, 23559, 2589, -26853, 31569, -13305, -14645, 31933, -25978, 1110, 24564, -32358, 16596, 11245, -30902, 28063, -4797, -21963, 32733, -19677, -7704, 29475, -29792, 8421, 19079, -32692, 22506, 4062, -27675, 31140, -11939, -15955, 32232, -25049, -371, 25519, -32092, 15303, 12624, -31363, 27270, -3327, -23039, 32633, -18473, -9135, 30092, -29146, 6981, 20264, -32759, 21406, 5527, -28439, 30647, -10548, -17232, 32466, -24068, -1851, 26421, -31760, 13978, 13978, -31760, 26421, -1851, -24068, 32466, -17232, -10548, 30647, -28439, 5527, 21406, -32759, 20264, 6981, -29146, 30092, -9135, -18473, 32633, -23039, -3327, 27270, -31363, 12624, 15303, -32092, 25519, -371, -25049, 32232, -15955, -11939, 31140, -27675, 4062, 22506, -32692, 19079, 8421, -29792, 29475, -7704, -19677, 32733, -21963, -4797, 28063, -30902, 11245, 16596, -32358, 24564, 1110, -25978, 31933, -14645, -13305, 31569, -26853, 2589, 23559, -32558, 17856, 9843, -30378, 28799, -6257, -20841}, -{32767, -19677, -9135, 30647, -27675, 2589, 24564, -32092, 13978, 15303, -32358, 23559, 4062, -28439, 30092, -7704, -20841, 32733, -18473, -10548, 31140, -26853, 1110, 25519, -31760, 12624, 16596, -32558, 22506, 5527, -29146, 29475, -6257, -21963, 32633, -17232, -11939, 31569, -25978, -371, 26421, -31363, 11245, 17856, -32692, 21406, 6981, -29792, 28799, -4797, -23039, 32466, -15955, -13305, 31933, -25049, -1851, 27270, -30902, 9843, 19079, -32759, 20264, 8421, -30378, 28063, -3327, -24068, 32232, -14645, -14645, 32232, -24068, -3327, 28063, -30378, 8421, 20264, -32759, 19079, 9843, -30902, 27270, -1851, -25049, 31933, -13305, -15955, 32466, -23039, -4797, 28799, -29792, 6981, 21406, -32692, 17856, 11245, -31363, 26421, -371, -25978, 31569, -11939, -17232, 32633, -21963, -6257, 29475, -29146, 5527, 22506, -32558, 16596, 12624, -31760, 25519, 1110, -26853, 31140, -10548, -18473, 32733, -20841, -7704, 30092, -28439, 4062, 23559, -32358, 15303, 13978, -32092, 24564, 2589, -27675, 30647, -9135, -19677}, -{32767, -18473, -11939, 31933, -24068, -4797, 29475, -28439, 2589, 25519, -31363, 9843, 20264, -32692, 16596, 13978, -32358, 22506, 6981, -30378, 27270, -371, -26853, 30647, -7704, -21963, 32466, -14645, -15955, 32633, -20841, -9135, 31140, -25978, -1851, 28063, -29792, 5527, 23559, -32092, 12624, 17856, -32759, 19079, 11245, -31760, 24564, 4062, -29146, 28799, -3327, -25049, 31569, -10548, -19677, 32733, -17232, -13305, 32232, -23039, -6257, 30092, -27675, 1110, 26421, -30902, 8421, 21406, -32558, 15303, 15303, -32558, 21406, 8421, -30902, 26421, 1110, -27675, 30092, -6257, -23039, 32232, -13305, -17232, 32733, -19677, -10548, 31569, -25049, -3327, 28799, -29146, 4062, 24564, -31760, 11245, 19079, -32759, 17856, 12624, -32092, 23559, 5527, -29792, 28063, -1851, -25978, 31140, -9135, -20841, 32633, -15955, -14645, 32466, -21963, -7704, 30647, -26853, -371, 27270, -30378, 6981, 22506, -32358, 13978, 16596, -32692, 20264, 9843, -31363, 25519, 2589, -28439, 29475, -4797, -24068, 31933, -11939, -18473}, -{32767, -17232, -14645, 32633, -19677, -11939, 32232, -21963, -9135, 31569, -24068, -6257, 30647, -25978, -3327, 29475, -27675, -371, 28063, -29146, 2589, 26421, -30378, 5527, 24564, -31363, 8421, 22506, -32092, 11245, 20264, -32558, 13978, 17856, -32759, 16596, 15303, -32692, 19079, 12624, -32358, 21406, 9843, -31760, 23559, 6981, -30902, 25519, 4062, -29792, 27270, 1110, -28439, 28799, -1851, -26853, 30092, -4797, -25049, 31140, -7704, -23039, 31933, -10548, -20841, 32466, -13305, -18473, 32733, -15955, -15955, 32733, -18473, -13305, 32466, -20841, -10548, 31933, -23039, -7704, 31140, -25049, -4797, 30092, -26853, -1851, 28799, -28439, 1110, 27270, -29792, 4062, 25519, -30902, 6981, 23559, -31760, 9843, 21406, -32358, 12624, 19079, -32692, 15303, 16596, -32759, 17856, 13978, -32558, 20264, 11245, -32092, 22506, 8421, -31363, 24564, 5527, -30378, 26421, 2589, -29146, 28063, -371, -27675, 29475, -3327, -25978, 30647, -6257, -24068, 31569, -9135, -21963, 32232, -11939, -19677, 32633, -14645, -17232}, -{32767, -15955, -17232, 32733, -14645, -18473, 32633, -13305, -19677, 32466, -11939, -20841, 32232, -10548, -21963, 31933, -9135, -23039, 31569, -7704, -24068, 31140, -6257, -25049, 30647, -4797, -25978, 30092, -3327, -26853, 29475, -1851, -27675, 28799, -371, -28439, 28063, 1110, -29146, 27270, 2589, -29792, 26421, 4062, -30378, 25519, 5527, -30902, 24564, 6981, -31363, 23559, 8421, -31760, 22506, 9843, -32092, 21406, 11245, -32358, 20264, 12624, -32558, 19079, 13978, -32692, 17856, 15303, -32759, 16596, 16596, -32759, 15303, 17856, -32692, 13978, 19079, -32558, 12624, 20264, -32358, 11245, 21406, -32092, 9843, 22506, -31760, 8421, 23559, -31363, 6981, 24564, -30902, 5527, 25519, -30378, 4062, 26421, -29792, 2589, 27270, -29146, 1110, 28063, -28439, -371, 28799, -27675, -1851, 29475, -26853, -3327, 30092, -25978, -4797, 30647, -25049, -6257, 31140, -24068, -7704, 31569, -23039, -9135, 31933, -21963, -10548, 32232, -20841, -11939, 32466, -19677, -13305, 32633, -18473, -14645, 32733, -17232, -15955}, -{32767, -14645, -19677, 32232, -9135, -24068, 30647, -3327, -27675, 28063, 2589, -30378, 24564, 8421, -32092, 20264, 13978, -32759, 15303, 19079, -32358, 9843, 23559, -30902, 4062, 27270, -28439, -1851, 30092, -25049, -7704, 31933, -20841, -13305, 32733, -15955, -18473, 32466, -10548, -23039, 31140, -4797, -26853, 28799, 1110, -29792, 25519, 6981, -31760, 21406, 12624, -32692, 16596, 17856, -32558, 11245, 22506, -31363, 5527, 26421, -29146, -371, 29475, -25978, -6257, 31569, -21963, -11939, 32633, -17232, -17232, 32633, -11939, -21963, 31569, -6257, -25978, 29475, -371, -29146, 26421, 5527, -31363, 22506, 11245, -32558, 17856, 16596, -32692, 12624, 21406, -31760, 6981, 25519, -29792, 1110, 28799, -26853, -4797, 31140, -23039, -10548, 32466, -18473, -15955, 32733, -13305, -20841, 31933, -7704, -25049, 30092, -1851, -28439, 27270, 4062, -30902, 23559, 9843, -32358, 19079, 15303, -32759, 13978, 20264, -32092, 8421, 24564, -30378, 2589, 28063, -27675, -3327, 30647, -24068, -9135, 32232, -19677, -14645}, -{32767, -13305, -21963, 31140, -3327, -28439, 26421, 6981, -32092, 19079, 16596, -32558, 9843, 24564, -29792, -371, 30092, -24068, -10548, 32633, -15955, -19677, 31933, -6257, -26853, 28063, 4062, -31363, 21406, 13978, -32759, 12624, 22506, -30902, 2589, 28799, -25978, -7704, 32232, -18473, -17232, 32466, -9135, -25049, 29475, 1110, -30378, 23559, 11245, -32692, 15303, 20264, -31760, 5527, 27270, -27675, -4797, 31569, -20841, -14645, 32733, -11939, -23039, 30647, -1851, -29146, 25519, 8421, -32358, 17856, 17856, -32358, 8421, 25519, -29146, -1851, 30647, -23039, -11939, 32733, -14645, -20841, 31569, -4797, -27675, 27270, 5527, -31760, 20264, 15303, -32692, 11245, 23559, -30378, 1110, 29475, -25049, -9135, 32466, -17232, -18473, 32232, -7704, -25978, 28799, 2589, -30902, 22506, 12624, -32759, 13978, 21406, -31363, 4062, 28063, -26853, -6257, 31933, -19677, -15955, 32633, -10548, -24068, 30092, -371, -29792, 24564, 9843, -32558, 16596, 19079, -32092, 6981, 26421, -28439, -3327, 31140, -21963, -13305}, -{32767, -11939, -24068, 29475, 2589, -31363, 20264, 16596, -32358, 6981, 27270, -26853, -7704, 32466, -15955, -20841, 31140, -1851, -29792, 23559, 12624, -32759, 11245, 24564, -29146, -3327, 31569, -19677, -17232, 32232, -6257, -27675, 26421, 8421, -32558, 15303, 21406, -30902, 1110, 30092, -23039, -13305, 32733, -10548, -25049, 28799, 4062, -31760, 19079, 17856, -32092, 5527, 28063, -25978, -9135, 32633, -14645, -21963, 30647, -371, -30378, 22506, 13978, -32692, 9843, 25519, -28439, -4797, 31933, -18473, -18473, 31933, -4797, -28439, 25519, 9843, -32692, 13978, 22506, -30378, -371, 30647, -21963, -14645, 32633, -9135, -25978, 28063, 5527, -32092, 17856, 19079, -31760, 4062, 28799, -25049, -10548, 32733, -13305, -23039, 30092, 1110, -30902, 21406, 15303, -32558, 8421, 26421, -27675, -6257, 32232, -17232, -19677, 31569, -3327, -29146, 24564, 11245, -32759, 12624, 23559, -29792, -1851, 31140, -20841, -15955, 32466, -7704, -26853, 27270, 6981, -32358, 16596, 20264, -31363, 2589, 29475, -24068, -11939}, -{32767, -10548, -25978, 27270, 8421, -32692, 12624, 24564, -28439, -6257, 32466, -14645, -23039, 29475, 4062, -32092, 16596, 21406, -30378, -1851, 31569, -18473, -19677, 31140, -371, -30902, 20264, 17856, -31760, 2589, 30092, -21963, -15955, 32232, -4797, -29146, 23559, 13978, -32558, 6981, 28063, -25049, -11939, 32733, -9135, -26853, 26421, 9843, -32759, 11245, 25519, -27675, -7704, 32633, -13305, -24068, 28799, 5527, -32358, 15303, 22506, -29792, -3327, 31933, -17232, -20841, 30647, 1110, -31363, 19079, 19079, -31363, 1110, 30647, -20841, -17232, 31933, -3327, -29792, 22506, 15303, -32358, 5527, 28799, -24068, -13305, 32633, -7704, -27675, 25519, 11245, -32759, 9843, 26421, -26853, -9135, 32733, -11939, -25049, 28063, 6981, -32558, 13978, 23559, -29146, -4797, 32232, -15955, -21963, 30092, 2589, -31760, 17856, 20264, -30902, -371, 31140, -19677, -18473, 31569, -1851, -30378, 21406, 16596, -32092, 4062, 29475, -23039, -14645, 32466, -6257, -28439, 24564, 12624, -32692, 8421, 27270, -25978, -10548}, -{32767, -9135, -27675, 24564, 13978, -32358, 4062, 30092, -20841, -18473, 31140, 1110, -31760, 16596, 22506, -29146, -6257, 32633, -11939, -25978, 26421, 11245, -32692, 6981, 28799, -23039, -15955, 31933, -1851, -30902, 19079, 20264, -30378, -3327, 32232, -14645, -24068, 28063, 8421, -32759, 9843, 27270, -25049, -13305, 32466, -4797, -29792, 21406, 17856, -31363, -371, 31569, -17232, -21963, 29475, 5527, -32558, 12624, 25519, -26853, -10548, 32733, -7704, -28439, 23559, 15303, -32092, 2589, 30647, -19677, -19677, 30647, 2589, -32092, 15303, 23559, -28439, -7704, 32733, -10548, -26853, 25519, 12624, -32558, 5527, 29475, -21963, -17232, 31569, -371, -31363, 17856, 21406, -29792, -4797, 32466, -13305, -25049, 27270, 9843, -32759, 8421, 28063, -24068, -14645, 32232, -3327, -30378, 20264, 19079, -30902, -1851, 31933, -15955, -23039, 28799, 6981, -32692, 11245, 26421, -25978, -11939, 32633, -6257, -29146, 22506, 16596, -31760, 1110, 31140, -18473, -20841, 30092, 4062, -32358, 13978, 24564, -27675, -9135}, -{32767, -7704, -29146, 21406, 19079, -30378, -4797, 32633, -10548, -27675, 23559, 16596, -31363, -1851, 32232, -13305, -25978, 25519, 13978, -32092, 1110, 31569, -15955, -24068, 27270, 11245, -32558, 4062, 30647, -18473, -21963, 28799, 8421, -32759, 6981, 29475, -20841, -19677, 30092, 5527, -32692, 9843, 28063, -23039, -17232, 31140, 2589, -32358, 12624, 26421, -25049, -14645, 31933, -371, -31760, 15303, 24564, -26853, -11939, 32466, -3327, -30902, 17856, 22506, -28439, -9135, 32733, -6257, -29792, 20264, 20264, -29792, -6257, 32733, -9135, -28439, 22506, 17856, -30902, -3327, 32466, -11939, -26853, 24564, 15303, -31760, -371, 31933, -14645, -25049, 26421, 12624, -32358, 2589, 31140, -17232, -23039, 28063, 9843, -32692, 5527, 30092, -19677, -20841, 29475, 6981, -32759, 8421, 28799, -21963, -18473, 30647, 4062, -32558, 11245, 27270, -24068, -15955, 31569, 1110, -32092, 13978, 25519, -25978, -13305, 32232, -1851, -31363, 16596, 23559, -27675, -10548, 32633, -4797, -30378, 19079, 21406, -29146, -7704}, -{32767, -6257, -30378, 17856, 23559, -26853, -13305, 31933, 1110, -32358, 11245, 28063, -21963, -19677, 29475, 8421, -32692, 4062, 31140, -15955, -25049, 25519, 15303, -31363, -3327, 32633, -9135, -29146, 20264, 21406, -28439, -10548, 32466, -1851, -31760, 13978, 26421, -24068, -17232, 30647, 5527, -32759, 6981, 30092, -18473, -23039, 27270, 12624, -32092, -371, 32232, -11939, -27675, 22506, 19079, -29792, -7704, 32733, -4797, -30902, 16596, 24564, -25978, -14645, 31569, 2589, -32558, 9843, 28799, -20841, -20841, 28799, 9843, -32558, 2589, 31569, -14645, -25978, 24564, 16596, -30902, -4797, 32733, -7704, -29792, 19079, 22506, -27675, -11939, 32232, -371, -32092, 12624, 27270, -23039, -18473, 30092, 6981, -32759, 5527, 30647, -17232, -24068, 26421, 13978, -31760, -1851, 32466, -10548, -28439, 21406, 20264, -29146, -9135, 32633, -3327, -31363, 15303, 25519, -25049, -15955, 31140, 4062, -32692, 8421, 29475, -19677, -21963, 28063, 11245, -32358, 1110, 31933, -13305, -26853, 23559, 17856, -30378, -6257}, -{32767, -4797, -31363, 13978, 27270, -21963, -20841, 28063, 12624, -31760, -3327, 32733, -6257, -30902, 15303, 26421, -23039, -19677, 28799, 11245, -32092, -1851, 32633, -7704, -30378, 16596, 25519, -24068, -18473, 29475, 9843, -32358, -371, 32466, -9135, -29792, 17856, 24564, -25049, -17232, 30092, 8421, -32558, 1110, 32232, -10548, -29146, 19079, 23559, -25978, -15955, 30647, 6981, -32692, 2589, 31933, -11939, -28439, 20264, 22506, -26853, -14645, 31140, 5527, -32759, 4062, 31569, -13305, -27675, 21406, 21406, -27675, -13305, 31569, 4062, -32759, 5527, 31140, -14645, -26853, 22506, 20264, -28439, -11939, 31933, 2589, -32692, 6981, 30647, -15955, -25978, 23559, 19079, -29146, -10548, 32232, 1110, -32558, 8421, 30092, -17232, -25049, 24564, 17856, -29792, -9135, 32466, -371, -32358, 9843, 29475, -18473, -24068, 25519, 16596, -30378, -7704, 32633, -1851, -32092, 11245, 28799, -19677, -23039, 26421, 15303, -30902, -6257, 32733, -3327, -31760, 12624, 28063, -20841, -21963, 27270, 13978, -31363, -4797}, -{32767, -3327, -32092, 9843, 30092, -15955, -26853, 21406, 22506, -25978, -17232, 29475, 11245, -31760, -4797, 32733, -1851, -32358, 8421, 30647, -14645, -27675, 20264, 23559, -25049, -18473, 28799, 12624, -31363, -6257, 32633, -371, -32558, 6981, 31140, -13305, -28439, 19079, 24564, -24068, -19677, 28063, 13978, -30902, -7704, 32466, 1110, -32692, 5527, 31569, -11939, -29146, 17856, 25519, -23039, -20841, 27270, 15303, -30378, -9135, 32232, 2589, -32759, 4062, 31933, -10548, -29792, 16596, 26421, -21963, -21963, 26421, 16596, -29792, -10548, 31933, 4062, -32759, 2589, 32232, -9135, -30378, 15303, 27270, -20841, -23039, 25519, 17856, -29146, -11939, 31569, 5527, -32692, 1110, 32466, -7704, -30902, 13978, 28063, -19677, -24068, 24564, 19079, -28439, -13305, 31140, 6981, -32558, -371, 32633, -6257, -31363, 12624, 28799, -18473, -25049, 23559, 20264, -27675, -14645, 30647, 8421, -32358, -1851, 32733, -4797, -31760, 11245, 29475, -17232, -25978, 22506, 21406, -26853, -15955, 30092, 9843, -32092, -3327}, -{32767, -1851, -32558, 5527, 31933, -9135, -30902, 12624, 29475, -15955, -27675, 19079, 25519, -21963, -23039, 24564, 20264, -26853, -17232, 28799, 13978, -30378, -10548, 31569, 6981, -32358, -3327, 32733, -371, -32692, 4062, 32232, -7704, -31363, 11245, 30092, -14645, -28439, 17856, 26421, -20841, -24068, 23559, 21406, -25978, -18473, 28063, 15303, -29792, -11939, 31140, 8421, -32092, -4797, 32633, 1110, -32759, 2589, 32466, -6257, -31760, 9843, 30647, -13305, -29146, 16596, 27270, -19677, -25049, 22506, 22506, -25049, -19677, 27270, 16596, -29146, -13305, 30647, 9843, -31760, -6257, 32466, 2589, -32759, 1110, 32633, -4797, -32092, 8421, 31140, -11939, -29792, 15303, 28063, -18473, -25978, 21406, 23559, -24068, -20841, 26421, 17856, -28439, -14645, 30092, 11245, -31363, -7704, 32232, 4062, -32692, -371, 32733, -3327, -32358, 6981, 31569, -10548, -30378, 13978, 28799, -17232, -26853, 20264, 24564, -23039, -21963, 25519, 19079, -27675, -15955, 29475, 12624, -30902, -9135, 31933, 5527, -32558, -1851}, -{32767, -371, -32759, 1110, 32733, -1851, -32692, 2589, 32633, -3327, -32558, 4062, 32466, -4797, -32358, 5527, 32232, -6257, -32092, 6981, 31933, -7704, -31760, 8421, 31569, -9135, -31363, 9843, 31140, -10548, -30902, 11245, 30647, -11939, -30378, 12624, 30092, -13305, -29792, 13978, 29475, -14645, -29146, 15303, 28799, -15955, -28439, 16596, 28063, -17232, -27675, 17856, 27270, -18473, -26853, 19079, 26421, -19677, -25978, 20264, 25519, -20841, -25049, 21406, 24564, -21963, -24068, 22506, 23559, -23039, -23039, 23559, 22506, -24068, -21963, 24564, 21406, -25049, -20841, 25519, 20264, -25978, -19677, 26421, 19079, -26853, -18473, 27270, 17856, -27675, -17232, 28063, 16596, -28439, -15955, 28799, 15303, -29146, -14645, 29475, 13978, -29792, -13305, 30092, 12624, -30378, -11939, 30647, 11245, -30902, -10548, 31140, 9843, -31363, -9135, 31569, 8421, -31760, -7704, 31933, 6981, -32092, -6257, 32232, 5527, -32358, -4797, 32466, 4062, -32558, -3327, 32633, 2589, -32692, -1851, 32733, 1110, -32759, -371}, -{32767, 1110, -32692, -3327, 32466, 5527, -32092, -7704, 31569, 9843, -30902, -11939, 30092, 13978, -29146, -15955, 28063, 17856, -26853, -19677, 25519, 21406, -24068, -23039, 22506, 24564, -20841, -25978, 19079, 27270, -17232, -28439, 15303, 29475, -13305, -30378, 11245, 31140, -9135, -31760, 6981, 32232, -4797, -32558, 2589, 32733, -371, -32759, -1851, 32633, 4062, -32358, -6257, 31933, 8421, -31363, -10548, 30647, 12624, -29792, -14645, 28799, 16596, -27675, -18473, 26421, 20264, -25049, -21963, 23559, 23559, -21963, -25049, 20264, 26421, -18473, -27675, 16596, 28799, -14645, -29792, 12624, 30647, -10548, -31363, 8421, 31933, -6257, -32358, 4062, 32633, -1851, -32759, -371, 32733, 2589, -32558, -4797, 32232, 6981, -31760, -9135, 31140, 11245, -30378, -13305, 29475, 15303, -28439, -17232, 27270, 19079, -25978, -20841, 24564, 22506, -23039, -24068, 21406, 25519, -19677, -26853, 17856, 28063, -15955, -29146, 13978, 30092, -11939, -30902, 9843, 31569, -7704, -32092, 5527, 32466, -3327, -32692, 1110}, -{32767, 2589, -32358, -7704, 31140, 12624, -29146, -17232, 26421, 21406, -23039, -25049, 19079, 28063, -14645, -30378, 9843, 31933, -4797, -32692, -371, 32633, 5527, -31760, -10548, 30092, 15303, -27675, -19677, 24564, 23559, -20841, -26853, 16596, 29475, -11939, -31363, 6981, 32466, -1851, -32759, -3327, 32232, 8421, -30902, -13305, 28799, 17856, -25978, -21963, 22506, 25519, -18473, -28439, 13978, 30647, -9135, -32092, 4062, 32733, 1110, -32558, -6257, 31569, 11245, -29792, -15955, 27270, 20264, -24068, -24068, 20264, 27270, -15955, -29792, 11245, 31569, -6257, -32558, 1110, 32733, 4062, -32092, -9135, 30647, 13978, -28439, -18473, 25519, 22506, -21963, -25978, 17856, 28799, -13305, -30902, 8421, 32232, -3327, -32759, -1851, 32466, 6981, -31363, -11939, 29475, 16596, -26853, -20841, 23559, 24564, -19677, -27675, 15303, 30092, -10548, -31760, 5527, 32633, -371, -32692, -4797, 31933, 9843, -30378, -14645, 28063, 19079, -25049, -23039, 21406, 26421, -17232, -29146, 12624, 31140, -7704, -32358, 2589}, -{32767, 4062, -31760, -11939, 28799, 19079, -24068, -25049, 17856, 29475, -10548, -32092, 2589, 32733, 5527, -31363, -13305, 28063, 20264, -23039, -25978, 16596, 30092, -9135, -32358, 1110, 32633, 6981, -30902, -14645, 27270, 21406, -21963, -26853, 15303, 30647, -7704, -32558, -371, 32466, 8421, -30378, -15955, 26421, 22506, -20841, -27675, 13978, 31140, -6257, -32692, -1851, 32232, 9843, -29792, -17232, 25519, 23559, -19677, -28439, 12624, 31569, -4797, -32759, -3327, 31933, 11245, -29146, -18473, 24564, 24564, -18473, -29146, 11245, 31933, -3327, -32759, -4797, 31569, 12624, -28439, -19677, 23559, 25519, -17232, -29792, 9843, 32232, -1851, -32692, -6257, 31140, 13978, -27675, -20841, 22506, 26421, -15955, -30378, 8421, 32466, -371, -32558, -7704, 30647, 15303, -26853, -21963, 21406, 27270, -14645, -30902, 6981, 32633, 1110, -32358, -9135, 30092, 16596, -25978, -23039, 20264, 28063, -13305, -31363, 5527, 32733, 2589, -32092, -10548, 29475, 17856, -25049, -24068, 19079, 28799, -11939, -31760, 4062}, -{32767, 5527, -30902, -15955, 25519, 24564, -17232, -30378, 6981, 32733, 4062, -31363, -14645, 26421, 23559, -18473, -29792, 8421, 32633, 2589, -31760, -13305, 27270, 22506, -19677, -29146, 9843, 32466, 1110, -32092, -11939, 28063, 21406, -20841, -28439, 11245, 32232, -371, -32358, -10548, 28799, 20264, -21963, -27675, 12624, 31933, -1851, -32558, -9135, 29475, 19079, -23039, -26853, 13978, 31569, -3327, -32692, -7704, 30092, 17856, -24068, -25978, 15303, 31140, -4797, -32759, -6257, 30647, 16596, -25049, -25049, 16596, 30647, -6257, -32759, -4797, 31140, 15303, -25978, -24068, 17856, 30092, -7704, -32692, -3327, 31569, 13978, -26853, -23039, 19079, 29475, -9135, -32558, -1851, 31933, 12624, -27675, -21963, 20264, 28799, -10548, -32358, -371, 32232, 11245, -28439, -20841, 21406, 28063, -11939, -32092, 1110, 32466, 9843, -29146, -19677, 22506, 27270, -13305, -31760, 2589, 32633, 8421, -29792, -18473, 23559, 26421, -14645, -31363, 4062, 32733, 6981, -30378, -17232, 24564, 25519, -15955, -30902, 5527}, -{32767, 6981, -29792, -19677, 21406, 28799, -9135, -32692, -4797, 30647, 17856, -23039, -27675, 11245, 32466, 2589, -31363, -15955, 24564, 26421, -13305, -32092, -371, 31933, 13978, -25978, -25049, 15303, 31569, -1851, -32358, -11939, 27270, 23559, -17232, -30902, 4062, 32633, 9843, -28439, -21963, 19079, 30092, -6257, -32759, -7704, 29475, 20264, -20841, -29146, 8421, 32733, 5527, -30378, -18473, 22506, 28063, -10548, -32558, -3327, 31140, 16596, -24068, -26853, 12624, 32232, 1110, -31760, -14645, 25519, 25519, -14645, -31760, 1110, 32232, 12624, -26853, -24068, 16596, 31140, -3327, -32558, -10548, 28063, 22506, -18473, -30378, 5527, 32733, 8421, -29146, -20841, 20264, 29475, -7704, -32759, -6257, 30092, 19079, -21963, -28439, 9843, 32633, 4062, -30902, -17232, 23559, 27270, -11939, -32358, -1851, 31569, 15303, -25049, -25978, 13978, 31933, -371, -32092, -13305, 26421, 24564, -15955, -31363, 2589, 32466, 11245, -27675, -23039, 17856, 30647, -4797, -32692, -9135, 28799, 21406, -19677, -29792, 6981}, -{32767, 8421, -28439, -23039, 16596, 31569, -371, -31760, -15955, 23559, 28063, -9135, -32759, -7704, 28799, 22506, -17232, -31363, 1110, 31933, 15303, -24068, -27675, 9843, 32733, 6981, -29146, -21963, 17856, 31140, -1851, -32092, -14645, 24564, 27270, -10548, -32692, -6257, 29475, 21406, -18473, -30902, 2589, 32232, 13978, -25049, -26853, 11245, 32633, 5527, -29792, -20841, 19079, 30647, -3327, -32358, -13305, 25519, 26421, -11939, -32558, -4797, 30092, 20264, -19677, -30378, 4062, 32466, 12624, -25978, -25978, 12624, 32466, 4062, -30378, -19677, 20264, 30092, -4797, -32558, -11939, 26421, 25519, -13305, -32358, -3327, 30647, 19079, -20841, -29792, 5527, 32633, 11245, -26853, -25049, 13978, 32232, 2589, -30902, -18473, 21406, 29475, -6257, -32692, -10548, 27270, 24564, -14645, -32092, -1851, 31140, 17856, -21963, -29146, 6981, 32733, 9843, -27675, -24068, 15303, 31933, 1110, -31363, -17232, 22506, 28799, -7704, -32759, -9135, 28063, 23559, -15955, -31760, -371, 31569, 16596, -23039, -28439, 8421}, -{32767, 9843, -26853, -25978, 11245, 32733, 8421, -27675, -25049, 12624, 32633, 6981, -28439, -24068, 13978, 32466, 5527, -29146, -23039, 15303, 32232, 4062, -29792, -21963, 16596, 31933, 2589, -30378, -20841, 17856, 31569, 1110, -30902, -19677, 19079, 31140, -371, -31363, -18473, 20264, 30647, -1851, -31760, -17232, 21406, 30092, -3327, -32092, -15955, 22506, 29475, -4797, -32358, -14645, 23559, 28799, -6257, -32558, -13305, 24564, 28063, -7704, -32692, -11939, 25519, 27270, -9135, -32759, -10548, 26421, 26421, -10548, -32759, -9135, 27270, 25519, -11939, -32692, -7704, 28063, 24564, -13305, -32558, -6257, 28799, 23559, -14645, -32358, -4797, 29475, 22506, -15955, -32092, -3327, 30092, 21406, -17232, -31760, -1851, 30647, 20264, -18473, -31363, -371, 31140, 19079, -19677, -30902, 1110, 31569, 17856, -20841, -30378, 2589, 31933, 16596, -21963, -29792, 4062, 32232, 15303, -23039, -29146, 5527, 32466, 13978, -24068, -28439, 6981, 32633, 12624, -25049, -27675, 8421, 32733, 11245, -25978, -26853, 9843}, -{32767, 11245, -25049, -28439, 5527, 32232, 16596, -20841, -30902, -371, 30647, 21406, -15955, -32358, -6257, 28063, 25519, -10548, -32759, -11939, 24564, 28799, -4797, -32092, -17232, 20264, 31140, 1110, -30378, -21963, 15303, 32466, 6981, -27675, -25978, 9843, 32733, 12624, -24068, -29146, 4062, 31933, 17856, -19677, -31363, -1851, 30092, 22506, -14645, -32558, -7704, 27270, 26421, -9135, -32692, -13305, 23559, 29475, -3327, -31760, -18473, 19079, 31569, 2589, -29792, -23039, 13978, 32633, 8421, -26853, -26853, 8421, 32633, 13978, -23039, -29792, 2589, 31569, 19079, -18473, -31760, -3327, 29475, 23559, -13305, -32692, -9135, 26421, 27270, -7704, -32558, -14645, 22506, 30092, -1851, -31363, -19677, 17856, 31933, 4062, -29146, -24068, 12624, 32733, 9843, -25978, -27675, 6981, 32466, 15303, -21963, -30378, 1110, 31140, 20264, -17232, -32092, -4797, 28799, 24564, -11939, -32759, -10548, 25519, 28063, -6257, -32358, -15955, 21406, 30647, -371, -30902, -20841, 16596, 32232, 5527, -28439, -25049, 11245}, -{32767, 12624, -23039, -30378, -371, 30092, 23559, -11939, -32759, -13305, 22506, 30647, 1110, -29792, -24068, 11245, 32733, 13978, -21963, -30902, -1851, 29475, 24564, -10548, -32692, -14645, 21406, 31140, 2589, -29146, -25049, 9843, 32633, 15303, -20841, -31363, -3327, 28799, 25519, -9135, -32558, -15955, 20264, 31569, 4062, -28439, -25978, 8421, 32466, 16596, -19677, -31760, -4797, 28063, 26421, -7704, -32358, -17232, 19079, 31933, 5527, -27675, -26853, 6981, 32232, 17856, -18473, -32092, -6257, 27270, 27270, -6257, -32092, -18473, 17856, 32232, 6981, -26853, -27675, 5527, 31933, 19079, -17232, -32358, -7704, 26421, 28063, -4797, -31760, -19677, 16596, 32466, 8421, -25978, -28439, 4062, 31569, 20264, -15955, -32558, -9135, 25519, 28799, -3327, -31363, -20841, 15303, 32633, 9843, -25049, -29146, 2589, 31140, 21406, -14645, -32692, -10548, 24564, 29475, -1851, -30902, -21963, 13978, 32733, 11245, -24068, -29792, 1110, 30647, 22506, -13305, -32759, -11939, 23559, 30092, -371, -30378, -23039, 12624}, -{32767, 13978, -20841, -31760, -6257, 26421, 28799, -1851, -30378, -24068, 9843, 32466, 17856, -17232, -32558, -10548, 23559, 30647, 2589, -28439, -26853, 5527, 31569, 21406, -13305, -32759, -14645, 20264, 31933, 6981, -25978, -29146, 1110, 30092, 24564, -9135, -32358, -18473, 16596, 32633, 11245, -23039, -30902, -3327, 28063, 27270, -4797, -31363, -21963, 12624, 32733, 15303, -19677, -32092, -7704, 25519, 29475, -371, -29792, -25049, 8421, 32232, 19079, -15955, -32692, -11939, 22506, 31140, 4062, -27675, -27675, 4062, 31140, 22506, -11939, -32692, -15955, 19079, 32232, 8421, -25049, -29792, -371, 29475, 25519, -7704, -32092, -19677, 15303, 32733, 12624, -21963, -31363, -4797, 27270, 28063, -3327, -30902, -23039, 11245, 32633, 16596, -18473, -32358, -9135, 24564, 30092, 1110, -29146, -25978, 6981, 31933, 20264, -14645, -32759, -13305, 21406, 31569, 5527, -26853, -28439, 2589, 30647, 23559, -10548, -32558, -17232, 17856, 32466, 9843, -24068, -30378, -1851, 28799, 26421, -6257, -31760, -20841, 13978}, -{32767, 15303, -18473, -32558, -11939, 21406, 31933, 8421, -24068, -30902, -4797, 26421, 29475, 1110, -28439, -27675, 2589, 30092, 25519, -6257, -31363, -23039, 9843, 32232, 20264, -13305, -32692, -17232, 16596, 32733, 13978, -19677, -32358, -10548, 22506, 31569, 6981, -25049, -30378, -3327, 27270, 28799, -371, -29146, -26853, 4062, 30647, 24564, -7704, -31760, -21963, 11245, 32466, 19079, -14645, -32759, -15955, 17856, 32633, 12624, -20841, -32092, -9135, 23559, 31140, 5527, -25978, -29792, -1851, 28063, 28063, -1851, -29792, -25978, 5527, 31140, 23559, -9135, -32092, -20841, 12624, 32633, 17856, -15955, -32759, -14645, 19079, 32466, 11245, -21963, -31760, -7704, 24564, 30647, 4062, -26853, -29146, -371, 28799, 27270, -3327, -30378, -25049, 6981, 31569, 22506, -10548, -32358, -19677, 13978, 32733, 16596, -17232, -32692, -13305, 20264, 32232, 9843, -23039, -31363, -6257, 25519, 30092, 2589, -27675, -28439, 1110, 29475, 26421, -4797, -30902, -24068, 8421, 31933, 21406, -11939, -32558, -18473, 15303}, -{32767, 16596, -15955, -32759, -17232, 15303, 32733, 17856, -14645, -32692, -18473, 13978, 32633, 19079, -13305, -32558, -19677, 12624, 32466, 20264, -11939, -32358, -20841, 11245, 32232, 21406, -10548, -32092, -21963, 9843, 31933, 22506, -9135, -31760, -23039, 8421, 31569, 23559, -7704, -31363, -24068, 6981, 31140, 24564, -6257, -30902, -25049, 5527, 30647, 25519, -4797, -30378, -25978, 4062, 30092, 26421, -3327, -29792, -26853, 2589, 29475, 27270, -1851, -29146, -27675, 1110, 28799, 28063, -371, -28439, -28439, -371, 28063, 28799, 1110, -27675, -29146, -1851, 27270, 29475, 2589, -26853, -29792, -3327, 26421, 30092, 4062, -25978, -30378, -4797, 25519, 30647, 5527, -25049, -30902, -6257, 24564, 31140, 6981, -24068, -31363, -7704, 23559, 31569, 8421, -23039, -31760, -9135, 22506, 31933, 9843, -21963, -32092, -10548, 21406, 32232, 11245, -20841, -32358, -11939, 20264, 32466, 12624, -19677, -32558, -13305, 19079, 32633, 13978, -18473, -32692, -14645, 17856, 32733, 15303, -17232, -32759, -15955, 16596}, -{32767, 17856, -13305, -32358, -21963, 8421, 31140, 25519, -3327, -29146, -28439, -1851, 26421, 30647, 6981, -23039, -32092, -11939, 19079, 32733, 16596, -14645, -32558, -20841, 9843, 31569, 24564, -4797, -29792, -27675, -371, 27270, 30092, 5527, -24068, -31760, -10548, 20264, 32633, 15303, -15955, -32692, -19677, 11245, 31933, 23559, -6257, -30378, -26853, 1110, 28063, 29475, 4062, -25049, -31363, -9135, 21406, 32466, 13978, -17232, -32759, -18473, 12624, 32232, 22506, -7704, -30902, -25978, 2589, 28799, 28799, 2589, -25978, -30902, -7704, 22506, 32232, 12624, -18473, -32759, -17232, 13978, 32466, 21406, -9135, -31363, -25049, 4062, 29475, 28063, 1110, -26853, -30378, -6257, 23559, 31933, 11245, -19677, -32692, -15955, 15303, 32633, 20264, -10548, -31760, -24068, 5527, 30092, 27270, -371, -27675, -29792, -4797, 24564, 31569, 9843, -20841, -32558, -14645, 16596, 32733, 19079, -11939, -32092, -23039, 6981, 30647, 26421, -1851, -28439, -29146, -3327, 25519, 31140, 8421, -21963, -32358, -13305, 17856}, -{32767, 19079, -10548, -31363, -25978, 1110, 27270, 30647, 8421, -20841, -32692, -17232, 12624, 31933, 24564, -3327, -28439, -29792, -6257, 22506, 32466, 15303, -14645, -32358, -23039, 5527, 29475, 28799, 4062, -24068, -32092, -13305, 16596, 32633, 21406, -7704, -30378, -27675, -1851, 25519, 31569, 11245, -18473, -32759, -19677, 9843, 31140, 26421, -371, -26853, -30902, -9135, 20264, 32733, 17856, -11939, -31760, -25049, 2589, 28063, 30092, 6981, -21963, -32558, -15955, 13978, 32232, 23559, -4797, -29146, -29146, -4797, 23559, 32232, 13978, -15955, -32558, -21963, 6981, 30092, 28063, 2589, -25049, -31760, -11939, 17856, 32733, 20264, -9135, -30902, -26853, -371, 26421, 31140, 9843, -19677, -32759, -18473, 11245, 31569, 25519, -1851, -27675, -30378, -7704, 21406, 32633, 16596, -13305, -32092, -24068, 4062, 28799, 29475, 5527, -23039, -32358, -14645, 15303, 32466, 22506, -6257, -29792, -28439, -3327, 24564, 31933, 12624, -17232, -32692, -20841, 8421, 30647, 27270, 1110, -25978, -31363, -10548, 19079}, -{32767, 20264, -7704, -29792, -29146, -6257, 21406, 32733, 19079, -9135, -30378, -28439, -4797, 22506, 32633, 17856, -10548, -30902, -27675, -3327, 23559, 32466, 16596, -11939, -31363, -26853, -1851, 24564, 32232, 15303, -13305, -31760, -25978, -371, 25519, 31933, 13978, -14645, -32092, -25049, 1110, 26421, 31569, 12624, -15955, -32358, -24068, 2589, 27270, 31140, 11245, -17232, -32558, -23039, 4062, 28063, 30647, 9843, -18473, -32692, -21963, 5527, 28799, 30092, 8421, -19677, -32759, -20841, 6981, 29475, 29475, 6981, -20841, -32759, -19677, 8421, 30092, 28799, 5527, -21963, -32692, -18473, 9843, 30647, 28063, 4062, -23039, -32558, -17232, 11245, 31140, 27270, 2589, -24068, -32358, -15955, 12624, 31569, 26421, 1110, -25049, -32092, -14645, 13978, 31933, 25519, -371, -25978, -31760, -13305, 15303, 32232, 24564, -1851, -26853, -31363, -11939, 16596, 32466, 23559, -3327, -27675, -30902, -10548, 17856, 32633, 22506, -4797, -28439, -30378, -9135, 19079, 32733, 21406, -6257, -29146, -29792, -7704, 20264}, -{32767, 21406, -4797, -27675, -31363, -13305, 13978, 31569, 27270, 4062, -21963, -32759, -20841, 5527, 28063, 31140, 12624, -14645, -31760, -26853, -3327, 22506, 32733, 20264, -6257, -28439, -30902, -11939, 15303, 31933, 26421, 2589, -23039, -32692, -19677, 6981, 28799, 30647, 11245, -15955, -32092, -25978, -1851, 23559, 32633, 19079, -7704, -29146, -30378, -10548, 16596, 32232, 25519, 1110, -24068, -32558, -18473, 8421, 29475, 30092, 9843, -17232, -32358, -25049, -371, 24564, 32466, 17856, -9135, -29792, -29792, -9135, 17856, 32466, 24564, -371, -25049, -32358, -17232, 9843, 30092, 29475, 8421, -18473, -32558, -24068, 1110, 25519, 32232, 16596, -10548, -30378, -29146, -7704, 19079, 32633, 23559, -1851, -25978, -32092, -15955, 11245, 30647, 28799, 6981, -19677, -32692, -23039, 2589, 26421, 31933, 15303, -11939, -30902, -28439, -6257, 20264, 32733, 22506, -3327, -26853, -31760, -14645, 12624, 31140, 28063, 5527, -20841, -32759, -21963, 4062, 27270, 31569, 13978, -13305, -31363, -27675, -4797, 21406}, -{32767, 22506, -1851, -25049, -32558, -19677, 5527, 27270, 31933, 16596, -9135, -29146, -30902, -13305, 12624, 30647, 29475, 9843, -15955, -31760, -27675, -6257, 19079, 32466, 25519, 2589, -21963, -32759, -23039, 1110, 24564, 32633, 20264, -4797, -26853, -32092, -17232, 8421, 28799, 31140, 13978, -11939, -30378, -29792, -10548, 15303, 31569, 28063, 6981, -18473, -32358, -25978, -3327, 21406, 32733, 23559, -371, -24068, -32692, -20841, 4062, 26421, 32232, 17856, -7704, -28439, -31363, -14645, 11245, 30092, 30092, 11245, -14645, -31363, -28439, -7704, 17856, 32232, 26421, 4062, -20841, -32692, -24068, -371, 23559, 32733, 21406, -3327, -25978, -32358, -18473, 6981, 28063, 31569, 15303, -10548, -29792, -30378, -11939, 13978, 31140, 28799, 8421, -17232, -32092, -26853, -4797, 20264, 32633, 24564, 1110, -23039, -32759, -21963, 2589, 25519, 32466, 19079, -6257, -27675, -31760, -15955, 9843, 29475, 30647, 12624, -13305, -30902, -29146, -9135, 16596, 31933, 27270, 5527, -19677, -32558, -25049, -1851, 22506}, -{32767, 23559, 1110, -21963, -32692, -25049, -3327, 20264, 32466, 26421, 5527, -18473, -32092, -27675, -7704, 16596, 31569, 28799, 9843, -14645, -30902, -29792, -11939, 12624, 30092, 30647, 13978, -10548, -29146, -31363, -15955, 8421, 28063, 31933, 17856, -6257, -26853, -32358, -19677, 4062, 25519, 32633, 21406, -1851, -24068, -32759, -23039, -371, 22506, 32733, 24564, 2589, -20841, -32558, -25978, -4797, 19079, 32232, 27270, 6981, -17232, -31760, -28439, -9135, 15303, 31140, 29475, 11245, -13305, -30378, -30378, -13305, 11245, 29475, 31140, 15303, -9135, -28439, -31760, -17232, 6981, 27270, 32232, 19079, -4797, -25978, -32558, -20841, 2589, 24564, 32733, 22506, -371, -23039, -32759, -24068, -1851, 21406, 32633, 25519, 4062, -19677, -32358, -26853, -6257, 17856, 31933, 28063, 8421, -15955, -31363, -29146, -10548, 13978, 30647, 30092, 12624, -11939, -29792, -30902, -14645, 9843, 28799, 31569, 16596, -7704, -27675, -32092, -18473, 5527, 26421, 32466, 20264, -3327, -25049, -32692, -21963, 1110, 23559}, -{32767, 24564, 4062, -18473, -31760, -29146, -11939, 11245, 28799, 31933, 19079, -3327, -24068, -32759, -25049, -4797, 17856, 31569, 29475, 12624, -10548, -28439, -32092, -19677, 2589, 23559, 32733, 25519, 5527, -17232, -31363, -29792, -13305, 9843, 28063, 32232, 20264, -1851, -23039, -32692, -25978, -6257, 16596, 31140, 30092, 13978, -9135, -27675, -32358, -20841, 1110, 22506, 32633, 26421, 6981, -15955, -30902, -30378, -14645, 8421, 27270, 32466, 21406, -371, -21963, -32558, -26853, -7704, 15303, 30647, 30647, 15303, -7704, -26853, -32558, -21963, -371, 21406, 32466, 27270, 8421, -14645, -30378, -30902, -15955, 6981, 26421, 32633, 22506, 1110, -20841, -32358, -27675, -9135, 13978, 30092, 31140, 16596, -6257, -25978, -32692, -23039, -1851, 20264, 32232, 28063, 9843, -13305, -29792, -31363, -17232, 5527, 25519, 32733, 23559, 2589, -19677, -32092, -28439, -10548, 12624, 29475, 31569, 17856, -4797, -25049, -32759, -24068, -3327, 19079, 31933, 28799, 11245, -11939, -29146, -31760, -18473, 4062, 24564}, -{32767, 25519, 6981, -14645, -29792, -31760, -19677, 1110, 21406, 32232, 28799, 12624, -9135, -26853, -32692, -24068, -4797, 16596, 30647, 31140, 17856, -3327, -23039, -32558, -27675, -10548, 11245, 28063, 32466, 22506, 2589, -18473, -31363, -30378, -15955, 5527, 24564, 32733, 26421, 8421, -13305, -29146, -32092, -20841, -371, 20264, 31933, 29475, 13978, -7704, -25978, -32759, -25049, -6257, 15303, 30092, 31569, 19079, -1851, -21963, -32358, -28439, -11939, 9843, 27270, 32633, 23559, 4062, -17232, -30902, -30902, -17232, 4062, 23559, 32633, 27270, 9843, -11939, -28439, -32358, -21963, -1851, 19079, 31569, 30092, 15303, -6257, -25049, -32759, -25978, -7704, 13978, 29475, 31933, 20264, -371, -20841, -32092, -29146, -13305, 8421, 26421, 32733, 24564, 5527, -15955, -30378, -31363, -18473, 2589, 22506, 32466, 28063, 11245, -10548, -27675, -32558, -23039, -3327, 17856, 31140, 30647, 16596, -4797, -24068, -32692, -26853, -9135, 12624, 28799, 32232, 21406, 1110, -19677, -31760, -29792, -14645, 6981, 25519}, -{32767, 26421, 9843, -10548, -26853, -32759, -25978, -9135, 11245, 27270, 32733, 25519, 8421, -11939, -27675, -32692, -25049, -7704, 12624, 28063, 32633, 24564, 6981, -13305, -28439, -32558, -24068, -6257, 13978, 28799, 32466, 23559, 5527, -14645, -29146, -32358, -23039, -4797, 15303, 29475, 32232, 22506, 4062, -15955, -29792, -32092, -21963, -3327, 16596, 30092, 31933, 21406, 2589, -17232, -30378, -31760, -20841, -1851, 17856, 30647, 31569, 20264, 1110, -18473, -30902, -31363, -19677, -371, 19079, 31140, 31140, 19079, -371, -19677, -31363, -30902, -18473, 1110, 20264, 31569, 30647, 17856, -1851, -20841, -31760, -30378, -17232, 2589, 21406, 31933, 30092, 16596, -3327, -21963, -32092, -29792, -15955, 4062, 22506, 32232, 29475, 15303, -4797, -23039, -32358, -29146, -14645, 5527, 23559, 32466, 28799, 13978, -6257, -24068, -32558, -28439, -13305, 6981, 24564, 32633, 28063, 12624, -7704, -25049, -32692, -27675, -11939, 8421, 25519, 32733, 27270, 11245, -9135, -25978, -32759, -26853, -10548, 9843, 26421}, -{32767, 27270, 12624, -6257, -23039, -32092, -30378, -18473, -371, 17856, 30092, 32232, 23559, 6981, -11939, -26853, -32759, -27675, -13305, 5527, 22506, 31933, 30647, 19079, 1110, -17232, -29792, -32358, -24068, -7704, 11245, 26421, 32733, 28063, 13978, -4797, -21963, -31760, -30902, -19677, -1851, 16596, 29475, 32466, 24564, 8421, -10548, -25978, -32692, -28439, -14645, 4062, 21406, 31569, 31140, 20264, 2589, -15955, -29146, -32558, -25049, -9135, 9843, 25519, 32633, 28799, 15303, -3327, -20841, -31363, -31363, -20841, -3327, 15303, 28799, 32633, 25519, 9843, -9135, -25049, -32558, -29146, -15955, 2589, 20264, 31140, 31569, 21406, 4062, -14645, -28439, -32692, -25978, -10548, 8421, 24564, 32466, 29475, 16596, -1851, -19677, -30902, -31760, -21963, -4797, 13978, 28063, 32733, 26421, 11245, -7704, -24068, -32358, -29792, -17232, 1110, 19079, 30647, 31933, 22506, 5527, -13305, -27675, -32759, -26853, -11939, 6981, 23559, 32232, 30092, 17856, -371, -18473, -30378, -32092, -23039, -6257, 12624, 27270}, -{32767, 28063, 15303, -1851, -18473, -29792, -32558, -25978, -11939, 5527, 21406, 31140, 31933, 23559, 8421, -9135, -24068, -32092, -30902, -20841, -4797, 12624, 26421, 32633, 29475, 17856, 1110, -15955, -28439, -32759, -27675, -14645, 2589, 19079, 30092, 32466, 25519, 11245, -6257, -21963, -31363, -31760, -23039, -7704, 9843, 24564, 32232, 30647, 20264, 4062, -13305, -26853, -32692, -29146, -17232, -371, 16596, 28799, 32733, 27270, 13978, -3327, -19677, -30378, -32358, -25049, -10548, 6981, 22506, 31569, 31569, 22506, 6981, -10548, -25049, -32358, -30378, -19677, -3327, 13978, 27270, 32733, 28799, 16596, -371, -17232, -29146, -32692, -26853, -13305, 4062, 20264, 30647, 32232, 24564, 9843, -7704, -23039, -31760, -31363, -21963, -6257, 11245, 25519, 32466, 30092, 19079, 2589, -14645, -27675, -32759, -28439, -15955, 1110, 17856, 29475, 32633, 26421, 12624, -4797, -20841, -30902, -32092, -24068, -9135, 8421, 23559, 31933, 31140, 21406, 5527, -11939, -25978, -32558, -29792, -18473, -1851, 15303, 28063}, -{32767, 28799, 17856, 2589, -13305, -25978, -32358, -30902, -21963, -7704, 8421, 22506, 31140, 32232, 25519, 12624, -3327, -18473, -29146, -32759, -28439, -17232, -1851, 13978, 26421, 32466, 30647, 21406, 6981, -9135, -23039, -31363, -32092, -25049, -11939, 4062, 19079, 29475, 32733, 28063, 16596, 1110, -14645, -26853, -32558, -30378, -20841, -6257, 9843, 23559, 31569, 31933, 24564, 11245, -4797, -19677, -29792, -32692, -27675, -15955, -371, 15303, 27270, 32633, 30092, 20264, 5527, -10548, -24068, -31760, -31760, -24068, -10548, 5527, 20264, 30092, 32633, 27270, 15303, -371, -15955, -27675, -32692, -29792, -19677, -4797, 11245, 24564, 31933, 31569, 23559, 9843, -6257, -20841, -30378, -32558, -26853, -14645, 1110, 16596, 28063, 32733, 29475, 19079, 4062, -11939, -25049, -32092, -31363, -23039, -9135, 6981, 21406, 30647, 32466, 26421, 13978, -1851, -17232, -28439, -32759, -29146, -18473, -3327, 12624, 25519, 32232, 31140, 22506, 8421, -7704, -21963, -30902, -32358, -25978, -13305, 2589, 17856, 28799}, -{32767, 29475, 20264, 6981, -7704, -20841, -29792, -32759, -29146, -19677, -6257, 8421, 21406, 30092, 32733, 28799, 19079, 5527, -9135, -21963, -30378, -32692, -28439, -18473, -4797, 9843, 22506, 30647, 32633, 28063, 17856, 4062, -10548, -23039, -30902, -32558, -27675, -17232, -3327, 11245, 23559, 31140, 32466, 27270, 16596, 2589, -11939, -24068, -31363, -32358, -26853, -15955, -1851, 12624, 24564, 31569, 32232, 26421, 15303, 1110, -13305, -25049, -31760, -32092, -25978, -14645, -371, 13978, 25519, 31933, 31933, 25519, 13978, -371, -14645, -25978, -32092, -31760, -25049, -13305, 1110, 15303, 26421, 32232, 31569, 24564, 12624, -1851, -15955, -26853, -32358, -31363, -24068, -11939, 2589, 16596, 27270, 32466, 31140, 23559, 11245, -3327, -17232, -27675, -32558, -30902, -23039, -10548, 4062, 17856, 28063, 32633, 30647, 22506, 9843, -4797, -18473, -28439, -32692, -30378, -21963, -9135, 5527, 19079, 28799, 32733, 30092, 21406, 8421, -6257, -19677, -29146, -32759, -29792, -20841, -7704, 6981, 20264, 29475}, -{32767, 30092, 22506, 11245, -1851, -14645, -25049, -31363, -32558, -28439, -19677, -7704, 5527, 17856, 27270, 32232, 31933, 26421, 16596, 4062, -9135, -20841, -29146, -32692, -30902, -24068, -13305, -371, 12624, 23559, 30647, 32733, 29475, 21406, 9843, -3327, -15955, -25978, -31760, -32358, -27675, -18473, -6257, 6981, 19079, 28063, 32466, 31569, 25519, 15303, 2589, -10548, -21963, -29792, -32759, -30378, -23039, -11939, 1110, 13978, 24564, 31140, 32633, 28799, 20264, 8421, -4797, -17232, -26853, -32092, -32092, -26853, -17232, -4797, 8421, 20264, 28799, 32633, 31140, 24564, 13978, 1110, -11939, -23039, -30378, -32759, -29792, -21963, -10548, 2589, 15303, 25519, 31569, 32466, 28063, 19079, 6981, -6257, -18473, -27675, -32358, -31760, -25978, -15955, -3327, 9843, 21406, 29475, 32733, 30647, 23559, 12624, -371, -13305, -24068, -30902, -32692, -29146, -20841, -9135, 4062, 16596, 26421, 31933, 32232, 27270, 17856, 5527, -7704, -19677, -28439, -32558, -31363, -25049, -14645, -1851, 11245, 22506, 30092}, -{32767, 30647, 24564, 15303, 4062, -7704, -18473, -26853, -31760, -32558, -29146, -21963, -11939, -371, 11245, 21406, 28799, 32466, 31933, 27270, 19079, 8421, -3327, -14645, -24068, -30378, -32759, -30902, -25049, -15955, -4797, 6981, 17856, 26421, 31569, 32633, 29475, 22506, 12624, 1110, -10548, -20841, -28439, -32358, -32092, -27675, -19677, -9135, 2589, 13978, 23559, 30092, 32733, 31140, 25519, 16596, 5527, -6257, -17232, -25978, -31363, -32692, -29792, -23039, -13305, -1851, 9843, 20264, 28063, 32232, 32232, 28063, 20264, 9843, -1851, -13305, -23039, -29792, -32692, -31363, -25978, -17232, -6257, 5527, 16596, 25519, 31140, 32733, 30092, 23559, 13978, 2589, -9135, -19677, -27675, -32092, -32358, -28439, -20841, -10548, 1110, 12624, 22506, 29475, 32633, 31569, 26421, 17856, 6981, -4797, -15955, -25049, -30902, -32759, -30378, -24068, -14645, -3327, 8421, 19079, 27270, 31933, 32466, 28799, 21406, 11245, -371, -11939, -21963, -29146, -32558, -31760, -26853, -18473, -7704, 4062, 15303, 24564, 30647}, -{32767, 31140, 26421, 19079, 9843, -371, -10548, -19677, -26853, -31363, -32759, -30902, -25978, -18473, -9135, 1110, 11245, 20264, 27270, 31569, 32733, 30647, 25519, 17856, 8421, -1851, -11939, -20841, -27675, -31760, -32692, -30378, -25049, -17232, -7704, 2589, 12624, 21406, 28063, 31933, 32633, 30092, 24564, 16596, 6981, -3327, -13305, -21963, -28439, -32092, -32558, -29792, -24068, -15955, -6257, 4062, 13978, 22506, 28799, 32232, 32466, 29475, 23559, 15303, 5527, -4797, -14645, -23039, -29146, -32358, -32358, -29146, -23039, -14645, -4797, 5527, 15303, 23559, 29475, 32466, 32232, 28799, 22506, 13978, 4062, -6257, -15955, -24068, -29792, -32558, -32092, -28439, -21963, -13305, -3327, 6981, 16596, 24564, 30092, 32633, 31933, 28063, 21406, 12624, 2589, -7704, -17232, -25049, -30378, -32692, -31760, -27675, -20841, -11939, -1851, 8421, 17856, 25519, 30647, 32733, 31569, 27270, 20264, 11245, 1110, -9135, -18473, -25978, -30902, -32759, -31363, -26853, -19677, -10548, -371, 9843, 19079, 26421, 31140}, -{32767, 31569, 28063, 22506, 15303, 6981, -1851, -10548, -18473, -25049, -29792, -32358, -32558, -30378, -25978, -19677, -11939, -3327, 5527, 13978, 21406, 27270, 31140, 32733, 31933, 28799, 23559, 16596, 8421, -371, -9135, -17232, -24068, -29146, -32092, -32692, -30902, -26853, -20841, -13305, -4797, 4062, 12624, 20264, 26421, 30647, 32633, 32232, 29475, 24564, 17856, 9843, 1110, -7704, -15955, -23039, -28439, -31760, -32759, -31363, -27675, -21963, -14645, -6257, 2589, 11245, 19079, 25519, 30092, 32466, 32466, 30092, 25519, 19079, 11245, 2589, -6257, -14645, -21963, -27675, -31363, -32759, -31760, -28439, -23039, -15955, -7704, 1110, 9843, 17856, 24564, 29475, 32232, 32633, 30647, 26421, 20264, 12624, 4062, -4797, -13305, -20841, -26853, -30902, -32692, -32092, -29146, -24068, -17232, -9135, -371, 8421, 16596, 23559, 28799, 31933, 32733, 31140, 27270, 21406, 13978, 5527, -3327, -11939, -19677, -25978, -30378, -32558, -32358, -29792, -25049, -18473, -10548, -1851, 6981, 15303, 22506, 28063, 31569}, -{32767, 31933, 29475, 25519, 20264, 13978, 6981, -371, -7704, -14645, -20841, -25978, -29792, -32092, -32759, -31760, -29146, -25049, -19677, -13305, -6257, 1110, 8421, 15303, 21406, 26421, 30092, 32232, 32733, 31569, 28799, 24564, 19079, 12624, 5527, -1851, -9135, -15955, -21963, -26853, -30378, -32358, -32692, -31363, -28439, -24068, -18473, -11939, -4797, 2589, 9843, 16596, 22506, 27270, 30647, 32466, 32633, 31140, 28063, 23559, 17856, 11245, 4062, -3327, -10548, -17232, -23039, -27675, -30902, -32558, -32558, -30902, -27675, -23039, -17232, -10548, -3327, 4062, 11245, 17856, 23559, 28063, 31140, 32633, 32466, 30647, 27270, 22506, 16596, 9843, 2589, -4797, -11939, -18473, -24068, -28439, -31363, -32692, -32358, -30378, -26853, -21963, -15955, -9135, -1851, 5527, 12624, 19079, 24564, 28799, 31569, 32733, 32232, 30092, 26421, 21406, 15303, 8421, 1110, -6257, -13305, -19677, -25049, -29146, -31760, -32759, -32092, -29792, -25978, -20841, -14645, -7704, -371, 6981, 13978, 20264, 25519, 29475, 31933}, -{32767, 32232, 30647, 28063, 24564, 20264, 15303, 9843, 4062, -1851, -7704, -13305, -18473, -23039, -26853, -29792, -31760, -32692, -32558, -31363, -29146, -25978, -21963, -17232, -11939, -6257, -371, 5527, 11245, 16596, 21406, 25519, 28799, 31140, 32466, 32733, 31933, 30092, 27270, 23559, 19079, 13978, 8421, 2589, -3327, -9135, -14645, -19677, -24068, -27675, -30378, -32092, -32759, -32358, -30902, -28439, -25049, -20841, -15955, -10548, -4797, 1110, 6981, 12624, 17856, 22506, 26421, 29475, 31569, 32633, 32633, 31569, 29475, 26421, 22506, 17856, 12624, 6981, 1110, -4797, -10548, -15955, -20841, -25049, -28439, -30902, -32358, -32759, -32092, -30378, -27675, -24068, -19677, -14645, -9135, -3327, 2589, 8421, 13978, 19079, 23559, 27270, 30092, 31933, 32733, 32466, 31140, 28799, 25519, 21406, 16596, 11245, 5527, -371, -6257, -11939, -17232, -21963, -25978, -29146, -31363, -32558, -32692, -31760, -29792, -26853, -23039, -18473, -13305, -7704, -1851, 4062, 9843, 15303, 20264, 24564, 28063, 30647, 32232}, -{32767, 32466, 31569, 30092, 28063, 25519, 22506, 19079, 15303, 11245, 6981, 2589, -1851, -6257, -10548, -14645, -18473, -21963, -25049, -27675, -29792, -31363, -32358, -32759, -32558, -31760, -30378, -28439, -25978, -23039, -19677, -15955, -11939, -7704, -3327, 1110, 5527, 9843, 13978, 17856, 21406, 24564, 27270, 29475, 31140, 32232, 32733, 32633, 31933, 30647, 28799, 26421, 23559, 20264, 16596, 12624, 8421, 4062, -371, -4797, -9135, -13305, -17232, -20841, -24068, -26853, -29146, -30902, -32092, -32692, -32692, -32092, -30902, -29146, -26853, -24068, -20841, -17232, -13305, -9135, -4797, -371, 4062, 8421, 12624, 16596, 20264, 23559, 26421, 28799, 30647, 31933, 32633, 32733, 32232, 31140, 29475, 27270, 24564, 21406, 17856, 13978, 9843, 5527, 1110, -3327, -7704, -11939, -15955, -19677, -23039, -25978, -28439, -30378, -31760, -32558, -32759, -32358, -31363, -29792, -27675, -25049, -21963, -18473, -14645, -10548, -6257, -1851, 2589, 6981, 11245, 15303, 19079, 22506, 25519, 28063, 30092, 31569, 32466}, -{32767, 32633, 32232, 31569, 30647, 29475, 28063, 26421, 24564, 22506, 20264, 17856, 15303, 12624, 9843, 6981, 4062, 1110, -1851, -4797, -7704, -10548, -13305, -15955, -18473, -20841, -23039, -25049, -26853, -28439, -29792, -30902, -31760, -32358, -32692, -32759, -32558, -32092, -31363, -30378, -29146, -27675, -25978, -24068, -21963, -19677, -17232, -14645, -11939, -9135, -6257, -3327, -371, 2589, 5527, 8421, 11245, 13978, 16596, 19079, 21406, 23559, 25519, 27270, 28799, 30092, 31140, 31933, 32466, 32733, 32733, 32466, 31933, 31140, 30092, 28799, 27270, 25519, 23559, 21406, 19079, 16596, 13978, 11245, 8421, 5527, 2589, -371, -3327, -6257, -9135, -11939, -14645, -17232, -19677, -21963, -24068, -25978, -27675, -29146, -30378, -31363, -32092, -32558, -32759, -32692, -32358, -31760, -30902, -29792, -28439, -26853, -25049, -23039, -20841, -18473, -15955, -13305, -10548, -7704, -4797, -1851, 1110, 4062, 6981, 9843, 12624, 15303, 17856, 20264, 22506, 24564, 26421, 28063, 29475, 30647, 31569, 32232, 32633}, -{32767, 32733, 32633, 32466, 32232, 31933, 31569, 31140, 30647, 30092, 29475, 28799, 28063, 27270, 26421, 25519, 24564, 23559, 22506, 21406, 20264, 19079, 17856, 16596, 15303, 13978, 12624, 11245, 9843, 8421, 6981, 5527, 4062, 2589, 1110, -371, -1851, -3327, -4797, -6257, -7704, -9135, -10548, -11939, -13305, -14645, -15955, -17232, -18473, -19677, -20841, -21963, -23039, -24068, -25049, -25978, -26853, -27675, -28439, -29146, -29792, -30378, -30902, -31363, -31760, -32092, -32358, -32558, -32692, -32759, -32759, -32692, -32558, -32358, -32092, -31760, -31363, -30902, -30378, -29792, -29146, -28439, -27675, -26853, -25978, -25049, -24068, -23039, -21963, -20841, -19677, -18473, -17232, -15955, -14645, -13305, -11939, -10548, -9135, -7704, -6257, -4797, -3327, -1851, -371, 1110, 2589, 4062, 5527, 6981, 8421, 9843, 11245, 12624, 13978, 15303, 16596, 17856, 19079, 20264, 21406, 22506, 23559, 24564, 25519, 26421, 27270, 28063, 28799, 29475, 30092, 30647, 31140, 31569, 31933, 32232, 32466, 32633, 32733} -}; - - -int16_t prach_fft139_im[139][139] = { -{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -{0, -1481, -2959, -4430, -5893, -7343, -8779, -10196, -11593, -12966, -14313, -15630, -16916, -18166, -19380, -20554, -21686, -22774, -23816, -24808, -25750, -26640, -27474, -28253, -28974, -29636, -30238, -30777, -31254, -31667, -32015, -32298, -32515, -32665, -32749, -32765, -32715, -32598, -32415, -32165, -31849, -31469, -31024, -30515, -29945, -29313, -28621, -27871, -27064, -26202, -25286, -24318, -23301, -22236, -21126, -19972, -18778, -17545, -16277, -14975, -13643, -12283, -10898, -9490, -8063, -6620, -5163, -3696, -2221, -741, 740, 2220, 3695, 5162, 6619, 8062, 9489, 10897, 12282, 13642, 14974, 16276, 17544, 18777, 19971, 21125, 22235, 23300, 24317, 25285, 26201, 27063, 27870, 28620, 29312, 29944, 30514, 31023, 31468, 31848, 32164, 32414, 32597, 32714, 32764, 32748, 32664, 32514, 32297, 32014, 31666, 31253, 30776, 30237, 29635, 28973, 28252, 27473, 26639, 25749, 24807, 23815, 22773, 21685, 20553, 19379, 18165, 16915, 15629, 14312, 12965, 11592, 10195, 8778, 7342, 5892, 4429, 2958, 1480}, -{0, -2959, -5893, -8779, -11593, -14313, -16916, -19380, -21686, -23816, -25750, -27474, -28974, -30238, -31254, -32015, -32515, -32749, -32715, -32415, -31849, -31024, -29945, -28621, -27064, -25286, -23301, -21126, -18778, -16277, -13643, -10898, -8063, -5163, -2221, 740, 3695, 6619, 9489, 12282, 14974, 17544, 19971, 22235, 24317, 26201, 27870, 29312, 30514, 31468, 32164, 32597, 32764, 32664, 32297, 31666, 30776, 29635, 28252, 26639, 24807, 22773, 20553, 18165, 15629, 12965, 10195, 7342, 4429, 1480, -1481, -4430, -7343, -10196, -12966, -15630, -18166, -20554, -22774, -24808, -26640, -28253, -29636, -30777, -31667, -32298, -32665, -32765, -32598, -32165, -31469, -30515, -29313, -27871, -26202, -24318, -22236, -19972, -17545, -14975, -12283, -9490, -6620, -3696, -741, 2220, 5162, 8062, 10897, 13642, 16276, 18777, 21125, 23300, 25285, 27063, 28620, 29944, 31023, 31848, 32414, 32714, 32748, 32514, 32014, 31253, 30237, 28973, 27473, 25749, 23815, 21685, 19379, 16915, 14312, 11592, 8778, 5892, 2958}, -{0, -4430, -8779, -12966, -16916, -20554, -23816, -26640, -28974, -30777, -32015, -32665, -32715, -32165, -31024, -29313, -27064, -24318, -21126, -17545, -13643, -9490, -5163, -741, 3695, 8062, 12282, 16276, 19971, 23300, 26201, 28620, 30514, 31848, 32597, 32748, 32297, 31253, 29635, 27473, 24807, 21685, 18165, 14312, 10195, 5892, 1480, -2959, -7343, -11593, -15630, -19380, -22774, -25750, -28253, -30238, -31667, -32515, -32765, -32415, -31469, -29945, -27871, -25286, -22236, -18778, -14975, -10898, -6620, -2221, 2220, 6619, 10897, 14974, 18777, 22235, 25285, 27870, 29944, 31468, 32414, 32764, 32514, 31666, 30237, 28252, 25749, 22773, 19379, 15629, 11592, 7342, 2958, -1481, -5893, -10196, -14313, -18166, -21686, -24808, -27474, -29636, -31254, -32298, -32749, -32598, -31849, -30515, -28621, -26202, -23301, -19972, -16277, -12283, -8063, -3696, 740, 5162, 9489, 13642, 17544, 21125, 24317, 27063, 29312, 31023, 32164, 32714, 32664, 32014, 30776, 28973, 26639, 23815, 20553, 16915, 12965, 8778, 4429}, -{0, -5893, -11593, -16916, -21686, -25750, -28974, -31254, -32515, -32715, -31849, -29945, -27064, -23301, -18778, -13643, -8063, -2221, 3695, 9489, 14974, 19971, 24317, 27870, 30514, 32164, 32764, 32297, 30776, 28252, 24807, 20553, 15629, 10195, 4429, -1481, -7343, -12966, -18166, -22774, -26640, -29636, -31667, -32665, -32598, -31469, -29313, -26202, -22236, -17545, -12283, -6620, -741, 5162, 10897, 16276, 21125, 25285, 28620, 31023, 32414, 32748, 32014, 30237, 27473, 23815, 19379, 14312, 8778, 2958, -2959, -8779, -14313, -19380, -23816, -27474, -30238, -32015, -32749, -32415, -31024, -28621, -25286, -21126, -16277, -10898, -5163, 740, 6619, 12282, 17544, 22235, 26201, 29312, 31468, 32597, 32664, 31666, 29635, 26639, 22773, 18165, 12965, 7342, 1480, -4430, -10196, -15630, -20554, -24808, -28253, -30777, -32298, -32765, -32165, -30515, -27871, -24318, -19972, -14975, -9490, -3696, 2220, 8062, 13642, 18777, 23300, 27063, 29944, 31848, 32714, 32514, 31253, 28973, 25749, 21685, 16915, 11592, 5892}, -{0, -7343, -14313, -20554, -25750, -29636, -32015, -32765, -31849, -29313, -25286, -19972, -13643, -6620, 740, 8062, 14974, 21125, 26201, 29944, 32164, 32748, 31666, 28973, 24807, 19379, 12965, 5892, -1481, -8779, -15630, -21686, -26640, -30238, -32298, -32715, -31469, -28621, -24318, -18778, -12283, -5163, 2220, 9489, 16276, 22235, 27063, 30514, 32414, 32664, 31253, 28252, 23815, 18165, 11592, 4429, -2959, -10196, -16916, -22774, -27474, -30777, -32515, -32598, -31024, -27871, -23301, -17545, -10898, -3696, 3695, 10897, 17544, 23300, 27870, 31023, 32597, 32514, 30776, 27473, 22773, 16915, 10195, 2958, -4430, -11593, -18166, -23816, -28253, -31254, -32665, -32415, -30515, -27064, -22236, -16277, -9490, -2221, 5162, 12282, 18777, 24317, 28620, 31468, 32714, 32297, 30237, 26639, 21685, 15629, 8778, 1480, -5893, -12966, -19380, -24808, -28974, -31667, -32749, -32165, -29945, -26202, -21126, -14975, -8063, -741, 6619, 13642, 19971, 25285, 29312, 31848, 32764, 32014, 29635, 25749, 20553, 14312, 7342}, -{0, -8779, -16916, -23816, -28974, -32015, -32715, -31024, -27064, -21126, -13643, -5163, 3695, 12282, 19971, 26201, 30514, 32597, 32297, 29635, 24807, 18165, 10195, 1480, -7343, -15630, -22774, -28253, -31667, -32765, -31469, -27871, -22236, -14975, -6620, 2220, 10897, 18777, 25285, 29944, 32414, 32514, 30237, 25749, 19379, 11592, 2958, -5893, -14313, -21686, -27474, -31254, -32749, -31849, -28621, -23301, -16277, -8063, 740, 9489, 17544, 24317, 29312, 32164, 32664, 30776, 26639, 20553, 12965, 4429, -4430, -12966, -20554, -26640, -30777, -32665, -32165, -29313, -24318, -17545, -9490, -741, 8062, 16276, 23300, 28620, 31848, 32748, 31253, 27473, 21685, 14312, 5892, -2959, -11593, -19380, -25750, -30238, -32515, -32415, -29945, -25286, -18778, -10898, -2221, 6619, 14974, 22235, 27870, 31468, 32764, 31666, 28252, 22773, 15629, 7342, -1481, -10196, -18166, -24808, -29636, -32298, -32598, -30515, -26202, -19972, -12283, -3696, 5162, 13642, 21125, 27063, 31023, 32714, 32014, 28973, 23815, 16915, 8778}, -{0, -10196, -19380, -26640, -31254, -32765, -31024, -26202, -18778, -9490, 740, 10897, 19971, 27063, 31468, 32748, 30776, 25749, 18165, 8778, -1481, -11593, -20554, -27474, -31667, -32715, -30515, -25286, -17545, -8063, 2220, 12282, 21125, 27870, 31848, 32664, 30237, 24807, 16915, 7342, -2959, -12966, -21686, -28253, -32015, -32598, -29945, -24318, -16277, -6620, 3695, 13642, 22235, 28620, 32164, 32514, 29635, 23815, 15629, 5892, -4430, -14313, -22774, -28974, -32298, -32415, -29313, -23301, -14975, -5163, 5162, 14974, 23300, 29312, 32414, 32297, 28973, 22773, 14312, 4429, -5893, -15630, -23816, -29636, -32515, -32165, -28621, -22236, -13643, -3696, 6619, 16276, 24317, 29944, 32597, 32014, 28252, 21685, 12965, 2958, -7343, -16916, -24808, -30238, -32665, -31849, -27871, -21126, -12283, -2221, 8062, 17544, 25285, 30514, 32714, 31666, 27473, 20553, 11592, 1480, -8779, -18166, -25750, -30777, -32749, -31469, -27064, -19972, -10898, -741, 9489, 18777, 26201, 31023, 32764, 31253, 26639, 19379, 10195}, -{0, -11593, -21686, -28974, -32515, -31849, -27064, -18778, -8063, 3695, 14974, 24317, 30514, 32764, 30776, 24807, 15629, 4429, -7343, -18166, -26640, -31667, -32598, -29313, -22236, -12283, -741, 10897, 21125, 28620, 32414, 32014, 27473, 19379, 8778, -2959, -14313, -23816, -30238, -32749, -31024, -25286, -16277, -5163, 6619, 17544, 26201, 31468, 32664, 29635, 22773, 12965, 1480, -10196, -20554, -28253, -32298, -32165, -27871, -19972, -9490, 2220, 13642, 23300, 29944, 32714, 31253, 25749, 16915, 5892, -5893, -16916, -25750, -31254, -32715, -29945, -23301, -13643, -2221, 9489, 19971, 27870, 32164, 32297, 28252, 20553, 10195, -1481, -12966, -22774, -29636, -32665, -31469, -26202, -17545, -6620, 5162, 16276, 25285, 31023, 32748, 30237, 23815, 14312, 2958, -8779, -19380, -27474, -32015, -32415, -28621, -21126, -10898, 740, 12282, 22235, 29312, 32597, 31666, 26639, 18165, 7342, -4430, -15630, -24808, -30777, -32765, -30515, -24318, -14975, -3696, 8062, 18777, 27063, 31848, 32514, 28973, 21685, 11592}, -{0, -12966, -23816, -30777, -32715, -29313, -21126, -9490, 3695, 16276, 26201, 31848, 32297, 27473, 18165, 5892, -7343, -19380, -28253, -32515, -31469, -25286, -14975, -2221, 10897, 22235, 29944, 32764, 30237, 22773, 11592, -1481, -14313, -24808, -31254, -32598, -28621, -19972, -8063, 5162, 17544, 27063, 32164, 32014, 26639, 16915, 4429, -8779, -20554, -28974, -32665, -31024, -24318, -13643, -741, 12282, 23300, 30514, 32748, 29635, 21685, 10195, -2959, -15630, -25750, -31667, -32415, -27871, -18778, -6620, 6619, 18777, 27870, 32414, 31666, 25749, 15629, 2958, -10196, -21686, -29636, -32749, -30515, -23301, -12283, 740, 13642, 24317, 31023, 32664, 28973, 20553, 8778, -4430, -16916, -26640, -32015, -32165, -27064, -17545, -5163, 8062, 19971, 28620, 32597, 31253, 24807, 14312, 1480, -11593, -22774, -30238, -32765, -29945, -22236, -10898, 2220, 14974, 25285, 31468, 32514, 28252, 19379, 7342, -5893, -18166, -27474, -32298, -31849, -26202, -16277, -3696, 9489, 21125, 29312, 32714, 30776, 23815, 12965}, -{0, -14313, -25750, -32015, -31849, -25286, -13643, 740, 14974, 26201, 32164, 31666, 24807, 12965, -1481, -15630, -26640, -32298, -31469, -24318, -12283, 2220, 16276, 27063, 32414, 31253, 23815, 11592, -2959, -16916, -27474, -32515, -31024, -23301, -10898, 3695, 17544, 27870, 32597, 30776, 22773, 10195, -4430, -18166, -28253, -32665, -30515, -22236, -9490, 5162, 18777, 28620, 32714, 30237, 21685, 8778, -5893, -19380, -28974, -32749, -29945, -21126, -8063, 6619, 19971, 29312, 32764, 29635, 20553, 7342, -7343, -20554, -29636, -32765, -29313, -19972, -6620, 8062, 21125, 29944, 32748, 28973, 19379, 5892, -8779, -21686, -30238, -32715, -28621, -18778, -5163, 9489, 22235, 30514, 32664, 28252, 18165, 4429, -10196, -22774, -30777, -32598, -27871, -17545, -3696, 10897, 23300, 31023, 32514, 27473, 16915, 2958, -11593, -23816, -31254, -32415, -27064, -16277, -2221, 12282, 24317, 31468, 32297, 26639, 15629, 1480, -12966, -24808, -31667, -32165, -26202, -14975, -741, 13642, 25285, 31848, 32014, 25749, 14312}, -{0, -15630, -27474, -32665, -29945, -19972, -5163, 10897, 24317, 31848, 31666, 23815, 10195, -5893, -20554, -30238, -32598, -27064, -14975, 740, 16276, 27870, 32714, 29635, 19379, 4429, -11593, -24808, -32015, -31469, -23301, -9490, 6619, 21125, 30514, 32514, 26639, 14312, -1481, -16916, -28253, -32749, -29313, -18778, -3696, 12282, 25285, 32164, 31253, 22773, 8778, -7343, -21686, -30777, -32415, -26202, -13643, 2220, 17544, 28620, 32764, 28973, 18165, 2958, -12966, -25750, -32298, -31024, -22236, -8063, 8062, 22235, 31023, 32297, 25749, 12965, -2959, -18166, -28974, -32765, -28621, -17545, -2221, 13642, 26201, 32414, 30776, 21685, 7342, -8779, -22774, -31254, -32165, -25286, -12283, 3695, 18777, 29312, 32748, 28252, 16915, 1480, -14313, -26640, -32515, -30515, -21126, -6620, 9489, 23300, 31468, 32014, 24807, 11592, -4430, -19380, -29636, -32715, -27871, -16277, -741, 14974, 27063, 32597, 30237, 20553, 5892, -10196, -23816, -31667, -31849, -24318, -10898, 5162, 19971, 29944, 32664, 27473, 15629}, -{0, -16916, -28974, -32715, -27064, -13643, 3695, 19971, 30514, 32297, 24807, 10195, -7343, -22774, -31667, -31469, -22236, -6620, 10897, 25285, 32414, 30237, 19379, 2958, -14313, -27474, -32749, -28621, -16277, 740, 17544, 29312, 32664, 26639, 12965, -4430, -20554, -30777, -32165, -24318, -9490, 8062, 23300, 31848, 31253, 21685, 5892, -11593, -25750, -32515, -29945, -18778, -2221, 14974, 27870, 32764, 28252, 15629, -1481, -18166, -29636, -32598, -26202, -12283, 5162, 21125, 31023, 32014, 23815, 8778, -8779, -23816, -32015, -31024, -21126, -5163, 12282, 26201, 32597, 29635, 18165, 1480, -15630, -28253, -32765, -27871, -14975, 2220, 18777, 29944, 32514, 25749, 11592, -5893, -21686, -31254, -31849, -23301, -8063, 9489, 24317, 32164, 30776, 20553, 4429, -12966, -26640, -32665, -29313, -17545, -741, 16276, 28620, 32748, 27473, 14312, -2959, -19380, -30238, -32415, -25286, -10898, 6619, 22235, 31468, 31666, 22773, 7342, -10196, -24808, -32298, -30515, -19972, -3696, 13642, 27063, 32714, 28973, 16915}, -{0, -18166, -30238, -32165, -23301, -6620, 12282, 27063, 32764, 27473, 12965, -5893, -22774, -32015, -30515, -18778, -741, 17544, 29944, 32297, 23815, 7342, -11593, -26640, -32749, -27871, -13643, 5162, 22235, 31848, 30776, 19379, 1480, -16916, -29636, -32415, -24318, -8063, 10897, 26201, 32714, 28252, 14312, -4430, -21686, -31667, -31024, -19972, -2221, 16276, 29312, 32514, 24807, 8778, -10196, -25750, -32665, -28621, -14975, 3695, 21125, 31468, 31253, 20553, 2958, -15630, -28974, -32598, -25286, -9490, 9489, 25285, 32597, 28973, 15629, -2959, -20554, -31254, -31469, -21126, -3696, 14974, 28620, 32664, 25749, 10195, -8779, -24808, -32515, -29313, -16277, 2220, 19971, 31023, 31666, 21685, 4429, -14313, -28253, -32715, -26202, -10898, 8062, 24317, 32414, 29635, 16915, -1481, -19380, -30777, -31849, -22236, -5163, 13642, 27870, 32748, 26639, 11592, -7343, -23816, -32298, -29945, -17545, 740, 18777, 30514, 32014, 22773, 5892, -12966, -27474, -32765, -27064, -12283, 6619, 23300, 32164, 30237, 18165}, -{0, -19380, -31254, -31024, -18778, 740, 19971, 31468, 30776, 18165, -1481, -20554, -31667, -30515, -17545, 2220, 21125, 31848, 30237, 16915, -2959, -21686, -32015, -29945, -16277, 3695, 22235, 32164, 29635, 15629, -4430, -22774, -32298, -29313, -14975, 5162, 23300, 32414, 28973, 14312, -5893, -23816, -32515, -28621, -13643, 6619, 24317, 32597, 28252, 12965, -7343, -24808, -32665, -27871, -12283, 8062, 25285, 32714, 27473, 11592, -8779, -25750, -32749, -27064, -10898, 9489, 26201, 32764, 26639, 10195, -10196, -26640, -32765, -26202, -9490, 10897, 27063, 32748, 25749, 8778, -11593, -27474, -32715, -25286, -8063, 12282, 27870, 32664, 24807, 7342, -12966, -28253, -32598, -24318, -6620, 13642, 28620, 32514, 23815, 5892, -14313, -28974, -32415, -23301, -5163, 14974, 29312, 32297, 22773, 4429, -15630, -29636, -32165, -22236, -3696, 16276, 29944, 32014, 21685, 2958, -16916, -30238, -31849, -21126, -2221, 17544, 30514, 31666, 20553, 1480, -18166, -30777, -31469, -19972, -741, 18777, 31023, 31253, 19379}, -{0, -20554, -32015, -29313, -13643, 8062, 26201, 32748, 24807, 5892, -15630, -30238, -31469, -18778, 2220, 22235, 32414, 28252, 11592, -10196, -27474, -32598, -23301, -3696, 17544, 31023, 30776, 16915, -4430, -23816, -32665, -27064, -9490, 12282, 28620, 32297, 21685, 1480, -19380, -31667, -29945, -14975, 6619, 25285, 32764, 25749, 7342, -14313, -29636, -31849, -19972, 740, 21125, 32164, 28973, 12965, -8779, -26640, -32715, -24318, -5163, 16276, 30514, 31253, 18165, -2959, -22774, -32515, -27871, -10898, 10897, 27870, 32514, 22773, 2958, -18166, -31254, -30515, -16277, 5162, 24317, 32714, 26639, 8778, -12966, -28974, -32165, -21126, -741, 19971, 31848, 29635, 14312, -7343, -25750, -32765, -25286, -6620, 14974, 29944, 31666, 19379, -1481, -21686, -32298, -28621, -12283, 9489, 27063, 32664, 23815, 4429, -16916, -30777, -31024, -17545, 3695, 23300, 32597, 27473, 10195, -11593, -28253, -32415, -22236, -2221, 18777, 31468, 30237, 15629, -5893, -24808, -32749, -26202, -8063, 13642, 29312, 32014, 20553}, -{0, -21686, -32515, -27064, -8063, 14974, 30514, 30776, 15629, -7343, -26640, -32598, -22236, -741, 21125, 32414, 27473, 8778, -14313, -30238, -31024, -16277, 6619, 26201, 32664, 22773, 1480, -20554, -32298, -27871, -9490, 13642, 29944, 31253, 16915, -5893, -25750, -32715, -23301, -2221, 19971, 32164, 28252, 10195, -12966, -29636, -31469, -17545, 5162, 25285, 32748, 23815, 2958, -19380, -32015, -28621, -10898, 12282, 29312, 31666, 18165, -4430, -24808, -32765, -24318, -3696, 18777, 31848, 28973, 11592, -11593, -28974, -31849, -18778, 3695, 24317, 32764, 24807, 4429, -18166, -31667, -29313, -12283, 10897, 28620, 32014, 19379, -2959, -23816, -32749, -25286, -5163, 17544, 31468, 29635, 12965, -10196, -28253, -32165, -19972, 2220, 23300, 32714, 25749, 5892, -16916, -31254, -29945, -13643, 9489, 27870, 32297, 20553, -1481, -22774, -32665, -26202, -6620, 16276, 31023, 30237, 14312, -8779, -27474, -32415, -21126, 740, 22235, 32597, 26639, 7342, -15630, -30777, -30515, -14975, 8062, 27063, 32514, 21685}, -{0, -22774, -32749, -24318, -2221, 21125, 32597, 25749, 4429, -19380, -32298, -27064, -6620, 17544, 31848, 28252, 8778, -15630, -31254, -29313, -10898, 13642, 30514, 30237, 12965, -11593, -29636, -31024, -14975, 9489, 28620, 31666, 16915, -7343, -27474, -32165, -18778, 5162, 26201, 32514, 20553, -2959, -24808, -32715, -22236, 740, 23300, 32764, 23815, 1480, -21686, -32665, -25286, -3696, 19971, 32414, 26639, 5892, -18166, -32015, -27871, -8063, 16276, 31468, 28973, 10195, -14313, -30777, -29945, -12283, 12282, 29944, 30776, 14312, -10196, -28974, -31469, -16277, 8062, 27870, 32014, 18165, -5893, -26640, -32415, -19972, 3695, 25285, 32664, 21685, -1481, -23816, -32765, -23301, -741, 22235, 32714, 24807, 2958, -20554, -32515, -26202, -5163, 18777, 32164, 27473, 7342, -16916, -31667, -28621, -9490, 14974, 31023, 29635, 11592, -12966, -30238, -30515, -13643, 10897, 29312, 31253, 15629, -8779, -28253, -31849, -17545, 6619, 27063, 32297, 19379, -4430, -25750, -32598, -21126, 2220, 24317, 32748, 22773}, -{0, -23816, -32715, -21126, 3695, 26201, 32297, 18165, -7343, -28253, -31469, -14975, 10897, 29944, 30237, 11592, -14313, -31254, -28621, -8063, 17544, 32164, 26639, 4429, -20554, -32665, -24318, -741, 23300, 32748, 21685, -2959, -25750, -32415, -18778, 6619, 27870, 31666, 15629, -10196, -29636, -30515, -12283, 13642, 31023, 28973, 8778, -16916, -32015, -27064, -5163, 19971, 32597, 24807, 1480, -22774, -32765, -22236, 2220, 25285, 32514, 19379, -5893, -27474, -31849, -16277, 9489, 29312, 30776, 12965, -12966, -30777, -29313, -9490, 16276, 31848, 27473, 5892, -19380, -32515, -25286, -2221, 22235, 32764, 22773, -1481, -24808, -32598, -19972, 5162, 27063, 32014, 16915, -8779, -28974, -31024, -13643, 12282, 30514, 29635, 10195, -15630, -31667, -27871, -6620, 18777, 32414, 25749, 2958, -21686, -32749, -23301, 740, 24317, 32664, 20553, -4430, -26640, -32165, -17545, 8062, 28620, 31253, 14312, -11593, -30238, -29945, -10898, 14974, 31468, 28252, 7342, -18166, -32298, -26202, -3696, 21125, 32714, 23815}, -{0, -24808, -32415, -17545, 9489, 29944, 29635, 8778, -18166, -32515, -24318, 740, 25285, 32297, 16915, -10196, -30238, -29313, -8063, 18777, 32597, 23815, -1481, -25750, -32165, -16277, 10897, 30514, 28973, 7342, -19380, -32665, -23301, 2220, 26201, 32014, 15629, -11593, -30777, -28621, -6620, 19971, 32714, 22773, -2959, -26640, -31849, -14975, 12282, 31023, 28252, 5892, -20554, -32749, -22236, 3695, 27063, 31666, 14312, -12966, -31254, -27871, -5163, 21125, 32764, 21685, -4430, -27474, -31469, -13643, 13642, 31468, 27473, 4429, -21686, -32765, -21126, 5162, 27870, 31253, 12965, -14313, -31667, -27064, -3696, 22235, 32748, 20553, -5893, -28253, -31024, -12283, 14974, 31848, 26639, 2958, -22774, -32715, -19972, 6619, 28620, 30776, 11592, -15630, -32015, -26202, -2221, 23300, 32664, 19379, -7343, -28974, -30515, -10898, 16276, 32164, 25749, 1480, -23816, -32598, -18778, 8062, 29312, 30237, 10195, -16916, -32298, -25286, -741, 24317, 32514, 18165, -8779, -29636, -29945, -9490, 17544, 32414, 24807}, -{0, -25750, -31849, -13643, 14974, 32164, 24807, -1481, -26640, -31469, -12283, 16276, 32414, 23815, -2959, -27474, -31024, -10898, 17544, 32597, 22773, -4430, -28253, -30515, -9490, 18777, 32714, 21685, -5893, -28974, -29945, -8063, 19971, 32764, 20553, -7343, -29636, -29313, -6620, 21125, 32748, 19379, -8779, -30238, -28621, -5163, 22235, 32664, 18165, -10196, -30777, -27871, -3696, 23300, 32514, 16915, -11593, -31254, -27064, -2221, 24317, 32297, 15629, -12966, -31667, -26202, -741, 25285, 32014, 14312, -14313, -32015, -25286, 740, 26201, 31666, 12965, -15630, -32298, -24318, 2220, 27063, 31253, 11592, -16916, -32515, -23301, 3695, 27870, 30776, 10195, -18166, -32665, -22236, 5162, 28620, 30237, 8778, -19380, -32749, -21126, 6619, 29312, 29635, 7342, -20554, -32765, -19972, 8062, 29944, 28973, 5892, -21686, -32715, -18778, 9489, 30514, 28252, 4429, -22774, -32598, -17545, 10897, 31023, 27473, 2958, -23816, -32415, -16277, 12282, 31468, 26639, 1480, -24808, -32165, -14975, 13642, 31848, 25749}, -{0, -26640, -31024, -9490, 19971, 32748, 18165, -11593, -31667, -25286, 2220, 27870, 30237, 7342, -21686, -32598, -16277, 13642, 32164, 23815, -4430, -28974, -29313, -5163, 23300, 32297, 14312, -15630, -32515, -22236, 6619, 29944, 28252, 2958, -24808, -31849, -12283, 17544, 32714, 20553, -8779, -30777, -27064, -741, 26201, 31253, 10195, -19380, -32765, -18778, 10897, 31468, 25749, -1481, -27474, -30515, -8063, 21125, 32664, 16915, -12966, -32015, -24318, 3695, 28620, 29635, 5892, -22774, -32415, -14975, 14974, 32414, 22773, -5893, -29636, -28621, -3696, 24317, 32014, 12965, -16916, -32665, -21126, 8062, 30514, 27473, 1480, -25750, -31469, -10898, 18777, 32764, 19379, -10196, -31254, -26202, 740, 27063, 30776, 8778, -20554, -32715, -17545, 12282, 31848, 24807, -2959, -28253, -29945, -6620, 22235, 32514, 15629, -14313, -32298, -23301, 5162, 29312, 28973, 4429, -23816, -32165, -13643, 16276, 32597, 21685, -7343, -30238, -27871, -2221, 25285, 31666, 11592, -18166, -32749, -19972, 9489, 31023, 26639}, -{0, -27474, -29945, -5163, 24317, 31666, 10195, -20554, -32598, -14975, 16276, 32714, 19379, -11593, -32015, -23301, 6619, 30514, 26639, -1481, -28253, -29313, -3696, 25285, 31253, 8778, -21686, -32415, -13643, 17544, 32764, 18165, -12966, -32298, -22236, 8062, 31023, 25749, -2959, -28974, -28621, -2221, 26201, 30776, 7342, -22774, -32165, -12283, 18777, 32748, 16915, -14313, -32515, -21126, 9489, 31468, 24807, -4430, -29636, -27871, -741, 27063, 30237, 5892, -23816, -31849, -10898, 19971, 32664, 15629, -15630, -32665, -19972, 10897, 31848, 23815, -5893, -30238, -27064, 740, 27870, 29635, 4429, -24808, -31469, -9490, 21125, 32514, 14312, -16916, -32749, -18778, 12282, 32164, 22773, -7343, -30777, -26202, 2220, 28620, 28973, 2958, -25750, -31024, -8063, 22235, 32297, 12965, -18166, -32765, -17545, 13642, 32414, 21685, -8779, -31254, -25286, 3695, 29312, 28252, 1480, -26640, -30515, -6620, 23300, 32014, 11592, -19380, -32715, -16277, 14974, 32597, 20553, -10196, -31667, -24318, 5162, 29944, 27473}, -{0, -28253, -28621, -741, 27870, 28973, 1480, -27474, -29313, -2221, 27063, 29635, 2958, -26640, -29945, -3696, 26201, 30237, 4429, -25750, -30515, -5163, 25285, 30776, 5892, -24808, -31024, -6620, 24317, 31253, 7342, -23816, -31469, -8063, 23300, 31666, 8778, -22774, -31849, -9490, 22235, 32014, 10195, -21686, -32165, -10898, 21125, 32297, 11592, -20554, -32415, -12283, 19971, 32514, 12965, -19380, -32598, -13643, 18777, 32664, 14312, -18166, -32715, -14975, 17544, 32748, 15629, -16916, -32765, -16277, 16276, 32764, 16915, -15630, -32749, -17545, 14974, 32714, 18165, -14313, -32665, -18778, 13642, 32597, 19379, -12966, -32515, -19972, 12282, 32414, 20553, -11593, -32298, -21126, 10897, 32164, 21685, -10196, -32015, -22236, 9489, 31848, 22773, -8779, -31667, -23301, 8062, 31468, 23815, -7343, -31254, -24318, 6619, 31023, 24807, -5893, -30777, -25286, 5162, 30514, 25749, -4430, -30238, -26202, 3695, 29944, 26639, -2959, -29636, -27064, 2220, 29312, 27473, -1481, -28974, -27871, 740, 28620, 28252}, -{0, -28974, -27064, 3695, 30514, 24807, -7343, -31667, -22236, 10897, 32414, 19379, -14313, -32749, -16277, 17544, 32664, 12965, -20554, -32165, -9490, 23300, 31253, 5892, -25750, -29945, -2221, 27870, 28252, -1481, -29636, -26202, 5162, 31023, 23815, -8779, -32015, -21126, 12282, 32597, 18165, -15630, -32765, -14975, 18777, 32514, 11592, -21686, -31849, -8063, 24317, 30776, 4429, -26640, -29313, -741, 28620, 27473, -2959, -30238, -25286, 6619, 31468, 22773, -10196, -32298, -19972, 13642, 32714, 16915, -16916, -32715, -13643, 19971, 32297, 10195, -22774, -31469, -6620, 25285, 30237, 2958, -27474, -28621, 740, 29312, 26639, -4430, -30777, -24318, 8062, 31848, 21685, -11593, -32515, -18778, 14974, 32764, 15629, -18166, -32598, -12283, 21125, 32014, 8778, -23816, -31024, -5163, 26201, 29635, 1480, -28253, -27871, 2220, 29944, 25749, -5893, -31254, -23301, 9489, 32164, 20553, -12966, -32665, -17545, 16276, 32748, 14312, -19380, -32415, -10898, 22235, 31666, 7342, -24808, -30515, -3696, 27063, 28973}, -{0, -29636, -25286, 8062, 32164, 19379, -15630, -32715, -12283, 22235, 31253, 4429, -27474, -27871, 3695, 31023, 22773, -11593, -32665, -16277, 18777, 32297, 8778, -24808, -29945, -741, 29312, 25749, -7343, -32015, -19972, 14974, 32748, 12965, -21686, -31469, -5163, 27063, 28252, -2959, -30777, -23301, 10897, 32597, 16915, -18166, -32415, -9490, 24317, 30237, 1480, -28974, -26202, 6619, 31848, 20553, -14313, -32765, -13643, 21125, 31666, 5892, -26640, -28621, 2220, 30514, 23815, -10196, -32515, -17545, 17544, 32514, 10195, -23816, -30515, -2221, 28620, 26639, -5893, -31667, -21126, 13642, 32764, 14312, -20554, -31849, -6620, 26201, 28973, -1481, -30238, -24318, 9489, 32414, 18165, -16916, -32598, -10898, 23300, 30776, 2958, -28253, -27064, 5162, 31468, 21685, -12966, -32749, -14975, 19971, 32014, 7342, -25750, -29313, 740, 29944, 24807, -8779, -32298, -18778, 16276, 32664, 11592, -22774, -31024, -3696, 27870, 27473, -4430, -31254, -22236, 12282, 32714, 15629, -19380, -32165, -8063, 25285, 29635}, -{0, -30238, -23301, 12282, 32764, 12965, -22774, -30515, -741, 29944, 23815, -11593, -32749, -13643, 22235, 30776, 1480, -29636, -24318, 10897, 32714, 14312, -21686, -31024, -2221, 29312, 24807, -10196, -32665, -14975, 21125, 31253, 2958, -28974, -25286, 9489, 32597, 15629, -20554, -31469, -3696, 28620, 25749, -8779, -32515, -16277, 19971, 31666, 4429, -28253, -26202, 8062, 32414, 16915, -19380, -31849, -5163, 27870, 26639, -7343, -32298, -17545, 18777, 32014, 5892, -27474, -27064, 6619, 32164, 18165, -18166, -32165, -6620, 27063, 27473, -5893, -32015, -18778, 17544, 32297, 7342, -26640, -27871, 5162, 31848, 19379, -16916, -32415, -8063, 26201, 28252, -4430, -31667, -19972, 16276, 32514, 8778, -25750, -28621, 3695, 31468, 20553, -15630, -32598, -9490, 25285, 28973, -2959, -31254, -21126, 14974, 32664, 10195, -24808, -29313, 2220, 31023, 21685, -14313, -32715, -10898, 24317, 29635, -1481, -30777, -22236, 13642, 32748, 11592, -23816, -29945, 740, 30514, 22773, -12966, -32765, -12283, 23300, 30237}, -{0, -30777, -21126, 16276, 32297, 5892, -28253, -25286, 10897, 32764, 11592, -24808, -28621, 5162, 32164, 16915, -20554, -31024, -741, 30514, 21685, -15630, -32415, -6620, 27870, 25749, -10196, -32749, -12283, 24317, 28973, -4430, -32015, -17545, 19971, 31253, 1480, -30238, -22236, 14974, 32514, 7342, -27474, -26202, 9489, 32714, 12965, -23816, -29313, 3695, 31848, 18165, -19380, -31469, -2221, 29944, 22773, -14313, -32598, -8063, 27063, 26639, -8779, -32665, -13643, 23300, 29635, -2959, -31667, -18778, 18777, 31666, 2958, -29636, -23301, 13642, 32664, 8778, -26640, -27064, 8062, 32597, 14312, -22774, -29945, 2220, 31468, 19379, -18166, -31849, -3696, 29312, 23815, -12966, -32715, -9490, 26201, 27473, -7343, -32515, -14975, 22235, 30237, -1481, -31254, -19972, 17544, 32014, 4429, -28974, -24318, 12282, 32748, 10195, -25750, -27871, 6619, 32414, 15629, -21686, -30515, 740, 31023, 20553, -16916, -32165, -5163, 28620, 24807, -11593, -32765, -10898, 25285, 28252, -5893, -32298, -16277, 21125, 30776}, -{0, -31254, -18778, 19971, 30776, -1481, -31667, -17545, 21125, 30237, -2959, -32015, -16277, 22235, 29635, -4430, -32298, -14975, 23300, 28973, -5893, -32515, -13643, 24317, 28252, -7343, -32665, -12283, 25285, 27473, -8779, -32749, -10898, 26201, 26639, -10196, -32765, -9490, 27063, 25749, -11593, -32715, -8063, 27870, 24807, -12966, -32598, -6620, 28620, 23815, -14313, -32415, -5163, 29312, 22773, -15630, -32165, -3696, 29944, 21685, -16916, -31849, -2221, 30514, 20553, -18166, -31469, -741, 31023, 19379, -19380, -31024, 740, 31468, 18165, -20554, -30515, 2220, 31848, 16915, -21686, -29945, 3695, 32164, 15629, -22774, -29313, 5162, 32414, 14312, -23816, -28621, 6619, 32597, 12965, -24808, -27871, 8062, 32714, 11592, -25750, -27064, 9489, 32764, 10195, -26640, -26202, 10897, 32748, 8778, -27474, -25286, 12282, 32664, 7342, -28253, -24318, 13642, 32514, 5892, -28974, -23301, 14974, 32297, 4429, -29636, -22236, 16276, 32014, 2958, -30238, -21126, 17544, 31666, 1480, -30777, -19972, 18777, 31253}, -{0, -31667, -16277, 23300, 28252, -8779, -32765, -8063, 28620, 22773, -16916, -31469, 740, 31848, 15629, -23816, -27871, 9489, 32748, 7342, -28974, -22236, 17544, 31253, -1481, -32015, -14975, 24317, 27473, -10196, -32715, -6620, 29312, 21685, -18166, -31024, 2220, 32164, 14312, -24808, -27064, 10897, 32664, 5892, -29636, -21126, 18777, 30776, -2959, -32298, -13643, 25285, 26639, -11593, -32598, -5163, 29944, 20553, -19380, -30515, 3695, 32414, 12965, -25750, -26202, 12282, 32514, 4429, -30238, -19972, 19971, 30237, -4430, -32515, -12283, 26201, 25749, -12966, -32415, -3696, 30514, 19379, -20554, -29945, 5162, 32597, 11592, -26640, -25286, 13642, 32297, 2958, -30777, -18778, 21125, 29635, -5893, -32665, -10898, 27063, 24807, -14313, -32165, -2221, 31023, 18165, -21686, -29313, 6619, 32714, 10195, -27474, -24318, 14974, 32014, 1480, -31254, -17545, 22235, 28973, -7343, -32749, -9490, 27870, 23815, -15630, -31849, -741, 31468, 16915, -22774, -28621, 8062, 32764, 8778, -28253, -23301, 16276, 31666}, -{0, -32015, -13643, 26201, 24807, -15630, -31469, 2220, 32414, 11592, -27474, -23301, 17544, 30776, -4430, -32665, -9490, 28620, 21685, -19380, -29945, 6619, 32764, 7342, -29636, -19972, 21125, 28973, -8779, -32715, -5163, 30514, 18165, -22774, -27871, 10897, 32514, 2958, -31254, -16277, 24317, 26639, -12966, -32165, -741, 31848, 14312, -25750, -25286, 14974, 31666, -1481, -32298, -12283, 27063, 23815, -16916, -31024, 3695, 32597, 10195, -28253, -22236, 18777, 30237, -5893, -32749, -8063, 29312, 20553, -20554, -29313, 8062, 32748, 5892, -30238, -18778, 22235, 28252, -10196, -32598, -3696, 31023, 16915, -23816, -27064, 12282, 32297, 1480, -31667, -14975, 25285, 25749, -14313, -31849, 740, 32164, 12965, -26640, -24318, 16276, 31253, -2959, -32515, -10898, 27870, 22773, -18166, -30515, 5162, 32714, 8778, -28974, -21126, 19971, 29635, -7343, -32765, -6620, 29944, 19379, -21686, -28621, 9489, 32664, 4429, -30777, -17545, 23300, 27473, -11593, -32415, -2221, 31468, 15629, -24808, -26202, 13642, 32014}, -{0, -32298, -10898, 28620, 20553, -21686, -27871, 12282, 32014, -1481, -32515, -9490, 29312, 19379, -22774, -27064, 13642, 31666, -2959, -32665, -8063, 29944, 18165, -23816, -26202, 14974, 31253, -4430, -32749, -6620, 30514, 16915, -24808, -25286, 16276, 30776, -5893, -32765, -5163, 31023, 15629, -25750, -24318, 17544, 30237, -7343, -32715, -3696, 31468, 14312, -26640, -23301, 18777, 29635, -8779, -32598, -2221, 31848, 12965, -27474, -22236, 19971, 28973, -10196, -32415, -741, 32164, 11592, -28253, -21126, 21125, 28252, -11593, -32165, 740, 32414, 10195, -28974, -19972, 22235, 27473, -12966, -31849, 2220, 32597, 8778, -29636, -18778, 23300, 26639, -14313, -31469, 3695, 32714, 7342, -30238, -17545, 24317, 25749, -15630, -31024, 5162, 32764, 5892, -30777, -16277, 25285, 24807, -16916, -30515, 6619, 32748, 4429, -31254, -14975, 26201, 23815, -18166, -29945, 8062, 32664, 2958, -31667, -13643, 27063, 22773, -19380, -29313, 9489, 32514, 1480, -32015, -12283, 27870, 21685, -20554, -28621, 10897, 32297}, -{0, -32515, -8063, 30514, 15629, -26640, -22236, 21125, 27473, -14313, -31024, 6619, 32664, 1480, -32298, -9490, 29944, 16915, -25750, -23301, 19971, 28252, -12966, -31469, 5162, 32748, 2958, -32015, -10898, 29312, 18165, -24808, -24318, 18777, 28973, -11593, -31849, 3695, 32764, 4429, -31667, -12283, 28620, 19379, -23816, -25286, 17544, 29635, -10196, -32165, 2220, 32714, 5892, -31254, -13643, 27870, 20553, -22774, -26202, 16276, 30237, -8779, -32415, 740, 32597, 7342, -30777, -14975, 27063, 21685, -21686, -27064, 14974, 30776, -7343, -32598, -741, 32414, 8778, -30238, -16277, 26201, 22773, -20554, -27871, 13642, 31253, -5893, -32715, -2221, 32164, 10195, -29636, -17545, 25285, 23815, -19380, -28621, 12282, 31666, -4430, -32765, -3696, 31848, 11592, -28974, -18778, 24317, 24807, -18166, -29313, 10897, 32014, -2959, -32749, -5163, 31468, 12965, -28253, -19972, 23300, 25749, -16916, -29945, 9489, 32297, -1481, -32665, -6620, 31023, 14312, -27474, -21126, 22235, 26639, -15630, -30515, 8062, 32514}, -{0, -32665, -5163, 31848, 10195, -30238, -14975, 27870, 19379, -24808, -23301, 21125, 26639, -16916, -29313, 12282, 31253, -7343, -32415, 2220, 32764, 2958, -32298, -8063, 31023, 12965, -28974, -17545, 26201, 21685, -22774, -25286, 18777, 28252, -14313, -30515, 9489, 32014, -4430, -32715, -741, 32597, 5892, -31667, -10898, 29944, 15629, -27474, -19972, 24317, 23815, -20554, -27064, 16276, 29635, -11593, -31469, 6619, 32514, -1481, -32749, -3696, 32164, 8778, -30777, -13643, 28620, 18165, -25750, -22236, 22235, 25749, -18166, -28621, 13642, 30776, -8779, -32165, 3695, 32748, 1480, -32515, -6620, 31468, 11592, -29636, -16277, 27063, 20553, -23816, -24318, 19971, 27473, -15630, -29945, 10897, 31666, -5893, -32598, 740, 32714, 4429, -32015, -9490, 30514, 14312, -28253, -18778, 25285, 22773, -21686, -26202, 17544, 28973, -12966, -31024, 8062, 32297, -2959, -32765, -2221, 32414, 7342, -31254, -12283, 29312, 16915, -26640, -21126, 23300, 24807, -19380, -27871, 14974, 30237, -10196, -31849, 5162, 32664}, -{0, -32749, -2221, 32597, 4429, -32298, -6620, 31848, 8778, -31254, -10898, 30514, 12965, -29636, -14975, 28620, 16915, -27474, -18778, 26201, 20553, -24808, -22236, 23300, 23815, -21686, -25286, 19971, 26639, -18166, -27871, 16276, 28973, -14313, -29945, 12282, 30776, -10196, -31469, 8062, 32014, -5893, -32415, 3695, 32664, -1481, -32765, -741, 32714, 2958, -32515, -5163, 32164, 7342, -31667, -9490, 31023, 11592, -30238, -13643, 29312, 15629, -28253, -17545, 27063, 19379, -25750, -21126, 24317, 22773, -22774, -24318, 21125, 25749, -19380, -27064, 17544, 28252, -15630, -29313, 13642, 30237, -11593, -31024, 9489, 31666, -7343, -32165, 5162, 32514, -2959, -32715, 740, 32764, 1480, -32665, -3696, 32414, 5892, -32015, -8063, 31468, 10195, -30777, -12283, 29944, 14312, -28974, -16277, 27870, 18165, -26640, -19972, 25285, 21685, -23816, -23301, 22235, 24807, -20554, -26202, 18777, 27473, -16916, -28621, 14974, 29635, -12966, -30515, 10897, 31253, -8779, -31849, 6619, 32297, -4430, -32598, 2220, 32748}, -{0, -32765, 740, 32748, -1481, -32715, 2220, 32664, -2959, -32598, 3695, 32514, -4430, -32415, 5162, 32297, -5893, -32165, 6619, 32014, -7343, -31849, 8062, 31666, -8779, -31469, 9489, 31253, -10196, -31024, 10897, 30776, -11593, -30515, 12282, 30237, -12966, -29945, 13642, 29635, -14313, -29313, 14974, 28973, -15630, -28621, 16276, 28252, -16916, -27871, 17544, 27473, -18166, -27064, 18777, 26639, -19380, -26202, 19971, 25749, -20554, -25286, 21125, 24807, -21686, -24318, 22235, 23815, -22774, -23301, 23300, 22773, -23816, -22236, 24317, 21685, -24808, -21126, 25285, 20553, -25750, -19972, 26201, 19379, -26640, -18778, 27063, 18165, -27474, -17545, 27870, 16915, -28253, -16277, 28620, 15629, -28974, -14975, 29312, 14312, -29636, -13643, 29944, 12965, -30238, -12283, 30514, 11592, -30777, -10898, 31023, 10195, -31254, -9490, 31468, 8778, -31667, -8063, 31848, 7342, -32015, -6620, 32164, 5892, -32298, -5163, 32414, 4429, -32515, -3696, 32597, 2958, -32665, -2221, 32714, 1480, -32749, -741, 32764}, -{0, -32715, 3695, 32297, -7343, -31469, 10897, 30237, -14313, -28621, 17544, 26639, -20554, -24318, 23300, 21685, -25750, -18778, 27870, 15629, -29636, -12283, 31023, 8778, -32015, -5163, 32597, 1480, -32765, 2220, 32514, -5893, -31849, 9489, 30776, -12966, -29313, 16276, 27473, -19380, -25286, 22235, 22773, -24808, -19972, 27063, 16915, -28974, -13643, 30514, 10195, -31667, -6620, 32414, 2958, -32749, 740, 32664, -4430, -32165, 8062, 31253, -11593, -29945, 14974, 28252, -18166, -26202, 21125, 23815, -23816, -21126, 26201, 18165, -28253, -14975, 29944, 11592, -31254, -8063, 32164, 4429, -32665, -741, 32748, -2959, -32415, 6619, 31666, -10196, -30515, 13642, 28973, -16916, -27064, 19971, 24807, -22774, -22236, 25285, 19379, -27474, -16277, 29312, 12965, -30777, -9490, 31848, 5892, -32515, -2221, 32764, -1481, -32598, 5162, 32014, -8779, -31024, 12282, 29635, -15630, -27871, 18777, 25749, -21686, -23301, 24317, 20553, -26640, -17545, 28620, 14312, -30238, -10898, 31468, 7342, -32298, -3696, 32714}, -{0, -32598, 6619, 31253, -12966, -28621, 18777, 24807, -23816, -19972, 27870, 14312, -30777, -8063, 32414, 1480, -32715, 5162, 31666, -11593, -29313, 17544, 25749, -22774, -21126, 27063, 15629, -30238, -9490, 32164, 2958, -32765, 3695, 32014, -10196, -29945, 16276, 26639, -21686, -22236, 26201, 16915, -29636, -10898, 31848, 4429, -32749, 2220, 32297, -8779, -30515, 14974, 27473, -20554, -23301, 25285, 18165, -28974, -12283, 31468, 5892, -32665, 740, 32514, -7343, -31024, 13642, 28252, -19380, -24318, 24317, 19379, -28253, -13643, 31023, 7342, -32515, -741, 32664, -5893, -31469, 12282, 28973, -18166, -25286, 23300, 20553, -27474, -14975, 30514, 8778, -32298, -2221, 32748, -4430, -31849, 10897, 29635, -16916, -26202, 22235, 21685, -26640, -16277, 29944, 10195, -32015, -3696, 32764, -2959, -32165, 9489, 30237, -15630, -27064, 21125, 22773, -25750, -17545, 29312, 11592, -31667, -5163, 32714, -1481, -32415, 8062, 30776, -14313, -27871, 19971, 23815, -24808, -18778, 28620, 12965, -31254, -6620, 32597}, -{0, -32415, 9489, 29635, -18166, -24318, 25285, 16915, -30238, -8063, 32597, -1481, -32165, 10897, 28973, -19380, -23301, 26201, 15629, -30777, -6620, 32714, -2959, -31849, 12282, 28252, -20554, -22236, 27063, 14312, -31254, -5163, 32764, -4430, -31469, 13642, 27473, -21686, -21126, 27870, 12965, -31667, -3696, 32748, -5893, -31024, 14974, 26639, -22774, -19972, 28620, 11592, -32015, -2221, 32664, -7343, -30515, 16276, 25749, -23816, -18778, 29312, 10195, -32298, -741, 32514, -8779, -29945, 17544, 24807, -24808, -17545, 29944, 8778, -32515, 740, 32297, -10196, -29313, 18777, 23815, -25750, -16277, 30514, 7342, -32665, 2220, 32014, -11593, -28621, 19971, 22773, -26640, -14975, 31023, 5892, -32749, 3695, 31666, -12966, -27871, 21125, 21685, -27474, -13643, 31468, 4429, -32765, 5162, 31253, -14313, -27064, 22235, 20553, -28253, -12283, 31848, 2958, -32715, 6619, 30776, -15630, -26202, 23300, 19379, -28974, -10898, 32164, 1480, -32598, 8062, 30237, -16916, -25286, 24317, 18165, -29636, -9490, 32414}, -{0, -32165, 12282, 27473, -22774, -18778, 29944, 7342, -32749, 5162, 30776, -16916, -24318, 26201, 14312, -31667, -2221, 32514, -10196, -28621, 21125, 20553, -28974, -9490, 32597, -2959, -31469, 14974, 25749, -24808, -16277, 31023, 4429, -32715, 8062, 29635, -19380, -22236, 27870, 11592, -32298, 740, 32014, -12966, -27064, 23300, 18165, -30238, -6620, 32764, -5893, -30515, 17544, 23815, -26640, -13643, 31848, 1480, -32415, 10897, 28252, -21686, -19972, 29312, 8778, -32665, 3695, 31253, -15630, -25286, 25285, 15629, -31254, -3696, 32664, -8779, -29313, 19971, 21685, -28253, -10898, 32414, -1481, -31849, 13642, 26639, -23816, -17545, 30514, 5892, -32765, 6619, 30237, -18166, -23301, 27063, 12965, -32015, -741, 32297, -11593, -27871, 22235, 19379, -29636, -8063, 32714, -4430, -31024, 16276, 24807, -25750, -14975, 31468, 2958, -32598, 9489, 28973, -20554, -21126, 28620, 10195, -32515, 2220, 31666, -14313, -26202, 24317, 16915, -30777, -5163, 32748, -7343, -29945, 18777, 22773, -27474, -12283, 32164}, -{0, -31849, 14974, 24807, -26640, -12283, 32414, -2959, -31024, 17544, 22773, -28253, -9490, 32714, -5893, -29945, 19971, 20553, -29636, -6620, 32748, -8779, -28621, 22235, 18165, -30777, -3696, 32514, -11593, -27064, 24317, 15629, -31667, -741, 32014, -14313, -25286, 26201, 12965, -32298, 2220, 31253, -16916, -23301, 27870, 10195, -32665, 5162, 30237, -19380, -21126, 29312, 7342, -32765, 8062, 28973, -21686, -18778, 30514, 4429, -32598, 10897, 27473, -23816, -16277, 31468, 1480, -32165, 13642, 25749, -25750, -13643, 32164, -1481, -31469, 16276, 23815, -27474, -10898, 32597, -4430, -30515, 18777, 21685, -28974, -8063, 32764, -7343, -29313, 21125, 19379, -30238, -5163, 32664, -10196, -27871, 23300, 16915, -31254, -2221, 32297, -12966, -26202, 25285, 14312, -32015, 740, 31666, -15630, -24318, 27063, 11592, -32515, 3695, 30776, -18166, -22236, 28620, 8778, -32749, 6619, 29635, -20554, -19972, 29944, 5892, -32715, 9489, 28252, -22774, -17545, 31023, 2958, -32415, 12282, 26639, -24808, -14975, 31848}, -{0, -31469, 17544, 21685, -29636, -5163, 32514, -12966, -25286, 27063, 10195, -32749, 8062, 28252, -23816, -14975, 32164, -2959, -30515, 19971, 19379, -30777, -2221, 32014, -15630, -23301, 28620, 7342, -32715, 10897, 26639, -25750, -12283, 32597, -5893, -29313, 22235, 16915, -31667, 740, 31253, -18166, -21126, 29944, 4429, -32415, 13642, 24807, -27474, -9490, 32764, -8779, -27871, 24317, 14312, -32298, 3695, 30237, -20554, -18778, 31023, 1480, -31849, 16276, 22773, -28974, -6620, 32664, -11593, -26202, 26201, 11592, -32665, 6619, 28973, -22774, -16277, 31848, -1481, -31024, 18777, 20553, -30238, -3696, 32297, -14313, -24318, 27870, 8778, -32765, 9489, 27473, -24808, -13643, 32414, -4430, -29945, 21125, 18165, -31254, -741, 31666, -16916, -22236, 29312, 5892, -32598, 12282, 25749, -26640, -10898, 32714, -7343, -28621, 23300, 15629, -32015, 2220, 30776, -19380, -19972, 30514, 2958, -32165, 14974, 23815, -28253, -8063, 32748, -10196, -27064, 25285, 12965, -32515, 5162, 29635, -21686, -17545, 31468}, -{0, -31024, 19971, 18165, -31667, 2220, 30237, -21686, -16277, 32164, -4430, -29313, 23300, 14312, -32515, 6619, 28252, -24808, -12283, 32714, -8779, -27064, 26201, 10195, -32765, 10897, 25749, -27474, -8063, 32664, -12966, -24318, 28620, 5892, -32415, 14974, 22773, -29636, -3696, 32014, -16916, -21126, 30514, 1480, -31469, 18777, 19379, -31254, 740, 30776, -20554, -17545, 31848, -2959, -29945, 22235, 15629, -32298, 5162, 28973, -23816, -13643, 32597, -7343, -27871, 25285, 11592, -32749, 9489, 26639, -26640, -9490, 32748, -11593, -25286, 27870, 7342, -32598, 13642, 23815, -28974, -5163, 32297, -15630, -22236, 29944, 2958, -31849, 17544, 20553, -30777, -741, 31253, -19380, -18778, 31468, -1481, -30515, 21125, 16915, -32015, 3695, 29635, -22774, -14975, 32414, -5893, -28621, 24317, 12965, -32665, 8062, 27473, -25750, -10898, 32764, -10196, -26202, 27063, 8778, -32715, 12282, 24807, -28253, -6620, 32514, -14313, -23301, 29312, 4429, -32165, 16276, 21685, -30238, -2221, 31666, -18166, -19972, 31023}, -{0, -30515, 22235, 14312, -32665, 9489, 25749, -28253, -5163, 32014, -18166, -18778, 31848, -4430, -28621, 25285, 10195, -32715, 13642, 22773, -30238, -741, 30776, -21686, -14975, 32597, -8779, -26202, 27870, 5892, -32165, 17544, 19379, -31667, 3695, 28973, -24808, -10898, 32748, -12966, -23301, 29944, 1480, -31024, 21125, 15629, -32515, 8062, 26639, -27474, -6620, 32297, -16916, -19972, 31468, -2959, -29313, 24317, 11592, -32765, 12282, 23815, -29636, -2221, 31253, -20554, -16277, 32414, -7343, -27064, 27063, 7342, -32415, 16276, 20553, -31254, 2220, 29635, -23816, -12283, 32764, -11593, -24318, 29312, 2958, -31469, 19971, 16915, -32298, 6619, 27473, -26640, -8063, 32514, -15630, -21126, 31023, -1481, -29945, 23300, 12965, -32749, 10897, 24807, -28974, -3696, 31666, -19380, -17545, 32164, -5893, -27871, 26201, 8778, -32598, 14974, 21685, -30777, 740, 30237, -22774, -13643, 32714, -10196, -25286, 28620, 4429, -31849, 18777, 18165, -32015, 5162, 28252, -25750, -9490, 32664, -14313, -22236, 30514}, -{0, -29945, 24317, 10195, -32598, 16276, 19379, -32015, 6619, 26639, -28253, -3696, 31253, -21686, -13643, 32764, -12966, -22236, 31023, -2959, -28621, 26201, 7342, -32165, 18777, 16915, -32515, 9489, 24807, -29636, -741, 30237, -23816, -10898, 32664, -15630, -19972, 31848, -5893, -27064, 27870, 4429, -31469, 21125, 14312, -32749, 12282, 22773, -30777, 2220, 28973, -25750, -8063, 32297, -18166, -17545, 32414, -8779, -25286, 29312, 1480, -30515, 23300, 11592, -32715, 14974, 20553, -31667, 5162, 27473, -27474, -5163, 31666, -20554, -14975, 32714, -11593, -23301, 30514, -1481, -29313, 25285, 8778, -32415, 17544, 18165, -32298, 8062, 25749, -28974, -2221, 30776, -22774, -12283, 32748, -14313, -21126, 31468, -4430, -27871, 27063, 5892, -31849, 19971, 15629, -32665, 10897, 23815, -30238, 740, 29635, -24808, -9490, 32514, -16916, -18778, 32164, -7343, -26202, 28620, 2958, -31024, 22235, 12965, -32765, 13642, 21685, -31254, 3695, 28252, -26640, -6620, 32014, -19380, -16277, 32597, -10196, -24318, 29944}, -{0, -29313, 26201, 5892, -31469, 22235, 11592, -32598, 17544, 16915, -32665, 12282, 21685, -31667, 6619, 25749, -29636, 740, 28973, -26640, -5163, 31253, -22774, -10898, 32514, -18166, -16277, 32714, -12966, -21126, 31848, -7343, -25286, 29944, -1481, -28621, 27063, 4429, -31024, 23300, 10195, -32415, 18777, 15629, -32749, 13642, 20553, -32015, 8062, 24807, -30238, 2220, 28252, -27474, -3696, 30776, -23816, -9490, 32297, -19380, -14975, 32764, -14313, -19972, 32164, -8779, -24318, 30514, -2959, -27871, 27870, 2958, -30515, 24317, 8778, -32165, 19971, 14312, -32765, 14974, 19379, -32298, 9489, 23815, -30777, 3695, 27473, -28253, -2221, 30237, -24808, -8063, 32014, -20554, -13643, 32748, -15630, -18778, 32414, -10196, -23301, 31023, -4430, -27064, 28620, 1480, -29945, 25285, 7342, -31849, 21125, 12965, -32715, 16276, 18165, -32515, 10897, 22773, -31254, 5162, 26639, -28974, -741, 29635, -25750, -6620, 31666, -21686, -12283, 32664, -16916, -17545, 32597, -11593, -22236, 31468, -5893, -26202, 29312}, -{0, -28621, 27870, 1480, -29313, 27063, 2958, -29945, 26201, 4429, -30515, 25285, 5892, -31024, 24317, 7342, -31469, 23300, 8778, -31849, 22235, 10195, -32165, 21125, 11592, -32415, 19971, 12965, -32598, 18777, 14312, -32715, 17544, 15629, -32765, 16276, 16915, -32749, 14974, 18165, -32665, 13642, 19379, -32515, 12282, 20553, -32298, 10897, 21685, -32015, 9489, 22773, -31667, 8062, 23815, -31254, 6619, 24807, -30777, 5162, 25749, -30238, 3695, 26639, -29636, 2220, 27473, -28974, 740, 28252, -28253, -741, 28973, -27474, -2221, 29635, -26640, -3696, 30237, -25750, -5163, 30776, -24808, -6620, 31253, -23816, -8063, 31666, -22774, -9490, 32014, -21686, -10898, 32297, -20554, -12283, 32514, -19380, -13643, 32664, -18166, -14975, 32748, -16916, -16277, 32764, -15630, -17545, 32714, -14313, -18778, 32597, -12966, -19972, 32414, -11593, -21126, 32164, -10196, -22236, 31848, -8779, -23301, 31468, -7343, -24318, 31023, -5893, -25286, 30514, -4430, -26202, 29944, -2959, -27064, 29312, -1481, -27871, 28620}, -{0, -27871, 29312, -2959, -26202, 30514, -5893, -24318, 31468, -8779, -22236, 32164, -11593, -19972, 32597, -14313, -17545, 32764, -16916, -14975, 32664, -19380, -12283, 32297, -21686, -9490, 31666, -23816, -6620, 30776, -25750, -3696, 29635, -27474, -741, 28252, -28974, 2220, 26639, -30238, 5162, 24807, -31254, 8062, 22773, -32015, 10897, 20553, -32515, 13642, 18165, -32749, 16276, 15629, -32715, 18777, 12965, -32415, 21125, 10195, -31849, 23300, 7342, -31024, 25285, 4429, -29945, 27063, 1480, -28621, 28620, -1481, -27064, 29944, -4430, -25286, 31023, -7343, -23301, 31848, -10196, -21126, 32414, -12966, -18778, 32714, -15630, -16277, 32748, -18166, -13643, 32514, -20554, -10898, 32014, -22774, -8063, 31253, -24808, -5163, 30237, -26640, -2221, 28973, -28253, 740, 27473, -29636, 3695, 25749, -30777, 6619, 23815, -31667, 9489, 21685, -32298, 12282, 19379, -32665, 14974, 16915, -32765, 17544, 14312, -32598, 19971, 11592, -32165, 22235, 8778, -31469, 24317, 5892, -30515, 26201, 2958, -29313, 27870}, -{0, -27064, 30514, -7343, -22236, 32414, -14313, -16277, 32664, -20554, -9490, 31253, -25750, -2221, 28252, -29636, 5162, 23815, -32015, 12282, 18165, -32765, 18777, 11592, -31849, 24317, 4429, -29313, 28620, -2959, -25286, 31468, -10196, -19972, 32714, -16916, -13643, 32297, -22774, -6620, 30237, -27474, 740, 26639, -30777, 8062, 21685, -32515, 14974, 15629, -32598, 21125, 8778, -31024, 26201, 1480, -27871, 29944, -5893, -23301, 32164, -12966, -17545, 32748, -19380, -10898, 31666, -24808, -3696, 28973, -28974, 3695, 24807, -31667, 10897, 19379, -32749, 17544, 12965, -32165, 23300, 5892, -29945, 27870, -1481, -26202, 31023, -8779, -21126, 32597, -15630, -14975, 32514, -21686, -8063, 30776, -26640, -741, 27473, -30238, 6619, 22773, -32298, 13642, 16915, -32715, 19971, 10195, -31469, 25285, 2958, -28621, 29312, -4430, -24318, 31848, -11593, -18778, 32764, -18166, -12283, 32014, -23816, -5163, 29635, -28253, 2220, 25749, -31254, 9489, 20553, -32665, 16276, 14312, -32415, 22235, 7342, -30515, 27063}, -{0, -26202, 31468, -11593, -17545, 32664, -21686, -6620, 29635, -28974, 5162, 22773, -32515, 16276, 12965, -31849, 25285, 1480, -27064, 31023, -10196, -18778, 32748, -20554, -8063, 30237, -28253, 3695, 23815, -32298, 14974, 14312, -32165, 24317, 2958, -27871, 30514, -8779, -19972, 32764, -19380, -9490, 30776, -27474, 2220, 24807, -32015, 13642, 15629, -32415, 23300, 4429, -28621, 29944, -7343, -21126, 32714, -18166, -10898, 31253, -26640, 740, 25749, -31667, 12282, 16915, -32598, 22235, 5892, -29313, 29312, -5893, -22236, 32597, -16916, -12283, 31666, -25750, -741, 26639, -31254, 10897, 18165, -32715, 21125, 7342, -29945, 28620, -4430, -23301, 32414, -15630, -13643, 32014, -24808, -2221, 27473, -30777, 9489, 19379, -32765, 19971, 8778, -30515, 27870, -2959, -24318, 32164, -14313, -14975, 32297, -23816, -3696, 28252, -30238, 8062, 20553, -32749, 18777, 10195, -31024, 27063, -1481, -25286, 31848, -12966, -16277, 32514, -22774, -5163, 28973, -29636, 6619, 21685, -32665, 17544, 11592, -31469, 26201}, -{0, -25286, 32164, -15630, -12283, 31253, -27474, 3695, 22773, -32665, 18777, 8778, -29945, 29312, -7343, -19972, 32748, -21686, -5163, 28252, -30777, 10897, 16915, -32415, 24317, 1480, -26202, 31848, -14313, -13643, 31666, -26640, 2220, 23815, -32515, 17544, 10195, -30515, 28620, -5893, -21126, 32764, -20554, -6620, 28973, -30238, 9489, 18165, -32598, 23300, 2958, -27064, 31468, -12966, -14975, 32014, -25750, 740, 24807, -32298, 16276, 11592, -31024, 27870, -4430, -22236, 32714, -19380, -8063, 29635, -29636, 8062, 19379, -32715, 22235, 4429, -27871, 31023, -11593, -16277, 32297, -24808, -741, 25749, -32015, 14974, 12965, -31469, 27063, -2959, -23301, 32597, -18166, -9490, 30237, -28974, 6619, 20553, -32765, 21125, 5892, -28621, 30514, -10196, -17545, 32514, -23816, -2221, 26639, -31667, 13642, 14312, -31849, 26201, -1481, -24318, 32414, -16916, -10898, 30776, -28253, 5162, 21685, -32749, 19971, 7342, -29313, 29944, -8779, -18778, 32664, -22774, -3696, 27473, -31254, 12282, 15629, -32165, 25285}, -{0, -24318, 32597, -19380, -6620, 28252, -31254, 13642, 12965, -31024, 28620, -7343, -18778, 32514, -24808, 740, 23815, -32665, 19971, 5892, -27871, 31468, -14313, -12283, 30776, -28974, 8062, 18165, -32415, 25285, -1481, -23301, 32714, -20554, -5163, 27473, -31667, 14974, 11592, -30515, 29312, -8779, -17545, 32297, -25750, 2220, 22773, -32749, 21125, 4429, -27064, 31848, -15630, -10898, 30237, -29636, 9489, 16915, -32165, 26201, -2959, -22236, 32764, -21686, -3696, 26639, -32015, 16276, 10195, -29945, 29944, -10196, -16277, 32014, -26640, 3695, 21685, -32765, 22235, 2958, -26202, 32164, -16916, -9490, 29635, -30238, 10897, 15629, -31849, 27063, -4430, -21126, 32748, -22774, -2221, 25749, -32298, 17544, 8778, -29313, 30514, -11593, -14975, 31666, -27474, 5162, 20553, -32715, 23300, 1480, -25286, 32414, -18166, -8063, 28973, -30777, 12282, 14312, -31469, 27870, -5893, -19972, 32664, -23816, -741, 24807, -32515, 18777, 7342, -28621, 31023, -12966, -13643, 31253, -28253, 6619, 19379, -32598, 24317}, -{0, -23301, 32764, -22774, -741, 23815, -32749, 22235, 1480, -24318, 32714, -21686, -2221, 24807, -32665, 21125, 2958, -25286, 32597, -20554, -3696, 25749, -32515, 19971, 4429, -26202, 32414, -19380, -5163, 26639, -32298, 18777, 5892, -27064, 32164, -18166, -6620, 27473, -32015, 17544, 7342, -27871, 31848, -16916, -8063, 28252, -31667, 16276, 8778, -28621, 31468, -15630, -9490, 28973, -31254, 14974, 10195, -29313, 31023, -14313, -10898, 29635, -30777, 13642, 11592, -29945, 30514, -12966, -12283, 30237, -30238, 12282, 12965, -30515, 29944, -11593, -13643, 30776, -29636, 10897, 14312, -31024, 29312, -10196, -14975, 31253, -28974, 9489, 15629, -31469, 28620, -8779, -16277, 31666, -28253, 8062, 16915, -31849, 27870, -7343, -17545, 32014, -27474, 6619, 18165, -32165, 27063, -5893, -18778, 32297, -26640, 5162, 19379, -32415, 26201, -4430, -19972, 32514, -25750, 3695, 20553, -32598, 25285, -2959, -21126, 32664, -24808, 2220, 21685, -32715, 24317, -1481, -22236, 32748, -23816, 740, 22773, -32765, 23300}, -{0, -22236, 32664, -25750, 5162, 18165, -31849, 28620, -10196, -13643, 30237, -30777, 14974, 8778, -27871, 32164, -19380, -3696, 24807, -32749, 23300, -1481, -21126, 32514, -26640, 6619, 16915, -31469, 29312, -11593, -12283, 29635, -31254, 16276, 7342, -27064, 32414, -20554, -2221, 23815, -32765, 24317, -2959, -19972, 32297, -27474, 8062, 15629, -31024, 29944, -12966, -10898, 28973, -31667, 17544, 5892, -26202, 32597, -21686, -741, 22773, -32715, 25285, -4430, -18778, 32014, -28253, 9489, 14312, -30515, 30514, -14313, -9490, 28252, -32015, 18777, 4429, -25286, 32714, -22774, 740, 21685, -32598, 26201, -5893, -17545, 31666, -28974, 10897, 12965, -29945, 31023, -15630, -8063, 27473, -32298, 19971, 2958, -24318, 32764, -23816, 2220, 20553, -32415, 27063, -7343, -16277, 31253, -29636, 12282, 11592, -29313, 31468, -16916, -6620, 26639, -32515, 21125, 1480, -23301, 32748, -24808, 3695, 19379, -32165, 27870, -8779, -14975, 30776, -30238, 13642, 10195, -28621, 31848, -18166, -5163, 25749, -32665, 22235}, -{0, -21126, 32297, -28253, 10897, 11592, -28621, 32164, -20554, -741, 21685, -32415, 27870, -10196, -12283, 28973, -32015, 19971, 1480, -22236, 32514, -27474, 9489, 12965, -29313, 31848, -19380, -2221, 22773, -32598, 27063, -8779, -13643, 29635, -31667, 18777, 2958, -23301, 32664, -26640, 8062, 14312, -29945, 31468, -18166, -3696, 23815, -32715, 26201, -7343, -14975, 30237, -31254, 17544, 4429, -24318, 32748, -25750, 6619, 15629, -30515, 31023, -16916, -5163, 24807, -32765, 25285, -5893, -16277, 30776, -30777, 16276, 5892, -25286, 32764, -24808, 5162, 16915, -31024, 30514, -15630, -6620, 25749, -32749, 24317, -4430, -17545, 31253, -30238, 14974, 7342, -26202, 32714, -23816, 3695, 18165, -31469, 29944, -14313, -8063, 26639, -32665, 23300, -2959, -18778, 31666, -29636, 13642, 8778, -27064, 32597, -22774, 2220, 19379, -31849, 29312, -12966, -9490, 27473, -32515, 22235, -1481, -19972, 32014, -28974, 12282, 10195, -27871, 32414, -21686, 740, 20553, -32165, 28620, -11593, -10898, 28252, -32298, 21125}, -{0, -19972, 31666, -30238, 16276, 4429, -23301, 32514, -28253, 12282, 8778, -26202, 32764, -25750, 8062, 12965, -28621, 32414, -22774, 3695, 16915, -30515, 31468, -19380, -741, 20553, -31849, 29944, -15630, -5163, 23815, -32598, 27870, -11593, -9490, 26639, -32749, 25285, -7343, -13643, 28973, -32298, 22235, -2959, -17545, 30776, -31254, 18777, 1480, -21126, 32014, -29636, 14974, 5892, -24318, 32664, -27474, 10897, 10195, -27064, 32714, -24808, 6619, 14312, -29313, 32164, -21686, 2220, 18165, -31024, 31023, -18166, -2221, 21685, -32165, 29312, -14313, -6620, 24807, -32715, 27063, -10196, -10898, 27473, -32665, 24317, -5893, -14975, 29635, -32015, 21125, -1481, -18778, 31253, -30777, 17544, 2958, -22236, 32297, -28974, 13642, 7342, -25286, 32748, -26640, 9489, 11592, -27871, 32597, -23816, 5162, 15629, -29945, 31848, -20554, 740, 19379, -31469, 30514, -16916, -3696, 22773, -32415, 28620, -12966, -8063, 25749, -32765, 26201, -8779, -12283, 28252, -32515, 23300, -4430, -16277, 30237, -31667, 19971}, -{0, -18778, 30776, -31667, 21125, -2959, -16277, 29635, -32298, 23300, -5893, -13643, 28252, -32665, 25285, -8779, -10898, 26639, -32765, 27063, -11593, -8063, 24807, -32598, 28620, -14313, -5163, 22773, -32165, 29944, -16916, -2221, 20553, -31469, 31023, -19380, 740, 18165, -30515, 31848, -21686, 3695, 15629, -29313, 32414, -23816, 6619, 12965, -27871, 32714, -25750, 9489, 10195, -26202, 32748, -27474, 12282, 7342, -24318, 32514, -28974, 14974, 4429, -22236, 32014, -30238, 17544, 1480, -19972, 31253, -31254, 19971, -1481, -17545, 30237, -32015, 22235, -4430, -14975, 28973, -32515, 24317, -7343, -12283, 27473, -32749, 26201, -10196, -9490, 25749, -32715, 27870, -12966, -6620, 23815, -32415, 29312, -15630, -3696, 21685, -31849, 30514, -18166, -741, 19379, -31024, 31468, -20554, 2220, 16915, -29945, 32164, -22774, 5162, 14312, -28621, 32597, -24808, 8062, 11592, -27064, 32764, -26640, 10897, 8778, -25286, 32664, -28253, 13642, 5892, -23301, 32297, -29636, 16276, 2958, -21126, 31666, -30777, 18777}, -{0, -17545, 29635, -32515, 25285, -10196, -8063, 23815, -32165, 30514, -19380, 2220, 15629, -28621, 32714, -26640, 12282, 5892, -22236, 31666, -31254, 21125, -4430, -13643, 27473, -32765, 27870, -14313, -3696, 20553, -31024, 31848, -22774, 6619, 11592, -26202, 32664, -28974, 16276, 1480, -18778, 30237, -32298, 24317, -8779, -9490, 24807, -32415, 29944, -18166, 740, 16915, -29313, 32597, -25750, 10897, 7342, -23301, 32014, -30777, 19971, -2959, -14975, 28252, -32749, 27063, -12966, -5163, 21685, -31469, 31468, -21686, 5162, 12965, -27064, 32748, -28253, 14974, 2958, -19972, 30776, -32015, 23300, -7343, -10898, 25749, -32598, 29312, -16916, -741, 18165, -29945, 32414, -24808, 9489, 8778, -24318, 32297, -30238, 18777, -1481, -16277, 28973, -32665, 26201, -11593, -6620, 22773, -31849, 31023, -20554, 3695, 14312, -27871, 32764, -27474, 13642, 4429, -21126, 31253, -31667, 22235, -5893, -12283, 26639, -32715, 28620, -15630, -2221, 19379, -30515, 32164, -23816, 8062, 10195, -25286, 32514, -29636, 17544}, -{0, -16277, 28252, -32765, 28620, -16916, 740, 15629, -27871, 32748, -28974, 17544, -1481, -14975, 27473, -32715, 29312, -18166, 2220, 14312, -27064, 32664, -29636, 18777, -2959, -13643, 26639, -32598, 29944, -19380, 3695, 12965, -26202, 32514, -30238, 19971, -4430, -12283, 25749, -32415, 30514, -20554, 5162, 11592, -25286, 32297, -30777, 21125, -5893, -10898, 24807, -32165, 31023, -21686, 6619, 10195, -24318, 32014, -31254, 22235, -7343, -9490, 23815, -31849, 31468, -22774, 8062, 8778, -23301, 31666, -31667, 23300, -8779, -8063, 22773, -31469, 31848, -23816, 9489, 7342, -22236, 31253, -32015, 24317, -10196, -6620, 21685, -31024, 32164, -24808, 10897, 5892, -21126, 30776, -32298, 25285, -11593, -5163, 20553, -30515, 32414, -25750, 12282, 4429, -19972, 30237, -32515, 26201, -12966, -3696, 19379, -29945, 32597, -26640, 13642, 2958, -18778, 29635, -32665, 27063, -14313, -2221, 18165, -29313, 32714, -27474, 14974, 1480, -17545, 28973, -32749, 27870, -15630, -741, 16915, -28621, 32764, -28253, 16276}, -{0, -14975, 26639, -32415, 31023, -22774, 9489, 5892, -19972, 29635, -32749, 28620, -18166, 3695, 11592, -24318, 31666, -32015, 25285, -12966, -2221, 16915, -27871, 32664, -30238, 21125, -7343, -8063, 21685, -30515, 32597, -27474, 16276, -1481, -13643, 25749, -32165, 31468, -23816, 10897, 4429, -18778, 28973, -32765, 29312, -19380, 5162, 10195, -23301, 31253, -32298, 26201, -14313, -741, 15629, -27064, 32514, -30777, 22235, -8779, -6620, 20553, -29945, 32714, -28253, 17544, -2959, -12283, 24807, -31849, 31848, -24808, 12282, 2958, -17545, 28252, -32715, 29944, -20554, 6619, 8778, -22236, 30776, -32515, 27063, -15630, 740, 14312, -26202, 32297, -31254, 23300, -10196, -5163, 19379, -29313, 32764, -28974, 18777, -4430, -10898, 23815, -31469, 32164, -25750, 13642, 1480, -16277, 27473, -32598, 30514, -21686, 8062, 7342, -21126, 30237, -32665, 27870, -16916, 2220, 12965, -25286, 32014, -31667, 24317, -11593, -3696, 18165, -28621, 32748, -29636, 19971, -5893, -9490, 22773, -31024, 32414, -26640, 14974}, -{0, -13643, 24807, -31469, 32414, -27474, 17544, -4430, -9490, 21685, -29945, 32764, -29636, 21125, -8779, -5163, 18165, -27871, 32514, -31254, 24317, -12966, -741, 14312, -25286, 31666, -32298, 27063, -16916, 3695, 10195, -22236, 30237, -32749, 29312, -20554, 8062, 5892, -18778, 28252, -32598, 31023, -23816, 12282, 1480, -14975, 25749, -31849, 32164, -26640, 16276, -2959, -10898, 22773, -30515, 32714, -28974, 19971, -7343, -6620, 19379, -28621, 32664, -30777, 23300, -11593, -2221, 15629, -26202, 32014, -32015, 26201, -15630, 2220, 11592, -23301, 30776, -32665, 28620, -19380, 6619, 7342, -19972, 28973, -32715, 30514, -22774, 10897, 2958, -16277, 26639, -32165, 31848, -25750, 14974, -1481, -12283, 23815, -31024, 32597, -28253, 18777, -5893, -8063, 20553, -29313, 32748, -30238, 22235, -10196, -3696, 16915, -27064, 32297, -31667, 25285, -14313, 740, 12965, -24318, 31253, -32515, 27870, -18166, 5162, 8778, -21126, 29635, -32765, 29944, -21686, 9489, 4429, -17545, 27473, -32415, 31468, -24808, 13642}, -{0, -12283, 22773, -29945, 32748, -30777, 24317, -14313, 2220, 10195, -21126, 28973, -32598, 31468, -25750, 16276, -4430, -8063, 19379, -27871, 32297, -32015, 27063, -18166, 6619, 5892, -17545, 26639, -31849, 32414, -28253, 19971, -8779, -3696, 15629, -25286, 31253, -32665, 29312, -21686, 10897, 1480, -13643, 23815, -30515, 32764, -30238, 23300, -12966, 740, 11592, -22236, 29635, -32715, 31023, -24808, 14974, -2959, -9490, 20553, -28621, 32514, -31667, 26201, -16916, 5162, 7342, -18778, 27473, -32165, 32164, -27474, 18777, -7343, -5163, 16915, -26202, 31666, -32515, 28620, -20554, 9489, 2958, -14975, 24807, -31024, 32714, -29636, 22235, -11593, -741, 12965, -23301, 30237, -32765, 30514, -23816, 13642, -1481, -10898, 21685, -29313, 32664, -31254, 25285, -15630, 3695, 8778, -19972, 28252, -32415, 31848, -26640, 17544, -5893, -6620, 18165, -27064, 32014, -32298, 27870, -19380, 8062, 4429, -16277, 25749, -31469, 32597, -28974, 21125, -10196, -2221, 14312, -24318, 30776, -32749, 29944, -22774, 12282}, -{0, -10898, 20553, -27871, 32014, -32515, 29312, -22774, 13642, -2959, -8063, 18165, -26202, 31253, -32749, 30514, -24808, 16276, -5893, -5163, 15629, -24318, 30237, -32715, 31468, -26640, 18777, -8779, -2221, 12965, -22236, 28973, -32415, 32164, -28253, 21125, -11593, 740, 10195, -19972, 27473, -31849, 32597, -29636, 23300, -14313, 3695, 7342, -17545, 25749, -31024, 32764, -30777, 25285, -16916, 6619, 4429, -14975, 23815, -29945, 32664, -31667, 27063, -19380, 9489, 1480, -12283, 21685, -28621, 32297, -32298, 28620, -21686, 12282, -1481, -9490, 19379, -27064, 31666, -32665, 29944, -23816, 14974, -4430, -6620, 16915, -25286, 30776, -32765, 31023, -25750, 17544, -7343, -3696, 14312, -23301, 29635, -32598, 31848, -27474, 19971, -10196, -741, 11592, -21126, 28252, -32165, 32414, -28974, 22235, -12966, 2220, 8778, -18778, 26639, -31469, 32714, -30238, 24317, -15630, 5162, 5892, -16277, 24807, -30515, 32748, -31254, 26201, -18166, 8062, 2958, -13643, 22773, -29313, 32514, -32015, 27870, -20554, 10897}, -{0, -9490, 18165, -25286, 30237, -32598, 32164, -28974, 23300, -15630, 6619, 2958, -12283, 20553, -27064, 31253, -32765, 31468, -27474, 21125, -12966, 3695, 5892, -14975, 22773, -28621, 32014, -32665, 30514, -25750, 18777, -10196, 740, 8778, -17545, 24807, -29945, 32514, -32298, 29312, -23816, 16276, -7343, -2221, 11592, -19972, 26639, -31024, 32748, -31667, 27870, -21686, 13642, -4430, -5163, 14312, -22236, 28252, -31849, 32714, -30777, 26201, -19380, 10897, -1481, -8063, 16915, -24318, 29635, -32415, 32414, -29636, 24317, -16916, 8062, 1480, -10898, 19379, -26202, 30776, -32715, 31848, -28253, 22235, -14313, 5162, 4429, -13643, 21685, -27871, 31666, -32749, 31023, -26640, 19971, -11593, 2220, 7342, -16277, 23815, -29313, 32297, -32515, 29944, -24808, 17544, -8779, -741, 10195, -18778, 25749, -30515, 32664, -32015, 28620, -22774, 14974, -5893, -3696, 12965, -21126, 27473, -31469, 32764, -31254, 27063, -20554, 12282, -2959, -6620, 15629, -23301, 28973, -32165, 32597, -30238, 25285, -18166, 9489}, -{0, -8063, 15629, -22236, 27473, -31024, 32664, -32298, 29944, -25750, 19971, -12966, 5162, 2958, -10898, 18165, -24318, 28973, -31849, 32764, -31667, 28620, -23816, 17544, -10196, 2220, 5892, -13643, 20553, -26202, 30237, -32415, 32597, -30777, 27063, -21686, 14974, -7343, -741, 8778, -16277, 22773, -27871, 31253, -32715, 32164, -29636, 25285, -19380, 12282, -4430, -3696, 11592, -18778, 24807, -29313, 32014, -32749, 31468, -28253, 23300, -16916, 9489, -1481, -6620, 14312, -21126, 26639, -30515, 32514, -32515, 30514, -26640, 21125, -14313, 6619, 1480, -9490, 16915, -23301, 28252, -31469, 32748, -32015, 29312, -24808, 18777, -11593, 3695, 4429, -12283, 19379, -25286, 29635, -32165, 32714, -31254, 27870, -22774, 16276, -8779, 740, 7342, -14975, 21685, -27064, 30776, -32598, 32414, -30238, 26201, -20554, 13642, -5893, -2221, 10195, -17545, 23815, -28621, 31666, -32765, 31848, -28974, 24317, -18166, 10897, -2959, -5163, 12965, -19972, 25749, -29945, 32297, -32665, 31023, -27474, 22235, -15630, 8062}, -{0, -6620, 12965, -18778, 23815, -27871, 30776, -32415, 32714, -31667, 29312, -25750, 21125, -15630, 9489, -2959, -3696, 10195, -16277, 21685, -26202, 29635, -31849, 32748, -32298, 30514, -27474, 23300, -18166, 12282, -5893, -741, 7342, -13643, 19379, -24318, 28252, -31024, 32514, -32665, 31468, -28974, 25285, -20554, 14974, -8779, 2220, 4429, -10898, 16915, -22236, 26639, -29945, 32014, -32765, 32164, -30238, 27063, -22774, 17544, -11593, 5162, 1480, -8063, 14312, -19972, 24807, -28621, 31253, -32598, 32597, -31254, 28620, -24808, 19971, -14313, 8062, -1481, -5163, 11592, -17545, 22773, -27064, 30237, -32165, 32764, -32015, 29944, -26640, 22235, -16916, 10897, -4430, -2221, 8778, -14975, 20553, -25286, 28973, -31469, 32664, -32515, 31023, -28253, 24317, -19380, 13642, -7343, 740, 5892, -12283, 18165, -23301, 27473, -30515, 32297, -32749, 31848, -29636, 26201, -21686, 16276, -10196, 3695, 2958, -9490, 15629, -21126, 25749, -29313, 31666, -32715, 32414, -30777, 27870, -23816, 18777, -12966, 6619}, -{0, -5163, 10195, -14975, 19379, -23301, 26639, -29313, 31253, -32415, 32764, -32298, 31023, -28974, 26201, -22774, 18777, -14313, 9489, -4430, -741, 5892, -10898, 15629, -19972, 23815, -27064, 29635, -31469, 32514, -32749, 32164, -30777, 28620, -25750, 22235, -18166, 13642, -8779, 3695, 1480, -6620, 11592, -16277, 20553, -24318, 27473, -29945, 31666, -32598, 32714, -32015, 30514, -28253, 25285, -21686, 17544, -12966, 8062, -2959, -2221, 7342, -12283, 16915, -21126, 24807, -27871, 30237, -31849, 32664, -32665, 31848, -30238, 27870, -24808, 21125, -16916, 12282, -7343, 2220, 2958, -8063, 12965, -17545, 21685, -25286, 28252, -30515, 32014, -32715, 32597, -31667, 29944, -27474, 24317, -20554, 16276, -11593, 6619, -1481, -3696, 8778, -13643, 18165, -22236, 25749, -28621, 30776, -32165, 32748, -32515, 31468, -29636, 27063, -23816, 19971, -15630, 10897, -5893, 740, 4429, -9490, 14312, -18778, 22773, -26202, 28973, -31024, 32297, -32765, 32414, -31254, 29312, -26640, 23300, -19380, 14974, -10196, 5162}, -{0, -3696, 7342, -10898, 14312, -17545, 20553, -23301, 25749, -27871, 29635, -31024, 32014, -32598, 32764, -32515, 31848, -30777, 29312, -27474, 25285, -22774, 19971, -16916, 13642, -10196, 6619, -2959, -741, 4429, -8063, 11592, -14975, 18165, -21126, 23815, -26202, 28252, -29945, 31253, -32165, 32664, -32749, 32414, -31667, 30514, -28974, 27063, -24808, 22235, -19380, 16276, -12966, 9489, -5893, 2220, 1480, -5163, 8778, -12283, 15629, -18778, 21685, -24318, 26639, -28621, 30237, -31469, 32297, -32715, 32714, -32298, 31468, -30238, 28620, -26640, 24317, -21686, 18777, -15630, 12282, -8779, 5162, -1481, -2221, 5892, -9490, 12965, -16277, 19379, -22236, 24807, -27064, 28973, -30515, 31666, -32415, 32748, -32665, 32164, -31254, 29944, -28253, 26201, -23816, 21125, -18166, 14974, -11593, 8062, -4430, 740, 2958, -6620, 10195, -13643, 16915, -19972, 22773, -25286, 27473, -29313, 30776, -31849, 32514, -32765, 32597, -32015, 31023, -29636, 27870, -25750, 23300, -20554, 17544, -14313, 10897, -7343, 3695}, -{0, -2221, 4429, -6620, 8778, -10898, 12965, -14975, 16915, -18778, 20553, -22236, 23815, -25286, 26639, -27871, 28973, -29945, 30776, -31469, 32014, -32415, 32664, -32765, 32714, -32515, 32164, -31667, 31023, -30238, 29312, -28253, 27063, -25750, 24317, -22774, 21125, -19380, 17544, -15630, 13642, -11593, 9489, -7343, 5162, -2959, 740, 1480, -3696, 5892, -8063, 10195, -12283, 14312, -16277, 18165, -19972, 21685, -23301, 24807, -26202, 27473, -28621, 29635, -30515, 31253, -31849, 32297, -32598, 32748, -32749, 32597, -32298, 31848, -31254, 30514, -29636, 28620, -27474, 26201, -24808, 23300, -21686, 19971, -18166, 16276, -14313, 12282, -10196, 8062, -5893, 3695, -1481, -741, 2958, -5163, 7342, -9490, 11592, -13643, 15629, -17545, 19379, -21126, 22773, -24318, 25749, -27064, 28252, -29313, 30237, -31024, 31666, -32165, 32514, -32715, 32764, -32665, 32414, -32015, 31468, -30777, 29944, -28974, 27870, -26640, 25285, -23816, 22235, -20554, 18777, -16916, 14974, -12966, 10897, -8779, 6619, -4430, 2220}, -{0, -741, 1480, -2221, 2958, -3696, 4429, -5163, 5892, -6620, 7342, -8063, 8778, -9490, 10195, -10898, 11592, -12283, 12965, -13643, 14312, -14975, 15629, -16277, 16915, -17545, 18165, -18778, 19379, -19972, 20553, -21126, 21685, -22236, 22773, -23301, 23815, -24318, 24807, -25286, 25749, -26202, 26639, -27064, 27473, -27871, 28252, -28621, 28973, -29313, 29635, -29945, 30237, -30515, 30776, -31024, 31253, -31469, 31666, -31849, 32014, -32165, 32297, -32415, 32514, -32598, 32664, -32715, 32748, -32765, 32764, -32749, 32714, -32665, 32597, -32515, 32414, -32298, 32164, -32015, 31848, -31667, 31468, -31254, 31023, -30777, 30514, -30238, 29944, -29636, 29312, -28974, 28620, -28253, 27870, -27474, 27063, -26640, 26201, -25750, 25285, -24808, 24317, -23816, 23300, -22774, 22235, -21686, 21125, -20554, 19971, -19380, 18777, -18166, 17544, -16916, 16276, -15630, 14974, -14313, 13642, -12966, 12282, -11593, 10897, -10196, 9489, -8779, 8062, -7343, 6619, -5893, 5162, -4430, 3695, -2959, 2220, -1481, 740}, -{0, 740, -1481, 2220, -2959, 3695, -4430, 5162, -5893, 6619, -7343, 8062, -8779, 9489, -10196, 10897, -11593, 12282, -12966, 13642, -14313, 14974, -15630, 16276, -16916, 17544, -18166, 18777, -19380, 19971, -20554, 21125, -21686, 22235, -22774, 23300, -23816, 24317, -24808, 25285, -25750, 26201, -26640, 27063, -27474, 27870, -28253, 28620, -28974, 29312, -29636, 29944, -30238, 30514, -30777, 31023, -31254, 31468, -31667, 31848, -32015, 32164, -32298, 32414, -32515, 32597, -32665, 32714, -32749, 32764, -32765, 32748, -32715, 32664, -32598, 32514, -32415, 32297, -32165, 32014, -31849, 31666, -31469, 31253, -31024, 30776, -30515, 30237, -29945, 29635, -29313, 28973, -28621, 28252, -27871, 27473, -27064, 26639, -26202, 25749, -25286, 24807, -24318, 23815, -23301, 22773, -22236, 21685, -21126, 20553, -19972, 19379, -18778, 18165, -17545, 16915, -16277, 15629, -14975, 14312, -13643, 12965, -12283, 11592, -10898, 10195, -9490, 8778, -8063, 7342, -6620, 5892, -5163, 4429, -3696, 2958, -2221, 1480, -741}, -{0, 2220, -4430, 6619, -8779, 10897, -12966, 14974, -16916, 18777, -20554, 22235, -23816, 25285, -26640, 27870, -28974, 29944, -30777, 31468, -32015, 32414, -32665, 32764, -32715, 32514, -32165, 31666, -31024, 30237, -29313, 28252, -27064, 25749, -24318, 22773, -21126, 19379, -17545, 15629, -13643, 11592, -9490, 7342, -5163, 2958, -741, -1481, 3695, -5893, 8062, -10196, 12282, -14313, 16276, -18166, 19971, -21686, 23300, -24808, 26201, -27474, 28620, -29636, 30514, -31254, 31848, -32298, 32597, -32749, 32748, -32598, 32297, -31849, 31253, -30515, 29635, -28621, 27473, -26202, 24807, -23301, 21685, -19972, 18165, -16277, 14312, -12283, 10195, -8063, 5892, -3696, 1480, 740, -2959, 5162, -7343, 9489, -11593, 13642, -15630, 17544, -19380, 21125, -22774, 24317, -25750, 27063, -28253, 29312, -30238, 31023, -31667, 32164, -32515, 32714, -32765, 32664, -32415, 32014, -31469, 30776, -29945, 28973, -27871, 26639, -25286, 23815, -22236, 20553, -18778, 16915, -14975, 12965, -10898, 8778, -6620, 4429, -2221}, -{0, 3695, -7343, 10897, -14313, 17544, -20554, 23300, -25750, 27870, -29636, 31023, -32015, 32597, -32765, 32514, -31849, 30776, -29313, 27473, -25286, 22773, -19972, 16915, -13643, 10195, -6620, 2958, 740, -4430, 8062, -11593, 14974, -18166, 21125, -23816, 26201, -28253, 29944, -31254, 32164, -32665, 32748, -32415, 31666, -30515, 28973, -27064, 24807, -22236, 19379, -16277, 12965, -9490, 5892, -2221, -1481, 5162, -8779, 12282, -15630, 18777, -21686, 24317, -26640, 28620, -30238, 31468, -32298, 32714, -32715, 32297, -31469, 30237, -28621, 26639, -24318, 21685, -18778, 15629, -12283, 8778, -5163, 1480, 2220, -5893, 9489, -12966, 16276, -19380, 22235, -24808, 27063, -28974, 30514, -31667, 32414, -32749, 32664, -32165, 31253, -29945, 28252, -26202, 23815, -21126, 18165, -14975, 11592, -8063, 4429, -741, -2959, 6619, -10196, 13642, -16916, 19971, -22774, 25285, -27474, 29312, -30777, 31848, -32515, 32764, -32598, 32014, -31024, 29635, -27871, 25749, -23301, 20553, -17545, 14312, -10898, 7342, -3696}, -{0, 5162, -10196, 14974, -19380, 23300, -26640, 29312, -31254, 32414, -32765, 32297, -31024, 28973, -26202, 22773, -18778, 14312, -9490, 4429, 740, -5893, 10897, -15630, 19971, -23816, 27063, -29636, 31468, -32515, 32748, -32165, 30776, -28621, 25749, -22236, 18165, -13643, 8778, -3696, -1481, 6619, -11593, 16276, -20554, 24317, -27474, 29944, -31667, 32597, -32715, 32014, -30515, 28252, -25286, 21685, -17545, 12965, -8063, 2958, 2220, -7343, 12282, -16916, 21125, -24808, 27870, -30238, 31848, -32665, 32664, -31849, 30237, -27871, 24807, -21126, 16915, -12283, 7342, -2221, -2959, 8062, -12966, 17544, -21686, 25285, -28253, 30514, -32015, 32714, -32598, 31666, -29945, 27473, -24318, 20553, -16277, 11592, -6620, 1480, 3695, -8779, 13642, -18166, 22235, -25750, 28620, -30777, 32164, -32749, 32514, -31469, 29635, -27064, 23815, -19972, 15629, -10898, 5892, -741, -4430, 9489, -14313, 18777, -22774, 26201, -28974, 31023, -32298, 32764, -32415, 31253, -29313, 26639, -23301, 19379, -14975, 10195, -5163}, -{0, 6619, -12966, 18777, -23816, 27870, -30777, 32414, -32715, 31666, -29313, 25749, -21126, 15629, -9490, 2958, 3695, -10196, 16276, -21686, 26201, -29636, 31848, -32749, 32297, -30515, 27473, -23301, 18165, -12283, 5892, 740, -7343, 13642, -19380, 24317, -28253, 31023, -32515, 32664, -31469, 28973, -25286, 20553, -14975, 8778, -2221, -4430, 10897, -16916, 22235, -26640, 29944, -32015, 32764, -32165, 30237, -27064, 22773, -17545, 11592, -5163, -1481, 8062, -14313, 19971, -24808, 28620, -31254, 32597, -32598, 31253, -28621, 24807, -19972, 14312, -8063, 1480, 5162, -11593, 17544, -22774, 27063, -30238, 32164, -32765, 32014, -29945, 26639, -22236, 16915, -10898, 4429, 2220, -8779, 14974, -20554, 25285, -28974, 31468, -32665, 32514, -31024, 28252, -24318, 19379, -13643, 7342, -741, -5893, 12282, -18166, 23300, -27474, 30514, -32298, 32748, -31849, 29635, -26202, 21685, -16277, 10195, -3696, -2959, 9489, -15630, 21125, -25750, 29312, -31667, 32714, -32415, 30776, -27871, 23815, -18778, 12965, -6620}, -{0, 8062, -15630, 22235, -27474, 31023, -32665, 32297, -29945, 25749, -19972, 12965, -5163, -2959, 10897, -18166, 24317, -28974, 31848, -32765, 31666, -28621, 23815, -17545, 10195, -2221, -5893, 13642, -20554, 26201, -30238, 32414, -32598, 30776, -27064, 21685, -14975, 7342, 740, -8779, 16276, -22774, 27870, -31254, 32714, -32165, 29635, -25286, 19379, -12283, 4429, 3695, -11593, 18777, -24808, 29312, -32015, 32748, -31469, 28252, -23301, 16915, -9490, 1480, 6619, -14313, 21125, -26640, 30514, -32515, 32514, -30515, 26639, -21126, 14312, -6620, -1481, 9489, -16916, 23300, -28253, 31468, -32749, 32014, -29313, 24807, -18778, 11592, -3696, -4430, 12282, -19380, 25285, -29636, 32164, -32715, 31253, -27871, 22773, -16277, 8778, -741, -7343, 14974, -21686, 27063, -30777, 32597, -32415, 30237, -26202, 20553, -13643, 5892, 2220, -10196, 17544, -23816, 28620, -31667, 32764, -31849, 28973, -24318, 18165, -10898, 2958, 5162, -12966, 19971, -25750, 29944, -32298, 32664, -31024, 27473, -22236, 15629, -8063}, -{0, 9489, -18166, 25285, -30238, 32597, -32165, 28973, -23301, 15629, -6620, -2959, 12282, -20554, 27063, -31254, 32764, -31469, 27473, -21126, 12965, -3696, -5893, 14974, -22774, 28620, -32015, 32664, -30515, 25749, -18778, 10195, -741, -8779, 17544, -24808, 29944, -32515, 32297, -29313, 23815, -16277, 7342, 2220, -11593, 19971, -26640, 31023, -32749, 31666, -27871, 21685, -13643, 4429, 5162, -14313, 22235, -28253, 31848, -32715, 30776, -26202, 19379, -10898, 1480, 8062, -16916, 24317, -29636, 32414, -32415, 29635, -24318, 16915, -8063, -1481, 10897, -19380, 26201, -30777, 32714, -31849, 28252, -22236, 14312, -5163, -4430, 13642, -21686, 27870, -31667, 32748, -31024, 26639, -19972, 11592, -2221, -7343, 16276, -23816, 29312, -32298, 32514, -29945, 24807, -17545, 8778, 740, -10196, 18777, -25750, 30514, -32665, 32014, -28621, 22773, -14975, 5892, 3695, -12966, 21125, -27474, 31468, -32765, 31253, -27064, 20553, -12283, 2958, 6619, -15630, 23300, -28974, 32164, -32598, 30237, -25286, 18165, -9490}, -{0, 10897, -20554, 27870, -32015, 32514, -29313, 22773, -13643, 2958, 8062, -18166, 26201, -31254, 32748, -30515, 24807, -16277, 5892, 5162, -15630, 24317, -30238, 32714, -31469, 26639, -18778, 8778, 2220, -12966, 22235, -28974, 32414, -32165, 28252, -21126, 11592, -741, -10196, 19971, -27474, 31848, -32598, 29635, -23301, 14312, -3696, -7343, 17544, -25750, 31023, -32765, 30776, -25286, 16915, -6620, -4430, 14974, -23816, 29944, -32665, 31666, -27064, 19379, -9490, -1481, 12282, -21686, 28620, -32298, 32297, -28621, 21685, -12283, 1480, 9489, -19380, 27063, -31667, 32664, -29945, 23815, -14975, 4429, 6619, -16916, 25285, -30777, 32764, -31024, 25749, -17545, 7342, 3695, -14313, 23300, -29636, 32597, -31849, 27473, -19972, 10195, 740, -11593, 21125, -28253, 32164, -32415, 28973, -22236, 12965, -2221, -8779, 18777, -26640, 31468, -32715, 30237, -24318, 15629, -5163, -5893, 16276, -24808, 30514, -32749, 31253, -26202, 18165, -8063, -2959, 13642, -22774, 29312, -32515, 32014, -27871, 20553, -10898}, -{0, 12282, -22774, 29944, -32749, 30776, -24318, 14312, -2221, -10196, 21125, -28974, 32597, -31469, 25749, -16277, 4429, 8062, -19380, 27870, -32298, 32014, -27064, 18165, -6620, -5893, 17544, -26640, 31848, -32415, 28252, -19972, 8778, 3695, -15630, 25285, -31254, 32664, -29313, 21685, -10898, -1481, 13642, -23816, 30514, -32765, 30237, -23301, 12965, -741, -11593, 22235, -29636, 32714, -31024, 24807, -14975, 2958, 9489, -20554, 28620, -32515, 31666, -26202, 16915, -5163, -7343, 18777, -27474, 32164, -32165, 27473, -18778, 7342, 5162, -16916, 26201, -31667, 32514, -28621, 20553, -9490, -2959, 14974, -24808, 31023, -32715, 29635, -22236, 11592, 740, -12966, 23300, -30238, 32764, -30515, 23815, -13643, 1480, 10897, -21686, 29312, -32665, 31253, -25286, 15629, -3696, -8779, 19971, -28253, 32414, -31849, 26639, -17545, 5892, 6619, -18166, 27063, -32015, 32297, -27871, 19379, -8063, -4430, 16276, -25750, 31468, -32598, 28973, -21126, 10195, 2220, -14313, 24317, -30777, 32748, -29945, 22773, -12283}, -{0, 13642, -24808, 31468, -32415, 27473, -17545, 4429, 9489, -21686, 29944, -32765, 29635, -21126, 8778, 5162, -18166, 27870, -32515, 31253, -24318, 12965, 740, -14313, 25285, -31667, 32297, -27064, 16915, -3696, -10196, 22235, -30238, 32748, -29313, 20553, -8063, -5893, 18777, -28253, 32597, -31024, 23815, -12283, -1481, 14974, -25750, 31848, -32165, 26639, -16277, 2958, 10897, -22774, 30514, -32715, 28973, -19972, 7342, 6619, -19380, 28620, -32665, 30776, -23301, 11592, 2220, -15630, 26201, -32015, 32014, -26202, 15629, -2221, -11593, 23300, -30777, 32664, -28621, 19379, -6620, -7343, 19971, -28974, 32714, -30515, 22773, -10898, -2959, 16276, -26640, 32164, -31849, 25749, -14975, 1480, 12282, -23816, 31023, -32598, 28252, -18778, 5892, 8062, -20554, 29312, -32749, 30237, -22236, 10195, 3695, -16916, 27063, -32298, 31666, -25286, 14312, -741, -12966, 24317, -31254, 32514, -27871, 18165, -5163, -8779, 21125, -29636, 32764, -29945, 21685, -9490, -4430, 17544, -27474, 32414, -31469, 24807, -13643}, -{0, 14974, -26640, 32414, -31024, 22773, -9490, -5893, 19971, -29636, 32748, -28621, 18165, -3696, -11593, 24317, -31667, 32014, -25286, 12965, 2220, -16916, 27870, -32665, 30237, -21126, 7342, 8062, -21686, 30514, -32598, 27473, -16277, 1480, 13642, -25750, 32164, -31469, 23815, -10898, -4430, 18777, -28974, 32764, -29313, 19379, -5163, -10196, 23300, -31254, 32297, -26202, 14312, 740, -15630, 27063, -32515, 30776, -22236, 8778, 6619, -20554, 29944, -32715, 28252, -17545, 2958, 12282, -24808, 31848, -31849, 24807, -12283, -2959, 17544, -28253, 32714, -29945, 20553, -6620, -8779, 22235, -30777, 32514, -27064, 15629, -741, -14313, 26201, -32298, 31253, -23301, 10195, 5162, -19380, 29312, -32765, 28973, -18778, 4429, 10897, -23816, 31468, -32165, 25749, -13643, -1481, 16276, -27474, 32597, -30515, 21685, -8063, -7343, 21125, -30238, 32664, -27871, 16915, -2221, -12966, 25285, -32015, 31666, -24318, 11592, 3695, -18166, 28620, -32749, 29635, -19972, 5892, 9489, -22774, 31023, -32415, 26639, -14975}, -{0, 16276, -28253, 32764, -28621, 16915, -741, -15630, 27870, -32749, 28973, -17545, 1480, 14974, -27474, 32714, -29313, 18165, -2221, -14313, 27063, -32665, 29635, -18778, 2958, 13642, -26640, 32597, -29945, 19379, -3696, -12966, 26201, -32515, 30237, -19972, 4429, 12282, -25750, 32414, -30515, 20553, -5163, -11593, 25285, -32298, 30776, -21126, 5892, 10897, -24808, 32164, -31024, 21685, -6620, -10196, 24317, -32015, 31253, -22236, 7342, 9489, -23816, 31848, -31469, 22773, -8063, -8779, 23300, -31667, 31666, -23301, 8778, 8062, -22774, 31468, -31849, 23815, -9490, -7343, 22235, -31254, 32014, -24318, 10195, 6619, -21686, 31023, -32165, 24807, -10898, -5893, 21125, -30777, 32297, -25286, 11592, 5162, -20554, 30514, -32415, 25749, -12283, -4430, 19971, -30238, 32514, -26202, 12965, 3695, -19380, 29944, -32598, 26639, -13643, -2959, 18777, -29636, 32664, -27064, 14312, 2220, -18166, 29312, -32715, 27473, -14975, -1481, 17544, -28974, 32748, -27871, 15629, 740, -16916, 28620, -32765, 28252, -16277}, -{0, 17544, -29636, 32514, -25286, 10195, 8062, -23816, 32164, -30515, 19379, -2221, -15630, 28620, -32715, 26639, -12283, -5893, 22235, -31667, 31253, -21126, 4429, 13642, -27474, 32764, -27871, 14312, 3695, -20554, 31023, -31849, 22773, -6620, -11593, 26201, -32665, 28973, -16277, -1481, 18777, -30238, 32297, -24318, 8778, 9489, -24808, 32414, -29945, 18165, -741, -16916, 29312, -32598, 25749, -10898, -7343, 23300, -32015, 30776, -19972, 2958, 14974, -28253, 32748, -27064, 12965, 5162, -21686, 31468, -31469, 21685, -5163, -12966, 27063, -32749, 28252, -14975, -2959, 19971, -30777, 32014, -23301, 7342, 10897, -25750, 32597, -29313, 16915, 740, -18166, 29944, -32415, 24807, -9490, -8779, 24317, -32298, 30237, -18778, 1480, 16276, -28974, 32664, -26202, 11592, 6619, -22774, 31848, -31024, 20553, -3696, -14313, 27870, -32765, 27473, -13643, -4430, 21125, -31254, 31666, -22236, 5892, 12282, -26640, 32714, -28621, 15629, 2220, -19380, 30514, -32165, 23815, -8063, -10196, 25285, -32515, 29635, -17545}, -{0, 18777, -30777, 31666, -21126, 2958, 16276, -29636, 32297, -23301, 5892, 13642, -28253, 32664, -25286, 8778, 10897, -26640, 32764, -27064, 11592, 8062, -24808, 32597, -28621, 14312, 5162, -22774, 32164, -29945, 16915, 2220, -20554, 31468, -31024, 19379, -741, -18166, 30514, -31849, 21685, -3696, -15630, 29312, -32415, 23815, -6620, -12966, 27870, -32715, 25749, -9490, -10196, 26201, -32749, 27473, -12283, -7343, 24317, -32515, 28973, -14975, -4430, 22235, -32015, 30237, -17545, -1481, 19971, -31254, 31253, -19972, 1480, 17544, -30238, 32014, -22236, 4429, 14974, -28974, 32514, -24318, 7342, 12282, -27474, 32748, -26202, 10195, 9489, -25750, 32714, -27871, 12965, 6619, -23816, 32414, -29313, 15629, 3695, -21686, 31848, -30515, 18165, 740, -19380, 31023, -31469, 20553, -2221, -16916, 29944, -32165, 22773, -5163, -14313, 28620, -32598, 24807, -8063, -11593, 27063, -32765, 26639, -10898, -8779, 25285, -32665, 28252, -13643, -5893, 23300, -32298, 29635, -16277, -2959, 21125, -31667, 30776, -18778}, -{0, 19971, -31667, 30237, -16277, -4430, 23300, -32515, 28252, -12283, -8779, 26201, -32765, 25749, -8063, -12966, 28620, -32415, 22773, -3696, -16916, 30514, -31469, 19379, 740, -20554, 31848, -29945, 15629, 5162, -23816, 32597, -27871, 11592, 9489, -26640, 32748, -25286, 7342, 13642, -28974, 32297, -22236, 2958, 17544, -30777, 31253, -18778, -1481, 21125, -32015, 29635, -14975, -5893, 24317, -32665, 27473, -10898, -10196, 27063, -32715, 24807, -6620, -14313, 29312, -32165, 21685, -2221, -18166, 31023, -31024, 18165, 2220, -21686, 32164, -29313, 14312, 6619, -24808, 32714, -27064, 10195, 10897, -27474, 32664, -24318, 5892, 14974, -29636, 32014, -21126, 1480, 18777, -31254, 30776, -17545, -2959, 22235, -32298, 28973, -13643, -7343, 25285, -32749, 26639, -9490, -11593, 27870, -32598, 23815, -5163, -15630, 29944, -31849, 20553, -741, -19380, 31468, -30515, 16915, 3695, -22774, 32414, -28621, 12965, 8062, -25750, 32764, -26202, 8778, 12282, -28253, 32514, -23301, 4429, 16276, -30238, 31666, -19972}, -{0, 21125, -32298, 28252, -10898, -11593, 28620, -32165, 20553, 740, -21686, 32414, -27871, 10195, 12282, -28974, 32014, -19972, -1481, 22235, -32515, 27473, -9490, -12966, 29312, -31849, 19379, 2220, -22774, 32597, -27064, 8778, 13642, -29636, 31666, -18778, -2959, 23300, -32665, 26639, -8063, -14313, 29944, -31469, 18165, 3695, -23816, 32714, -26202, 7342, 14974, -30238, 31253, -17545, -4430, 24317, -32749, 25749, -6620, -15630, 30514, -31024, 16915, 5162, -24808, 32764, -25286, 5892, 16276, -30777, 30776, -16277, -5893, 25285, -32765, 24807, -5163, -16916, 31023, -30515, 15629, 6619, -25750, 32748, -24318, 4429, 17544, -31254, 30237, -14975, -7343, 26201, -32715, 23815, -3696, -18166, 31468, -29945, 14312, 8062, -26640, 32664, -23301, 2958, 18777, -31667, 29635, -13643, -8779, 27063, -32598, 22773, -2221, -19380, 31848, -29313, 12965, 9489, -27474, 32514, -22236, 1480, 19971, -32015, 28973, -12283, -10196, 27870, -32415, 21685, -741, -20554, 32164, -28621, 11592, 10897, -28253, 32297, -21126}, -{0, 22235, -32665, 25749, -5163, -18166, 31848, -28621, 10195, 13642, -30238, 30776, -14975, -8779, 27870, -32165, 19379, 3695, -24808, 32748, -23301, 1480, 21125, -32515, 26639, -6620, -16916, 31468, -29313, 11592, 12282, -29636, 31253, -16277, -7343, 27063, -32415, 20553, 2220, -23816, 32764, -24318, 2958, 19971, -32298, 27473, -8063, -15630, 31023, -29945, 12965, 10897, -28974, 31666, -17545, -5893, 26201, -32598, 21685, 740, -22774, 32714, -25286, 4429, 18777, -32015, 28252, -9490, -14313, 30514, -30515, 14312, 9489, -28253, 32014, -18778, -4430, 25285, -32715, 22773, -741, -21686, 32597, -26202, 5892, 17544, -31667, 28973, -10898, -12966, 29944, -31024, 15629, 8062, -27474, 32297, -19972, -2959, 24317, -32765, 23815, -2221, -20554, 32414, -27064, 7342, 16276, -31254, 29635, -12283, -11593, 29312, -31469, 16915, 6619, -26640, 32514, -21126, -1481, 23300, -32749, 24807, -3696, -19380, 32164, -27871, 8778, 14974, -30777, 30237, -13643, -10196, 28620, -31849, 18165, 5162, -25750, 32664, -22236}, -{0, 23300, -32765, 22773, 740, -23816, 32748, -22236, -1481, 24317, -32715, 21685, 2220, -24808, 32664, -21126, -2959, 25285, -32598, 20553, 3695, -25750, 32514, -19972, -4430, 26201, -32415, 19379, 5162, -26640, 32297, -18778, -5893, 27063, -32165, 18165, 6619, -27474, 32014, -17545, -7343, 27870, -31849, 16915, 8062, -28253, 31666, -16277, -8779, 28620, -31469, 15629, 9489, -28974, 31253, -14975, -10196, 29312, -31024, 14312, 10897, -29636, 30776, -13643, -11593, 29944, -30515, 12965, 12282, -30238, 30237, -12283, -12966, 30514, -29945, 11592, 13642, -30777, 29635, -10898, -14313, 31023, -29313, 10195, 14974, -31254, 28973, -9490, -15630, 31468, -28621, 8778, 16276, -31667, 28252, -8063, -16916, 31848, -27871, 7342, 17544, -32015, 27473, -6620, -18166, 32164, -27064, 5892, 18777, -32298, 26639, -5163, -19380, 32414, -26202, 4429, 19971, -32515, 25749, -3696, -20554, 32597, -25286, 2958, 21125, -32665, 24807, -2221, -21686, 32714, -24318, 1480, 22235, -32749, 23815, -741, -22774, 32764, -23301}, -{0, 24317, -32598, 19379, 6619, -28253, 31253, -13643, -12966, 31023, -28621, 7342, 18777, -32515, 24807, -741, -23816, 32664, -19972, -5893, 27870, -31469, 14312, 12282, -30777, 28973, -8063, -18166, 32414, -25286, 1480, 23300, -32715, 20553, 5162, -27474, 31666, -14975, -11593, 30514, -29313, 8778, 17544, -32298, 25749, -2221, -22774, 32748, -21126, -4430, 27063, -31849, 15629, 10897, -30238, 29635, -9490, -16916, 32164, -26202, 2958, 22235, -32765, 21685, 3695, -26640, 32014, -16277, -10196, 29944, -29945, 10195, 16276, -32015, 26639, -3696, -21686, 32764, -22236, -2959, 26201, -32165, 16915, 9489, -29636, 30237, -10898, -15630, 31848, -27064, 4429, 21125, -32749, 22773, 2220, -25750, 32297, -17545, -8779, 29312, -30515, 11592, 14974, -31667, 27473, -5163, -20554, 32714, -23301, -1481, 25285, -32415, 18165, 8062, -28974, 30776, -12283, -14313, 31468, -27871, 5892, 19971, -32665, 23815, 740, -24808, 32514, -18778, -7343, 28620, -31024, 12965, 13642, -31254, 28252, -6620, -19380, 32597, -24318}, -{0, 25285, -32165, 15629, 12282, -31254, 27473, -3696, -22774, 32664, -18778, -8779, 29944, -29313, 7342, 19971, -32749, 21685, 5162, -28253, 30776, -10898, -16916, 32414, -24318, -1481, 26201, -31849, 14312, 13642, -31667, 26639, -2221, -23816, 32514, -17545, -10196, 30514, -28621, 5892, 21125, -32765, 20553, 6619, -28974, 30237, -9490, -18166, 32597, -23301, -2959, 27063, -31469, 12965, 14974, -32015, 25749, -741, -24808, 32297, -16277, -11593, 31023, -27871, 4429, 22235, -32715, 19379, 8062, -29636, 29635, -8063, -19380, 32714, -22236, -4430, 27870, -31024, 11592, 16276, -32298, 24807, 740, -25750, 32014, -14975, -12966, 31468, -27064, 2958, 23300, -32598, 18165, 9489, -30238, 28973, -6620, -20554, 32764, -21126, -5893, 28620, -30515, 10195, 17544, -32515, 23815, 2220, -26640, 31666, -13643, -14313, 31848, -26202, 1480, 24317, -32415, 16915, 10897, -30777, 28252, -5163, -21686, 32748, -19972, -7343, 29312, -29945, 8778, 18777, -32665, 22773, 3695, -27474, 31253, -12283, -15630, 32164, -25286}, -{0, 26201, -31469, 11592, 17544, -32665, 21685, 6619, -29636, 28973, -5163, -22774, 32514, -16277, -12966, 31848, -25286, -1481, 27063, -31024, 10195, 18777, -32749, 20553, 8062, -30238, 28252, -3696, -23816, 32297, -14975, -14313, 32164, -24318, -2959, 27870, -30515, 8778, 19971, -32765, 19379, 9489, -30777, 27473, -2221, -24808, 32014, -13643, -15630, 32414, -23301, -4430, 28620, -29945, 7342, 21125, -32715, 18165, 10897, -31254, 26639, -741, -25750, 31666, -12283, -16916, 32597, -22236, -5893, 29312, -29313, 5892, 22235, -32598, 16915, 12282, -31667, 25749, 740, -26640, 31253, -10898, -18166, 32714, -21126, -7343, 29944, -28621, 4429, 23300, -32415, 15629, 13642, -32015, 24807, 2220, -27474, 30776, -9490, -19380, 32764, -19972, -8779, 30514, -27871, 2958, 24317, -32165, 14312, 14974, -32298, 23815, 3695, -28253, 30237, -8063, -20554, 32748, -18778, -10196, 31023, -27064, 1480, 25285, -31849, 12965, 16276, -32515, 22773, 5162, -28974, 29635, -6620, -21686, 32664, -17545, -11593, 31468, -26202}, -{0, 27063, -30515, 7342, 22235, -32415, 14312, 16276, -32665, 20553, 9489, -31254, 25749, 2220, -28253, 29635, -5163, -23816, 32014, -12283, -18166, 32764, -18778, -11593, 31848, -24318, -4430, 29312, -28621, 2958, 25285, -31469, 10195, 19971, -32715, 16915, 13642, -32298, 22773, 6619, -30238, 27473, -741, -26640, 30776, -8063, -21686, 32514, -14975, -15630, 32597, -21126, -8779, 31023, -26202, -1481, 27870, -29945, 5892, 23300, -32165, 12965, 17544, -32749, 19379, 10897, -31667, 24807, 3695, -28974, 28973, -3696, -24808, 31666, -10898, -19380, 32748, -17545, -12966, 32164, -23301, -5893, 29944, -27871, 1480, 26201, -31024, 8778, 21125, -32598, 15629, 14974, -32515, 21685, 8062, -30777, 26639, 740, -27474, 30237, -6620, -22774, 32297, -13643, -16916, 32714, -19972, -10196, 31468, -25286, -2959, 28620, -29313, 4429, 24317, -31849, 11592, 18777, -32765, 18165, 12282, -32015, 23815, 5162, -29636, 28252, -2221, -25750, 31253, -9490, -20554, 32664, -16277, -14313, 32414, -22236, -7343, 30514, -27064}, -{0, 27870, -29313, 2958, 26201, -30515, 5892, 24317, -31469, 8778, 22235, -32165, 11592, 19971, -32598, 14312, 17544, -32765, 16915, 14974, -32665, 19379, 12282, -32298, 21685, 9489, -31667, 23815, 6619, -30777, 25749, 3695, -29636, 27473, 740, -28253, 28973, -2221, -26640, 30237, -5163, -24808, 31253, -8063, -22774, 32014, -10898, -20554, 32514, -13643, -18166, 32748, -16277, -15630, 32714, -18778, -12966, 32414, -21126, -10196, 31848, -23301, -7343, 31023, -25286, -4430, 29944, -27064, -1481, 28620, -28621, 1480, 27063, -29945, 4429, 25285, -31024, 7342, 23300, -31849, 10195, 21125, -32415, 12965, 18777, -32715, 15629, 16276, -32749, 18165, 13642, -32515, 20553, 10897, -32015, 22773, 8062, -31254, 24807, 5162, -30238, 26639, 2220, -28974, 28252, -741, -27474, 29635, -3696, -25750, 30776, -6620, -23816, 31666, -9490, -21686, 32297, -12283, -19380, 32664, -14975, -16916, 32764, -17545, -14313, 32597, -19972, -11593, 32164, -22236, -8779, 31468, -24318, -5893, 30514, -26202, -2959, 29312, -27871}, -{0, 28620, -27871, -1481, 29312, -27064, -2959, 29944, -26202, -4430, 30514, -25286, -5893, 31023, -24318, -7343, 31468, -23301, -8779, 31848, -22236, -10196, 32164, -21126, -11593, 32414, -19972, -12966, 32597, -18778, -14313, 32714, -17545, -15630, 32764, -16277, -16916, 32748, -14975, -18166, 32664, -13643, -19380, 32514, -12283, -20554, 32297, -10898, -21686, 32014, -9490, -22774, 31666, -8063, -23816, 31253, -6620, -24808, 30776, -5163, -25750, 30237, -3696, -26640, 29635, -2221, -27474, 28973, -741, -28253, 28252, 740, -28974, 27473, 2220, -29636, 26639, 3695, -30238, 25749, 5162, -30777, 24807, 6619, -31254, 23815, 8062, -31667, 22773, 9489, -32015, 21685, 10897, -32298, 20553, 12282, -32515, 19379, 13642, -32665, 18165, 14974, -32749, 16915, 16276, -32765, 15629, 17544, -32715, 14312, 18777, -32598, 12965, 19971, -32415, 11592, 21125, -32165, 10195, 22235, -31849, 8778, 23300, -31469, 7342, 24317, -31024, 5892, 25285, -30515, 4429, 26201, -29945, 2958, 27063, -29313, 1480, 27870, -28621}, -{0, 29312, -26202, -5893, 31468, -22236, -11593, 32597, -17545, -16916, 32664, -12283, -21686, 31666, -6620, -25750, 29635, -741, -28974, 26639, 5162, -31254, 22773, 10897, -32515, 18165, 16276, -32715, 12965, 21125, -31849, 7342, 25285, -29945, 1480, 28620, -27064, -4430, 31023, -23301, -10196, 32414, -18778, -15630, 32748, -13643, -20554, 32014, -8063, -24808, 30237, -2221, -28253, 27473, 3695, -30777, 23815, 9489, -32298, 19379, 14974, -32765, 14312, 19971, -32165, 8778, 24317, -30515, 2958, 27870, -27871, -2959, 30514, -24318, -8779, 32164, -19972, -14313, 32764, -14975, -19380, 32297, -9490, -23816, 30776, -3696, -27474, 28252, 2220, -30238, 24807, 8062, -32015, 20553, 13642, -32749, 15629, 18777, -32415, 10195, 23300, -31024, 4429, 27063, -28621, -1481, 29944, -25286, -7343, 31848, -21126, -12966, 32714, -16277, -18166, 32514, -10898, -22774, 31253, -5163, -26640, 28973, 740, -29636, 25749, 6619, -31667, 21685, 12282, -32665, 16915, 17544, -32598, 11592, 22235, -31469, 5892, 26201, -29313}, -{0, 29944, -24318, -10196, 32597, -16277, -19380, 32014, -6620, -26640, 28252, 3695, -31254, 21685, 13642, -32765, 12965, 22235, -31024, 2958, 28620, -26202, -7343, 32164, -18778, -16916, 32514, -9490, -24808, 29635, 740, -30238, 23815, 10897, -32665, 15629, 19971, -31849, 5892, 27063, -27871, -4430, 31468, -21126, -14313, 32748, -12283, -22774, 30776, -2221, -28974, 25749, 8062, -32298, 18165, 17544, -32415, 8778, 25285, -29313, -1481, 30514, -23301, -11593, 32714, -14975, -20554, 31666, -5163, -27474, 27473, 5162, -31667, 20553, 14974, -32715, 11592, 23300, -30515, 1480, 29312, -25286, -8779, 32414, -17545, -18166, 32297, -8063, -25750, 28973, 2220, -30777, 22773, 12282, -32749, 14312, 21125, -31469, 4429, 27870, -27064, -5893, 31848, -19972, -15630, 32664, -10898, -23816, 30237, -741, -29636, 24807, 9489, -32515, 16915, 18777, -32165, 7342, 26201, -28621, -2959, 31023, -22236, -12966, 32764, -13643, -21686, 31253, -3696, -28253, 26639, 6619, -32015, 19379, 16276, -32598, 10195, 24317, -29945}, -{0, 30514, -22236, -14313, 32664, -9490, -25750, 28252, 5162, -32015, 18165, 18777, -31849, 4429, 28620, -25286, -10196, 32714, -13643, -22774, 30237, 740, -30777, 21685, 14974, -32598, 8778, 26201, -27871, -5893, 32164, -17545, -19380, 31666, -3696, -28974, 24807, 10897, -32749, 12965, 23300, -29945, -1481, 31023, -21126, -15630, 32514, -8063, -26640, 27473, 6619, -32298, 16915, 19971, -31469, 2958, 29312, -24318, -11593, 32764, -12283, -23816, 29635, 2220, -31254, 20553, 16276, -32415, 7342, 27063, -27064, -7343, 32414, -16277, -20554, 31253, -2221, -29636, 23815, 12282, -32765, 11592, 24317, -29313, -2959, 31468, -19972, -16916, 32297, -6620, -27474, 26639, 8062, -32515, 15629, 21125, -31024, 1480, 29944, -23301, -12966, 32748, -10898, -24808, 28973, 3695, -31667, 19379, 17544, -32165, 5892, 27870, -26202, -8779, 32597, -14975, -21686, 30776, -741, -30238, 22773, 13642, -32715, 10195, 25285, -28621, -4430, 31848, -18778, -18166, 32014, -5163, -28253, 25749, 9489, -32665, 14312, 22235, -30515}, -{0, 31023, -19972, -18166, 31666, -2221, -30238, 21685, 16276, -32165, 4429, 29312, -23301, -14313, 32514, -6620, -28253, 24807, 12282, -32715, 8778, 27063, -26202, -10196, 32764, -10898, -25750, 27473, 8062, -32665, 12965, 24317, -28621, -5893, 32414, -14975, -22774, 29635, 3695, -32015, 16915, 21125, -30515, -1481, 31468, -18778, -19380, 31253, -741, -30777, 20553, 17544, -31849, 2958, 29944, -22236, -15630, 32297, -5163, -28974, 23815, 13642, -32598, 7342, 27870, -25286, -11593, 32748, -9490, -26640, 26639, 9489, -32749, 11592, 25285, -27871, -7343, 32597, -13643, -23816, 28973, 5162, -32298, 15629, 22235, -29945, -2959, 31848, -17545, -20554, 30776, 740, -31254, 19379, 18777, -31469, 1480, 30514, -21126, -16916, 32014, -3696, -29636, 22773, 14974, -32415, 5892, 28620, -24318, -12966, 32664, -8063, -27474, 25749, 10897, -32765, 10195, 26201, -27064, -8779, 32714, -12283, -24808, 28252, 6619, -32515, 14312, 23300, -29313, -4430, 32164, -16277, -21686, 30237, 2220, -31667, 18165, 19971, -31024}, -{0, 31468, -17545, -21686, 29635, 5162, -32515, 12965, 25285, -27064, -10196, 32748, -8063, -28253, 23815, 14974, -32165, 2958, 30514, -19972, -19380, 30776, 2220, -32015, 15629, 23300, -28621, -7343, 32714, -10898, -26640, 25749, 12282, -32598, 5892, 29312, -22236, -16916, 31666, -741, -31254, 18165, 21125, -29945, -4430, 32414, -13643, -24808, 27473, 9489, -32765, 8778, 27870, -24318, -14313, 32297, -3696, -30238, 20553, 18777, -31024, -1481, 31848, -16277, -22774, 28973, 6619, -32665, 11592, 26201, -26202, -11593, 32664, -6620, -28974, 22773, 16276, -31849, 1480, 31023, -18778, -20554, 30237, 3695, -32298, 14312, 24317, -27871, -8779, 32764, -9490, -27474, 24807, 13642, -32415, 4429, 29944, -21126, -18166, 31253, 740, -31667, 16915, 22235, -29313, -5893, 32597, -12283, -25750, 26639, 10897, -32715, 7342, 28620, -23301, -15630, 32014, -2221, -30777, 19379, 19971, -30515, -2959, 32164, -14975, -23816, 28252, 8062, -32749, 10195, 27063, -25286, -12966, 32514, -5163, -29636, 21685, 17544, -31469}, -{0, 31848, -14975, -24808, 26639, 12282, -32415, 2958, 31023, -17545, -22774, 28252, 9489, -32715, 5892, 29944, -19972, -20554, 29635, 6619, -32749, 8778, 28620, -22236, -18166, 30776, 3695, -32515, 11592, 27063, -24318, -15630, 31666, 740, -32015, 14312, 25285, -26202, -12966, 32297, -2221, -31254, 16915, 23300, -27871, -10196, 32664, -5163, -30238, 19379, 21125, -29313, -7343, 32764, -8063, -28974, 21685, 18777, -30515, -4430, 32597, -10898, -27474, 23815, 16276, -31469, -1481, 32164, -13643, -25750, 25749, 13642, -32165, 1480, 31468, -16277, -23816, 27473, 10897, -32598, 4429, 30514, -18778, -21686, 28973, 8062, -32765, 7342, 29312, -21126, -19380, 30237, 5162, -32665, 10195, 27870, -23301, -16916, 31253, 2220, -32298, 12965, 26201, -25286, -14313, 32014, -741, -31667, 15629, 24317, -27064, -11593, 32514, -3696, -30777, 18165, 22235, -28621, -8779, 32748, -6620, -29636, 20553, 19971, -29945, -5893, 32714, -9490, -28253, 22773, 17544, -31024, -2959, 32414, -12283, -26640, 24807, 14974, -31849}, -{0, 32164, -12283, -27474, 22773, 18777, -29945, -7343, 32748, -5163, -30777, 16915, 24317, -26202, -14313, 31666, 2220, -32515, 10195, 28620, -21126, -20554, 28973, 9489, -32598, 2958, 31468, -14975, -25750, 24807, 16276, -31024, -4430, 32714, -8063, -29636, 19379, 22235, -27871, -11593, 32297, -741, -32015, 12965, 27063, -23301, -18166, 30237, 6619, -32765, 5892, 30514, -17545, -23816, 26639, 13642, -31849, -1481, 32414, -10898, -28253, 21685, 19971, -29313, -8779, 32664, -3696, -31254, 15629, 25285, -25286, -15630, 31253, 3695, -32665, 8778, 29312, -19972, -21686, 28252, 10897, -32415, 1480, 31848, -13643, -26640, 23815, 17544, -30515, -5893, 32764, -6620, -30238, 18165, 23300, -27064, -12966, 32014, 740, -32298, 11592, 27870, -22236, -19380, 29635, 8062, -32715, 4429, 31023, -16277, -24808, 25749, 14974, -31469, -2959, 32597, -9490, -28974, 20553, 21125, -28621, -10196, 32514, -2221, -31667, 14312, 26201, -24318, -16916, 30776, 5162, -32749, 7342, 29944, -18778, -22774, 27473, 12282, -32165}, -{0, 32414, -9490, -29636, 18165, 24317, -25286, -16916, 30237, 8062, -32598, 1480, 32164, -10898, -28974, 19379, 23300, -26202, -15630, 30776, 6619, -32715, 2958, 31848, -12283, -28253, 20553, 22235, -27064, -14313, 31253, 5162, -32765, 4429, 31468, -13643, -27474, 21685, 21125, -27871, -12966, 31666, 3695, -32749, 5892, 31023, -14975, -26640, 22773, 19971, -28621, -11593, 32014, 2220, -32665, 7342, 30514, -16277, -25750, 23815, 18777, -29313, -10196, 32297, 740, -32515, 8778, 29944, -17545, -24808, 24807, 17544, -29945, -8779, 32514, -741, -32298, 10195, 29312, -18778, -23816, 25749, 16276, -30515, -7343, 32664, -2221, -32015, 11592, 28620, -19972, -22774, 26639, 14974, -31024, -5893, 32748, -3696, -31667, 12965, 27870, -21126, -21686, 27473, 13642, -31469, -4430, 32764, -5163, -31254, 14312, 27063, -22236, -20554, 28252, 12282, -31849, -2959, 32714, -6620, -30777, 15629, 26201, -23301, -19380, 28973, 10897, -32165, -1481, 32597, -8063, -30238, 16915, 25285, -24318, -18166, 29635, 9489, -32415}, -{0, 32597, -6620, -31254, 12965, 28620, -18778, -24808, 23815, 19971, -27871, -14313, 30776, 8062, -32415, -1481, 32714, -5163, -31667, 11592, 29312, -17545, -25750, 22773, 21125, -27064, -15630, 30237, 9489, -32165, -2959, 32764, -3696, -32015, 10195, 29944, -16277, -26640, 21685, 22235, -26202, -16916, 29635, 10897, -31849, -4430, 32748, -2221, -32298, 8778, 30514, -14975, -27474, 20553, 23300, -25286, -18166, 28973, 12282, -31469, -5893, 32664, -741, -32515, 7342, 31023, -13643, -28253, 19379, 24317, -24318, -19380, 28252, 13642, -31024, -7343, 32514, 740, -32665, 5892, 31468, -12283, -28974, 18165, 25285, -23301, -20554, 27473, 14974, -30515, -8779, 32297, 2220, -32749, 4429, 31848, -10898, -29636, 16915, 26201, -22236, -21686, 26639, 16276, -29945, -10196, 32014, 3695, -32765, 2958, 32164, -9490, -30238, 15629, 27063, -21126, -22774, 25749, 17544, -29313, -11593, 31666, 5162, -32715, 1480, 32414, -8063, -30777, 14312, 27870, -19972, -23816, 24807, 18777, -28621, -12966, 31253, 6619, -32598}, -{0, 32714, -3696, -32298, 7342, 31468, -10898, -30238, 14312, 28620, -17545, -26640, 20553, 24317, -23301, -21686, 25749, 18777, -27871, -15630, 29635, 12282, -31024, -8779, 32014, 5162, -32598, -1481, 32764, -2221, -32515, 5892, 31848, -9490, -30777, 12965, 29312, -16277, -27474, 19379, 25285, -22236, -22774, 24807, 19971, -27064, -16916, 28973, 13642, -30515, -10196, 31666, 6619, -32415, -2959, 32748, -741, -32665, 4429, 32164, -8063, -31254, 11592, 29944, -14975, -28253, 18165, 26201, -21126, -23816, 23815, 21125, -26202, -18166, 28252, 14974, -29945, -11593, 31253, 8062, -32165, -4430, 32664, 740, -32749, 2958, 32414, -6620, -31667, 10195, 30514, -13643, -28974, 16915, 27063, -19972, -24808, 22773, 22235, -25286, -19380, 27473, 16276, -29313, -12966, 30776, 9489, -31849, -5893, 32514, 2220, -32765, 1480, 32597, -5163, -32015, 8778, 31023, -12283, -29636, 15629, 27870, -18778, -25750, 21685, 23300, -24318, -20554, 26639, 17544, -28621, -14313, 30237, 10897, -31469, -7343, 32297, 3695, -32715}, -{0, 32764, -741, -32749, 1480, 32714, -2221, -32665, 2958, 32597, -3696, -32515, 4429, 32414, -5163, -32298, 5892, 32164, -6620, -32015, 7342, 31848, -8063, -31667, 8778, 31468, -9490, -31254, 10195, 31023, -10898, -30777, 11592, 30514, -12283, -30238, 12965, 29944, -13643, -29636, 14312, 29312, -14975, -28974, 15629, 28620, -16277, -28253, 16915, 27870, -17545, -27474, 18165, 27063, -18778, -26640, 19379, 26201, -19972, -25750, 20553, 25285, -21126, -24808, 21685, 24317, -22236, -23816, 22773, 23300, -23301, -22774, 23815, 22235, -24318, -21686, 24807, 21125, -25286, -20554, 25749, 19971, -26202, -19380, 26639, 18777, -27064, -18166, 27473, 17544, -27871, -16916, 28252, 16276, -28621, -15630, 28973, 14974, -29313, -14313, 29635, 13642, -29945, -12966, 30237, 12282, -30515, -11593, 30776, 10897, -31024, -10196, 31253, 9489, -31469, -8779, 31666, 8062, -31849, -7343, 32014, 6619, -32165, -5893, 32297, 5162, -32415, -4430, 32514, 3695, -32598, -2959, 32664, 2220, -32715, -1481, 32748, 740, -32765}, -{0, 32748, 2220, -32598, -4430, 32297, 6619, -31849, -8779, 31253, 10897, -30515, -12966, 29635, 14974, -28621, -16916, 27473, 18777, -26202, -20554, 24807, 22235, -23301, -23816, 21685, 25285, -19972, -26640, 18165, 27870, -16277, -28974, 14312, 29944, -12283, -30777, 10195, 31468, -8063, -32015, 5892, 32414, -3696, -32665, 1480, 32764, 740, -32715, -2959, 32514, 5162, -32165, -7343, 31666, 9489, -31024, -11593, 30237, 13642, -29313, -15630, 28252, 17544, -27064, -19380, 25749, 21125, -24318, -22774, 22773, 24317, -21126, -25750, 19379, 27063, -17545, -28253, 15629, 29312, -13643, -30238, 11592, 31023, -9490, -31667, 7342, 32164, -5163, -32515, 2958, 32714, -741, -32765, -1481, 32664, 3695, -32415, -5893, 32014, 8062, -31469, -10196, 30776, 12282, -29945, -14313, 28973, 16276, -27871, -18166, 26639, 19971, -25286, -21686, 23815, 23300, -22236, -24808, 20553, 26201, -18778, -27474, 16915, 28620, -14975, -29636, 12965, 30514, -10898, -31254, 8778, 31848, -6620, -32298, 4429, 32597, -2221, -32749}, -{0, 32664, 5162, -31849, -10196, 30237, 14974, -27871, -19380, 24807, 23300, -21126, -26640, 16915, 29312, -12283, -31254, 7342, 32414, -2221, -32765, -2959, 32297, 8062, -31024, -12966, 28973, 17544, -26202, -21686, 22773, 25285, -18778, -28253, 14312, 30514, -9490, -32015, 4429, 32714, 740, -32598, -5893, 31666, 10897, -29945, -15630, 27473, 19971, -24318, -23816, 20553, 27063, -16277, -29636, 11592, 31468, -6620, -32515, 1480, 32748, 3695, -32165, -8779, 30776, 13642, -28621, -18166, 25749, 22235, -22236, -25750, 18165, 28620, -13643, -30777, 8778, 32164, -3696, -32749, -1481, 32514, 6619, -31469, -11593, 29635, 16276, -27064, -20554, 23815, 24317, -19972, -27474, 15629, 29944, -10898, -31667, 5892, 32597, -741, -32715, -4430, 32014, 9489, -30515, -14313, 28252, 18777, -25286, -22774, 21685, 26201, -17545, -28974, 12965, 31023, -8063, -32298, 2958, 32764, 2220, -32415, -7343, 31253, 12282, -29313, -16916, 26639, 21125, -23301, -24808, 19379, 27870, -14975, -30238, 10195, 31848, -5163, -32665}, -{0, 32514, 8062, -30515, -15630, 26639, 22235, -21126, -27474, 14312, 31023, -6620, -32665, -1481, 32297, 9489, -29945, -16916, 25749, 23300, -19972, -28253, 12965, 31468, -5163, -32749, -2959, 32014, 10897, -29313, -18166, 24807, 24317, -18778, -28974, 11592, 31848, -3696, -32765, -4430, 31666, 12282, -28621, -19380, 23815, 25285, -17545, -29636, 10195, 32164, -2221, -32715, -5893, 31253, 13642, -27871, -20554, 22773, 26201, -16277, -30238, 8778, 32414, -741, -32598, -7343, 30776, 14974, -27064, -21686, 21685, 27063, -14975, -30777, 7342, 32597, 740, -32415, -8779, 30237, 16276, -26202, -22774, 20553, 27870, -13643, -31254, 5892, 32714, 2220, -32165, -10196, 29635, 17544, -25286, -23816, 19379, 28620, -12283, -31667, 4429, 32764, 3695, -31849, -11593, 28973, 18777, -24318, -24808, 18165, 29312, -10898, -32015, 2958, 32748, 5162, -31469, -12966, 28252, 19971, -23301, -25750, 16915, 29944, -9490, -32298, 1480, 32664, 6619, -31024, -14313, 27473, 21125, -22236, -26640, 15629, 30514, -8063, -32515}, -{0, 32297, 10897, -28621, -20554, 21685, 27870, -12283, -32015, 1480, 32514, 9489, -29313, -19380, 22773, 27063, -13643, -31667, 2958, 32664, 8062, -29945, -18166, 23815, 26201, -14975, -31254, 4429, 32748, 6619, -30515, -16916, 24807, 25285, -16277, -30777, 5892, 32764, 5162, -31024, -15630, 25749, 24317, -17545, -30238, 7342, 32714, 3695, -31469, -14313, 26639, 23300, -18778, -29636, 8778, 32597, 2220, -31849, -12966, 27473, 22235, -19972, -28974, 10195, 32414, 740, -32165, -11593, 28252, 21125, -21126, -28253, 11592, 32164, -741, -32415, -10196, 28973, 19971, -22236, -27474, 12965, 31848, -2221, -32598, -8779, 29635, 18777, -23301, -26640, 14312, 31468, -3696, -32715, -7343, 30237, 17544, -24318, -25750, 15629, 31023, -5163, -32765, -5893, 30776, 16276, -25286, -24808, 16915, 30514, -6620, -32749, -4430, 31253, 14974, -26202, -23816, 18165, 29944, -8063, -32665, -2959, 31666, 13642, -27064, -22774, 19379, 29312, -9490, -32515, -1481, 32014, 12282, -27871, -21686, 20553, 28620, -10898, -32298}, -{0, 32014, 13642, -26202, -24808, 15629, 31468, -2221, -32415, -11593, 27473, 23300, -17545, -30777, 4429, 32664, 9489, -28621, -21686, 19379, 29944, -6620, -32765, -7343, 29635, 19971, -21126, -28974, 8778, 32714, 5162, -30515, -18166, 22773, 27870, -10898, -32515, -2959, 31253, 16276, -24318, -26640, 12965, 32164, 740, -31849, -14313, 25749, 25285, -14975, -31667, 1480, 32297, 12282, -27064, -23816, 16915, 31023, -3696, -32598, -10196, 28252, 22235, -18778, -30238, 5892, 32748, 8062, -29313, -20554, 20553, 29312, -8063, -32749, -5893, 30237, 18777, -22236, -28253, 10195, 32597, 3695, -31024, -16916, 23815, 27063, -12283, -32298, -1481, 31666, 14974, -25286, -25750, 14312, 31848, -741, -32165, -12966, 26639, 24317, -16277, -31254, 2958, 32514, 10897, -27871, -22774, 18165, 30514, -5163, -32715, -8779, 28973, 21125, -19972, -29636, 7342, 32764, 6619, -29945, -19380, 21685, 28620, -9490, -32665, -4430, 30776, 17544, -23301, -27474, 11592, 32414, 2220, -31469, -15630, 24807, 26201, -13643, -32015}, -{0, 31666, 16276, -23301, -28253, 8778, 32764, 8062, -28621, -22774, 16915, 31468, -741, -31849, -15630, 23815, 27870, -9490, -32749, -7343, 28973, 22235, -17545, -31254, 1480, 32014, 14974, -24318, -27474, 10195, 32714, 6619, -29313, -21686, 18165, 31023, -2221, -32165, -14313, 24807, 27063, -10898, -32665, -5893, 29635, 21125, -18778, -30777, 2958, 32297, 13642, -25286, -26640, 11592, 32597, 5162, -29945, -20554, 19379, 30514, -3696, -32415, -12966, 25749, 26201, -12283, -32515, -4430, 30237, 19971, -19972, -30238, 4429, 32514, 12282, -26202, -25750, 12965, 32414, 3695, -30515, -19380, 20553, 29944, -5163, -32598, -11593, 26639, 25285, -13643, -32298, -2959, 30776, 18777, -21126, -29636, 5892, 32664, 10897, -27064, -24808, 14312, 32164, 2220, -31024, -18166, 21685, 29312, -6620, -32715, -10196, 27473, 24317, -14975, -32015, -1481, 31253, 17544, -22236, -28974, 7342, 32748, 9489, -27871, -23816, 15629, 31848, 740, -31469, -16916, 22773, 28620, -8063, -32765, -8779, 28252, 23300, -16277, -31667}, -{0, 31253, 18777, -19972, -30777, 1480, 31666, 17544, -21126, -30238, 2958, 32014, 16276, -22236, -29636, 4429, 32297, 14974, -23301, -28974, 5892, 32514, 13642, -24318, -28253, 7342, 32664, 12282, -25286, -27474, 8778, 32748, 10897, -26202, -26640, 10195, 32764, 9489, -27064, -25750, 11592, 32714, 8062, -27871, -24808, 12965, 32597, 6619, -28621, -23816, 14312, 32414, 5162, -29313, -22774, 15629, 32164, 3695, -29945, -21686, 16915, 31848, 2220, -30515, -20554, 18165, 31468, 740, -31024, -19380, 19379, 31023, -741, -31469, -18166, 20553, 30514, -2221, -31849, -16916, 21685, 29944, -3696, -32165, -15630, 22773, 29312, -5163, -32415, -14313, 23815, 28620, -6620, -32598, -12966, 24807, 27870, -8063, -32715, -11593, 25749, 27063, -9490, -32765, -10196, 26639, 26201, -10898, -32749, -8779, 27473, 25285, -12283, -32665, -7343, 28252, 24317, -13643, -32515, -5893, 28973, 23300, -14975, -32298, -4430, 29635, 22235, -16277, -32015, -2959, 30237, 21125, -17545, -31667, -1481, 30776, 19971, -18778, -31254}, -{0, 30776, 21125, -16277, -32298, -5893, 28252, 25285, -10898, -32765, -11593, 24807, 28620, -5163, -32165, -16916, 20553, 31023, 740, -30515, -21686, 15629, 32414, 6619, -27871, -25750, 10195, 32748, 12282, -24318, -28974, 4429, 32014, 17544, -19972, -31254, -1481, 30237, 22235, -14975, -32515, -7343, 27473, 26201, -9490, -32715, -12966, 23815, 29312, -3696, -31849, -18166, 19379, 31468, 2220, -29945, -22774, 14312, 32597, 8062, -27064, -26640, 8778, 32664, 13642, -23301, -29636, 2958, 31666, 18777, -18778, -31667, -2959, 29635, 23300, -13643, -32665, -8779, 26639, 27063, -8063, -32598, -14313, 22773, 29944, -2221, -31469, -19380, 18165, 31848, 3695, -29313, -23816, 12965, 32714, 9489, -26202, -27474, 7342, 32514, 14974, -22236, -30238, 1480, 31253, 19971, -17545, -32015, -4430, 28973, 24317, -12283, -32749, -10196, 25749, 27870, -6620, -32415, -15630, 21685, 30514, -741, -31024, -20554, 16915, 32164, 5162, -28621, -24808, 11592, 32764, 10897, -25286, -28253, 5892, 32297, 16276, -21126, -30777}, -{0, 30237, 23300, -12283, -32765, -12966, 22773, 30514, 740, -29945, -23816, 11592, 32748, 13642, -22236, -30777, -1481, 29635, 24317, -10898, -32715, -14313, 21685, 31023, 2220, -29313, -24808, 10195, 32664, 14974, -21126, -31254, -2959, 28973, 25285, -9490, -32598, -15630, 20553, 31468, 3695, -28621, -25750, 8778, 32514, 16276, -19972, -31667, -4430, 28252, 26201, -8063, -32415, -16916, 19379, 31848, 5162, -27871, -26640, 7342, 32297, 17544, -18778, -32015, -5893, 27473, 27063, -6620, -32165, -18166, 18165, 32164, 6619, -27064, -27474, 5892, 32014, 18777, -17545, -32298, -7343, 26639, 27870, -5163, -31849, -19380, 16915, 32414, 8062, -26202, -28253, 4429, 31666, 19971, -16277, -32515, -8779, 25749, 28620, -3696, -31469, -20554, 15629, 32597, 9489, -25286, -28974, 2958, 31253, 21125, -14975, -32665, -10196, 24807, 29312, -2221, -31024, -21686, 14312, 32714, 10897, -24318, -29636, 1480, 30776, 22235, -13643, -32749, -11593, 23815, 29944, -741, -30515, -22774, 12965, 32764, 12282, -23301, -30238}, -{0, 29635, 25285, -8063, -32165, -19380, 15629, 32714, 12282, -22236, -31254, -4430, 27473, 27870, -3696, -31024, -22774, 11592, 32664, 16276, -18778, -32298, -8779, 24807, 29944, 740, -29313, -25750, 7342, 32014, 19971, -14975, -32749, -12966, 21685, 31468, 5162, -27064, -28253, 2958, 30776, 23300, -10898, -32598, -16916, 18165, 32414, 9489, -24318, -30238, -1481, 28973, 26201, -6620, -31849, -20554, 14312, 32764, 13642, -21126, -31667, -5893, 26639, 28620, -2221, -30515, -23816, 10195, 32514, 17544, -17545, -32515, -10196, 23815, 30514, 2220, -28621, -26640, 5892, 31666, 21125, -13643, -32765, -14313, 20553, 31848, 6619, -26202, -28974, 1480, 30237, 24317, -9490, -32415, -18166, 16915, 32597, 10897, -23301, -30777, -2959, 28252, 27063, -5163, -31469, -21686, 12965, 32748, 14974, -19972, -32015, -7343, 25749, 29312, -741, -29945, -24808, 8778, 32297, 18777, -16277, -32665, -11593, 22773, 31023, 3695, -27871, -27474, 4429, 31253, 22235, -12283, -32715, -15630, 19379, 32164, 8062, -25286, -29636}, -{0, 28973, 27063, -3696, -30515, -24808, 7342, 31666, 22235, -10898, -32415, -19380, 14312, 32748, 16276, -17545, -32665, -12966, 20553, 32164, 9489, -23301, -31254, -5893, 25749, 29944, 2220, -27871, -28253, 1480, 29635, 26201, -5163, -31024, -23816, 8778, 32014, 21125, -12283, -32598, -18166, 15629, 32764, 14974, -18778, -32515, -11593, 21685, 31848, 8062, -24318, -30777, -4430, 26639, 29312, 740, -28621, -27474, 2958, 30237, 25285, -6620, -31469, -22774, 10195, 32297, 19971, -13643, -32715, -16916, 16915, 32714, 13642, -19972, -32298, -10196, 22773, 31468, 6619, -25286, -30238, -2959, 27473, 28620, -741, -29313, -26640, 4429, 30776, 24317, -8063, -31849, -21686, 11592, 32514, 18777, -14975, -32765, -15630, 18165, 32597, 12282, -21126, -32015, -8779, 23815, 31023, 5162, -26202, -29636, -1481, 28252, 27870, -2221, -29945, -25750, 5892, 31253, 23300, -9490, -32165, -20554, 12965, 32664, 17544, -16277, -32749, -14313, 19379, 32414, 10897, -22236, -31667, -7343, 24807, 30514, 3695, -27064, -28974}, -{0, 28252, 28620, 740, -27871, -28974, -1481, 27473, 29312, 2220, -27064, -29636, -2959, 26639, 29944, 3695, -26202, -30238, -4430, 25749, 30514, 5162, -25286, -30777, -5893, 24807, 31023, 6619, -24318, -31254, -7343, 23815, 31468, 8062, -23301, -31667, -8779, 22773, 31848, 9489, -22236, -32015, -10196, 21685, 32164, 10897, -21126, -32298, -11593, 20553, 32414, 12282, -19972, -32515, -12966, 19379, 32597, 13642, -18778, -32665, -14313, 18165, 32714, 14974, -17545, -32749, -15630, 16915, 32764, 16276, -16277, -32765, -16916, 15629, 32748, 17544, -14975, -32715, -18166, 14312, 32664, 18777, -13643, -32598, -19380, 12965, 32514, 19971, -12283, -32415, -20554, 11592, 32297, 21125, -10898, -32165, -21686, 10195, 32014, 22235, -9490, -31849, -22774, 8778, 31666, 23300, -8063, -31469, -23816, 7342, 31253, 24317, -6620, -31024, -24808, 5892, 30776, 25285, -5163, -30515, -25750, 4429, 30237, 26201, -3696, -29945, -26640, 2958, 29635, 27063, -2221, -29313, -27474, 1480, 28973, 27870, -741, -28621, -28253}, -{0, 27473, 29944, 5162, -24318, -31667, -10196, 20553, 32597, 14974, -16277, -32715, -19380, 11592, 32014, 23300, -6620, -30515, -26640, 1480, 28252, 29312, 3695, -25286, -31254, -8779, 21685, 32414, 13642, -17545, -32765, -18166, 12965, 32297, 22235, -8063, -31024, -25750, 2958, 28973, 28620, 2220, -26202, -30777, -7343, 22773, 32164, 12282, -18778, -32749, -16916, 14312, 32514, 21125, -9490, -31469, -24808, 4429, 29635, 27870, 740, -27064, -30238, -5893, 23815, 31848, 10897, -19972, -32665, -15630, 15629, 32664, 19971, -10898, -31849, -23816, 5892, 30237, 27063, -741, -27871, -29636, -4430, 24807, 31468, 9489, -21126, -32515, -14313, 16915, 32748, 18777, -12283, -32165, -22774, 7342, 30776, 26201, -2221, -28621, -28974, -2959, 25749, 31023, 8062, -22236, -32298, -12966, 18165, 32764, 17544, -13643, -32415, -21686, 8778, 31253, 25285, -3696, -29313, -28253, -1481, 26639, 30514, 6619, -23301, -32015, -11593, 19379, 32714, 16276, -14975, -32598, -20554, 10195, 31666, 24317, -5163, -29945, -27474}, -{0, 26639, 31023, 9489, -19972, -32749, -18166, 11592, 31666, 25285, -2221, -27871, -30238, -7343, 21685, 32597, 16276, -13643, -32165, -23816, 4429, 28973, 29312, 5162, -23301, -32298, -14313, 15629, 32514, 22235, -6620, -29945, -28253, -2959, 24807, 31848, 12282, -17545, -32715, -20554, 8778, 30776, 27063, 740, -26202, -31254, -10196, 19379, 32764, 18777, -10898, -31469, -25750, 1480, 27473, 30514, 8062, -21126, -32665, -16916, 12965, 32014, 24317, -3696, -28621, -29636, -5893, 22773, 32414, 14974, -14975, -32415, -22774, 5892, 29635, 28620, 3695, -24318, -32015, -12966, 16915, 32664, 21125, -8063, -30515, -27474, -1481, 25749, 31468, 10897, -18778, -32765, -19380, 10195, 31253, 26201, -741, -27064, -30777, -8779, 20553, 32714, 17544, -12283, -31849, -24808, 2958, 28252, 29944, 6619, -22236, -32515, -15630, 14312, 32297, 23300, -5163, -29313, -28974, -4430, 23815, 32164, 13642, -16277, -32598, -21686, 7342, 30237, 27870, 2220, -25286, -31667, -11593, 18165, 32748, 19971, -9490, -31024, -26640}, -{0, 25749, 31848, 13642, -14975, -32165, -24808, 1480, 26639, 31468, 12282, -16277, -32415, -23816, 2958, 27473, 31023, 10897, -17545, -32598, -22774, 4429, 28252, 30514, 9489, -18778, -32715, -21686, 5892, 28973, 29944, 8062, -19972, -32765, -20554, 7342, 29635, 29312, 6619, -21126, -32749, -19380, 8778, 30237, 28620, 5162, -22236, -32665, -18166, 10195, 30776, 27870, 3695, -23301, -32515, -16916, 11592, 31253, 27063, 2220, -24318, -32298, -15630, 12965, 31666, 26201, 740, -25286, -32015, -14313, 14312, 32014, 25285, -741, -26202, -31667, -12966, 15629, 32297, 24317, -2221, -27064, -31254, -11593, 16915, 32514, 23300, -3696, -27871, -30777, -10196, 18165, 32664, 22235, -5163, -28621, -30238, -8779, 19379, 32748, 21125, -6620, -29313, -29636, -7343, 20553, 32764, 19971, -8063, -29945, -28974, -5893, 21685, 32714, 18777, -9490, -30515, -28253, -4430, 22773, 32597, 17544, -10898, -31024, -27474, -2959, 23815, 32414, 16276, -12283, -31469, -26640, -1481, 24807, 32164, 14974, -13643, -31849, -25750}, -{0, 24807, 32414, 17544, -9490, -29945, -29636, -8779, 18165, 32514, 24317, -741, -25286, -32298, -16916, 10195, 30237, 29312, 8062, -18778, -32598, -23816, 1480, 25749, 32164, 16276, -10898, -30515, -28974, -7343, 19379, 32664, 23300, -2221, -26202, -32015, -15630, 11592, 30776, 28620, 6619, -19972, -32715, -22774, 2958, 26639, 31848, 14974, -12283, -31024, -28253, -5893, 20553, 32748, 22235, -3696, -27064, -31667, -14313, 12965, 31253, 27870, 5162, -21126, -32765, -21686, 4429, 27473, 31468, 13642, -13643, -31469, -27474, -4430, 21685, 32764, 21125, -5163, -27871, -31254, -12966, 14312, 31666, 27063, 3695, -22236, -32749, -20554, 5892, 28252, 31023, 12282, -14975, -31849, -26640, -2959, 22773, 32714, 19971, -6620, -28621, -30777, -11593, 15629, 32014, 26201, 2220, -23301, -32665, -19380, 7342, 28973, 30514, 10897, -16277, -32165, -25750, -1481, 23815, 32597, 18777, -8063, -29313, -30238, -10196, 16915, 32297, 25285, 740, -24318, -32515, -18166, 8778, 29635, 29944, 9489, -17545, -32415, -24808}, -{0, 23815, 32714, 21125, -3696, -26202, -32298, -18166, 7342, 28252, 31468, 14974, -10898, -29945, -30238, -11593, 14312, 31253, 28620, 8062, -17545, -32165, -26640, -4430, 20553, 32664, 24317, 740, -23301, -32749, -21686, 2958, 25749, 32414, 18777, -6620, -27871, -31667, -15630, 10195, 29635, 30514, 12282, -13643, -31024, -28974, -8779, 16915, 32014, 27063, 5162, -19972, -32598, -24808, -1481, 22773, 32764, 22235, -2221, -25286, -32515, -19380, 5892, 27473, 31848, 16276, -9490, -29313, -30777, -12966, 12965, 30776, 29312, 9489, -16277, -31849, -27474, -5893, 19379, 32514, 25285, 2220, -22236, -32765, -22774, 1480, 24807, 32597, 19971, -5163, -27064, -32015, -16916, 8778, 28973, 31023, 13642, -12283, -30515, -29636, -10196, 15629, 31666, 27870, 6619, -18778, -32415, -25750, -2959, 21685, 32748, 23300, -741, -24318, -32665, -20554, 4429, 26639, 32164, 17544, -8063, -28621, -31254, -14313, 11592, 30237, 29944, 10897, -14975, -31469, -28253, -7343, 18165, 32297, 26201, 3695, -21126, -32715, -23816}, -{0, 22773, 32748, 24317, 2220, -21126, -32598, -25750, -4430, 19379, 32297, 27063, 6619, -17545, -31849, -28253, -8779, 15629, 31253, 29312, 10897, -13643, -30515, -30238, -12966, 11592, 29635, 31023, 14974, -9490, -28621, -31667, -16916, 7342, 27473, 32164, 18777, -5163, -26202, -32515, -20554, 2958, 24807, 32714, 22235, -741, -23301, -32765, -23816, -1481, 21685, 32664, 25285, 3695, -19972, -32415, -26640, -5893, 18165, 32014, 27870, 8062, -16277, -31469, -28974, -10196, 14312, 30776, 29944, 12282, -12283, -29945, -30777, -14313, 10195, 28973, 31468, 16276, -8063, -27871, -32015, -18166, 5892, 26639, 32414, 19971, -3696, -25286, -32665, -21686, 1480, 23815, 32764, 23300, 740, -22236, -32715, -24808, -2959, 20553, 32514, 26201, 5162, -18778, -32165, -27474, -7343, 16915, 31666, 28620, 9489, -14975, -31024, -29636, -11593, 12965, 30237, 30514, 13642, -10898, -29313, -31254, -15630, 8778, 28252, 31848, 17544, -6620, -27064, -32298, -19380, 4429, 25749, 32597, 21125, -2221, -24318, -32749, -22774}, -{0, 21685, 32514, 27063, 8062, -14975, -30515, -30777, -15630, 7342, 26639, 32597, 22235, 740, -21126, -32415, -27474, -8779, 14312, 30237, 31023, 16276, -6620, -26202, -32665, -22774, -1481, 20553, 32297, 27870, 9489, -13643, -29945, -31254, -16916, 5892, 25749, 32714, 23300, 2220, -19972, -32165, -28253, -10196, 12965, 29635, 31468, 17544, -5163, -25286, -32749, -23816, -2959, 19379, 32014, 28620, 10897, -12283, -29313, -31667, -18166, 4429, 24807, 32764, 24317, 3695, -18778, -31849, -28974, -11593, 11592, 28973, 31848, 18777, -3696, -24318, -32765, -24808, -4430, 18165, 31666, 29312, 12282, -10898, -28621, -32015, -19380, 2958, 23815, 32748, 25285, 5162, -17545, -31469, -29636, -12966, 10195, 28252, 32164, 19971, -2221, -23301, -32715, -25750, -5893, 16915, 31253, 29944, 13642, -9490, -27871, -32298, -20554, 1480, 22773, 32664, 26201, 6619, -16277, -31024, -30238, -14313, 8778, 27473, 32414, 21125, -741, -22236, -32598, -26640, -7343, 15629, 30776, 30514, 14974, -8063, -27064, -32515, -21686}, -{0, 20553, 32014, 29312, 13642, -8063, -26202, -32749, -24808, -5893, 15629, 30237, 31468, 18777, -2221, -22236, -32415, -28253, -11593, 10195, 27473, 32597, 23300, 3695, -17545, -31024, -30777, -16916, 4429, 23815, 32664, 27063, 9489, -12283, -28621, -32298, -21686, -1481, 19379, 31666, 29944, 14974, -6620, -25286, -32765, -25750, -7343, 14312, 29635, 31848, 19971, -741, -21126, -32165, -28974, -12966, 8778, 26639, 32714, 24317, 5162, -16277, -30515, -31254, -18166, 2958, 22773, 32514, 27870, 10897, -10898, -27871, -32515, -22774, -2959, 18165, 31253, 30514, 16276, -5163, -24318, -32715, -26640, -8779, 12965, 28973, 32164, 21125, 740, -19972, -31849, -29636, -14313, 7342, 25749, 32764, 25285, 6619, -14975, -29945, -31667, -19380, 1480, 21685, 32297, 28620, 12282, -9490, -27064, -32665, -23816, -4430, 16915, 30776, 31023, 17544, -3696, -23301, -32598, -27474, -10196, 11592, 28252, 32414, 22235, 2220, -18778, -31469, -30238, -15630, 5892, 24807, 32748, 26201, 8062, -13643, -29313, -32015, -20554}, -{0, 19379, 31253, 31023, 18777, -741, -19972, -31469, -30777, -18166, 1480, 20553, 31666, 30514, 17544, -2221, -21126, -31849, -30238, -16916, 2958, 21685, 32014, 29944, 16276, -3696, -22236, -32165, -29636, -15630, 4429, 22773, 32297, 29312, 14974, -5163, -23301, -32415, -28974, -14313, 5892, 23815, 32514, 28620, 13642, -6620, -24318, -32598, -28253, -12966, 7342, 24807, 32664, 27870, 12282, -8063, -25286, -32715, -27474, -11593, 8778, 25749, 32748, 27063, 10897, -9490, -26202, -32765, -26640, -10196, 10195, 26639, 32764, 26201, 9489, -10898, -27064, -32749, -25750, -8779, 11592, 27473, 32714, 25285, 8062, -12283, -27871, -32665, -24808, -7343, 12965, 28252, 32597, 24317, 6619, -13643, -28621, -32515, -23816, -5893, 14312, 28973, 32414, 23300, 5162, -14975, -29313, -32298, -22774, -4430, 15629, 29635, 32164, 22235, 3695, -16277, -29945, -32015, -21686, -2959, 16915, 30237, 31848, 21125, 2220, -17545, -30515, -31667, -20554, -1481, 18165, 30776, 31468, 19971, 740, -18778, -31024, -31254, -19380}, -{0, 18165, 30237, 32164, 23300, 6619, -12283, -27064, -32765, -27474, -12966, 5892, 22773, 32014, 30514, 18777, 740, -17545, -29945, -32298, -23816, -7343, 11592, 26639, 32748, 27870, 13642, -5163, -22236, -31849, -30777, -19380, -1481, 16915, 29635, 32414, 24317, 8062, -10898, -26202, -32715, -28253, -14313, 4429, 21685, 31666, 31023, 19971, 2220, -16277, -29313, -32515, -24808, -8779, 10195, 25749, 32664, 28620, 14974, -3696, -21126, -31469, -31254, -20554, -2959, 15629, 28973, 32597, 25285, 9489, -9490, -25286, -32598, -28974, -15630, 2958, 20553, 31253, 31468, 21125, 3695, -14975, -28621, -32665, -25750, -10196, 8778, 24807, 32514, 29312, 16276, -2221, -19972, -31024, -31667, -21686, -4430, 14312, 28252, 32714, 26201, 10897, -8063, -24318, -32415, -29636, -16916, 1480, 19379, 30776, 31848, 22235, 5162, -13643, -27871, -32749, -26640, -11593, 7342, 23815, 32297, 29944, 17544, -741, -18778, -30515, -32015, -22774, -5893, 12965, 27473, 32764, 27063, 12282, -6620, -23301, -32165, -30238, -18166}, -{0, 16915, 28973, 32714, 27063, 13642, -3696, -19972, -30515, -32298, -24808, -10196, 7342, 22773, 31666, 31468, 22235, 6619, -10898, -25286, -32415, -30238, -19380, -2959, 14312, 27473, 32748, 28620, 16276, -741, -17545, -29313, -32665, -26640, -12966, 4429, 20553, 30776, 32164, 24317, 9489, -8063, -23301, -31849, -31254, -21686, -5893, 11592, 25749, 32514, 29944, 18777, 2220, -14975, -27871, -32765, -28253, -15630, 1480, 18165, 29635, 32597, 26201, 12282, -5163, -21126, -31024, -32015, -23816, -8779, 8778, 23815, 32014, 31023, 21125, 5162, -12283, -26202, -32598, -29636, -18166, -1481, 15629, 28252, 32764, 27870, 14974, -2221, -18778, -29945, -32515, -25750, -11593, 5892, 21685, 31253, 31848, 23300, 8062, -9490, -24318, -32165, -30777, -20554, -4430, 12965, 26639, 32664, 29312, 17544, 740, -16277, -28621, -32749, -27474, -14313, 2958, 19379, 30237, 32414, 25285, 10897, -6620, -22236, -31469, -31667, -22774, -7343, 10195, 24807, 32297, 30514, 19971, 3695, -13643, -27064, -32715, -28974, -16916}, -{0, 15629, 27473, 32664, 29944, 19971, 5162, -10898, -24318, -31849, -31667, -23816, -10196, 5892, 20553, 30237, 32597, 27063, 14974, -741, -16277, -27871, -32715, -29636, -19380, -4430, 11592, 24807, 32014, 31468, 23300, 9489, -6620, -21126, -30515, -32515, -26640, -14313, 1480, 16915, 28252, 32748, 29312, 18777, 3695, -12283, -25286, -32165, -31254, -22774, -8779, 7342, 21685, 30776, 32414, 26201, 13642, -2221, -17545, -28621, -32765, -28974, -18166, -2959, 12965, 25749, 32297, 31023, 22235, 8062, -8063, -22236, -31024, -32298, -25750, -12966, 2958, 18165, 28973, 32764, 28620, 17544, 2220, -13643, -26202, -32415, -30777, -21686, -7343, 8778, 22773, 31253, 32164, 25285, 12282, -3696, -18778, -29313, -32749, -28253, -16916, -1481, 14312, 26639, 32514, 30514, 21125, 6619, -9490, -23301, -31469, -32015, -24808, -11593, 4429, 19379, 29635, 32714, 27870, 16276, 740, -14975, -27064, -32598, -30238, -20554, -5893, 10195, 23815, 31666, 31848, 24317, 10897, -5163, -19972, -29945, -32665, -27474, -15630}, -{0, 14312, 25749, 32014, 31848, 25285, 13642, -741, -14975, -26202, -32165, -31667, -24808, -12966, 1480, 15629, 26639, 32297, 31468, 24317, 12282, -2221, -16277, -27064, -32415, -31254, -23816, -11593, 2958, 16915, 27473, 32514, 31023, 23300, 10897, -3696, -17545, -27871, -32598, -30777, -22774, -10196, 4429, 18165, 28252, 32664, 30514, 22235, 9489, -5163, -18778, -28621, -32715, -30238, -21686, -8779, 5892, 19379, 28973, 32748, 29944, 21125, 8062, -6620, -19972, -29313, -32765, -29636, -20554, -7343, 7342, 20553, 29635, 32764, 29312, 19971, 6619, -8063, -21126, -29945, -32749, -28974, -19380, -5893, 8778, 21685, 30237, 32714, 28620, 18777, 5162, -9490, -22236, -30515, -32665, -28253, -18166, -4430, 10195, 22773, 30776, 32597, 27870, 17544, 3695, -10898, -23301, -31024, -32515, -27474, -16916, -2959, 11592, 23815, 31253, 32414, 27063, 16276, 2220, -12283, -24318, -31469, -32298, -26640, -15630, -1481, 12965, 24807, 31666, 32164, 26201, 14974, 740, -13643, -25286, -31849, -32015, -25750, -14313}, -{0, 12965, 23815, 30776, 32714, 29312, 21125, 9489, -3696, -16277, -26202, -31849, -32298, -27474, -18166, -5893, 7342, 19379, 28252, 32514, 31468, 25285, 14974, 2220, -10898, -22236, -29945, -32765, -30238, -22774, -11593, 1480, 14312, 24807, 31253, 32597, 28620, 19971, 8062, -5163, -17545, -27064, -32165, -32015, -26640, -16916, -4430, 8778, 20553, 28973, 32664, 31023, 24317, 13642, 740, -12283, -23301, -30515, -32749, -29636, -21686, -10196, 2958, 15629, 25749, 31666, 32414, 27870, 18777, 6619, -6620, -18778, -27871, -32415, -31667, -25750, -15630, -2959, 10195, 21685, 29635, 32748, 30514, 23300, 12282, -741, -13643, -24318, -31024, -32665, -28974, -20554, -8779, 4429, 16915, 26639, 32014, 32164, 27063, 17544, 5162, -8063, -19972, -28621, -32598, -31254, -24808, -14313, -1481, 11592, 22773, 30237, 32764, 29944, 22235, 10897, -2221, -14975, -25286, -31469, -32515, -28253, -19380, -7343, 5892, 18165, 27473, 32297, 31848, 26201, 16276, 3695, -9490, -21126, -29313, -32715, -30777, -23816, -12966}, -{0, 11592, 21685, 28973, 32514, 31848, 27063, 18777, 8062, -3696, -14975, -24318, -30515, -32765, -30777, -24808, -15630, -4430, 7342, 18165, 26639, 31666, 32597, 29312, 22235, 12282, 740, -10898, -21126, -28621, -32415, -32015, -27474, -19380, -8779, 2958, 14312, 23815, 30237, 32748, 31023, 25285, 16276, 5162, -6620, -17545, -26202, -31469, -32665, -29636, -22774, -12966, -1481, 10195, 20553, 28252, 32297, 32164, 27870, 19971, 9489, -2221, -13643, -23301, -29945, -32715, -31254, -25750, -16916, -5893, 5892, 16915, 25749, 31253, 32714, 29944, 23300, 13642, 2220, -9490, -19972, -27871, -32165, -32298, -28253, -20554, -10196, 1480, 12965, 22773, 29635, 32664, 31468, 26201, 17544, 6619, -5163, -16277, -25286, -31024, -32749, -30238, -23816, -14313, -2959, 8778, 19379, 27473, 32014, 32414, 28620, 21125, 10897, -741, -12283, -22236, -29313, -32598, -31667, -26640, -18166, -7343, 4429, 15629, 24807, 30776, 32764, 30514, 24317, 14974, 3695, -8063, -18778, -27064, -31849, -32515, -28974, -21686, -11593}, -{0, 10195, 19379, 26639, 31253, 32764, 31023, 26201, 18777, 9489, -741, -10898, -19972, -27064, -31469, -32749, -30777, -25750, -18166, -8779, 1480, 11592, 20553, 27473, 31666, 32714, 30514, 25285, 17544, 8062, -2221, -12283, -21126, -27871, -31849, -32665, -30238, -24808, -16916, -7343, 2958, 12965, 21685, 28252, 32014, 32597, 29944, 24317, 16276, 6619, -3696, -13643, -22236, -28621, -32165, -32515, -29636, -23816, -15630, -5893, 4429, 14312, 22773, 28973, 32297, 32414, 29312, 23300, 14974, 5162, -5163, -14975, -23301, -29313, -32415, -32298, -28974, -22774, -14313, -4430, 5892, 15629, 23815, 29635, 32514, 32164, 28620, 22235, 13642, 3695, -6620, -16277, -24318, -29945, -32598, -32015, -28253, -21686, -12966, -2959, 7342, 16915, 24807, 30237, 32664, 31848, 27870, 21125, 12282, 2220, -8063, -17545, -25286, -30515, -32715, -31667, -27474, -20554, -11593, -1481, 8778, 18165, 25749, 30776, 32748, 31468, 27063, 19971, 10897, 740, -9490, -18778, -26202, -31024, -32765, -31254, -26640, -19380, -10196}, -{0, 8778, 16915, 23815, 28973, 32014, 32714, 31023, 27063, 21125, 13642, 5162, -3696, -12283, -19972, -26202, -30515, -32598, -32298, -29636, -24808, -18166, -10196, -1481, 7342, 15629, 22773, 28252, 31666, 32764, 31468, 27870, 22235, 14974, 6619, -2221, -10898, -18778, -25286, -29945, -32415, -32515, -30238, -25750, -19380, -11593, -2959, 5892, 14312, 21685, 27473, 31253, 32748, 31848, 28620, 23300, 16276, 8062, -741, -9490, -17545, -24318, -29313, -32165, -32665, -30777, -26640, -20554, -12966, -4430, 4429, 12965, 20553, 26639, 30776, 32664, 32164, 29312, 24317, 17544, 9489, 740, -8063, -16277, -23301, -28621, -31849, -32749, -31254, -27474, -21686, -14313, -5893, 2958, 11592, 19379, 25749, 30237, 32514, 32414, 29944, 25285, 18777, 10897, 2220, -6620, -14975, -22236, -27871, -31469, -32765, -31667, -28253, -22774, -15630, -7343, 1480, 10195, 18165, 24807, 29635, 32297, 32597, 30514, 26201, 19971, 12282, 3695, -5163, -13643, -21126, -27064, -31024, -32715, -32015, -28974, -23816, -16916, -8779}, -{0, 7342, 14312, 20553, 25749, 29635, 32014, 32764, 31848, 29312, 25285, 19971, 13642, 6619, -741, -8063, -14975, -21126, -26202, -29945, -32165, -32749, -31667, -28974, -24808, -19380, -12966, -5893, 1480, 8778, 15629, 21685, 26639, 30237, 32297, 32714, 31468, 28620, 24317, 18777, 12282, 5162, -2221, -9490, -16277, -22236, -27064, -30515, -32415, -32665, -31254, -28253, -23816, -18166, -11593, -4430, 2958, 10195, 16915, 22773, 27473, 30776, 32514, 32597, 31023, 27870, 23300, 17544, 10897, 3695, -3696, -10898, -17545, -23301, -27871, -31024, -32598, -32515, -30777, -27474, -22774, -16916, -10196, -2959, 4429, 11592, 18165, 23815, 28252, 31253, 32664, 32414, 30514, 27063, 22235, 16276, 9489, 2220, -5163, -12283, -18778, -24318, -28621, -31469, -32715, -32298, -30238, -26640, -21686, -15630, -8779, -1481, 5892, 12965, 19379, 24807, 28973, 31666, 32748, 32164, 29944, 26201, 21125, 14974, 8062, 740, -6620, -13643, -19972, -25286, -29313, -31849, -32765, -32015, -29636, -25750, -20554, -14313, -7343}, -{0, 5892, 11592, 16915, 21685, 25749, 28973, 31253, 32514, 32714, 31848, 29944, 27063, 23300, 18777, 13642, 8062, 2220, -3696, -9490, -14975, -19972, -24318, -27871, -30515, -32165, -32765, -32298, -30777, -28253, -24808, -20554, -15630, -10196, -4430, 1480, 7342, 12965, 18165, 22773, 26639, 29635, 31666, 32664, 32597, 31468, 29312, 26201, 22235, 17544, 12282, 6619, 740, -5163, -10898, -16277, -21126, -25286, -28621, -31024, -32415, -32749, -32015, -30238, -27474, -23816, -19380, -14313, -8779, -2959, 2958, 8778, 14312, 19379, 23815, 27473, 30237, 32014, 32748, 32414, 31023, 28620, 25285, 21125, 16276, 10897, 5162, -741, -6620, -12283, -17545, -22236, -26202, -29313, -31469, -32598, -32665, -31667, -29636, -26640, -22774, -18166, -12966, -7343, -1481, 4429, 10195, 15629, 20553, 24807, 28252, 30776, 32297, 32764, 32164, 30514, 27870, 24317, 19971, 14974, 9489, 3695, -2221, -8063, -13643, -18778, -23301, -27064, -29945, -31849, -32715, -32515, -31254, -28974, -25750, -21686, -16916, -11593, -5893}, -{0, 4429, 8778, 12965, 16915, 20553, 23815, 26639, 28973, 30776, 32014, 32664, 32714, 32164, 31023, 29312, 27063, 24317, 21125, 17544, 13642, 9489, 5162, 740, -3696, -8063, -12283, -16277, -19972, -23301, -26202, -28621, -30515, -31849, -32598, -32749, -32298, -31254, -29636, -27474, -24808, -21686, -18166, -14313, -10196, -5893, -1481, 2958, 7342, 11592, 15629, 19379, 22773, 25749, 28252, 30237, 31666, 32514, 32764, 32414, 31468, 29944, 27870, 25285, 22235, 18777, 14974, 10897, 6619, 2220, -2221, -6620, -10898, -14975, -18778, -22236, -25286, -27871, -29945, -31469, -32415, -32765, -32515, -31667, -30238, -28253, -25750, -22774, -19380, -15630, -11593, -7343, -2959, 1480, 5892, 10195, 14312, 18165, 21685, 24807, 27473, 29635, 31253, 32297, 32748, 32597, 31848, 30514, 28620, 26201, 23300, 19971, 16276, 12282, 8062, 3695, -741, -5163, -9490, -13643, -17545, -21126, -24318, -27064, -29313, -31024, -32165, -32715, -32665, -32015, -30777, -28974, -26640, -23816, -20554, -16916, -12966, -8779, -4430}, -{0, 2958, 5892, 8778, 11592, 14312, 16915, 19379, 21685, 23815, 25749, 27473, 28973, 30237, 31253, 32014, 32514, 32748, 32714, 32414, 31848, 31023, 29944, 28620, 27063, 25285, 23300, 21125, 18777, 16276, 13642, 10897, 8062, 5162, 2220, -741, -3696, -6620, -9490, -12283, -14975, -17545, -19972, -22236, -24318, -26202, -27871, -29313, -30515, -31469, -32165, -32598, -32765, -32665, -32298, -31667, -30777, -29636, -28253, -26640, -24808, -22774, -20554, -18166, -15630, -12966, -10196, -7343, -4430, -1481, 1480, 4429, 7342, 10195, 12965, 15629, 18165, 20553, 22773, 24807, 26639, 28252, 29635, 30776, 31666, 32297, 32664, 32764, 32597, 32164, 31468, 30514, 29312, 27870, 26201, 24317, 22235, 19971, 17544, 14974, 12282, 9489, 6619, 3695, 740, -2221, -5163, -8063, -10898, -13643, -16277, -18778, -21126, -23301, -25286, -27064, -28621, -29945, -31024, -31849, -32415, -32715, -32749, -32515, -32015, -31254, -30238, -28974, -27474, -25750, -23816, -21686, -19380, -16916, -14313, -11593, -8779, -5893, -2959}, -{0, 1480, 2958, 4429, 5892, 7342, 8778, 10195, 11592, 12965, 14312, 15629, 16915, 18165, 19379, 20553, 21685, 22773, 23815, 24807, 25749, 26639, 27473, 28252, 28973, 29635, 30237, 30776, 31253, 31666, 32014, 32297, 32514, 32664, 32748, 32764, 32714, 32597, 32414, 32164, 31848, 31468, 31023, 30514, 29944, 29312, 28620, 27870, 27063, 26201, 25285, 24317, 23300, 22235, 21125, 19971, 18777, 17544, 16276, 14974, 13642, 12282, 10897, 9489, 8062, 6619, 5162, 3695, 2220, 740, -741, -2221, -3696, -5163, -6620, -8063, -9490, -10898, -12283, -13643, -14975, -16277, -17545, -18778, -19972, -21126, -22236, -23301, -24318, -25286, -26202, -27064, -27871, -28621, -29313, -29945, -30515, -31024, -31469, -31849, -32165, -32415, -32598, -32715, -32765, -32749, -32665, -32515, -32298, -32015, -31667, -31254, -30777, -30238, -29636, -28974, -28253, -27474, -26640, -25750, -24808, -23816, -22774, -21686, -20554, -19380, -18166, -16916, -15630, -14313, -12966, -11593, -10196, -8779, -7343, -5893, -4430, -2959, -1481} -}; \ No newline at end of file diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach_common.c b/openair1/PHY/NR_TRANSPORT/nr_prach_common.c index 8cc5951b19..a95c519d43 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach_common.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach_common.c @@ -127,8 +127,6 @@ void compute_nr_prach_seq(uint8_t short_sequence, LOG_D( PHY, "compute_prach_seq: done init prach_tables\n" ); - int16_t *x_u_time = calloc(1, sizeof(int32_t)*N_ZC); - for (i=0; i>1); - x_u_time[k<<1] = (int16_t)nr_ru[nr_ru_index<<1]; - x_u_time[1+(k<<1)] = (int16_t)nr_ru[1+(nr_ru_index<<1)]; + // multiply by inverse of 2 (required since ru is exp[j 2\pi n]) + X_u[i][k] = ((uint32_t*)nr_ru)[(((k*(1+(inv_u*k)))%N_ZC)*nr_ZC_inv[2])%N_ZC]; } - - int16_t *x_u_freq = (int16_t*)X_u[i]; - bzero(x_u_freq,sizeof(int32_t)*N_ZC); - for (int line=0; line>19); - x_u_freq[1+(line<<1)] = x_u_freq[1+(line<<1)] + (im>>19); - } - } - -#ifdef PRACH_DEBUG - for (k=0; k>16)); - } -#endif } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_COMPUTE_PRACH, VCD_FUNCTION_OUT); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 1d8f3a9caf..1a330da02c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -523,9 +523,9 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, } else { LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received\n"); - LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n"); + LOG_I(NR_MAC,"[RAPROC] Received Msg3:\n"); for (int k = 0; k < sdu_lenP; k++) { - LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); + LOG_I(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); } // UE Contention Resolution Identity From 1ee7d7e5514e363a9b7edd7e45b8e980a1b13c6e Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 18 Mar 2021 17:39:01 +0000 Subject: [PATCH 069/125] Remove some hard code values --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 2 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 26 ++++++++++++++++--- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 1 + .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 4 +-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 1d971a8831..0c1fde07a2 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -681,7 +681,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, preamble_shift -= NCS; if (preamble_shift < 0) - preamble_shift+=N_ZC; + preamble_shift+=((N_ZC/NCS)*NCS); } } else { // This is the high-speed case new_dft = 0; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 0b96a287b7..2bf5ab437f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -837,6 +837,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int rbSize = 8; if (nr_mac->sched_ctrlCommon == NULL){ + LOG_D(NR_MAC,"generate_Msg2: Filling nr_mac->sched_ctrlCommon\n"); nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); nr_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->search_space)); nr_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->coreset)); @@ -890,6 +891,12 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); AssertFatal(startSymbolIndex >= 0, "StartSymbolIndex is negative\n"); + if (nrOfSymbols == 2) { + nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData = 1; + } else { + nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData = 2; + } + // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially // important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them const int bwpid = bwp->bwp_Id; @@ -939,6 +946,10 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra mcsTableIdx = 2; } + AssertFatal(nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData == 1 || nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData == 2, + "nr_mac->schedCtrlCommon->numDmrsCdmGrpsNoData %d is not possible", + nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData); + pdsch_pdu_rel15->pduBitmap = 0; pdsch_pdu_rel15->rnti = ra->RA_rnti; pdsch_pdu_rel15->pduIndex = pduindex; @@ -959,7 +970,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; pdsch_pdu_rel15->SCID = 0; - pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2; + pdsch_pdu_rel15->numDmrsCdmGrpsNoData = nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData; pdsch_pdu_rel15->dmrsPorts = 1; pdsch_pdu_rel15->resourceAlloc = 1; pdsch_pdu_rel15->rbStart = rbStart; @@ -1108,12 +1119,15 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // Bytes to be transmitted uint8_t *buf = (uint8_t *) harq->tb; uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id); + LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length); uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]); ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0; ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0; ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; - ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length * 8; - mac_pdu_length = mac_pdu_length + mac_sdu_length + 2; + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length; + mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT); + + LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + 2 bytes), mac_pdu_length %d\n",mac_sdu_length,mac_pdu_length); // Calculate number of symbols int startSymbolIndex, nrOfSymbols; @@ -1130,6 +1144,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra long dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; uint8_t N_PRB_DMRS = 0; + + AssertFatal(nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData == 1 || nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData == 2, + "nr_mac->schedCtrlCommon->numDmrsCdmGrpsNoData %d is not possible", + nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData); + if (dmrsConfigType==NFAPI_NR_DMRS_TYPE1) { N_PRB_DMRS = nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 6; } @@ -1153,6 +1172,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra uint16_t *vrb_map = cc[CC_id].vrb_map; do { rbSize++; + LOG_D(NR_MAC,"Calling nr_compute_tbs with N_PRB_DMRS %d, N_DMRS_SLOT %d\n",N_PRB_DMRS,N_DMRS_SLOT); harq->tb_size = nr_compute_tbs(nr_get_Qm_dl(mcsIndex, mcsTableIdx), nr_get_code_rate_dl(mcsIndex, mcsTableIdx), rbSize, nrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT, 0, tb_scaling,1) >> 3; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index a60685c586..1b2f60625b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -243,6 +243,7 @@ void schedule_control_sib1(module_id_t module_id, uint16_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map; if (gNB_mac->sched_ctrlCommon == NULL){ + LOG_D(NR_MAC,"schedule_control_common: Filling nr_mac->sched_ctrlCommon\n"); gNB_mac->sched_ctrlCommon = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon)); gNB_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->search_space)); gNB_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->coreset)); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 1a330da02c..db7735af7f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -522,8 +522,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, } else { - LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received\n"); - LOG_I(NR_MAC,"[RAPROC] Received Msg3:\n"); + LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received (sdu_lenP %d)\n",sdu_lenP); + LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n"); for (int k = 0; k < sdu_lenP; k++) { LOG_I(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); } From b067406097781d543f260e42479d5d317532bdd7 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Thu, 18 Mar 2021 18:49:16 +0000 Subject: [PATCH 070/125] Fix msg1-FrequencyStart in config files for SA --- .../GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf | 2 +- .../GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index dd18cf624e..0bd9861ad9 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -104,7 +104,7 @@ gNBs = #prach_msg1_FDM #0 = one, 1=two, 2=four, 3=eight prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 0; + prach_msg1_FrequencyStart = 27; zeroCorrelationZoneConfig = 13; preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 001e5b917a..9a666d4c6b 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -104,7 +104,7 @@ gNBs = #prach_msg1_FDM #0 = one, 1=two, 2=four, 3=eight prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 0; + prach_msg1_FrequencyStart = 27; zeroCorrelationZoneConfig = 13; preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) From fcda7b97fe3d09eaa3332bb18cf40f323505eb17 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Fri, 19 Mar 2021 12:21:04 +0100 Subject: [PATCH 071/125] add sanitize option, merge develop --- cmake_targets/CMakeLists.txt | 55 ++++++++++--------- cmake_targets/build_oai | 4 ++ .../CODING/nrLDPC_decoder/nrLDPC_decoder.c | 2 +- openair1/PHY/TOOLS/nr_phy_scope.c | 2 +- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c16170f932..dd3d84beb7 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -335,12 +335,17 @@ endif () add_definitions("-DASN_DISABLE_OER_SUPPORT") +if (build_sanitize) + set(linkasan -lasan) + set(gccasan --sanitize=address) +endif() + ######################### -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR} ${linkasan}") ######################### # set a flag for changes in the source code # these changes are related to hardcoded path to include .h files -set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -O0 -DMALLOC_CHECK_=3") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} ${gccasan} -g3 -O0 -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3 -O2 -fno-delete-null-pointer-checks") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3") @@ -2905,7 +2910,7 @@ target_link_libraries (lte-softmodem RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} - -Wl,--end-group z dl) + -Wl,--end-group z dl ${linkasan}) target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) target_link_libraries (lte-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES}) @@ -2946,7 +2951,7 @@ target_link_libraries (ocp-enb RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} - -Wl,--end-group z dl) + -Wl,--end-group z dl ${linkasan}) target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB}) add_executable(cu_test @@ -3016,7 +3021,7 @@ target_link_libraries (lte-uesoftmodem GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES} - -Wl,--end-group z dl) + -Wl,--end-group z dl ${linkasan}) target_link_libraries (lte-uesoftmodem ${LIBXML2_LIBRARIES}) target_link_libraries (lte-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) @@ -3059,7 +3064,7 @@ target_link_libraries (nr-softmodem ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB} - -Wl,--end-group z dl) + -Wl,--end-group z dl ${linkasan}) target_link_libraries (nr-softmodem ${LIBXML2_LIBRARIES}) target_link_libraries (nr-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) @@ -3099,7 +3104,7 @@ target_link_libraries (ocp-gnb ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON - -Wl,--end-group z dl) + -Wl,--end-group z dl ${linkasan}) target_link_libraries (ocp-gnb ${LIBXML2_LIBRARIES} ) target_link_libraries (ocp-gnb pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) @@ -3145,7 +3150,7 @@ target_link_libraries (nr-uesoftmodem ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} NFAPI_USER_LIB S1AP_LIB S1AP_ENB ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB - -Wl,--end-group z dl) + -Wl,--end-group z dl ${linkasan}) target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES}) target_link_libraries (nr-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) @@ -3171,7 +3176,7 @@ add_executable(dlsim_tm4 ) target_link_libraries (dlsim_tm4 -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group - pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB} + pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB} ${linkasan} ) add_executable(polartest @@ -3184,7 +3189,7 @@ add_executable(polartest ) target_link_libraries(polartest -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR PHY_NR_COMMON PHY_NR_UE CONFIG_LIB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} dl + m pthread ${ATLAS_LIBRARIES} dl ${linkasan} ) add_executable(smallblocktest @@ -3199,7 +3204,7 @@ add_executable(smallblocktest target_link_libraries(smallblocktest -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} dl + m pthread ${ATLAS_LIBRARIES} dl ${linkasan} ) @@ -3228,7 +3233,7 @@ if (CUDA_FOUND) -Wl,--start-group LDPC_CU UTIL SIMU PHY_NR CONFIG_LIB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} dl + m pthread ${ATLAS_LIBRARIES} dl ${linkasan} ) else (CUDA_FOUND) @@ -3254,7 +3259,7 @@ add_dependencies( ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc ) target_link_libraries(ldpctest -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} dl + m pthread ${ATLAS_LIBRARIES} dl ${linkasan} ) add_executable(nr_dlschsim @@ -3269,7 +3274,7 @@ add_executable(nr_dlschsim ) target_link_libraries(nr_dlschsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} ) add_executable(nr_pbchsim @@ -3284,7 +3289,7 @@ add_executable(nr_pbchsim ) target_link_libraries(nr_pbchsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} ) #PUCCH ---> Prashanth @@ -3301,7 +3306,7 @@ add_executable(nr_pucchsim ) target_link_libraries(nr_pucchsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} ) add_executable(nr_dlsim @@ -3320,7 +3325,7 @@ add_executable(nr_dlsim ) target_link_libraries(nr_dlsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} ) target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR) @@ -3339,7 +3344,7 @@ add_executable(nr_prachsim ${SHLIB_LOADER_SOURCES}) target_link_libraries(nr_prachsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl) + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan}) add_executable(nr_ulschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c @@ -3353,7 +3358,7 @@ add_executable(nr_ulschsim ) target_link_libraries(nr_ulschsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} ) add_executable(nr_ulsim @@ -3372,7 +3377,7 @@ add_executable(nr_ulsim ) target_link_libraries(nr_ulsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} ) target_compile_definitions(nr_ulsim PUBLIC -DPHYSICAL_SIMULATOR) @@ -3392,7 +3397,7 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr ) target_link_libraries (${myExe} -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU LFDS ${ITTI_LIB} LFDS7 -Wl,--end-group - pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl + pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl ${linkasan} ) endforeach(myExe) @@ -3406,7 +3411,7 @@ add_executable(test_epc_generate_scenario ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP 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} ${CONFIG_LIB} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP 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} ${CONFIG_LIB} ${linkasan} ) add_executable(test_epc_play_scenario @@ -3425,7 +3430,7 @@ add_executable(test_epc_play_scenario ) 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 X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ${linkasan} ) @@ -3445,7 +3450,7 @@ foreach(myExe s1ap ${OPENAIR3_DIR}/TEST/test_${myExe}.c ) target_link_libraries (test_${myExe} - -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ${linkasan} ) endforeach(myExe) @@ -3583,7 +3588,7 @@ target_link_libraries (nr-ittisim NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB} PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE - -Wl,--end-group z dl) + -Wl,--end-group z dl ${linkasan}) target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES}) target_link_libraries (nr-ittisim pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 960b241047..c0317451c2 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -416,6 +416,10 @@ function main() { CMAKE_CMD="$CMAKE_CMD -GNinja" MAKE_CMD=ninja shift;; + --sanitize) + CMAKE_CMD="$CMAKE_CMD -Dbuild_sanitize=1" + MAKE_CMD=ninja + shift;; --ittiSIM) ittiSIM=1 ITTI_SIM="True" diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c index 785b588b9f..3226c97f87 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c @@ -39,7 +39,7 @@ #include "nrLDPC_bnProc.h" #define NR_LDPC_ENABLE_PARITY_CHECK -#define NR_LDPC_PROFILER_DETAIL +//#define NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_DEBUG_MODE #include "nrLDPC_tools/nrLDPC_debug.h" diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index b45c1abf0b..7c21ee7477 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -278,7 +278,7 @@ static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const in graph->initDone=true; } - fl_set_object_label_f(graph->text, "%s, avg I/Q pow: %4.1f", label, sqrt(avg)); + fl_set_object_label_f(graph->text, "%s, avg I/Q pow: %4.1f", label, 0/*sqrt(avg)*/); graph->iteration++; } From 3bd3f452c2841414398008ef1d087657e2ea6b6d Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 21 Mar 2021 23:48:46 +0100 Subject: [PATCH 072/125] :( remove sanitize=address option, fix some cppchecks --- cmake_targets/CMakeLists.txt | 55 +++++++++---------- cmake_targets/build_oai | 4 -- common/utils/LOG/log.c | 2 +- common/utils/ocp_itti/intertask_interface.cpp | 4 +- openair1/PHY/TOOLS/nr_phy_scope.c | 2 +- openair1/SIMULATION/TOOLS/random_channel.c | 45 ++++++--------- 6 files changed, 47 insertions(+), 65 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index dd3d84beb7..c16170f932 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -335,17 +335,12 @@ endif () add_definitions("-DASN_DISABLE_OER_SUPPORT") -if (build_sanitize) - set(linkasan -lasan) - set(gccasan --sanitize=address) -endif() - ######################### -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR} ${linkasan}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}") ######################### # set a flag for changes in the source code # these changes are related to hardcoded path to include .h files -set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} ${gccasan} -g3 -O0 -DMALLOC_CHECK_=3") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -O0 -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3 -O2 -fno-delete-null-pointer-checks") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3") @@ -2910,7 +2905,7 @@ target_link_libraries (lte-softmodem RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} - -Wl,--end-group z dl ${linkasan}) + -Wl,--end-group z dl) target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) target_link_libraries (lte-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES}) @@ -2951,7 +2946,7 @@ target_link_libraries (ocp-enb RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} - -Wl,--end-group z dl ${linkasan}) + -Wl,--end-group z dl) target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB}) add_executable(cu_test @@ -3021,7 +3016,7 @@ target_link_libraries (lte-uesoftmodem GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES} - -Wl,--end-group z dl ${linkasan}) + -Wl,--end-group z dl) target_link_libraries (lte-uesoftmodem ${LIBXML2_LIBRARIES}) target_link_libraries (lte-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) @@ -3064,7 +3059,7 @@ target_link_libraries (nr-softmodem ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB} - -Wl,--end-group z dl ${linkasan}) + -Wl,--end-group z dl) target_link_libraries (nr-softmodem ${LIBXML2_LIBRARIES}) target_link_libraries (nr-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) @@ -3104,7 +3099,7 @@ target_link_libraries (ocp-gnb ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON - -Wl,--end-group z dl ${linkasan}) + -Wl,--end-group z dl) target_link_libraries (ocp-gnb ${LIBXML2_LIBRARIES} ) target_link_libraries (ocp-gnb pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) @@ -3150,7 +3145,7 @@ target_link_libraries (nr-uesoftmodem ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} NFAPI_USER_LIB S1AP_LIB S1AP_ENB ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB - -Wl,--end-group z dl ${linkasan}) + -Wl,--end-group z dl) target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES}) target_link_libraries (nr-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) @@ -3176,7 +3171,7 @@ add_executable(dlsim_tm4 ) target_link_libraries (dlsim_tm4 -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group - pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB} ${linkasan} + pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB} ) add_executable(polartest @@ -3189,7 +3184,7 @@ add_executable(polartest ) target_link_libraries(polartest -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR PHY_NR_COMMON PHY_NR_UE CONFIG_LIB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} dl ) add_executable(smallblocktest @@ -3204,7 +3199,7 @@ add_executable(smallblocktest target_link_libraries(smallblocktest -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} dl ) @@ -3233,7 +3228,7 @@ if (CUDA_FOUND) -Wl,--start-group LDPC_CU UTIL SIMU PHY_NR CONFIG_LIB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} dl ) else (CUDA_FOUND) @@ -3259,7 +3254,7 @@ add_dependencies( ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc ) target_link_libraries(ldpctest -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} dl ) add_executable(nr_dlschsim @@ -3274,7 +3269,7 @@ add_executable(nr_dlschsim ) target_link_libraries(nr_dlschsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ) add_executable(nr_pbchsim @@ -3289,7 +3284,7 @@ add_executable(nr_pbchsim ) target_link_libraries(nr_pbchsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ) #PUCCH ---> Prashanth @@ -3306,7 +3301,7 @@ add_executable(nr_pucchsim ) target_link_libraries(nr_pucchsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ) add_executable(nr_dlsim @@ -3325,7 +3320,7 @@ add_executable(nr_dlsim ) target_link_libraries(nr_dlsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ) target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR) @@ -3344,7 +3339,7 @@ add_executable(nr_prachsim ${SHLIB_LOADER_SOURCES}) target_link_libraries(nr_prachsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan}) + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl) add_executable(nr_ulschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c @@ -3358,7 +3353,7 @@ add_executable(nr_ulschsim ) target_link_libraries(nr_ulschsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ) add_executable(nr_ulsim @@ -3377,7 +3372,7 @@ add_executable(nr_ulsim ) target_link_libraries(nr_ulsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group - m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ${linkasan} + m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl ) target_compile_definitions(nr_ulsim PUBLIC -DPHYSICAL_SIMULATOR) @@ -3397,7 +3392,7 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr ) target_link_libraries (${myExe} -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU LFDS ${ITTI_LIB} LFDS7 -Wl,--end-group - pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl ${linkasan} + pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl ) endforeach(myExe) @@ -3411,7 +3406,7 @@ add_executable(test_epc_generate_scenario ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP 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} ${CONFIG_LIB} ${linkasan} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP 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} ${CONFIG_LIB} ) add_executable(test_epc_play_scenario @@ -3430,7 +3425,7 @@ add_executable(test_epc_play_scenario ) 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 X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ${linkasan} + -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ) @@ -3450,7 +3445,7 @@ foreach(myExe s1ap ${OPENAIR3_DIR}/TEST/test_${myExe}.c ) target_link_libraries (test_${myExe} - -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ${linkasan} + -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ) endforeach(myExe) @@ -3588,7 +3583,7 @@ target_link_libraries (nr-ittisim NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB} PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE - -Wl,--end-group z dl ${linkasan}) + -Wl,--end-group z dl) target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES}) target_link_libraries (nr-ittisim pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index e0075300eb..dbcadba103 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -421,10 +421,6 @@ function main() { CMAKE_CMD="$CMAKE_CMD -GNinja" MAKE_CMD=ninja shift;; - --sanitize) - CMAKE_CMD="$CMAKE_CMD -Dbuild_sanitize=1" - MAKE_CMD=ninja - shift;; --ittiSIM) ittiSIM=1 ITTI_SIM="True" diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c index 4e6ec9d3db..8029ba826b 100644 --- a/common/utils/LOG/log.c +++ b/common/utils/LOG/log.c @@ -243,7 +243,7 @@ int write_file_matlab(const char *fname, fprintf(fp,"%d \n",((unsigned char *)&data)[0]); break; default: - AssertFatal(false, "unknown dump format: %d\n", format); + AssertFatal(false, "unknown dump format: %u\n", format); } if ((format != 10 && format !=11 && format !=12 && format != 13 && format != 15) || multiVec) { diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp index 2189be9fe8..70cb53ccce 100644 --- a/common/utils/ocp_itti/intertask_interface.cpp +++ b/common/utils/ocp_itti/intertask_interface.cpp @@ -339,7 +339,9 @@ extern "C" { int itti_create_queue(const task_info_t *taskInfo) { pthread_mutex_lock (&lock_nb_queues); int newQueue=nb_queues++; - AssertFatal(tasks=(task_list_t **) realloc(tasks, nb_queues * sizeof(*tasks)),""); + task_list_t **tmp=(task_list_t **) realloc(tasks, nb_queues * sizeof(*tasks)); + AssertFatal(tmp!=NULL,""); + tasks=tmp; tasks[newQueue]= new task_list_t; pthread_mutex_unlock (&lock_nb_queues); LOG_I(TMR,"Starting itti queue: %s as task %d\n", taskInfo->name, newQueue); diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index 7c21ee7477..b3132101dc 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -242,7 +242,7 @@ static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const in for (int pix=0; pixw; pix++) { scopeSample_t *end=values+(pix+1)*samplesPerPixel; end-=2; - AssertFatal(end <= values+datasize,"diff : %ld", end-values+datasize); + AssertFatal(end <= values+datasize,"diff : %lu", end-values+datasize); double val=0; for (scopeSample_t *s=values+(pix)*samplesPerPixel; diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index dfe1d6a13d..9171b6c067 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -62,7 +62,7 @@ static double snr_dB=25; static double sinr_dB=0; static unsigned int max_chan; static channel_desc_t **defined_channels; -static char modellist_name[MAX_OPTNAME_SIZE]=""; +static char modellist_name[MAX_OPTNAME_SIZE]={0}; void fill_channel_desc(channel_desc_t *chan_desc, @@ -227,7 +227,6 @@ double tdl_a_amps_dB[] = {-13.4, -16.6, -19.9, -29.7}; -#define TDL_A_PATHS 23 double tdl_b_delays[] = {0.0000, 0.1072, @@ -276,7 +275,6 @@ double tdl_b_amps_dB[] = {0, -14.9, -9.2, -11.3}; -#define TDL_B_PATHS 23 double tdl_c_delays[] = {0, 0.2099, @@ -327,7 +325,6 @@ double tdl_c_amps_dB[] = {-4.4, -15.7, -21.6, -22.8}; -#define TDL_C_PATHS 24 double tdl_d_delays[] = {//0, 0, @@ -360,7 +357,6 @@ double tdl_d_amps_dB[] = {//-0.2, -30.0, -27.7}; -#define TDL_D_PATHS 13 #define TDL_D_RICEAN_FACTOR .046774 double tdl_e_delays[] = {0, @@ -395,7 +391,6 @@ double tdl_e_amps_dB[] = {//-0.03, -29.8, -29.2}; -#define TDL_E_PATHS 14 #define TDL_E_RICEAN_FACTOR 0.0063096 double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41}; @@ -540,7 +535,6 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model); int tdl_paths=0; - double tdl_ricean_factor = 1; double *tdl_amps_dB; double *tdl_delays; @@ -676,36 +670,32 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, break; /* tapped delay line (TDL) channel model from TR 38.901 Section 7.7.2 */ +#define tdl_m(MoDel)\ + DevAssert(sizeof(tdl_ ## MoDel ## _amps_dB) == sizeof(tdl_ ## MoDel ## _delays)); \ + tdl_paths=sizeof(tdl_ ## MoDel ## _amps_dB)/sizeof(*tdl_ ## MoDel ## _amps_dB);\ + tdl_delays=tdl_ ## MoDel ## _delays;\ + tdl_amps_dB=tdl_ ## MoDel ## _amps_dB + case TDL_A: case TDL_B: case TDL_C: case TDL_D: case TDL_E: + chan_desc->ricean_factor = 1; if (channel_model == TDL_A) { - tdl_paths=TDL_A_PATHS; - tdl_delays=tdl_a_delays; - tdl_amps_dB=tdl_a_amps_dB; + tdl_m(a); }else if (channel_model == TDL_B) { - tdl_paths=TDL_B_PATHS; - tdl_delays=tdl_b_delays; - tdl_amps_dB=tdl_b_amps_dB; + tdl_m(b); } else if (channel_model == TDL_C) { - tdl_paths=TDL_C_PATHS; - tdl_delays=tdl_c_delays; - tdl_amps_dB=tdl_c_amps_dB; - printf("Initializing TDL_C channel with %d paths\n",TDL_C_PATHS); + tdl_m(c); } else if (channel_model == TDL_D) { - tdl_paths=TDL_D_PATHS; - tdl_delays=tdl_d_delays; - tdl_amps_dB=tdl_d_amps_dB; - tdl_ricean_factor = TDL_D_RICEAN_FACTOR; + tdl_m(d); + chan_desc->ricean_factor = TDL_D_RICEAN_FACTOR; } else if (channel_model == TDL_E) { - tdl_paths=TDL_E_PATHS-1; - tdl_delays=tdl_e_delays+1; - tdl_amps_dB=tdl_e_amps_dB; - tdl_ricean_factor = TDL_E_RICEAN_FACTOR; - } + tdl_m(e); + chan_desc->ricean_factor = TDL_E_RICEAN_FACTOR; + } int tdl_pathsby3 = tdl_paths/3; if ((tdl_paths%3)>0) tdl_pathsby3++; @@ -728,7 +718,6 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, tdl_delays[i] *= DS_TDL; } chan_desc->delays = tdl_delays; - chan_desc->ricean_factor = tdl_ricean_factor; chan_desc->aoa = 0; chan_desc->random_aoa = 0; chan_desc->ch = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *)); @@ -2034,7 +2023,7 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double paramdef_t achannel_params[] = CHANNELMOD_MODEL_PARAMS_DESC; paramlist_def_t channel_list; memset(&channel_list,0,sizeof(paramlist_def_t)); - strncpy(channel_list.listname,modellist_name,MAX_OPTNAME_SIZE-1); + memcpy(channel_list.listname,modellist_name,sizeof(channel_list.listname)-1); int numparams = sizeof(achannel_params)/sizeof(paramdef_t); config_getlist( &channel_list,achannel_params,numparams, CHANNELMOD_SECTION); From 230af8db6ff8fac1d9a89224e743c08302f07a55 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Mon, 22 Mar 2021 07:59:24 +0100 Subject: [PATCH 073/125] fix a old issue about T_IDs.h that killed my CI run --- cmake_targets/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c16170f932..8ac0dce1ef 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2805,6 +2805,7 @@ include_directories("${OPENAIR_DIR}/common/utils/T") if (${T_TRACER}) set(T_SOURCE + ${OPENAIR_DIR}/common/utils/T/T_IDs.h ${OPENAIR_DIR}/common/utils/T/T.c ${OPENAIR_DIR}/common/utils/T/local_tracer.c) set(T_LIB "rt") From e82915c4b1c4b198821394544ce95d53f4df5b71 Mon Sep 17 00:00:00 2001 From: Luis Pereira Date: Mon, 22 Mar 2021 15:28:15 +0100 Subject: [PATCH 074/125] Revert "Fix msg1-FrequencyStart in config files for SA" This reverts commit b067406097781d543f260e42479d5d317532bdd7 --- .../GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf | 2 +- .../GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index 0bd9861ad9..dd18cf624e 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -104,7 +104,7 @@ gNBs = #prach_msg1_FDM #0 = one, 1=two, 2=four, 3=eight prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 27; + prach_msg1_FrequencyStart = 0; zeroCorrelationZoneConfig = 13; preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 9a666d4c6b..001e5b917a 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -104,7 +104,7 @@ gNBs = #prach_msg1_FDM #0 = one, 1=two, 2=four, 3=eight prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 27; + prach_msg1_FrequencyStart = 0; zeroCorrelationZoneConfig = 13; preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) From b6513faa82b36f70b11e316d65ad3c1ec115ba13 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 22 Mar 2021 20:07:14 +0000 Subject: [PATCH 075/125] Fix PRACH msg1-FrequencyStart/k1 --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 42 +++++++++++-------------- openair1/PHY/NR_UE_TRANSPORT/nr_prach.c | 31 +++++++++--------- openair2/LAYER2/NR_MAC_UE/config_ue.c | 8 +++-- openair2/LAYER2/NR_MAC_gNB/config.c | 7 +++-- 4 files changed, 43 insertions(+), 45 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index bc9ca0db5e..9577860ab8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -171,9 +171,6 @@ void rx_nr_prach_ru(RU_t *ru, int16_t *prach[ru->nb_rx]; int prach_sequence_length = ru->config.prach_config.prach_sequence_length.value; - - int msg1_frequencystart = ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value; - int sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1)); //to be checked for mu=0; @@ -195,8 +192,7 @@ void rx_nr_prach_ru(RU_t *ru, int16_t *prach2; if (prach_sequence_length == 0) { - LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %d, msg1_frequencyStart %d\n", - ru->idx,frame,slot2,prachFormat,msg1_frequencystart); + LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %d\n", ru->idx,frame,slot2,prachFormat); AssertFatal(prachFormat<4,"Illegal prach format %d for length 839\n",prachFormat); switch (prachFormat) { case 0: @@ -218,8 +214,8 @@ void rx_nr_prach_ru(RU_t *ru, } } else { - LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %s, msg1_frequencyStart %d,startSymbol %d\n", - ru->idx,frame,slot,prachfmt[prachFormat],msg1_frequencystart,prachStartSymbol); + LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %s,startSymbol %d\n", + ru->idx,frame,slot,prachfmt[prachFormat],prachStartSymbol); switch (prachFormat) { case 4: //A1 @@ -284,15 +280,15 @@ void rx_nr_prach_ru(RU_t *ru, K=1; kbar=2; } - int n_ra_prb = msg1_frequencystart; - int k = (12*n_ra_prb) - 6*fp->N_RB_UL; + + int k1 = (int16_t)ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value; int N_ZC = (prach_sequence_length==0)?839:139; - if (k<0) k+=(fp->ofdm_symbol_size); - - k*=K; - k+=kbar; + if (k1<0) k1+=(fp->ofdm_symbol_size); + + k1*=K; + k1+=kbar; int reps=1; @@ -653,7 +649,7 @@ void rx_nr_prach_ru(RU_t *ru, int16_t rxsigF_tmp[N_ZC<<1]; // if (k+N_ZC > dftlen) { // PRACH signal is split around DC int16_t *rxsigF2=rxsigF[aa]; - int k2=k<<1; + int k2=k1<<1; for (int j=0;jnum_prach_fd_occasions_list[prach_pdu->num_ra].num_root_sequences.value; NCS = prach_pdu->num_cs;//cfg->num_prach_fd_occasions_list[0].prach_zero_corr_conf.value; int prach_sequence_length = cfg->prach_sequence_length.value; - int msg1_frequencystart = cfg->num_prach_fd_occasions_list[prach_pdu->num_ra].k1.value; // int num_unused_root_sequences = cfg->num_prach_fd_occasions_list[0].num_unused_root_sequences.value; // cfg->num_prach_fd_occasions_list[0].unused_root_sequences_list @@ -734,7 +728,8 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, prach_ifft = gNB->prach_vars.prach_ifft; prachF = gNB->prach_vars.prachF; if (LOG_DEBUGFLAG(PRACH)){ - if ((frame&1023) < 20) LOG_D(PHY,"PRACH (gNB) : running rx_prach for subframe %d, msg1_frequencystart %d, rootSequenceIndex %d\n", subframe,msg1_frequencystart,rootSequenceIndex); + if ((frame&1023) < 20) LOG_D(PHY,"PRACH (gNB) : running rx_prach for subframe %d, rootSequenceIndex %d\n", + subframe, rootSequenceIndex); } start_meas(&gNB->rx_prach); @@ -936,14 +931,13 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, if (LOG_DUMPFLAG(PRACH)) { //int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); // if (en>60) { - int k = (12*n_ra_prb) - 6*fp->N_RB_UL; + int k1 = (int16_t)cfg->num_prach_fd_occasions_list[prach_pdu->num_ra].k1.value; - if (k<0) k+=fp->ofdm_symbol_size; - - k*=12; - k+=13; - k*=2; + if (k1<0) k1+=fp->ofdm_symbol_size; + k1*=12; + k1+=13; + k1*=2; LOG_M("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1); LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c index 0ba02c6bac..8c41b23c89 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c @@ -71,7 +71,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu; int32_t Xu_re, Xu_im; - int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, n_ra_prb, k, prachStartSymbol, sample_offset_slot; + int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, k1, prachStartSymbol, sample_offset_slot; //int restricted_Type; prach = prach_tmp; @@ -83,7 +83,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ mu = nrUE_config->prach_config.prach_sub_c_spacing; restricted_set = prach_pdu->restricted_set; rootSequenceIndex = prach_pdu->root_seq_id; - n_ra_prb = prach_pdu->freq_msg1; NCS = prach_pdu->num_cs; prach_fmt_id = prach_pdu->prach_format; preamble_index = prach_resources->ra_PreambleIndex; @@ -93,7 +92,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ first_nonzero_root_idx = 0; kbar = 1; K = 24; - k = 12*n_ra_prb - 6*fp->N_RB_UL; + k1 = (int16_t)prach_pdu->freq_msg1; prachStartSymbol = prach_pdu->prach_start_symbol; //restricted_Type = 0; @@ -185,7 +184,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ // now generate PRACH signal #ifdef NR_PRACH_DEBUG if (NCS>0) - LOG_I(PHY, "PRACH [UE %d] generate PRACH in slot %d for RootSeqIndex %d, Preamble Index %d, PRACH Format %s, NCS %d (N_ZC %d): Preamble_offset %d, Preamble_shift %d msg1 frequency start %d\n", + LOG_I(PHY, "PRACH [UE %d] generate PRACH in slot %d for RootSeqIndex %d, Preamble Index %d, PRACH Format %s, NCS %d (N_ZC %d): Preamble_offset %d, Preamble_shift %dn", Mod_id, slot, rootSequenceIndex, @@ -194,8 +193,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ NCS, N_ZC, preamble_offset, - preamble_shift, - n_ra_prb); + preamble_shift); #endif // nsymb = (frame_parms->Ncp==0) ? 14:12; @@ -209,17 +207,16 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ kbar = 2; } - if (k<0) - k += fp->ofdm_symbol_size; + if (k1<0) + k1 += fp->ofdm_symbol_size; - k *= K; - k += kbar; - k *= 2; + k1 *= K; + k1 += kbar; + k1 *= 2; - LOG_I(PHY, "PRACH [UE %d] in slot %d, placing PRACH in position %d, msg1 frequency start %d, preamble_offset %d, first_nonzero_root_idx %d\n", Mod_id, + LOG_I(PHY, "PRACH [UE %d] in slot %d, placing PRACH in position %d, preamble_offset %d, first_nonzero_root_idx %d\n", Mod_id, slot, - k, - n_ra_prb, + k1, preamble_offset, first_nonzero_root_idx); @@ -344,10 +341,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ Xu_re = (((int32_t)Xu[offset<<1]*amp)>>15); Xu_im = (((int32_t)Xu[1+(offset<<1)]*amp)>>15); - prachF[k++]= ((Xu_re*nr_ru[offset2<<1]) - (Xu_im*nr_ru[1+(offset2<<1)]))>>15; - prachF[k++]= ((Xu_im*nr_ru[offset2<<1]) + (Xu_re*nr_ru[1+(offset2<<1)]))>>15; + prachF[k1++]= ((Xu_re*nr_ru[offset2<<1]) - (Xu_im*nr_ru[1+(offset2<<1)]))>>15; + prachF[k1++]= ((Xu_im*nr_ru[offset2<<1]) + (Xu_re*nr_ru[1+(offset2<<1)]))>>15; - if (k==dftlen) k=0; + if (k1==dftlen) k1=0; } #if defined (PRACH_WRITE_OUTPUT_DEBUG) diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index c45430bb45..361113b179 100755 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -31,6 +31,7 @@ */ //#include "mac_defs.h" +#include #include "NR_MAC_UE/mac_proto.h" #include "NR_MAC-CellGroupConfig.h" #include "LAYER2/NR_MAC_COMMON/nr_mac_common.h" @@ -309,8 +310,11 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139; else cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; - - cfg->prach_config.num_prach_fd_occasions_list[i].k1 = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart; + cfg->prach_config.num_prach_fd_occasions_list[i].k1 = + (NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i))*12 - + 6*scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup, nb_preambles, mac->frame_type, frequency_range); //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ??? diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 2e661dfb73..d27531427f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -208,8 +208,11 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.tl.tag = NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG; cfg->num_tlv++; - cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); -//k1= msg1_FrequencyStart + 12 (no. of FDM)(RB for PRACH occasion); + cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = + (NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i))*12 - + 6*scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; cfg->prach_config.num_prach_fd_occasions_list[i].k1.tl.tag = NFAPI_NR_CONFIG_K1_TAG; cfg->num_tlv++; cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; From 7c2591f31875fe1b3a9f8a9a8a5c9ecd6e827be5 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Tue, 23 Mar 2021 16:04:01 +0100 Subject: [PATCH 076/125] Revert "Fix PRACH msg1-FrequencyStart/k1" This reverts commit b6513faa82b36f70b11e316d65ad3c1ec115ba13 --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 42 ++++++++++++++----------- openair1/PHY/NR_UE_TRANSPORT/nr_prach.c | 31 +++++++++--------- openair2/LAYER2/NR_MAC_UE/config_ue.c | 8 ++--- openair2/LAYER2/NR_MAC_gNB/config.c | 7 ++--- 4 files changed, 45 insertions(+), 43 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 9577860ab8..bc9ca0db5e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -171,6 +171,9 @@ void rx_nr_prach_ru(RU_t *ru, int16_t *prach[ru->nb_rx]; int prach_sequence_length = ru->config.prach_config.prach_sequence_length.value; + + int msg1_frequencystart = ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value; + int sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1)); //to be checked for mu=0; @@ -192,7 +195,8 @@ void rx_nr_prach_ru(RU_t *ru, int16_t *prach2; if (prach_sequence_length == 0) { - LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %d\n", ru->idx,frame,slot2,prachFormat); + LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %d, msg1_frequencyStart %d\n", + ru->idx,frame,slot2,prachFormat,msg1_frequencystart); AssertFatal(prachFormat<4,"Illegal prach format %d for length 839\n",prachFormat); switch (prachFormat) { case 0: @@ -214,8 +218,8 @@ void rx_nr_prach_ru(RU_t *ru, } } else { - LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %s,startSymbol %d\n", - ru->idx,frame,slot,prachfmt[prachFormat],prachStartSymbol); + LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %s, msg1_frequencyStart %d,startSymbol %d\n", + ru->idx,frame,slot,prachfmt[prachFormat],msg1_frequencystart,prachStartSymbol); switch (prachFormat) { case 4: //A1 @@ -280,15 +284,15 @@ void rx_nr_prach_ru(RU_t *ru, K=1; kbar=2; } - - int k1 = (int16_t)ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value; + int n_ra_prb = msg1_frequencystart; + int k = (12*n_ra_prb) - 6*fp->N_RB_UL; int N_ZC = (prach_sequence_length==0)?839:139; - if (k1<0) k1+=(fp->ofdm_symbol_size); - - k1*=K; - k1+=kbar; + if (k<0) k+=(fp->ofdm_symbol_size); + + k*=K; + k+=kbar; int reps=1; @@ -649,7 +653,7 @@ void rx_nr_prach_ru(RU_t *ru, int16_t rxsigF_tmp[N_ZC<<1]; // if (k+N_ZC > dftlen) { // PRACH signal is split around DC int16_t *rxsigF2=rxsigF[aa]; - int k2=k1<<1; + int k2=k<<1; for (int j=0;jnum_prach_fd_occasions_list[prach_pdu->num_ra].num_root_sequences.value; NCS = prach_pdu->num_cs;//cfg->num_prach_fd_occasions_list[0].prach_zero_corr_conf.value; int prach_sequence_length = cfg->prach_sequence_length.value; + int msg1_frequencystart = cfg->num_prach_fd_occasions_list[prach_pdu->num_ra].k1.value; // int num_unused_root_sequences = cfg->num_prach_fd_occasions_list[0].num_unused_root_sequences.value; // cfg->num_prach_fd_occasions_list[0].unused_root_sequences_list @@ -728,8 +734,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, prach_ifft = gNB->prach_vars.prach_ifft; prachF = gNB->prach_vars.prachF; if (LOG_DEBUGFLAG(PRACH)){ - if ((frame&1023) < 20) LOG_D(PHY,"PRACH (gNB) : running rx_prach for subframe %d, rootSequenceIndex %d\n", - subframe, rootSequenceIndex); + if ((frame&1023) < 20) LOG_D(PHY,"PRACH (gNB) : running rx_prach for subframe %d, msg1_frequencystart %d, rootSequenceIndex %d\n", subframe,msg1_frequencystart,rootSequenceIndex); } start_meas(&gNB->rx_prach); @@ -931,13 +936,14 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, if (LOG_DUMPFLAG(PRACH)) { //int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); // if (en>60) { - int k1 = (int16_t)cfg->num_prach_fd_occasions_list[prach_pdu->num_ra].k1.value; + int k = (12*n_ra_prb) - 6*fp->N_RB_UL; - if (k1<0) k1+=fp->ofdm_symbol_size; + if (k<0) k+=fp->ofdm_symbol_size; + + k*=12; + k+=13; + k*=2; - k1*=12; - k1+=13; - k1*=2; LOG_M("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1); LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c index 8c41b23c89..0ba02c6bac 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c @@ -71,7 +71,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu; int32_t Xu_re, Xu_im; - int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, k1, prachStartSymbol, sample_offset_slot; + int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, n_ra_prb, k, prachStartSymbol, sample_offset_slot; //int restricted_Type; prach = prach_tmp; @@ -83,6 +83,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ mu = nrUE_config->prach_config.prach_sub_c_spacing; restricted_set = prach_pdu->restricted_set; rootSequenceIndex = prach_pdu->root_seq_id; + n_ra_prb = prach_pdu->freq_msg1; NCS = prach_pdu->num_cs; prach_fmt_id = prach_pdu->prach_format; preamble_index = prach_resources->ra_PreambleIndex; @@ -92,7 +93,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ first_nonzero_root_idx = 0; kbar = 1; K = 24; - k1 = (int16_t)prach_pdu->freq_msg1; + k = 12*n_ra_prb - 6*fp->N_RB_UL; prachStartSymbol = prach_pdu->prach_start_symbol; //restricted_Type = 0; @@ -184,7 +185,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ // now generate PRACH signal #ifdef NR_PRACH_DEBUG if (NCS>0) - LOG_I(PHY, "PRACH [UE %d] generate PRACH in slot %d for RootSeqIndex %d, Preamble Index %d, PRACH Format %s, NCS %d (N_ZC %d): Preamble_offset %d, Preamble_shift %dn", + LOG_I(PHY, "PRACH [UE %d] generate PRACH in slot %d for RootSeqIndex %d, Preamble Index %d, PRACH Format %s, NCS %d (N_ZC %d): Preamble_offset %d, Preamble_shift %d msg1 frequency start %d\n", Mod_id, slot, rootSequenceIndex, @@ -193,7 +194,8 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ NCS, N_ZC, preamble_offset, - preamble_shift); + preamble_shift, + n_ra_prb); #endif // nsymb = (frame_parms->Ncp==0) ? 14:12; @@ -207,16 +209,17 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ kbar = 2; } - if (k1<0) - k1 += fp->ofdm_symbol_size; + if (k<0) + k += fp->ofdm_symbol_size; - k1 *= K; - k1 += kbar; - k1 *= 2; + k *= K; + k += kbar; + k *= 2; - LOG_I(PHY, "PRACH [UE %d] in slot %d, placing PRACH in position %d, preamble_offset %d, first_nonzero_root_idx %d\n", Mod_id, + LOG_I(PHY, "PRACH [UE %d] in slot %d, placing PRACH in position %d, msg1 frequency start %d, preamble_offset %d, first_nonzero_root_idx %d\n", Mod_id, slot, - k1, + k, + n_ra_prb, preamble_offset, first_nonzero_root_idx); @@ -341,10 +344,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ Xu_re = (((int32_t)Xu[offset<<1]*amp)>>15); Xu_im = (((int32_t)Xu[1+(offset<<1)]*amp)>>15); - prachF[k1++]= ((Xu_re*nr_ru[offset2<<1]) - (Xu_im*nr_ru[1+(offset2<<1)]))>>15; - prachF[k1++]= ((Xu_im*nr_ru[offset2<<1]) + (Xu_re*nr_ru[1+(offset2<<1)]))>>15; + prachF[k++]= ((Xu_re*nr_ru[offset2<<1]) - (Xu_im*nr_ru[1+(offset2<<1)]))>>15; + prachF[k++]= ((Xu_im*nr_ru[offset2<<1]) + (Xu_re*nr_ru[1+(offset2<<1)]))>>15; - if (k1==dftlen) k1=0; + if (k==dftlen) k=0; } #if defined (PRACH_WRITE_OUTPUT_DEBUG) diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 361113b179..c45430bb45 100755 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -31,7 +31,6 @@ */ //#include "mac_defs.h" -#include #include "NR_MAC_UE/mac_proto.h" #include "NR_MAC-CellGroupConfig.h" #include "LAYER2/NR_MAC_COMMON/nr_mac_common.h" @@ -310,11 +309,8 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139; else cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; - cfg->prach_config.num_prach_fd_occasions_list[i].k1 = - (NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + - scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + - (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i))*12 - - 6*scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + + cfg->prach_config.num_prach_fd_occasions_list[i].k1 = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart; cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup, nb_preambles, mac->frame_type, frequency_range); //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ??? diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index d27531427f..2e661dfb73 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -208,11 +208,8 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.tl.tag = NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG; cfg->num_tlv++; - cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = - (NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + - scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + - (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i))*12 - - 6*scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); +//k1= msg1_FrequencyStart + 12 (no. of FDM)(RB for PRACH occasion); cfg->prach_config.num_prach_fd_occasions_list[i].k1.tl.tag = NFAPI_NR_CONFIG_K1_TAG; cfg->num_tlv++; cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; From 8c13604d619138ca4c3796a8aa6cf184dcd7b800 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 23 Mar 2021 15:22:36 +0000 Subject: [PATCH 077/125] Fix PRACH with k1 = msg1-FrequencyStart + initialUplinkBWPStart --- openair2/LAYER2/NR_MAC_UE/config_ue.c | 3 ++- openair2/LAYER2/NR_MAC_gNB/config.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index c45430bb45..4d4dd45415 100755 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -31,6 +31,7 @@ */ //#include "mac_defs.h" +#include #include "NR_MAC_UE/mac_proto.h" #include "NR_MAC-CellGroupConfig.h" #include "LAYER2/NR_MAC_COMMON/nr_mac_common.h" @@ -310,7 +311,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, else cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; - cfg->prach_config.num_prach_fd_occasions_list[i].k1 = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart; + cfg->prach_config.num_prach_fd_occasions_list[i].k1 = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup, nb_preambles, mac->frame_type, frequency_range); //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ??? diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 2e661dfb73..1524fa71ec 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -208,7 +208,7 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.tl.tag = NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG; cfg->num_tlv++; - cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); //k1= msg1_FrequencyStart + 12 (no. of FDM)(RB for PRACH occasion); cfg->prach_config.num_prach_fd_occasions_list[i].k1.tl.tag = NFAPI_NR_CONFIG_K1_TAG; cfg->num_tlv++; From ee047b88e99c8dccaa438a612f3d21744f8c7fb4 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 23 Mar 2021 17:59:31 +0000 Subject: [PATCH 078/125] Remove TC-RNTI at PHY when RA procedure does not succeeded --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c | 12 +++++++++++- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 3 +++ openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 2bf5ab437f..3d7458dedf 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1378,7 +1378,7 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; NR_UE_harq_t *harq = &UE_info->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid]; - LOG_D(MAC, "ue %d, rnti %d, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid); + LOG_D(NR_MAC, "ue %d, rnti %d, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid); if (harq->is_waiting == 0) { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index fa609cddbe..37aeabe07c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -1756,12 +1756,22 @@ void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti) if (pthread_mutex_lock(&rnti_to_remove_mutex)) exit(1); if (rnti_to_remove_count == 10) exit(1); rnti_to_remove[rnti_to_remove_count] = rnti; - LOG_W(MAC, "to remove in mac rnti_to_remove[%d]=%d\n", rnti_to_remove_count, rnti); + LOG_W(NR_MAC, "to remove in mac rnti_to_remove[%d] = 0x%04x\n", rnti_to_remove_count, rnti); rnti_to_remove_count++; if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1); } } +void nr_mac_remove_ra_rnti_ue(module_id_t mod_id, rnti_t rnti) { + // Hack to remove UE in the phy (following the same procedure as in function mac_remove_nr_ue) + if (pthread_mutex_lock(&rnti_to_remove_mutex)) exit(1); + if (rnti_to_remove_count == 10) exit(1); + rnti_to_remove[rnti_to_remove_count] = rnti; + LOG_W(NR_MAC, "to remove in mac rnti_to_remove[%d] = 0x%04x\n", rnti_to_remove_count, rnti); + rnti_to_remove_count++; + if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1); +} + uint8_t nr_get_tpc(int target, uint8_t cqi, int incr) { // al values passed to this function are x10 diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 83060215e9..fa973844cb 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -492,6 +492,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, if(no_sig) { LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); + nr_mac_remove_ra_rnti_ue(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); } else { @@ -516,6 +517,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, if(ra->cfra) { LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti); + nr_mac_remove_ra_rnti_ue(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); free(ra->preambles.preamble_list); UE_info->active[UE_id] = true; @@ -555,6 +557,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, continue; LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); + nr_mac_remove_ra_rnti_ue(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); } } diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 78de26b5b9..a7d9bc43b1 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -312,6 +312,8 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *secon void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti); +void nr_mac_remove_ra_rnti_ue(module_id_t mod_id, rnti_t rnti); + int allocate_nr_CCEs(gNB_MAC_INST *nr_mac, NR_BWP_Downlink_t *bwp, NR_ControlResourceSet_t *coreset, From 86f70e27771fd3d4d01e5595580378656878c7af Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 23 Mar 2021 20:13:23 +0000 Subject: [PATCH 079/125] Add RA support for up to NUMBER_OF_NR_ULSCH_MAX UEs --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 4 ++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 3d7458dedf..3816fe0b50 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -577,7 +577,8 @@ void nr_initiate_ra_proc(module_id_t module_idP, LOG_D(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); int loop = 0; - if (!ra->cfra) { + // This condition allows for the usage of a preconfigured rnti for the first UE + if (!ra->cfra || ra->rnti == 0) { do { ra->rnti = (taus() % 65518) + 1; loop++; @@ -1385,7 +1386,6 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram if (harq->round == 0) { nr_clear_ra_proc(module_id, CC_id, frame, ra); - free(ra->preambles.preamble_list); UE_info->active[UE_id] = true; LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index fa973844cb..4bbe031742 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -519,7 +519,6 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti); nr_mac_remove_ra_rnti_ue(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); - free(ra->preambles.preamble_list); UE_info->active[UE_id] = true; } else { From feb2b9c8bbb8de5ab0f7dab520936e4b7f2730b1 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 24 Mar 2021 10:24:24 +0100 Subject: [PATCH 080/125] adding rxdataF signal to debug output --- openair1/SIMULATION/NR_PHY/prachsim.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index 4c70f24dd9..01b7356f37 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -177,7 +177,7 @@ int main(int argc, char **argv){ double sigma2, sigma2_dB = 0, SNR, snr0 = -2.0, snr1 = 0.0, ue_speed0 = 0.0, ue_speed1 = 0.0; double **s_re, **s_im, **r_re, **r_im, iqim = 0.0, delay_avg = 0, ue_speed = 0, fs, bw; - int i, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1; + int i, l, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1; int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0; uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0; uint8_t frame = 1, slot=19, slot_gNB=19, config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol; @@ -808,7 +808,18 @@ int main(int argc, char **argv){ } } - + for (l = 0; l < frame_parms->symbols_per_slot; l++) { + for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) { + nr_slot_fep_ul(frame_parms, + ru->common.rxdata[aa], + ru->common.rxdataF[aa], + l, + slot, + ru->N_TA_offset, + 0); + } + } + rx_nr_prach_ru(ru, prach_format, numRA, prachStartSymbol, prachOccasion, frame, slot); gNB->prach_vars.rxsigF = ru->prach_rxsigF[prachOccasion]; @@ -831,7 +842,8 @@ int main(int argc, char **argv){ LOG_M("prachF0.m","prachF0", &gNB->prach_vars.prachF[0], N_ZC, 1, 1); LOG_M("rxsig0.m","rxs0", &gNB->common_vars.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1); LOG_M("ru_rxsig0.m","rxs0", &ru->common.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1); - LOG_M("ru_rxsigF0.m","rxsF0", ru->prach_rxsigF[0][0], N_ZC, 1, 1); + LOG_M("ru_rxsigF0.m","rxsF0", ru->common.rxdataF[0], frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot, 1, 1); + LOG_M("ru_prach_rxsigF0.m","rxsF0", ru->prach_rxsigF[0][0], N_ZC, 1, 1); LOG_M("prach_preamble.m","prachp", &gNB->X_u[0], N_ZC, 1, 1); LOG_M("ue_prach_preamble.m","prachp", &UE->X_u[0], N_ZC, 1, 1); #endif From 4840b895ddcec84900f94985c3013cbd2db18483 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 24 Mar 2021 10:13:28 +0100 Subject: [PATCH 081/125] adding PRACH signal to T tracer --- common/utils/T/T_defs.h | 4 ++-- common/utils/T/T_messages.txt | 4 ++++ executables/nr-ru.c | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h index 11c816f002..efab3e525c 100644 --- a/common/utils/T/T_defs.h +++ b/common/utils/T/T_defs.h @@ -42,9 +42,9 @@ /* maximum size of a message - increase if needed */ #if BASIC_SIMULATOR /* let's have 100 RBs functional for the basic simulator */ -# define T_BUFFER_MAX (1024*64*2) +# define T_BUFFER_MAX (1024*64*4) #else -# define T_BUFFER_MAX (1024*64*2) +# define T_BUFFER_MAX (1024*64*4) #endif /* size of the local cache for messages (must be pow(2,something)) */ diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index fedc50cf5d..2f52487c88 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -93,6 +93,10 @@ ID = GNB_PHY_PUCCH_PUSCH_IQ DESC = gNodeB input data in the frequency domain for a slot where some PUCCH or PUSCH detection was done GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB FORMAT = int,frame : int,slot : buffer,rxdataF +ID = GNB_PHY_PRACH_INPUT_SIGNAL + DESC = gNodeB input data in the time domain for slots with PRACH detection + GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB + FORMAT = int,frame : int,slot : int,antenna : buffer,rxdata #MAC logs ID = ENB_MAC_UE_DL_SDU diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 0e6c8f2818..9086de6866 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -1343,6 +1343,10 @@ void *ru_thread( void *param ) { int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST); uint8_t prachStartSymbol,N_dur; if (prach_id>=0) { + + T(T_GNB_PHY_PRACH_INPUT_SIGNAL, T_INT(proc->frame_rx), T_INT(proc->tti_rx), T_INT(0), + T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx-1,fp,0)]/*-ru->N_TA_offset*/, fp->get_samples_per_slot(proc->tti_rx,fp)*4*2)); + N_dur = get_nr_prach_duration(ru->prach_list[prach_id].fmt); /* get_nr_prach_info_from_index(ru->config.prach_config.prach_ConfigurationIndex.value, From e84d1fe678d6389d05cb4de730494cba541e0b83 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 24 Mar 2021 16:07:11 +0100 Subject: [PATCH 082/125] adding UL LCID 52 for CCCH with 48 bits --- openair2/LAYER2/NR_MAC_COMMON/nr_mac.h | 3 ++- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h index fa4d8d48ea..6b9060801d 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h @@ -334,11 +334,12 @@ typedef struct { #define DL_SCH_LCID_CON_RES_ID 0x3E #define DL_SCH_LCID_PADDING 0x3F -#define UL_SCH_LCID_CCCH 0x00 +#define UL_SCH_LCID_CCCH1 0x00 #define UL_SCH_LCID_SRB1 0x01 #define UL_SCH_LCID_SRB2 0x02 #define UL_SCH_LCID_SRB3 0x03 #define UL_SCH_LCID_DTCH 0x04 +#define UL_SCH_LCID_CCCH 0x34 #define UL_SCH_LCID_RECOMMENDED_BITRATE_QUERY 0x35 #define UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT 0x36 #define UL_SCH_LCID_CONFIGURED_GRANT_CONFIRMATION 0x37 diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 4bbe031742..c6a741cce9 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -238,6 +238,7 @@ void nr_process_mac_pdu( // todo break; case UL_SCH_LCID_CCCH: + case UL_SCH_LCID_CCCH1: mac_subheader_len = 1; nr_mac_rrc_data_ind(module_idP, CC_id, From 39868c400a18264c9acba4fb190a009f7d0517aa Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 24 Mar 2021 16:07:53 +0100 Subject: [PATCH 083/125] adding format_indicator to dci_payload of msg3 --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 1 + 1 file changed, 1 insertion(+) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 3816fe0b50..b16cd600c2 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1294,6 +1294,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->rbStart, pdsch_pdu_rel15->BWPSize); + dci_payload.format_indicator = 1; dci_payload.time_domain_assignment.val = time_domain_assignment; dci_payload.vrb_to_prb_mapping.val = 0; dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0]; From 114508c120bb37ac4aee85c92a4b934e0d095ae2 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 24 Mar 2021 16:17:48 +0000 Subject: [PATCH 084/125] Minor fix in nr_prachsim --- openair1/SIMULATION/NR_PHY/prachsim.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index 01b7356f37..fb5cdfa7d4 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -37,6 +37,7 @@ #include "SCHED_NR_UE/phy_frame_config_nr.h" #include "PHY/phy_vars_nr_ue.h" #include "PHY/NR_REFSIG/refsig_defs_ue.h" +#include "PHY/MODULATION/nr_modulation.h" #include "PHY/MODULATION/modulation_eNB.h" #include "PHY/MODULATION/modulation_UE.h" #include "PHY/INIT/phy_init.h" @@ -815,8 +816,7 @@ int main(int argc, char **argv){ ru->common.rxdataF[aa], l, slot, - ru->N_TA_offset, - 0); + ru->N_TA_offset); } } From 8800789b0a74b57687e65f7d5553a3fc0d35bba6 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 25 Mar 2021 15:15:03 +0000 Subject: [PATCH 085/125] Fix preamble detection for NSA --- openair2/LAYER2/NR_MAC_UE/config_ue.c | 8 ++++++-- openair2/LAYER2/NR_MAC_gNB/config.c | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 4d4dd45415..79e6eca300 100755 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -35,6 +35,7 @@ #include "NR_MAC_UE/mac_proto.h" #include "NR_MAC-CellGroupConfig.h" #include "LAYER2/NR_MAC_COMMON/nr_mac_common.h" +#include "executables/softmodem-common.h" int set_tdd_config_nr_ue(fapi_nr_config_request_t *cfg, int mu, @@ -310,8 +311,11 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139; else cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; - - cfg->prach_config.num_prach_fd_occasions_list[i].k1 = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + if (get_softmodem_params()->sa) { + cfg->prach_config.num_prach_fd_occasions_list[i].k1 = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + } else { + cfg->prach_config.num_prach_fd_occasions_list[i].k1 = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + } cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup, nb_preambles, mac->frame_type, frequency_range); //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ??? diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 1524fa71ec..77a20a63c8 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -209,7 +209,11 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.tl.tag = NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG; cfg->num_tlv++; cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); -//k1= msg1_FrequencyStart + 12 (no. of FDM)(RB for PRACH occasion); + if (get_softmodem_params()->sa) { + cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + } else { + cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + } cfg->prach_config.num_prach_fd_occasions_list[i].k1.tl.tag = NFAPI_NR_CONFIG_K1_TAG; cfg->num_tlv++; cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; From 7c90e58d3954d33442ab667fa6729546747fbd2d Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 25 Mar 2021 17:37:03 +0000 Subject: [PATCH 086/125] Fix BWP selection for NSA mode --- .../NR_MAC_UE/nr_ue_dci_configuration.c | 12 +++++++++-- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 10 +++++++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 21 ++++++++++++++----- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c index f3b4acc9bd..206788598f 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c @@ -148,7 +148,11 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps)); rel15->rnti = ra->ra_rnti; rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (get_softmodem_params()->sa) { + rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + } else { // NSA mode is not using the Initial BWP + rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + } rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing; rel15->dci_length_options[0] = nr_dci_size(scc, mac->scg, def_dci_pdu_rel15, rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, bwp_id); break; @@ -260,7 +264,11 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg2)\n"); rel15->num_dci_options = 1; rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; - config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, -1); + if (get_softmodem_params()->sa) { + config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, -1); + } else { + config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id); + } fill_dci_search_candidates(ss, rel15); break; case WAIT_CONTENTION_RESOLUTION: diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 475d26b61a..6473741076 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -651,8 +651,14 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr if( (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti) ) { dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; + if (get_softmodem_params()->sa) { + dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; + } else { // NSA mode is not using the Initial BWP + dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) + pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); + } } else { dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index b16cd600c2..2b842dc968 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -849,13 +849,24 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } nr_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; - NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; - NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; - NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; - long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + + long BWPStart = 0; + NR_SearchSpace_t *ss = NULL; + NR_BWP_Downlink_t *bwp = NULL; + NR_ControlResourceSet_t *coreset = NULL; + if (get_softmodem_params()->sa) { + bwp = nr_mac->sched_ctrlCommon->active_bwp; + BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + ss = nr_mac->sched_ctrlCommon->search_space; + coreset = nr_mac->sched_ctrlCommon->coreset; + } else { // NSA mode is not using the Initial BWP + bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; + BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + ss = ra->ra_ss; + coreset = get_coreset(bwp, ss, 0); + } uint16_t *vrb_map = cc[CC_id].vrb_map; for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) { From 818c9b2c88f1b2d680b8bd298933ed2261d29d6b Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Thu, 25 Mar 2021 20:13:50 +0100 Subject: [PATCH 087/125] first pass --- cmake_targets/CMakeLists.txt | 9 +- executables/ocp-gnb.c | 2 +- .../CODING/3gpplte_turbo_decoder_sse_8bit.c | 35 +- openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 611 ++++++------------ openair1/PHY/LTE_REFSIG/primary_synch.h | 1 - openair1/PHY/TOOLS/lte_phy_scope.c | 9 +- openair1/PHY/TOOLS/tools_defs.h | 5 + openair1/PHY/phy_extern.h | 6 - openair1/PHY/phy_extern_nr_ue.h | 3 - openair1/PHY/phy_extern_ue.h | 6 - openair1/PHY/phy_vars.h | 3 - openair1/PHY/phy_vars_ue.h | 3 - openair2/GNB_APP/gnb_config.c | 8 +- openair2/LAYER2/MAC/config.c | 8 +- openair2/LAYER2/MAC/eNB_scheduler_mch.c | 2 +- openair2/LAYER2/MAC/mac_extern.h | 1 + openair2/LAYER2/MAC/ue_procedures.c | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 23 +- openair2/RRC/LTE/plmn_data.h | 3 +- targets/RT/USER/lte-softmodem.c | 2 + targets/RT/USER/lte-ue.c | 3 +- 21 files changed, 242 insertions(+), 503 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 626d938625..83d2ba04e6 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -45,6 +45,8 @@ include_directories(${CONFIG_INCLUDE_DIRS}) pkg_search_module(CRYPTO libcrypto REQUIRED) include_directories(${CRYPTO_INCLUDE_DIRS}) +#uhd 4.0 and iris installs by default in /usr/local +include_directories("/usr/local/include/") #use native cmake method as this package is not in pkg-config if (${RF_BOARD} STREQUAL "OAI_USRP") find_package(Boost REQUIRED) @@ -52,7 +54,7 @@ if (${RF_BOARD} STREQUAL "OAI_USRP") elseif (${RF_BOARD} STREQUAL "OAI_IRIS") include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/") - include_directories("/usr/local/include/") + set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp) LINK_DIRECTORIES("/usr/local/lib") @@ -336,11 +338,11 @@ endif () add_definitions("-DASN_DISABLE_OER_SUPPORT") ######################### -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sanitize=address -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}") ######################### # set a flag for changes in the source code # these changes are related to hardcoded path to include .h files -set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -O0 -DMALLOC_CHECK_=3") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -O0 --sanitize=address -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3 -O2 -fno-delete-null-pointer-checks") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3") @@ -3088,6 +3090,7 @@ add_executable(ocp-gnb ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/system.c + ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_gNB.c ${GTPU_need_ITTI} ${XFORMS_SOURCE_NR} ${T_SOURCE} diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c index 4ddc7870d9..9a09a1247c 100644 --- a/executables/ocp-gnb.c +++ b/executables/ocp-gnb.c @@ -77,7 +77,6 @@ int config_sync_var=-1; pthread_mutex_t nfapi_sync_mutex; pthread_cond_t nfapi_sync_cond; int nfapi_sync_var=-1; -uint8_t nfapi_mode = NFAPI_MONOLITHIC; // Default to monolithic mode double cpuf; @@ -95,6 +94,7 @@ time_stats_t nfapi_meas; // total tx time time_stats_t softmodem_stats_rx_sf; // total rx time // not used but needed for link openair0_config_t openair0_cfg[MAX_CARDS]; +uint16_t slot_ahead=6; AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]; AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]; diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index e1ca906b55..bc1c0dac56 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -798,11 +798,11 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, n is the size in bits of the coded block, with the tail */ int n2; llr_t y8[3*(n+16)] __attribute__((aligned(16))); - llr_t systematic0[n+16] __attribute__ ((aligned(16))); - llr_t systematic1[n+16] __attribute__ ((aligned(16))); - llr_t systematic2[n+16] __attribute__ ((aligned(16))); - llr_t yparity1[n+16] __attribute__ ((aligned(16))); - llr_t yparity2[n+16] __attribute__ ((aligned(16))); + llr_t systematic0[n+32] __attribute__ ((aligned(16))); + llr_t systematic1[n+32] __attribute__ ((aligned(16))); + llr_t systematic2[n+32] __attribute__ ((aligned(16))); + llr_t yparity1[n+32] __attribute__ ((aligned(16))); + llr_t yparity2[n+32] __attribute__ ((aligned(16))); llr_t ext[n+128] __attribute__((aligned(16))); llr_t ext2[n+128] __attribute__((aligned(16))); llr_t alpha[(n+16)*8] __attribute__ ((aligned(16))); @@ -811,7 +811,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, llr_t m10[n+16] __attribute__ ((aligned(16))); // int *pi2_p,*pi4_p,*pi5_p,*pi6_p; int *pi4_p,*pi5_p,*pi6_p; - llr_t *s,*s1,*s2,*yp1,*yp2,*yp; + llr_t *s1,*s2,*yp1,*yp2,*yp; unsigned int i,j,iind;//,pi; unsigned char iteration_cnt=0; unsigned int crc,oldcrc,crc_len; @@ -927,7 +927,6 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, yp128 = (int8x16_t *)y8; #endif - s = systematic0; s1 = systematic1; s2 = systematic2; yp1 = yparity1; @@ -938,7 +937,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, for (i=0; i<16 ; i++ ) for (j=0; jn) { /* - s[n]=0;s[n+1]=0;s[n+2]=0;s[n+3]=0; - s[n+4]=0;s[n+5]=0;s[n+6]=0;s[n+7]=0; + systematic0[n]=0;systematic0[n+1]=0;systematic0[n+2]=0;systematic0[n+3]=0; + systematic0[n+4]=0;s[n+5]=0;s[n+6]=0;s[n+7]=0; s1[n]=0;s1[n+1]=0;s1[n+2]=0;s1[n+3]=0; s1[n+4]=0;s1[n+5]=0;s1[n+6]=0;s1[n+7]=0; s2[n]=0;s2[n+1]=0;s2[n+2]=0;s2[n+3]=0; @@ -961,26 +960,26 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, // Termination for (i=n2; isamples_per_tti); - sync_corr_ue1 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti); - sync_corr_ue2 = (int *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms->samples_per_tti); + case 50: + idft(IDFT_1024,in,out,1); + break; - if (sync_corr_ue0) { -#ifdef DEBUG_PHY - LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue0); -#endif - //common_vars->sync_corr = sync_corr; - } else { - LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue0 not allocated\n"); - return(-1); + case 75: + idft(IDFT_1536,in,out,1); + break; + + case 100: + idft(IDFT_2048,in,out,1); + break; + + default: + LOG_E(PHY,"Unsupported N_RB_DL %d\n",size); + abort(); + break; } +} - if (sync_corr_ue1) { -#ifdef DEBUG_PHY - LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue1); -#endif - //common_vars->sync_corr = sync_corr; - } else { - LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue1 not allocated\n"); - return(-1); +static void copyPrimary( struct complex16 *out, struct complex16 *in, int ofdmSize) { + int k=ofdmSize-36; + + for (int i=0; i<72; i++) { + out[k].r = in[i].r>>2; //we need to shift input to avoid overflow in fft + out[k].i = in[i].i>>2; + k++; + + if (k >= ofdmSize) { + k++; // skip DC carrier + k-=ofdmSize; + } } +} - if (sync_corr_ue2) { -#ifdef DEBUG_PHY - LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue2); -#endif - //common_vars->sync_corr = sync_corr; - } else { - LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue2 not allocated\n"); - return(-1); - } - - // primary_synch0_time = (int *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); - primary_synch0_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); - - if (primary_synch0_time) { - // bzero(primary_synch0_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); - bzero(primary_synch0_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); -#ifdef DEBUG_PHY - LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch0_time allocated at %p\n", primary_synch0_time); -#endif - } else { - LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch0_time not allocated\n"); - return(-1); - } - - // primary_synch1_time = (int *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); - primary_synch1_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); - - if (primary_synch1_time) { - // bzero(primary_synch1_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); - bzero(primary_synch1_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); -#ifdef DEBUG_PHY - LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch1_time allocated at %p\n", primary_synch1_time); -#endif - } else { - LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch1_time not allocated\n"); - return(-1); - } - - // primary_synch2_time = (int *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); - primary_synch2_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); - - if (primary_synch2_time) { - // bzero(primary_synch2_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); - bzero(primary_synch2_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); -#ifdef DEBUG_PHY - LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch2_time allocated at %p\n", primary_synch2_time); -#endif - } else { - LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch2_time not allocated\n"); - return(-1); - } - - +int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) { // LTE_UE_COMMON *common_vars + struct complex16 syncF_tmp[2048]__attribute__((aligned(32)))= {0}; + int sz=frame_parms->ofdm_symbol_size*sizeof(*primary_synch0_time); + AssertFatal( NULL != (primary_synch0_time = (struct complex16 *)malloc16(sz)),""); + bzero(primary_synch0_time,sz); + AssertFatal( NULL != (primary_synch1_time = (struct complex16 *)malloc16(sz)),""); + bzero(primary_synch1_time,sz); + AssertFatal( NULL != (primary_synch2_time = (struct complex16 *)malloc16(sz)),""); + bzero(primary_synch2_time,sz); // generate oversampled sync_time sequences - k=frame_parms->ofdm_symbol_size-36; + copyPrimary( syncF_tmp, (struct complex16 *) primary_synch0, frame_parms->ofdm_symbol_size); + doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch0_time); + copyPrimary( syncF_tmp, (struct complex16 *) primary_synch1, frame_parms->ofdm_symbol_size); + doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch1_time); + copyPrimary( syncF_tmp, (struct complex16 *) primary_synch2, frame_parms->ofdm_symbol_size); + doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch2_time); - for (i=0; i<72; i++) { - syncF_tmp[2*k] = primary_synch0[2*i]>>2; //we need to shift input to avoid overflow in fft - syncF_tmp[2*k+1] = primary_synch0[2*i+1]>>2; - k++; - - if (k >= frame_parms->ofdm_symbol_size) { - k++; // skip DC carrier - k-=frame_parms->ofdm_symbol_size; - } - } - - switch (frame_parms->N_RB_DL) { - case 6: - idft(IDFT_128,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - case 25: - idft(IDFT_512,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - case 50: - idft(IDFT_1024,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - - case 75: - idft(IDFT_1536,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, - 1); /// complex output - break; - case 100: - idft(IDFT_2048,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - default: - LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL); - break; - } - - for (i=0; iofdm_symbol_size; i++) - ((int32_t*)primary_synch0_time)[i] = sync_tmp[i]; - - k=frame_parms->ofdm_symbol_size-36; - - for (i=0; i<72; i++) { - syncF_tmp[2*k] = primary_synch1[2*i]>>2; //we need to shift input to avoid overflow in fft - syncF_tmp[2*k+1] = primary_synch1[2*i+1]>>2; - k++; - - if (k >= frame_parms->ofdm_symbol_size) { - k++; // skip DC carrier - k-=frame_parms->ofdm_symbol_size; - } - } - - switch (frame_parms->N_RB_DL) { - case 6: - idft(IDFT_128,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - case 25: - idft(IDFT_512,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - case 50: - idft(IDFT_1024,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - - case 75: - idft(IDFT_1536,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - case 100: - idft(IDFT_2048,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - default: - LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL); - break; - } - - for (i=0; iofdm_symbol_size; i++) - ((int32_t*)primary_synch1_time)[i] = sync_tmp[i]; - - k=frame_parms->ofdm_symbol_size-36; - - for (i=0; i<72; i++) { - syncF_tmp[2*k] = primary_synch2[2*i]>>2; //we need to shift input to avoid overflow in fft - syncF_tmp[2*k+1] = primary_synch2[2*i+1]>>2; - k++; - - if (k >= frame_parms->ofdm_symbol_size) { - k++; // skip DC carrier - k-=frame_parms->ofdm_symbol_size; - } - } - - switch (frame_parms->N_RB_DL) { - case 6: - idft(IDFT_128,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - case 25: - idft(IDFT_512,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - case 50: - idft(IDFT_1024,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - - case 75: - idft(IDFT_1536,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - case 100: - idft(IDFT_2048,(short*)syncF_tmp, /// complex input - (short*)sync_tmp, /// complex output - 1); - break; - default: - LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL); - break; - } - - for (i=0; iofdm_symbol_size; i++) - ((int32_t*)primary_synch2_time)[i] = sync_tmp[i]; - - - if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){ + if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)) { LOG_M("primary_sync0.m","psync0",primary_synch0_time,frame_parms->ofdm_symbol_size,1,1); LOG_M("primary_sync1.m","psync1",primary_synch1_time,frame_parms->ofdm_symbol_size,1,1); LOG_M("primary_sync2.m","psync2",primary_synch2_time,frame_parms->ofdm_symbol_size,1,1); } + return (1); } -void lte_sync_time_free(void) -{ - if (sync_corr_ue0) { - LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue0); - free(sync_corr_ue0); - } - - if (sync_corr_ue1) { - LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue1); - free(sync_corr_ue1); - } - - if (sync_corr_ue2) { - LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue2); - free(sync_corr_ue2); - } - +void lte_sync_time_free(void) { if (primary_synch0_time) { LOG_D(PHY,"Freeing primary_sync0_time ...\n"); free(primary_synch0_time); @@ -312,126 +128,81 @@ void lte_sync_time_free(void) free(primary_synch2_time); } - sync_corr_ue0 = NULL; - sync_corr_ue1 = NULL; - sync_corr_ue2 = NULL; primary_synch0_time = NULL; primary_synch1_time = NULL; primary_synch2_time = NULL; } -static inline int abs32(int x) -{ - return (((int)((short*)&x)[0])*((int)((short*)&x)[0]) + ((int)((short*)&x)[1])*((int)((short*)&x)[1])); +static inline int abs32(int x) { + return (((int)((short *)&x)[0])*((int)((short *)&x)[0]) + ((int)((short *)&x)[1])*((int)((short *)&x)[1])); } +static inline double absF(struct complexd x) { + return x.r*x.r+x.i*x.i; +} + +#define complexNull(c) bzero((void*) &(c), sizeof(c)) #define SHIFT 17 int lte_sync_time(int **rxdata, ///rx data in time domain LTE_DL_FRAME_PARMS *frame_parms, - int *eNB_id) -{ + int *eNB_id) { // perform a time domain correlation using the oversampled sync sequence - unsigned int n, ar, s, peak_pos, peak_val, sync_source; int result,result2; - int sync_out[3] = {0,0,0},sync_out2[3] = {0,0,0}; - int tmp[3] = {0,0,0}; + struct complexd sync_out[3]= {0}, sync_out2[3]= {0}; int length = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti>>1; - - //LOG_D(PHY,"[SYNC TIME] Calling sync_time.\n"); - AssertFatal(sync_corr_ue0 != NULL, - "sync_corr_ue0 not yet allocated! Exiting.\n"); - AssertFatal(sync_corr_ue1 != NULL, - "sync_corr_ue0 not yet allocated! Exiting.\n"); - AssertFatal(sync_corr_ue2 != NULL, - "sync_corr_ue0 not yet allocated! Exiting.\n"); - peak_val = 0; peak_pos = 0; sync_source = 0; - for (n=0; nofdm_symbol_size-frame_parms->nb_prefix_samples)) { if (n<(length-frame_parms->ofdm_symbol_size)) { - //calculate dot product of primary_synch0_time and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n]; for (ar=0; arnb_antennas_rx; ar++) { - - result = dot_product((short*)primary_synch0_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); - result2 = dot_product((short*)primary_synch0_time, (short*) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT); - - ((short*)sync_corr_ue0)[2*n] += ((short*) &result)[0]; - ((short*)sync_corr_ue0)[2*n+1] += ((short*) &result)[1]; - ((short*)sync_corr_ue0)[2*(length+n)] += ((short*) &result2)[0]; - ((short*)sync_corr_ue0)[(2*(length+n))+1] += ((short*) &result2)[1]; - ((short*)sync_out)[0] += ((short*) &result)[0]; - ((short*)sync_out)[1] += ((short*) &result)[1]; - ((short*)sync_out2)[0] += ((short*) &result2)[0]; - ((short*)sync_out2)[1] += ((short*) &result2)[1]; + result = dot_product((short *)primary_synch0_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); + result2 = dot_product((short *)primary_synch0_time, (short *) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT); + sync_out[0].r += ((short *) &result)[0]; + sync_out[0].i += ((short *) &result)[1]; + sync_out2[0].r += ((short *) &result2)[0]; + sync_out2[0].i += ((short *) &result2)[1]; } for (ar=0; arnb_antennas_rx; ar++) { - result = dot_product((short*)primary_synch1_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); - result2 = dot_product((short*)primary_synch1_time, (short*) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT); - ((short*)sync_corr_ue1)[2*n] += ((short*) &result)[0]; - ((short*)sync_corr_ue1)[2*n+1] += ((short*) &result)[1]; - ((short*)sync_corr_ue1)[2*(length+n)] += ((short*) &result2)[0]; - ((short*)sync_corr_ue1)[(2*(length+n))+1] += ((short*) &result2)[1]; - - ((short*)sync_out)[2] += ((short*) &result)[0]; - ((short*)sync_out)[3] += ((short*) &result)[1]; - ((short*)sync_out2)[2] += ((short*) &result2)[0]; - ((short*)sync_out2)[3] += ((short*) &result2)[1]; + result = dot_product((short *)primary_synch1_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); + result2 = dot_product((short *)primary_synch1_time, (short *) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT); + sync_out[1].r += ((short *) &result)[0]; + sync_out[1].i += ((short *) &result)[1]; + sync_out2[1].r += ((short *) &result2)[0]; + sync_out2[1].i += ((short *) &result2)[1]; } for (ar=0; arnb_antennas_rx; ar++) { - - result = dot_product((short*)primary_synch2_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); - result2 = dot_product((short*)primary_synch2_time, (short*) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT); - ((short*)sync_corr_ue2)[2*n] += ((short*) &result)[0]; - ((short*)sync_corr_ue2)[2*n+1] += ((short*) &result)[1]; - ((short*)sync_corr_ue2)[2*(length+n)] += ((short*) &result2)[0]; - ((short*)sync_corr_ue2)[(2*(length+n))+1] += ((short*) &result2)[1]; - ((short*)sync_out)[4] += ((short*) &result)[0]; - ((short*)sync_out)[5] += ((short*) &result)[1]; - ((short*)sync_out2)[4] += ((short*) &result2)[0]; - ((short*)sync_out2)[5] += ((short*) &result2)[1]; + result = dot_product((short *)primary_synch2_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); + result2 = dot_product((short *)primary_synch2_time, (short *) &(rxdata[ar][n+length]), frame_parms->ofdm_symbol_size, SHIFT); + sync_out[2].r += ((short *) &result)[0]; + sync_out[2].i += ((short *) &result)[1]; + sync_out2[2].r += ((short *) &result2)[0]; + sync_out2[2].i += ((short *) &result2)[1]; } - } // calculate the absolute value of sync_corr[n] - sync_corr_ue0[n] = abs32(sync_corr_ue0[n]); - sync_corr_ue0[n+length] = abs32(sync_corr_ue0[n+length]); - sync_corr_ue1[n] = abs32(sync_corr_ue1[n]); - sync_corr_ue1[n+length] = abs32(sync_corr_ue1[n+length]); - sync_corr_ue2[n] = abs32(sync_corr_ue2[n]); - sync_corr_ue2[n+length] = abs32(sync_corr_ue2[n+length]); - for (s=0; s<3; s++) { - tmp[s] = (abs32(sync_out[s])>>1) + (abs32(sync_out2[s])>>1); + double tmp = absF(sync_out[s]) + absF(sync_out2[s]); - if (tmp[s]>peak_val) { - peak_val = tmp[s]; + if (tmp>peak_val) { + peak_val = tmp; peak_pos = n; sync_source = s; /* @@ -443,42 +214,22 @@ int lte_sync_time(int **rxdata, ///rx data in time domain } *eNB_id = sync_source; - - LOG_I(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); - - - if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){ - static int debug_cnt; - if (debug_cnt == 0) { - LOG_M("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2); - LOG_M("sync_corr1_ue.m","synccorr1",sync_corr_ue1,2*length,1,2); - LOG_M("sync_corr2_ue.m","synccorr2",sync_corr_ue2,2*length,1,2); - LOG_M("rxdata0.m","rxd0",rxdata[0],length<<1,1,1); - // exit(-1); - } else { - debug_cnt++; - } -} + LOG_I(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val/2,dB_fixed(peak_val/2)/2); return(peak_pos); } -int ru_sync_time_init(RU_t *ru) // LTE_UE_COMMON *common_vars -{ +int ru_sync_time_init(RU_t *ru) { // LTE_UE_COMMON *common_vars /* int16_t dmrs[2048]; int16_t *dmrsp[2] = {dmrs,NULL}; */ - int32_t dmrs[ru->frame_parms->ofdm_symbol_size*14] __attribute__((aligned(32))); //int32_t *dmrsp[2] = {&dmrs[(3-ru->frame_parms->Ncp)*ru->frame_parms->ofdm_symbol_size],NULL}; int32_t *dmrsp[2] = {&dmrs[0],NULL}; - generate_ul_ref_sigs(); - - ru->dmrssync = (int16_t*)malloc16_clear(ru->frame_parms->ofdm_symbol_size*2*sizeof(int16_t)); - ru->dmrs_corr = (uint64_t*)malloc16_clear(ru->frame_parms->samples_per_tti*10*sizeof(uint64_t)); - + ru->dmrssync = (int16_t *)malloc16_clear(ru->frame_parms->ofdm_symbol_size*2*sizeof(int16_t)); + ru->dmrs_corr = (uint64_t *)malloc16_clear(ru->frame_parms->samples_per_tti*10*sizeof(uint64_t)); generate_drs_pusch(NULL, NULL, ru->frame_parms, @@ -491,35 +242,39 @@ int ru_sync_time_init(RU_t *ru) // LTE_UE_COMMON *common_vars 0); switch (ru->frame_parms->N_RB_DL) { - case 6: - idft(IDFT_128,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, /// complex output - 1); - break; - case 25: - idft(IDFT_512,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, /// complex output - 1); - break; - case 50: - idft(IDFT_1024,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, /// complex output - 1); - break; - - case 75: - idft(IDFT_1536,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, - 1); /// complex output - break; - case 100: - idft(IDFT_2048,(int16_t*)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), - ru->dmrssync, /// complex output - 1); - break; - default: - AssertFatal(1==0,"Unsupported N_RB_DL %d\n",ru->frame_parms->N_RB_DL); - break; + case 6: + idft(IDFT_128,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), + ru->dmrssync, /// complex output + 1); + break; + + case 25: + idft(IDFT_512,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), + ru->dmrssync, /// complex output + 1); + break; + + case 50: + idft(IDFT_1024,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), + ru->dmrssync, /// complex output + 1); + break; + + case 75: + idft(IDFT_1536,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), + ru->dmrssync, + 1); /// complex output + break; + + case 100: + idft(IDFT_2048,(int16_t *)(&dmrsp[0][3*ru->frame_parms->ofdm_symbol_size]), + ru->dmrssync, /// complex output + 1); + break; + + default: + AssertFatal(1==0,"Unsupported N_RB_DL %d\n",ru->frame_parms->N_RB_DL); + break; } return(0); @@ -527,10 +282,11 @@ int ru_sync_time_init(RU_t *ru) // LTE_UE_COMMON *common_vars void ru_sync_time_free(RU_t *ru) { - AssertFatal(ru->dmrssync!=NULL,"ru->dmrssync is NULL\n"); free(ru->dmrssync); - if (ru->dmrs_corr) free(ru->dmrs_corr); + + if (ru->dmrs_corr) + free(ru->dmrs_corr); } //#define DEBUG_PHY @@ -539,10 +295,8 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain LTE_DL_FRAME_PARMS *frame_parms, uint32_t length, uint32_t *peak_val_out, - uint32_t *sync_corr_eNB) -{ + uint32_t *sync_corr_eNB) { // perform a time domain correlation using the oversampled sync sequence - unsigned int n, ar, peak_val, peak_pos; uint64_t mean_val; int result; @@ -556,21 +310,21 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain } switch (eNB_id) { - case 0: - primary_synch_time = (short*)primary_synch0_time; - break; + case 0: + primary_synch_time = (short *)primary_synch0_time; + break; - case 1: - primary_synch_time = (short*)primary_synch1_time; - break; + case 1: + primary_synch_time = (short *)primary_synch1_time; + break; - case 2: - primary_synch_time = (short*)primary_synch2_time; - break; + case 2: + primary_synch_time = (short *)primary_synch2_time; + break; - default: - LOG_E(PHY,"[SYNC TIME] Illegal eNB_id!\n"); - return (-1); + default: + LOG_E(PHY,"[SYNC TIME] Illegal eNB_id!\n"); + return (-1); } peak_val = 0; @@ -578,21 +332,16 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain mean_val = 0; for (n=0; nofdm_symbol_size-frame_parms->nb_prefix_samples)) { - //calculate dot product of primary_synch0_time and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n]; for (ar=0; arnb_antennas_rx; ar++) { - - result = dot_product((short*)primary_synch_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); + result = dot_product((short *)primary_synch_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); //((short*)sync_corr)[2*n] += ((short*) &result)[0]; //((short*)sync_corr)[2*n+1] += ((short*) &result)[1]; sync_corr_eNB[n] += abs32(result); - } - } /* @@ -610,7 +359,6 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain } mean_val/=length; - *peak_val_out = peak_val; if (peak_val <= (40*(uint32_t)mean_val)) { @@ -620,88 +368,91 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain LOG_I(PHY,"[SYNC TIME] Peak found at pos %u, val = %u, mean_val = %"PRIu64"\n",peak_pos,peak_val,mean_val); return(peak_pos); } - } -static inline int64_t abs64(int64_t x) -{ - return (((int64_t)((int32_t*)&x)[0])*((int64_t)((int32_t*)&x)[0]) + ((int64_t) -((int32_t*)&x)[1])*((int64_t)((int32_t*)&x)[1])); +static inline int64_t abs64(int64_t x) { + return (((int64_t)((int32_t *)&x)[0])*((int64_t)((int32_t *)&x)[0]) + ((int64_t) + ((int32_t *)&x)[1])*((int64_t)((int32_t *)&x)[1])); } int ru_sync_time(RU_t *ru, int64_t *lev, - int64_t *avg) -{ + int64_t *avg) { LTE_DL_FRAME_PARMS *frame_parms = ru->frame_parms; RU_CALIBRATION *calibration = &ru->calibration; - // perform a time domain correlation using the oversampled sync sequence - int length = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti; - // circular copy of beginning to end of rxdata buffer. Note: buffer should be big enough upon calling this function - for (int ar=0;arnb_rx;ar++) memcpy((void*)&ru->common.rxdata[ar][2*length], - (void*)&ru->common.rxdata[ar][0], - frame_parms->ofdm_symbol_size); - + for (int ar=0; arnb_rx; ar++) + memcpy((void *)&ru->common.rxdata[ar][2*length], + (void *)&ru->common.rxdata[ar][0], + frame_parms->ofdm_symbol_size); + int32_t maxlev0=0; int maxpos0=0; int64_t avg0=0; int64_t result; int64_t dmrs_corr; - int maxval=0; - for (int i=0;i<2*(frame_parms->ofdm_symbol_size);i++) { + + for (int i=0; i<2*(frame_parms->ofdm_symbol_size); i++) { maxval = max(maxval,ru->dmrssync[i]); maxval = max(maxval,-ru->dmrssync[i]); } if (ru->state == RU_CHECK_SYNC) { - for (int i=0;i<2*(frame_parms->ofdm_symbol_size);i++) { - maxval = max(maxval,calibration->drs_ch_estimates_time[0][i]); - maxval = max(maxval,-calibration->drs_ch_estimates_time[0][i]); - } + for (int i=0; i<2*(frame_parms->ofdm_symbol_size); i++) { + maxval = max(maxval,calibration->drs_ch_estimates_time[0][i]); + maxval = max(maxval,-calibration->drs_ch_estimates_time[0][i]); + } } int shift = log2_approx(maxval); for (int n=0; nnb_rx; ar++) { - result = dot_product64(ru->dmrssync, - (int16_t*) &ru->common.rxdata[ar][n], - frame_parms->ofdm_symbol_size, - shift); - - if (ru->state == RU_CHECK_SYNC) { - result = dot_product64((int16_t*) &calibration->drs_ch_estimates_time[ar], - (int16_t*) &ru->common.rxdata[ar][n], + (int16_t *) &ru->common.rxdata[ar][n], frame_parms->ofdm_symbol_size, shift); + + if (ru->state == RU_CHECK_SYNC) { + result = dot_product64((int16_t *) &calibration->drs_ch_estimates_time[ar], + (int16_t *) &ru->common.rxdata[ar][n], + frame_parms->ofdm_symbol_size, + shift); } + dmrs_corr += abs64(result); } - if (ru->dmrs_corr != NULL) ru->dmrs_corr[n] = dmrs_corr; + + if (ru->dmrs_corr != NULL) + ru->dmrs_corr[n] = dmrs_corr; // tmpi holds ++...+ + if (dmrs_corr>maxlev0) { + maxlev0 = dmrs_corr; + maxpos0 = n; + } - if (dmrs_corr>maxlev0) { maxlev0 = dmrs_corr; maxpos0 = n; } avg0 += dmrs_corr; } - avg0/=(length/4); + avg0/=(length/4); int dmrsoffset = frame_parms->samples_per_tti + (3*frame_parms->ofdm_symbol_size)+(3*frame_parms->nb_prefix_samples) + frame_parms->nb_prefix_samples0; - - if ((int64_t)maxlev0 > (10*avg0)) {*lev = maxlev0; *avg=avg0; return((length+maxpos0-dmrsoffset)%length);} + + if ((int64_t)maxlev0 > (10*avg0)) { + *lev = maxlev0; + *avg=avg0; + return((length+maxpos0-dmrsoffset)%length); + } return(-1); } diff --git a/openair1/PHY/LTE_REFSIG/primary_synch.h b/openair1/PHY/LTE_REFSIG/primary_synch.h index 8152722df3..7a69222ddd 100644 --- a/openair1/PHY/LTE_REFSIG/primary_synch.h +++ b/openair1/PHY/LTE_REFSIG/primary_synch.h @@ -18,7 +18,6 @@ * For more information about the OpenAirInterface (OAI) Software Alliance: * contact@openairinterface.org */ - 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}; diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index acd22bc78d..4aa21b47e8 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -153,7 +153,6 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, int16_t **chest_t; int16_t **chest_f; int16_t *pusch_llr; - int32_t *pusch_comp; int32_t *pucch1_comp; int32_t *pucch1_thres; int32_t *pucch1ab_comp; @@ -189,7 +188,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, chest_t = (int16_t **) phy_vars_enb->srs_vars[UE_id].srs_ch_estimates; chest_f = (int16_t **) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates; pusch_llr = (int16_t *) phy_vars_enb->pusch_vars[UE_id]->llr; - pusch_comp = (int32_t *) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[0]; + int16_t *pusch_comp= (int16_t *) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[0]; pucch1_comp = (int32_t *) phy_vars_enb->pucch1_stats[UE_id]; pucch1_thres = (int32_t *) phy_vars_enb->pucch1_stats_thres[UE_id]; pucch1ab_comp = (int32_t *) phy_vars_enb->pucch1ab_stats[UE_id]; @@ -684,7 +683,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, if (frame_parms->N_RB_DL != 100) { fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","",""); } else { - LOG_D(PHY,"UE PDCCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); + LOG_D(HW,"UE PDCCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); } } @@ -698,7 +697,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, if (frame_parms->N_RB_DL != 100) { fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); } else { - LOG_D(PHY,"UE PDCCH COMP plot is bugged in 20 MHz BW, to be fixed !!!\n"); + LOG_D(HW,"UE PDCCH COMP plot is bugged in 20 MHz BW, to be fixed !!!\n"); } } @@ -714,7 +713,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, if (frame_parms->N_RB_DL != 100) { fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","",""); } else { - LOG_D(PHY,"UE PDSCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); + LOG_D(HW,"UE PDSCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); } } diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index db7ac3d813..4c68c15cb6 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -44,6 +44,11 @@ struct complex { double y; }; +struct complexd { + double r; + double i; +}; + struct complexf { float r; float i; diff --git a/openair1/PHY/phy_extern.h b/openair1/PHY/phy_extern.h index 165ed961b3..4ba5e328e3 100644 --- a/openair1/PHY/phy_extern.h +++ b/openair1/PHY/phy_extern.h @@ -48,12 +48,6 @@ extern short primary_synch2[144]; extern unsigned char primary_synch0_tab[72]; extern unsigned char primary_synch1_tab[72]; extern unsigned char primary_synch2_tab[72]; -extern int16_t *primary_synch0_time; //!< index: [0..ofdm_symbol_size*2[ -extern int16_t *primary_synch1_time; //!< index: [0..ofdm_symbol_size*2[ -extern int16_t *primary_synch2_time; //!< index: [0..ofdm_symbol_size*2[ -extern int *sync_corr_ue0; //!< index [0..10*samples_per_tti[ -extern int *sync_corr_ue1; //!< index [0..10*samples_per_tti[ -extern int *sync_corr_ue2; //!< index [0..10*samples_per_tti[ extern int flagMag; //extern short **txdataF_rep_tmp; diff --git a/openair1/PHY/phy_extern_nr_ue.h b/openair1/PHY/phy_extern_nr_ue.h index 700419c61c..f1704a7902 100644 --- a/openair1/PHY/phy_extern_nr_ue.h +++ b/openair1/PHY/phy_extern_nr_ue.h @@ -55,9 +55,6 @@ extern unsigned char primary_synch2_tab[72]; extern int16_t *primary_synch0_time; //!< index: [0..ofdm_symbol_size*2[ extern int16_t *primary_synch1_time; //!< index: [0..ofdm_symbol_size*2[ extern int16_t *primary_synch2_time; //!< index: [0..ofdm_symbol_size*2[ -extern int *sync_corr_ue0; //!< index [0..10*samples_per_tti[ -extern int *sync_corr_ue1; //!< index [0..10*samples_per_tti[ -extern int *sync_corr_ue2; //!< index [0..10*samples_per_tti[ extern int flagMag; //extern short **txdataF_rep_tmp; diff --git a/openair1/PHY/phy_extern_ue.h b/openair1/PHY/phy_extern_ue.h index 622551c2fe..fdaf6eaa89 100644 --- a/openair1/PHY/phy_extern_ue.h +++ b/openair1/PHY/phy_extern_ue.h @@ -47,12 +47,6 @@ extern short primary_synch2[144]; extern unsigned char primary_synch0_tab[72]; extern unsigned char primary_synch1_tab[72]; extern unsigned char primary_synch2_tab[72]; -extern int16_t *primary_synch0_time; //!< index: [0..ofdm_symbol_size*2[ -extern int16_t *primary_synch1_time; //!< index: [0..ofdm_symbol_size*2[ -extern int16_t *primary_synch2_time; //!< index: [0..ofdm_symbol_size*2[ -extern int *sync_corr_ue0; //!< index [0..10*samples_per_tti[ -extern int *sync_corr_ue1; //!< index [0..10*samples_per_tti[ -extern int *sync_corr_ue2; //!< index [0..10*samples_per_tti[ extern int flagMag; //extern short **txdataF_rep_tmp; diff --git a/openair1/PHY/phy_vars.h b/openair1/PHY/phy_vars.h index 5e2be8bd8f..dadb1649ec 100644 --- a/openair1/PHY/phy_vars.h +++ b/openair1/PHY/phy_vars.h @@ -33,9 +33,6 @@ char* namepointer_log2; #include "PHY/LTE_REFSIG/primary_synch.h" -int16_t *primary_synch0_time; -int16_t *primary_synch1_time; -int16_t *primary_synch2_time; #include "PHY/LTE_TRANSPORT/transport_vars.h" diff --git a/openair1/PHY/phy_vars_ue.h b/openair1/PHY/phy_vars_ue.h index e90c2641aa..469a5c4754 100644 --- a/openair1/PHY/phy_vars_ue.h +++ b/openair1/PHY/phy_vars_ue.h @@ -33,9 +33,6 @@ char *namepointer_log2; #include "PHY/LTE_REFSIG/primary_synch.h" -int16_t *primary_synch0_time; -int16_t *primary_synch1_time; -int16_t *primary_synch2_time; PHY_VARS_UE ***PHY_vars_UE_g; diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 608827cc7a..1f4f01b141 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -175,7 +175,7 @@ void prepare_scc(NR_ServingCellConfigCommon_t *scc) { scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble = CALLOC(1,sizeof(long)); scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->p0_NominalWithGrant = CALLOC(1,sizeof(long)); - scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon = CALLOC(1,sizeof(struct NR_SetupRelease_PUCCH_ConfigCommon)); + scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon = CALLOC(1,sizeof(*scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon)); scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->present= NR_SetupRelease_PUCCH_ConfigCommon_PR_setup; scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup = CALLOC(1,sizeof(struct NR_PUCCH_ConfigCommon)); scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->p0_nominal = CALLOC(1,sizeof(long)); @@ -297,7 +297,7 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) { void prepare_scd(NR_ServingCellConfig_t *scd) { // Allocate downlink structures - scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(scd->downlinkBWP_ToAddModList)); + scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->downlinkBWP_ToAddModList)); // Downlink bandwidth part NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); @@ -318,14 +318,14 @@ void prepare_scd(NR_ServingCellConfig_t *scd) { NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup; NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup)); NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup; - NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->frequencyDensity)); + AssertFatal( NULL!= (NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity))), ""); int *dl_rbs[2]; for (int i=0;i<2;i++) { dl_rbs[i] = CALLOC(1, sizeof(*dl_rbs[i])); *dl_rbs[i] = 0; ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, dl_rbs[i]); } - NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->timeDensity)); + NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity)); int *dl_mcs[3]; for (int i=0;i<3;i++) { dl_mcs[i] = CALLOC(1, sizeof(*dl_mcs[i])); diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 781347abaa..71f91a67ec 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -337,7 +337,8 @@ config_sib2(int Mod_idP, LTE_ARFCN_ValueEUTRA_t *ul_CArrierFreqP, long *ul_BandwidthP, LTE_AdditionalSpectrumEmission_t *additionalSpectrumEmissionP, - struct LTE_MBSFN_SubframeConfigList *mbsfn_SubframeConfigListP) { + struct LTE_MBSFN_SubframeConfigList *mbsfn_SubframeConfigListP, + int dl_Bandwidth) { nfapi_config_request_t *cfg = &RC.mac[Mod_idP]->config[CC_idP]; cfg->subframe_config.pb.value = radioResourceConfigCommonP->pdsch_ConfigCommon.p_b; cfg->subframe_config.pb.tl.tag = NFAPI_SUBFRAME_CONFIG_PB_TAG; @@ -345,7 +346,7 @@ config_sib2(int Mod_idP, cfg->rf_config.reference_signal_power.value = radioResourceConfigCommonP->pdsch_ConfigCommon.referenceSignalPower; cfg->rf_config.reference_signal_power.tl.tag = NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG; cfg->num_tlv++; - cfg->nfapi_config.max_transmit_power.value = cfg->rf_config.reference_signal_power.value + power_off_dB[cfg->rf_config.dl_channel_bandwidth.value]; + cfg->nfapi_config.max_transmit_power.value = cfg->rf_config.reference_signal_power.value + power_off_dB[dl_Bandwidth]; cfg->nfapi_config.max_transmit_power.tl.tag = NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG; cfg->num_tlv++; cfg->prach_config.configuration_index.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.prach_ConfigIndex; @@ -870,7 +871,8 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP, config_sib2(Mod_idP, CC_idP, radioResourceConfigCommon, radioResourceConfigCommon_BR, NULL, ul_Bandwidth, additionalSpectrumEmission, - mbsfn_SubframeConfigList); + mbsfn_SubframeConfigList, + mib->message.dl_Bandwidth); } // mib != NULL if (mobilityControlInfo !=NULL) { diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index f3a77ed703..1272b16ec0 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -84,7 +84,7 @@ get_mbsfn_sf_alloction(module_id_t module_idP, uint8_t CC_id, static uint32_t bytes_in_buffer=0; static uint32_t msi_pmch_stop=0; -uint16_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047}; +rb_id_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047}; static uint32_t msi_sfs=0; diff --git a/openair2/LAYER2/MAC/mac_extern.h b/openair2/LAYER2/MAC/mac_extern.h index cee6066a9e..2df2428c45 100644 --- a/openair2/LAYER2/MAC/mac_extern.h +++ b/openair2/LAYER2/MAC/mac_extern.h @@ -65,6 +65,7 @@ extern const int cqi_to_mcs[16]; extern uint32_t RRC_CONNECTION_FLAG; extern uint8_t rb_table[34]; +extern rb_id_t mbms_rab_id; #if defined(PRE_SCD_THREAD) diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 0dedacb11f..9ae8f82a00 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -72,7 +72,7 @@ extern UL_IND_t *UL_INFO; extern int next_ra_frame; extern module_id_t next_Mod_id; -int mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047}; +rb_id_t mbms_rab_id=2047;//[8] = {2047,2047,2047,2047,2047,2047,2047,2047}; static int mbms_mch_i=0; //static int num_msi_per_CSA[28]; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index 687d7b1bfe..59a10a86e2 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -78,7 +78,6 @@ extern int nas_sock_fd[MAX_MOBILES_PER_ENB]; extern int nas_sock_mbms_fd; -extern int mbms_rab_id; extern struct msghdr nas_msg_tx; @@ -113,8 +112,6 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) { * PDCP packet to pick the right socket below */ int rb_id = pdcpHead->rb_id; - int sizeToWrite= sizeof (pdcp_data_ind_header_t) + - pdcpHead->data_size; void * pdcpData=(void*)(pdcpHead+1); if (rb_id == 10) { //hardcoded for PC5-Signaling if( LOG_DEBUGFLAG(DEBUG_PDCP) ) { @@ -128,24 +125,25 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) { } else if (UE_NAS_USE_TUN) { //ret = write(nas_sock_fd[pdcpHead->inst], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite ); if(rb_id == mbms_rab_id){ - ret = write(nas_sock_mbms_fd, pdcpData,sizeToWrite ); + ret = write(nas_sock_mbms_fd, pdcpData, pdcpHead->data_size ); LOG_I(PDCP,"[PDCP_FIFOS] ret %d TRIED TO PUSH MBMS DATA TO rb_id %d handle %d sizeToWrite %d\n", - ret,rb_id,nas_sock_fd[pdcpHead->inst],sizeToWrite); + ret,rb_id,nas_sock_fd[pdcpHead->inst],pdcpHead->data_size); } else { if( LOG_DEBUGFLAG(DEBUG_PDCP) ) - log_dump(PDCP, pdcpData, sizeToWrite, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n"); - ret = write(nas_sock_fd[pdcpHead->inst], pdcpData,sizeToWrite ); + log_dump(PDCP, pdcpData, pdcpHead->data_size, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n"); + ret = write(nas_sock_fd[pdcpHead->inst], pdcpData,pdcpHead->data_size ); LOG_T(PDCP,"[UE PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n", - ret,rb_id,nas_sock_fd[pdcpHead->inst],sizeToWrite); + ret,rb_id,nas_sock_fd[pdcpHead->inst],pdcpHead->data_size); } } else if (ENB_NAS_USE_TUN) { if( LOG_DEBUGFLAG(DEBUG_PDCP) ) - log_dump(PDCP, pdcpData, sizeToWrite, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n"); - ret = write(nas_sock_fd[0], pdcpData, sizeToWrite); - LOG_T(PDCP,"[NB PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[0],sizeToWrite); + log_dump(PDCP, pdcpData, pdcpHead->data_size, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n"); + ret = write(nas_sock_fd[0], pdcpData, pdcpHead->data_size); + LOG_T(PDCP,"[NB PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[0],pdcpHead->data_size); } else if (PDCP_USE_NETLINK) { + int sizeToWrite= sizeof (pdcp_data_ind_header_t) + pdcpHead->data_size; memcpy(NLMSG_DATA(nas_nlh_tx), (uint8_t *) pdcpHead, sizeToWrite); nas_nlh_tx->nlmsg_len = sizeToWrite; ret = sendmsg(nas_sock_fd[0],&nas_msg_tx,0); @@ -154,7 +152,7 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) { AssertFatal(ret >= 0,"[PDCP_FIFOS] pdcp_fifo_flush_sdus (errno: %d %s), nas_sock_fd[0]: %d\n", errno, strerror(errno), nas_sock_fd[0]); if( LOG_DEBUGFLAG(DEBUG_PDCP) ) - log_dump(PDCP, pdcpData, min(sizeToWrite,30) , LOG_DUMP_CHAR, + log_dump(PDCP, pdcpData, min(pdcpHead->data_size,30) , LOG_DUMP_CHAR, "Printing first bytes of PDCP SDU before removing it from the list: \n"); delNotifiedFIFO_elt (sdu_p); pdcp_nb_sdu_sent ++; @@ -384,6 +382,7 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ, 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 1 ); len = recvmsg(nas_sock_fd[0], &nas_msg_rx, 0); + printf("recev: %d\n", len); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 0 ); if (len > 0) { diff --git a/openair2/RRC/LTE/plmn_data.h b/openair2/RRC/LTE/plmn_data.h index 97dc94343b..1b80ee9d7b 100644 --- a/openair2/RRC/LTE/plmn_data.h +++ b/openair2/RRC/LTE/plmn_data.h @@ -2231,7 +2231,7 @@ static const plmn_data_t plmn_data[] = { /* 310 900 Mid-Rivers Communications Mid-Rivers Wireless Operational */ - {310, 910, "Verizon Wireless", "Verizon USA"} + {310, 910, "Verizon Wireless", "Verizon USA"}, /* 310 920 Get Mobile Inactive 310 930 Copper Valley Wireless Inactive @@ -2295,6 +2295,7 @@ static const plmn_data_t plmn_data[] = { 648 4 Econet Wireless Econet Operational */ + {0,0,"",""} }; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 2e6f148e00..99f2695d92 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -56,6 +56,8 @@ //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all +#include + #include "PHY/phy_vars.h" #include "SCHED/sched_common_vars.h" #include "LAYER2/MAC/mac_vars.h" diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 407756e20f..f97aa596f7 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -181,8 +181,7 @@ PHY_VARS_UE *init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, uint8_t abstraction_flag) { - PHY_VARS_UE *ue = (PHY_VARS_UE *)malloc(sizeof(PHY_VARS_UE)); - memset(ue,0,sizeof(PHY_VARS_UE)); + PHY_VARS_UE *ue = (PHY_VARS_UE *)calloc(1,sizeof(PHY_VARS_UE)); if (frame_parms!=(LTE_DL_FRAME_PARMS *)NULL) { // if we want to give initial frame parms, allocate the PHY_VARS_UE structure and put them in memcpy(&(ue->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); From 1af7e716e646c9d37f60b32084a132b29a7af0f4 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Fri, 26 Mar 2021 09:46:30 +0000 Subject: [PATCH 088/125] Fix mac sdu len calculation for CCCH and skip invalid CCCH1 messages for being processed --- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index c6a741cce9..48204fc394 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -237,9 +237,29 @@ void nr_process_mac_pdu( case UL_SCH_LCID_SRB3: // todo break; + case UL_SCH_LCID_CCCH: case UL_SCH_LCID_CCCH1: + // fixed length mac_subheader_len = 1; + + if ( rx_lcid == UL_SCH_LCID_CCCH1 ) { + // RRCResumeRequest1 message includes the full I-RNTI and has a size of 8 bytes + mac_sdu_len = 8; + + // FIXME: Need to handle properly MAC PDU with all 00's + //[MAC] nr_process_mac_pdu() residual mac pdu length < 0!, pdu_len: -2 + //[MAC] MAC PDU 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + if (pdu_len != 9) { + //LOG_E(MAC, "%s() Invalid CCCH1 message!, pdu_len: %d\n", __func__, pdu_len); + return; + } + + } else { + // fixed length of 6 bytes + mac_sdu_len = 6; + } + nr_mac_rrc_data_ind(module_idP, CC_id, frameP, @@ -248,7 +268,7 @@ void nr_process_mac_pdu( rnti, CCCH, pdu_ptr+mac_subheader_len, - pdu_len-mac_subheader_len, + mac_sdu_len, 0); break; From 1a93c759c803e82cdc0608b675805dad02c5fe7f Mon Sep 17 00:00:00 2001 From: frtabu Date: Fri, 26 Mar 2021 12:14:32 +0100 Subject: [PATCH 089/125] fix cppcheck error --- common/utils/telnetsrv/telnetsrv.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c index 5a1fefbf3d..8ed8c791f4 100644 --- a/common/utils/telnetsrv/telnetsrv.c +++ b/common/utils/telnetsrv/telnetsrv.c @@ -461,12 +461,12 @@ int process_command(char *buf) { int i,j,k; char modulename[TELNET_CMD_MAXSIZE]; char cmd[TELNET_CMD_MAXSIZE]; - char cmdb[TELNET_MAX_MSGLENGTH]; + char *cmdb=NULL; char *bufbck; int rt; memset(modulename,0,sizeof(modulename)); memset(cmd,0,sizeof(cmd)); - memset(cmdb,0,sizeof(cmdb)); + if (strncasecmp(buf,"ex",2) == 0) return CMDSTATUS_EXIT; @@ -490,12 +490,10 @@ int process_command(char *buf) { return CMDSTATUS_FOUND; } - memset(modulename,0,sizeof(modulename)); - memset(cmd,0,sizeof(cmd)); - memset(cmdb,0,sizeof(cmdb)); + bufbck=strdup(buf); rt=CMDSTATUS_NOTFOUND; - j = sscanf(buf,"%19s %19s %[^\t\n]",modulename,cmd,cmdb); + j = sscanf(buf,"%19s %19s %m[^\t\n]",modulename,cmd,&cmdb); if (telnetparams.telnetdbg > 0) printf("process_command: %i words, module=%s cmd=%s, parameters= %s\n",j,modulename,cmd,cmdb); @@ -562,7 +560,7 @@ int process_command(char *buf) { rt= CMDSTATUS_FOUND; } /* loop */ } /* for i */ - + free(cmdb); free(bufbck); return rt; } From 364ea7685f251a82fc9100a45bf384f14a48aa59 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Fri, 26 Mar 2021 14:07:10 +0100 Subject: [PATCH 090/125] fix warings --- openair1/PHY/LTE_REFSIG/lte_gold.c | 6 +- openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c | 4 +- openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c | 2 +- openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c | 2 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 2 +- openair1/PHY/NR_REFSIG/dmrs_nr.c | 2 +- openair1/SIMULATION/TOOLS/random_channel.c | 898 ++++++++++-------- 7 files changed, 489 insertions(+), 427 deletions(-) diff --git a/openair1/PHY/LTE_REFSIG/lte_gold.c b/openair1/PHY/LTE_REFSIG/lte_gold.c index c5e48d8364..596760541b 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold.c @@ -56,7 +56,7 @@ void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14] (((1+(Nid_cell<<1))*(1 + (((frame_parms->Ncp==0)?4:3)*l) + (7*(1+ns))))<<10); //cinit //x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit //n = 0 - x1 = 1+ (1<<31); + x1 = 1+ (1U<<31); x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); // skip first 50 double words (1600 bits) @@ -103,7 +103,7 @@ void lte_gold_ue_spec(uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_ //x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit //n = 0 // printf("cinit (ns %d, l %d) => %d\n",ns,l,x2); - x1 = 1+ (1<<31); + x1 = 1+ (1U<<31); x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); // skip first 50 double words (1600 bits) @@ -143,7 +143,7 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_ //x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit //n = 0 //printf("cinit (ns %d, l %d) => %d\n",ns,l,x2); - x1 = 1+ (1<<31); + x1 = 1+ (1U<<31); x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); //skip first 50 double words (1600 bits) diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c index b057f6a403..78f0fd93fe 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c @@ -59,7 +59,7 @@ void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_tabl //n = 0 // printf("cinit (sfn %d, l %d) => %d\n",sfn,l,x2); // Initializing the Sequence - x1 = 1+ (1<<31); + x1 = 1+ (1U<<31); x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); // skip first 50 double words (1600 bits) // printf("n=0 : x1 %x, x2 %x\n",x1,x2); @@ -90,7 +90,7 @@ void lte_gold_mbsfn_khz_1dot25(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold for (sfn=0; sfn<10; sfn++) { x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + (7*(1+sfn))))<<9); //cinit - x1 = 1+ (1<<31); + x1 = 1+ (1U<<31); x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); for (n=1; n<50; n++) { diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c index d48164e07d..b03f59fb78 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c @@ -121,7 +121,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, for (n=0; n<(1+(G>>5)); n++) { #ifdef DEBUG_SCRAMBLING - for (int k=0; k<32; k++) printf("scrambling %d : %d xor %d = %d\n",k+(n<<5),e[k],(s>>k)&1,e[k]^((s>>k)&1)); + for (int k=0; k<32; k++) printf("scrambling %d : %x xor %x = %d\n",k+(n<<5),e[k],(s>>k)&1,e[k]^((s>>k)&1)); #endif e[0] = (e[0]) ^ (s&1); diff --git a/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c b/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c index b249052cbf..a23f8db4f2 100644 --- a/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c +++ b/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c @@ -41,7 +41,7 @@ extern inline uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t res { // Init value for x1: x1(0) = 1, x1(n) = 0, n=1,2,...,30 // x1(31) = [x1(3) + x1(0)]mod2 = 1 - *x1 = 1 + (1<<31); + *x1 = 1 + (1U<<31); // Init value for x2: cinit = sum_{i=0}^30 x2*2^i // x2(31) = [x2(3) + x2(2) + x2(1) + x2(0)]mod2 // = (*x2>>3) ^ (*x2>>2) + (*x2>>1) + *x2 diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 92fe777201..476d7028b1 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -374,7 +374,7 @@ static inline unsigned int lte_gold_unscram(unsigned int *x1, unsigned int *x2, int n; if (reset) { - *x1 = 1+ (1<<31); + *x1 = 1+ (1U<<31); *x2=*x2 ^ ((*x2 ^ (*x2>>1) ^ (*x2>>2) ^ (*x2>>3))<<31); // skip first 50 double words (1600 bits) diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c index 03a37e2b27..2e270318f8 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.c +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c @@ -150,7 +150,7 @@ void pseudo_random_sequence_optimised(unsigned int size, uint32_t *c, uint32_t c unsigned int n,x1,x2; /* init of m-sequences */ - x1 = 1+ (1<<31); + x1 = 1+ (1U<<31); x2 = cinit; x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 9171b6c067..484119f409 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -50,7 +50,7 @@ static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt) static telnetshell_cmddef_t channelmod_cmdarray[] = { {"help","",channelmod_print_help}, {"show","",channelmod_show_cmd}, - {"modify"," ",channelmod_modify_cmd}, + {"modify"," ",channelmod_modify_cmd}, {"","",NULL}, }; @@ -62,7 +62,7 @@ static double snr_dB=25; static double sinr_dB=0; static unsigned int max_chan; static channel_desc_t **defined_channels; -static char modellist_name[MAX_OPTNAME_SIZE]={0}; +static char modellist_name[MAX_OPTNAME_SIZE]= {0}; void fill_channel_desc(channel_desc_t *chan_desc, @@ -71,7 +71,7 @@ void fill_channel_desc(channel_desc_t *chan_desc, uint8_t nb_taps, uint8_t channel_length, double *amps, - double *delays, + double *delays, struct complex **R_sqrt, double Td, double sampling_rate, @@ -139,8 +139,10 @@ void fill_channel_desc(channel_desc_t *chan_desc, if (R_sqrt == NULL) { chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_NTAPS ; + for (i = 0; iR_sqrt[i] = (struct complex *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex)); + chan_desc->R_sqrt[i] = (struct complex *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex)); + for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; @@ -148,7 +150,7 @@ void fill_channel_desc(channel_desc_t *chan_desc, } } else { chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *)); - + for (i = 0; iR_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex)); //chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0]; @@ -178,218 +180,228 @@ void fill_channel_desc(channel_desc_t *chan_desc, double mbsfn_delays[] = {0,.03,.15,.31,.37,1.09,12.490,12.52,12.64,12.80,12.86,13.58,27.49,27.52,27.64,27.80,27.86,28.58}; double mbsfn_amps_dB[] = {0,-1.5,-1.4,-3.6,-0.6,-7.0,-10,-11.5,-11.4,-13.6,-10.6,-17.0,-20,-21.5,-21.4,-23.6,-20.6,-27}; -double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250}; +double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250}; double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62}; double tdl_a_delays[] = {0.0000, - 0.3819, - 0.4025, - 0.5868, - 0.4610, - 0.5375, - 0.6708, - 0.5750, - 0.7618, - 1.5375, - 1.8978, - 2.2242, - 2.1718, - 2.4942, - 2.5119, - 3.0582, - 4.0810, - 4.4579, - 4.5695, - 4.7966, - 5.0066, - 5.3043, - 9.6586}; + 0.3819, + 0.4025, + 0.5868, + 0.4610, + 0.5375, + 0.6708, + 0.5750, + 0.7618, + 1.5375, + 1.8978, + 2.2242, + 2.1718, + 2.4942, + 2.5119, + 3.0582, + 4.0810, + 4.4579, + 4.5695, + 4.7966, + 5.0066, + 5.3043, + 9.6586 + }; double tdl_a_amps_dB[] = {-13.4, - 0, - -2.2, - -4, - -6, - -8.2, - -9.9, - -10.5, - -7.5, - -15.9, - -6.6, - -16.7, - -12.4, - -15.2, - -10.8, - -11.3, - -12.7, - -16.2, - -18.3, - -18.9, - -16.6, - -19.9, - -29.7}; + 0, + -2.2, + -4, + -6, + -8.2, + -9.9, + -10.5, + -7.5, + -15.9, + -6.6, + -16.7, + -12.4, + -15.2, + -10.8, + -11.3, + -12.7, + -16.2, + -18.3, + -18.9, + -16.6, + -19.9, + -29.7 + }; double tdl_b_delays[] = {0.0000, - 0.1072, - 0.2155, - 0.2095, - 0.2870, - 0.2986, - 0.3752, - 0.5055, - 0.3681, - 0.3697, - 0.5700, - 0.5283, - 1.1021, - 1.2756, - 1.5474, - 1.7842, - 2.0169, - 2.8294, - 3.0219, - 3.6187, - 4.1067, - 4.2790, - 4.7834}; + 0.1072, + 0.2155, + 0.2095, + 0.2870, + 0.2986, + 0.3752, + 0.5055, + 0.3681, + 0.3697, + 0.5700, + 0.5283, + 1.1021, + 1.2756, + 1.5474, + 1.7842, + 2.0169, + 2.8294, + 3.0219, + 3.6187, + 4.1067, + 4.2790, + 4.7834 + }; double tdl_b_amps_dB[] = {0, - -2.2, - -4, - -3.2, - -9.8, - -1.2, - -3.4, - -5.2, - -7.6, - -3, - -8.9, - -9, - -4.8, - -5.7, - -7.5, - -1.9, - -7.6, - -12.2, - -9.8, - -11.4, - -14.9, - -9.2, - -11.3}; + -2.2, + -4, + -3.2, + -9.8, + -1.2, + -3.4, + -5.2, + -7.6, + -3, + -8.9, + -9, + -4.8, + -5.7, + -7.5, + -1.9, + -7.6, + -12.2, + -9.8, + -11.4, + -14.9, + -9.2, + -11.3 + }; double tdl_c_delays[] = {0, - 0.2099, - 0.2219, - 0.2329, - 0.2176, - 0.6366, - 0.6448, - 0.6560, - 0.6584, - 0.7935, - 0.8213, - 0.9336, - 1.2285, - 1.3083, - 2.1704, - 2.7105, - 4.2589, - 4.6003, - 5.4902, - 5.6077, - 6.3065, - 6.6374, - 7.0427, - 8.6523}; + 0.2099, + 0.2219, + 0.2329, + 0.2176, + 0.6366, + 0.6448, + 0.6560, + 0.6584, + 0.7935, + 0.8213, + 0.9336, + 1.2285, + 1.3083, + 2.1704, + 2.7105, + 4.2589, + 4.6003, + 5.4902, + 5.6077, + 6.3065, + 6.6374, + 7.0427, + 8.6523 + }; double tdl_c_amps_dB[] = {-4.4, - -1.2, - -3.5, - -5.2, - -2.5, - 0, - -2.2, - -3.9, - -7.4, - -7.1, - -10.7, - -11.1, - -5.1, - -6.8, - -8.7, - -13.2, - -13.9, - -13.9, - -15.8, - -17.1, - -16, - -15.7, - -21.6, - -22.8}; + -1.2, + -3.5, + -5.2, + -2.5, + 0, + -2.2, + -3.9, + -7.4, + -7.1, + -10.7, + -11.1, + -5.1, + -6.8, + -8.7, + -13.2, + -13.9, + -13.9, + -15.8, + -17.1, + -16, + -15.7, + -21.6, + -22.8 + }; double tdl_d_delays[] = {//0, - 0, - 0.035, - 0.612, - 1.363, - 1.405, - 1.804, - 2.596, - 1.775, - 4.042, - 7.937, - 9.424, - 9.708, - 12.525}; + 0, + 0.035, + 0.612, + 1.363, + 1.405, + 1.804, + 2.596, + 1.775, + 4.042, + 7.937, + 9.424, + 9.708, + 12.525 +}; double tdl_d_amps_dB[] = {//-0.2, -//-13.5, - -.00147, - -18.8, - -21, - -22.8, - -17.9, - -20.1, - -21.9, - -22.9, - -27.8, - -23.6, - -24.8, - -30.0, - -27.7}; + //-13.5, + -.00147, + -18.8, + -21, + -22.8, + -17.9, + -20.1, + -21.9, + -22.9, + -27.8, + -23.6, + -24.8, + -30.0, + -27.7 + }; #define TDL_D_RICEAN_FACTOR .046774 double tdl_e_delays[] = {0, - 0.5133, - 0.5440, - 0.5630, - 0.5440, - 0.7112, - 1.9092, - 1.9293, - 1.9589, - 2.6426, - 3.7136, - 5.4524, - 12.0034, - 20.6519}; + 0.5133, + 0.5440, + 0.5630, + 0.5440, + 0.7112, + 1.9092, + 1.9293, + 1.9589, + 2.6426, + 3.7136, + 5.4524, + 12.0034, + 20.6519 + }; double tdl_e_amps_dB[] = {//-0.03, - //-22.03, - -.00433, - -15.8, - -18.1, - -19.8, - -22.9, - -22.4, - -18.6, - -20.8, - -22.6, - -22.3, - -25.6, - -20.2, - -29.8, - -29.2}; + //-22.03, + -.00433, + -15.8, + -18.1, + -19.8, + -22.9, + -22.4, + -18.6, + -20.8, + -22.6, + -22.3, + -25.6, + -20.2, + -29.8, + -29.2 + }; #define TDL_E_RICEAN_FACTOR 0.0063096 @@ -492,33 +504,101 @@ struct complex *R_sqrt_22_EPA_medium[1] = {R_sqrt_22_EPA_medium_tap}; //Rayleigh1_orth_eff_ch_TM4 +void tdlModel(int tdl_paths, double *tdl_delays, double *tdl_amps_dB, double DS_TDL, channel_desc_t *chan_desc ) { + int nb_rx=chan_desc-> nb_rx; + int nb_tx=chan_desc-> nb_tx; + int tdl_pathsby3 = tdl_paths/3; + + if ((tdl_paths%3)>0) + tdl_pathsby3++; + + chan_desc->nb_taps = tdl_paths; + chan_desc->Td = tdl_delays[tdl_paths-1]*DS_TDL; + printf("last path (%d) at %f * %e = %e\n",tdl_paths-1,tdl_delays[tdl_paths-1],DS_TDL,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)); + printf("TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d\n",chan_desc->sampling_rate,tdl_paths,chan_desc->Td,chan_desc->channel_length); + double sum_amps = 0; + chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); + + for (int i = 0; inb_taps; i++) { + chan_desc->amps[i] = pow(10,.1*tdl_amps_dB[i]); + sum_amps += chan_desc->amps[i]; + } + + for (int i = 0; inb_taps; i++) { + chan_desc->amps[i] /= sum_amps; + tdl_delays[i] *= DS_TDL; + } + + chan_desc->delays = tdl_delays; + chan_desc->aoa = 0; + chan_desc->random_aoa = 0; + chan_desc->ch = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *)); + chan_desc->chF = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *)); + chan_desc->a = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *)); + + for (int i = 0; ich[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex)); + + for (int i = 0; ichF[i] = (struct complex *) malloc(1200 * sizeof(struct complex)); + + for (int i = 0; inb_taps; i++) + chan_desc->a[i] = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex)); + + chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **)); + + if (nb_tx==2 && nb_rx==2) { + for (int i = 0; i<(tdl_pathsby3); i++) + chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0]; + } else if (nb_tx==2 && nb_rx==1) { + for (int i = 0; i<(tdl_pathsby3); i++) + chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0]; + } else if (nb_tx==1 && nb_rx==2) { + for (int i = 0; i<(tdl_pathsby3); i++) + chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0]; + } else { + for (int i = 0; i<(tdl_pathsby3); i++) { + chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); + + for (int j = 0; jR_sqrt[i][j].x = 1.0; + chan_desc->R_sqrt[i][j].y = 0.0; + } + + LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx); + } + } +} channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, uint8_t nb_rx, SCM_t channel_model, double sampling_rate, double channel_bandwidth, - double DS_TDL, + double DS_TDL, double forgetting_factor, int32_t channel_offset, double path_loss_dB, - float noise_power_dB) { + float noise_power_dB) { channel_desc_t *chan_desc = (channel_desc_t *)calloc(1,sizeof(channel_desc_t)); - for(int i=0; ichan_idx=i; - break; - } - else { - AssertFatal(i<(max_chan-1), - "No more channel descriptors available, increase channelmod.max_chan parameter above %u\n",max_chan); - } + + for(int i=0; ichan_idx=i; + break; + } else { + AssertFatal(i<(max_chan-1), + "No more channel descriptors available, increase channelmod.max_chan parameter above %u\n",max_chan); + } } + uint16_t i,j; double sum_amps; double aoa,ricean_factor,Td,maxDoppler; - int channel_length,nb_taps; chan_desc->modelid = channel_model; chan_desc->nb_tx = nb_tx; @@ -531,9 +611,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->first_run = 1; chan_desc->ip = 0.0; chan_desc->noise_power_dB = noise_power_dB; - LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model); - int tdl_paths=0; double *tdl_amps_dB; double *tdl_delays; @@ -556,7 +634,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, 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)); - chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -594,10 +673,11 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0]; } else { - chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ; + chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ; + for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); - + for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; @@ -617,6 +697,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, sum_amps = 0; chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -654,7 +735,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0]; } else { - chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ; + chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ; + for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); @@ -668,95 +750,41 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, } break; - -/* tapped delay line (TDL) channel model from TR 38.901 Section 7.7.2 */ + /* tapped delay line (TDL) channel model from TR 38.901 Section 7.7.2 */ #define tdl_m(MoDel)\ - DevAssert(sizeof(tdl_ ## MoDel ## _amps_dB) == sizeof(tdl_ ## MoDel ## _delays)); \ - tdl_paths=sizeof(tdl_ ## MoDel ## _amps_dB)/sizeof(*tdl_ ## MoDel ## _amps_dB);\ - tdl_delays=tdl_ ## MoDel ## _delays;\ - tdl_amps_dB=tdl_ ## MoDel ## _amps_dB + DevAssert(sizeof(tdl_ ## MoDel ## _amps_dB) == sizeof(tdl_ ## MoDel ## _delays)); \ + tdl_paths=sizeof(tdl_ ## MoDel ## _amps_dB)/sizeof(*tdl_ ## MoDel ## _amps_dB);\ + tdl_delays=tdl_ ## MoDel ## _delays;\ + tdl_amps_dB=tdl_ ## MoDel ## _amps_dB case TDL_A: - case TDL_B: - case TDL_C: - case TDL_D: - case TDL_E: chan_desc->ricean_factor = 1; - if (channel_model == TDL_A) { - tdl_m(a); - }else if (channel_model == TDL_B) { - tdl_m(b); - } - else if (channel_model == TDL_C) { - tdl_m(c); - } else if (channel_model == TDL_D) { - tdl_m(d); - chan_desc->ricean_factor = TDL_D_RICEAN_FACTOR; - } else if (channel_model == TDL_E) { - tdl_m(e); - chan_desc->ricean_factor = TDL_E_RICEAN_FACTOR; - } + tdl_m(a); + tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc); + break; - int tdl_pathsby3 = tdl_paths/3; - if ((tdl_paths%3)>0) tdl_pathsby3++; + case TDL_B: + chan_desc->ricean_factor = 1; + tdl_m(b); + tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc); + break; - chan_desc->nb_taps = tdl_paths; - chan_desc->Td = tdl_delays[tdl_paths-1]*DS_TDL; - printf("last path (%d) at %f * %e = %e\n",tdl_paths-1,tdl_delays[tdl_paths-1],DS_TDL,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)); - printf("TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d\n",chan_desc->sampling_rate,tdl_paths,chan_desc->Td,chan_desc->channel_length); - sum_amps = 0; - chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); + case TDL_C: + chan_desc->ricean_factor = 1; + tdl_m(c); + tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc); + break; - for (i = 0; inb_taps; i++) { - chan_desc->amps[i] = pow(10,.1*tdl_amps_dB[i]); - sum_amps += chan_desc->amps[i]; - } - - for (i = 0; inb_taps; i++) { - chan_desc->amps[i] /= sum_amps; - tdl_delays[i] *= DS_TDL; - } - chan_desc->delays = tdl_delays; - chan_desc->aoa = 0; - chan_desc->random_aoa = 0; - chan_desc->ch = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *)); - chan_desc->chF = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *)); - chan_desc->a = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *)); - - for (i = 0; ich[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex)); - - for (i = 0; ichF[i] = (struct complex *) malloc(1200 * sizeof(struct complex)); - - for (i = 0; inb_taps; i++) - chan_desc->a[i] = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex)); - - chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **)); - - if (nb_tx==2 && nb_rx==2) { - for (i = 0; i<(tdl_pathsby3); i++) - chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0]; - } else if (nb_tx==2 && nb_rx==1) { - for (i = 0; i<(tdl_pathsby3); i++) - chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0]; - } else if (nb_tx==1 && nb_rx==2) { - for (i = 0; i<(tdl_pathsby3); i++) - chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0]; - } else { - for (i = 0; i<(tdl_pathsby3); i++) { - chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); - - for (j = 0; jR_sqrt[i][j].x = 1.0; - chan_desc->R_sqrt[i][j].y = 0.0; - } - - LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx); - } - } + case TDL_D: + chan_desc->ricean_factor = TDL_D_RICEAN_FACTOR; + tdl_m(d); + tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc); + break; + case TDL_E: + chan_desc->ricean_factor = TDL_E_RICEAN_FACTOR; + tdl_m(e); + tdlModel(tdl_paths, tdl_delays, tdl_amps_dB, DS_TDL, chan_desc); break; case EPA: @@ -766,6 +794,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, sum_amps = 0; chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -784,7 +813,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, for (i = 0; ich[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex)); - + for (i = 0; ichF[i] = (struct complex *) malloc(1200 * sizeof(struct complex)); @@ -799,6 +828,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, } else { chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ; + for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); @@ -820,6 +850,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, sum_amps = 0; chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -865,7 +896,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n"); } }*/ - break; + break; case EPA_high: chan_desc->nb_taps = 7; @@ -874,6 +905,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, sum_amps = 0; chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -927,7 +959,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, 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)); - chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -982,6 +1015,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, sum_amps = 0; chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*eva_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -1015,7 +1049,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, } else { chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ; - for (i = 0; i<6; i++) { + + for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); for (j = 0; jamps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*etu_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -1069,6 +1105,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, } else { chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ; + for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); @@ -1090,6 +1127,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, sum_amps = 0; chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; + for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*mbsfn_amps_dB[i]); sum_amps += chan_desc->amps[i]; @@ -1117,6 +1155,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex *)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6; + for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); @@ -1628,13 +1667,14 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, return(chan_desc); } /* channel_desc_t *new_channel_desc_scm */ -channel_desc_t * find_channel_desc_fromname( char *modelname ) { - for(int i=0; imodel_name,modelname) == 0) - return defined_channels[i]; - } - } +channel_desc_t *find_channel_desc_fromname( char *modelname ) { + for(int i=0; imodel_name,modelname) == 0) + return defined_channels[i]; + } + } + LOG_E(OCM,"Model %s not found \n", modelname); return NULL; } /* channel_desc_t * new_channel_desc_fromconfig */ @@ -1643,41 +1683,48 @@ channel_desc_t * find_channel_desc_fromname( char *modelname ) { void free_channel_desc_scm(channel_desc_t *ch) { // Must be made cleanly, a lot of leaks... - defined_channels[ch->chan_idx]=NULL; + defined_channels[ch->chan_idx]=NULL; + if(ch->free_flags&CHANMODEL_FREE_AMPS) free(ch->amps); - for (int i = 0; inb_tx*ch->nb_rx; i++) { + + for (int i = 0; inb_tx*ch->nb_rx; i++) { free(ch->ch[i]); free(ch->chF[i]); } - + for (int i = 0; inb_taps; i++) { - free(ch->a[i]); - } + free(ch->a[i]); + } + if(ch->free_flags&CHANMODEL_FREE_DELAY) - free(ch->delays); + free(ch->delays); + if(ch->free_flags&CHANMODEL_FREE_RSQRT_6) - for (int i = 0; i<6; i++) - free(ch->R_sqrt[i]); + for (int i = 0; i<6; i++) + free(ch->R_sqrt[i]); + if(ch->free_flags&CHANMODEL_FREE_RSQRT_NTAPS) - for (int i = 0; inb_taps;i++) - free(ch->R_sqrt[i]); - free(ch->R_sqrt); - free(ch->ch); + for (int i = 0; inb_taps; i++) + free(ch->R_sqrt[i]); + + free(ch->R_sqrt); + free(ch->ch); free(ch->chF); free(ch->a); free(ch->model_name); - free(ch); + free(ch); } void set_channeldesc_owner(channel_desc_t *cdesc, uint32_t module_id) { - cdesc->module_id=module_id; + cdesc->module_id=module_id; } void set_channeldesc_name(channel_desc_t *cdesc,char *modelname) { - if(cdesc->model_name != NULL) - free(cdesc->model_name); - cdesc->model_name=strdup(modelname); + if(cdesc->model_name != NULL) + free(cdesc->model_name); + + cdesc->model_name=strdup(modelname); } int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) { @@ -1798,14 +1845,14 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) { 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; - // printf("l %d : desc->ch.x %f, s %e, delay %f\n",l,desc->a[l][aarx+(aatx*desc->nb_rx)].x,s,desc->delays[l]); + // printf("l %d : desc->ch.x %f, s %e, delay %f\n",l,desc->a[l][aarx+(aatx*desc->nb_rx)].x,s,desc->delays[l]); } //nb_taps #ifdef DEBUG_CH printf("(%d,%d,%d)->(%e,%e)\n",k,aarx,aatx,desc->ch[aarx+(aatx*desc->nb_rx)][k].x,desc->ch[aarx+(aatx*desc->nb_rx)][k].y); #endif } //channel_length - } + } } //aatx } //aarx @@ -1817,7 +1864,7 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) { return (0); } - + double N_RB2sampling_rate(uint16_t N_RB) { double sampling_rate; @@ -1869,127 +1916,141 @@ double N_RB2channel_bandwidth(uint16_t N_RB) { LOG_E(OCM,"Unknown N_PRB\n"); return(-1); } - return(channel_bandwidth); -} - + return(channel_bandwidth); +} + + static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt ) { - prnt("channelmod commands can be used to display or modify channel models parameters\n"); - prnt("channelmod show predef: display predefined model algorithms available in oai\n"); - prnt("channelmod show current: display the currently used models in the running executable\n"); - prnt("channelmod modify : set the specified parameters in a current model to the given value\n"); - prnt(" specifies the model, the show current model command can be used to list the current models indexes\n"); - prnt(" can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"noise_power_dB\", \"offset\", \"forgetf\"\n"); - return CMDSTATUS_FOUND; + prnt("channelmod commands can be used to display or modify channel models parameters\n"); + prnt("channelmod show predef: display predefined model algorithms available in oai\n"); + prnt("channelmod show current: display the currently used models in the running executable\n"); + prnt("channelmod modify : set the specified parameters in a current model to the given value\n"); + prnt(" specifies the model, the show current model command can be used to list the current models indexes\n"); + prnt(" can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"noise_power_dB\", \"offset\", \"forgetf\"\n"); + return CMDSTATUS_FOUND; } static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) { - char *module_id_str[]=MODULEID_STR_INIT; - prnt("model owner: %s\n",(cd->module_id != 0)?module_id_str[cd->module_id]:"not set"); - prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate); - prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n", - cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No")); - prnt("max Doppler: %lf path loss: %lf noise: %lf rchannel offset: %i forget factor; %lf\n", - cd->max_Doppler, cd->path_loss_dB, cd->noise_power_dB, cd->channel_offset, cd->forgetting_factor); - prnt("Initial phase: %lf nb_path: %i \n", - cd->ip, cd->nb_paths); - for (int i=0; inb_taps ; i++) { - prnt("taps: %i lin. ampli. : %lf delay: %lf \n",i,cd->amps[i], cd->delays[i]); - } + char *module_id_str[]=MODULEID_STR_INIT; + prnt("model owner: %s\n",(cd->module_id != 0)?module_id_str[cd->module_id]:"not set"); + prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate); + prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n", + cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No")); + prnt("max Doppler: %lf path loss: %lf noise: %lf rchannel offset: %i forget factor; %lf\n", + cd->max_Doppler, cd->path_loss_dB, cd->noise_power_dB, cd->channel_offset, cd->forgetting_factor); + prnt("Initial phase: %lf nb_path: %i \n", + cd->ip, cd->nb_paths); + + for (int i=0; inb_taps ; i++) { + prnt("taps: %i lin. ampli. : %lf delay: %lf \n",i,cd->amps[i], cd->delays[i]); + } } - - + + static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt) { - char *subcmd=NULL; + char *subcmd=NULL; int s = sscanf(buff,"%ms\n",&subcmd); if (s>0) { if ( strcmp(subcmd,"predef") == 0) { for (int i=0; channelmod_names[i].name != NULL ; i++) { prnt(" %i %s\n", i, map_int_to_str(channelmod_names,i )); - } + } } else if ( strcmp(subcmd,"current") == 0) { for (int i=0; i < max_chan ; i++) { - if (defined_channels[i] != NULL) { - prnt("model %i %s type %s: \n----------------\n", i, (defined_channels[i]->model_name !=NULL)?defined_channels[i]->model_name:"(no name set)", - map_int_to_str(channelmod_names,defined_channels[i]->modelid)); - display_channelmodel(defined_channels[i],debug,prnt); + if (defined_channels[i] != NULL) { + prnt("model %i %s type %s: \n----------------\n", i, (defined_channels[i]->model_name !=NULL)?defined_channels[i]->model_name:"(no name set)", + map_int_to_str(channelmod_names,defined_channels[i]->modelid)); + display_channelmodel(defined_channels[i],debug,prnt); } } } else { - channelmod_print_help(buff, debug, prnt); + channelmod_print_help(buff, debug, prnt); } - free(subcmd); + + free(subcmd); } + return CMDSTATUS_FOUND; } - + static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt) { - char *param=NULL, *value=NULL; + char *param=NULL, *value=NULL; int cd_id= -1; int s = sscanf(buff,"%i %ms %ms \n",&cd_id,¶m, &value); + if (cd_id<0 || cd_id >= max_chan) { - prnt("ERROR, %i: Channel model id outof range (0-%i)\n",cd_id,max_chan-1); - return CMDSTATUS_FOUND; + prnt("ERROR, %i: Channel model id outof range (0-%i)\n",cd_id,max_chan-1); + return CMDSTATUS_FOUND; } + if (defined_channels[cd_id]==NULL) { - prnt("ERROR, %i: Channel model has not been set\n",cd_id); - return CMDSTATUS_FOUND; - } - + prnt("ERROR, %i: Channel model has not been set\n",cd_id); + return CMDSTATUS_FOUND; + } + if (s==3) { if ( strcmp(param,"riceanf") == 0) { - double dbl = atof(value); - if (dbl <0 || dbl > 1) - prnt("ERROR: ricean factor range: 0 to 1, %lf is outof range\n",dbl); - else - defined_channels[cd_id]->ricean_factor=dbl; + double dbl = atof(value); + + if (dbl <0 || dbl > 1) + prnt("ERROR: ricean factor range: 0 to 1, %lf is outof range\n",dbl); + else + defined_channels[cd_id]->ricean_factor=dbl; } else if ( strcmp(param,"aoa") == 0) { - double dbl = atof(value); - if (dbl <0 || dbl >6.28) - prnt("ERROR: angle of arrival range: 0 to 2*Pi, %lf is outof range\n",dbl); - else - defined_channels[cd_id]->aoa=dbl; + double dbl = atof(value); + + if (dbl <0 || dbl >6.28) + prnt("ERROR: angle of arrival range: 0 to 2*Pi, %lf is outof range\n",dbl); + else + defined_channels[cd_id]->aoa=dbl; } else if ( strcmp(param,"randaoa") == 0) { - int i = atoi(value); - if (i!=0 && i!=1) - prnt("ERROR: randaoa is a boolean, must be 0 or 1\n"); - else - defined_channels[cd_id]->random_aoa=i; + int i = atoi(value); + + if (i!=0 && i!=1) + prnt("ERROR: randaoa is a boolean, must be 0 or 1\n"); + else + defined_channels[cd_id]->random_aoa=i; } else if ( strcmp(param,"ploss") == 0) { - double dbl = atof(value); - defined_channels[cd_id]->path_loss_dB=dbl; + double dbl = atof(value); + defined_channels[cd_id]->path_loss_dB=dbl; } else if ( strcmp(param,"noise_power_dB") == 0) { double dbl = atof(value); defined_channels[cd_id]->noise_power_dB=dbl; } else if ( strcmp(param,"offset") == 0) { - int i = atoi(value); - defined_channels[cd_id]->channel_offset=i; + int i = atoi(value); + defined_channels[cd_id]->channel_offset=i; } else if ( strcmp(param,"forgetf") == 0) { - double dbl = atof(value); - if (dbl <0 || dbl > 1) - prnt("ERROR: forgetting factor range: 0 to 1 (disable variation), %lf is outof range\n",dbl); - else - defined_channels[cd_id]->forgetting_factor=dbl; + double dbl = atof(value); + + if (dbl <0 || dbl > 1) + prnt("ERROR: forgetting factor range: 0 to 1 (disable variation), %lf is outof range\n",dbl); + else + defined_channels[cd_id]->forgetting_factor=dbl; } else { - prnt("ERROR: %s, unknown channel parameter\n",param); - return CMDSTATUS_FOUND; + prnt("ERROR: %s, unknown channel parameter\n",param); + return CMDSTATUS_FOUND; } - display_channelmodel(defined_channels[cd_id],debug,prnt); - free(param); - free(value); - random_channel(defined_channels[cd_id],false); + + display_channelmodel(defined_channels[cd_id],debug,prnt); + free(param); + free(value); + random_channel(defined_channels[cd_id],false); } - return CMDSTATUS_FOUND; + + return CMDSTATUS_FOUND; } - -int modelid_fromstrtype(char *modeltype) { - int modelid=map_str_to_int(channelmod_names,modeltype); - if (modelid < 0) + +int modelid_fromstrtype(char *modeltype) { + int modelid=map_str_to_int(channelmod_names,modeltype); + + if (modelid < 0) LOG_E(OCM,"random_channel.c: Error channel model %s unknown\n",modeltype); + return modelid; } @@ -2003,13 +2064,11 @@ double channelmod_get_sinr_dB(void) { void init_channelmod(void) { paramdef_t channelmod_params[] = CHANNELMOD_PARAMS_DESC; - int numparams=sizeof(channelmod_params)/sizeof(paramdef_t); int ret = config_get( channelmod_params,numparams,CHANNELMOD_SECTION); AssertFatal(ret >= 0, "configuration couldn't be performed"); - defined_channels=calloc(max_chan,sizeof( channel_desc_t*)); + defined_channels=calloc(max_chan,sizeof( channel_desc_t *)); AssertFatal(defined_channels!=NULL, "couldn't allocate %u channel descriptors\n",max_chan); - /* look for telnet server, if it is loaded, add the channel modeling commands to it */ add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME); @@ -2024,37 +2083,40 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double paramlist_def_t channel_list; memset(&channel_list,0,sizeof(paramlist_def_t)); memcpy(channel_list.listname,modellist_name,sizeof(channel_list.listname)-1); - int numparams = sizeof(achannel_params)/sizeof(paramdef_t); config_getlist( &channel_list,achannel_params,numparams, CHANNELMOD_SECTION); AssertFatal(channel_list.numelt>0, "List %s.%s not found in config file\n",CHANNELMOD_SECTION,channel_list.listname); - int pindex_NAME = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_NAME_PNAME); + int pindex_NAME = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_NAME_PNAME); int pindex_DT = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_DT_PNAME ); int pindex_FF = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_FF_PNAME ); int pindex_CO = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_CO_PNAME ); int pindex_PL = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_PL_PNAME ); int pindex_NP = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_NP_PNAME ); int pindex_TYPE = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_TYPE_PNAME); - - for (int i=0; imodel_name = strdup(*(channel_list.paramarray[i][pindex_NAME].strptr)); - LOG_I(OCM,"Model %s type %s allocated from config file, list %s\n",*(channel_list.paramarray[i][pindex_NAME].strptr), - *(channel_list.paramarray[i][pindex_TYPE].strptr), modellist_name); + *(channel_list.paramarray[i][pindex_DT].dblptr), *(channel_list.paramarray[i][pindex_FF].dblptr), + *(channel_list.paramarray[i][pindex_CO].iptr), *(channel_list.paramarray[i][pindex_PL].dblptr), + *(channel_list.paramarray[i][pindex_NP].dblptr) ); + AssertFatal( (channeldesc_p!= NULL), "Could not allocate channel %s type %s \n",*(channel_list.paramarray[i][pindex_NAME].strptr), *(channel_list.paramarray[i][pindex_TYPE].strptr)); + channeldesc_p->model_name = strdup(*(channel_list.paramarray[i][pindex_NAME].strptr)); + LOG_I(OCM,"Model %s type %s allocated from config file, list %s\n",*(channel_list.paramarray[i][pindex_NAME].strptr), + *(channel_list.paramarray[i][pindex_TYPE].strptr), modellist_name); } /* for loop on channel_list */ + return channel_list.numelt; } /* load_channelist */ From fbf39eecc17a621efa56232acc36b2fac956d211 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Fri, 26 Mar 2021 16:32:20 +0100 Subject: [PATCH 091/125] cppcheck fixes --- common/utils/backtrace.c | 2 +- nfapi/oai_integration/nfapi_pnf.c | 4 +- nfapi/open-nFAPI/common/src/debug.c | 152 +++++++++--------- nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp | 4 +- .../PHY/LTE_UE_TRANSPORT/srs_modulation.c | 1 + openair2/ENB_APP/flexran_agent_common.c | 12 -- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 1 - .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 2 +- targets/RT/USER/lte-ru.c | 1 - 10 files changed, 84 insertions(+), 97 deletions(-) diff --git a/common/utils/backtrace.c b/common/utils/backtrace.c index f6de74f156..f61cf0349a 100644 --- a/common/utils/backtrace.c +++ b/common/utils/backtrace.c @@ -38,7 +38,7 @@ void display_backtrace(void) { size_t i; char *test=getenv("NO_BACKTRACE"); - if (test!=0) *((int *)0)=0; + if (test!=0) abort(); size = backtrace(array, 10); strings = backtrace_symbols(array, size); diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c index 4ca02ed929..9b550cf7d8 100644 --- a/nfapi/oai_integration/nfapi_pnf.c +++ b/nfapi/oai_integration/nfapi_pnf.c @@ -2199,7 +2199,7 @@ void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_add pnf.phys[0].udp.tx_port = vnf_p7_port; strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr); strcpy(pnf.phys[0].local_addr, pnf_ip_addr); - printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n", + printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%u rx:%u]\n", __FUNCTION__,config->vnf_ip_addr, config->vnf_p5_port, pnf.phys[0].local_addr, pnf.phys[0].udp.tx_addr, pnf.phys[0].udp.tx_port, @@ -2250,7 +2250,7 @@ void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, pnf.phys[0].udp.tx_port = vnf_p7_port; strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr); strcpy(pnf.phys[0].local_addr, pnf_ip_addr); - printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n", + printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%u rx:%u]\n", __FUNCTION__, config->vnf_ip_addr, config->vnf_p5_port, pnf.phys[0].local_addr, diff --git a/nfapi/open-nFAPI/common/src/debug.c b/nfapi/open-nFAPI/common/src/debug.c index a45d41d7d7..f53be43223 100644 --- a/nfapi/open-nFAPI/common/src/debug.c +++ b/nfapi/open-nFAPI/common/src/debug.c @@ -1,76 +1,76 @@ -/* - * Copyright 2017 Cisco Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define MAX_MSG_LENGTH 2096 -#define TRACE_HEADER_LENGTH 44 - -void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...); - -// initialize the trace function to 0 -void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg; - -nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO; -//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN; - -void nfapi_set_trace_level(nfapi_trace_level_t new_level) -{ - nfapi_trace_level_g = new_level; -} - -void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...) -{ - char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH]; - uint32_t num_chars; - va_list p_args; - struct timeval tv; - pthread_t tid = pthread_self(); - - (void)gettimeofday(&tv, NULL); - - num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid); - - if (num_chars > TRACE_HEADER_LENGTH) - { - printf("trace_dbg: Error, num_chars is too large: %d", num_chars); - return; - } - - va_start(p_args, format); - if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args))) - { - if (level <= NFAPI_TRACE_WARN) - { - printf("%s", trace_buff); - } - printf("%s", trace_buff); - } - va_end(p_args); -} +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define MAX_MSG_LENGTH 2096 +#define TRACE_HEADER_LENGTH 44 + +void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...); + +// initialize the trace function to 0 +void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg; + +nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO; +//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN; + +void nfapi_set_trace_level(nfapi_trace_level_t new_level) +{ + nfapi_trace_level_g = new_level; +} + +void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...) +{ + char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH]; + uint32_t num_chars; + va_list p_args; + struct timeval tv; + pthread_t tid = pthread_self(); + + (void)gettimeofday(&tv, NULL); + + num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid); + + if (num_chars > TRACE_HEADER_LENGTH) + { + printf("trace_dbg: Error, num_chars is too large: %u", num_chars); + return; + } + + va_start(p_args, format); + if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args))) + { + if (level <= NFAPI_TRACE_WARN) + { + printf("%s", trace_buff); + } + printf("%s", trace_buff); + } + va_end(p_args); +} diff --git a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp index 1c2f0bef80..4fe5065cea 100644 --- a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp +++ b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp @@ -278,7 +278,7 @@ void *fapi_thread_start(void *ptr) { if(instance->tick == 1000) { if(instance->tx_byte_count > 0) { - printf("[FAPI] Tx rate %d bytes/sec\n", instance->tx_byte_count); + printf("[FAPI] Tx rate %u bytes/sec\n", instance->tx_byte_count); instance->tx_byte_count = 0; } @@ -319,7 +319,7 @@ void *fapi_thread_start(void *ptr) { millisec = now_ts.tv_nsec / 1e6; if(last_millisec != -1 && ((last_millisec + 1 ) % 1000) != millisec) { - printf("*** missing millisec %d %d\n", last_millisec, millisec); + printf("*** missing millisec %u %u\n", last_millisec, millisec); catchup = millisec - last_millisec - 1; } diff --git a/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c b/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c index e6960273c7..9c0edb467c 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c @@ -170,6 +170,7 @@ int32_t generate_srs(LTE_DL_FRAME_PARMS *frame_parms, Msc_RS = msrsb * 6; k0 = ( ( (int16_t)(frame_parms->N_RB_UL>>1) - (int16_t)(msrs0>>1) ) * 12 ) + kTC; + AssertFatal(msrsb,"divide by 0"); nb = (4*n_RRC/msrsb)%Nb; for (b=0; b<=Bsrs; b++) { diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c index abb5b57e0c..1af59eab87 100644 --- a/openair2/ENB_APP/flexran_agent_common.c +++ b/openair2/ENB_APP/flexran_agent_common.c @@ -648,18 +648,6 @@ error: * ************************************ */ -int sort_ue_config(const void *a, const void *b) { - const Protocol__FlexUeConfig *fa = a; - const Protocol__FlexUeConfig *fb = b; - - if (fa->rnti < fb->rnti) - return -1; - else if (fa->rnti < fb->rnti) - return 1; - - return 0; -} - int flexran_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { xid_t xid; Protocol__FlexHeader *header = NULL; diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index cdeb23c099..ca74eab0c5 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -1010,7 +1010,7 @@ int get_format0(uint8_t index, uint8_t unpaired, frequency_range_t frequency_range){ - uint16_t format; + uint16_t format=0; if (unpaired) { if (frequency_range==FR1) format = table_6_3_3_2_3_prachConfig_Index[index][0]; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 3f69cfbe74..c948b01726 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -247,7 +247,6 @@ void schedule_control_sib1(module_id_t module_id, gNB_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->search_space)); gNB_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->active_bwp)); gNB_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->coreset)); - gNB_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->active_bwp)); fill_default_searchSpaceZero(gNB_mac->sched_ctrlCommon->search_space); fill_default_coresetZero(gNB_mac->sched_ctrlCommon->coreset,servingcellconfigcommon); fill_default_initialDownlinkBWP(gNB_mac->sched_ctrlCommon->active_bwp,servingcellconfigcommon); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 247a7e2c45..90fe651ac1 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -654,7 +654,7 @@ int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, int Mod_idP, int UE_i //returns the measured RSRP value (upper limit) int get_measured_rsrp(uint8_t index) { //if index is invalid returning minimum rsrp -140 - if((index >= 0 && index <= 15) || index >= 114) + if(index <= 15 || index >= 114) return MIN_RSRP_VALUE; return L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[index]; diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 368fd78f9e..4682c5989e 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -869,7 +869,6 @@ static void *ru_thread_asynch_rxtx( void *param ) { LOG_I(PHY, "devices ok (ru_thread_asynch_rxtx)\n"); while (!oai_exit) { - if (oai_exit) break; if (ru->state != RU_RUN) { subframe=0; From 774b8d9a9f994ae03c869ed4af90e4769ed1a207 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 26 Mar 2021 16:54:34 +0000 Subject: [PATCH 092/125] Fix TA in CFRA --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 5 ++--- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 13 ++++++------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 6473741076..cf106184dd 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1816,9 +1816,8 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, // MAC CE case DL_SCH_LCID_CCCH: - // MSG4 RRC Connection Setup 38.331 + // MSG4 RRC Setup 38.331 // variable length - if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){ mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8) | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff); @@ -1828,7 +1827,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, mac_subheader_len = 2; } - if ( mac_sdu_len > 0) { + if ( mac_sdu_len > 0 ) { LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d: bits\n", mac_sdu_len); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 48204fc394..8b75abca74 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -247,14 +247,11 @@ void nr_process_mac_pdu( // RRCResumeRequest1 message includes the full I-RNTI and has a size of 8 bytes mac_sdu_len = 8; - // FIXME: Need to handle properly MAC PDU with all 00's - //[MAC] nr_process_mac_pdu() residual mac pdu length < 0!, pdu_len: -2 - //[MAC] MAC PDU 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // Check if it is a valid CCCH1 message, we get all 00's messages very often if (pdu_len != 9) { //LOG_E(MAC, "%s() Invalid CCCH1 message!, pdu_len: %d\n", __func__, pdu_len); return; } - } else { // fixed length of 6 bytes mac_sdu_len = 6; @@ -525,8 +522,13 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, current_rnti); continue; } + const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->secondaryCellGroup); UE_info->UE_beam_index[UE_id] = ra->beam_id; + + // re-initialize ta update variables after RA procedure completion + UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; + LOG_I(NR_MAC, "[gNB %d][RAPROC] PUSCH with TC-RNTI %x received correctly, " "adding UE MAC Context UE_id %d/RNTI %04x\n", @@ -555,9 +557,6 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, // First byte corresponds to R/LCID MAC sub-header memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6); - // re-initialize ta update variables afrer RA procedure completion - UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; - nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP); ra->state = Msg4; From 8e89ab002239d34f4b3e0f8eb55c5998ef66822f Mon Sep 17 00:00:00 2001 From: rmagueta Date: Sat, 27 Mar 2021 23:46:37 +0000 Subject: [PATCH 093/125] Fix Msg4 Ack at gNB and pdsch_to_harq_feedback_time_ind at UE --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 4 ++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index cf106184dd..de4d51bc0e 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -748,7 +748,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr } /* PDSCH_TO_HARQ_FEEDBACK_TIME_IND (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI)*/ - dlsch_config_pdu_1_0->pdsch_to_harq_feedback_time_ind = dci->pdsch_to_harq_feedback_timing_indicator.val; + dlsch_config_pdu_1_0->pdsch_to_harq_feedback_time_ind = mac->ULbwp[mac->UL_BWP_Id-1]->bwp_Dedicated->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0]; LOG_D(MAC,"(nr_ue_procedures.c) rnti = %x dl_config->number_pdus = %d\n", dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti, @@ -1334,7 +1334,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, } //end else break; - + case NR_RNTI_P: /* // Short Messages Indicator  E2 bits diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 2b842dc968..73919447f5 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1096,7 +1096,6 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; - NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1; int UE_id = find_nr_UE_id(module_idP, ra->rnti); NR_UE_info_t *UE_info = &nr_mac->UE_info; @@ -1105,10 +1104,6 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0; - int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + nr_mix_slots; - int first_ul_slot_tdd = tdd->nrofDownlinkSlots + nr_slots_period * (slotP / nr_slots_period); - // HARQ management int8_t current_harq_pid = sched_ctrl->dl_harq_pid; if (current_harq_pid < 0) { @@ -1125,9 +1120,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra DevAssert(!harq->is_waiting); add_tail_nr_list(&sched_ctrl->feedback_dl_harq, current_harq_pid); harq->is_waiting = true; - harq->feedback_slot = first_ul_slot_tdd; ra->harq_pid = current_harq_pid; + nr_acknack_scheduling(module_idP, UE_id, frameP, slotP); + harq->feedback_slot = sched_ctrl->sched_pucch->ul_slot; + // Bytes to be transmitted uint8_t *buf = (uint8_t *) harq->tb; uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id); @@ -1397,9 +1394,9 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram { if (harq->round == 0) { + LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti); nr_clear_ra_proc(module_id, CC_id, frame, ra); UE_info->active[UE_id] = true; - LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti); } else { From 86d252ef92b53140fa0c46ba7aaa43ef14c58a91 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Sun, 28 Mar 2021 11:35:15 +0100 Subject: [PATCH 094/125] Revert LOG to pass CI tests for RA --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 8b75abca74..c0c04cbad1 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -529,6 +529,11 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, // re-initialize ta update variables after RA procedure completion UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; + LOG_I(NR_MAC, + "reset RA state information for RA-RNTI %04x/index %d\n", + ra->rnti, + i); + LOG_I(NR_MAC, "[gNB %d][RAPROC] PUSCH with TC-RNTI %x received correctly, " "adding UE MAC Context UE_id %d/RNTI %04x\n", From 1b427efaa13fb243e83e99799e09ea7af6fd95d5 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 29 Mar 2021 15:42:03 +0100 Subject: [PATCH 095/125] Revert LOG to pass CI tests for RA --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index c0c04cbad1..9f8cea9594 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -535,7 +535,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, i); LOG_I(NR_MAC, - "[gNB %d][RAPROC] PUSCH with TC-RNTI %x received correctly, " + "[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, " "adding UE MAC Context UE_id %d/RNTI %04x\n", gnb_mod_idP, current_rnti, From 80941b0c311905954c8f6818017df277cbbe537c Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 29 Mar 2021 16:43:55 +0100 Subject: [PATCH 096/125] Minor LOG improvements --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 29 +++++++++---------- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 3 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 8 ++--- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index a0ed18e135..f647a8585b 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2372,7 +2372,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t rnti = mac->crnti; } - // FIXME: To be removed +#ifdef DEBUG_RAR LOG_I(NR_MAC, "rarh->E = 0x%x\n", rarh->E); LOG_I(NR_MAC, "rarh->T = 0x%x\n", rarh->T); LOG_I(NR_MAC, "rarh->RAPID = 0x%x (%i)\n", rarh->RAPID, rarh->RAPID); @@ -2390,20 +2390,19 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t LOG_I(NR_MAC, "rar->TCRNTI_1 = 0x%x\n", rar->TCRNTI_1); LOG_I(NR_MAC, "rar->TCRNTI_2 = 0x%x\n", rar->TCRNTI_2); - //#ifdef DEBUG_RAR - LOG_I(NR_MAC, "In %s:[%d.%d]: [UE %d] Received RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d t_crnti %x \n", - __FUNCTION__, - frame, - slot, - mod_id, - rar_grant.Msg3_t_alloc, - rar_grant.Msg3_f_alloc, - ul_time_alignment->ta_command, - rar_grant.mcs, - rar_grant.freq_hopping, - tpc_command, - ra->t_crnti); - //#endif + LOG_I(NR_MAC, "In %s:[%d.%d]: [UE %d] Received RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d t_crnti %x \n", + __FUNCTION__, + frame, + slot, + mod_id, + rar_grant.Msg3_t_alloc, + rar_grant.Msg3_f_alloc, + ul_time_alignment->ta_command, + rar_grant.mcs, + rar_grant.freq_hopping, + tpc_command, + ra->t_crnti); +#endif // Schedule Msg3 ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, rar_grant.Msg3_t_alloc); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 73919447f5..629a644ebc 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1519,7 +1519,7 @@ void nr_fill_rar(uint8_t Mod_idP, rar->UL_GRANT_3 = (uint8_t) (ul_grant >> 8) & 0xff; rar->UL_GRANT_4 = (uint8_t) ul_grant & 0xff; - // FIXME: To be removed +#ifdef DEBUG_RAR //LOG_I(NR_MAC, "rarbi->E = 0x%x\n", rarbi->E); //LOG_I(NR_MAC, "rarbi->T = 0x%x\n", rarbi->T); //LOG_I(NR_MAC, "rarbi->R = 0x%x\n", rarbi->R); @@ -1541,6 +1541,7 @@ void nr_fill_rar(uint8_t Mod_idP, LOG_I(NR_MAC, "rar->TCRNTI_1 = 0x%x\n", rar->TCRNTI_1); LOG_I(NR_MAC, "rar->TCRNTI_2 = 0x%x\n", rar->TCRNTI_2); +#endif int mcs = (unsigned char) (rar->UL_GRANT_4 >> 4); // time alloc diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 98a14e34c8..a69f63365e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -249,7 +249,7 @@ void nr_process_mac_pdu( // Check if it is a valid CCCH1 message, we get all 00's messages very often if (pdu_len != 9) { - //LOG_E(MAC, "%s() Invalid CCCH1 message!, pdu_len: %d\n", __func__, pdu_len); + LOG_D(NR_MAC, "%s() Invalid CCCH1 message!, pdu_len: %d\n", __func__, pdu_len); return; } } else { @@ -517,7 +517,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, // random access pusch with TC-RNTI if (ra->rnti != current_rnti) { LOG_W(NR_MAC, - "expected TC-RNTI %04x to match current RNTI %04x\n", + "expected TC_RNTI %04x to match current RNTI %04x\n", ra->rnti, current_rnti); continue; @@ -554,7 +554,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, LOG_I(NR_MAC,"[RAPROC] RA-Msg3 received (sdu_lenP %d)\n",sdu_lenP); LOG_D(NR_MAC,"[RAPROC] Received Msg3:\n"); for (int k = 0; k < sdu_lenP; k++) { - LOG_I(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); + LOG_D(NR_MAC,"(%i): 0x%x\n",k,sduP[k]); } // UE Contention Resolution Identity @@ -567,7 +567,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, ra->state = Msg4; ra->Msg4_frame = ( frameP +2 ) % 1024; ra->Msg4_slot = 1; - LOG_I(MAC, "Scheduling RA-Msg4 for TC-RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot); + LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot); } return; From 56673386dc0d81a5d1b6b7ad2c0c53fd1a6c8bf7 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 29 Mar 2021 16:56:25 +0100 Subject: [PATCH 097/125] Skip invalid MAC CCCH messages for being processed at UE --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index f647a8585b..5a4aa4f409 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1827,6 +1827,12 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, mac_subheader_len = 2; } + // Check if it is a valid CCCH message, we get all 00's messages very often + if ( pdu_len != (mac_subheader_len+mac_sdu_len) ) { + LOG_D(NR_MAC, "%s() Invalid CCCH message!, pdu_len: %d\n", __func__, pdu_len); + return; + } + if ( mac_sdu_len > 0 ) { LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d: bits\n", mac_sdu_len); From f5022585d99b5dd7d12a7cabd4f5607554eddb88 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Mon, 29 Mar 2021 21:50:06 +0200 Subject: [PATCH 098/125] format astyle only --- openair1/PHY/TOOLS/lte_phy_scope.c | 3 +- openair1/PHY/TOOLS/lte_phy_scope_tm4.c | 1002 +++++++++++++----------- openair1/PHY/TOOLS/nr_phy_scope.c | 3 +- 3 files changed, 542 insertions(+), 466 deletions(-) diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index acd22bc78d..c18fbe4a3a 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -184,8 +184,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, chest_f_abs = (float *) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); llr = (float *) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero bit = malloc(coded_bits_per_codeword*sizeof(float)); - - rxsig_t = (int16_t**) phy_vars_enb->RU_list[0]->common.rxdata; + rxsig_t = (int16_t **) phy_vars_enb->RU_list[0]->common.rxdata; chest_t = (int16_t **) phy_vars_enb->srs_vars[UE_id].srs_ch_estimates; chest_f = (int16_t **) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates; pusch_llr = (int16_t *) phy_vars_enb->pusch_vars[UE_id]->llr; diff --git a/openair1/PHY/TOOLS/lte_phy_scope_tm4.c b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c index d44f8e325b..a9caf8713b 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope_tm4.c +++ b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c @@ -32,8 +32,7 @@ float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; float tput_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; float tput_ue_max[NUMBER_OF_UE_MAX] = {0}; -static void ia_receiver_on_off( FL_OBJECT *button, long arg) -{ +static void ia_receiver_on_off( FL_OBJECT *button, long arg) { if (fl_get_button(button)) { fl_set_object_label(button, "IA Receiver ON"); // PHY_vars_UE_g[0][0]->use_ia_receiver = 1; @@ -45,8 +44,7 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg) } } -static void dl_traffic_on_off( FL_OBJECT *button, long arg) -{ +static void dl_traffic_on_off( FL_OBJECT *button, long arg) { if (fl_get_button(button)) { fl_set_object_label(button, "DL Traffic ON"); otg_enabled = 1; @@ -58,9 +56,7 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg) } } -static void sic_receiver_on_off( FL_OBJECT *button, long arg) -{ - +static void sic_receiver_on_off( FL_OBJECT *button, long arg) { if (fl_get_button(button)) { fl_set_object_label(button, "SIC Receiver ON"); use_sic_receiver = 1; @@ -72,8 +68,7 @@ static void sic_receiver_on_off( FL_OBJECT *button, long arg) } } -FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) -{ +FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) { FL_OBJECT *obj; FD_lte_phy_scope_enb *fdui = fl_malloc( sizeof *fdui ); // Define form @@ -145,8 +140,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) void phy_scope_eNB(FD_lte_phy_scope_enb *form, PHY_VARS_eNB *phy_vars_enb, - int UE_id) -{ + int UE_id) { int eNB_id = 0; int i,i2,arx,atx,ind,k; LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->frame_parms; @@ -176,24 +170,27 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, int coded_bits_per_codeword = 0; uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2 int mcs = 0; + // choose max MCS to compute coded_bits_per_codeword if (phy_vars_enb->ulsch[UE_id]!=NULL) { for (harq_pid=0; harq_pid<3; harq_pid++) { mcs = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->mcs,mcs); } } + coded_bits_per_codeword = frame_parms->N_RB_UL*12*get_Qm(mcs)*frame_parms->symbols_per_tti; - chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); - llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero + chest_f_abs = (float *) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); + llr = (float *) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero bit = malloc(coded_bits_per_codeword*sizeof(float)); - rxsig_t = (int16_t**) phy_vars_enb->common_vars.rxdata[eNB_id]; - chest_t = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id]; - chest_f = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id]; - pusch_llr = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->llr; - pusch_comp = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0]; - pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id]; - pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id]; - pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id]; + rxsig_t = (int16_t **) phy_vars_enb->common_vars.rxdata[eNB_id]; + chest_t = (int16_t **) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id]; + chest_f = (int16_t **) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id]; + pusch_llr = (int16_t *) phy_vars_enb->pusch_vars[UE_id]->llr; + pusch_comp = (int16_t *) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0]; + pucch1_comp = (int32_t *) phy_vars_enb->pucch1_stats[UE_id]; + pucch1_thres = (int32_t *) phy_vars_enb->pucch1_stats_thres[UE_id]; + pucch1ab_comp = (int32_t *) phy_vars_enb->pucch1ab_stats[UE_id]; + // Received signal in time domain of receive antenna 0 if (rxsig_t != NULL) { if (rxsig_t[0] != NULL) { @@ -201,48 +198,61 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, rxsig_t_dB[0][i] = 10*log10(1.0+(float) ((rxsig_t[0][2*i])*(rxsig_t[0][2*i])+(rxsig_t[0][2*i+1])*(rxsig_t[0][2*i+1]))); time[i] = (float) i; } + fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","",""); } + for (arx=1; arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]); } } } + // Channel Impulse Response if (chest_t != NULL) { ymax = 0; + if (chest_t[0] !=NULL) { for (i=0; i<(frame_parms->ofdm_symbol_size); i++) { - i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size; - time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>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,time2,chest_t_abs[0],(frame_parms->ofdm_symbol_size),"","",""); } + for (arx=1; arxofdm_symbol_size>>3); i++) { 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]; } + fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]); fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT); } } + // Avoid flickering effect // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); fl_set_xyplot_ybounds(form->chest_t,0,ymax); } + // Channel Frequency Response if (chest_f != NULL) { ind = 0; + for (atx=0; atxchest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce); fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,3); fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR); fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","",""); + for (arx=1; arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); } + // other tx antennas if (nb_antennas_tx > 1) { if (nb_antennas_rx > 1) { @@ -279,17 +292,21 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, } } } + // PUSCH LLRs if (pusch_llr != NULL) { for (i=0; ipusch_llr,bit,llr,coded_bits_per_codeword,"","",""); } + // PUSCH I/Q of MF Output if (pusch_comp!=NULL) { ind=0; + for (k=0; ksymbols_per_tti; k++) { for (i=0; i<12*frame_parms->N_RB_UL; i++) { I[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i]; @@ -297,8 +314,10 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, ind++; } } + fl_set_xyplot_data(form->pusch_comp,I,Q,ind,"","",""); } + // PUSCH I/Q of MF Output if (pucch1ab_comp!=NULL) { for (ind=0; ind<10240; ind++) { @@ -308,6 +327,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, 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_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED); @@ -315,6 +335,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, fl_set_xyplot_xbounds(form->pucch_comp,-5000,5000); fl_set_xyplot_ybounds(form->pucch_comp1,0,80); } + // PUSCH Throughput memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) ); memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) ); @@ -329,509 +350,564 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, free(chest_f_abs); } -FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) -{ - FL_OBJECT *obj; - FD_lte_phy_scope_ue *fdui = fl_malloc( sizeof *fdui ); - // Define form - fdui->lte_phy_scope_ue = fl_bgn_form( FL_NO_BOX, 800, 1000 ); - // This the whole UI box - obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 1000, "" ); - fl_set_object_color( obj, FL_BLACK, FL_BLACK ); - // Received signal - fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" ); - 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); - // Time-domain channel response - fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" ); - fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED ); - fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color - // Frequency-domain channel response - fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" ); - fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED ); - fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color - fl_set_xyplot_ybounds( fdui->chest_f,30,70); - /* - // LLR of PBCH - fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" ); - fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN ); - fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color - fl_set_xyplot_symbolsize( fdui->pbch_llr,2); - fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR); - fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920); - // I/Q PBCH comp - fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" ); - fl_set_object_boxtype( fdui->pbch_comp, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pbch_comp, FL_BLACK, FL_GREEN ); - fl_set_object_lcolor( fdui->pbch_comp, FL_WHITE ); // Label color - fl_set_xyplot_symbolsize( fdui->pbch_comp,2); - fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100); - fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100); - // LLR of PDCCH - fdui->pdcch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)" ); - fl_set_object_boxtype( fdui->pdcch_llr, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pdcch_llr, FL_BLACK, FL_CYAN ); - fl_set_object_lcolor( fdui->pdcch_llr, FL_WHITE ); // Label color - fl_set_xyplot_symbolsize( fdui->pdcch_llr,2); - // I/Q PDCCH comp - fdui->pdcch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output" ); - fl_set_object_boxtype( fdui->pdcch_comp, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pdcch_comp, FL_BLACK, FL_CYAN ); - fl_set_object_lcolor( fdui->pdcch_comp, FL_WHITE ); // Label color - fl_set_xyplot_symbolsize( fdui->pdcch_comp,2); - fl_set_xyplot_xgrid( fdui->pdcch_llr,FL_GRID_MAJOR); - */ - int offset=240; - // LLR of PDSCH - fdui->pdsch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 500-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" ); - fl_set_object_boxtype( fdui->pdsch_llr, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pdsch_llr, FL_BLACK, FL_YELLOW ); - fl_set_object_lcolor( fdui->pdsch_llr, FL_WHITE ); // Label color - fl_set_xyplot_symbolsize( fdui->pdsch_llr,2); - fl_set_xyplot_xgrid( fdui->pdsch_llr,FL_GRID_MAJOR); - // I/Q PDSCH comp - fdui->pdsch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 500-offset, 240, 200, "PDSCH I/Q of MF Output" ); - fl_set_object_boxtype( fdui->pdsch_comp, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pdsch_comp, FL_BLACK, FL_YELLOW ); - fl_set_object_lcolor( fdui->pdsch_comp, FL_WHITE ); // Label color - fl_set_xyplot_symbolsize( fdui->pdsch_comp,2); - // LLR of PDSCH - fdui->pdsch_llr1 = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 720-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" ); - fl_set_object_boxtype( fdui->pdsch_llr1, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pdsch_llr1, FL_BLACK, FL_YELLOW ); - fl_set_object_lcolor( fdui->pdsch_llr1, FL_WHITE ); // Label color - fl_set_xyplot_symbolsize( fdui->pdsch_llr1,2); - fl_set_xyplot_xgrid( fdui->pdsch_llr1,FL_GRID_MAJOR); - // I/Q PDSCH comp - fdui->pdsch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 720-offset, 240, 200, "PDSCH I/Q of MF Output" ); - fl_set_object_boxtype( fdui->pdsch_comp1, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pdsch_comp1, FL_BLACK, FL_YELLOW ); - fl_set_object_lcolor( fdui->pdsch_comp1, FL_WHITE ); // Label color - fl_set_xyplot_symbolsize( fdui->pdsch_comp1,2); - /* - // Throughput on PDSCH - fdui->pdsch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]" ); - fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX ); - fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE ); - fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color - */ - // Generic UE Button - fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" ); - fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER ); - //use_sic_receiver = 0; - fl_set_button(fdui->button_0,0); - fl_set_object_label(fdui->button_0, "SIC Receiver OFF"); - fl_set_object_color(fdui->button_0, FL_RED, FL_RED); - fl_set_object_callback(fdui->button_0, sic_receiver_on_off, 0 ); - fl_hide_object(fdui->button_0); - - fl_end_form( ); - fdui->lte_phy_scope_ue->fdui = fdui; - return fdui; +FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) { + FL_OBJECT *obj; + FD_lte_phy_scope_ue *fdui = fl_malloc( sizeof *fdui ); + // Define form + fdui->lte_phy_scope_ue = fl_bgn_form( FL_NO_BOX, 800, 1000 ); + // This the whole UI box + obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 1000, "" ); + fl_set_object_color( obj, FL_BLACK, FL_BLACK ); + // Received signal + fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" ); + 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); + // Time-domain channel response + fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" ); + fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED ); + fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color + // Frequency-domain channel response + fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" ); + fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED ); + fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color + fl_set_xyplot_ybounds( fdui->chest_f,30,70); + /* + // LLR of PBCH + fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN ); + fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pbch_llr,2); + fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR); + fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920); + // I/Q PBCH comp + fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pbch_comp, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pbch_comp, FL_BLACK, FL_GREEN ); + fl_set_object_lcolor( fdui->pbch_comp, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pbch_comp,2); + fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100); + fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100); + // LLR of PDCCH + fdui->pdcch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pdcch_llr, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdcch_llr, FL_BLACK, FL_CYAN ); + fl_set_object_lcolor( fdui->pdcch_llr, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdcch_llr,2); + // I/Q PDCCH comp + fdui->pdcch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pdcch_comp, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdcch_comp, FL_BLACK, FL_CYAN ); + fl_set_object_lcolor( fdui->pdcch_comp, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdcch_comp,2); + fl_set_xyplot_xgrid( fdui->pdcch_llr,FL_GRID_MAJOR); + */ + int offset=240; + // LLR of PDSCH + fdui->pdsch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 500-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pdsch_llr, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_llr, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pdsch_llr, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdsch_llr,2); + fl_set_xyplot_xgrid( fdui->pdsch_llr,FL_GRID_MAJOR); + // I/Q PDSCH comp + fdui->pdsch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 500-offset, 240, 200, "PDSCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pdsch_comp, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_comp, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pdsch_comp, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdsch_comp,2); + // LLR of PDSCH + fdui->pdsch_llr1 = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 720-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pdsch_llr1, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_llr1, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pdsch_llr1, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdsch_llr1,2); + fl_set_xyplot_xgrid( fdui->pdsch_llr1,FL_GRID_MAJOR); + // I/Q PDSCH comp + fdui->pdsch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 720-offset, 240, 200, "PDSCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pdsch_comp1, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_comp1, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pdsch_comp1, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdsch_comp1,2); + /* + // Throughput on PDSCH + fdui->pdsch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]" ); + fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE ); + fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color + */ + // Generic UE Button + fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" ); + fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER ); + //use_sic_receiver = 0; + fl_set_button(fdui->button_0,0); + fl_set_object_label(fdui->button_0, "SIC Receiver OFF"); + fl_set_object_color(fdui->button_0, FL_RED, FL_RED); + fl_set_object_callback(fdui->button_0, sic_receiver_on_off, 0 ); + fl_hide_object(fdui->button_0); + fl_end_form( ); + fdui->lte_phy_scope_ue->fdui = fdui; + return fdui; } void phy_scope_UE(FD_lte_phy_scope_ue *form, PHY_VARS_UE *phy_vars_ue, int eNB_id, int UE_id, - uint8_t subframe) -{ - int i,arx,atx,ind,k; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; - int nsymb_ce = frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti; - uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; - uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_eNB; - int16_t **rxsig_t; - int16_t **chest_t; - int16_t **chest_f; - int16_t *pdsch_llr,*pdsch_llr1; - int16_t *pdsch_comp,*pdsch_comp1; - int16_t *pdsch_mag0,*pdsch_mag1,*pdsch_magb0,*pdsch_magb1; - int8_t *pdcch_llr; - int16_t *pdcch_comp; - int8_t *pbch_llr; - int16_t *pbch_comp; - float Re,Im,ymax=1; - int num_pdcch_symbols=3; - float *llr0, *bit0, *llr1, *bit1, *chest_f_abs, llr_pbch[1920], bit_pbch[1920], *llr_pdcch, *bit_pdcch; - float *I, *Q; - float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES]; - float **chest_t_abs; - float time[FRAME_LENGTH_COMPLEX_SAMPLES]; - float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; - int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx; - uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id]; - int coded_bits_per_codeword0=0,coded_bits_per_codeword1=1; - int mod0,mod1; - int mcs0 = 0; - int mcs1=0; - unsigned char harq_pid = 0; - int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0; - if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { - harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid; - if (harq_pid>=8) - return; - mcs0 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs; - // Button 0 - /* - if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { - // we are in TM5 - fl_show_object(form->button_0); - } - */ - } - fl_show_object(form->button_0); - if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) { - harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->current_harq_pid; - if (harq_pid>=8) - return; - mcs1 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->mcs; - } - if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) { - num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols; - } - // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); - if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { - mod0 = get_Qm(mcs0); - coded_bits_per_codeword0 = get_G(frame_parms, - phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - get_Qm(mcs0), - phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols, - frame, - subframe, - beamforming_mode); - } else { - coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); - mod0=0; - } - if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) { - mod1 = get_Qm(mcs1); - coded_bits_per_codeword1 = get_G(frame_parms, - phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even, - get_Qm(mcs1), - phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols, - frame, - subframe, - beamforming_mode); - } else { - coded_bits_per_codeword1 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); - mod1=0; - } - I = (float*) calloc(nsymb_ce*2,sizeof(float)); - Q = (float*) calloc(nsymb_ce*2,sizeof(float)); - chest_t_abs = (float**) malloc(nb_antennas_rx*sizeof(float*)); - for (arx=0;arxofdm_symbol_size,sizeof(float)); - } - chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); - //llr0 = (float*) calloc(coded_bits_per_codeword0,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error. - llr0 = (float*) malloc(coded_bits_per_codeword0*sizeof(float)); - memset((void *)llr0, 0,coded_bits_per_codeword0*sizeof(float)); // init to zero - bit0 = malloc(coded_bits_per_codeword0*sizeof(float)); + uint8_t subframe) { + int i,arx,atx,ind,k; + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; + int nsymb_ce = frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti; + uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; + uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_eNB; + int16_t **rxsig_t; + int16_t **chest_t; + int16_t **chest_f; + int16_t *pdsch_llr,*pdsch_llr1; + int16_t *pdsch_comp,*pdsch_comp1; + int16_t *pdsch_mag0,*pdsch_mag1,*pdsch_magb0,*pdsch_magb1; + int8_t *pdcch_llr; + int16_t *pdcch_comp; + int8_t *pbch_llr; + int16_t *pbch_comp; + float Re,Im,ymax=1; + int num_pdcch_symbols=3; + float *llr0, *bit0, *llr1, *bit1, *chest_f_abs, llr_pbch[1920], bit_pbch[1920], *llr_pdcch, *bit_pdcch; + float *I, *Q; + float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES]; + float **chest_t_abs; + float time[FRAME_LENGTH_COMPLEX_SAMPLES]; + float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; + int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx; + uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id]; + int coded_bits_per_codeword0=0,coded_bits_per_codeword1=1; + int mod0,mod1; + int mcs0 = 0; + int mcs1=0; + unsigned char harq_pid = 0; + int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0; - //llr1 = (float*) calloc(coded_bits_per_codeword1,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error. - llr1 = (float*) malloc(coded_bits_per_codeword1*sizeof(float)); - memset((void *)llr1, 0,coded_bits_per_codeword1*sizeof(float)); // init to zero - bit1 = malloc(coded_bits_per_codeword1*sizeof(float)); - llr_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero - bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); - rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata; - chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id]; - chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id]; - pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr; - pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; - pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr; - pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0]; - pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0 - pdsch_llr1 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[1]; // stream 1 - pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0]; - //pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0]; - //pdsch_comp1 = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1]; - pdsch_comp1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[0][0])[0]; - //pdsch_comp1 = (int16_t*) (phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0][0])[0]; - pdsch_mag0 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0]; - pdsch_mag1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag1[0][0])[0]; - pdsch_magb0 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0]; - pdsch_magb1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb1[0][0])[0]; - fl_freeze_form(form->lte_phy_scope_ue); - // Received signal in time domain of receive antenna 0 - if (rxsig_t != NULL) { - if (rxsig_t[0] != NULL) { - for (i=0; irxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","",""); - } - for (arx=1;arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]); - } - } + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { + harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid; + + if (harq_pid>=8) + return; + + mcs0 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs; + // Button 0 + /* + if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { + // we are in TM5 + fl_show_object(form->button_0); + } + */ + } + + fl_show_object(form->button_0); + + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) { + harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->current_harq_pid; + + if (harq_pid>=8) + return; + + mcs1 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->mcs; + } + + if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) { + num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols; + } + + // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { + mod0 = get_Qm(mcs0); + coded_bits_per_codeword0 = get_G(frame_parms, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + get_Qm(mcs0), + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl, + num_pdcch_symbols, + frame, + subframe, + beamforming_mode); + } else { + coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); + mod0=0; + } + + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) { + mod1 = get_Qm(mcs1); + coded_bits_per_codeword1 = get_G(frame_parms, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->nb_rb, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even, + get_Qm(mcs1), + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->Nl, + num_pdcch_symbols, + frame, + subframe, + beamforming_mode); + } else { + coded_bits_per_codeword1 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); + mod1=0; + } + + I = (float *) calloc(nsymb_ce*2,sizeof(float)); + Q = (float *) calloc(nsymb_ce*2,sizeof(float)); + chest_t_abs = (float **) malloc(nb_antennas_rx*sizeof(float *)); + + for (arx=0; arxofdm_symbol_size,sizeof(float)); + } + + chest_f_abs = (float *) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); + //llr0 = (float*) calloc(coded_bits_per_codeword0,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error. + llr0 = (float *) malloc(coded_bits_per_codeword0*sizeof(float)); + memset((void *)llr0, 0,coded_bits_per_codeword0*sizeof(float)); // init to zero + bit0 = malloc(coded_bits_per_codeword0*sizeof(float)); + //llr1 = (float*) calloc(coded_bits_per_codeword1,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error. + llr1 = (float *) malloc(coded_bits_per_codeword1*sizeof(float)); + memset((void *)llr1, 0,coded_bits_per_codeword1*sizeof(float)); // init to zero + bit1 = malloc(coded_bits_per_codeword1*sizeof(float)); + llr_pdcch = (float *) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero + bit_pdcch = (float *) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); + rxsig_t = (int16_t **) phy_vars_ue->common_vars.rxdata; + chest_t = (int16_t **) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id]; + chest_f = (int16_t **) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id]; + pbch_llr = (int8_t *) phy_vars_ue->pbch_vars[eNB_id]->llr; + pbch_comp = (int16_t *) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; + pdcch_llr = (int8_t *) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr; + pdcch_comp = (int16_t *) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0]; + pdsch_llr = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0 + pdsch_llr1 = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[1]; // stream 1 + pdsch_comp = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0]; + //pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0]; + //pdsch_comp1 = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1]; + pdsch_comp1 = (int16_t *) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[0][0])[0]; + //pdsch_comp1 = (int16_t*) (phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0][0])[0]; + pdsch_mag0 = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0]; + pdsch_mag1 = (int16_t *) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag1[0][0])[0]; + pdsch_magb0 = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0]; + pdsch_magb1 = (int16_t *) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb1[0][0])[0]; + fl_freeze_form(form->lte_phy_scope_ue); + + // Received signal in time domain of receive antenna 0 + if (rxsig_t != NULL) { + if (rxsig_t[0] != NULL) { + for (i=0; irxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","",""); } + + for (arx=1; arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]); + } + } + } + // Channel Impulse Response (still repeated format) if (chest_t != NULL) { ymax = 0; + if (chest_t[0] !=NULL) { for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) { chest_t_abs[0][i] = (float) (chest_t[0][4*i]*chest_t[0][4*i]+chest_t[0][4*i+1]*chest_t[0][4*i+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>>3),"","",""); } + for (arx=1; arxofdm_symbol_size>>3); i++) { chest_t_abs[arx][i] = (float) (chest_t[arx][4*i]*chest_t[arx][4*i]+chest_t[arx][4*i+1]*chest_t[arx][4*i+1]); + if (chest_t_abs[arx][i] > ymax) ymax = chest_t_abs[arx][i]; } + fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]); fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT); } } - // Avoid flickering effect - // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); - fl_set_xyplot_ybounds(form->chest_t,0,ymax); + + // Avoid flickering effect + // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); + fl_set_xyplot_ybounds(form->chest_t,0,ymax); + } + + // Channel Frequency Response (includes 5 complex sample for filter) + if (chest_f != NULL) { + ind = 0; + + for (atx=0; atxchest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce); - //fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2); - // fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2); - fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR); - fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","",""); - for (arx=1;arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); - } - // other tx antennas - if (nb_antennas_tx > 1) { - if (nb_antennas_rx > 1) { - for (atx=1;atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); - } - } - } else { // 1 rx antenna - atx=1; arx=0; - fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); - } - } + + // tx antenna 0 + fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce); + //fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2); + // fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2); + fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR); + fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","",""); + + for (arx=1; arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); } - /* - // PBCH LLRs - if (pbch_llr != NULL) { - for (i=0; i<1920;i++) { - llr_pbch[i] = (float) pbch_llr[i]; - bit_pbch[i] = (float) i; + + // other tx antennas + if (nb_antennas_tx > 1) { + if (nb_antennas_rx > 1) { + for (atx=1; atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); + } } - fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,1920,"","",""); + } else { // 1 rx antenna + atx=1; + arx=0; + fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); + } } - // PBCH I/Q of MF Output - if (pbch_comp!=NULL) { - for (i=0; i<72*2; i++) { - I[i] = pbch_comp[2*i]; - Q[i] = pbch_comp[2*i+1]; - } - fl_set_xyplot_data(form->pbch_comp,I,Q,72*2,"","",""); - } - // PDCCH LLRs - if (pdcch_llr != NULL) { - for (i=0; i<12*frame_parms->N_RB_DL*2*num_pdcch_symbols;i++) { - llr_pdcch[i] = (float) pdcch_llr[i]; - bit_pdcch[i] = (float) i; - } - fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3); - fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","",""); - } - // PDCCH I/Q of MF Output - if (pdcch_comp!=NULL) { - for (i=0; i<12*frame_parms->N_RB_DL*num_pdcch_symbols; i++) { - I[i] = pdcch_comp[2*i]; - Q[i] = pdcch_comp[2*i+1]; - } - fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); - } - */ - // PDSCH LLRs CW0 - if (pdsch_llr != NULL) { - for (i=0; ipdsch_llr,0,coded_bits_per_codeword0); - fl_set_xyplot_data(form->pdsch_llr,bit0,llr0,coded_bits_per_codeword0,"","",""); + } + + /* + // PBCH LLRs + if (pbch_llr != NULL) { + for (i=0; i<1920;i++) { + llr_pbch[i] = (float) pbch_llr[i]; + bit_pbch[i] = (float) i; + } + fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,1920,"","",""); + } + // PBCH I/Q of MF Output + if (pbch_comp!=NULL) { + for (i=0; i<72*2; i++) { + I[i] = pbch_comp[2*i]; + Q[i] = pbch_comp[2*i+1]; + } + fl_set_xyplot_data(form->pbch_comp,I,Q,72*2,"","",""); + } + // PDCCH LLRs + if (pdcch_llr != NULL) { + for (i=0; i<12*frame_parms->N_RB_DL*2*num_pdcch_symbols;i++) { + llr_pdcch[i] = (float) pdcch_llr[i]; + bit_pdcch[i] = (float) i; + } + fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3); + fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","",""); + } + // PDCCH I/Q of MF Output + if (pdcch_comp!=NULL) { + for (i=0; i<12*frame_parms->N_RB_DL*num_pdcch_symbols; i++) { + I[i] = pdcch_comp[2*i]; + Q[i] = pdcch_comp[2*i+1]; + } + fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); + } + */ + // PDSCH LLRs CW0 + if (pdsch_llr != NULL) { + for (i=0; ipdsch_llr,0,coded_bits_per_codeword0); + fl_set_xyplot_data(form->pdsch_llr,bit0,llr0,coded_bits_per_codeword0,"","",""); + } + // PDSCH I/Q of MF Output - if (pdsch_comp!=NULL) { - ind=0; - for (k=0; ksymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { - I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i]; - Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1]; - ind++; - } - } - fl_set_xyplot_data(form->pdsch_comp,I,Q,ind,"","",""); + if (pdsch_comp!=NULL) { + ind=0; + + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i]; + Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1]; + ind++; + } } - if (pdsch_mag0 != NULL) { - ind=0; - for (k=0; ksymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + + fl_set_xyplot_data(form->pdsch_comp,I,Q,ind,"","",""); + } + + if (pdsch_mag0 != NULL) { + ind=0; + + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { I[ind] = pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); Q[ind] = pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); ind++; - } - } - fl_add_xyplot_overlay(form->pdsch_comp,1,I,Q,ind,FL_GREEN); + } } - if (pdsch_magb0 != NULL) { - ind=0; - for (k=0; ksymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + + fl_add_xyplot_overlay(form->pdsch_comp,1,I,Q,ind,FL_GREEN); + } + + if (pdsch_magb0 != NULL) { + ind=0; + + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { I[ind] = pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); Q[ind] = pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); ind++; - } - } - fl_add_xyplot_overlay(form->pdsch_comp,2,I,Q,ind,FL_RED); + } } - if ((pdsch_mag0 != NULL) && (pdsch_magb0 != NULL)) { - ind=0; - for (k=0; ksymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + + fl_add_xyplot_overlay(form->pdsch_comp,2,I,Q,ind,FL_RED); + } + + if ((pdsch_mag0 != NULL) && (pdsch_magb0 != NULL)) { + ind=0; + + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { I[ind] = - (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]+ - pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i])* - cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]+ + pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i])* + cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); Q[ind] = - (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+ - pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1])* - sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+ + pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1])* + sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); ind++; - } - } - fl_add_xyplot_overlay(form->pdsch_comp,3,I,Q,ind,FL_BLUE); + } } - // PDSCH LLRs CW1 - if (pdsch_llr1 != NULL) { - for (i=0; ipdsch_llr1,0,coded_bits_per_codeword1); - fl_set_xyplot_data(form->pdsch_llr1,bit1,llr1,coded_bits_per_codeword1,"","",""); + + fl_add_xyplot_overlay(form->pdsch_comp,3,I,Q,ind,FL_BLUE); + } + + // PDSCH LLRs CW1 + if (pdsch_llr1 != NULL) { + for (i=0; isymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { - I[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i]; - Q[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]; - ind++; - } - } - fl_set_xyplot_data(form->pdsch_comp1,I,Q,ind,"","",""); + + fl_set_xyplot_xbounds(form->pdsch_llr1,0,coded_bits_per_codeword1); + fl_set_xyplot_data(form->pdsch_llr1,bit1,llr1,coded_bits_per_codeword1,"","",""); + } + + // PDSCH I/Q of MF Output + if (pdsch_comp1!=NULL) { + ind=0; + + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i]; + Q[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]; + ind++; + } } - if (pdsch_mag1 != NULL) { - ind=0; - for (k=0; ksymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + + fl_set_xyplot_data(form->pdsch_comp1,I,Q,ind,"","",""); + } + + if (pdsch_mag1 != NULL) { + ind=0; + + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { I[ind] = pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); Q[ind] = pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); ind++; - } - } - fl_add_xyplot_overlay(form->pdsch_comp1,1,I,Q,ind,FL_GREEN); + } } - if (pdsch_magb1 != NULL) { - ind=0; - for (k=0; ksymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + + fl_add_xyplot_overlay(form->pdsch_comp1,1,I,Q,ind,FL_GREEN); + } + + if (pdsch_magb1 != NULL) { + ind=0; + + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { I[ind] = pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); Q[ind] = pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); ind++; - } - } - fl_add_xyplot_overlay(form->pdsch_comp1,2,I,Q,ind,FL_RED); + } } - if ((pdsch_mag1 != NULL) && (pdsch_magb1 != NULL)) { - ind=0; - for (k=0; ksymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + + fl_add_xyplot_overlay(form->pdsch_comp1,2,I,Q,ind,FL_RED); + } + + if ((pdsch_mag1 != NULL) && (pdsch_magb1 != NULL)) { + ind=0; + + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { I[ind] = - (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]+ - pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i])* - cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]+ + pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i])* + cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); Q[ind] = - (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+ - pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1])* - sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+ + pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1])* + sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); ind++; - } - } - fl_add_xyplot_overlay(form->pdsch_comp1,3,I,Q,ind,FL_BLUE); + } } - /* - // PDSCH Throughput - memcpy((void*)tput_time_ue[UE_id],(void*)&tput_time_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float)); - memcpy((void*)tput_ue[UE_id],(void*)&tput_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float)); - tput_time_ue[UE_id][TPUT_WINDOW_LENGTH-1] = (float) frame; - tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0; - if (tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] > tput_ue_max[UE_id]) { - tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1]; - } - fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","",""); - fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]); - */ - fl_unfreeze_form(form->lte_phy_scope_ue); - fl_check_forms(); - free(I); - free(Q); - free(chest_f_abs); - free(llr0); - free(bit0); - free(llr1); - free(bit1); - free(bit_pdcch); - free(llr_pdcch); - //This is done to avoid plotting old data when TB0 is disabled, and TB1 is mapped onto CW0 - /*if (phy_vars_ue->transmission_mode[eNB_id]==3 && phy_vars_ue->transmission_mode[eNB_id]==4){ - for (int i = 0; i<8; ++i) - for (int j = 0; j < 7*2*frame_parms->N_RB_DL*12+4; ++j ) - phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][0][i][j]=0; + fl_add_xyplot_overlay(form->pdsch_comp1,3,I,Q,ind,FL_BLUE); + } - for (int m=0; mpdsch_vars[subframe&0x1][eNB_id]->llr[0][m]=0; - }*/ + /* + // PDSCH Throughput + memcpy((void*)tput_time_ue[UE_id],(void*)&tput_time_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float)); + memcpy((void*)tput_ue[UE_id],(void*)&tput_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float)); + tput_time_ue[UE_id][TPUT_WINDOW_LENGTH-1] = (float) frame; + tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0; + if (tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] > tput_ue_max[UE_id]) { + tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1]; + } + fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","",""); + fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]); + */ + fl_unfreeze_form(form->lte_phy_scope_ue); + fl_check_forms(); + free(I); + free(Q); + free(chest_f_abs); + free(llr0); + free(bit0); + free(llr1); + free(bit1); + free(bit_pdcch); + free(llr_pdcch); + //This is done to avoid plotting old data when TB0 is disabled, and TB1 is mapped onto CW0 + /*if (phy_vars_ue->transmission_mode[eNB_id]==3 && phy_vars_ue->transmission_mode[eNB_id]==4){ + for (int i = 0; i<8; ++i) + for (int j = 0; j < 7*2*frame_parms->N_RB_DL*12+4; ++j ) + phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][0][i][j]=0; + + for (int m=0; mpdsch_vars[subframe&0x1][eNB_id]->llr[0][m]=0; + }*/ } diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index b3132101dc..176404f26c 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -226,7 +226,8 @@ static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int laye static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const int datasize, const int divisions, const char *label) { if ( values == NULL ) - return; + return; + fl_winset(FL_ObjWin(graph->graph)); const int samplesPerPixel=datasize/graph->w; int displayPart=graph->waterFallh-ScaleZone; From feb2651ea76c0e052c8eec86fb6d7c3a28572848 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 30 Mar 2021 12:38:31 +0100 Subject: [PATCH 099/125] Fix issues due to merge --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 6 +++--- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 3 ++- openair2/RRC/NR_UE/rrc_UE.c | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index bb17eae442..2d43fb5aed 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -521,7 +521,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB, gNB->common_vars.beam_id[0][slot*frame_parms->symbols_per_slot+j] = rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx; } else { - LOG_W(PHY,"beam index for PDSCH allocation already taken\n"); + LOG_D(PHY,"beam index for PDSCH allocation already taken\n"); } }// dlsch loop diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 17cc006402..b7e543ab1d 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -234,7 +234,7 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){ ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling; - LOG_I(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n", + LOG_D(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n", __FUNCTION__, ue->Mod_id, frame_tx, @@ -1692,9 +1692,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, } if ((frame_rx%64 == 0) && (nr_slot_rx==0)) { - printf("============================================\n"); + LOG_I(PHY,"============================================\n"); LOG_I(PHY,"Harq round stats for Downlink: %d/%d/%d/%d DLSCH errors: %d\n",ue->dl_stats[0],ue->dl_stats[1],ue->dl_stats[2],ue->dl_stats[3],ue->dl_stats[4]); - printf("============================================\n"); + LOG_I(PHY,"============================================\n"); } #ifdef NR_PDCCH_SCHED diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 891dbe274b..bd3417e5e0 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -663,7 +663,8 @@ void nr_get_Msg3alloc(module_id_t module_id, NR_BWP_Uplink_t *ubwp, sub_frame_t current_slot, frame_t current_frame, - NR_RA_t *ra) { + NR_RA_t *ra, + int16_t *tdd_beam_association) { // msg3 is schedulend in mixed slot in the following TDD period diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 0d52f218a1..732b44ffe7 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -2568,7 +2568,7 @@ void *rrc_nrue_task( void *args_p ) { LOG_E(NR_RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p)); break; } - LOG_I(NR_RRC, "[UE %d] RRC Status %d\n", ue_mod_id, nr_rrc_get_state(ue_mod_id)); + LOG_D(NR_RRC, "[UE %d] RRC Status %d\n", ue_mod_id, nr_rrc_get_state(ue_mod_id)); result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); msg_p = NULL; From 58d372d3a2773b3cdd7d75462fab90a291f93ecb Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Wed, 31 Mar 2021 10:01:11 +0200 Subject: [PATCH 100/125] one cppcheck, merge develop --- openair1/PHY/TOOLS/nr_phy_scope.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index 176404f26c..1d6a279c91 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -243,7 +243,7 @@ static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const in for (int pix=0; pixw; pix++) { scopeSample_t *end=values+(pix+1)*samplesPerPixel; end-=2; - AssertFatal(end <= values+datasize,"diff : %lu", end-values+datasize); + AssertFatal(end <= values+datasize,"diff : %u", end-values+datasize); double val=0; for (scopeSample_t *s=values+(pix)*samplesPerPixel; From 53f77219d428e2bed3f558c2f87ca9caa6c9ad7d Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 31 Mar 2021 14:31:19 +0100 Subject: [PATCH 101/125] Rework default PDSCH time domain resource allocation tables --- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 146 ++++++++++++++++++ openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h | 9 ++ openair2/LAYER2/NR_MAC_UE/mac_proto.h | 3 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 101 +++--------- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 29 ++-- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 6 +- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 2 +- .../gnb.sa.band41.fr1.106PRB.usrpb210.conf | 8 +- .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 8 +- 11 files changed, 208 insertions(+), 108 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index dbd4905aa2..f4051e7a49 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -118,6 +118,152 @@ const float table_38213_13_12_c3[16] = { 1, 0.5f, 1, 0.5f, 1, 0.5f, 0.5f, 0.5f const int32_t table_38213_10_1_1_c2[5] = { 0, 0, 4, 2, 1 }; +// for PDSCH from TS 38.214 subclause 5.1.2.1.1 +const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[16][3]={ + {0,2,12}, // row index 1 + {0,2,10}, // row index 2 + {0,2,9}, // row index 3 + {0,2,7}, // row index 4 + {0,2,5}, // row index 5 + {0,9,4}, // row index 6 + {0,4,4}, // row index 7 + {0,5,7}, // row index 8 + {0,5,2}, // row index 9 + {0,9,2}, // row index 10 + {0,12,2}, // row index 11 + {0,1,13}, // row index 12 + {0,1,6}, // row index 13 + {0,2,4}, // row index 14 + {0,4,7}, // row index 15 + {0,8,4} // row index 16 +}; +const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[16][3]={ + {0,3,11}, // row index 1 + {0,3,9}, // row index 2 + {0,3,8}, // row index 3 + {0,3,6}, // row index 4 + {0,3,4}, // row index 5 + {0,10,4}, // row index 6 + {0,6,4}, // row index 7 + {0,5,7}, // row index 8 + {0,5,2}, // row index 9 + {0,9,2}, // row index 10 + {0,12,2}, // row index 11 + {0,1,13}, // row index 12 + {0,1,6}, // row index 13 + {0,2,4}, // row index 14 + {0,4,7}, // row index 15 + {0,8,4} // row index 16 +}; +const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[16][3]={ + {0,2,6}, // row index 1 + {0,2,10}, // row index 2 + {0,2,9}, // row index 3 + {0,2,7}, // row index 4 + {0,2,5}, // row index 5 + {0,6,4}, // row index 6 + {0,4,4}, // row index 7 + {0,5,6}, // row index 8 + {0,5,2}, // row index 9 + {0,9,2}, // row index 10 + {0,10,2}, // row index 11 + {0,1,11}, // row index 12 + {0,1,6}, // row index 13 + {0,2,4}, // row index 14 + {0,4,6}, // row index 15 + {0,8,4} // row index 16 +}; +const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[16][3]={ + {0,3,5}, // row index 1 + {0,3,9}, // row index 2 + {0,3,8}, // row index 3 + {0,3,6}, // row index 4 + {0,3,4}, // row index 5 + {0,8,2}, // row index 6 + {0,6,4}, // row index 7 + {0,5,6}, // row index 8 + {0,5,2}, // row index 9 + {0,9,2}, // row index 10 + {0,10,2}, // row index 11 + {0,1,11}, // row index 12 + {0,1,6}, // row index 13 + {0,2,4}, // row index 14 + {0,4,6}, // row index 15 + {0,8,4} // row index 16 +}; +const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[16][3]={ + {0,2,2}, // row index 1 + {0,4,2}, // row index 2 + {0,6,2}, // row index 3 + {0,8,2}, // row index 4 + {0,10,2}, // row index 5 + {1,2,2}, // row index 6 + {1,4,2}, // row index 7 + {0,2,4}, // row index 8 + {0,4,4}, // row index 9 + {0,6,4}, // row index 10 + {0,8,4}, // row index 11 + {0,10,4}, // row index 12 + {0,2,7}, // row index 13 + {0,2,12}, // row index 14 + {1,2,4}, // row index 15 + {0,0,0} // row index 16 +}; +const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[16][3]={ + {0,2,2}, // row index 1 + {0,4,2}, // row index 2 + {0,6,2}, // row index 3 + {0,8,2}, // row index 4 + {0,10,2}, // row index 5 + {1,2,2}, // row index 6 + {1,4,2}, // row index 7 + {0,2,4}, // row index 8 + {0,4,4}, // row index 9 + {0,6,4}, // row index 10 + {0,8,4}, // row index 11 + {0,10,4}, // row index 12 + {0,2,7}, // row index 13 + {0,3,11}, // row index 14 + {1,2,4}, // row index 15 + {0,0,0} // row index 16 +}; +const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[16][3]={ + {0,2,2}, // row index 1 + {0,4,2}, // row index 2 + {0,6,2}, // row index 3 + {0,8,2}, // row index 4 + {0,10,2}, // row index 5 + {0,0,0}, // row index 6 + {0,0,0}, // row index 7 + {0,2,4}, // row index 8 + {0,4,4}, // row index 9 + {0,6,4}, // row index 10 + {0,8,4}, // row index 11 + {0,10,4}, // row index 12 + {0,2,7}, // row index 13 + {0,2,12}, // row index 14 + {0,0,6}, // row index 15 + {0,2,6} // row index 16 +}; +const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[16][3]={ + {0,2,2}, // row index 1 + {0,4,2}, // row index 2 + {0,6,2}, // row index 3 + {0,8,2}, // row index 4 + {0,10,2}, // row index 5 + {0,0,0}, // row index 6 + {0,0,0}, // row index 7 + {0,2,4}, // row index 8 + {0,4,4}, // row index 9 + {0,6,4}, // row index 10 + {0,8,4}, // row index 11 + {0,10,4}, // row index 12 + {0,2,7}, // row index 13 + {0,3,11}, // row index 14 + {0,0,6}, // row index 15 + {0,2,6} // row index 16 +}; + const char *prachfmt[]={"0","1","2","3", "A1","A2","A3","B1","B4","C0","C2","A1/B1","A2/B2","A3/B3"}; const char *duplex_mode[]={"FDD","TDD"}; diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h index 8f7a726bb8..1e0ab98d4c 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h @@ -139,4 +139,13 @@ extern const float table_38213_13_12_c3[16]; extern const int32_t table_38213_10_1_1_c2[5]; +extern const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[16][3]; +extern const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[16][3]; +extern const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[16][3]; +extern const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[16][3]; +extern const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[16][3]; +extern const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[16][3]; +extern const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[16][3]; +extern const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[16][3]; + #endif //DEF_H diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index 14d1ea63fb..394ab58fc7 100755 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -178,7 +178,8 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu, - uint8_t time_domain_ind); + uint8_t time_domain_ind, + bool use_default); uint8_t nr_ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 5803b23e8c..79878d59a4 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -237,85 +237,15 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu, - uint8_t time_domain_ind - ){ + uint8_t time_domain_ind, + bool use_default){ + int dmrs_typeA_pos = mac->scc->dmrs_TypeA_Position; // uint8_t k_offset=0; uint8_t sliv_S=0; uint8_t sliv_L=0; - uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?12:11}, // row index 1 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?10:9}, // row index 2 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?9:8}, // row index 3 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?7:6}, // row index 4 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?5:4}, // row index 5 - {0,(dmrs_typeA_pos == 0)?9:10,(dmrs_typeA_pos == 0)?4:4}, // row index 6 - {0,(dmrs_typeA_pos == 0)?4:6, (dmrs_typeA_pos == 0)?4:4}, // row index 7 - {0,5,7}, // row index 8 - {0,5,2}, // row index 9 - {0,9,2}, // row index 10 - {0,12,2}, // row index 11 - {0,1,13}, // row index 12 - {0,1,6}, // row index 13 - {0,2,4}, // row index 14 - {0,4,7}, // row index 15 - {0,8,4} // row index 16 - }; - /*uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?6:5}, // row index 1 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?10:9}, // row index 2 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?9:8}, // row index 3 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?7:6}, // row index 4 - {0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?5:4}, // row index 5 - {0,(dmrs_typeA_pos == 0)?6:8, (dmrs_typeA_pos == 0)?4:2}, // row index 6 - {0,(dmrs_typeA_pos == 0)?4:6, (dmrs_typeA_pos == 0)?4:4}, // row index 7 - {0,5,6}, // row index 8 - {0,5,2}, // row index 9 - {0,9,2}, // row index 10 - {0,10,2}, // row index 11 - {0,1,11}, // row index 12 - {0,1,6}, // row index 13 - {0,2,4}, // row index 14 - {0,4,6}, // row index 15 - {0,8,4} // row index 16 - };*/ - /*uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1 - {0,2,2}, // row index 1 - {0,4,2}, // row index 2 - {0,6,2}, // row index 3 - {0,8,2}, // row index 4 - {0,10,2}, // row index 5 - {1,2,2}, // row index 6 - {1,4,2}, // row index 7 - {0,2,4}, // row index 8 - {0,4,4}, // row index 9 - {0,6,4}, // row index 10 - {0,8,4}, // row index 11 - {0,10,4}, // row index 12 - {0,2,7}, // row index 13 - {0,(dmrs_typeA_pos == 0)?2:3,(dmrs_typeA_pos == 0)?12:11}, // row index 14 - {1,2,4}, // row index 15 - {0,0,0} // row index 16 - };*/ - /*uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1 - {0,2,2}, // row index 1 - {0,4,2}, // row index 2 - {0,6,2}, // row index 3 - {0,8,2}, // row index 4 - {0,10,2}, // row index 5 - {0,0,0}, // row index 6 - {0,0,0}, // row index 7 - {0,2,4}, // row index 8 - {0,4,4}, // row index 9 - {0,6,4}, // row index 10 - {0,8,4}, // row index 11 - {0,10,4}, // row index 12 - {0,2,7}, // row index 13 - {0,(dmrs_typeA_pos == 0)?2:3,(dmrs_typeA_pos == 0)?12:11}, // row index 14 - {0,0,6}, // row index 15 - {0,2,6} // row index 16 - };*/ uint8_t mu_pusch = 1; + // definition table j Table 6.1.2.1.1-4 uint8_t j = (mu_pusch==3)?3:(mu_pusch==2)?2:1; uint8_t table_6_1_2_1_1_2_time_dom_res_alloc_A[16][3]={ // for PUSCH from TS 38.214 subclause 6.1.2.1.1 @@ -364,7 +294,7 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac, pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup; else if (mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList) pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; - if (pdsch_TimeDomainAllocationList) { + if (pdsch_TimeDomainAllocationList && use_default==false) { if (time_domain_ind >= pdsch_TimeDomainAllocationList->list.count) { LOG_E(MAC, "time_domain_ind %d >= pdsch->TimeDomainAllocationList->list.count %d\n", @@ -387,8 +317,15 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac, } else {// Default configuration from tables // k_offset = table_5_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][0]; - sliv_S = table_5_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][1]; - sliv_L = table_5_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][2]; + + if(dmrs_typeA_pos == 0) { + sliv_S = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[time_domain_ind][1]; + sliv_L = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[time_domain_ind][2]; + } else { + sliv_S = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[time_domain_ind][1]; + sliv_L = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[time_domain_ind][2]; + } + // k_offset = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][0]; // sliv_S = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][1]; // sliv_L = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][2]; @@ -413,7 +350,7 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac, pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; } - if (pusch_TimeDomainAllocationList) { + if (pusch_TimeDomainAllocationList && use_default==false) { if (time_domain_ind >= pusch_TimeDomainAllocationList->list.count) { LOG_E(MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n", time_domain_ind, pusch_TimeDomainAllocationList->list.count); @@ -430,8 +367,8 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac, } else { // k_offset = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][0]; - sliv_S = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][1]; - sliv_L = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][2]; + sliv_S = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind][1]; + sliv_L = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind][2]; // k_offset = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][0]; // sliv_S = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][1]; // sliv_L = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][2]; @@ -678,7 +615,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr return -1; } /* TIME_DOM_RESOURCE_ASSIGNMENT */ - if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_0,dci->time_domain_assignment.val) < 0) { + if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_0,dci->time_domain_assignment.val,rnti==SI_RNTI) < 0) { LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot); return -1; } @@ -845,7 +782,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr return -1; } /* TIME_DOM_RESOURCE_ASSIGNMENT */ - if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_1,dci->time_domain_assignment.val) < 0) { + if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_1,dci->time_domain_assignment.val,false) < 0) { LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot); return -1; } diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 542aee9af1..bc15353e9a 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -647,7 +647,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, return -1; } /* TIME_DOM_RESOURCE_ASSIGNMENT */ - if (nr_ue_process_dci_time_dom_resource_assignment(mac, pusch_config_pdu, NULL, dci->time_domain_assignment.val) < 0) { + if (nr_ue_process_dci_time_dom_resource_assignment(mac, pusch_config_pdu, NULL, dci->time_domain_assignment.val,false) < 0) { return -1; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 0fbf843343..45dc319031 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -316,11 +316,15 @@ void schedule_control_sib1(module_id_t module_id, const uint16_t bwpSize = gNB_mac->type0_PDCCH_CSS_config.num_rbs; int rbStart = gNB_mac->type0_PDCCH_CSS_config.cset_start_rb; - // Calculate number of symbols - struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = gNB_mac->sched_ctrlCommon->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; - const int startSymbolAndLength = tdaList->list.array[gNB_mac->sched_ctrlCommon->time_domain_allocation]->startSymbolAndLength; - int startSymbolIndex, nrOfSymbols; - SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); + int startSymbolIndex = 0; + int nrOfSymbols = 0; + if(gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position == 0) { + startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[gNB_mac->sched_ctrlCommon->time_domain_allocation][1]; + nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[gNB_mac->sched_ctrlCommon->time_domain_allocation][2]; + } else { + startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[gNB_mac->sched_ctrlCommon->time_domain_allocation][1]; + nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[gNB_mac->sched_ctrlCommon->time_domain_allocation][2]; + } if (nrOfSymbols == 2) { gNB_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData = 1; @@ -345,7 +349,6 @@ void schedule_control_sib1(module_id_t module_id, gNB_mac->sched_ctrlCommon->rbSize = rbSize; gNB_mac->sched_ctrlCommon->rbStart = 0; - LOG_D(MAC,"SLIV = %i\n", startSymbolAndLength); LOG_D(MAC,"startSymbolIndex = %i\n", startSymbolIndex); LOG_D(MAC,"nrOfSymbols = %i\n", nrOfSymbols); LOG_D(MAC,"rbSize = %i\n", gNB_mac->sched_ctrlCommon->rbSize); @@ -526,11 +529,15 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) // Configure sched_ctrlCommon for SIB1 schedule_control_sib1(module_idP, CC_id, time_domain_allocation, mcsTableIdx, mcs, candidate_idx, sib1_sdu_length); - // Calculate number of symbols - int startSymbolIndex, nrOfSymbols; - struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = gNB_mac->sched_ctrlCommon->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; - const int startSymbolAndLength = tdaList->list.array[gNB_mac->sched_ctrlCommon->time_domain_allocation]->startSymbolAndLength; - SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); + int startSymbolIndex = 0; + int nrOfSymbols = 0; + if(gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position == 0) { + startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[gNB_mac->sched_ctrlCommon->time_domain_allocation][1]; + nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[gNB_mac->sched_ctrlCommon->time_domain_allocation][2]; + } else { + startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[gNB_mac->sched_ctrlCommon->time_domain_allocation][1]; + nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[gNB_mac->sched_ctrlCommon->time_domain_allocation][2]; + } // Calculate number of PRB_DMRS uint8_t N_PRB_DMRS = gNB_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 6; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 37aeabe07c..15bc84cdf3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -1762,7 +1762,7 @@ void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti) } } -void nr_mac_remove_ra_rnti_ue(module_id_t mod_id, rnti_t rnti) { +void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti) { // Hack to remove UE in the phy (following the same procedure as in function mac_remove_nr_ue) if (pthread_mutex_lock(&rnti_to_remove_mutex)) exit(1); if (rnti_to_remove_count == 10) exit(1); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index a69f63365e..3eb5cac76c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -510,7 +510,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, if(no_sig) { LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); - nr_mac_remove_ra_rnti_ue(gnb_mod_idP, ra->rnti); + nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); } else { @@ -545,7 +545,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, if(ra->cfra) { LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti); - nr_mac_remove_ra_rnti_ue(gnb_mod_idP, ra->rnti); + nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); UE_info->active[UE_id] = true; @@ -581,7 +581,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, continue; LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); - nr_mac_remove_ra_rnti_ue(gnb_mod_idP, ra->rnti); + nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); } } diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 2327d22da4..42f3bbf70f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -318,7 +318,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *secon void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti); -void nr_mac_remove_ra_rnti_ue(module_id_t mod_id, rnti_t rnti); +void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti); int allocate_nr_CCEs(gNB_MAC_INST *nr_mac, NR_BWP_Downlink_t *bwp, diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index dd18cf624e..9af4a3a9fa 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -64,13 +64,13 @@ gNBs = #initialULBWPmappingType #0=typeA,1=typeB initialDLBWPmappingType_0 = 0; - #this is SS=2,L=12 - initialDLBWPstartSymbolAndLength_0 = 53; + #this is SS=1,L=13 + initialDLBWPstartSymbolAndLength_0 = 40; initialDLBWPk0_1 = 0; initialDLBWPmappingType_1 = 0; - #this is SS=2,L=10 - initialDLBWPstartSymbolAndLength_1 = 81; + #this is SS=2,L=12 + initialDLBWPstartSymbolAndLength_1 = 53; initialDLBWPk0_2 = 0; initialDLBWPmappingType_2 = 0; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 001e5b917a..88bcf8defc 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -64,13 +64,13 @@ gNBs = #initialULBWPmappingType #0=typeA,1=typeB initialDLBWPmappingType_0 = 0; - #this is SS=2,L=12 - initialDLBWPstartSymbolAndLength_0 = 53; + #this is SS=1,L=13 + initialDLBWPstartSymbolAndLength_0 = 40; initialDLBWPk0_1 = 0; initialDLBWPmappingType_1 = 0; - #this is SS=2,L=10 - initialDLBWPstartSymbolAndLength_1 = 81; + #this is SS=2,L=12 + initialDLBWPstartSymbolAndLength_1 = 53; initialDLBWPk0_2 = 0; initialDLBWPmappingType_2 = 0; From f851af22f2b8c07196ba4de9a6e7b91bc42506fe Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 31 Mar 2021 10:41:11 +0100 Subject: [PATCH 102/125] fixing previous commit --- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index f4051e7a49..20d8b917ce 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -2910,7 +2910,7 @@ int is_nr_DL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slot) { int slots1=period1*(1<tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots ? 1 : 0); - else return(slot_in_period <= slots1+scc->tdd_UL_DL_ConfigurationCommon->pattern2->nrofDownlinkSlots ? 1 : 0); + else return(slot_in_period <= slots1+scc->tdd_UL_DL_ConfigurationCommon->pattern2->nrofDownlinkSlots ? 1 : 0); } int is_nr_UL_slot(NR_ServingCellConfigCommon_t *scc, slot_t slot, lte_frame_type_t frame_type) { @@ -2942,24 +2942,26 @@ int is_nr_UL_slot(NR_ServingCellConfigCommon_t *scc, slot_t slot, lte_frame_type int slots1=period1*(1<= scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots ? 1 : 0); - else return(slot_in_period >= slots1+scc->tdd_UL_DL_ConfigurationCommon->pattern2->nrofDownlinkSlots ? 1 : 0); + else return(slot_in_period >= slots1+scc->tdd_UL_DL_ConfigurationCommon->pattern2->nrofDownlinkSlots ? 1 : 0); } int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols,int startSymbol) { int l0; - int ld = NrOfSymbols; + int ld = NrOfSymbols+startSymbol; if (dmrs_TypeA_Position == NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos2) l0=2; else if (dmrs_TypeA_Position == NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos3) l0=3; else AssertFatal(1==0,"Illegal dmrs_TypeA_Position %d\n",(int)dmrs_TypeA_Position); if (pdsch_Config == NULL) { // Initial BWP - return(1<dmrs_DownlinkForPDSCH_MappingTypeA && pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->present == NR_SetupRelease_DMRS_DownlinkConfig_PR_setup) { // Relative to start of slot - ld += startSymbol; NR_DMRS_DownlinkConfig_t *dmrs_config = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; AssertFatal(ld>1 && ld < 15,"Illegal l_d %d\n",ld); int pos2=0; From 8c9ed555d90dc1c20e8a899b4b3334ee55c64499 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 31 Mar 2021 15:32:45 +0100 Subject: [PATCH 103/125] Remove runtime callocs for dmrs_AdditionalPosition --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 16 +++++----------- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 9 ++++----- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 79878d59a4..ec36486f70 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -570,7 +570,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti; fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_0 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15; - NR_PDSCH_Config_t *pdsch_config=mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup; + NR_PDSCH_Config_t *pdsch_config = NULL; uint16_t BWPSize = 0; if(rnti == SI_RNTI) { @@ -578,7 +578,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dlsch_config_pdu_1_0->BWPSize = mac->type0_PDCCH_CSS_config.num_rbs; dlsch_config_pdu_1_0->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb; dlsch_config_pdu_1_0->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon; - pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; // For PDSCH with mapping type A, the UE shall assume dmrs-AdditionalPosition='pos2' BWPSize = dlsch_config_pdu_1_0->BWPSize; } else { if (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti){ @@ -586,25 +585,20 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr } else { dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH; } - if( (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti) ) { dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); if (get_softmodem_params()->sa) { dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; } else { // NSA mode is not using the Initial BWP dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) - pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); + pdsch_config = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup; } } else { dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing; - if(pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition == NULL) - pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition=calloc(1,sizeof(*pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); + pdsch_config = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup; } - BWPSize = n_RB_DLBWP; } @@ -624,7 +618,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr mac->scc->dmrs_TypeA_Position, dlsch_config_pdu_1_0->number_symbols, dlsch_config_pdu_1_0->start_symbol); - dlsch_config_pdu_1_0->dmrsConfigType = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; + dlsch_config_pdu_1_0->dmrsConfigType = (pdsch_config) ? (mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0; /* number of DM-RS CDM groups without data according to subclause 5.1.6.2 of 3GPP TS 38.214 version 15.9.0 Release 15 */ if (dlsch_config_pdu_1_0->number_symbols == 2) dlsch_config_pdu_1_0->n_dmrs_cdm_groups = 1; @@ -633,7 +627,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr /* VRB_TO_PRB_MAPPING */ dlsch_config_pdu_1_0->vrb_to_prb_mapping = (dci->vrb_to_prb_mapping.val == 0) ? vrb_to_prb_mapping_non_interleaved:vrb_to_prb_mapping_interleaved; /* MCS TABLE INDEX */ - dlsch_config_pdu_1_0->mcs_table = (pdsch_config->mcs_Table) ? (*pdsch_config->mcs_Table + 1) : 0; + dlsch_config_pdu_1_0->mcs_table = (pdsch_config) ? ((pdsch_config->mcs_Table) ? (*pdsch_config->mcs_Table + 1) : 0) : 0; /* MCS */ dlsch_config_pdu_1_0->mcs = dci->mcs; // Basic sanity check for MCS value to check for a false or erroneous DCI diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 45dc319031..49cfcbaf93 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -293,7 +293,6 @@ void schedule_control_sib1(module_id_t module_id, fill_default_coresetZero(gNB_mac->sched_ctrlCommon->coreset,servingcellconfigcommon); fill_default_initialDownlinkBWP(gNB_mac->sched_ctrlCommon->active_bwp,servingcellconfigcommon); } - gNB_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; gNB_mac->sched_ctrlCommon->time_domain_allocation = time_domain_allocation; gNB_mac->sched_ctrlCommon->mcsTableIdx = mcsTableIdx; @@ -334,7 +333,7 @@ void schedule_control_sib1(module_id_t module_id, // Calculate number of PRB_DMRS uint8_t N_PRB_DMRS = gNB_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 6; - uint16_t dlDmrsSymbPos = fill_dmrs_mask(gNB_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex); + uint16_t dlDmrsSymbPos = fill_dmrs_mask(NULL, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex); uint16_t dmrs_length = get_num_dmrs(dlDmrsSymbPos); int rbSize = 0; @@ -421,7 +420,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, pdsch_pdu_rel15->nrOfLayers = 1; pdsch_pdu_rel15->transmissionScheme = 0; pdsch_pdu_rel15->refPoint = 1; - pdsch_pdu_rel15->dmrsConfigType = gNB_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; + pdsch_pdu_rel15->dmrsConfigType = 0; pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; pdsch_pdu_rel15->SCID = 0; pdsch_pdu_rel15->numDmrsCdmGrpsNoData = gNB_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData; @@ -436,7 +435,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex; pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols; - pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(bwp->bwp_Dedicated->pdsch_Config->choice.setup, scc->dmrs_TypeA_Position, pdsch_pdu_rel15->NrOfSymbols, pdsch_pdu_rel15->StartSymbolIndex); + pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, pdsch_pdu_rel15->NrOfSymbols, pdsch_pdu_rel15->StartSymbolIndex); LOG_D(MAC,"dlDmrsSymbPos = 0x%x\n", pdsch_pdu_rel15->dlDmrsSymbPos); @@ -541,7 +540,7 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) // Calculate number of PRB_DMRS uint8_t N_PRB_DMRS = gNB_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData * 6; - uint16_t dlDmrsSymbPos = fill_dmrs_mask(gNB_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex); + uint16_t dlDmrsSymbPos = fill_dmrs_mask(NULL, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex); uint16_t dmrs_length = get_num_dmrs(dlDmrsSymbPos); const uint32_t TBS = nr_compute_tbs(nr_get_Qm_dl(gNB_mac->sched_ctrlCommon->mcs, gNB_mac->sched_ctrlCommon->mcsTableIdx), From d86566d3666203369837252ae363a1ffbc1a3988 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 31 Mar 2021 15:52:51 +0100 Subject: [PATCH 104/125] gNB: update ssPBCH_BlockPower to -25 dBm/RE in all USRP conf files --- .../GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf | 3 ++- .../GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index 9af4a3a9fa..20423b50b9 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -21,6 +21,7 @@ gNBs = ssb_SubcarrierOffset = 0; pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; pdcch_ConfigSIB1 = ( { @@ -191,7 +192,7 @@ gNBs = nrofUplinkSlots = 2; nrofUplinkSymbols = 4; - ssPBCH_BlockPower = 10; + ssPBCH_BlockPower = -25; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 88bcf8defc..c4d9de3347 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -21,6 +21,7 @@ gNBs = ssb_SubcarrierOffset = 0; pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; pdcch_ConfigSIB1 = ( { @@ -191,7 +192,7 @@ gNBs = nrofUplinkSlots = 2; nrofUplinkSymbols = 4; - ssPBCH_BlockPower = 10; + ssPBCH_BlockPower = -25; } ); From 4a807dd0837da0547067e33a256de79828b4e845 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 1 Apr 2021 14:11:14 +0100 Subject: [PATCH 105/125] Minor improvements and LOG updates --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 5 ++--- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 14 ++++++-------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index bd3417e5e0..305f3b5e5a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -875,7 +875,6 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra fill_default_coresetZero(nr_mac->sched_ctrlCommon->coreset,cc->ServingCellConfigCommon); fill_default_initialDownlinkBWP(nr_mac->sched_ctrlCommon->active_bwp,cc->ServingCellConfigCommon); } - nr_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); @@ -1018,7 +1017,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->VRBtoPRBMapping = 0; pdsch_pdu_rel15->StartSymbolIndex = startSymbolIndex; pdsch_pdu_rel15->NrOfSymbols = nrOfSymbols; - pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(nr_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, + pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, nr_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex); @@ -1172,7 +1171,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); AssertFatal(startSymbolIndex >= 0, "StartSymbolIndex is negative\n"); - uint16_t dlDmrsSymbPos = fill_dmrs_mask(nr_mac->sched_ctrlCommon->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup, + uint16_t dlDmrsSymbPos = fill_dmrs_mask(NULL, nr_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 7d12536f9a..3483182088 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -159,7 +159,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, // get MIB every 8 frames if((slotP == 0) && (frameP & 7) == 0) { - mib_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, MIBCH, 1, &cc->MIB_pdu.payload[0]); + mib_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, MIBCH, 0, 1, &cc->MIB_pdu.payload[0]); LOG_D(MAC, "[gNB %d] Frame %d : MIB->BCH CC_id %d, Received %d bytes\n", @@ -540,8 +540,6 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) { - LOG_D(MAC,"Schedule_nr_sib1: frameP = %i, slotP = %i\n", frameP, slotP); - // TODO: Get these values from RRC const int CC_id = 0; int time_domain_allocation = 0; @@ -577,14 +575,14 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) (type0_PDCCH_CSS_config->num_rbs > 0) && (type0_PDCCH_CSS_config->active == true)) { - LOG_D(MAC,"> SIB1 transmission\n"); + LOG_D(NR_MAC,"(%d.%d) SIB1 transmission: ssb_index %d\n", frameP, slotP, type0_PDCCH_CSS_config->ssb_index); // Get SIB1 uint8_t sib1_payload[NR_MAX_SIB_LENGTH/8]; - uint8_t sib1_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, BCCH, 1, sib1_payload); - LOG_D(MAC,"sib1_sdu_length = %i\n", sib1_sdu_length); - LOG_D(MAC,"SIB1: \n"); - for (int i=0;i Date: Thu, 1 Apr 2021 18:45:29 +0100 Subject: [PATCH 106/125] Fix for RA when Msg3 fails --- openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 2 ++ openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 8 ++++---- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 7 +++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index e70c353589..54464446a5 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -84,6 +84,8 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ } else if (dl_config->dl_config_list[i].pdu_type == FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH){ dlsch0 = PHY_vars_UE_g[module_id][cc_id]->dlsch_ra[0]; + dlsch0->rnti_type = _RA_RNTI_; + dlsch0->harq_processes[dlsch0->current_harq_pid]->status = ACTIVE; } else if (dl_config->dl_config_list[i].pdu_type == FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH){ dlsch0 = PHY_vars_UE_g[module_id][cc_id]->dlsch_SI[0]; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 305f3b5e5a..9a0034cbb5 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -444,19 +444,19 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot, uint8_t start_next_period = (rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot)%nr_slots_per_frame[mu]; *msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot - *msg2_frame = (*msg2_slot>(rach_slot))? rach_frame : (rach_frame +1); + *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024; // we can't schedule msg2 before sl_ahead since prach int eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu]; if ((eff_slot-rach_slot)<=sl_ahead) { *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu]; - *msg2_frame = (*msg2_slot>(rach_slot))? rach_frame : (rach_frame +1); + *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024; } if (FR==nr_FR2) { int num_tdd_period = *msg2_slot/tdd_period_slot; while((tdd_beam_association[num_tdd_period]!=-1)&&(tdd_beam_association[num_tdd_period]!=beam_index)) { *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu]; - *msg2_frame = (*msg2_slot>(rach_slot))? rach_frame : (rach_frame +1); + *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024; num_tdd_period = *msg2_slot/tdd_period_slot; } if(tdd_beam_association[num_tdd_period] == -1) @@ -692,7 +692,7 @@ void nr_get_Msg3alloc(module_id_t module_id, if (nr_slots_per_frame[mu]>temp_slot) ra->Msg3_frame = current_frame; else - ra->Msg3_frame = current_frame + (temp_slot/nr_slots_per_frame[mu]); + ra->Msg3_frame = (current_frame + (temp_slot/nr_slots_per_frame[mu]))%1024; // beam association for FR2 if (*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257) { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 3eb5cac76c..15b743036c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -520,6 +520,13 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, "expected TC_RNTI %04x to match current RNTI %04x\n", ra->rnti, current_rnti); + + if( (frameP==ra->Msg3_frame) && (slotP==ra->Msg3_slot) ) { + LOG_W(NR_MAC, "Random Access %i failed at state %i\n", i, ra->state); + nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); + nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); + } + continue; } From 55315b8fae1b786888764e93ac54c2e225e26eb3 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Thu, 1 Apr 2021 21:43:47 +0200 Subject: [PATCH 107/125] revert removal of a dirty workaround --- openair1/SIMULATION/TOOLS/random_channel.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 9e4170fc7c..4e26d9a954 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -1683,8 +1683,7 @@ channel_desc_t *find_channel_desc_fromname( char *modelname ) { void free_channel_desc_scm(channel_desc_t *ch) { // Must be made cleanly, a lot of leaks... - defined_channels[ch->chan_idx]=NULL; - + if (max_chan != 0) defined_channels[ch->chan_idx]=NULL; if(ch->free_flags&CHANMODEL_FREE_AMPS) free(ch->amps); From 0317d6725bc3fac2a299f9df65162cc67e53fb60 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Fri, 2 Apr 2021 10:12:13 +0200 Subject: [PATCH 108/125] sanitize, calibration tool kickoff --- cmake_targets/CMakeLists.txt | 12 + cmake_targets/tools/run_enb_s1_usrp | 13 - common/utils/system.c | 26 +- common/utils/system.h | 8 +- executables/nr-softmodem.c | 1 - executables/nr-softmodem.h | 4 - executables/ocp-gnb.c | 3 - openair1/PHY/TOOLS/calibration_scope.c | 387 +++++++++++++++++++++++++ openair1/PHY/TOOLS/calibration_scope.h | 5 + openair1/PHY/TOOLS/calibration_test.c | 329 +++++++++++++++++++++ openair2/GNB_APP/gnb_paramdef.h | 10 +- openair2/SIMULATION/NR_RRC/itti_sim.c | 3 - openair2/UTIL/OCG/OCG.h | 1 - targets/ARCH/COMMON/common_lib.h | 1 + 14 files changed, 762 insertions(+), 41 deletions(-) create mode 100644 openair1/PHY/TOOLS/calibration_scope.c create mode 100644 openair1/PHY/TOOLS/calibration_scope.h create mode 100644 openair1/PHY/TOOLS/calibration_test.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 7643fedb9d..477dfb7976 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2797,6 +2797,7 @@ add_library(rfsimulator MODULE ${OPENAIR_TARGETS}/ARCH/rfsimulator/simulator.c ${OPENAIR_TARGETS}/ARCH/rfsimulator/apply_channelmod.c ${OPENAIR_TARGETS}/ARCH/rfsimulator/new_channel_sim.c + ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c ) target_link_libraries(rfsimulator SIMU_COMMON ${ATLAS_LIBRARIES}) @@ -3181,6 +3182,17 @@ target_link_libraries (dlsim_tm4 pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB} ) +add_executable(rftest + ${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_test.c + ${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_scope.c + ${OPENAIR_DIR}/common/utils/system.c + ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c + ${OPENAIR_DIR}/executables/softmodem-common.c + ${CONFIG_SOURCES} + ${SHLIB_LOADER_SOURCES} +) +target_link_libraries(rftest minimal_lib PHY_NR_COMMON pthread dl m forms ${T_LIB} ) + add_executable(polartest ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/polartest.c ${OPENAIR_DIR}/common/utils/backtrace.c diff --git a/cmake_targets/tools/run_enb_s1_usrp b/cmake_targets/tools/run_enb_s1_usrp index e119126683..1a4c6b10b8 100755 --- a/cmake_targets/tools/run_enb_s1_usrp +++ b/cmake_targets/tools/run_enb_s1_usrp @@ -101,7 +101,6 @@ function main() local -i run_gdb=0 local -i show_stdout=0 local exe_arguments="" - local itti_dump_file="" until [ -z "$1" ] do @@ -154,18 +153,6 @@ function main() 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 - itti_dump_file="/tmp/enb_s1_usrp_itti.log" - shift 1; - else - shift 2; - fi - echo "setting ITTI dump file to: $itti_dump_file" - exe_arguments="$exe_arguments -K $itti_dump_file" - ;; -m | --mscgen) g_msc_dir=$2 # can omit file name if last arg on the line diff --git a/common/utils/system.c b/common/utils/system.c index 1bd5c7d39b..239ea525c7 100644 --- a/common/utils/system.c +++ b/common/utils/system.c @@ -199,15 +199,26 @@ void start_background_system(void) { void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, int affinity, int priority){ pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); - pthread_attr_setschedpolicy(&attr, SCHED_FIFO); + int ret; + AssertFatal(0==(ret=pthread_attr_init(&attr)),"ret: %d, errno: %d\n",ret, errno); + AssertFatal(0==(ret=pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)),"ret: %d, errno: %d\n",ret, errno); + AssertFatal(0==(ret=pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)),"ret: %d, errno: %d\n",ret, errno); + AssertFatal(0==(ret=pthread_attr_setschedpolicy(&attr, SCHED_OAI)),"ret: %d, errno: %d\n",ret, errno); + if(prioritysched_get_priority_max(SCHED_FIFO)) { + LOG_E(TMR,"Prio not possible: %d, min is %d, max: %d, forced in the range\n", + priority, + sched_get_priority_min(SCHED_OAI), + sched_get_priority_max(SCHED_OAI)); + if(prioritysched_get_priority_max(SCHED_OAI)) + priority=sched_get_priority_max(SCHED_OAI); + } + AssertFatal(priority<=sched_get_priority_max(SCHED_OAI),""); struct sched_param sparam={0}; sparam.sched_priority = priority; - pthread_attr_setschedparam(&attr, &sparam); - - pthread_create(t, &attr, func, param); + AssertFatal(0==(ret=pthread_attr_setschedparam(&attr, &sparam)),"ret: %d, errno: %d\n",ret, errno); + AssertFatal(0==(ret=pthread_create(t, &attr, func, param)),"ret: %d, errno: %d\n",ret, errno); pthread_setname_np(*t, name); if (affinity != -1 ) { @@ -216,7 +227,6 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, CPU_SET(affinity, &cpuset); AssertFatal( pthread_setaffinity_np(*t, sizeof(cpu_set_t), &cpuset) == 0, "Error setting processor affinity"); } - pthread_attr_destroy(&attr); } diff --git a/common/utils/system.h b/common/utils/system.h index 760b7840a5..46316f6db6 100644 --- a/common/utils/system.h +++ b/common/utils/system.h @@ -46,9 +46,11 @@ void set_latency_target(void); void configure_linux(void); void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, int affinity, int priority); -#define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_FIFO) -#define OAI_PRIORITY_RT sched_get_priority_min(SCHED_FIFO+10) -#define OAI_PRIORITY_RT_MAX sched_get_priority_min(SCHED_FIFO+20) + +#define SCHED_OAI SCHED_RR +#define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_OAI) +#define OAI_PRIORITY_RT sched_get_priority_min(SCHED_OAI)+1 +#define OAI_PRIORITY_RT_MAX sched_get_priority_min(SCHED_OAI)+2 void thread_top_init(char *thread_name, int affinity, diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 63c06563d2..692e4d530f 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -114,7 +114,6 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; //Temp fix for inexistent NR upper layer unsigned char NB_gNB_INST = 1; -static char *itti_dump_file = NULL; int UE_scan = 1; int UE_scan_carrier = 0; diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h index d6cfe6b906..18a6fe42d0 100644 --- a/executables/nr-softmodem.h +++ b/executables/nr-softmodem.h @@ -18,13 +18,9 @@ /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_PARAMS_DESC_GNB { \ - {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ {"A" , CONFIG_HLP_TADV, 0, uptr:&timing_advance, defintval:0, TYPE_UINT, 0}, \ {"E" , CONFIG_HLP_TQFS, PARAMFLAG_BOOL, i8ptr:&threequarter_fs, defintval:0, TYPE_INT8, 0}, \ - {"K" , CONFIG_HLP_ITTIL, PARAMFLAG_NOFREE, strptr:&itti_dump_file, defstrval:"/tmp/itti.dump", TYPE_STRING, 0}, \ - {"m" , CONFIG_HLP_DLMCS, 0, uptr:&target_dl_mcs, defintval:0, TYPE_UINT, 0}, \ - {"t" , CONFIG_HLP_ULMCS, 0, uptr:&target_ul_mcs, defintval:0, TYPE_UINT, 0}, \ {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \ {"s" , CONFIG_HLP_SNR, 0, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0}, \ } diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c index 9a09a1247c..1f85132186 100644 --- a/executables/ocp-gnb.c +++ b/executables/ocp-gnb.c @@ -61,8 +61,6 @@ uint32_t do_forms=0; unsigned int mmapped_dma=0; int8_t threequarter_fs=0; -uint32_t target_dl_mcs = 28; //maximum allowed mcs -uint32_t target_ul_mcs = 20; int chain_offset=0; uint16_t sl_ahead=6; uint16_t sf_ahead=6; @@ -122,7 +120,6 @@ int restart_L1L2(module_id_t gnb_id) { } static int wait_for_sync = 0; -static char *itti_dump_file = NULL; static double snr_dB=20; static int DEFBANDS[] = {7}; static int DEFENBS[] = {0}; diff --git a/openair1/PHY/TOOLS/calibration_scope.c b/openair1/PHY/TOOLS/calibration_scope.c new file mode 100644 index 0000000000..da1acb5175 --- /dev/null +++ b/openair1/PHY/TOOLS/calibration_scope.c @@ -0,0 +1,387 @@ +#include +#include +#include "executables/softmodem-common.h" +#include "executables/nr-softmodem-common.h" +#include +#include + +#define TPUT_WINDOW_LENGTH 100 +#define ScaleZone 4 + +const FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW}; +const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED}; + +typedef struct { + int16_t r; + int16_t i; +} scopeSample_t; +#define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i) +typedef struct { + void ** samplesRx; + openair0_device *rfdevice; +} calibData_t; + +typedef struct OAIgraph { + FL_OBJECT *graph; + FL_OBJECT *text; + float maxX; + float maxY; + float minX; + float minY; + int x; + int y; + int w; + int h; + int waterFallh; + double *waterFallAvg; + boolean_t initDone; + int iteration; + void (*funct) (struct OAIgraph *graph, calibData_t *); +} OAIgraph_t; + + +/* Forms and Objects */ +typedef struct { + calibData_t * context; + FL_FORM *phy_scope; + OAIgraph_t graph[20]; + FL_OBJECT *button_0; +} OAI_phy_scope_t; + +typedef struct { + FL_FORM *stats_form; + void *vdata; + char *cdata; + long ldata; + FL_OBJECT *stats_text; + FL_OBJECT *stats_button; +} FD_stats_form; + +static void drawsymbol(FL_OBJECT *obj, int id, + FL_POINT *p, int n, int w, int h) { + fl_points( p, n, FL_YELLOW); +} + +#define WATERFALL 10000 + +static void commonGraph(OAIgraph_t *graph, int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) { + if (type==WATERFALL) { + graph->waterFallh=h-15; + graph->waterFallAvg=malloc(sizeof(*graph->waterFallAvg) * graph->waterFallh); + + for (int i=0; i< graph->waterFallh; i++) + graph->waterFallAvg[i]=0; + + graph->graph=fl_add_canvas(FL_NORMAL_CANVAS, x, y, w, graph->waterFallh, label); + graph->text=fl_add_text(FL_NORMAL_TEXT, x, y+graph->waterFallh, w, 15, label); + fl_set_object_lcolor(graph->text,FL_WHITE); + fl_set_object_color(graph->text, FL_BLACK, FL_BLACK); + fl_set_object_lalign(graph->text, FL_ALIGN_CENTER ); + } else { + graph->graph=fl_add_xyplot(type, x, y, w, h, label); + fl_set_object_lcolor(graph->graph, FL_WHITE ); // Label color + fl_set_object_color(graph->graph, FL_BLACK, pointColor); + + for (int i=0; i< FL_MAX_XYPLOTOVERLAY; i++) + fl_set_xyplot_symbol(graph->graph, i, drawsymbol); + } + + graph->x=x; + graph->y=y; + graph->w=w; + graph->h=h; + graph->maxX=0; + graph->maxY=0; + graph->minX=0; + graph->minY=0; + graph->initDone=false; + graph->iteration=0; +} + +static OAIgraph_t calibrationCommonGraph( void (*funct) (OAIgraph_t *graph, calibData_t *context), + int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) { + OAIgraph_t graph; + commonGraph(&graph, type, x, y, w, h, label, pointColor); + graph.funct=funct; + return graph; +} + + +static void setRange(OAIgraph_t *graph, float minX, float maxX, float minY, float maxY) { + if ( maxX > graph->maxX || minX < graph->minX || + abs(maxX-graph->maxX)>abs(graph->maxX)/2 || + abs(maxX-graph->maxX)>abs(graph->maxX)/2 ) { + graph->maxX/=2; + graph->minX/=2; + graph->maxX=max(graph->maxX,maxX); + graph->minX=min(graph->minX,minX); + fl_set_xyplot_xbounds(graph->graph, graph->minX*1.2, graph->maxX*1.2); + } + + if ( maxY > graph->maxY || minY < graph->minY || + abs(maxY-graph->maxY)>abs(graph->maxY)/2 || + abs(maxY-graph->maxY)>abs(graph->maxY)/2 ) { + graph->maxY/=2; + graph->minY/=2; + graph->maxY=max(graph->maxY,maxY); + graph->minY=min(graph->minY,minY); + fl_set_xyplot_ybounds(graph->graph, graph->minY*1.2, graph->maxY*1.2); + } +} + +static void oai_xygraph_getbuff(OAIgraph_t *graph, float **x, float **y, int len, int layer) { + float *old_x; + float *old_y; + int old_len=-1; + + if (graph->iteration >1) + fl_get_xyplot_data_pointer(graph->graph, layer, &old_x, &old_y, &old_len); + + if (old_len != len) { + LOG_W(HW,"allocating graph of %d scope\n", len); + float values[len]; + float time[len]; + + // make time in case we will use it + for (int i=0; igraph,time,values,len,"","",""); + else + fl_add_xyplot_overlay(graph->graph,layer,time,values,len,rx_antenna_colors[layer]); + + fl_get_xyplot_data_pointer(graph->graph, layer, &old_x, &old_y, &old_len); + AssertFatal(old_len==len,""); + } + + *x=old_x; + *y=old_y; +} + +static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, boolean_t NoAutoScale) { + fl_redraw_object(graph->graph); + + if ( NoAutoScale && graph->iteration%NoAutoScale == 0) { + float maxX=0, maxY=0, minX=0, minY=0; + + for (int k=0; kiteration++; +} + +static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const int datasize, const int divisions, const char *label) { + if ( values == NULL ) + return; + fl_winset(FL_ObjWin(graph->graph)); + const int samplesPerPixel=datasize/graph->w; + int displayPart=graph->waterFallh-ScaleZone; + int row=graph->iteration%displayPart; + double avg=0; + + for (int i=0; i < displayPart; i++) + avg+=graph->waterFallAvg[i]; + + avg/=displayPart; + graph->waterFallAvg[row]=0; + + for (int pix=0; pixw; pix++) { + scopeSample_t *end=values+(pix+1)*samplesPerPixel; + end-=2; + AssertFatal(end <= values+datasize,"diff : %ld", end-values+datasize); + double val=0; + + for (scopeSample_t *s=values+(pix)*samplesPerPixel; + s waterFallAvg[row]+=val/graph->w; + int col=0; + + if (val > avg*2 ) + col=1; + + if (val > avg*10 ) + col=2; + + if (val > avg*100 ) + col=3; + + fl_point(pix, graph->iteration%displayPart, water_colors[col]); + } + + if (graph->initDone==false) { + for ( int i=0; i < graph->waterFallh; i++ ) + for ( int j = 0 ; j < graph->w ; j++ ) + fl_point(j, i, FL_BLACK); + + for ( int i=1; iwaterFallh; j++) + fl_point(i*(graph->w/divisions),j, FL_WHITE); + + graph->initDone=true; + } + + fl_set_object_label_f(graph->text, "%s, avg I/Q pow: %4.1f", label, sqrt(avg)); + graph->iteration++; +} + +static void genericPowerPerAntena(OAIgraph_t *graph, const int nb_ant, const scopeSample_t **data, const int len) { + float *values, *time; + oai_xygraph_getbuff(graph, &time, &values, len, 0); + + for (int ant=0; antsamplesRx[0], + 0, 0, + "X axis:one frame in time"); +} +static void gNBfreqWaterFall (OAIgraph_t *graph, calibData_t *context) { + //use 1st antenna + genericWaterFall(graph, (scopeSample_t *)context->samplesRx[0], + 0, 0, + "X axis:one frame in time"); +} +static void timeResponse (OAIgraph_t *graph, calibData_t *context) { + #if 0 + const int len=2*phy_vars_gnb->frame_parms.ofdm_symbol_size; + float *values, *time; + oai_xygraph_getbuff(graph, &time, &values, len, 0); + const int ant=0; // display antenna 0 for each UE + + for (int ue=0; uepusch_vars[ue]->ul_ch_estimates_time[ant]; + + if (data != NULL) { + for (int i=0; iframe_parms; + int sz=frame_parms->N_RB_UL*12*frame_parms->symbols_per_slot; + + for (int ue=0; uepusch_vars[ue]->rxdataF_comp[0]; + float *I, *Q; + oai_xygraph_getbuff(graph, &I, &Q, sz, ue); + + if (pusch_comp) { + for (int k=0; kcontext=context; + // Define form + fdui->phy_scope = fl_bgn_form( FL_NO_BOX, 800, 800 ); + // This the whole UI box + obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 800, "" ); + fl_set_object_color( obj, FL_BLACK, FL_WHITE ); + int curY=0,x,y,w,h; + // Received signal + fdui->graph[0] = calibrationCommonGraph( gNBWaterFall, WATERFALL, 0, curY, 400, 100, + "Received Signal (Time-Domain, one frame)", FL_RED ); + + // Time-domain channel response + //fdui->graph[1] = calibrationCommonGraph( timeResponse, FL_NORMAL_XYPLOT, 410, curY, 400, 100, "SRS Frequency Response (samples, abs)", FL_RED ); + fl_get_object_bbox(fdui->graph[0].graph,&x, &y,&w, &h); + curY+=h; + // Frequency-domain channel response + fdui->graph[1] = calibrationCommonGraph( gNBfreqWaterFall, WATERFALL, 0, curY, 800, 100, + "Channel Frequency domain (RE, one frame)", FL_RED ); + fl_get_object_bbox(fdui->graph[1].graph,&x, &y,&w, &h); + curY+=h+20; + // LLR of PUSCH + //fdui->graph[3] = calibrationCommonGraph( puschLLR, FL_POINTS_XYPLOT, 0, curY, 500, 200, "PUSCH Log-Likelihood Ratios (LLR, mag)", FL_YELLOW ); + // I/Q PUSCH comp + fdui->graph[2] = calibrationCommonGraph( puschIQ, FL_POINTS_XYPLOT, 500, curY, 300, 200, + "PUSCH I/Q of MF Output", FL_YELLOW ); + fl_get_object_bbox(fdui->graph[2].graph,&x, &y,&w, &h); + curY+=h; + //fl_get_object_bbox(fdui->graph[6].graph,&x, &y,&w, &h); + curY+=h; + fdui->graph[3].graph=NULL; + fl_end_form( ); + fdui->phy_scope->fdui = fdui; + fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, "LTE UL SCOPE gNB"); + return fdui; +} + +void calibrationScope(OAI_phy_scope_t *form) { + int i=0; + + while (form->graph[i].graph) { + form->graph[i].funct(form->graph+i, form->context); + i++; + } + + //fl_check_forms(); +} + +static void *scopeThread(void *arg) { + calibData_t * context = (calibData_t *)arg; + size_t stksize=0; + pthread_attr_t atr; + pthread_attr_init(&atr); + pthread_attr_getstacksize(&atr, &stksize); + pthread_attr_setstacksize(&atr,32*1024*1024 ); + sleep(3); // no clean interthread barriers + int fl_argc=1; + char *name="Calibration-scope"; + fl_initialize (&fl_argc, &name, NULL, 0, 0); + OAI_phy_scope_t *form = createScopeCalibration(context); + + while (!oai_exit) { + calibrationScope(form); + usleep(99*1000); + } + + return NULL; +} + +void CalibrationInitScope(void ** samplesRx,openair0_device *rfdevice) { + pthread_t forms_thread; + calibData_t * tmp=(calibData_t *) malloc(sizeof(*tmp)); + tmp->samplesRx=samplesRx; + tmp->rfdevice=rfdevice; + threadCreate(&forms_thread, scopeThread, (void*) tmp, "scope", -1, OAI_PRIORITY_RT_LOW); +} diff --git a/openair1/PHY/TOOLS/calibration_scope.h b/openair1/PHY/TOOLS/calibration_scope.h new file mode 100644 index 0000000000..052a1a6b6e --- /dev/null +++ b/openair1/PHY/TOOLS/calibration_scope.h @@ -0,0 +1,5 @@ +#ifndef CALIB_SCOPE_H +#define CALIB_SCOPE_H + +void CalibrationInitScope(void ** samplesRx,openair0_device *rfdevice); +#endif diff --git a/openair1/PHY/TOOLS/calibration_test.c b/openair1/PHY/TOOLS/calibration_test.c new file mode 100644 index 0000000000..376315734a --- /dev/null +++ b/openair1/PHY/TOOLS/calibration_test.c @@ -0,0 +1,329 @@ +#include +#include +#include +#include +#include + + +volatile int oai_exit=false; +unsigned int mmapped_dma=0; +int single_thread_flag; +uint32_t timing_advance; +int8_t threequarter_fs; +int usrp_tx_thread; +uint64_t downlink_frequency[MAX_NUM_CCs][4]; +int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; +int opp_enabled; +static double snr_dB=20; +#include + +int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_state) {return 0;} +void nfapi_setmode(nfapi_mode_t nfapi_mode) {} +void set_taus_seed(unsigned int seed_init){}; + +int main(int argc, char **argv) { + ///static configuration for NR at the moment + if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == NULL) { + exit_fun("[SOFTMODEM] Error, configuration module init failed\n"); + } + set_softmodem_sighandler(); + setvbuf(stdout, NULL, _IONBF, 0); + setvbuf(stderr, NULL, _IONBF, 0); + logInit(); + paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ; + + CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP); + get_common_options(SOFTMODEM_GNB_BIT ); + config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL); + CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP); + configure_linux(); + + + int N_RB=50; + int subCarrierFreq=30e3; + int sampling_rate=30.72e6; + int DFT=2048; + int TxAdvanceInDFTSize=12; + int antennas=1; + uint64_t freq=3619.200e6; + int rxGain=90; + int txGain=90; + int filterBand=40e6; + char * usrp_addrs="type=b200"; + + openair0_config_t openair0_cfg= { + //! Module ID for this configuration + .Mod_id=0, + //! device log level + .log_level=0, + //! duplexing mode + .duplex_mode=0, + //! number of downlink resource blocks + .num_rb_dl=N_RB, + //! number of samples per frame + .samples_per_frame=0, + //! the sample rate for both transmit and receive. + .sample_rate=sampling_rate, + //device is doing mmapped DMA transfers + .mmapped_dma=0, + //! offset in samples between TX and RX paths + .tx_sample_advance=0, + //! samples per packet on the fronthaul interface + .samples_per_packet=1024, + //! number of RX channels (=RX antennas) + .rx_num_channels=antennas, + //! number of TX channels (=TX antennas) + .tx_num_channels=antennas, + //! \brief Center frequency in Hz for RX. + //! index: [0..rx_num_channels[ + .rx_freq={freq,freq,freq,freq}, + //! \brief Center frequency in Hz for TX. + //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels + .tx_freq={freq,freq,freq,freq}, + //! \brief memory + //! \brief Pointer to Calibration table for RX gains + .rx_gain_calib_table=NULL, + //! mode for rxgain (ExpressMIMO2) + .rxg_mode={0}, + //! \brief Gain for RX in dB. + //! index: [0..rx_num_channels] + .rx_gain={rxGain,rxGain,rxGain,rxGain}, + //! \brief Gain offset (for calibration) in dB + //! index: [0..rx_num_channels] + .rx_gain_offset={0}, + //! gain for TX in dB + .tx_gain={txGain,txGain,txGain,txGain}, + //! RX bandwidth in Hz + .rx_bw=filterBand, + //! TX bandwidth in Hz + .tx_bw=filterBand, + //! clock source + .clock_source=external,//internal gpsdo external + //! timing_source + .time_source=internal, //internal gpsdo external + //! Manual SDR IP address + //#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + .sdr_addrs=usrp_addrs, + //! Auto calibration flag + .autocal={0}, + //! rf devices work with x bits iqs when oai have its own iq format + //! the two following parameters are used to convert iqs + .iq_txshift=0, + .iq_rxrescale=0, + //! Configuration file for LMS7002M + .configFilename="", + //! remote IP/MAC addr for Ethernet interface + .remote_addr="", + //! remote port number for Ethernet interface + .remote_port=0, + //! local IP/MAC addr for Ethernet interface (eNB/BBU, UE) + .my_addr=0, + //! local port number for Ethernet interface (eNB/BBU, UE) + .my_port=0, + //! record player configuration, definition in record_player.h + .recplay_mode=0, + .recplay_conf=NULL, + //! number of samples per tti + .samples_per_tti=0, + //! check for threequarter sampling rate + .threequarter_fs=0, + }; + //----------------------- + openair0_device rfdevice= { + /*!tx write thread*/ + //.write_thread={0}, + /*!brief Module ID of this device */ + .Mod_id=0, + /*!brief Component Carrier ID of this device */ + .CC_id=0, + /*!brief Type of this device */ + .type=NONE_DEV, + /*!brief Transport protocol type that the device supports (in case I/Q samples need to be transported) */ + .transp_type=NONE_TP, + /*!brief Type of the device's host (RAU/RRU) */ + .host_type=MIN_HOST_TYPE, + /* !brief RF frontend parameters set by application */ + .openair0_cfg=NULL, //set by device_init + /* !brief ETH params set by application */ + .eth_params=NULL, + //! record player data, definition in record_player.h + .recplay_state=NULL, + /* !brief Indicates if device already initialized */ + .is_init=0, + /*!brief Can be used by driver to hold internal structure*/ + .priv=NULL, + /* Functions API, which are called by the application*/ + /*! \brief Called to start the transceiver. Return 0 if OK, < 0 if error + @param device pointer to the device structure specific to the RF hardware target + */ + .trx_start_func=NULL, + + /*! \brief Called to configure the device + @param device pointer to the device structure specific to the RF hardware target + */ + .trx_config_func=NULL, + + /*! \brief Called to send a request message between RAU-RRU on control port + @param device pointer to the device structure specific to the RF hardware target + @param msg pointer to the message structure passed between RAU-RRU + @param msg_len length of the message + */ + .trx_ctlsend_func=NULL, + + /*! \brief Called to receive a reply message between RAU-RRU on control port + @param device pointer to the device structure specific to the RF hardware target + @param msg pointer to the message structure passed between RAU-RRU + @param msg_len length of the message + */ + .trx_ctlrecv_func=NULL, + + /*! \brief Called to send samples to the RF target + @param device pointer to the device structure specific to the RF hardware target + @param timestamp The timestamp at whicch the first sample MUST be sent + @param buff Buffer which holds the samples (2 dimensional) + @param nsamps number of samples to be sent + @param number of antennas + @param flags flags must be set to TRUE if timestamp parameter needs to be applied + */ + .trx_write_func=NULL, + + /*! \brief Called to send samples to the RF target + @param device pointer to the device structure specific to the RF hardware target + @param timestamp The timestamp at whicch the first sample MUST be sent + @param buff Buffer which holds the samples (1 dimensional) + @param nsamps number of samples to be sent + @param antenna_id index of the antenna if the device has multiple anteannas + @param flags flags must be set to TRUE if timestamp parameter needs to be applied + */ + .trx_write_func2=NULL, + + /*! \brief Receive samples from hardware. + * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for + * the first channel. *ptimestamp is the time at which the first sample + * was received. + * \param device the hardware to use + * \param[out] ptimestamp the time at which the first sample was received. + * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps. + * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte. + * \param num_antennas number of antennas from which to receive samples + * \returns the number of sample read + */ + + .trx_read_func=NULL, + + /*! \brief Receive samples from hardware, this version provides a single antenna at a time and returns. + * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for + * the first channel. *ptimestamp is the time at which the first sample + * was received. + * \param device the hardware to use + * \param[out] ptimestamp the time at which the first sample was received. + * \param[out] buff A pointers to a buffer for received samples. The buffer must be large enough to hold the number of samples \ref nsamps. + * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte. + * \param antenna_id Index of antenna from which samples were received + * \returns the number of sample read + */ + .trx_read_func2=NULL, + + /*! \brief print the device statistics + * \param device the hardware to use + * \returns 0 on success + */ + /*! \brief print the device statistics + * \param device the hardware to use + * \returns 0 on success + */ + .trx_get_stats_func=NULL, + + /*! \brief Reset device statistics + * \param device the hardware to use + * \returns 0 in success + */ + .trx_reset_stats_func=NULL, + + /*! \brief Terminate operation of the transceiver -- free all associated resources + * \param device the hardware to use + */ + .trx_end_func=NULL, + + /*! \brief Stop operation of the transceiver + */ + .trx_stop_func=NULL, + + /* Functions API related to UE*/ + + /*! \brief Set RX feaquencies + * \param device the hardware to use + * \param openair0_cfg RF frontend parameters set by application + * \param exmimo_dump_config dump EXMIMO configuration + * \returns 0 in success + */ + .trx_set_freq_func=NULL, + + /*! \brief Set gains + * \param device the hardware to use + * \param openair0_cfg RF frontend parameters set by application + * \returns 0 in success + */ + .trx_set_gains_func=NULL, + + /*! \brief RRU Configuration callback + * \param idx RU index + * \param arg pointer to capabilities or configuration + */ + .configure_rru=NULL, + /*! \brief Pointer to generic RRU private information + */ + .thirdparty_priv=NULL, + .thirdparty_init=NULL, + /*! \brief Callback for Third-party RRU Cleanup routine + \param device the hardware configuration to use + */ + .thirdparty_cleanup=NULL, + + /*! \brief Callback for Third-party start streaming routine + \param device the hardware configuration to use + */ + .thirdparty_startstreaming=NULL, + + /*! \brief RRU Configuration callback + * \param idx RU index + * \param arg pointer to capabilities or configuration + */ + .trx_write_init=NULL, + /* \brief Get internal parameter + * \param id parameter to get + * \return a pointer to the parameter + */ + .get_internal_parameter=NULL, + }; + + openair0_device_load(&rfdevice,&openair0_cfg); + + void ** samplesRx = (void **)malloc16(antennas* sizeof(struct complex16 *) ); + void ** samplesTx = (void **)malloc16(antennas* sizeof(struct complex16 *) ); + + for (int i=0; i +#include #include #include #include "record_player.h" From c0ef3e6f88b354409ae1330051348edac1d4e505 Mon Sep 17 00:00:00 2001 From: Laurent OpenCells Date: Sat, 3 Apr 2021 23:37:58 +0200 Subject: [PATCH 109/125] fix gcc reported issues --- cmake_targets/CMakeLists.txt | 1 + .../install_external_packages.ubuntu20 | 9 +- common/utils/msc/msc.c | 1 + common/utils/msc/msc.h | 2 +- executables/main-ocp.c | 3 + executables/nr-softmodem.c | 3 +- executables/nr-uesoftmodem.c | 2 + executables/ocp-gnb.c | 3 +- executables/thread-common.h | 2 +- nfapi/oai_integration/nfapi_pnf.c | 1 - nfapi/oai_integration/nfapi_pnf.h | 1 + openair1/PHY/CODING/3gpplte_sse.c | 2 - openair1/PHY/CODING/TESTBENCH/ldpctest.c | 26 ++- openair1/PHY/CODING/TESTBENCH/polartest.c | 9 +- .../PHY/CODING/TESTBENCH/smallblocktest.c | 5 +- openair1/PHY/NR_REFSIG/nr_gen_mod_table.c | 12 ++ openair1/PHY/NR_REFSIG/nr_mod_table.h | 12 +- openair1/PHY/NR_REFSIG/pss_nr.h | 3 +- openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c | 36 ++++ openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h | 62 ++---- openair1/PHY/TOOLS/lte_enb_scope.c | 3 +- openair1/PHY/TOOLS/lte_phy_scope.c | 4 - openair1/PHY/TOOLS/time_meas.c | 19 +- openair1/PHY/TOOLS/time_meas.h | 1 - openair1/PHY/impl_defs_nr.h | 10 +- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- openair1/SCHED_NR_UE/pucch_uci_ue_nr.c | 187 ++++++++++++++++ openair1/SCHED_NR_UE/pucch_uci_ue_nr.h | 202 ------------------ openair1/SIMULATION/LTE_PHY/common_sim.h | 8 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 5 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 5 +- openair1/SIMULATION/NR_PHY/dlsim.c | 6 +- openair1/SIMULATION/NR_PHY/prachsim.c | 1 + openair1/SIMULATION/NR_PHY/ulsim.c | 5 +- openair1/SIMULATION/TOOLS/phase_noise.c | 1 + openair1/SIMULATION/TOOLS/sim.h | 1 - .../MAC/flexran_agent_mac_internal.h | 2 - .../RRC/flexran_agent_rrc_defs.h | 2 - openair2/ENB_APP/flexran_agent_common.h | 1 - openair2/ENB_APP/flexran_agent_net_comm.c | 2 +- .../ENB_APP/flexran_agent_ran_api_to_fix.c | 33 +++ openair2/LAYER2/MAC/config_ue.c | 4 - openair2/LAYER2/MAC/defs_NB_IoT.h | 3 - openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 48 +++++ openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 88 ++++---- .../LAYER2/PROTO_AGENT/proto_agent_common.c | 6 +- .../LAYER2/PROTO_AGENT/proto_agent_common.h | 1 - .../LAYER2/PROTO_AGENT/proto_agent_net_comm.c | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c | 2 + openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h | 2 - openair2/LAYER2/RLC/rlc.c | 19 ++ openair2/LAYER2/RLC/rlc.h | 14 +- openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c | 1 - openair2/LAYER2/rlc_v2/rlc_oai_api.c | 1 - openair2/NETWORK_DRIVER/UE_IP/netlink.c | 1 + openair2/NR_PHY_INTERFACE/NR_IF_Module.c | 26 +-- openair2/PHY_INTERFACE/IF_Module.c | 4 +- openair2/PHY_INTERFACE/phy_stub_UE.c | 1 + openair2/PHY_INTERFACE/phy_stub_UE.h | 3 +- openair2/RRC/LTE/rrc_UE.c | 4 +- openair2/RRC/NR_UE/rrc_UE.c | 1 + openair2/RRC/NR_UE/rrc_vars.h | 2 +- openair3/GTPV1-U/gtpv1u_eNB.c | 1 + openair3/NAS/UE/nas_ue_task.c | 1 + .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 1 - targets/RT/USER/lte-softmodem.c | 3 + targets/RT/USER/lte-ue.c | 1 + targets/RT/USER/lte-uesoftmodem.c | 1 + targets/RT/USER/rt_wrapper.c | 1 + 69 files changed, 512 insertions(+), 425 deletions(-) create mode 100644 openair2/ENB_APP/flexran_agent_ran_api_to_fix.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 477dfb7976..8d8adb6eb0 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -3058,6 +3058,7 @@ add_executable(nr-softmodem ${T_SOURCE} ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} + ${OPENAIR2_DIR}/ENB_APP/flexran_agent_ran_api_to_fix.c ) target_link_libraries (nr-softmodem diff --git a/cmake_targets/install_external_packages.ubuntu20 b/cmake_targets/install_external_packages.ubuntu20 index 9ef79be9c2..4f0fbf5946 100755 --- a/cmake_targets/install_external_packages.ubuntu20 +++ b/cmake_targets/install_external_packages.ubuntu20 @@ -83,6 +83,8 @@ get_distribution_release() { check_supported_distribution() { case $(get_distribution_release) in "ubuntu20.04") return 0 ;; + "ubuntu20.10") return 0 ;; + "ubuntu21.04") return 0 ;; esac return 1 } @@ -329,6 +331,7 @@ check_install_ubuntu_packages() { $SUDO apt install -y software-properties-common case "$(get_distribution_release)" in "ubuntu20.04") + "ubuntu21.04") specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev" LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu" LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so" @@ -345,7 +348,6 @@ check_install_ubuntu_packages() { openvpn \ pkg-config \ python3-dev \ - python-pexpect \ sshfs \ swig \ tshark \ @@ -358,7 +360,6 @@ check_install_ubuntu_packages() { iperf3 \ android-tools-adb \ wvdial \ - python-numpy \ sshpass \ nscd \ bc \ @@ -379,7 +380,6 @@ check_install_ubuntu_packages() { git \ graphviz \ gtkwave \ - guile-2.0-dev \ iperf \ iptables \ libxtables-dev \ @@ -419,7 +419,8 @@ check_install_ubuntu_packages() { libxpm-dev \ libboost-all-dev \ nettle-dev \ - nettle-bin + nettle-bin \ + libreadline-dev fi $SUDO update-alternatives --set "$LAPACK_LIBNAME" "$LAPACK_TARGET" diff --git a/common/utils/msc/msc.c b/common/utils/msc/msc.c index 7cc5f79f90..84b723b022 100644 --- a/common/utils/msc/msc.c +++ b/common/utils/msc/msc.c @@ -52,6 +52,7 @@ FILE *g_msc_fd; char g_msc_proto2str[MAX_MSC_PROTOS][MSC_MAX_PROTO_NAME_LENGTH]; +msc_interface_t msc_interface; typedef unsigned long msc_message_number_t; typedef struct msc_queue_item_s { diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h index aab872cfe1..adb0d9e657 100644 --- a/common/utils/msc/msc.h +++ b/common/utils/msc/msc.h @@ -117,7 +117,7 @@ void msc_log_message( #define MESSAGE_CHART_GENERATOR msc_interface.msc_loaded -msc_interface_t msc_interface; +extern msc_interface_t msc_interface; #define MSC_INIT(arg1,arg2) if(msc_interface.msc_loaded) msc_interface.msc_init(arg1,arg2) #define MSC_START_USE if(msc_interface.msc_loaded) msc_interface.msc_start_use #define MSC_END if(msc_interface.msc_loaded) msc_interface.msc_end diff --git a/executables/main-ocp.c b/executables/main-ocp.c index ae1db7195b..93a24f9ddf 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -73,6 +73,9 @@ int sync_var=-1; //!< protected by mutex \ref sync_mutex. int config_sync_var=-1; volatile int oai_exit = 0; double cpuf; +msc_interface_t msc_interface; +THREAD_STRUCT thread_struct; + uint16_t sf_ahead=4; //uint16_t slot_ahead=6; int otg_enabled; diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 692e4d530f..fc5c284ef2 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -92,11 +92,12 @@ pthread_mutex_t nfapi_sync_mutex; int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex extern uint8_t nfapi_mode; // Default to monolithic mode - +THREAD_STRUCT thread_struct; pthread_cond_t sync_cond; pthread_mutex_t sync_mutex; int sync_var=-1; //!< protected by mutex \ref sync_mutex. int config_sync_var=-1; +msc_interface_t msc_interface; volatile int start_gNB = 0; volatile int oai_exit = 0; diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 2854457eee..c5364e38af 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -88,6 +88,8 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "executables/thread-common.h" extern const char *duplex_mode[]; +msc_interface_t msc_interface; +THREAD_STRUCT thread_struct; // Thread variables pthread_cond_t nfapi_sync_cond; diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c index 1f85132186..a12cef9052 100644 --- a/executables/ocp-gnb.c +++ b/executables/ocp-gnb.c @@ -77,6 +77,7 @@ pthread_cond_t nfapi_sync_cond; int nfapi_sync_var=-1; double cpuf; +THREAD_STRUCT thread_struct; pthread_cond_t sync_cond; pthread_mutex_t sync_mutex; @@ -93,7 +94,7 @@ time_stats_t softmodem_stats_rx_sf; // total rx time // not used but needed for link openair0_config_t openair0_cfg[MAX_CARDS]; uint16_t slot_ahead=6; - +msc_interface_t msc_interface; AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]; AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]; int flexran_agent_start(mid_t mod_id) { diff --git a/executables/thread-common.h b/executables/thread-common.h index 6f3af3cfc0..0aaeb3c30e 100644 --- a/executables/thread-common.h +++ b/executables/thread-common.h @@ -3,7 +3,7 @@ #include "PHY/defs_common.h" -THREAD_STRUCT thread_struct; +extern THREAD_STRUCT thread_struct; static inline void set_parallel_conf(char *parallel_conf) { mapping config[]= { diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c index 4ca02ed929..0329b13dac 100644 --- a/nfapi/oai_integration/nfapi_pnf.c +++ b/nfapi/oai_integration/nfapi_pnf.c @@ -73,7 +73,6 @@ extern pthread_mutex_t nfapi_sync_mutex; extern int nfapi_sync_var; extern int sync_var; -char uecap_xer_in; extern void init_eNB_afterRU(void); extern void init_UE_stub(int nb_inst,int,int); diff --git a/nfapi/oai_integration/nfapi_pnf.h b/nfapi/oai_integration/nfapi_pnf.h index b3ab7cbdbc..61d4847eba 100644 --- a/nfapi/oai_integration/nfapi_pnf.h +++ b/nfapi/oai_integration/nfapi_pnf.h @@ -21,6 +21,7 @@ #if !defined(NFAPI_PNF_H__) #define NFAPI_PNF_H__ +extern nfapi_ue_release_request_body_t release_rntis; int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind); void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port); void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port); diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c index 2a7b789650..fffd04ea3c 100644 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -44,8 +44,6 @@ //#define DEBUG_TURBO_ENCODER 1 //#define CALLGRIND 1 -unsigned short threegpplte_interleaver_output; -unsigned long long threegpplte_interleaver_tmp; #if defined(__x86_64__) || defined(__i386__) struct treillis { diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c index e16c909835..f6769251cd 100644 --- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c +++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c @@ -116,7 +116,6 @@ int test_ldpc(short No_iteration, double sigma; sigma = 1.0/sqrt(2*SNR); opp_enabled=1; - cpu_freq_GHz = get_cpu_freq_GHz(); //short test_input[block_length]; unsigned char *test_input[MAX_NUM_DLSCH_SEGMENTS]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};; //short *c; //padded codeword @@ -614,7 +613,6 @@ int main(int argc, char *argv[]) exit(1); break; } - cpu_freq_GHz = get_cpu_freq_GHz(); //printf("the decoder supports BG2, Kb=10, Z=128 & 256\n"); //printf(" range of blocklength: 1201 -> 1280, 2401 -> 2560\n"); printf("block length %d: \n", block_length); @@ -704,25 +702,25 @@ int main(int argc, char *argv[]) printf("SNR %f, Std iterations: %f\n",SNR, dec_iter->n_iter_std); printf("SNR %f, Max iterations: %d\n",SNR, dec_iter->n_iter_max); printf("\n"); - printf("Encoding time mean: %15.3f us\n",(double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz); - printf("Encoding time std: %15.3f us\n",sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz,2))); - printf("Encoding time max: %15.3f us\n",(double)time_optim->max/1000.0/cpu_freq_GHz); + printf("Encoding time mean: %15.3f us\n",(double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz()); + printf("Encoding time std: %15.3f us\n",sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz(),2))); + printf("Encoding time max: %15.3f us\n",(double)time_optim->max/1000.0/get_cpu_freq_GHz()); printf("\n"); - printf("Decoding time mean: %15.3f us\n",(double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz); - printf("Decoding time std: %15.3f us\n",sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz,2))); - printf("Decoding time max: %15.3f us\n",(double)time_decoder->max/1000.0/cpu_freq_GHz); + printf("Decoding time mean: %15.3f us\n",(double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz()); + printf("Decoding time std: %15.3f us\n",sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(),2))); + printf("Decoding time max: %15.3f us\n",(double)time_decoder->max/1000.0/get_cpu_freq_GHz()); fprintf(fd,"%f %f %f %f %f %f %f %f %f %f %f %f %d \n", SNR, (double)decoded_errors[i]/(double)n_trials , (double)errors_bit/(double)n_trials/(double)block_length/(double)n_segments , errors_bit_uncoded/(double)n_trials/(double)n_segments , - (double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz, - sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz,2)), - (double)time_optim->max/1000.0/cpu_freq_GHz, - (double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz, - sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz,2)), - (double)time_decoder->max/1000.0/cpu_freq_GHz, + (double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz(), + sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz(),2)), + (double)time_optim->max/1000.0/get_cpu_freq_GHz(), + (double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(), + sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(),2)), + (double)time_decoder->max/1000.0/get_cpu_freq_GHz(), dec_iter->n_iter_mean, dec_iter->n_iter_std, dec_iter->n_iter_max diff --git a/openair1/PHY/CODING/TESTBENCH/polartest.c b/openair1/PHY/CODING/TESTBENCH/polartest.c index d9adf3e24f..e43ba507ab 100644 --- a/openair1/PHY/CODING/TESTBENCH/polartest.c +++ b/openair1/PHY/CODING/TESTBENCH/polartest.c @@ -113,7 +113,6 @@ int main(int argc, char *argv[]) //Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.) time_stats_t timeEncoder,timeDecoder; opp_enabled=1; - cpu_freq_GHz = get_cpu_freq_GHz(); reset_meas(&timeEncoder); reset_meas(&timeDecoder); randominit(0); @@ -324,9 +323,9 @@ if (logFlag){ #endif //Iteration times are in microseconds. - timeEncoderCumulative+=(timeEncoder.diff/(cpu_freq_GHz*1000.0)); - timeDecoderCumulative+=(timeDecoder.diff/(cpu_freq_GHz*1000.0)); - if (logFlag) fprintf(logFile,",%f,%d,%u,%f,%f\n", SNR, nBitError, blockErrorState, (timeEncoder.diff/(cpu_freq_GHz*1000.0)), (timeDecoder.diff/(cpu_freq_GHz*1000.0))); + timeEncoderCumulative+=(timeEncoder.diff/(get_cpu_freq_GHz()*1000.0)); + timeDecoderCumulative+=(timeDecoder.diff/(get_cpu_freq_GHz()*1000.0)); + if (logFlag) fprintf(logFile,",%f,%d,%u,%f,%f\n", SNR, nBitError, blockErrorState, (timeEncoder.diff/(get_cpu_freq_GHz()*1000.0)), (timeDecoder.diff/(get_cpu_freq_GHz()*1000.0))); if (nBitError<0) { blockErrorCumulative++; @@ -348,7 +347,7 @@ if (logFlag){ printf("[ListSize=%d] SNR=%+8.3f, BLER=%9.6f, BER=%12.9f, t_Encoder=%9.3fus, t_Decoder=%9.3fus\n", decoderListSize, SNR, ((double)blockErrorCumulative/iterations), ((double)bitErrorCumulative / (iterations*testLength)), - (double)timeEncoder.diff/timeEncoder.trials/(cpu_freq_GHz*1000.0),(double)timeDecoder.diff/timeDecoder.trials/(cpu_freq_GHz*1000.0)); + (double)timeEncoder.diff/timeEncoder.trials/(get_cpu_freq_GHz()*1000.0),(double)timeDecoder.diff/timeDecoder.trials/(get_cpu_freq_GHz()*1000.0)); //(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations); if (blockErrorCumulative==0 && bitErrorCumulative==0) break; diff --git a/openair1/PHY/CODING/TESTBENCH/smallblocktest.c b/openair1/PHY/CODING/TESTBENCH/smallblocktest.c index 02d5dc64e0..f750d24977 100644 --- a/openair1/PHY/CODING/TESTBENCH/smallblocktest.c +++ b/openair1/PHY/CODING/TESTBENCH/smallblocktest.c @@ -13,7 +13,6 @@ int main(int argc, char *argv[]) { time_stats_t timeEncoder,timeDecoder; opp_enabled=1; - cpu_freq_GHz = get_cpu_freq_GHz(); reset_meas(&timeEncoder); reset_meas(&timeDecoder); randominit(0); @@ -141,8 +140,8 @@ int main(int argc, char *argv[]) SNR, ((double)bitErrorCumulative / (iterations*messageLength)), ((double)blockErrorCumulative/iterations), - ((double)timeEncoder.diff/timeEncoder.trials)/(cpu_freq_GHz), - ((double)timeDecoder.diff/timeDecoder.trials)/(cpu_freq_GHz*1000.0)); + ((double)timeEncoder.diff/timeEncoder.trials)/(get_cpu_freq_GHz()), + ((double)timeDecoder.diff/timeDecoder.trials)/(get_cpu_freq_GHz()*1000.0)); blockErrorCumulative=0; bitErrorCumulative=0; diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c index b0f9e6d03c..9ed2bd949f 100644 --- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c +++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c @@ -21,6 +21,18 @@ #include "nr_refsig.h" #include "nr_mod_table.h" +short nr_qpsk_mod_table[8]; + +int32_t nr_16qam_mod_table[16]; +#if defined(__SSE2__) +__m128i nr_qpsk_byte_mod_table[2048]; +#endif + +int64_t nr_16qam_byte_mod_table[1024]; + +int64_t nr_64qam_mod_table[4096]; + +int32_t nr_256qam_mod_table[512]; void nr_generate_modulation_table() { float sqrt2 = 0.70711; diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h index aa8b99f584..2c6964fe96 100644 --- a/openair1/PHY/NR_REFSIG/nr_mod_table.h +++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h @@ -29,16 +29,16 @@ #define NR_MOD_TABLE_QAM64_OFFSET 23 #define NR_MOD_TABLE_QAM256_OFFSET 87 -short nr_qpsk_mod_table[8]; +extern short nr_qpsk_mod_table[8]; -int32_t nr_16qam_mod_table[16]; +extern int32_t nr_16qam_mod_table[16]; #if defined(__SSE2__) -__m128i nr_qpsk_byte_mod_table[2048]; +extern __m128i nr_qpsk_byte_mod_table[2048]; #endif -int64_t nr_16qam_byte_mod_table[1024]; +extern int64_t nr_16qam_byte_mod_table[1024]; -int64_t nr_64qam_mod_table[4096]; +extern int64_t nr_64qam_mod_table[4096]; -int32_t nr_256qam_mod_table[512]; +extern int32_t nr_256qam_mod_table[512]; #endif diff --git a/openair1/PHY/NR_REFSIG/pss_nr.h b/openair1/PHY/NR_REFSIG/pss_nr.h index 19b9736bcb..b32d48a2e9 100644 --- a/openair1/PHY/NR_REFSIG/pss_nr.h +++ b/openair1/PHY/NR_REFSIG/pss_nr.h @@ -120,8 +120,7 @@ EXTERN int64_t *pss_corr_ue[NUMBER_PSS_SEQUENCE] ; /* profiling structure */ -EXTERN double cpuf; -time_stats_t generic_time[TIME_LAST]; +EXTERN time_stats_t generic_time[TIME_LAST]; #ifndef DEFINE_HEADER_ONLY diff --git a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c index 4a419ae926..dfd759f376 100644 --- a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c +++ b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c @@ -54,6 +54,42 @@ * *********************************************************************/ +/* Table 5.2.2.2-2: Definition of phi ( n ) for M ZC = 12 */ +const char phi_M_ZC_12[12*U_GROUP_NUMBER] += { +/* 0 1 2 3 4 5 6 7 8 9 10 11 */ +/* 0 */ 1, -1, 3, 1, 1, -1, -1, -1, 1, 3, -3, 1, +/* 1 */ -1, -1, -1, -1, 1, -3, -1, 3, 3, -1, -3, 1, +/* 2 */ -3, 1, -3, -3, -3, 3, -3, -1, 1, 1, 1, -3, +/* 3 */ -3, 3, 1, 3, -3, 1, 1, 1, 1, 3, -3, 3, +/* 4 */ -3, 1, 3, -1, -1, -3, -3, -1, -1, 3, 1, -3, +/* 5 */ -1, 1, 1, -1, 1, 3, 3, -1, -1, -3, 1, -3, +/* 6 */ -3, -3, -1, 3, 3, 3, -3, 3, -3, 1, -1, -3, +/* 7 */ -3, 3, -3, 3, 3, -3, -1, -1, 3, 3, 1, -3, +/* 8 */ -3, -1, -3, -1, -1, -3, 3, 3, -1, -1, 1, -3, +/* 9 */ -3, 3, 3, 3, -1, -3, -3, -1, -3, 1, 3, -3, +/* 10 */ 1, 3, -3, 1, 3, 3, 3, 1, -1, 1, -1, 3, +/* 11 */ -1, -3, 3, -1, -3, -3, -3, -1, 1, -1, 1, -3, +/* 12 */ 3, 1, 3, 1, 3, -3, -1, 1, 3, 1, -1, -3, +/* 13 */ -3, -3, 3, 3, 3, -3, -1, 1, -3, 3, 1, -3, +/* 14 */ -3, -1, 1, -3, 1, 3, 3, 3, -1, -3, 3, 3, +/* 15 */ -3, -3, 3, 1, -3, -3, -3, -1, 3, -1, 1, 3, +/* 16 */ -1, 1, 3, -3, 1, -1, 1, -1, -1, -3, 1, -1, +/* 17 */ -3, -1, -1, 1, 3, 1, 1, -1, 1, -1, -3, 1, +/* 18 */ -3, -1, 3, -3, -3, -1, -3, 1, -1, -3, 3, 3, +/* 19 */ -3, -3, 3, -3, -1, 3, 3, 3, -1, -3, 1, -3, +/* 20 */ -3, 1, -1, -1, 3, 3, -3, -1, -1, -3, -1, -3, +/* 21 */ -3, 1, 3, 3, -1, -1, -3, 3, 3, -3, 3, -3, +/* 22 */ -3, -1, -1, -3, -3, -1, -3, 3, 1, 3, -1, -3, +/* 23 */ -3, -1, 3, 1, -3, -1, -3, 3, 1, 3, 3, 1, +/* 24 */ -3, 3, 3, 1, -3, 3, -1, 1, 3, -3, 3, -3, +/* 25 */ 3, -1, -3, 3, -3, -1, 3, 3, 3, -3, -1, -3, +/* 26 */ 1, -1, 3, -1, -1, -1, -3, -1, 1, 1, 1, -3, +/* 27 */ -3, 3, 1, -3, 1, 3, -1, -1, 1, 3, 3, 3, +/* 28 */ -3, 3, -3, 3, -3, -3, 3, -1, -1, 1, 3, -3, +/* 29 */ -3, 3, 1, -1, 3, 3, -3, 1, -1, 1, -1, 1, +} +; int16_t *base_sequence_less_than_36(unsigned int M_ZC, unsigned int u, unsigned int scaling) diff --git a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h index 44d30da8f3..0e17e2b3f3 100644 --- a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h +++ b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h @@ -58,7 +58,7 @@ #define INDEX_SB_LESS_32 (4) /* index of dftsizes array for which subcarrier number is less than 36 */ -const uint16_t ul_allocated_re[SRS_SB_CONF] /* number of uplink allocated resource elements */ +EXTERN const uint16_t ul_allocated_re[SRS_SB_CONF] /* number of uplink allocated resource elements */ /* this table is derivated from TS 38.211 Table 6.4.1.4.3-1: SRS bandwidth configuration which gives m_SRS_b then all possible values of sequence length is */ /* M_sc_b_SRS = m_SRS_b * N_SC_RB/K_TC with K_TC = 2 or K_TC = 4 as specified in TS 38.211 6.4.1.4.3 */ #ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H @@ -82,7 +82,7 @@ m_SRS_b 224 116, 240 256 264 272 144 152 160 168 176 184 ; /* table of largest prime number lower than uplink allocated resource elements "ul_allocated_re" */ -const uint16_t ref_ul_primes[SRS_SB_CONF] +EXTERN const uint16_t ref_ul_primes[SRS_SB_CONF] #ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H = { /* 6, 12, 18, 24, 30, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, 180, 192, 204, 216, 228, 240, */ @@ -101,10 +101,10 @@ const uint16_t ref_ul_primes[SRS_SB_CONF] ; /* Low-PAPR base sequence; see TS 38.211 clause 5.2.2 */ -int16_t *rv_ul_ref_sig[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][SRS_SB_CONF]; +EXTERN int16_t *rv_ul_ref_sig[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][SRS_SB_CONF]; /* 38.211 table Table 5.2.2.2-1: Definition of phi(n) for M_ZC = 6 */ -const char phi_M_ZC_6[6*U_GROUP_NUMBER] +EXTERN const char phi_M_ZC_6[6*U_GROUP_NUMBER] #ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H = { /* 0 1 2 3 4 5 */ @@ -141,47 +141,9 @@ const char phi_M_ZC_6[6*U_GROUP_NUMBER] } #endif ; -/* Table 5.2.2.2-2: Definition of phi ( n ) for M ZC = 12 */ -const char phi_M_ZC_12[12*U_GROUP_NUMBER] -#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H -= { -/* 0 1 2 3 4 5 6 7 8 9 10 11 */ -/* 0 */ 1, -1, 3, 1, 1, -1, -1, -1, 1, 3, -3, 1, -/* 1 */ -1, -1, -1, -1, 1, -3, -1, 3, 3, -1, -3, 1, -/* 2 */ -3, 1, -3, -3, -3, 3, -3, -1, 1, 1, 1, -3, -/* 3 */ -3, 3, 1, 3, -3, 1, 1, 1, 1, 3, -3, 3, -/* 4 */ -3, 1, 3, -1, -1, -3, -3, -1, -1, 3, 1, -3, -/* 5 */ -1, 1, 1, -1, 1, 3, 3, -1, -1, -3, 1, -3, -/* 6 */ -3, -3, -1, 3, 3, 3, -3, 3, -3, 1, -1, -3, -/* 7 */ -3, 3, -3, 3, 3, -3, -1, -1, 3, 3, 1, -3, -/* 8 */ -3, -1, -3, -1, -1, -3, 3, 3, -1, -1, 1, -3, -/* 9 */ -3, 3, 3, 3, -1, -3, -3, -1, -3, 1, 3, -3, -/* 10 */ 1, 3, -3, 1, 3, 3, 3, 1, -1, 1, -1, 3, -/* 11 */ -1, -3, 3, -1, -3, -3, -3, -1, 1, -1, 1, -3, -/* 12 */ 3, 1, 3, 1, 3, -3, -1, 1, 3, 1, -1, -3, -/* 13 */ -3, -3, 3, 3, 3, -3, -1, 1, -3, 3, 1, -3, -/* 14 */ -3, -1, 1, -3, 1, 3, 3, 3, -1, -3, 3, 3, -/* 15 */ -3, -3, 3, 1, -3, -3, -3, -1, 3, -1, 1, 3, -/* 16 */ -1, 1, 3, -3, 1, -1, 1, -1, -1, -3, 1, -1, -/* 17 */ -3, -1, -1, 1, 3, 1, 1, -1, 1, -1, -3, 1, -/* 18 */ -3, -1, 3, -3, -3, -1, -3, 1, -1, -3, 3, 3, -/* 19 */ -3, -3, 3, -3, -1, 3, 3, 3, -1, -3, 1, -3, -/* 20 */ -3, 1, -1, -1, 3, 3, -3, -1, -1, -3, -1, -3, -/* 21 */ -3, 1, 3, 3, -1, -1, -3, 3, 3, -3, 3, -3, -/* 22 */ -3, -1, -1, -3, -3, -1, -3, 3, 1, 3, -1, -3, -/* 23 */ -3, -1, 3, 1, -3, -1, -3, 3, 1, 3, 3, 1, -/* 24 */ -3, 3, 3, 1, -3, 3, -1, 1, 3, -3, 3, -3, -/* 25 */ 3, -1, -3, 3, -3, -1, 3, 3, 3, -3, -1, -3, -/* 26 */ 1, -1, 3, -1, -1, -1, -3, -1, 1, 1, 1, -3, -/* 27 */ -3, 3, 1, -3, 1, 3, -1, -1, 1, 3, 3, 3, -/* 28 */ -3, 3, -3, 3, -3, -3, 3, -1, -1, 1, 3, -3, -/* 29 */ -3, 3, 1, -1, 3, 3, -3, 1, -1, 1, -1, 1, -} -#endif -; /* Table 5.2.2.2-3: Definition of phi (n ) for M_ZC = 18 */ -const char phi_M_ZC_18[18*U_GROUP_NUMBER] +EXTERN const char phi_M_ZC_18[18*U_GROUP_NUMBER] #ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H = { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 */ @@ -220,7 +182,7 @@ const char phi_M_ZC_18[18*U_GROUP_NUMBER] ; /* Table 5.2.2.2-4: Definition of phi (n ) for M_ZC = 24 */ -const char phi_M_ZC_24[24*U_GROUP_NUMBER] +EXTERN const char phi_M_ZC_24[24*U_GROUP_NUMBER] #ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H = { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 */ @@ -260,10 +222,10 @@ const char phi_M_ZC_24[24*U_GROUP_NUMBER] /************** FUNCTION ******************************************/ -int16_t *base_sequence_36_or_larger(unsigned int M_ZC, unsigned int u, unsigned int v, unsigned int scaling, unsigned int if_dmrs_seq); +EXTERN int16_t *base_sequence_36_or_larger(unsigned int M_ZC, unsigned int u, unsigned int v, unsigned int scaling, unsigned int if_dmrs_seq); -int16_t *base_sequence_less_than_36(unsigned int M_ZC, unsigned int u, unsigned int scaling); +EXTERN int16_t *base_sequence_less_than_36(unsigned int M_ZC, unsigned int u, unsigned int scaling); /*! \brief This function generate the sounding reference symbol (SRS) for the uplink. @param tables of srs @@ -278,7 +240,7 @@ void free_ul_reference_signal_sequences(void); #define MAX_INDEX_DMRS_UL_ALLOCATED_REs 53 -const uint16_t dmrs_ul_allocated_res[MAX_INDEX_DMRS_UL_ALLOCATED_REs] +EXTERN const uint16_t dmrs_ul_allocated_res[MAX_INDEX_DMRS_UL_ALLOCATED_REs] /* Number of possible DMRS REs based on PRBs allocated for PUSCH. Array has values until 273 RBs (100Mhz BW) Number of PUSCH RBs allocated should be able to be expressed as 2topowerofn*3topowerofn*5tothepowerofn According to 3GPP spec 38.211 section 6.3.1.4 @@ -307,7 +269,7 @@ const uint16_t dmrs_ul_allocated_res[MAX_INDEX_DMRS_UL_ALLOCATED_REs] /* Table of largest prime number N_ZC < possible DMRS REs M_ZC, this array has values until 100Mhz According to 3GPP spec 38.211 section 5.2.2.1 Table used in calculating DMRS low papr type1 sequence for transform precoding */ -const uint16_t dmrs_ref_ul_primes[MAX_INDEX_DMRS_UL_ALLOCATED_REs] +EXTERN const uint16_t dmrs_ref_ul_primes[MAX_INDEX_DMRS_UL_ALLOCATED_REs] #ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H = { /*DMRS REs 6, 12, 18, 24, 30, 36, 48, 54, 60, 72, 90, 96, */ @@ -331,8 +293,8 @@ const uint16_t dmrs_ref_ul_primes[MAX_INDEX_DMRS_UL_ALLOCATED_REs] ; /// PUSCH DMRS for transform precoding -int16_t *gNB_dmrs_lowpaprtype1_sequence[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][MAX_INDEX_DMRS_UL_ALLOCATED_REs]; -int16_t *dmrs_lowpaprtype1_ul_ref_sig[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][MAX_INDEX_DMRS_UL_ALLOCATED_REs]; +EXTERN int16_t *gNB_dmrs_lowpaprtype1_sequence[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][MAX_INDEX_DMRS_UL_ALLOCATED_REs]; +EXTERN int16_t *dmrs_lowpaprtype1_ul_ref_sig[U_GROUP_NUMBER][V_BASE_SEQUENCE_NUMBER][MAX_INDEX_DMRS_UL_ALLOCATED_REs]; int16_t get_index_for_dmrs_lowpapr_seq(int16_t num_dmrs_res); void generate_lowpapr_typ1_refsig_sequences(unsigned int scaling); void free_gnb_lowpapr_sequences(void); diff --git a/openair1/PHY/TOOLS/lte_enb_scope.c b/openair1/PHY/TOOLS/lte_enb_scope.c index 19e135ae56..220df5b54a 100644 --- a/openair1/PHY/TOOLS/lte_enb_scope.c +++ b/openair1/PHY/TOOLS/lte_enb_scope.c @@ -44,7 +44,6 @@ FD_stats_form *form_stats=NULL,*form_stats_l2=NULL; char title[255]; unsigned char scope_enb_num_ue = 2; static pthread_t forms_thread; //xforms -int otg_enabled=0; void reset_stats(FL_OBJECT *button, long arg) { int i,j,k; @@ -131,7 +130,7 @@ int enbscope_autoinit(void) { sprintf (title, "LTE UL SCOPE eNB for CC_id %d, UE %d",CC_id,UE_id); fl_show_form (form_enb[CC_id][UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - if (otg_enabled) { + if (0) { fl_set_button(form_enb[CC_id][UE_id]->button_0,1); fl_set_object_label(form_enb[CC_id][UE_id]->button_0,"DL Traffic ON"); } else { diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 4aa21b47e8..6852000ca9 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -27,7 +27,6 @@ #include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h" #define TPUT_WINDOW_LENGTH 100 -int otg_enabled; FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW}; @@ -57,11 +56,9 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg) { static void dl_traffic_on_off( FL_OBJECT *button, long arg) { if (fl_get_button(button)) { fl_set_object_label(button, "DL Traffic ON"); - otg_enabled = 1; fl_set_object_color(button, FL_GREEN, FL_GREEN); } else { fl_set_object_label(button, "DL Traffic OFF"); - otg_enabled = 0; fl_set_object_color(button, FL_RED, FL_RED); } } @@ -131,7 +128,6 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) { fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 20, 600, 240, 40, "" ); fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER ); fl_set_button(fdui->button_0,0); - otg_enabled = 0; fl_set_object_label(fdui->button_0, "DL Traffic OFF"); fl_set_object_color(fdui->button_0, FL_RED, FL_RED); fl_set_object_callback(fdui->button_0, dl_traffic_on_off, 0 ); diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c index cfa3b93007..396674333a 100644 --- a/openair1/PHY/TOOLS/time_meas.c +++ b/openair1/PHY/TOOLS/time_meas.c @@ -27,16 +27,19 @@ // global var for openair performance profiler int opp_enabled = 0; +double cpu_freq_GHz __attribute__ ((aligned(32)))=0.0; double get_cpu_freq_GHz(void) { - time_stats_t ts = {0}; - reset_meas(&ts); - ts.trials++; - ts.in = rdtsc_oai(); - sleep(1); - ts.diff = (rdtsc_oai()-ts.in); - cpu_freq_GHz = (double)ts.diff/1000000000; - printf("CPU Freq is %f \n", cpu_freq_GHz); + if (cpu_freq_GHz <1 ) { + time_stats_t ts = {0}; + reset_meas(&ts); + ts.trials++; + ts.in = rdtsc_oai(); + sleep(1); + ts.diff = (rdtsc_oai()-ts.in); + cpu_freq_GHz = (double)ts.diff/1000000000; + printf("CPU Freq is %f \n", cpu_freq_GHz); + } return cpu_freq_GHz; } diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index 2deab40f27..fc929bcd1c 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -33,7 +33,6 @@ #include // global var to enable openair performance profiler extern int opp_enabled; -double cpu_freq_GHz __attribute__ ((aligned(32)));; #if defined(__x86_64__) || defined(__i386__) typedef struct { diff --git a/openair1/PHY/impl_defs_nr.h b/openair1/PHY/impl_defs_nr.h index ceb75c2554..fad578c8b0 100644 --- a/openair1/PHY/impl_defs_nr.h +++ b/openair1/PHY/impl_defs_nr.h @@ -214,10 +214,8 @@ typedef enum { #define NB_SRS_PERIOD (17) -const uint16_t srs_period[NB_SRS_PERIOD] -#ifdef INIT_VARIABLES_PHY_IMPLEMENTATION_DEFS_NR_H +static const uint16_t srs_period[NB_SRS_PERIOD] = { 1, 2, 4, 5, 8, 10, 16, 20, 32, 40, 64, 80, 160, 320, 640, 1280, 2560} -#endif ; /// SRS_Resource of SRS_Config information element from 38.331 RRC specifications @@ -796,7 +794,6 @@ typedef struct { uint8_t initial_CS_indexes[MAX_NB_CYCLIC_SHIFT]; } initial_pucch_resource_t; -const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE]; /* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */ /* structure with all possible fields for pucch format from 0 to 4 */ typedef struct { @@ -1051,11 +1048,6 @@ typedef struct { #define NB_SR_PERIOD (15) -const uint16_t scheduling_request_periodicity[NB_SR_PERIOD] -#ifdef INIT_VARIABLES_PHY_IMPLEMENTATION_DEFS_NR_H -= { 0, 0, 1, 2, 4, 5, 8, 10, 16, 20, 40, 80, 160, 320, 640 } -#endif -; typedef enum { sr_sym2 = 0, diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 38307a7b9e..e1af4e31ac 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -51,7 +51,7 @@ #define MBMS_NFAPI_SCHEDULER -nfapi_ue_release_request_body_t release_rntis; +extern nfapi_ue_release_request_body_t release_rntis; int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *eNB,uint16_t UE_id,uint8_t harq_pid, uint8_t bw_factor) { uint32_t Nre,sumKr,MPR_x100,Kr,r; diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c index edb070f873..560c7b9383 100644 --- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c +++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c @@ -40,6 +40,7 @@ #include #include "openair2/LAYER2/NR_MAC_UE/mac_proto.h" #include "openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h" +#include #ifndef NO_RAT_NR @@ -54,10 +55,172 @@ #endif +/* TS 36.213 Table 9.2.3-3: Mapping of values for one HARQ-ACK bit to sequences */ +static const int sequence_cyclic_shift_1_harq_ack_bit[2] +/* HARQ-ACK Value 0 1 */ +/* Sequence cyclic shift */ = { 0, 6 } +; + +/* TS 36.213 Table 9.2.5-2: Mapping of values for two HARQ-ACK bits and positive SR to sequences */ +static const int sequence_cyclic_shift_2_harq_ack_bits_positive_sr[4] +/* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */ +/* Sequence cyclic shift */ = { 1, 4, 10, 7 } +; + uint8_t nr_is_cqi_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id); uint8_t nr_is_ri_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id); +static const uint16_t scheduling_request_periodicity[NB_SR_PERIOD] += { 0, 0, 1, 2, 4, 5, 8, 10, 16, 20, 40, 80, 160, 320, 640 } +; + +/* TS 38.213 9.2.5.2 UE procedure for multiplexing HARQ-ACK/SR and CSI in a PUCCH */ +/* this is a counter of number of pucch format 4 per subframe */ +static int nb_pucch_format_4_in_subframes[LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] = { 0 } ; + +/* TS 36.213 Table 9.2.5.2-1: Code rate corresponding to higher layer parameter PUCCH-F2-maximum-coderate, */ +/* or PUCCH-F3-maximum-coderate, or PUCCH-F4-maximum-coderate */ +/* add one additional element set to 0 for parsing the array until this end */ +/* stored values are code rates * 100 */ +//static const int code_rate_r_time_100[8] = { (0.08 * 100), (0.15 * 100), (0.25*100), (0.35*100), (0.45*100), (0.60*100), (0.80*100), 0 } ; + +/* TS 38.213 Table 9.2.3-4: Mapping of values for two HARQ-ACK bits to sequences */ +static const int sequence_cyclic_shift_2_harq_ack_bits[4] +/* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */ +/* Sequence cyclic shift */ = { 0, 3, 9, 6 } +; + +/* TS 38.211 Table 6.4.1.3.3.2-1: DM-RS positions for PUCCH format 3 and 4 */ +static const int nb_symbols_excluding_dmrs[NB_SYMBOL_MINUS_FOUR][2][2] += { +/* No additional DMRS Additional DMRS */ +/* PUCCH length No hopping hopping No hopping hopping */ +/* index 0 1 0 1 */ +/* 4 */ {{ 3 , 2 } , { 3 , 2 }}, +/* 5 */ {{ 3 , 3 } , { 3 , 3 }}, +/* 6 */ {{ 4 , 4 } , { 4 , 4 }}, +/* 7 */ {{ 5 , 5 } , { 5 , 5 }}, +/* 8 */ {{ 6 , 6 } , { 6 , 6 }}, +/* 9 */ {{ 7 , 7 } , { 7 , 7 }}, +/* 10 */ {{ 8 , 8 } , { 6 , 6 }}, +/* 11 */ {{ 9 , 9 } , { 7 , 7 }}, +/* 12 */ {{ 10 , 10 } , { 8 , 8 }}, +/* 13 */ {{ 11 , 11 } , { 9 , 9 }}, +/* 14 */ {{ 12 , 12 } , { 10 , 10 }}, +} +; + + +/* TS 36.213 Table 9.2.5-1: Mapping of values for one HARQ-ACK bit and positive SR to sequences */ +static const int sequence_cyclic_shift_1_harq_ack_bit_positive_sr[2] +/* HARQ-ACK Value 0 1 */ +/* Sequence cyclic shift */ = { 3, 9 } +; + +static float RSRP_meas_mapping_nr[98] += { + -140, + -139, + -138, + -137, + -136, + -135, + -134, + -133, + -132, + -131, + -130, + -129, + -128, + -127, + -126, + -125, + -124, + -123, + -122, + -121, + -120, + -119, + -118, + -117, + -116, + -115, + -114, + -113, + -112, + -111, + -110, + -109, + -108, + -107, + -106, + -105, + -104, + -103, + -102, + -101, + -100, + -99, + -98, + -97, + -96, + -95, + -94, + -93, + -92, + -91, + -90, + -89, + -88, + -87, + -86, + -85, + -84, + -83, + -82, + -81, + -80, + -79, + -78, + -77, + -76, + -75, + -74, + -73, + -72, + -71, + -70, + -69, + -68, + -67, + -66, + -65, + -64, + -63, + -62, + -61, + -60, + -59, + -58, + -57, + -56, + -55, + -54, + -53, + -52, + -51, + -50, + -49, + -48, + -47, + -46, + -45, + -44, + -43 + } + ; + long binary_search_float_nr( float elements[], @@ -202,6 +365,30 @@ void nr_generate_pucch3_4(int32_t **txdataF, * *********************************************************************/ +/* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */ +const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE] += +{ +/* format first symbol Number of symbols PRB offset nb index for set of initial CS */ +/* 0 */ { pucch_format0_nr, 12, 2, 0, 2, { 0, 3, 0, 0 } }, +/* 1 */ { pucch_format0_nr, 12, 2, 0, 3, { 0, 4, 8, 0 } }, +/* 2 */ { pucch_format0_nr, 12, 2, 3, 3, { 0, 4, 8, 0 } }, +/* 3 */ { pucch_format1_nr, 10, 4, 0, 2, { 0, 6, 0, 0 } }, +/* 4 */ { pucch_format1_nr, 10, 4, 0, 4, { 0, 3, 6, 9 } }, +/* 5 */ { pucch_format1_nr, 10, 4, 2, 4, { 0, 3, 6, 9 } }, +/* 6 */ { pucch_format1_nr, 10, 4, 4, 4, { 0, 3, 6, 9 } }, +/* 7 */ { pucch_format1_nr, 4, 10, 0, 2, { 0, 6, 0, 0 } }, +/* 8 */ { pucch_format1_nr, 4, 10, 0, 4, { 0, 3, 6, 9 } }, +/* 9 */ { pucch_format1_nr, 4, 10, 2, 4, { 0, 3, 6, 9 } }, +/* 10 */ { pucch_format1_nr, 4, 10, 4, 4, { 0, 3, 6, 9 } }, +/* 11 */ { pucch_format1_nr, 0, 14, 0, 2, { 0, 6, 0, 0 } }, +/* 12 */ { pucch_format1_nr, 0, 14, 0, 4, { 0, 3, 6, 9 } }, +/* 13 */ { pucch_format1_nr, 0, 14, 2, 4, { 0, 3, 6, 9 } }, +/* 14 */ { pucch_format1_nr, 0, 14, 4, 4, { 0, 3, 6, 9 } }, +/* 15 */ { pucch_format1_nr, 0, 14, 0, 4, { 0, 3, 6, 9 } }, +} +; + bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t *proc, bool reset_harq) { uint8_t sr_payload = 0; diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h index 9b53331f50..97d8d73282 100644 --- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h +++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h @@ -60,214 +60,12 @@ /************** VARIABLES *****************************************/ -float RSRP_meas_mapping_nr[98] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -= { - -140, - -139, - -138, - -137, - -136, - -135, - -134, - -133, - -132, - -131, - -130, - -129, - -128, - -127, - -126, - -125, - -124, - -123, - -122, - -121, - -120, - -119, - -118, - -117, - -116, - -115, - -114, - -113, - -112, - -111, - -110, - -109, - -108, - -107, - -106, - -105, - -104, - -103, - -102, - -101, - -100, - -99, - -98, - -97, - -96, - -95, - -94, - -93, - -92, - -91, - -90, - -89, - -88, - -87, - -86, - -85, - -84, - -83, - -82, - -81, - -80, - -79, - -78, - -77, - -76, - -75, - -74, - -73, - -72, - -71, - -70, - -69, - -68, - -67, - -66, - -65, - -64, - -63, - -62, - -61, - -60, - -59, - -58, - -57, - -56, - -55, - -54, - -53, - -52, - -51, - -50, - -49, - -48, - -47, - -46, - -45, - -44, - -43 - } - #endif - ; - -/* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */ -const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -= -{ -/* format first symbol Number of symbols PRB offset nb index for set of initial CS */ -/* 0 */ { pucch_format0_nr, 12, 2, 0, 2, { 0, 3, 0, 0 } }, -/* 1 */ { pucch_format0_nr, 12, 2, 0, 3, { 0, 4, 8, 0 } }, -/* 2 */ { pucch_format0_nr, 12, 2, 3, 3, { 0, 4, 8, 0 } }, -/* 3 */ { pucch_format1_nr, 10, 4, 0, 2, { 0, 6, 0, 0 } }, -/* 4 */ { pucch_format1_nr, 10, 4, 0, 4, { 0, 3, 6, 9 } }, -/* 5 */ { pucch_format1_nr, 10, 4, 2, 4, { 0, 3, 6, 9 } }, -/* 6 */ { pucch_format1_nr, 10, 4, 4, 4, { 0, 3, 6, 9 } }, -/* 7 */ { pucch_format1_nr, 4, 10, 0, 2, { 0, 6, 0, 0 } }, -/* 8 */ { pucch_format1_nr, 4, 10, 0, 4, { 0, 3, 6, 9 } }, -/* 9 */ { pucch_format1_nr, 4, 10, 2, 4, { 0, 3, 6, 9 } }, -/* 10 */ { pucch_format1_nr, 4, 10, 4, 4, { 0, 3, 6, 9 } }, -/* 11 */ { pucch_format1_nr, 0, 14, 0, 2, { 0, 6, 0, 0 } }, -/* 12 */ { pucch_format1_nr, 0, 14, 0, 4, { 0, 3, 6, 9 } }, -/* 13 */ { pucch_format1_nr, 0, 14, 2, 4, { 0, 3, 6, 9 } }, -/* 14 */ { pucch_format1_nr, 0, 14, 4, 4, { 0, 3, 6, 9 } }, -/* 15 */ { pucch_format1_nr, 0, 14, 0, 4, { 0, 3, 6, 9 } }, -} -#endif -; - -/* TS 36.213 Table 9.2.3-3: Mapping of values for one HARQ-ACK bit to sequences */ -const int sequence_cyclic_shift_1_harq_ack_bit[2] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -/* HARQ-ACK Value 0 1 */ -/* Sequence cyclic shift */ = { 0, 6 } -#endif -; - -/* TS 38.213 Table 9.2.3-4: Mapping of values for two HARQ-ACK bits to sequences */ -const int sequence_cyclic_shift_2_harq_ack_bits[4] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -/* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */ -/* Sequence cyclic shift */ = { 0, 3, 9, 6 } -#endif -; - -/* TS 36.213 Table 9.2.5-1: Mapping of values for one HARQ-ACK bit and positive SR to sequences */ -const int sequence_cyclic_shift_1_harq_ack_bit_positive_sr[2] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -/* HARQ-ACK Value 0 1 */ -/* Sequence cyclic shift */ = { 3, 9 } -#endif -; - -/* TS 36.213 Table 9.2.5-2: Mapping of values for two HARQ-ACK bits and positive SR to sequences */ -const int sequence_cyclic_shift_2_harq_ack_bits_positive_sr[4] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -/* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */ -/* Sequence cyclic shift */ = { 1, 4, 10, 7 } -#endif -; - -/* TS 36.213 Table 9.2.5.2-1: Code rate corresponding to higher layer parameter PUCCH-F2-maximum-coderate, */ -/* or PUCCH-F3-maximum-coderate, or PUCCH-F4-maximum-coderate */ -/* add one additional element set to 0 for parsing the array until this end */ -/* stored values are code rates * 100 */ -const int code_rate_r_time_100[8] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -= { (0.08 * 100), (0.15 * 100), (0.25*100), (0.35*100), (0.45*100), (0.60*100), (0.80*100), 0 } -#endif -; - #define NB_SYMBOL_MINUS_FOUR (11) #define I_PUCCH_NO_ADDITIONAL_DMRS (0) #define I_PUCCH_ADDITIONAL_DMRS (1) #define I_PUCCH_NO_HOPPING (0) #define I_PUCCH_HOPING (1) -/* TS 38.211 Table 6.4.1.3.3.2-1: DM-RS positions for PUCCH format 3 and 4 */ -const int nb_symbols_excluding_dmrs[NB_SYMBOL_MINUS_FOUR][2][2] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -= { -/* No additional DMRS Additional DMRS */ -/* PUCCH length No hopping hopping No hopping hopping */ -/* index 0 1 0 1 */ -/* 4 */ {{ 3 , 2 } , { 3 , 2 }}, -/* 5 */ {{ 3 , 3 } , { 3 , 3 }}, -/* 6 */ {{ 4 , 4 } , { 4 , 4 }}, -/* 7 */ {{ 5 , 5 } , { 5 , 5 }}, -/* 8 */ {{ 6 , 6 } , { 6 , 6 }}, -/* 9 */ {{ 7 , 7 } , { 7 , 7 }}, -/* 10 */ {{ 8 , 8 } , { 6 , 6 }}, -/* 11 */ {{ 9 , 9 } , { 7 , 7 }}, -/* 12 */ {{ 10 , 10 } , { 8 , 8 }}, -/* 13 */ {{ 11 , 11 } , { 9 , 9 }}, -/* 14 */ {{ 12 , 12 } , { 10 , 10 }}, -} -#endif -; - -/* TS 38.213 9.2.5.2 UE procedure for multiplexing HARQ-ACK/SR and CSI in a PUCCH */ -/* this is a counter of number of pucch format 4 per subframe */ -int nb_pucch_format_4_in_subframes[LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] -#ifdef INIT_VARIABLES_PUCCH_UE_NR_H -= { 0 } -#endif -; /*************** FUNCTIONS ****************************************/ diff --git a/openair1/SIMULATION/LTE_PHY/common_sim.h b/openair1/SIMULATION/LTE_PHY/common_sim.h index 796a576aed..5e0be3de89 100644 --- a/openair1/SIMULATION/LTE_PHY/common_sim.h +++ b/openair1/SIMULATION/LTE_PHY/common_sim.h @@ -46,13 +46,13 @@ void sumUpStatsSlot(time_stats_t *res, time_stats_t src[RX_NB_TH][2], int lastAc } double squareRoot(time_stats_t *ptr) { - double timeBase=1/(1000*cpu_freq_GHz); + double timeBase=1/(1000*get_cpu_freq_GHz()); return sqrt((double)ptr->diff_square*pow(timeBase,2)/ptr->trials - pow((double)ptr->diff/ptr->trials*timeBase,2)); } void printDistribution(time_stats_t *ptr, varArray_t *sortedList, char *txt) { - double timeBase=1/(1000*cpu_freq_GHz); + double timeBase=1/(1000*get_cpu_freq_GHz()); printf("%-43s %6.2f us (%d trials)\n", txt, (double)ptr->diff/ptr->trials*timeBase, @@ -69,7 +69,7 @@ void printStatIndent(time_stats_t *ptr, char *txt) { } void printStatIndent2(time_stats_t *ptr, char *txt) { - double timeBase=1/(1000*cpu_freq_GHz); + double timeBase=1/(1000*get_cpu_freq_GHz()); printf(" |__ %-34s %6.2f us (%3d trials)\n", txt, ptr->trials?((double)ptr->diff)/ptr->trials*timeBase:0, @@ -77,7 +77,7 @@ void printStatIndent2(time_stats_t *ptr, char *txt) { } void printStatIndent3(time_stats_t *ptr, char *txt) { - double timeBase=1/(1000*cpu_freq_GHz); + double timeBase=1/(1000*get_cpu_freq_GHz()); printf(" |__ %-30s %6.2f us (%3d trials)\n", txt, ptr->trials?((double)ptr->diff)/ptr->trials*timeBase:0, diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 667913d377..23a23c26be 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -65,11 +65,14 @@ void feptx_ofdm(RU_t *ru, int frame, int subframe); void feptx_prec(RU_t *ru, int frame, int subframe); double cpuf; -#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0)) +#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0)) //#define MCS_COUNT 23//added for PHY abstraction #include int otg_enabled=0; +THREAD_STRUCT thread_struct; +nfapi_ue_release_request_body_t release_rntis; + /*the following parameters are used to control the processing times calculations*/ double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */ double t_rx_max = -1000000000; /*!< \brief initial max process time for rx */ diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 80beee4bed..53a23d7575 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -57,7 +57,7 @@ #include "executables/split_headers.h" double cpuf; -#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0)) +#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0)) //#define MCS_COUNT 23//added for PHY abstraction #include channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX]; @@ -70,6 +70,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 ; int xforms=0; +THREAD_STRUCT thread_struct; +nfapi_ue_release_request_body_t release_rntis; + FD_lte_phy_scope_enb *form_enb; char title[255]; diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 0a7ae96e09..da4db6a131 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -63,7 +63,7 @@ //#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" #include "PHY/NR_REFSIG/ptrs_nr.h" #include "NR_RRCReconfiguration.h" -#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0)) +#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0)) #include "SIMULATION/LTE_PHY/common_sim.h" #include @@ -83,6 +83,10 @@ uint16_t sf_ahead=4 ; uint16_t sl_ahead=0; //uint8_t nfapi_mode = 0; uint64_t downlink_frequency[MAX_NUM_CCs][4]; +THREAD_STRUCT thread_struct; +nfapi_ue_release_request_body_t release_rntis; +msc_interface_t msc_interface; + // dummy functions int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { return(0); } diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index efbc40cd55..a6e07b67df 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -65,6 +65,7 @@ extern uint16_t prach_root_sequence_map0_3[838]; openair0_config_t openair0_cfg[MAX_CARDS]; //uint8_t nfapi_mode=0; uint16_t sl_ahead = 0; +msc_interface_t msc_interface; //void dump_nr_prach_config(NR_DL_FRAME_PARMS *frame_parms,uint8_t subframe); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index fce690ebd2..bc0cec3fbc 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -57,7 +57,7 @@ #include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h" #include "common/utils/threadPool/thread-pool.h" #include "PHY/NR_REFSIG/ptrs_nr.h" -#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0)) +#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0)) #include "SIMULATION/LTE_PHY/common_sim.h" #include @@ -81,6 +81,9 @@ uint16_t sl_ahead=0; double cpuf; //uint8_t nfapi_mode = 0; uint64_t downlink_frequency[MAX_NUM_CCs][4]; +THREAD_STRUCT thread_struct; +nfapi_ue_release_request_body_t release_rntis; +msc_interface_t msc_interface; extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration diff --git a/openair1/SIMULATION/TOOLS/phase_noise.c b/openair1/SIMULATION/TOOLS/phase_noise.c index 5958a0ccdd..1dfd43d8cb 100644 --- a/openair1/SIMULATION/TOOLS/phase_noise.c +++ b/openair1/SIMULATION/TOOLS/phase_noise.c @@ -26,6 +26,7 @@ #include "sim.h" +uint16_t LUTSin[ResolSinCos+1]; /* linear phase noise model */ void phase_noise(double ts, int16_t * InRe, int16_t * InIm) { diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h index 55a78e9778..8776530dde 100644 --- a/openair1/SIMULATION/TOOLS/sim.h +++ b/openair1/SIMULATION/TOOLS/sim.h @@ -468,7 +468,6 @@ double N_RB2channel_bandwidth(uint16_t N_RB); */ //look-up table for the sine (cosine) function #define ResolSinCos 100 -uint16_t LUTSin[ResolSinCos+1]; void InitSinLUT( void ); void phase_noise(double ts, int16_t * InRe, int16_t * InIm); diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h index 9db5d61a11..d6dd6e3b6f 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h @@ -51,8 +51,6 @@ typedef struct { pthread_mutex_t *mutex; } mac_stats_updates_context_t; -/*Array holding the last stats reports for each eNB. Used for continuous reporting*/ -mac_stats_updates_context_t mac_stats_context[NUM_MAX_ENB]; /*Functions to initialize and destroy the struct required for the *continuous stats update report*/ diff --git a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_defs.h b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_defs.h index 5f6432732f..a9236af80b 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_defs.h +++ b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_defs.h @@ -49,8 +49,6 @@ typedef struct /*To Be Extended*/ }rrc_meas_stats; -/* RRC CMI statistics */ -rrc_meas_stats * meas_stats; /* FLEXRAN AGENT-RRC Interface */ diff --git a/openair2/ENB_APP/flexran_agent_common.h b/openair2/ENB_APP/flexran_agent_common.h index ae690c7124..18d32421dd 100644 --- a/openair2/ENB_APP/flexran_agent_common.h +++ b/openair2/ENB_APP/flexran_agent_common.h @@ -70,7 +70,6 @@ typedef struct { pthread_mutex_t *mutex; } stats_updates_context_t; -stats_updates_context_t stats_context[NUM_MAX_ENB]; /********************************** * FlexRAN protocol messages helper diff --git a/openair2/ENB_APP/flexran_agent_net_comm.c b/openair2/ENB_APP/flexran_agent_net_comm.c index 0d1c52096d..568a0e32cc 100644 --- a/openair2/ENB_APP/flexran_agent_net_comm.c +++ b/openair2/ENB_APP/flexran_agent_net_comm.c @@ -30,7 +30,7 @@ #include "common/utils/LOG/log.h" flexran_agent_channel_t *agent_channel[NUM_MAX_ENB][FLEXRAN_AGENT_MAX]; -flexran_agent_channel_instance_t channel_instance; +static flexran_agent_channel_instance_t channel_instance; int flexran_agent_channel_id = 0; int flexran_agent_msg_send(mid_t mod_id, agent_id_t agent_id, void *data, int size, int priority) { diff --git a/openair2/ENB_APP/flexran_agent_ran_api_to_fix.c b/openair2/ENB_APP/flexran_agent_ran_api_to_fix.c new file mode 100644 index 0000000000..a5eb850712 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_ran_api_to_fix.c @@ -0,0 +1,33 @@ +#include +#include +#include +pdcp_enb_t pdcp_enb[MAX_NUM_CCs]; +uint32_t Pdcp_stats_tx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB]; +uint32_t Pdcp_stats_tx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_throughput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; + +uint32_t Pdcp_stats_rx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB]; +uint32_t Pdcp_stats_rx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_goodput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_outoforder[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; + diff --git a/openair2/LAYER2/MAC/config_ue.c b/openair2/LAYER2/MAC/config_ue.c index 1c5e706218..79202d87e3 100644 --- a/openair2/LAYER2/MAC/config_ue.c +++ b/openair2/LAYER2/MAC/config_ue.c @@ -85,10 +85,6 @@ void ue_mac_reset(module_id_t module_idP, uint8_t eNB_index) { ue_init_mac(module_idP); //This will hopefully do the rest of the MAC reset procedure } -int32_t **rxdata; -int32_t **txdata; - - int rrc_mac_config_req_ue(module_id_t Mod_idP, int CC_idP, diff --git a/openair2/LAYER2/MAC/defs_NB_IoT.h b/openair2/LAYER2/MAC/defs_NB_IoT.h index 517f01d1b9..78524e104d 100644 --- a/openair2/LAYER2/MAC/defs_NB_IoT.h +++ b/openair2/LAYER2/MAC/defs_NB_IoT.h @@ -537,9 +537,6 @@ typedef struct { // global variables -nprach_parameters_NB_IoT_t nprach_list[3]; -//DLSF Table -DLSF_INFO_t DLSF_information; #endif /*__LAYER2_MAC_DEFS_NB_IoT_H__ */ diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index ee2711c6ef..39c9acb3d3 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -83,9 +83,57 @@ hash_table_t *pdcp_coll_p = NULL; static int mbms_socket = -1; #endif +uint32_t Pdcp_stats_tx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB]; +uint32_t Pdcp_stats_tx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_throughput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_tx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB]; +uint32_t Pdcp_stats_rx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_goodput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +uint32_t Pdcp_stats_rx_outoforder[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +int pdcp_pc5_sockfd; +struct sockaddr_in prose_ctrl_addr; +struct sockaddr_in prose_pdcp_addr; +struct sockaddr_in pdcp_sin; /* pdcp module parameters and related functions*/ static pdcp_params_t pdcp_params= {0,NULL}; +rnti_t pdcp_UE_UE_module_id_to_rnti[MAX_MOBILES_PER_ENB]; +rnti_t pdcp_eNB_UE_instance_to_rnti[MAX_MOBILES_PER_ENB]; // for noS1 mode +unsigned int pdcp_eNB_UE_instance_to_rnti_index; + +signed int pdcp_2_nas_irq; +pdcp_stats_t UE_pdcp_stats[MAX_MOBILES_PER_ENB]; +pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX]; + +static pdcp_mbms_t pdcp_mbms_array_ue[MAX_MOBILES_PER_ENB][LTE_maxServiceCount][LTE_maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h +static pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][LTE_maxServiceCount][LTE_maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h +static sdu_size_t pdcp_input_sdu_remaining_size_to_read; +static sdu_size_t pdcp_output_header_bytes_to_write; +static sdu_size_t pdcp_output_sdu_bytes_to_write; +notifiedFIFO_t pdcp_sdu_list; + +pdcp_enb_t pdcp_enb[MAX_NUM_CCs]; + uint64_t get_pdcp_optmask(void) { return pdcp_params.optmask; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index c8ab4499ee..46ffea1ac9 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -91,34 +91,34 @@ extern int pdcp_instance_cnt; int init_pdcp_thread(void); void cleanup_pdcp_thread(void); -uint32_t Pdcp_stats_tx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB]; -uint32_t Pdcp_stats_tx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_throughput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_tx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB]; +extern uint32_t Pdcp_stats_tx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_throughput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_tx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB]; -uint32_t Pdcp_stats_rx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_goodput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; -uint32_t Pdcp_stats_rx_outoforder[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_window_ms[MAX_eNB][MAX_MOBILES_PER_ENB]; +extern uint32_t Pdcp_stats_rx[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_bytes[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_bytes_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_bytes_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_sn[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_goodput_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_aiat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_aiat_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_aiat_tmp_w[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_iat[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; +extern uint32_t Pdcp_stats_rx_outoforder[MAX_eNB][MAX_MOBILES_PER_ENB][NB_RB_MAX]; void pdcp_update_perioidical_stats(const protocol_ctxt_t *const ctxt_pP); @@ -138,7 +138,7 @@ typedef struct pdcp_enb_s { } pdcp_enb_t; -pdcp_enb_t pdcp_enb[MAX_NUM_CCs]; +extern pdcp_enb_t pdcp_enb[MAX_NUM_CCs]; typedef struct pdcp_stats_s { time_stats_t pdcp_run; @@ -455,10 +455,10 @@ struct pdcp_netlink_element_s { //TTN for D2D (PC5S) #define PDCP_SOCKET_PORT_NO 9999 //temporary value #define PC5_SIGNALLING_PAYLOAD_SIZE 100 //should be updated with a correct value -int pdcp_pc5_sockfd; -struct sockaddr_in prose_ctrl_addr; -struct sockaddr_in prose_pdcp_addr; -struct sockaddr_in pdcp_sin; +extern int pdcp_pc5_sockfd; +extern struct sockaddr_in prose_ctrl_addr; +extern struct sockaddr_in prose_pdcp_addr; +extern struct sockaddr_in pdcp_sin; void pdcp_pc5_socket_init(void); typedef struct { @@ -500,28 +500,18 @@ typedef struct { #define REORDERING_WINDOW_SN_7BIT 64 #define REORDERING_WINDOW_SN_12BIT 2048 -signed int pdcp_2_nas_irq; -pdcp_stats_t UE_pdcp_stats[MAX_MOBILES_PER_ENB]; -pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX]; +extern signed int pdcp_2_nas_irq; +extern pdcp_stats_t UE_pdcp_stats[MAX_MOBILES_PER_ENB]; +extern pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX]; // for UE code conly -rnti_t pdcp_UE_UE_module_id_to_rnti[MAX_MOBILES_PER_ENB]; -rnti_t pdcp_eNB_UE_instance_to_rnti[MAX_MOBILES_PER_ENB]; // for noS1 mode -unsigned int pdcp_eNB_UE_instance_to_rnti_index; +extern rnti_t pdcp_UE_UE_module_id_to_rnti[MAX_MOBILES_PER_ENB]; +extern rnti_t pdcp_eNB_UE_instance_to_rnti[MAX_MOBILES_PER_ENB]; // for noS1 mode +extern unsigned int pdcp_eNB_UE_instance_to_rnti_index; -pdcp_mbms_t pdcp_mbms_array_ue[MAX_MOBILES_PER_ENB][LTE_maxServiceCount][LTE_maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h -pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][LTE_maxServiceCount][LTE_maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h -sdu_size_t pdcp_output_sdu_bytes_to_write; -sdu_size_t pdcp_output_header_bytes_to_write; -notifiedFIFO_t pdcp_sdu_list; -int pdcp_sent_a_sdu; -pdcp_data_req_header_t pdcp_input_header; -unsigned char pdcp_input_sdu_buffer[MAX_IP_PACKET_SIZE]; -sdu_size_t pdcp_input_index_header; -sdu_size_t pdcp_input_sdu_size_read; -sdu_size_t pdcp_input_sdu_remaining_size_to_read; +extern notifiedFIFO_t pdcp_sdu_list; #define PDCP_COLL_KEY_VALUE(mODULE_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \ ((hash_key_t)mODULE_iD | \ diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c index bf6579955b..cb5f1af28d 100644 --- a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c +++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c @@ -319,13 +319,15 @@ error: } int proto_agent_get_ack_result(mod_id_t mod_id, const void *params, Protocol__FlexsplitMessage **msg) { +/* code useless in this status: return 0 anyways rlc_op_status_t result = 0; - //printf("PROTO_AGENT: handling the data_req_ack message\n"); + printf("PROTO_AGENT: handling the data_req_ack message\n"); Protocol__FlexsplitMessage *input = (Protocol__FlexsplitMessage *)params; Protocol__FspRlcDataReqAck *data_ack = input->data_req_ack; result = data_ack->result; - //printf("PROTO_AGENT: ACK RESULT IS %u\n", result); + printf("PROTO_AGENT: ACK RESULT IS %u\n", result); ack_result = result; +*/ return 0; } diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h index c805b81543..8f553e05e1 100644 --- a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h +++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h @@ -62,7 +62,6 @@ typedef int (*proto_agent_message_destruction_callback)( ); -uint32_t ack_result; /********************************** * progRAN protocol messages helper diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c b/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c index 9a63427ed5..925c11c8f8 100644 --- a/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c +++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c @@ -30,7 +30,7 @@ #include "common/utils/LOG/log.h" proto_agent_channel_t *proto_channel[NUMBER_OF_eNB_MAX][ENB_AGENT_MAX]; -proto_agent_channel_instance_t channel_instance; +static proto_agent_channel_instance_t channel_instance; int proto_agent_channel_id = 0; int proto_agent_register_channel(mod_id_t mod_id, proto_agent_channel_t *channel, proto_agent_id_t agent_id) { diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c index fda84879be..cf77f9ec37 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c @@ -80,6 +80,8 @@ static int g_send_id_read_index[2]; static struct mac_data_ind g_tx_delayed_indications[MAX_TIME_DELAYED_PDU_DUE_TO_HARQ]; static struct mac_data_ind g_rx_delayed_indications[MAX_TIME_DELAYED_PDU_DUE_TO_HARQ]; +static rlc_um_entity_t um_tx; +static rlc_um_entity_t um_rx; static int8_t *g_sdus[] = {"En dépit de son volontarisme affiché, le premier ministre est de plus en plus décrié pour son incompétence. La tension politique et dans l'opinion publique est encore montée d'un cran au Japon, sur fond d'inquiétantes nouvelles, avec du plutonium détecté dans le sol autour de la centrale de Fukushima. Le premier ministre Naoto Kan a solennellement déclaré que son gouvernement était «en état d'alerte maximum». Tout en reconnaissant que la situation restait «imprévisible». Ce volontarisme affiché par le premier ministre - que Nicolas Sarkozy rencontrera demain lors d'une visite au Japon - ne l'a pas empêché d'être la cible de violentes critiques de la part de parlementaires sur sa gestion de la crise. Attaqué sur le manque de transparence, il a assuré qu'il rendait publiques toutes les informations en sa possession. Un député de l'opposition, Yosuke Isozaki, a aussi reproché à Naoto Kan de ne pas avoir ordonné l'évacuation des populations dans la zone comprise entre 20 et 30 km autour de la centrale. «Peut-il y avoir quelque chose de plus irresponsable que cela ?», a-t-il lancé. Pour l'heure, la zone d'évacuation est limitée à un rayon de 20 km, seul le confinement étant recommandé pour les 10 km suivants. Sur ce sujet, les autorités japonaises ont été fragilisées mardi par les déclarations de Greenpeace, affirmant que ses experts avaient détecté une radioactivité dangereuse à 40 km de la centrale. L'organisation écologiste a appelé à une extension de la zone d'évacuation, exhortant Tokyo à «cesser de privilégier la politique aux dépens de la science». L'Agence japonaise de sûreté nucléaire a balayé ces critiques.", diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h index 6da464aa28..bfde1b31f3 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h @@ -21,8 +21,6 @@ # ifndef __RLC_UM_TEST_H__ # define __RLC_UM_TEST_H__ -rlc_um_entity_t um_tx; -rlc_um_entity_t um_rx; void rlc_um_v9_3_0_test_windows_5(void); void rlc_um_v9_3_0_test_windows_10(void); diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index 98c8c3e252..81e8a80748 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -36,6 +36,7 @@ #include "common/utils/LOG/vcd_signal_dumper.h" #include "targets/COMMON/openairinterface5g_limits.h" #include "assertions.h" +#include #include "common/ran_context.h" extern RAN_CONTEXT_t RC; @@ -51,6 +52,24 @@ extern boolean_t pdcp_data_ind( #define DEBUG_RLC_PDCP_INTERFACE 1 //#define TRACE_RLC_PAYLOAD 1 #define DEBUG_RLC_DATA_REQ 1 +void (*rlc_rrc_data_conf)( + const protocol_ctxt_t *const ctxtP, + const rb_id_t rb_idP, + const mui_t muiP, + const rlc_tx_status_t statusP) __attribute__ ((aligned(32))); + +void (*rlc_rrc_data_ind)( + const protocol_ctxt_t *const ctxtP, + const rb_id_t rb_idP, + const sdu_size_t sdu_sizeP, + const uint8_t *const sduP) __attribute__ ((aligned(32))); + +logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ +logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ +rlc_mbms_id_t rlc_mbms_lcid2service_session_id_ue[MAX_MOBILES_PER_ENB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h +rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h +hash_table_t *rlc_coll_p __attribute__ ((aligned(32))); + //----------------------------------------------------------------------------- void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char *dataP, const signed long sizeP) diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h index 7e4920a579..ef5f824ba0 100644 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -133,13 +133,13 @@ typedef struct { #define RLC_MAX_MBMS_LC (LTE_maxSessionPerPMCH * LTE_maxServiceCount) #define RLC_MAX_LC ((max_val_LTE_DRB_Identity+1)* MAX_MOBILES_PER_ENB) -void (*rlc_rrc_data_ind)( +extern void (*rlc_rrc_data_ind)( const protocol_ctxt_t *const ctxtP, const rb_id_t rb_idP, const sdu_size_t sdu_sizeP, const uint8_t *const sduP) __attribute__ ((aligned(32))); -void (*rlc_rrc_data_conf)( +extern void (*rlc_rrc_data_conf)( const protocol_ctxt_t *const ctxtP, const rb_id_t rb_idP, const mui_t muiP, @@ -184,8 +184,8 @@ typedef struct rlc_mbms_id_s { //rlc_mbms_t rlc_mbms_array_ue[MAX_MOBILES_PER_ENB][maxServiceCount][maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h //rlc_mbms_t rlc_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h -rlc_mbms_id_t rlc_mbms_lcid2service_session_id_ue[MAX_MOBILES_PER_ENB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h -rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h +extern rlc_mbms_id_t rlc_mbms_lcid2service_session_id_ue[MAX_MOBILES_PER_ENB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h +extern rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_LC]; // some constants from openair2/RRC/LTE/MESSAGES/asn1_constants.h #define rlc_mbms_enb_get_lcid_by_rb_id(Enb_mOD,rB_iD) rlc_mbms_rbid2lcid_eNB[Enb_mOD][rB_iD] ; @@ -201,8 +201,8 @@ rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_ rlc_mbms_rbid2lcid_ue[uE_mOD][rB_iD] = lOG_cH_iD; \ } while (0); -logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ -logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ +extern logical_chan_id_t rlc_mbms_rbid2lcid_ue [MAX_MOBILES_PER_ENB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ +extern logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; /*!< \brief Pairing logical channel identifier with radio bearer identifer. */ #define RLC_COLL_KEY_VALUE(eNB_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \ @@ -250,7 +250,7 @@ logical_chan_id_t rlc_mbms_rbid2lcid_eNB[MAX_eNB][NB_RB_MBMS_MAX]; (((hash_key_t)(sESSION_ID)) << 37) | \ (((hash_key_t)(0x0000000000000001)) << 63)) -hash_table_t *rlc_coll_p __attribute__ ((aligned(32))); +extern hash_table_t *rlc_coll_p __attribute__ ((aligned(32))); /*! \fn tbs_size_t mac_rlc_serialize_tb (char* bufferP, list_t transport_blocksP) * \brief Serialize a list of transport blocks coming from RLC in order to be processed by MAC. diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index 2eb2bae968..88333272cb 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -320,7 +320,6 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind( return ret; } -int oai_emulation; rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP, const srb_flag_t srb_flagP, diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c index 919d577a18..18285f6563 100644 --- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c +++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c @@ -265,7 +265,6 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind( return ret; } -int oai_emulation; rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP, const srb_flag_t srb_flagP, diff --git a/openair2/NETWORK_DRIVER/UE_IP/netlink.c b/openair2/NETWORK_DRIVER/UE_IP/netlink.c index 658ae19aba..79fc37ae39 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/netlink.c +++ b/openair2/NETWORK_DRIVER/UE_IP/netlink.c @@ -39,6 +39,7 @@ #include "local.h" #include "proto_extern.h" +MODULE_LICENSE("GPL"); #define OAI_IP_DRIVER_NETLINK_ID 31 #define NL_DEST_PID 1 diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index 5b5f3e6b3c..34c7f8ece1 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -41,8 +41,8 @@ #define MAX_IF_MODULES 100 //#define UL_HARQ_PRINT -NR_IF_Module_t *if_inst[MAX_IF_MODULES]; -NR_Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs]; +static NR_IF_Module_t *nr_if_inst[MAX_IF_MODULES]; +static NR_Sched_Rsp_t NR_Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs]; extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind); extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind); extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind); @@ -178,8 +178,8 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) { #endif module_id_t module_id = UL_info->module_id; int CC_id = UL_info->CC_id; - NR_Sched_Rsp_t *sched_info = &Sched_INFO[module_id][CC_id]; - NR_IF_Module_t *ifi = if_inst[module_id]; + NR_Sched_Rsp_t *sched_info = &NR_Sched_INFO[module_id][CC_id]; + NR_IF_Module_t *ifi = nr_if_inst[module_id]; gNB_MAC_INST *mac = RC.nrmac[module_id]; LOG_D(PHY,"SFN/SF:%d%d module_id:%d CC_id:%d UL_info[rach_pdus:%d rx_ind:%d crcs:%d]\n", UL_info->frame,UL_info->slot, @@ -253,17 +253,17 @@ NR_IF_Module_t *NR_IF_Module_init(int Mod_id) { AssertFatal(Mod_id %d\n",Mod_id,MAX_IF_MODULES); LOG_I(PHY,"Installing callbacks for IF_Module - UL_indication\n"); - if (if_inst[Mod_id]==NULL) { - if_inst[Mod_id] = (NR_IF_Module_t*)malloc(sizeof(NR_IF_Module_t)); - memset((void*)if_inst[Mod_id],0,sizeof(NR_IF_Module_t)); + if (nr_if_inst[Mod_id]==NULL) { + nr_if_inst[Mod_id] = (NR_IF_Module_t*)malloc(sizeof(NR_IF_Module_t)); + memset((void*)nr_if_inst[Mod_id],0,sizeof(NR_IF_Module_t)); - LOG_I(MAC,"Allocating shared L1/L2 interface structure for instance %d @ %p\n",Mod_id,if_inst[Mod_id]); + LOG_I(MAC,"Allocating shared L1/L2 interface structure for instance %d @ %p\n",Mod_id,nr_if_inst[Mod_id]); - if_inst[Mod_id]->CC_mask=0; - if_inst[Mod_id]->NR_UL_indication = NR_UL_indication; - AssertFatal(pthread_mutex_init(&if_inst[Mod_id]->if_mutex,NULL)==0, - "allocation of if_inst[%d]->if_mutex fails\n",Mod_id); + nr_if_inst[Mod_id]->CC_mask=0; + nr_if_inst[Mod_id]->NR_UL_indication = NR_UL_indication; + AssertFatal(pthread_mutex_init(&nr_if_inst[Mod_id]->if_mutex,NULL)==0, + "allocation of nr_if_inst[%d]->if_mutex fails\n",Mod_id); } - return if_inst[Mod_id]; + return nr_if_inst[Mod_id]; } diff --git a/openair2/PHY_INTERFACE/IF_Module.c b/openair2/PHY_INTERFACE/IF_Module.c index d98c603d78..38a742bf74 100644 --- a/openair2/PHY_INTERFACE/IF_Module.c +++ b/openair2/PHY_INTERFACE/IF_Module.c @@ -7,8 +7,8 @@ #include "nfapi/oai_integration/vendor_ext.h" #define MAX_IF_MODULES 100 -IF_Module_t *if_inst[MAX_IF_MODULES]; -Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs]; +static IF_Module_t *if_inst[MAX_IF_MODULES]; +static Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs]; extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind); extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind); diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.c b/openair2/PHY_INTERFACE/phy_stub_UE.c index 21740016b1..c212075934 100644 --- a/openair2/PHY_INTERFACE/phy_stub_UE.c +++ b/openair2/PHY_INTERFACE/phy_stub_UE.c @@ -54,6 +54,7 @@ extern nfapi_tx_request_pdu_t* tx_request_pdu[1023][10][10]; extern uint16_t sf_ahead; +static eth_params_t stub_eth_params; void Msg1_transmitted(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id); void Msg3_transmitted(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id); diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h index 547fc2dfc4..26d4aed835 100644 --- a/openair2/PHY_INTERFACE/phy_stub_UE.h +++ b/openair2/PHY_INTERFACE/phy_stub_UE.h @@ -27,12 +27,11 @@ extern nfapi_dl_config_request_t* dl_config_req; extern nfapi_ul_config_request_t* ul_config_req; extern nfapi_hi_dci0_request_t* hi_dci0_req; -int tx_req_num_elems; +extern int tx_req_num_elems; //below 2 difinitions move to lte-ue.c to add initialization when difinition. //int next_ra_frame; //module_id_t next_Mod_id; -eth_params_t stub_eth_params; diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c index c57cec6ba5..e3d28d8a0f 100644 --- a/openair2/RRC/LTE/rrc_UE.c +++ b/openair2/RRC/LTE/rrc_UE.c @@ -330,7 +330,7 @@ void init_SL_preconfig(UE_RRC_INST *UE, const uint8_t eNB_index ) { preconfigpool->data_TF_ResourceConfig_r12.offsetIndicator_r12.choice.small_r12 = 0; // 40 ms SL Period preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.present = LTE_SubframeBitmapSL_r12_PR_bs40_r12; - preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf = CALLOC(1,5); + preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf = CALLOC(5,1); preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.size = 5; preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.bits_unused = 0; // last 36 subframes for PSCCH @@ -338,7 +338,7 @@ void init_SL_preconfig(UE_RRC_INST *UE, const uint8_t eNB_index ) { preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[1] = 0xFF; preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[2] = 0xFF; preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[3] = 0xFF; - preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[5] = 0xFF; + preconfigpool->data_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf[4] = 0xFF; preconfigpool->dataHoppingConfig_r12.hoppingParameter_r12 = 0; preconfigpool->dataHoppingConfig_r12.numSubbands_r12 = LTE_SL_HoppingConfigComm_r12__numSubbands_r12_ns1; preconfigpool->dataHoppingConfig_r12.rb_Offset_r12 = 0; diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index f373d74230..7e1c68ae4e 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -72,6 +72,7 @@ #include "nr_nas_msg_sim.h" #endif +NR_UE_RRC_INST_t *NR_UE_rrc_inst; /* NAS Attach request with IMSI */ static const char nr_nas_attach_req_imsi[] = { 0x07, 0x41, diff --git a/openair2/RRC/NR_UE/rrc_vars.h b/openair2/RRC/NR_UE/rrc_vars.h index 5c74e5b5a8..30c74debdd 100644 --- a/openair2/RRC/NR_UE/rrc_vars.h +++ b/openair2/RRC/NR_UE/rrc_vars.h @@ -36,6 +36,6 @@ #include "rrc_defs.h" -NR_UE_RRC_INST_t *NR_UE_rrc_inst; +extern NR_UE_RRC_INST_t *NR_UE_rrc_inst; #endif diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c index 847002ab44..5fb3288dc1 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB.c +++ b/openair3/GTPV1-U/gtpv1u_eNB.c @@ -51,6 +51,7 @@ #include "gtpv1u_eNB_defs.h" #include "gtpv1u_eNB_task.h" #include "rrc_eNB_GTPV1U.h" +#include #undef GTP_DUMP_SOCKET diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c index 178f21a44a..be887623bb 100644 --- a/openair3/NAS/UE/nas_ue_task.c +++ b/openair3/NAS/UE/nas_ue_task.c @@ -33,6 +33,7 @@ # include "memory.h" #include "nas_user.h" +#include // FIXME make command line option for NAS_UE_AUTOSTART # define NAS_UE_AUTOSTART 1 diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index dce410de47..f35a18eb0e 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -42,7 +42,6 @@ #include #include #include -#include #include "common_lib.h" #include "ethernet_lib.h" diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 99f2695d92..2db8ce5e7f 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -35,6 +35,7 @@ #include #include "rt_wrapper.h" +#include #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all @@ -102,6 +103,8 @@ pthread_cond_t nfapi_sync_cond; pthread_mutex_t nfapi_sync_mutex; int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex +msc_interface_t msc_interface; + uint16_t sf_ahead=4; diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index f97aa596f7..0ea2368b25 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -95,6 +95,7 @@ extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind); extern int multicast_link_write_sock(int groupP, char *dataP, uint32_t sizeP); +int tx_req_num_elems; extern uint16_t sf_ahead; //extern int tx_req_UE_MAC1(); diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 9bf179efb9..9b0c8c3c91 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -86,6 +86,7 @@ #include "lte-softmodem.h" +msc_interface_t msc_interface; /* temporary compilation wokaround (UE/eNB split */ uint16_t sf_ahead; diff --git a/targets/RT/USER/rt_wrapper.c b/targets/RT/USER/rt_wrapper.c index 5bdbbb36e3..b051868825 100644 --- a/targets/RT/USER/rt_wrapper.c +++ b/targets/RT/USER/rt_wrapper.c @@ -44,6 +44,7 @@ #include #include "rt_wrapper.h" #include +#include #include "openair1/PHY/defs_common.h" From 4511e70face325dc7d43b6d389ad96f3641776c0 Mon Sep 17 00:00:00 2001 From: Laurent OpenCells Date: Mon, 5 Apr 2021 12:56:52 +0200 Subject: [PATCH 110/125] fix from ci results --- cmake_targets/CMakeLists.txt | 4 +- common/utils/system.h | 4 +- common/utils/telnetsrv/telnetsrv.c | 2 +- openair1/PHY/LTE_REFSIG/primary_synch.h | 1 + openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c | 36 ------------------ openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h | 38 +++++++++++++++++++ openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- openair1/SIMULATION/TOOLS/phase_noise.c | 2 +- openair2/GNB_APP/gnb_config.c | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 26 +------------ openair2/PHY_INTERFACE/phy_stub_UE.h | 2 +- openair2/RRC/LTE/plmn_data.h | 3 +- openair2/RRC/LTE/rrc_eNB.c | 5 +-- openair2/UTIL/OCG/OCG.h | 6 --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 6 +-- .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 2 +- 16 files changed, 57 insertions(+), 84 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 8d8adb6eb0..3124d496d4 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -338,11 +338,11 @@ endif () add_definitions("-DASN_DISABLE_OER_SUPPORT") ######################### -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sanitize=address -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}") ######################### # set a flag for changes in the source code # these changes are related to hardcoded path to include .h files -set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -O0 --sanitize=address -DMALLOC_CHECK_=3") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -O0 -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3 -O2 -fno-delete-null-pointer-checks") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3") diff --git a/common/utils/system.h b/common/utils/system.h index 46316f6db6..b576495a46 100644 --- a/common/utils/system.h +++ b/common/utils/system.h @@ -49,8 +49,8 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, #define SCHED_OAI SCHED_RR #define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_OAI) -#define OAI_PRIORITY_RT sched_get_priority_min(SCHED_OAI)+1 -#define OAI_PRIORITY_RT_MAX sched_get_priority_min(SCHED_OAI)+2 +#define OAI_PRIORITY_RT ((sched_get_priority_min(SCHED_OAI)+sched_get_priority_min(SCHED_OAI))/2) +#define OAI_PRIORITY_RT_MAX sched_get_priority_max(SCHED_OAI)-2 void thread_top_init(char *thread_name, int affinity, diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c index 03f7af99bc..287b63c188 100644 --- a/common/utils/telnetsrv/telnetsrv.c +++ b/common/utils/telnetsrv/telnetsrv.c @@ -702,7 +702,7 @@ void poll_telnetcmdq(void *qid, void *arg) { */ void exec_moduleinit(char *modname) { void (*fptr)(void); - char initfunc[TELNET_CMD_MAXSIZE+9]; + char initfunc[TELNET_CMD_MAXSIZE+10]; if (strlen(modname) > TELNET_CMD_MAXSIZE) { fprintf(stderr,"[TELNETSRV] module %s not loaded, name exceeds the %i size limit\n", diff --git a/openair1/PHY/LTE_REFSIG/primary_synch.h b/openair1/PHY/LTE_REFSIG/primary_synch.h index 7a69222ddd..8152722df3 100644 --- a/openair1/PHY/LTE_REFSIG/primary_synch.h +++ b/openair1/PHY/LTE_REFSIG/primary_synch.h @@ -18,6 +18,7 @@ * For more information about the OpenAirInterface (OAI) Software Alliance: * contact@openairinterface.org */ + 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}; diff --git a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c index dfd759f376..4a419ae926 100644 --- a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c +++ b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c @@ -54,42 +54,6 @@ * *********************************************************************/ -/* Table 5.2.2.2-2: Definition of phi ( n ) for M ZC = 12 */ -const char phi_M_ZC_12[12*U_GROUP_NUMBER] -= { -/* 0 1 2 3 4 5 6 7 8 9 10 11 */ -/* 0 */ 1, -1, 3, 1, 1, -1, -1, -1, 1, 3, -3, 1, -/* 1 */ -1, -1, -1, -1, 1, -3, -1, 3, 3, -1, -3, 1, -/* 2 */ -3, 1, -3, -3, -3, 3, -3, -1, 1, 1, 1, -3, -/* 3 */ -3, 3, 1, 3, -3, 1, 1, 1, 1, 3, -3, 3, -/* 4 */ -3, 1, 3, -1, -1, -3, -3, -1, -1, 3, 1, -3, -/* 5 */ -1, 1, 1, -1, 1, 3, 3, -1, -1, -3, 1, -3, -/* 6 */ -3, -3, -1, 3, 3, 3, -3, 3, -3, 1, -1, -3, -/* 7 */ -3, 3, -3, 3, 3, -3, -1, -1, 3, 3, 1, -3, -/* 8 */ -3, -1, -3, -1, -1, -3, 3, 3, -1, -1, 1, -3, -/* 9 */ -3, 3, 3, 3, -1, -3, -3, -1, -3, 1, 3, -3, -/* 10 */ 1, 3, -3, 1, 3, 3, 3, 1, -1, 1, -1, 3, -/* 11 */ -1, -3, 3, -1, -3, -3, -3, -1, 1, -1, 1, -3, -/* 12 */ 3, 1, 3, 1, 3, -3, -1, 1, 3, 1, -1, -3, -/* 13 */ -3, -3, 3, 3, 3, -3, -1, 1, -3, 3, 1, -3, -/* 14 */ -3, -1, 1, -3, 1, 3, 3, 3, -1, -3, 3, 3, -/* 15 */ -3, -3, 3, 1, -3, -3, -3, -1, 3, -1, 1, 3, -/* 16 */ -1, 1, 3, -3, 1, -1, 1, -1, -1, -3, 1, -1, -/* 17 */ -3, -1, -1, 1, 3, 1, 1, -1, 1, -1, -3, 1, -/* 18 */ -3, -1, 3, -3, -3, -1, -3, 1, -1, -3, 3, 3, -/* 19 */ -3, -3, 3, -3, -1, 3, 3, 3, -1, -3, 1, -3, -/* 20 */ -3, 1, -1, -1, 3, 3, -3, -1, -1, -3, -1, -3, -/* 21 */ -3, 1, 3, 3, -1, -1, -3, 3, 3, -3, 3, -3, -/* 22 */ -3, -1, -1, -3, -3, -1, -3, 3, 1, 3, -1, -3, -/* 23 */ -3, -1, 3, 1, -3, -1, -3, 3, 1, 3, 3, 1, -/* 24 */ -3, 3, 3, 1, -3, 3, -1, 1, 3, -3, 3, -3, -/* 25 */ 3, -1, -3, 3, -3, -1, 3, 3, 3, -3, -1, -3, -/* 26 */ 1, -1, 3, -1, -1, -1, -3, -1, 1, 1, 1, -3, -/* 27 */ -3, 3, 1, -3, 1, 3, -1, -1, 1, 3, 3, 3, -/* 28 */ -3, 3, -3, 3, -3, -3, 3, -1, -1, 1, 3, -3, -/* 29 */ -3, 3, 1, -1, 3, 3, -3, 1, -1, 1, -1, 1, -} -; int16_t *base_sequence_less_than_36(unsigned int M_ZC, unsigned int u, unsigned int scaling) diff --git a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h index 0e17e2b3f3..43ec0c03dc 100644 --- a/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h +++ b/openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h @@ -141,6 +141,44 @@ EXTERN const char phi_M_ZC_6[6*U_GROUP_NUMBER] } #endif ; +/* Table 5.2.2.2-2: Definition of phi ( n ) for M ZC = 12 */ +EXTERN const char phi_M_ZC_12[12*U_GROUP_NUMBER] +#ifdef INIT_VARIABLES_LOWPAPR_SEQUENCES_NR_H += { +/* 0 1 2 3 4 5 6 7 8 9 10 11 */ +/* 0 */ 1, -1, 3, 1, 1, -1, -1, -1, 1, 3, -3, 1, +/* 1 */ -1, -1, -1, -1, 1, -3, -1, 3, 3, -1, -3, 1, +/* 2 */ -3, 1, -3, -3, -3, 3, -3, -1, 1, 1, 1, -3, +/* 3 */ -3, 3, 1, 3, -3, 1, 1, 1, 1, 3, -3, 3, +/* 4 */ -3, 1, 3, -1, -1, -3, -3, -1, -1, 3, 1, -3, +/* 5 */ -1, 1, 1, -1, 1, 3, 3, -1, -1, -3, 1, -3, +/* 6 */ -3, -3, -1, 3, 3, 3, -3, 3, -3, 1, -1, -3, +/* 7 */ -3, 3, -3, 3, 3, -3, -1, -1, 3, 3, 1, -3, +/* 8 */ -3, -1, -3, -1, -1, -3, 3, 3, -1, -1, 1, -3, +/* 9 */ -3, 3, 3, 3, -1, -3, -3, -1, -3, 1, 3, -3, +/* 10 */ 1, 3, -3, 1, 3, 3, 3, 1, -1, 1, -1, 3, +/* 11 */ -1, -3, 3, -1, -3, -3, -3, -1, 1, -1, 1, -3, +/* 12 */ 3, 1, 3, 1, 3, -3, -1, 1, 3, 1, -1, -3, +/* 13 */ -3, -3, 3, 3, 3, -3, -1, 1, -3, 3, 1, -3, +/* 14 */ -3, -1, 1, -3, 1, 3, 3, 3, -1, -3, 3, 3, +/* 15 */ -3, -3, 3, 1, -3, -3, -3, -1, 3, -1, 1, 3, +/* 16 */ -1, 1, 3, -3, 1, -1, 1, -1, -1, -3, 1, -1, +/* 17 */ -3, -1, -1, 1, 3, 1, 1, -1, 1, -1, -3, 1, +/* 18 */ -3, -1, 3, -3, -3, -1, -3, 1, -1, -3, 3, 3, +/* 19 */ -3, -3, 3, -3, -1, 3, 3, 3, -1, -3, 1, -3, +/* 20 */ -3, 1, -1, -1, 3, 3, -3, -1, -1, -3, -1, -3, +/* 21 */ -3, 1, 3, 3, -1, -1, -3, 3, 3, -3, 3, -3, +/* 22 */ -3, -1, -1, -3, -3, -1, -3, 3, 1, 3, -1, -3, +/* 23 */ -3, -1, 3, 1, -3, -1, -3, 3, 1, 3, 3, 1, +/* 24 */ -3, 3, 3, 1, -3, 3, -1, 1, 3, -3, 3, -3, +/* 25 */ 3, -1, -3, 3, -3, -1, 3, 3, 3, -3, -1, -3, +/* 26 */ 1, -1, 3, -1, -1, -1, -3, -1, 1, 1, 1, -3, +/* 27 */ -3, 3, 1, -3, 1, 3, -1, -1, 1, 3, 3, 3, +/* 28 */ -3, 3, -3, 3, -3, -3, 3, -1, -1, 1, 3, -3, +/* 29 */ -3, 3, 1, -1, 3, 3, -3, 1, -1, 1, -1, 1, +} +#endif +; /* Table 5.2.2.2-3: Definition of phi (n ) for M_ZC = 18 */ EXTERN const char phi_M_ZC_18[18*U_GROUP_NUMBER] diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index e1af4e31ac..d894061acd 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -40,6 +40,7 @@ #include "common/utils/LOG/log.h" #include #include "common/utils/LOG/vcd_signal_dumper.h" +#include #include "assertions.h" #include "msc.h" @@ -51,7 +52,6 @@ #define MBMS_NFAPI_SCHEDULER -extern nfapi_ue_release_request_body_t release_rntis; int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *eNB,uint16_t UE_id,uint8_t harq_pid, uint8_t bw_factor) { uint32_t Nre,sumKr,MPR_x100,Kr,r; diff --git a/openair1/SIMULATION/TOOLS/phase_noise.c b/openair1/SIMULATION/TOOLS/phase_noise.c index 1dfd43d8cb..6cc24f23db 100644 --- a/openair1/SIMULATION/TOOLS/phase_noise.c +++ b/openair1/SIMULATION/TOOLS/phase_noise.c @@ -26,7 +26,7 @@ #include "sim.h" -uint16_t LUTSin[ResolSinCos+1]; +static uint16_t LUTSin[ResolSinCos+1]; /* linear phase noise model */ void phase_noise(double ts, int16_t * InRe, int16_t * InIm) { diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index dd90426896..b40ff5d9e2 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -175,7 +175,7 @@ void prepare_scc(NR_ServingCellConfigCommon_t *scc) { scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble = CALLOC(1,sizeof(long)); scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->p0_NominalWithGrant = CALLOC(1,sizeof(long)); - scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon = CALLOC(1,sizeof(*scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon)); + scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon = CALLOC(1,sizeof(struct NR_SetupRelease_PUCCH_ConfigCommon)); scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->present= NR_SetupRelease_PUCCH_ConfigCommon_PR_setup; scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup = CALLOC(1,sizeof(struct NR_PUCCH_ConfigCommon)); scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->p0_nominal = CALLOC(1,sizeof(long)); diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index df3b5824c1..637c28fbf8 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -375,7 +375,6 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx protocol_ctxt_t ctxt; hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; - module_id_t ue_id = 0; pdcp_t *pdcp_p = NULL; static unsigned char pdcp_read_state_g =0; rb_id_t rab_id = 0; @@ -469,30 +468,7 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx } else { // rb_id =0, thus interpreated as broadcast and transported as multiple unicast // is a broadcast packet, we have to send this packet on all default RABS of all connected UEs //#warning CODE TO BE REVIEWED, ONLY WORK FOR SIMPLE TOPOLOGY CASES - for (ue_id = 0; ue_id < NB_UE_INST; ue_id++) { - if (oai_emulation.info.eNB_ue_module_id_to_rnti[ctxt_cpy.module_id][ue_id] != NOT_A_RNTI) { - ctxt.rnti = oai_emulation.info.eNB_ue_module_id_to_rnti[ctxt_cpy.module_id][ue_id]; - LOG_D(PDCP, "[FRAME %5u][eNB][IP][INSTANCE %u][RB %ld][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u][UE %u][RB DEFAULT_RAB_ID %u]\n", - ctxt.frame, - pdcp_read_header_g.inst, - pdcp_read_header_g.rb_id, - pdcp_read_header_g.data_size, - ctxt.module_id, - ctxt.rnti, - DEFAULT_RAB_ID); - pdcp_data_req ( - &ctxt, - SRB_FLAG_NO, - DEFAULT_RAB_ID, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pdcp_read_header_g.data_size, - (unsigned char *)NLMSG_DATA(nas_nlh_rx), - PDCP_TRANSMISSION_MODE_DATA - ,NULL, NULL - ); - } - } + // never finished code, dropped } } else { // ctxt.enb_flag => UE if (NFAPI_MODE == NFAPI_UE_STUB_PNF) { diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h index 26d4aed835..a542c7bbab 100644 --- a/openair2/PHY_INTERFACE/phy_stub_UE.h +++ b/openair2/PHY_INTERFACE/phy_stub_UE.h @@ -18,6 +18,7 @@ //#include "openair1/PHY/LTE_TRANSPORT/defs.h" //below 2 difinitions move to phy_stub_UE.c to add initialization when difinition. +extern int tx_req_num_elems; extern UL_IND_t *UL_INFO; extern nfapi_tx_request_pdu_t* tx_request_pdu_list; // New @@ -27,7 +28,6 @@ extern nfapi_dl_config_request_t* dl_config_req; extern nfapi_ul_config_request_t* ul_config_req; extern nfapi_hi_dci0_request_t* hi_dci0_req; -extern int tx_req_num_elems; //below 2 difinitions move to lte-ue.c to add initialization when difinition. //int next_ra_frame; diff --git a/openair2/RRC/LTE/plmn_data.h b/openair2/RRC/LTE/plmn_data.h index 1b80ee9d7b..15dbd4aa23 100644 --- a/openair2/RRC/LTE/plmn_data.h +++ b/openair2/RRC/LTE/plmn_data.h @@ -2232,6 +2232,7 @@ static const plmn_data_t plmn_data[] = { 310 900 Mid-Rivers Communications Mid-Rivers Wireless Operational */ {310, 910, "Verizon Wireless", "Verizon USA"}, + {0,0,"",""} /* 310 920 Get Mobile Inactive 310 930 Copper Valley Wireless Inactive @@ -2295,7 +2296,7 @@ static const plmn_data_t plmn_data[] = { 648 4 Econet Wireless Econet Operational */ - {0,0,"",""} + }; diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index 526ce129b1..b30422ce2f 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -6557,10 +6557,9 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( (int)DRB_configList->list.array[i]->drb_Identity, (int)*DRB_configList->list.array[i]->logicalChannelIdentity); /* For pre-ci tests */ - LOG_I(RRC, "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete from UE %u, reconfiguring DRB %d/LCID %d\n", + LOG_I(RRC, "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete, reconfiguring DRB %d/LCID %d\n", ctxt_pP->module_id, ctxt_pP->frame, - oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[ctxt_pP->module_id][ue_context_pP->local_uid], (int)DRB_configList->list.array[i]->drb_Identity, (int)*DRB_configList->list.array[i]->logicalChannelIdentity); @@ -6585,7 +6584,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( "[eNB %d] Config the oai%d to send/receive pkt on DRB %ld to/from the protocol stack\n", ctxt_pP->module_id, ctxt_pP->module_id, (long int)((ue_context_pP->local_uid * LTE_maxDRB) + DRB_configList->list.array[i]->drb_Identity)); - ue_module_id = oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[ctxt_pP->module_id][ue_context_pP->local_uid]; + ue_module_id = 0; // Was oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[ctxt_pP->module_id][ue_context_pP->local_uid]; rb_conf_ipv4(0, //add ue_module_id, //cx ctxt_pP->module_id, //inst diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h index 73f2f26d08..58cc7184e7 100644 --- a/openair2/UTIL/OCG/OCG.h +++ b/openair2/UTIL/OCG/OCG.h @@ -716,12 +716,6 @@ typedef struct { */ unsigned char slot_isr; int slot_sfd; - rnti_t eNB_ue_module_id_to_rnti[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];/*!< \brief used by eNB, this array can be filled: - by local virtualization: set directly by UE, or by remote UEs: TODO add signalisation on ethernet emulation link from UE to eNB*/ - - module_id_t eNB_ue_local_uid_to_ue_module_id[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];/*!< \brief used by eNB, this array can be filled: - by local virtualization: set directly by UE, or by remote UEs: TODO add signalisation on ethernet emulation link from UE to eNB*/ - } Info; /* @}*/ diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 61a742af65..853cb41620 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -153,7 +153,7 @@ int check_ref_locked(usrp_state_t *s,size_t mboard) { } static int sync_to_gps(openair0_device *device) { - uhd::set_thread_priority_safe(); + //uhd::set_thread_priority_safe(); //std::string args; //Set up program options //po::options_description desc("Allowed options"); @@ -589,7 +589,7 @@ void *trx_usrp_write_thread(void * arg){ int trx_usrp_write_init(openair0_device *device){ - uhd::set_thread_priority_safe(1.0); + //uhd::set_thread_priority_safe(1.0); openair0_thread_t *write_thread = &device->write_thread; printf("initializing tx write thread\n"); @@ -940,7 +940,7 @@ extern "C" { // hotfix! to be checked later - uhd::set_thread_priority_safe(1.0); + //uhd::set_thread_priority_safe(1.0); // Initialize USRP device int vers=0,subvers=0,subsubvers=0; int bw_gain_adjust=0; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 1b329c54da..96df4a971f 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -269,7 +269,7 @@ RUs = ( eNB_instances = [0]; #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; - clock_src = "external"; + clock_src = "internal"; } ); From 873e42612ad0dff8ca6f7f76a6e92041734e6674 Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Tue, 6 Apr 2021 21:32:19 +0200 Subject: [PATCH 111/125] merge develop, documentation fix --- common/utils/threadPool/thread-pool.md | 6 +++--- executables/nr-ru.c | 2 +- .../CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf | 9 --------- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/common/utils/threadPool/thread-pool.md b/common/utils/threadPool/thread-pool.md index a087b989fa..80f3b99446 100644 --- a/common/utils/threadPool/thread-pool.md +++ b/common/utils/threadPool/thread-pool.md @@ -210,8 +210,8 @@ time the worker finished the job time the client reads the result if you set the environement variable: -thread-pool-measurements to a valid file name +threadPoolMeasurements to a valid file name These measurements will be wrote to this Linux pipe. -A tool to read the linux fifo and display it in ascii is provided: -see the local directory Makefile for this tool and to compile the thread pool unitary tests. +A tool to read the linux fifo and display it in ascii is provided; compute the binay: +in cmake building directory: make/ninja measurement_display \ No newline at end of file diff --git a/executables/nr-ru.c b/executables/nr-ru.c index b059c6f4e8..6aa21613da 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -1390,7 +1390,7 @@ void *ru_thread( void *param ) { syncMsg->frame_tx = proc->frame_tx; syncMsg->slot_tx = proc->tti_tx; syncMsg->timestamp_tx = proc->timestamp_tx; - res->key = proc->tti_rx; + res->key = 3000+proc->tti_rx; pushTpool(gNB->threadPool, res); } diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 96df4a971f..535db82dfc 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -282,15 +282,6 @@ THREAD_STRUCT = ( } ); -rfsimulator : -{ - serveraddr = "server"; - serverport = "4043"; - options = (); #("saviq"); or/and "chanmod" - modelname = "AWGN"; - IQfile = "/tmp/rfsimulator.iqs"; -}; - log_config : { global_log_level ="info"; From 04f2ec2352a4f66f34940b9b1f077a24326d27cd Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Tue, 6 Apr 2021 21:33:13 +0200 Subject: [PATCH 112/125] merge develop, documentation fix --- executables/nr-gnb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index a92f433560..379bbfeb5c 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -126,7 +126,7 @@ void tx_func(void *param) { syncMsg->slot_tx = slot_tx; syncMsg->timestamp_tx = info->timestamp_tx; syncMsg->ru = gNB->RU_list[0]; - res->key = slot_tx; + res->key = 1000+slot_tx; pushTpool(gNB->threadPool, res); } @@ -275,7 +275,7 @@ void rx_func(void *param) { syncMsg->frame_tx = frame_tx; syncMsg->slot_tx = slot_tx; syncMsg->timestamp_tx = info->timestamp_tx; - res->key = slot_tx; + res->key = 2000+slot_tx; pushTpool(gNB->threadPool, res); } From 2ec6ee5f5bdbeb67b8c1cf959248fa448b80d894 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 7 Apr 2021 16:03:26 +0100 Subject: [PATCH 113/125] Fix Msg4 mac pdu with padding --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 16 +++++----------- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 10 ++++++++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 719fd5ea61..d00903a71e 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1782,25 +1782,19 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff); mac_subheader_len = 3; } else { - mac_sdu_len = ((NR_MAC_SUBHEADER_LONG *) pduP)->L1; + mac_sdu_len = ((NR_MAC_SUBHEADER_SHORT *) pduP)->L; mac_subheader_len = 2; } - // Check if it is a valid CCCH message, we get all 00's messages very often - if ( pdu_len != (mac_subheader_len+mac_sdu_len) ) { - LOG_D(NR_MAC, "%s() Invalid CCCH message!, pdu_len: %d\n", __func__, pdu_len); - return; - } + if ( pdu_len >= mac_sdu_len ) { - if ( mac_sdu_len > 0 ) { + LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d\n", mac_sdu_len); - LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d: bits\n", mac_sdu_len); - - LOG_D(NR_MAC,"RRCSetup received at nr_ue_process_mac_pdu with payload len %d: \n bits, rx bytes: \n", mac_sdu_len); + LOG_D(NR_MAC,"RRCSetup received at nr_ue_process_mac_pdu with payload len %d: \n", mac_sdu_len); for (int i = 0; i < mac_subheader_len; i++) { LOG_D(NR_MAC, "MAC header %d: 0x%x\n", i, pduP[i]); } - for (int i = 0; i < mac_sdu_len/8; i++) { + for (int i = 0; i < mac_sdu_len; i++) { LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[mac_subheader_len + i]); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 9a0034cbb5..06615f63d3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1377,6 +1377,16 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->BWPSize, nr_mac->sched_ctrlCommon->active_bwp->bwp_Id); + // Add padding header and zero rest out if there is space left + if (mac_pdu_length < harq->tb_size) { + NR_MAC_SUBHEADER_FIXED *padding = (NR_MAC_SUBHEADER_FIXED *) &buf[mac_pdu_length]; + padding->R = 0; + padding->LCID = DL_SCH_LCID_PADDING; + for(int k = mac_pdu_length+1; ktb_size; k++) { + buf[k] = 0; + } + } + // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; memcpy(tx_req->TLVs[0].value.direct, harq->tb, sizeof(uint8_t) * harq->tb_size); From 04b28e5f2addb5bb90a4227c7eb14fd5d7867691 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 7 Apr 2021 16:31:06 +0100 Subject: [PATCH 114/125] Fix Msg4 mac pdu with padding --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index d00903a71e..68b6bb5b3c 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1786,7 +1786,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, mac_subheader_len = 2; } - if ( pdu_len >= mac_sdu_len ) { + if ( pdu_len >= (mac_subheader_len + mac_sdu_len) ) { LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d\n", mac_sdu_len); From 7c37794513ad74fd2841e38908f98405172bf694 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 8 Apr 2021 14:56:05 +0100 Subject: [PATCH 115/125] Revert code indentation in usrp_lib --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 844 ++++++++++--------- 1 file changed, 432 insertions(+), 412 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index d6ee1b340a..8025337ecb 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -272,6 +272,7 @@ static int sync_to_gps(openair0_device *device) { */ static int trx_usrp_start(openair0_device *device) { usrp_state_t *s = (usrp_state_t *)device->priv; + // setup GPIO for TDD, GPIO(4) = ATR_RX //set data direction register (DDR) to output s->usrp->set_gpio_attr("FP0", "DDR", 0xfff, 0xfff); @@ -284,16 +285,17 @@ static int trx_usrp_start(openair0_device *device) { s->usrp->set_gpio_attr("FP0", "ATR_XX", (1<<5), 0x7f); // set the output pins to 1 s->usrp->set_gpio_attr("FP0", "OUT", 7<<7, 0xf80); + s->wait_for_first_pps = 1; s->rx_count = 0; s->tx_count = 0; //s->first_tx = 1; //s->first_rx = 1; s->rx_timestamp = 0; + s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); // wait for the pps to change uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(); - while (time_last_pps == s->usrp->get_time_last_pps()) { boost::this_thread::sleep(boost::posix_time::milliseconds(1)); } @@ -302,6 +304,7 @@ static int trx_usrp_start(openair0_device *device) { cmd.time_spec = uhd::time_spec_t(1.0); cmd.stream_now = false; // start at constant delay s->rx_stream->issue_stream_cmd(cmd); + return 0; } /*! \brief Terminate operation of the USRP transceiver -- free all associated resources @@ -315,8 +318,9 @@ static void trx_usrp_end(openair0_device *device) { if (s == NULL) return; - iqrecorder_end(device); + + } /*! \brief Called to send samples to the USRP RF target @@ -328,59 +332,64 @@ static void trx_usrp_end(openair0_device *device) { @param flags flags must be set to TRUE if timestamp parameter needs to be applied */ static int trx_usrp_write(openair0_device *device, - openair0_timestamp timestamp, - void **buff, - int nsamps, - int cc, - int flags) { + openair0_timestamp timestamp, + void **buff, + int nsamps, + int cc, + int flags) { int ret=0; usrp_state_t *s = (usrp_state_t *)device->priv; int nsamps2; // aligned to upper 32 or 16 byte boundary + int flags_lsb = flags&0xff; int flags_msb = (flags>>8)&0xff; + int end; openair0_thread_t *write_thread = &device->write_thread; openair0_write_package_t *write_package = write_thread->write_package; - AssertFatal( MAX_WRITE_THREAD_BUFFER_SIZE >= cc,"Do not support more than %d cc number\n", MAX_WRITE_THREAD_BUFFER_SIZE); - boolean_t first_packet_state=false,last_packet_state=false; - if (flags_lsb == 2) { // start of burst - // s->tx_md.start_of_burst = true; - // s->tx_md.end_of_burst = false; - first_packet_state = true; - last_packet_state = false; - } else if (flags_lsb == 3) { // end of burst - //s->tx_md.start_of_burst = false; - //s->tx_md.end_of_burst = true; - first_packet_state = false; - last_packet_state = true; - } else if (flags_lsb == 4) { // start and end + AssertFatal( MAX_WRITE_THREAD_BUFFER_SIZE >= cc,"Do not support more than %d cc number\n", MAX_WRITE_THREAD_BUFFER_SIZE); + + boolean_t first_packet_state=false,last_packet_state=false; + + if (flags_lsb == 2) { // start of burst + // s->tx_md.start_of_burst = true; + // s->tx_md.end_of_burst = false; + first_packet_state = true; + last_packet_state = false; + } else if (flags_lsb == 3) { // end of burst + //s->tx_md.start_of_burst = false; + //s->tx_md.end_of_burst = true; + first_packet_state = false; + last_packet_state = true; + } else if (flags_lsb == 4) { // start and end // s->tx_md.start_of_burst = true; // s->tx_md.end_of_burst = true; - first_packet_state = true; - last_packet_state = true; - } else if (flags_lsb==1) { // middle of burst + first_packet_state = true; + last_packet_state = true; + } else if (flags_lsb==1) { // middle of burst // s->tx_md.start_of_burst = false; // s->tx_md.end_of_burst = false; - first_packet_state = false; - last_packet_state = false; - } else if (flags_lsb==10) { // fail safe mode - // s->tx_md.has_time_spec = false; - // s->tx_md.start_of_burst = false; - // s->tx_md.end_of_burst = true; - first_packet_state = false; - last_packet_state = true; - } + first_packet_state = false; + last_packet_state = false; + } + else if (flags_lsb==10) { // fail safe mode + // s->tx_md.has_time_spec = false; + // s->tx_md.start_of_burst = false; + // s->tx_md.end_of_burst = true; + first_packet_state = false; + last_packet_state = true; + } - if(usrp_tx_thread == 0) { + if(usrp_tx_thread == 0){ #if defined(__x86_64) || defined(__i386__) -#ifdef __AVX2__ - nsamps2 = (nsamps+7)>>3; - __m256i buff_tx[8][nsamps2]; -#else + #ifdef __AVX2__ + nsamps2 = (nsamps+7)>>3; + __m256i buff_tx[8][nsamps2]; + #else nsamps2 = (nsamps+3)>>2; __m128i buff_tx[8][nsamps2]; -#endif + #endif #elif defined(__arm__) nsamps2 = (nsamps+3)>>2; int16x8_t buff_tx[8][nsamps2]; @@ -408,8 +417,8 @@ static int trx_usrp_write(openair0_device *device, s->tx_md.end_of_burst = last_packet_state; s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); s->tx_count++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO,1); +VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO,1); // bit 3 enables gpio (for backward compatibility) if (flags_msb&8) { // push GPIO bits 7-9 from flags_msb @@ -418,8 +427,7 @@ static int trx_usrp_write(openair0_device *device, s->usrp->set_gpio_attr("FP0", "OUT", gpio789, 0x380); s->usrp->clear_command_time(); } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO,0); +VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO,0); if (cc>1) { std::vector buff_ptrs; @@ -428,18 +436,18 @@ static int trx_usrp_write(openair0_device *device, buff_ptrs.push_back(&(((int16_t *)buff_tx[i])[0])); ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md); - } else { + } + else { ret = (int)s->tx_stream->send(&(((int16_t *)buff_tx[0])[0]), nsamps, s->tx_md); } - if (ret != nsamps) - LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps); - + if (ret != nsamps) LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps); return ret; - } else { + } + else{ pthread_mutex_lock(&write_thread->mutex_write); - if(write_thread->count_write >= MAX_WRITE_THREAD_PACKAGE) { + if(write_thread->count_write >= MAX_WRITE_THREAD_PACKAGE){ LOG_W(HW,"Buffer overflow, count_write = %d, start = %d end = %d, resetting write package\n", write_thread->count_write, write_thread->start, write_thread->end); write_thread->end = write_thread->start; write_thread->count_write = 0; @@ -452,16 +460,15 @@ static int trx_usrp_write(openair0_device *device, write_package[end].first_packet = first_packet_state; write_package[end].last_packet = last_packet_state; write_package[end].flags_msb = flags_msb; - for (int i = 0; i < cc; i++) write_package[end].buff[i] = buff[i]; - write_thread->count_write++; write_thread->end = (write_thread->end + 1)% MAX_WRITE_THREAD_PACKAGE; pthread_cond_signal(&write_thread->cond_write); pthread_mutex_unlock(&write_thread->mutex_write); return 0; } + } //-----------------------start-------------------------- @@ -473,11 +480,12 @@ static int trx_usrp_write(openair0_device *device, @param antenna_id index of the antenna if the device has multiple antennas @param flags flags must be set to TRUE if timestamp parameter needs to be applied */ -void *trx_usrp_write_thread(void *arg) { +void *trx_usrp_write_thread(void * arg){ int ret=0; openair0_device *device=(openair0_device *)arg; openair0_thread_t *write_thread = &device->write_thread; openair0_write_package_t *write_package = write_thread->write_package; + usrp_state_t *s; int nsamps2; // aligned to upper 32 or 16 byte boundary int start; @@ -489,13 +497,11 @@ void *trx_usrp_write_thread(void *arg) { signed char last_packet; int flags_msb; - while(1) { + while(1){ pthread_mutex_lock(&write_thread->mutex_write); - while (write_thread->count_write == 0) { pthread_cond_wait(&write_thread->cond_write,&write_thread->mutex_write); // this unlocks mutex_rxtx while waiting and then locks it again } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD, 1 ); s = (usrp_state_t *)device->priv; start = write_thread->start; @@ -512,36 +518,38 @@ void *trx_usrp_write_thread(void *arg) { /*if(write_thread->count_write != 0){ LOG_W(HW,"count write = %d, start = %d, end = %d\n", write_thread->count_write, write_thread->start, write_thread->end); }*/ -#if defined(__x86_64) || defined(__i386__) -#ifdef __AVX2__ - nsamps2 = (nsamps+7)>>3; - __m256i buff_tx[8][nsamps2]; -#else - nsamps2 = (nsamps+3)>>2; - __m128i buff_tx[8][nsamps2]; -#endif -#elif defined(__arm__) - nsamps2 = (nsamps+3)>>2; - int16x8_t buff_tx[8][nsamps2]; -#else -#error Unsupported CPU architecture, USRP device cannot be built -#endif + + #if defined(__x86_64) || defined(__i386__) + #ifdef __AVX2__ + nsamps2 = (nsamps+7)>>3; + __m256i buff_tx[8][nsamps2]; + #else + nsamps2 = (nsamps+3)>>2; + __m128i buff_tx[8][nsamps2]; + #endif + #elif defined(__arm__) + nsamps2 = (nsamps+3)>>2; + int16x8_t buff_tx[8][nsamps2]; + #else + #error Unsupported CPU architecture, USRP device cannot be built + #endif // bring RX data into 12 LSBs for softmodem RX for (int i=0; itx_md.has_time_spec = true; s->tx_md.start_of_burst = (s->tx_count==0) ? true : first_packet; s->tx_md.end_of_burst = last_packet; @@ -564,32 +572,34 @@ void *trx_usrp_write_thread(void *arg) { buff_ptrs.push_back(&(((int16_t *)buff_tx[i])[0])); ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md); - } else { + } + else { ret = (int)s->tx_stream->send(&(((int16_t *)buff_tx[0])[0]), nsamps, s->tx_md); } - if (ret != nsamps) - LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps); - + if (ret != nsamps) LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_USRP_SEND_RETURN, ret ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD, 0 ); - if(0) - break; + if(0) break; } return NULL; } -int trx_usrp_write_init(openair0_device *device) { +int trx_usrp_write_init(openair0_device *device){ + uhd::set_thread_priority_safe(1.0); openair0_thread_t *write_thread = &device->write_thread; printf("initializing tx write thread\n"); + write_thread->start = 0; write_thread->end = 0; write_thread->count_write = 0; printf("end of tx write thread\n"); + pthread_create(&write_thread->pthread_write,NULL,trx_usrp_write_thread,(void *)device); + return(0); } @@ -623,60 +633,57 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp int16x8_t buff_tmp[2][nsamps2]; #endif - if (cc>1) { - // receive multiple channels (e.g. RF A and RF B) - std::vector buff_ptrs; + if (cc>1) { + // receive multiple channels (e.g. RF A and RF B) + std::vector buff_ptrs; - for (int i=0; irx_stream->recv(buff_ptrs, nsamps, s->rx_md); - } else { - // receive a single channel (e.g. from connector RF A) - samples_received=0; + samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md); + } else { + // receive a single channel (e.g. from connector RF A) + samples_received=0; - while (samples_received != nsamps) { - samples_received += s->rx_stream->recv((void *)((int32_t *)buff_tmp[0]+samples_received), - nsamps-samples_received, s->rx_md); + while (samples_received != nsamps) { + samples_received += s->rx_stream->recv((void*)((int32_t*)buff_tmp[0]+samples_received), + nsamps-samples_received, s->rx_md); - if ((s->wait_for_first_pps == 0) && (s->rx_md.error_code!=uhd::rx_metadata_t::ERROR_CODE_NONE)) - break; + if ((s->wait_for_first_pps == 0) && (s->rx_md.error_code!=uhd::rx_metadata_t::ERROR_CODE_NONE)) + break; - if ((s->wait_for_first_pps == 1) && (samples_received != nsamps)) { - printf("sleep...\n"); //usleep(100); + if ((s->wait_for_first_pps == 1) && (samples_received != nsamps)) { + printf("sleep...\n"); //usleep(100); + } } + if (samples_received == nsamps) s->wait_for_first_pps=0; } - if (samples_received == nsamps) - s->wait_for_first_pps=0; - } - - // bring RX data into 12 LSBs for softmodem RX - for (int i=0; irx_md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) LOG_E(HW, "%s\n", s->rx_md.to_pp_string(true).c_str()); @@ -684,11 +691,12 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp s->rx_count += nsamps; s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); *ptimestamp = s->rx_timestamp; + // push GPIO bits 7-9 from flags_msb - /*s->usrp->set_command_time(uhd::time_spec_t::from_ticks((s->rx_timestamp+(2*nsamps)),s->sample_rate)); - s->usrp->set_gpio_attr("FP0", "OUT", gpio789<<7, 0x380); - s->usrp->clear_command_time(); - gpio789 = (gpio789+1)&7;*/ + /*s->usrp->set_command_time(uhd::time_spec_t::from_ticks((s->rx_timestamp+(2*nsamps)),s->sample_rate)); + s->usrp->set_gpio_attr("FP0", "OUT", gpio789<<7, 0x380); + s->usrp->clear_command_time(); + gpio789 = (gpio789+1)&7;*/ recplay_state_t *recPlay=device->recplay_state; if ( recPlay != NULL) { // record mode @@ -937,6 +945,8 @@ extern "C" { device->trx_set_freq_func = trx_usrp_set_freq; device->trx_set_gains_func = trx_usrp_set_gains; device->trx_write_init = trx_usrp_write_init; + + // hotfix! to be checked later uhd::set_thread_priority_safe(1.0); // Initialize USRP device @@ -1003,319 +1013,329 @@ extern "C" { s->usrp = uhd::usrp::multi_usrp::make(args); if (args.find("clock_source")==std::string::npos) { - if (openair0_cfg[0].clock_source == internal) { - s->usrp->set_clock_source("internal"); - LOG_D(HW,"Setting clock source to internal\n"); - } else if (openair0_cfg[0].clock_source == external ) { - s->usrp->set_clock_source("external"); - LOG_D(HW,"Setting clock source to external\n"); - } else if (openair0_cfg[0].clock_source==gpsdo) { - s->usrp->set_clock_source("gpsdo"); - LOG_D(HW,"Setting clock source to gpsdo\n"); - } else { - LOG_W(HW,"Clock source set neither in usrp_args nor on command line, using default!\n"); - } - } else { - if (openair0_cfg[0].clock_source != unset) { - LOG_W(HW,"Clock source set in both usrp_args and in clock_source, ingnoring the latter!\n"); - } + if (openair0_cfg[0].clock_source == internal) { + s->usrp->set_clock_source("internal"); + LOG_D(HW,"Setting clock source to internal\n"); + } + else if (openair0_cfg[0].clock_source == external ) { + s->usrp->set_clock_source("external"); + LOG_D(HW,"Setting clock source to external\n"); + } + else if (openair0_cfg[0].clock_source==gpsdo) { + s->usrp->set_clock_source("gpsdo"); + LOG_D(HW,"Setting clock source to gpsdo\n"); + } + else { + LOG_W(HW,"Clock source set neither in usrp_args nor on command line, using default!\n"); + } } + else { + if (openair0_cfg[0].clock_source != unset) { + LOG_W(HW,"Clock source set in both usrp_args and in clock_source, ingnoring the latter!\n"); + } + } if (args.find("time_source")==std::string::npos) { - if (openair0_cfg[0].time_source == internal) { - s->usrp->set_time_source("internal"); - LOG_D(HW,"Setting time source to internal\n"); - } else if (openair0_cfg[0].time_source == external ) { - s->usrp->set_time_source("external"); - LOG_D(HW,"Setting time source to external\n"); - } else if (openair0_cfg[0].time_source==gpsdo) { - s->usrp->set_time_source("gpsdo"); - LOG_D(HW,"Setting time source to gpsdo\n"); - } else { - LOG_W(HW,"Time source set neither in usrp_args nor on command line, using default!\n"); - } + if (openair0_cfg[0].time_source == internal) { + s->usrp->set_time_source("internal"); + LOG_D(HW,"Setting time source to internal\n"); + } + else if (openair0_cfg[0].time_source == external ) { + s->usrp->set_time_source("external"); + LOG_D(HW,"Setting time source to external\n"); + } + else if (openair0_cfg[0].time_source==gpsdo) { + s->usrp->set_time_source("gpsdo"); + LOG_D(HW,"Setting time source to gpsdo\n"); + } + else { + LOG_W(HW,"Time source set neither in usrp_args nor on command line, using default!\n"); + } + } + else { + if (openair0_cfg[0].clock_source != unset) { + LOG_W(HW,"Time source set in both usrp_args and in time_source, ingnoring the latter!\n"); + } + } + + + if (s->usrp->get_clock_source(0) == "gpsdo") { + s->use_gps = 1; + + if (sync_to_gps(device)==EXIT_SUCCESS) { + LOG_I(HW,"USRP synced with GPS!\n"); } else { - if (openair0_cfg[0].clock_source != unset) { - LOG_W(HW,"Time source set in both usrp_args and in time_source, ingnoring the latter!\n"); - } + LOG_I(HW,"USRP fails to sync with GPS. Exiting.\n"); + exit(EXIT_FAILURE); + } + } else if (s->usrp->get_clock_source(0) == "external") { + if (check_ref_locked(s,0)) { + LOG_I(HW,"USRP locked to external reference!\n"); + } else { + LOG_I(HW,"Failed to lock to external reference. Exiting.\n"); + exit(EXIT_FAILURE); + } + } + + if (device->type==USRP_X300_DEV) { + openair0_cfg[0].rx_gain_calib_table = calib_table_x310; + std::cerr << "-- Using calibration table: calib_table_x310" << std::endl; + } + + if (device->type==USRP_N300_DEV) { + openair0_cfg[0].rx_gain_calib_table = calib_table_n310; + std::cerr << "-- Using calibration table: calib_table_n310" << std::endl; + } + + + if (device->type==USRP_N300_DEV || device->type==USRP_X300_DEV) { + LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate); + + switch ((int)openair0_cfg[0].sample_rate) { + case 122880000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; //to be checked + openair0_cfg[0].tx_bw = 80e6; + openair0_cfg[0].rx_bw = 80e6; + break; + + case 92160000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; //to be checked + openair0_cfg[0].tx_bw = 80e6; + openair0_cfg[0].rx_bw = 80e6; + break; + + case 61440000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; + + case 46080000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; + + case 30720000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 15360000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 45; + openair0_cfg[0].tx_bw = 10e6; + openair0_cfg[0].rx_bw = 10e6; + break; + + case 7680000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 5e6; + openair0_cfg[0].rx_bw = 5e6; + break; + + case 1920000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 1.25e6; + openair0_cfg[0].rx_bw = 1.25e6; + break; + + default: + LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + } + + if (device->type == USRP_B200_DEV) { + if ((vers == 3) && (subvers == 9) && (subsubvers>=2)) { + openair0_cfg[0].rx_gain_calib_table = calib_table_b210; + bw_gain_adjust=0; + std::cerr << "-- Using calibration table: calib_table_b210" << std::endl; // Bell Labs info + } else { + openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38; + bw_gain_adjust=1; + std::cerr << "-- Using calibration table: calib_table_b210_38" << std::endl; // Bell Labs info } - if (s->usrp->get_clock_source(0) == "gpsdo") { - s->use_gps = 1; + switch ((int)openair0_cfg[0].sample_rate) { + case 46080000: + s->usrp->set_master_clock_rate(46.08e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 115; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; - if (sync_to_gps(device)==EXIT_SUCCESS) { - LOG_I(HW,"USRP synced with GPS!\n"); - } else { - LOG_I(HW,"USRP fails to sync with GPS. Exiting.\n"); - exit(EXIT_FAILURE); - } - } else if (s->usrp->get_clock_source(0) == "external") { - if (check_ref_locked(s,0)) { - LOG_I(HW,"USRP locked to external reference!\n"); - } else { - LOG_I(HW,"Failed to lock to external reference. Exiting.\n"); - exit(EXIT_FAILURE); - } + case 30720000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 115; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 23040000: + s->usrp->set_master_clock_rate(23.04e6); //to be checked + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 113; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 15360000: + s->usrp->set_master_clock_rate(30.72e06); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 103; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 7680000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + case 1920000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 40; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + + default: + LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; } + } - if (device->type==USRP_X300_DEV) { - openair0_cfg[0].rx_gain_calib_table = calib_table_x310; - std::cerr << "-- Using calibration table: calib_table_x310" << std::endl; + /* device specific */ + //openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered + openair0_cfg[0].iq_txshift = 4;//shift + openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + + for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) { + if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); + set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); + ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); + // limit to maximum gain + AssertFatal( openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] <= gain_range.stop(), + "RX Gain too high, lower by %f dB\n", + openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); + s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); + LOG_I(HW,"RX Gain %d %f (%f) => %f (max %f)\n",i, + openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], + openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); } + } - if (device->type==USRP_N300_DEV) { - openair0_cfg[0].rx_gain_calib_table = calib_table_n310; - std::cerr << "-- Using calibration table: calib_table_n310" << std::endl; + LOG_D(HW, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels()); + LOG_D(HW, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels); + + for(int i=0; i<((int) s->usrp->get_tx_num_channels()); i++) { + ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); + + if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); + s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i); + LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]); } + } - if (device->type==USRP_N300_DEV || device->type==USRP_X300_DEV) { - LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate); + //s->usrp->set_clock_source("external"); + //s->usrp->set_time_source("external"); + // display USRP settings + LOG_I(HW,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6); + LOG_I(HW,"Actual clock source %s...\n",s->usrp->get_clock_source(0).c_str()); + LOG_I(HW,"Actual time source %s...\n",s->usrp->get_time_source(0).c_str()); + sleep(1); + // create tx & rx streamer + uhd::stream_args_t stream_args_rx("sc16", "sc16"); + int samples=openair0_cfg[0].sample_rate; + int max=s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps(); + samples/=10000; + LOG_I(HW,"RF board max packet size %u, size for 100µs jitter %d \n", max, samples); - switch ((int)openair0_cfg[0].sample_rate) { - case 122880000: - // from usrp_time_offset - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; //to be checked - openair0_cfg[0].tx_bw = 80e6; - openair0_cfg[0].rx_bw = 80e6; - break; + if ( samples < max ) { + stream_args_rx.args["spp"] = str(boost::format("%d") % samples ); + } - case 92160000: - // from usrp_time_offset - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; //to be checked - openair0_cfg[0].tx_bw = 80e6; - openair0_cfg[0].rx_bw = 80e6; - break; + LOG_I(HW,"rx_max_num_samps %zu\n", + s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps()); - case 61440000: - // from usrp_time_offset - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; - openair0_cfg[0].tx_bw = 40e6; - openair0_cfg[0].rx_bw = 40e6; - break; + for (int i = 0; irx_stream = s->usrp->get_rx_stream(stream_args_rx); + uhd::stream_args_t stream_args_tx("sc16", "sc16"); - case 30720000: - // from usrp_time_offset - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; + for (int i = 0; itx_stream = s->usrp->get_tx_stream(stream_args_tx); - case 7680000: - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 5e6; - openair0_cfg[0].rx_bw = 5e6; - break; + /* Setting TX/RX BW after streamers are created due to USRP calibration issue */ + for(int i=0; i<((int) s->usrp->get_tx_num_channels()) && iusrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); - case 1920000: - //openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 1.25e6; - openair0_cfg[0].rx_bw = 1.25e6; - break; + for(int i=0; i<((int) s->usrp->get_rx_num_channels()) && iusrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); - default: - LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; - } - } + for (int i=0; iusrp->get_rx_rate(i)/1e6); + LOG_I(HW," Actual RX frequency: %fGHz...\n", s->usrp->get_rx_freq(i)/1e9); + LOG_I(HW," Actual RX gain: %f...\n", s->usrp->get_rx_gain(i)); + LOG_I(HW," Actual RX bandwidth: %fM...\n", s->usrp->get_rx_bandwidth(i)/1e6); + LOG_I(HW," Actual RX antenna: %s...\n", s->usrp->get_rx_antenna(i).c_str()); + } - if (device->type == USRP_B200_DEV) { - if ((vers == 3) && (subvers == 9) && (subsubvers>=2)) { - openair0_cfg[0].rx_gain_calib_table = calib_table_b210; - bw_gain_adjust=0; - std::cerr << "-- Using calibration table: calib_table_b210" << std::endl; // Bell Labs info - } else { - openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38; - bw_gain_adjust=1; - std::cerr << "-- Using calibration table: calib_table_b210_38" << std::endl; // Bell Labs info - } + for (int i=0; iusrp->get_tx_rate(i)/1e6); + LOG_I(HW," Actual TX frequency: %fGHz...\n", s->usrp->get_tx_freq(i)/1e9); + LOG_I(HW," Actual TX gain: %f...\n", s->usrp->get_tx_gain(i)); + LOG_I(HW," Actual TX bandwidth: %fM...\n", s->usrp->get_tx_bandwidth(i)/1e6); + LOG_I(HW," Actual TX antenna: %s...\n", s->usrp->get_tx_antenna(i).c_str()); + LOG_I(HW," Actual TX packet size: %lu\n",s->tx_stream->get_max_num_samps()); + } - switch ((int)openair0_cfg[0].sample_rate) { - case 46080000: - s->usrp->set_master_clock_rate(46.08e6); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 115; - openair0_cfg[0].tx_bw = 40e6; - openair0_cfg[0].rx_bw = 40e6; - break; + LOG_I(HW,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs()); + device->trx_write_func = trx_usrp_write; + device->trx_read_func = trx_usrp_read; + s->sample_rate = openair0_cfg[0].sample_rate; - case 30720000: - s->usrp->set_master_clock_rate(30.72e6); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 115; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; + // TODO: + // init tx_forward_nsamps based usrp_time_offset ex + if(is_equal(s->sample_rate, (double)30.72e6)) + s->tx_forward_nsamps = 176; - case 23040000: - s->usrp->set_master_clock_rate(23.04e6); //to be checked - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 113; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; + if(is_equal(s->sample_rate, (double)15.36e6)) + s->tx_forward_nsamps = 90; - case 15360000: - s->usrp->set_master_clock_rate(30.72e06); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 103; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - case 7680000: - s->usrp->set_master_clock_rate(30.72e6); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 80; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - case 1920000: - s->usrp->set_master_clock_rate(30.72e6); - //openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 40; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - break; - - default: - LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; - } - } - - /* device specific */ - //openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered - //openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered - openair0_cfg[0].iq_txshift = 4;//shift - openair0_cfg[0].iq_rxrescale = 15;//rescale iqs - - for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) { - if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); - s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); - set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); - ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); - // limit to maximum gain - AssertFatal( openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] <= gain_range.stop(), - "RX Gain too high, lower by %f dB\n", - openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); - s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); - LOG_I(HW,"RX Gain %d %f (%f) => %f (max %f)\n",i, - openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], - openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); - } - } - - LOG_D(HW, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels()); - LOG_D(HW, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels); - - for(int i=0; i<((int) s->usrp->get_tx_num_channels()); i++) { - ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); - - if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i); - s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); - s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i); - LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]); - } - } - - //s->usrp->set_clock_source("external"); - //s->usrp->set_time_source("external"); - // display USRP settings - LOG_I(HW,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6); - LOG_I(HW,"Actual clock source %s...\n",s->usrp->get_clock_source(0).c_str()); - LOG_I(HW,"Actual time source %s...\n",s->usrp->get_time_source(0).c_str()); - sleep(1); - // create tx & rx streamer - uhd::stream_args_t stream_args_rx("sc16", "sc16"); - int samples=openair0_cfg[0].sample_rate; - int max=s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps(); - samples/=10000; - LOG_I(HW,"RF board max packet size %u, size for 100µs jitter %d \n", max, samples); - - if ( samples < max ) { - stream_args_rx.args["spp"] = str(boost::format("%d") % samples ); - } - - LOG_I(HW,"rx_max_num_samps %zu\n", - s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps()); - - for (int i = 0; irx_stream = s->usrp->get_rx_stream(stream_args_rx); - uhd::stream_args_t stream_args_tx("sc16", "sc16"); - - for (int i = 0; itx_stream = s->usrp->get_tx_stream(stream_args_tx); - - /* Setting TX/RX BW after streamers are created due to USRP calibration issue */ - for(int i=0; i<((int) s->usrp->get_tx_num_channels()) && iusrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); - - for(int i=0; i<((int) s->usrp->get_rx_num_channels()) && iusrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); - - for (int i=0; iusrp->get_rx_rate(i)/1e6); - LOG_I(HW," Actual RX frequency: %fGHz...\n", s->usrp->get_rx_freq(i)/1e9); - LOG_I(HW," Actual RX gain: %f...\n", s->usrp->get_rx_gain(i)); - LOG_I(HW," Actual RX bandwidth: %fM...\n", s->usrp->get_rx_bandwidth(i)/1e6); - LOG_I(HW," Actual RX antenna: %s...\n", s->usrp->get_rx_antenna(i).c_str()); - } - - for (int i=0; iusrp->get_tx_rate(i)/1e6); - LOG_I(HW," Actual TX frequency: %fGHz...\n", s->usrp->get_tx_freq(i)/1e9); - LOG_I(HW," Actual TX gain: %f...\n", s->usrp->get_tx_gain(i)); - LOG_I(HW," Actual TX bandwidth: %fM...\n", s->usrp->get_tx_bandwidth(i)/1e6); - LOG_I(HW," Actual TX antenna: %s...\n", s->usrp->get_tx_antenna(i).c_str()); - LOG_I(HW," Actual TX packet size: %lu\n",s->tx_stream->get_max_num_samps()); - } - - LOG_I(HW,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs()); - device->trx_write_func = trx_usrp_write; - device->trx_read_func = trx_usrp_read; - s->sample_rate = openair0_cfg[0].sample_rate; - - // TODO: - // init tx_forward_nsamps based usrp_time_offset ex - if(is_equal(s->sample_rate, (double)30.72e6)) - s->tx_forward_nsamps = 176; - - if(is_equal(s->sample_rate, (double)15.36e6)) - s->tx_forward_nsamps = 90; - - if(is_equal(s->sample_rate, (double)7.68e6)) - s->tx_forward_nsamps = 50; + if(is_equal(s->sample_rate, (double)7.68e6)) + s->tx_forward_nsamps = 50; recplay_state_t *recPlay=device->recplay_state; @@ -1329,8 +1349,8 @@ extern "C" { std::cerr<< "Memory allocation failed for subframe record or replay mode." << std::endl; exit(-1); } - } - return 0; } - /*@}*/ + return 0; +} +/*@}*/ }/* extern c */ From b2b3f3834490de98bc588ceade17f7b10dbe5367 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Thu, 8 Apr 2021 16:04:19 +0100 Subject: [PATCH 116/125] Skip invalid MAC CCCH messages for being processed at both gNB and UE --- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 19 ++++++++++++++----- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 11 +++++++++-- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 68b6bb5b3c..78328e3888 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1786,18 +1786,27 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, mac_subheader_len = 2; } - if ( pdu_len >= (mac_subheader_len + mac_sdu_len) ) { + // Check if it is a valid CCCH message, we get all 00's messages very often + int i = 0; + for(i=0; i<(mac_subheader_len+mac_sdu_len); i++) { + if(pduP[i] != 0) { + break; + } + } + if (i == (mac_subheader_len+mac_sdu_len)) { + LOG_D(NR_MAC, "%s() Invalid CCCH message!, pdu_len: %d\n", __func__, pdu_len); + done = 1; + break; + } - LOG_D(NR_MAC,"DL_SCH_LCID_CCCH with payload len %d\n", mac_sdu_len); - - LOG_D(NR_MAC,"RRCSetup received at nr_ue_process_mac_pdu with payload len %d: \n", mac_sdu_len); + if ( mac_sdu_len > 0 ) { + LOG_D(NR_MAC,"DL_SCH_LCID_CCCH (e.g. RRCSetup) with payload len %d\n", mac_sdu_len); for (int i = 0; i < mac_subheader_len; i++) { LOG_D(NR_MAC, "MAC header %d: 0x%x\n", i, pduP[i]); } for (int i = 0; i < mac_sdu_len; i++) { LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[mac_subheader_len + i]); } - nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_sdu_len); } break; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 15b743036c..352b045fb7 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -248,9 +248,16 @@ void nr_process_mac_pdu( mac_sdu_len = 8; // Check if it is a valid CCCH1 message, we get all 00's messages very often - if (pdu_len != 9) { + int i = 0; + for(i=0; i<(mac_subheader_len+mac_sdu_len); i++) { + if(pdu_ptr[i] != 0) { + break; + } + } + if (i == (mac_subheader_len+mac_sdu_len)) { LOG_D(NR_MAC, "%s() Invalid CCCH1 message!, pdu_len: %d\n", __func__, pdu_len); - return; + done = 1; + break; } } else { // fixed length of 6 bytes From 657b525efc0ca13cde204b464633af4d8c254de3 Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Fri, 9 Apr 2021 14:31:02 +0200 Subject: [PATCH 117/125] merge develop --- executables/nr-uesoftmodem.c | 1 - 1 file changed, 1 deletion(-) diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 20e1e296e1..4fa014972a 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -146,7 +146,6 @@ int card_offset = 0; uint64_t num_missed_slots = 0; // counter for the number of missed slots int transmission_mode = 1; int numerology = 0; -int usrp_tx_thread = 0; int oaisim_flag = 0; int emulate_rf = 0; From ddfc737c65338ed10f0fdd3d011f3b16e11da903 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Fri, 9 Apr 2021 19:46:35 +0100 Subject: [PATCH 118/125] Fix search space for Msg2 and Msg4 at gNB --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 87 +++++++++++-------- openair2/RRC/NR/rrc_gNB_reconfig.c | 14 ++- 2 files changed, 63 insertions(+), 38 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 06615f63d3..7d73899f37 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -865,34 +865,31 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int rbStart = 0; int rbSize = 8; - if (nr_mac->sched_ctrlCommon == NULL){ - LOG_D(NR_MAC,"generate_Msg2: Filling nr_mac->sched_ctrlCommon\n"); - nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); - nr_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->search_space)); - nr_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->coreset)); - nr_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->active_bwp)); - fill_default_searchSpaceZero(nr_mac->sched_ctrlCommon->search_space); - fill_default_coresetZero(nr_mac->sched_ctrlCommon->coreset,cc->ServingCellConfigCommon); - fill_default_initialDownlinkBWP(nr_mac->sched_ctrlCommon->active_bwp,cc->ServingCellConfigCommon); - } - NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - long BWPStart = 0; NR_SearchSpace_t *ss = NULL; - NR_BWP_Downlink_t *bwp = NULL; - NR_ControlResourceSet_t *coreset = NULL; - if (get_softmodem_params()->sa) { - bwp = nr_mac->sched_ctrlCommon->active_bwp; - BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - ss = nr_mac->sched_ctrlCommon->search_space; - coreset = nr_mac->sched_ctrlCommon->coreset; - } else { // NSA mode is not using the Initial BWP - bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; - BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if(ra->ra_ss) { ss = ra->ra_ss; - coreset = get_coreset(bwp, ss, 0); + } else { + if (nr_mac->sched_ctrlCommon == NULL){ + nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); + } + if(nr_mac->sched_ctrlCommon->search_space == NULL) { + nr_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->search_space)); + fill_default_searchSpaceZero(nr_mac->sched_ctrlCommon->search_space); + } + ss = nr_mac->sched_ctrlCommon->search_space; + } + + NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; + NR_ControlResourceSet_t *coreset = get_coreset(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1], ss, 0); + + long BWPStart = 0; + if (get_softmodem_params()->sa) { + BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + } else { // NSA mode is not using the Initial BWP + BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); } uint16_t *vrb_map = cc[CC_id].vrb_map; @@ -930,10 +927,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); AssertFatal(startSymbolIndex >= 0, "StartSymbolIndex is negative\n"); + uint8_t numDmrsCdmGrpsNoData = 2; if (nrOfSymbols == 2) { - nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData = 1; - } else { - nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData = 2; + numDmrsCdmGrpsNoData = 1; } // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially @@ -953,7 +949,11 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } // TODO: This assignment should be done in function nr_configure_pdcch() - pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0; + if(get_softmodem_params()->sa) { + pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0; + pdcch_pdu_rel15->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdcch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + } nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset((void *)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); @@ -985,9 +985,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra mcsTableIdx = 2; } - AssertFatal(nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData == 1 || nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData == 2, + AssertFatal(numDmrsCdmGrpsNoData == 1 || numDmrsCdmGrpsNoData == 2, "nr_mac->schedCtrlCommon->numDmrsCdmGrpsNoData %d is not possible", - nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData); + numDmrsCdmGrpsNoData); pdsch_pdu_rel15->pduBitmap = 0; pdsch_pdu_rel15->rnti = ra->RA_rnti; @@ -1009,7 +1009,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; pdsch_pdu_rel15->SCID = 0; - pdsch_pdu_rel15->numDmrsCdmGrpsNoData = nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData; + pdsch_pdu_rel15->numDmrsCdmGrpsNoData = numDmrsCdmGrpsNoData; pdsch_pdu_rel15->dmrsPorts = 1; pdsch_pdu_rel15->resourceAlloc = 1; pdsch_pdu_rel15->rbStart = rbStart; @@ -1074,7 +1074,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra NR_DL_DCI_FORMAT_1_0, NR_RNTI_RA, pdsch_pdu_rel15->BWPSize, - nr_mac->sched_ctrlCommon->active_bwp->bwp_Id); + bwp->bwp_Id); // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; @@ -1119,15 +1119,28 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra uint8_t time_domain_assignment = 0; uint8_t mcsIndex = 0; - NR_SearchSpace_t *ss = nr_mac->sched_ctrlCommon->search_space; - NR_BWP_Downlink_t *bwp = nr_mac->sched_ctrlCommon->active_bwp; - NR_ControlResourceSet_t *coreset = nr_mac->sched_ctrlCommon->coreset; - NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + NR_SearchSpace_t *ss = NULL; + if(ra->ra_ss) { + ss = ra->ra_ss; + } else { + if (nr_mac->sched_ctrlCommon == NULL){ + nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); + } + if(nr_mac->sched_ctrlCommon->search_space == NULL) { + nr_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->search_space)); + fill_default_searchSpaceZero(nr_mac->sched_ctrlCommon->search_space); + } + ss = nr_mac->sched_ctrlCommon->search_space; + } + + NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; + NR_ControlResourceSet_t *coreset = get_coreset(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1], ss, 0); int UE_id = find_nr_UE_id(module_idP, ra->rnti); NR_UE_info_t *UE_info = &nr_mac->UE_info; NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); @@ -1260,6 +1273,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // TODO: This assignment should be done in function nr_configure_pdcch() pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0; + pdcch_pdu_rel15->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdcch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset((void *)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); @@ -1375,7 +1390,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra NR_DL_DCI_FORMAT_1_0, NR_RNTI_TC, pdsch_pdu_rel15->BWPSize, - nr_mac->sched_ctrlCommon->active_bwp->bwp_Id); + bwp->bwp_Id); // Add padding header and zero rest out if there is space left if (mac_pdu_length < harq->tb_size) { diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index b59d9716a2..19e8d77e05 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -483,7 +483,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco coreset->frequencyDomainResources.buf[0] = 0xf0; else coreset->frequencyDomainResources.buf[0] = 0xff; - if (curr_bwp < 96) + if (curr_bwp < 96 || get_softmodem_params()->sa==1) coreset->frequencyDomainResources.buf[1] = 0; else coreset->frequencyDomainResources.buf[1] = 0xff; @@ -494,7 +494,17 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco coreset->frequencyDomainResources.size = 6; coreset->frequencyDomainResources.bits_unused = 3; coreset->duration=1; - coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; + + if(get_softmodem_params()->sa) { + coreset->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved; + coreset->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*coreset->cce_REG_MappingType.choice.interleaved)); + coreset->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6; + coreset->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2; + coreset->cce_REG_MappingType.choice.interleaved->shiftIndex = servingcellconfigcommon->physCellId; + } else { + coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; + } + coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle; coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList)); From cd14ba96672f9c60cc2cd373979a29bacc7cf279 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Sat, 10 Apr 2021 13:51:51 +0200 Subject: [PATCH 119/125] Revert "Revert "Revert RA preamble shift at gNB"" This reverts commit e06c7276042d2ce3a7956cc5d2e68e9b0a0b3bed --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index a25759d0e6..34c647810d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -776,7 +776,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, preamble_shift -= NCS; if (preamble_shift < 0) - preamble_shift+=((N_ZC/NCS)*NCS); + preamble_shift+=N_ZC; } } else { // This is the high-speed case new_dft = 0; From ceb96a36e7d45621ca63e592dadcfb51dde4cc2a Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 11 Apr 2021 20:07:26 +0200 Subject: [PATCH 120/125] astyle --- targets/ARCH/rfsimulator/stored_node.c | 1 - 1 file changed, 1 deletion(-) diff --git a/targets/ARCH/rfsimulator/stored_node.c b/targets/ARCH/rfsimulator/stored_node.c index dcea69b9dd..0dd051dbf6 100644 --- a/targets/ARCH/rfsimulator/stored_node.c +++ b/targets/ARCH/rfsimulator/stored_node.c @@ -201,7 +201,6 @@ int main(int argc, char *argv[]) { void *buff=malloc(bufSize); uint64_t timestamp=0; const int blockSize=1920; - // If fileSize is not multiple of blockSize*4 then discard remaining samples fileSize = (fileSize/(blockSize<<2))*(blockSize<<2); From a8ca37a782857909640944678acd92c681b44c67 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 12 Apr 2021 13:48:47 +0100 Subject: [PATCH 121/125] Add support for InitialBWP in nr_configure_pdcch --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 4 ++-- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 7d73899f37..9efc03101d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -883,7 +883,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; - NR_ControlResourceSet_t *coreset = get_coreset(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1], ss, 0); + NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0); long BWPStart = 0; if (get_softmodem_params()->sa) { @@ -1134,7 +1134,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; - NR_ControlResourceSet_t *coreset = get_coreset(ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1], ss, 0); + NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0); int UE_id = find_nr_UE_id(module_idP, ra->rnti); NR_UE_info_t *UE_info = &nr_mac->UE_info; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 265c58c2e4..4f55d78604 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -563,6 +563,8 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu, NR_ServingCellConfigCommon_t *scc, NR_BWP_Downlink_t *bwp) { + int sps = 0; + if (bwp) { // This is not the InitialBWP pdcch_pdu->BWPSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); @@ -571,8 +573,18 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu, // first symbol //AssertFatal(pdcch_scs==kHz15, "PDCCH SCS above 15kHz not allowed if a symbol above 2 is monitored"); - int sps = bwp->bwp_Common->genericParameters.cyclicPrefix == NULL ? 14 : 12; + sps = bwp->bwp_Common->genericParameters.cyclicPrefix == NULL ? 14 : 12; + } + else { // this is for InitialBWP + pdcch_pdu->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdcch_pdu->SubcarrierSpacing = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing; + pdcch_pdu->CyclicPrefix = (scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix==NULL) ? 0 : *scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix; + // first symbol + //AssertFatal(pdcch_scs==kHz15, "PDCCH SCS above 15kHz not allowed if a symbol above 2 is monitored"); + sps = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12; + } AssertFatal(ss->monitoringSymbolsWithinSlot!=NULL,"ss->monitoringSymbolsWithinSlot is null\n"); AssertFatal(ss->monitoringSymbolsWithinSlot->buf!=NULL,"ss->monitoringSymbolsWithinSlot->buf is null\n"); @@ -617,10 +629,6 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu, //precoderGranularity pdcch_pdu->precoderGranularity = coreset->precoderGranularity; - } - else { // this is for InitialBWP - AssertFatal(1==0,"Fill in InitialBWP PDCCH configuration\n"); - } } From e8f8297892ea878d1ca37dd35d400125db2469fc Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 12 Apr 2021 19:20:23 +0100 Subject: [PATCH 122/125] Fix search space and coreset for Msg2 and Msg4 at gNB --- openair2/GNB_APP/gnb_config.c | 32 ++++- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 125 +++++++++--------- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 2 +- openair2/RRC/NR/rrc_gNB_reconfig.c | 16 +-- 4 files changed, 94 insertions(+), 81 deletions(-) diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index b40ff5d9e2..a440c99537 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -123,7 +123,37 @@ void prepare_scc(NR_ServingCellConfigCommon_t *scc) { scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup = CALLOC(1,sizeof(struct NR_PDCCH_ConfigCommon)); scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->controlResourceSetZero = CALLOC(1,sizeof(long)); scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceZero = CALLOC(1,sizeof(long)); - // scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = CALLOC(1,sizeof(struct NR_ControlResourceSet)); + + NR_ControlResourceSet_t *coreset0 = CALLOC(1,sizeof(struct NR_ControlResourceSet)); + coreset0->controlResourceSetId = 0; + // frequencyDomainResources '11111111 00000000 00000000 00000000 00000000 00000'B, + if(coreset0->frequencyDomainResources.buf == NULL) coreset0->frequencyDomainResources.buf = calloc(1,6); + coreset0->frequencyDomainResources.buf[0] = 0xff; + coreset0->frequencyDomainResources.buf[1] = 0; + coreset0->frequencyDomainResources.buf[2] = 0; + coreset0->frequencyDomainResources.buf[3] = 0; + coreset0->frequencyDomainResources.buf[4] = 0; + coreset0->frequencyDomainResources.buf[5] = 0; + coreset0->frequencyDomainResources.size = 6; + coreset0->frequencyDomainResources.bits_unused = 3; + coreset0->duration = 1; + coreset0->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved; + coreset0->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*coreset0->cce_REG_MappingType.choice.interleaved)); + coreset0->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6; + coreset0->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2; + coreset0->cce_REG_MappingType.choice.interleaved->shiftIndex = scc->physCellId; + coreset0->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle; + if(coreset0->tci_StatesPDCCH_ToAddList == NULL) coreset0->tci_StatesPDCCH_ToAddList = calloc(1,sizeof(*coreset0->tci_StatesPDCCH_ToAddList)); + NR_TCI_StateId_t *tci[8]; + for (int i=0;i<8;i++) { + tci[i]=calloc(1,sizeof(*tci[i])); + *tci[i] = i; + ASN_SEQUENCE_ADD(&coreset0->tci_StatesPDCCH_ToAddList->list,tci[i]); + } + coreset0->tci_StatesPDCCH_ToReleaseList = NULL; + coreset0->tci_PresentInDCI = NULL; + coreset0->pdcch_DMRS_ScramblingID = NULL; + scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset0; // scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList = CALLOC(1,sizeof(struct NR_PDCCH_ConfigCommon__commonSearchSpaceList)); // scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 = CALLOC(1,sizeof(NR_SearchSpaceId_t)); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 9efc03101d..e051bb5f9d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -528,10 +528,11 @@ void nr_initiate_ra_proc(module_id_t module_idP, else ra_rnti = 1 + symbol + (slotP * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8); - // This should be handled differently when we use the initialBWP for RA ra->bwp_id = 1; - NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList - ->list.array[ra->bwp_id - 1]; + NR_BWP_Downlink_t *bwp = NULL; // For SA we use InitialBWP + if(get_softmodem_params()->sa != 1) { + bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]; + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1); @@ -562,13 +563,21 @@ void nr_initiate_ra_proc(module_id_t module_idP, ra->timing_offset = timing_offset; ra->preamble_slot = slotP; - struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; + NR_SearchSpaceId_t ra_SearchSpace = 0; + struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = NULL; + if(bwp) { + commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; + ra_SearchSpace = *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; + } else { + commonSearchSpaceList = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; + ra_SearchSpace = *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; + } AssertFatal(commonSearchSpaceList->list.count > 0, "common SearchSpace list has 0 elements\n"); + // Common searchspace list for (int i = 0; i < commonSearchSpaceList->list.count; i++) { ss = commonSearchSpaceList->list.array[i]; - if (ss->searchSpaceId == *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace) + if (ss->searchSpaceId == ra_SearchSpace) ra->ra_ss = ss; } @@ -866,30 +875,27 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int rbSize = 8; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + NR_SearchSpace_t *ss = ra->ra_ss; + long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - NR_SearchSpace_t *ss = NULL; - if(ra->ra_ss) { - ss = ra->ra_ss; - } else { - if (nr_mac->sched_ctrlCommon == NULL){ - nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); - } - if(nr_mac->sched_ctrlCommon->search_space == NULL) { - nr_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->search_space)); - fill_default_searchSpaceZero(nr_mac->sched_ctrlCommon->search_space); - } - ss = nr_mac->sched_ctrlCommon->search_space; + NR_BWP_Downlink_t *bwp = NULL; // For SA we use InitialBWP + if(get_softmodem_params()->sa != 1) { + bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]; } - NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; - NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0); + NR_ControlResourceSet_t *coreset = NULL; + if(bwp) { + coreset = get_coreset(bwp, ss, 0); + } else { + coreset = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet; + } long BWPStart = 0; - if (get_softmodem_params()->sa) { - BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - } else { // NSA mode is not using the Initial BWP + if (get_softmodem_params()->sa != 1) { BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + } else { + BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); } uint16_t *vrb_map = cc[CC_id].vrb_map; @@ -923,7 +929,9 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // Calculate number of symbols int startSymbolIndex, nrOfSymbols; - const int startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength; + const int startSymbolAndLength = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated-> + downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup-> + pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength; SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); AssertFatal(startSymbolIndex >= 0, "StartSymbolIndex is negative\n"); @@ -934,9 +942,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially // important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them - const int bwpid = bwp->bwp_Id; const int coresetid = coreset->controlResourceSetId; - nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid]; + nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid]; if (!pdcch_pdu_rel15) { nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t)); @@ -945,14 +952,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dl_req->nPDUs += 1; pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, bwp); - nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15; - } - - // TODO: This assignment should be done in function nr_configure_pdcch() - if(get_softmodem_params()->sa) { - pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0; - pdcch_pdu_rel15->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdcch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid] = pdcch_pdu_rel15; } nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; @@ -976,7 +976,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra const int pduindex = nr_mac->pdu_index[CC_id]++; uint8_t mcsTableIdx = 0; - if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) + if (bwp==NULL || bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) mcsTableIdx = 0; else{ if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) @@ -994,7 +994,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->pduIndex = pduindex; pdsch_pdu_rel15->BWPSize = BWPSize; pdsch_pdu_rel15->BWPStart = BWPStart; - pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; + pdsch_pdu_rel15->SubcarrierSpacing = bwp!=NULL ? bwp->bwp_Common->genericParameters.subcarrierSpacing : scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIdx); @@ -1006,7 +1006,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->nrOfLayers = 1; pdsch_pdu_rel15->transmissionScheme = 0; pdsch_pdu_rel15->refPoint = 0; - pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; + pdsch_pdu_rel15->dmrsConfigType = bwp!=NULL ? (bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0; pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; pdsch_pdu_rel15->SCID = 0; pdsch_pdu_rel15->numDmrsCdmGrpsNoData = numDmrsCdmGrpsNoData; @@ -1074,7 +1074,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra NR_DL_DCI_FORMAT_1_0, NR_RNTI_RA, pdsch_pdu_rel15->BWPSize, - bwp->bwp_Id); + ra->bwp_id); // DL TX request nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; @@ -1119,28 +1119,25 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra uint8_t time_domain_assignment = 0; uint8_t mcsIndex = 0; - NR_SearchSpace_t *ss = NULL; - if(ra->ra_ss) { - ss = ra->ra_ss; - } else { - if (nr_mac->sched_ctrlCommon == NULL){ - nr_mac->sched_ctrlCommon = calloc(1,sizeof(*nr_mac->sched_ctrlCommon)); - } - if(nr_mac->sched_ctrlCommon->search_space == NULL) { - nr_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*nr_mac->sched_ctrlCommon->search_space)); - fill_default_searchSpaceZero(nr_mac->sched_ctrlCommon->search_space); - } - ss = nr_mac->sched_ctrlCommon->search_space; + NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; + NR_SearchSpace_t *ss = ra->ra_ss; + + NR_BWP_Downlink_t *bwp = NULL; // For SA we use InitialBWP + if(get_softmodem_params()->sa != 1) { + bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]; } - NR_BWP_Downlink_t *bwp = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; - NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0); + NR_ControlResourceSet_t *coreset = NULL; + if(bwp) { + coreset = get_coreset(bwp, ss, 0); + } else { + coreset = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet; + } int UE_id = find_nr_UE_id(module_idP, ra->rnti); NR_UE_info_t *UE_info = &nr_mac->UE_info; NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; long BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); long BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); @@ -1180,7 +1177,9 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // Calculate number of symbols int startSymbolIndex, nrOfSymbols; - const int startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength; + const int startSymbolAndLength = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated-> + downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup-> + pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength; SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); AssertFatal(startSymbolIndex >= 0, "StartSymbolIndex is negative\n"); @@ -1191,7 +1190,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra uint16_t N_DMRS_SLOT = get_num_dmrs(dlDmrsSymbPos); - long dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; + long dmrsConfigType = bwp!=NULL ? (bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0; uint8_t N_PRB_DMRS = 0; AssertFatal(nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData == 1 || nr_mac->sched_ctrlCommon->numDmrsCdmGrpsNoData == 2, @@ -1206,7 +1205,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } uint8_t mcsTableIdx = 0; - if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) + if (bwp==NULL || bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) mcsTableIdx = 0; else{ if (*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == 0) @@ -1257,9 +1256,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially // important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them - const int bwpid = bwp->bwp_Id; const int coresetid = coreset->controlResourceSetId; - nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid]; + nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid]; if (!pdcch_pdu_rel15) { nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t)); @@ -1268,14 +1266,9 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dl_req->nPDUs += 1; pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, bwp); - nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15; + nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid] = pdcch_pdu_rel15; } - // TODO: This assignment should be done in function nr_configure_pdcch() - pdcch_pdu_rel15->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0; - pdcch_pdu_rel15->BWPSize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdcch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset((void *)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE; @@ -1300,7 +1293,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->pduIndex = pduindex; pdsch_pdu_rel15->BWPSize = BWPSize; pdsch_pdu_rel15->BWPStart = BWPStart; - pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing; + pdsch_pdu_rel15->SubcarrierSpacing = bwp!=NULL ? bwp->bwp_Common->genericParameters.subcarrierSpacing : scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIdx); @@ -1390,7 +1383,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra NR_DL_DCI_FORMAT_1_0, NR_RNTI_TC, pdsch_pdu_rel15->BWPSize, - bwp->bwp_Id); + ra->bwp_id); // Add padding header and zero rest out if there is space left if (mac_pdu_length < harq->tb_size) { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 4f55d78604..d4cf603c4f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -178,7 +178,7 @@ int allocate_nr_CCEs(gNB_MAC_INST *nr_mac, int coreset_id = coreset->controlResourceSetId; int *cce_list; - if(bwp->bwp_Id == 0) { + if( bwp==NULL || bwp->bwp_Id == 0 ) { cce_list = nr_mac->cce_list[1][0]; } else { cce_list = nr_mac->cce_list[bwp->bwp_Id][coreset_id]; diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 19e8d77e05..455acb770c 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -483,7 +483,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco coreset->frequencyDomainResources.buf[0] = 0xf0; else coreset->frequencyDomainResources.buf[0] = 0xff; - if (curr_bwp < 96 || get_softmodem_params()->sa==1) + if (curr_bwp < 96) coreset->frequencyDomainResources.buf[1] = 0; else coreset->frequencyDomainResources.buf[1] = 0xff; @@ -494,17 +494,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco coreset->frequencyDomainResources.size = 6; coreset->frequencyDomainResources.bits_unused = 3; coreset->duration=1; - - if(get_softmodem_params()->sa) { - coreset->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved; - coreset->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*coreset->cce_REG_MappingType.choice.interleaved)); - coreset->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6; - coreset->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2; - coreset->cce_REG_MappingType.choice.interleaved->shiftIndex = servingcellconfigcommon->physCellId; - } else { - coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; - } - + coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle; coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList)); @@ -552,7 +542,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)); ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss); - + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1)); *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=0; From 3c59974b23a2b5c6ae12946e81ae0d2451cd5898 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Tue, 13 Apr 2021 15:26:44 +0100 Subject: [PATCH 123/125] Fix phy-test DL traffic --- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index bc15353e9a..97708be352 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -943,7 +943,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in tx_req.tx_request_body[0].pdu_index = j; tx_req.tx_request_body[0].pdu = ulsch_input_buffer; - if (ra->ra_state != RA_SUCCEEDED && !ra->cfra){ + if (ra->ra_state == WAIT_RAR && !ra->cfra){ LOG_I(NR_MAC,"[RAPROC] RA-Msg3 transmitted\n"); nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->gNB_index); } From 86f1c69f2683f7f005ab4a8b8dfd6292fdfaf9ad Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Tue, 13 Apr 2021 22:28:02 +0200 Subject: [PATCH 124/125] Fix code review remarks, merge develop, revert some merge errors --- ci-scripts/Jenkinsfile-GitLab-Container | 36 ++++- ci-scripts/Jenkinsfile-gitlab | 47 ++---- ci-scripts/args_parse.py | 11 +- ci-scripts/buildOnVM.sh | 2 +- ci-scripts/cls_containerize.py | 9 +- ci-scripts/createVM.sh | 2 +- ci-scripts/html.py | 85 +++++++++++ ci-scripts/main.py | 6 +- ci-scripts/reportBuildLocally.sh | 3 + ci-scripts/waitBuildOnVM.sh | 7 +- ci-scripts/xml_class_list.yml | 1 + common/utils/assertions.h | 2 +- common/utils/system.c | 18 ++- common/utils/system.h | 2 +- common/utils/threadPool/thread-pool.h | 21 ++- common/utils/threadPool/thread-pool.md | 2 +- executables/main-ocp.c | 4 +- executables/nr-gnb.c | 4 +- executables/nr-ru.c | 7 +- executables/nr-softmodem.c | 2 +- executables/nr-ue.c | 8 + executables/nr-uesoftmodem.c | 2 +- executables/ocp-gnb.c | 2 +- executables/softmodem-common.c | 2 +- executables/softmodem-common.h | 4 +- openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 36 ++--- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 2 +- openair1/PHY/TOOLS/calibration_test.c | 1 + openair1/PHY/TOOLS/lte_phy_scope.c | 6 +- openair1/PHY/TOOLS/nr_phy_scope.c | 140 +++++++++--------- openair1/PHY/TOOLS/nr_phy_scope.h | 8 +- openair1/PHY/TOOLS/phy_scope_interface.h | 19 +++ openair1/PHY/TOOLS/time_meas.c | 16 +- openair1/PHY/defs_gNB.h | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 2 +- openair1/SCHED_NR_UE/pucch_uci_ue_nr.c | 2 +- openair2/GNB_APP/L1_nr_paramdef.h | 2 +- openair2/GNB_APP/gnb_config.c | 6 +- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 1 + .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 6 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 6 +- openair2/NETWORK_DRIVER/UE_IP/netlink.c | 2 +- openair2/PHY_INTERFACE/phy_stub_UE.h | 10 +- openair2/RRC/LTE/plmn_data.h | 1 - .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 9 ++ targets/RT/USER/lte-softmodem.c | 4 +- targets/RT/USER/lte-ue.c | 2 +- targets/RT/USER/lte-uesoftmodem.c | 4 +- 49 files changed, 359 insertions(+), 219 deletions(-) diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container index fbf9ba8f4b..dd9dba2e66 100644 --- a/ci-scripts/Jenkinsfile-GitLab-Container +++ b/ci-scripts/Jenkinsfile-GitLab-Container @@ -27,6 +27,9 @@ def nodeExecutor = params.nodeExecutor def doMandatoryTests = false def doFullTestsuite = false +// +def gitCommitAuthorEmailAddr + pipeline { agent { label nodeExecutor @@ -152,21 +155,40 @@ pipeline { } } } + stage ("CppCheck Analysis") { + steps { + script { + triggerSlaveJob ('RAN-cppcheck', 'CppCheck Analysis') + } + } + post { + always { + script { + finalizeSlaveJob('RAN-cppcheck') + } + } + failure { + script { + currentBuild.result = 'FAILURE' + } + } + } + } } } } post { always { script { + def eSubject = JOB_NAME + ' - Build # ' + BUILD_ID + ' - ' + currentBuild.result + '!' + def eBody = "Hi,\n\n" + eBody += "Here are attached HTML report files for " + JOB_NAME + " - Build # " + BUILD_ID + " - " + currentBuild.result + "!\n\n" + eBody += "Regards,\n" + eBody += "OAI CI Team" emailext attachmentsPattern: '*results*.html', - body: '''Hi, - -Here are attached HTML report files for $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! - -Regards, -OAI CI Team''', + body: eBody, replyTo: 'no-reply@openairinterface.org', - subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!', + subject: eSubject, to: gitCommitAuthorEmailAddr if (fileExists('.git/CI_COMMIT_MSG')) { diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab index de49275b7e..bb78a21ca0 100644 --- a/ci-scripts/Jenkinsfile-gitlab +++ b/ci-scripts/Jenkinsfile-gitlab @@ -224,33 +224,14 @@ pipeline { } } } - } + } - stage ("Start VM -- cppcheck") { - steps { - lock (vmResource) { - timeout (time: 7, unit: 'MINUTES') { - sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon" - } - } - } - } - stage ("Variant Builds") { parallel { - stage ("Analysis with cppcheck") { - steps { - gitlabCommitStatus(name: "Analysis with cppcheck") { - timeout (time: 30, unit: 'MINUTES') { - sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}" - } - } - } - } stage ("Build basic simulator") { steps { gitlabCommitStatus(name: "Build basic-sim") { - timeout (time: 30, unit: 'MINUTES') { + timeout (time: 45, unit: 'MINUTES') { sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" } } @@ -259,7 +240,7 @@ pipeline { stage ("Build 5G gNB-USRP") { steps { gitlabCommitStatus(name: "Build gNB-USRP") { - timeout (time: 30, unit: 'MINUTES') { + timeout (time: 45, unit: 'MINUTES') { sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant gnb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" } } @@ -268,7 +249,7 @@ pipeline { stage ("Build 5G NR-UE-USRP") { steps { gitlabCommitStatus(name: "Build nr-UE-USRP") { - timeout (time: 30, unit: 'MINUTES') { + timeout (time: 45, unit: 'MINUTES') { sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant nr-ue-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" } } @@ -277,7 +258,7 @@ pipeline { stage ("Build physical simulators") { steps { gitlabCommitStatus(name: "Build phy-sim") { - timeout (time: 30, unit: 'MINUTES') { + timeout (time: 45, unit: 'MINUTES') { sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" } } @@ -286,7 +267,7 @@ pipeline { stage ("Build eNB-ethernet") { steps { gitlabCommitStatus(name: "Build eNB-ethernet") { - timeout (time: 30, unit: 'MINUTES') { + timeout (time: 45, unit: 'MINUTES') { sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" } } @@ -297,7 +278,7 @@ pipeline { // This is typically the last one to finish. lock (vmResource) { gitlabCommitStatus(name: "Build UE-ethernet") { - timeout (time: 30, unit: 'MINUTES') { + timeout (time: 45, unit: 'MINUTES') { sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" } } @@ -315,9 +296,9 @@ pipeline { script { dir ('archives') { if (fileExists('red_hat')) { - sh "zip -r -qq vm_build_logs.zip basic_sim enb_usrp phy_sim cppcheck enb_eth ue_eth gnb_usrp nr_ue_usrp red_hat" + sh "zip -r -qq vm_build_logs.zip basic_sim phy_sim enb_eth ue_eth gnb_usrp nr_ue_usrp red_hat" } else { - sh "zip -r -qq vm_build_logs.zip basic_sim enb_usrp phy_sim cppcheck enb_eth ue_eth gnb_usrp nr_ue_usrp" + sh "zip -r -qq vm_build_logs.zip basic_sim phy_sim enb_eth ue_eth gnb_usrp nr_ue_usrp" } } if(fileExists('archives/vm_build_logs.zip')) { @@ -325,16 +306,6 @@ pipeline { } if ("MERGE".equals(env.gitlabActionType)) { sh "./ci-scripts/oai-ci-vm-tool report-build --workspace $WORKSPACE --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger merge-request --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}" - // If the merge request has introduced more CPPCHECK errors or warnings, notifications in GitLab - if (fileExists('oai_cppcheck_added_errors.txt')) { - def ret=readFile('./oai_cppcheck_added_errors.txt').trim(); - if ("0".equals(ret)) { - echo "No added cppcheck warnings/errors in this merge request" - } else { - def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Some modified files in Merge Request MAY have INTRODUCED up to " + ret + " CPPCHECK errors/warnings" - addGitLabMRComment comment: message - } - } // If the merge request has introduced compilation warnings, notifications in GitLab sh "./ci-scripts/checkAddedWarnings.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}" def res=readFile('./oai_warning_files.txt').trim(); diff --git a/ci-scripts/args_parse.py b/ci-scripts/args_parse.py index 248e873cdd..288e0b4885 100644 --- a/ci-scripts/args_parse.py +++ b/ci-scripts/args_parse.py @@ -41,7 +41,7 @@ import constants as CONST #----------------------------------------------------------- -def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): +def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA): py_param_file_present = False @@ -80,6 +80,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): HTML.ranRepository=matchReg.group(1) ldpc.ranRepository=matchReg.group(1) CONTAINERS.ranRepository=matchReg.group(1) + SCA.ranRepository=matchReg.group(1) elif re.match('^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE): if re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE) @@ -92,6 +93,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): RAN.ranAllowMerge=True HTML.ranAllowMerge=True CONTAINERS.ranAllowMerge=True + SCA.ranAllowMerge=True elif re.match('^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE): if re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE) @@ -102,6 +104,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): HTML.ranBranch=matchReg.group(1) ldpc.ranBranch=matchReg.group(1) CONTAINERS.ranBranch=matchReg.group(1) + SCA.ranBranch=matchReg.group(1) elif re.match('^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE): if re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE) @@ -112,6 +115,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): HTML.ranCommitID=matchReg.group(1) ldpc.ranCommitID=matchReg.group(1) CONTAINERS.ranCommitID=matchReg.group(1) + SCA.ranCommitID=matchReg.group(1) elif re.match('^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE): if re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE) @@ -122,12 +126,14 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): HTML.ranTargetBranch=matchReg.group(1) ldpc.ranTargetBranch=matchReg.group(1) CONTAINERS.ranTargetBranch=matchReg.group(1) + SCA.ranTargetBranch=matchReg.group(1) elif re.match('^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE): if re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE) RAN.eNBIPAddress=matchReg.group(1) ldpc.eNBIpAddr=matchReg.group(1) CONTAINERS.eNBIPAddress=matchReg.group(1) + SCA.eNBIPAddress=matchReg.group(1) elif re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE) RAN.eNB1IPAddress=matchReg.group(1) @@ -142,6 +148,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): RAN.eNBUserName=matchReg.group(1) ldpc.eNBUserName=matchReg.group(1) CONTAINERS.eNBUserName=matchReg.group(1) + SCA.eNBUserName=matchReg.group(1) elif re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE) RAN.eNB1UserName=matchReg.group(1) @@ -156,6 +163,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): RAN.eNBPassword=matchReg.group(1) ldpc.eNBPassWord=matchReg.group(1) CONTAINERS.eNBPassword=matchReg.group(1) + SCA.eNBPassword=matchReg.group(1) elif re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE) RAN.eNB1Password=matchReg.group(1) @@ -170,6 +178,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP): RAN.eNBSourceCodePath=matchReg.group(1) ldpc.eNBSourceCodePath=matchReg.group(1) CONTAINERS.eNBSourceCodePath=matchReg.group(1) + SCA.eNBSourceCodePath=matchReg.group(1) elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE) RAN.eNB1SourceCodePath=matchReg.group(1) diff --git a/ci-scripts/buildOnVM.sh b/ci-scripts/buildOnVM.sh index 2b1a5e0c71..31e9653769 100755 --- a/ci-scripts/buildOnVM.sh +++ b/ci-scripts/buildOnVM.sh @@ -62,7 +62,7 @@ function build_on_vm { echo "ARCHIVES_LOC = $ARCHIVES_LOC" echo "BUILD_OPTIONS = $BUILD_OPTIONS" - if [[ "$VM_NAME" == *"-enb-usrp"* ]] + if [[ "$VM_NAME" == *"-enb-usrp"* ]] || [[ "$VM_NAME" == *"-cppcheck"* ]] then echo "This VM type is no longer supported in the pipeline framework" return diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 0debe42468..e5011dcd46 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -83,6 +83,7 @@ class Containerize(): self.flexranCtrlDeployed = False self.flexranCtrlIpAddress = '' self.cli = '' + self.cliBuildOptions = '' self.dockerfileprefix = '' self.host = '' self.allImagesSize = {} @@ -124,9 +125,11 @@ class Containerize(): if self.host == 'Ubuntu': self.cli = 'docker' self.dockerfileprefix = '.ubuntu18' + self.cliBuildOptions = '--no-cache' elif self.host == 'Red Hat': self.cli = 'sudo podman' self.dockerfileprefix = '.rhel8.2' + self.cliBuildOptions = '--no-cache --disable-compression' imageNames = [] result = re.search('eNB', self.imageKind) @@ -144,6 +147,8 @@ class Containerize(): imageNames.append(('oai-gnb', 'gNB')) imageNames.append(('oai-lte-ue', 'lteUE')) imageNames.append(('oai-nr-ue', 'nrUE')) + if self.host == 'Red Hat': + imageNames.append(('oai-physim', 'phySim')) if len(imageNames) == 0: imageNames.append(('oai-enb', 'eNB')) @@ -201,7 +206,7 @@ class Containerize(): # Build the shared image only on Push Events (not on Merge Requests) if (not self.ranAllowMerge): - mySSH.command(self.cli + ' build --target ' + sharedimage + ' --tag ' + sharedimage + ':' + sharedTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600) + mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + sharedimage + ' --tag ' + sharedimage + ':' + sharedTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600) # First verify if the shared image was properly created. status = True mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + sharedimage + ':' + sharedTag, '\$', 5) @@ -249,7 +254,7 @@ class Containerize(): # the archived Dockerfiles have "ran-build:latest" as base image # we need to update them with proper tag mySSH.command('sed -i -e "s#' + sharedimage + ':latest#' + sharedimage + ':' + sharedTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5) - mySSH.command(self.cli + ' build --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200) + mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200) # split the log mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5) mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5) diff --git a/ci-scripts/createVM.sh b/ci-scripts/createVM.sh index b67668f0bc..ab859c10d7 100755 --- a/ci-scripts/createVM.sh +++ b/ci-scripts/createVM.sh @@ -87,7 +87,7 @@ function create_vm { echo "VM_CPU = $VM_CPU" echo "VM_DISK = $VM_DISK GBytes" - if [[ "$VM_NAME" == *"-enb-usrp"* ]] + if [[ "$VM_NAME" == *"-enb-usrp"* ]] || [[ "$VM_NAME" == *"-cppcheck"* ]] then echo "This VM type is no longer supported in the pipeline framework" return diff --git a/ci-scripts/html.py b/ci-scripts/html.py index b3ee00e7dc..a0ac638573 100644 --- a/ci-scripts/html.py +++ b/ci-scripts/html.py @@ -479,3 +479,88 @@ class HTMLManagement(): self.htmlFile.write(' \n') self.htmlFile.close() + def CreateHtmlTestRowCppCheckResults(self, CCR): + if (self.htmlFooterCreated or (not self.htmlHeaderCreated)): + return + self.htmlFile = open('test_results.html', 'a') + vId = 0 + for version in CCR.versions: + self.htmlFile.write(' \n') + self.htmlFile.write(' Results for cppcheck v ' + version + ' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' NB ERRORS\n') + if CCR.nbErrors[vId] == 0: + myColor = 'lightgreen' + elif CCR.nbErrors[vId] < 20: + myColor = 'orange' + else: + myColor = 'lightcoral' + self.htmlFile.write(' ' + str(CCR.nbErrors[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' NB WARNINGS\n') + if CCR.nbWarnings[vId] == 0: + myColor = 'lightgreen' + elif CCR.nbWarnings[vId] < 20: + myColor = 'orange' + else: + myColor = 'lightcoral' + self.htmlFile.write(' ' + str(CCR.nbWarnings[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' ----------------- \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Memory leak\n') + self.htmlFile.write(' ' + str(CCR.nbMemLeaks[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Possible null pointer deference\n') + self.htmlFile.write(' ' + str(CCR.nbNullPtrs[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Uninitialized variable\n') + self.htmlFile.write(' ' + str(CCR.nbUninitVars[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Undefined behaviour shifting\n') + self.htmlFile.write(' ' + str(CCR.nbTooManyBitsShift[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Signed integer overflow\n') + self.htmlFile.write(' ' + str(CCR.nbIntegerOverflow[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Printf formatting issues\n') + self.htmlFile.write(' ' + str(CCR.nbInvalidPrintf[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Modulo result is predetermined\n') + self.htmlFile.write(' ' + str(CCR.nbModuloAlways[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Opposite Condition -> dead code\n') + self.htmlFile.write(' ' + str(CCR.nbOppoInnerCondition[vId]) + '\n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' \n') + self.htmlFile.write(' Wrong Scanf Nb Args\n') + self.htmlFile.write(' ' + str(CCR.nbWrongScanfArg[vId]) + '\n') + self.htmlFile.write(' \n') + vId += 1 + + self.htmlFile.close() diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 3094197c54..d23e9de2cb 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -42,6 +42,7 @@ import cls_oaicitest #main class for OAI CI test framework import cls_physim #class PhySim for physical simulators build and test import cls_cots_ue #class CotsUe for Airplane mode control import cls_containerize #class Containerize for all container-based operations on RAN/UE objects +import cls_static_code_analysis #class for static code analysis import sshconnection @@ -378,6 +379,7 @@ EPC = epc.EPCManagement() RAN = ran.RANManagement() HTML = html.HTMLManagement() CONTAINERS = cls_containerize.Containerize() +SCA = cls_static_code_analysis.StaticCodeAnalysis() ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU build @@ -388,7 +390,7 @@ ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU b #----------------------------------------------------------- import args_parse -py_param_file_present, py_params, mode = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP) +py_param_file_present, py_params, mode = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA) @@ -741,6 +743,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re CONTAINERS.DeployObject(HTML, EPC) elif action == 'Undeploy_Object': CONTAINERS.UndeployObject(HTML, RAN) + elif action == 'Cppcheck_Analysis': + SCA.CppCheckAnalysis(HTML) else: sys.exit('Invalid class (action) from xml') if not RAN.prematureExit: diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh index 19a486303f..489074e5e8 100755 --- a/ci-scripts/reportBuildLocally.sh +++ b/ci-scripts/reportBuildLocally.sh @@ -568,6 +568,8 @@ function report_build { echo "

Ubuntu 16.04 LTS -- Summary

" >> ./build_results.html + if [ -f ./archives/cppcheck/cppcheck.xml ] + then sca_summary_table_header ./archives/cppcheck/cppcheck.xml "OAI Static Code Analysis with CPPCHECK" sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized variable" uninitvar sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized struct member" uninitStructMember @@ -579,6 +581,7 @@ function report_build { sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Buffer is accessed out of bounds" bufferAccessOutOfBounds sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Expression depends on order of evaluation of side effects" unknownEvaluationOrder sca_summary_table_footer ./archives/cppcheck/cppcheck.xml + fi # summary_table_header "OAI Build: 4G LTE eNB -- USRP option" ./archives/enb_usrp # summary_table_row "LTE SoftModem - Release 15" ./archives/enb_usrp/lte-softmodem.Rel15.txt "Built target lte-softmodem" ./enb_usrp_row1.html diff --git a/ci-scripts/waitBuildOnVM.sh b/ci-scripts/waitBuildOnVM.sh index ff2129a187..f7e300edf4 100755 --- a/ci-scripts/waitBuildOnVM.sh +++ b/ci-scripts/waitBuildOnVM.sh @@ -47,7 +47,7 @@ function wait_on_vm_build { echo "ARCHIVES_LOC = $ARCHIVES_LOC" echo "BUILD_OPTIONS = $BUILD_OPTIONS" - if [[ "$VM_NAME" == *"-enb-usrp"* ]] + if [[ "$VM_NAME" == *"-enb-usrp"* ]] || [[ "$VM_NAME" == *"-cppcheck"* ]] then echo "This VM type is no longer supported in the pipeline framework" return @@ -73,6 +73,9 @@ function wait_on_vm_build { echo "############################################################" echo "Waiting build process to end on VM ($VM_NAME)" echo "############################################################" + # Since the last VM was cppcheck and is removed + # we are going too fast in wait and the build_oai is not yet started + sleep 120 if [[ "$VM_NAME" == *"-cppcheck"* ]] then @@ -90,7 +93,7 @@ function wait_on_vm_build { } function check_on_vm_build { - if [[ "$VM_NAME" == *"-enb-usrp"* ]] + if [[ "$VM_NAME" == *"-enb-usrp"* ]] || [[ "$VM_NAME" == *"-cppcheck"* ]] then echo "This VM type is no longer supported in the pipeline framework" return diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml index 0e00a2e7d4..de16116124 100755 --- a/ci-scripts/xml_class_list.yml +++ b/ci-scripts/xml_class_list.yml @@ -37,3 +37,4 @@ - Build_Image - Deploy_Object - Undeploy_Object + - Cppcheck_Analysis diff --git a/common/utils/assertions.h b/common/utils/assertions.h index 48d8df401c..06d43bdbfa 100644 --- a/common/utils/assertions.h +++ b/common/utils/assertions.h @@ -39,7 +39,7 @@ void output_log_mem(void); display_backtrace(); \ fflush(stdout); \ fflush(stderr); \ - exit(EXIT_FAILURE); \ + abort(); #define _Assert_(cOND, aCTION, fORMAT, aRGS...) \ do { \ diff --git a/common/utils/system.c b/common/utils/system.c index 239ea525c7..4c6c1a4dc0 100644 --- a/common/utils/system.c +++ b/common/utils/system.c @@ -200,10 +200,14 @@ void start_background_system(void) { void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, int affinity, int priority){ pthread_attr_t attr; int ret; - AssertFatal(0==(ret=pthread_attr_init(&attr)),"ret: %d, errno: %d\n",ret, errno); - AssertFatal(0==(ret=pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)),"ret: %d, errno: %d\n",ret, errno); - AssertFatal(0==(ret=pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)),"ret: %d, errno: %d\n",ret, errno); - AssertFatal(0==(ret=pthread_attr_setschedpolicy(&attr, SCHED_OAI)),"ret: %d, errno: %d\n",ret, errno); + ret=pthread_attr_init(&attr); + AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno); + ret=pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno); + ret=pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); + AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno); + ret=pthread_attr_setschedpolicy(&attr, SCHED_OAI); + AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno); if(prioritysched_get_priority_max(SCHED_FIFO)) { LOG_E(TMR,"Prio not possible: %d, min is %d, max: %d, forced in the range\n", priority, @@ -217,8 +221,10 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, AssertFatal(priority<=sched_get_priority_max(SCHED_OAI),""); struct sched_param sparam={0}; sparam.sched_priority = priority; - AssertFatal(0==(ret=pthread_attr_setschedparam(&attr, &sparam)),"ret: %d, errno: %d\n",ret, errno); - AssertFatal(0==(ret=pthread_create(t, &attr, func, param)),"ret: %d, errno: %d\n",ret, errno); + ret=pthread_attr_setschedparam(&attr, &sparam); + AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno); + ret=pthread_create(t, &attr, func, param); + AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno); pthread_setname_np(*t, name); if (affinity != -1 ) { diff --git a/common/utils/system.h b/common/utils/system.h index b576495a46..fbfd338a1a 100644 --- a/common/utils/system.h +++ b/common/utils/system.h @@ -49,7 +49,7 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, #define SCHED_OAI SCHED_RR #define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_OAI) -#define OAI_PRIORITY_RT ((sched_get_priority_min(SCHED_OAI)+sched_get_priority_min(SCHED_OAI))/2) +#define OAI_PRIORITY_RT ((sched_get_priority_min(SCHED_OAI)+sched_get_priority_max(SCHED_OAI))/2) #define OAI_PRIORITY_RT_MAX sched_get_priority_max(SCHED_OAI)-2 void thread_top_init(char *thread_name, diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index 5db1a5e34e..c438989747 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -37,14 +37,21 @@ #else #define THREADINIT PTHREAD_MUTEX_INITIALIZER #endif -#define mutexinit(mutex) AssertFatal(pthread_mutex_init(&mutex,NULL)==0,""); -#define condinit(signal) AssertFatal(pthread_cond_init(&signal,NULL)==0,""); -#define mutexlock(mutex) AssertFatal(pthread_mutex_lock(&mutex)==0,""); +#define mutexinit(mutex) {int ret=pthread_mutex_init(&mutex,NULL); \ + AssertFatal(ret==0,"ret=%d\n",ret);} +#define condinit(signal) {int ret=pthread_cond_init(&signal,NULL); \ + AssertFatal(ret==0,"ret=%d\n",ret);} +#define mutexlock(mutex) {int ret=pthread_mutex_lock(&mutex); \ + AssertFatal(ret==0,"ret=%d\n",ret);} #define mutextrylock(mutex) pthread_mutex_trylock(&mutex) -#define mutexunlock(mutex) AssertFatal(pthread_mutex_unlock(&mutex)==0,""); -#define condwait(condition, mutex) AssertFatal(pthread_cond_wait(&condition, &mutex)==0,""); -#define condbroadcast(signal) AssertFatal(pthread_cond_broadcast(&signal)==0,""); -#define condsignal(signal) AssertFatal(pthread_cond_broadcast(&signal)==0,""); +#define mutexunlock(mutex) {int ret=pthread_mutex_unlock(&mutex); \ + AssertFatal(ret==0,"ret=%d\n",ret);} +#define condwait(condition, mutex) {int ret=pthread_cond_wait(&condition, &mutex); \ + AssertFatal(ret==0,"ret=%d\n",ret);} +#define condbroadcast(signal) {int ret=pthread_cond_broadcast(&signal); \ + AssertFatal(ret==0,"ret=%d\n",ret);} +#define condsignal(signal) {int ret=pthread_cond_broadcast(&signal); \ + AssertFatal(ret==0,"ret=%d\n",ret);} #define tpool_nbthreads(tpool) (tpool.nbThreads) typedef struct notifiedFIFO_elt_s { struct notifiedFIFO_elt_s *next; diff --git a/common/utils/threadPool/thread-pool.md b/common/utils/threadPool/thread-pool.md index 80f3b99446..f2422d9822 100644 --- a/common/utils/threadPool/thread-pool.md +++ b/common/utils/threadPool/thread-pool.md @@ -214,4 +214,4 @@ threadPoolMeasurements to a valid file name These measurements will be wrote to this Linux pipe. A tool to read the linux fifo and display it in ascii is provided; compute the binay: -in cmake building directory: make/ninja measurement_display \ No newline at end of file +in cmake building directory: make/ninja measurement_display diff --git a/executables/main-ocp.c b/executables/main-ocp.c index 93a24f9ddf..2851bbe41c 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -1321,7 +1321,7 @@ int main ( int argc, char **argv ) { // end of CI modifications //getchar(); - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) load_softscope("enb", NULL); itti_wait_tasks_end(); @@ -1330,7 +1330,7 @@ int main ( int argc, char **argv ) { // stop threads if (RC.nb_inst == 0 || !NODE_IS_CU(node_type)) { - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) end_forms(); LOG_I(ENB_APP,"stopping MODEM threads\n"); diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 379bbfeb5c..a92f433560 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -126,7 +126,7 @@ void tx_func(void *param) { syncMsg->slot_tx = slot_tx; syncMsg->timestamp_tx = info->timestamp_tx; syncMsg->ru = gNB->RU_list[0]; - res->key = 1000+slot_tx; + res->key = slot_tx; pushTpool(gNB->threadPool, res); } @@ -275,7 +275,7 @@ void rx_func(void *param) { syncMsg->frame_tx = frame_tx; syncMsg->slot_tx = slot_tx; syncMsg->timestamp_tx = info->timestamp_tx; - res->key = 2000+slot_tx; + res->key = slot_tx; pushTpool(gNB->threadPool, res); } diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 6aa21613da..74e1333636 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -89,7 +89,7 @@ static int DEFBFW[] = {0x00007fff}; #include "s1ap_eNB.h" #include "SIMULATION/ETH_TRANSPORT/proto.h" - +#include #include "T.h" @@ -1344,7 +1344,8 @@ void *ru_thread( void *param ) { for (aa=0;aanb_rx;aa++) memcpy((void*)RC.gNB[0]->common_vars.rxdataF[aa], (void*)ru->common.rxdataF[aa], fp->symbols_per_slot*fp->ofdm_symbol_size*sizeof(int32_t)); - + if (IS_SOFTMODEM_DOSCOPE && RC.gNB[0]->scopeData) + ((scopeData_t*)RC.gNB[0]->scopeData)->slotFunc(ru->common.rxdataF[0],proc->tti_rx, RC.gNB[0]->scopeData); // Do PRACH RU processing int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST); @@ -1390,7 +1391,7 @@ void *ru_thread( void *param ) { syncMsg->frame_tx = proc->frame_tx; syncMsg->slot_tx = proc->tti_tx; syncMsg->timestamp_tx = proc->timestamp_tx; - res->key = 3000+proc->tti_rx; + res->key = proc->tti_rx; pushTpool(gNB->threadPool, res); } diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index fc5c284ef2..ad67457bd8 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -809,7 +809,7 @@ if(!IS_SOFTMODEM_NOS1) printf("RC.nb_RU:%d\n", RC.nb_RU); // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration) printf("ALL RUs ready - init gNBs\n"); - if(IS_SOFTMODEM_DOFORMS) { + if(IS_SOFTMODEM_DOSCOPE) { sleep(1); scopeParms_t p; p.argc=&argc; diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 47ddd7896e..2adf373196 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -332,6 +332,14 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) { protocol_ctxt_t ctxt; PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO, mac->crnti, proc->frame_rx, proc->nr_slot_rx, 0); pdcp_run(&ctxt); + + /* send tick to RLC and PDCP every ms */ + if (proc->nr_slot_rx % UE->frame_parms.slots_per_subframe == 0) { + void nr_rlc_tick(int frame, int subframe); + void nr_pdcp_tick(int frame, int subframe); + nr_rlc_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe); + nr_pdcp_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe); + } } } diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index c5364e38af..64cf0759e1 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -472,7 +472,7 @@ int main( int argc, char **argv ) { configure_linux(); mlockall(MCL_CURRENT | MCL_FUTURE); - if(IS_SOFTMODEM_DOFORMS) { + if(IS_SOFTMODEM_DOSCOPE) { load_softscope("nr",PHY_vars_UE_g[0][0]); } diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c index a12cef9052..34cd2ce269 100644 --- a/executables/ocp-gnb.c +++ b/executables/ocp-gnb.c @@ -994,7 +994,7 @@ int main( int argc, char **argv ) { (void *)NULL, "time_meas", -1, OAI_PRIORITY_RT_LOW); } - if(IS_SOFTMODEM_DOFORMS) { + if(IS_SOFTMODEM_DOSCOPE) { scopeParms_t tmp= {&argc, argv, &ru, RC.gNB[0]}; load_softscope("nr",&tmp); } diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c index 1077c0e1ac..72cf2e32c5 100644 --- a/executables/softmodem-common.c +++ b/executables/softmodem-common.c @@ -140,7 +140,7 @@ void get_common_options(uint32_t execmask) { } if (do_forms) { - set_softmodem_optmask(SOFTMODEM_DOFORMS_BIT); + set_softmodem_optmask(SOFTMODEM_DOSCOPE_BIT); } if(parallel_config != NULL) set_parallel_conf(parallel_config); diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 7a7be1de96..27479033b0 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -188,7 +188,7 @@ extern "C" #define SOFTMODEM_RFSIM_BIT (1<<10) #define SOFTMODEM_BASICSIM_BIT (1<<11) #define SOFTMODEM_SIML1_BIT (1<<12) -#define SOFTMODEM_DOFORMS_BIT (1<<15) +#define SOFTMODEM_DOSCOPE_BIT (1<<15) #define SOFTMODEM_RECPLAY_BIT (1<<16) #define SOFTMODEM_ENB_BIT (1<<20) #define SOFTMODEM_GNB_BIT (1<<21) @@ -204,7 +204,7 @@ extern "C" #define IS_SOFTMODEM_RFSIM ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT) #define IS_SOFTMODEM_BASICSIM ( get_softmodem_optmask() & SOFTMODEM_BASICSIM_BIT) #define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT) -#define IS_SOFTMODEM_DOFORMS ( get_softmodem_optmask() & SOFTMODEM_DOFORMS_BIT) +#define IS_SOFTMODEM_DOSCOPE ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE_BIT) #define IS_SOFTMODEM_IQPLAYER ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT) #define IS_SOFTMODEM_ENB_BIT ( get_softmodem_optmask() & SOFTMODEM_ENB_BIT) #define IS_SOFTMODEM_GNB_BIT ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index b9da34a301..655878cfaa 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -43,36 +43,36 @@ static struct complex16 *primary_synch2_time __attribute__((aligned(32))); static void doIdft(int size, short *in, short *out) { switch (size) { - case 6: + case 6: idft(IDFT_128,in,out,1); - break; + break; - case 25: + case 25: idft(IDFT_512,in,out,1); - break; + break; - case 50: + case 50: idft(IDFT_1024,in,out,1); - break; - - case 75: + break; + + case 75: idft(IDFT_1536,in,out,1); - break; + break; - case 100: + case 100: idft(IDFT_2048,in,out,1); - break; + break; - default: + default: LOG_E(PHY,"Unsupported N_RB_DL %d\n",size); abort(); - break; + break; + } } -} static void copyPrimary( struct complex16 *out, struct complex16 *in, int ofdmSize) { int k=ofdmSize-36; - + for (int i=0; i<72; i++) { out[k].r = in[i].r>>1; //we need to shift input to avoid overflow in fft out[k].i = in[i].i>>1; @@ -83,7 +83,7 @@ static void copyPrimary( struct complex16 *out, struct complex16 *in, int ofdmSi k-=ofdmSize; } } -} + } int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) { // LTE_UE_COMMON *common_vars struct complex16 syncF_tmp[2048]__attribute__((aligned(32)))= {0}; @@ -102,7 +102,7 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) { // LTE_UE_COMMON *com copyPrimary( syncF_tmp, (struct complex16 *) primary_synch2, frame_parms->ofdm_symbol_size); doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch2_time); - if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)) { + if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){ LOG_M("primary_sync0.m","psync0",primary_synch0_time,frame_parms->ofdm_symbol_size,1,1); LOG_M("primary_sync1.m","psync1",primary_synch1_time,frame_parms->ofdm_symbol_size,1,1); LOG_M("primary_sync2.m","psync2",primary_synch2_time,frame_parms->ofdm_symbol_size,1,1); @@ -135,7 +135,7 @@ void lte_sync_time_free(void) { static inline int abs32(int x) { - return (((int)((short *)&x)[0])*((int)((short *)&x)[0]) + ((int)((short *)&x)[1])*((int)((short *)&x)[1])); + return (((int)((short*)&x)[0])*((int)((short*)&x)[0]) + ((int)((short*)&x)[1])*((int)((short*)&x)[1])); } static inline double absF(struct complexd x) { diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 35c4a6e8cb..35baef1792 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -52,7 +52,7 @@ * set as command line argument, see lte-softmodem.c * default value: 0 */ -int16_t nr_dlsch_demod_shift = 0; +int32_t nr_dlsch_demod_shift = 0; //int16_t interf_unaw_shift = 13; //#define DEBUG_HARQ diff --git a/openair1/PHY/TOOLS/calibration_test.c b/openair1/PHY/TOOLS/calibration_test.c index 376315734a..982ca9d254 100644 --- a/openair1/PHY/TOOLS/calibration_test.c +++ b/openair1/PHY/TOOLS/calibration_test.c @@ -15,6 +15,7 @@ uint64_t downlink_frequency[MAX_NUM_CCs][4]; int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; int opp_enabled; static double snr_dB=20; +THREAD_STRUCT thread_struct; #include int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_state) {return 0;} diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 6852000ca9..f8321d7265 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -679,7 +679,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, if (frame_parms->N_RB_DL != 100) { fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","",""); } else { - LOG_D(HW,"UE PDCCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); + LOG_D(PHY,"UE PDCCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); } } @@ -693,7 +693,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, if (frame_parms->N_RB_DL != 100) { fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); } else { - LOG_D(HW,"UE PDCCH COMP plot is bugged in 20 MHz BW, to be fixed !!!\n"); + LOG_D(PHY,"UE PDCCH COMP plot is bugged in 20 MHz BW, to be fixed !!!\n"); } } @@ -709,7 +709,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, if (frame_parms->N_RB_DL != 100) { fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","",""); } else { - LOG_D(HW,"UE PDSCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); + LOG_D(PHY,"UE PDSCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); } } diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index b45c1abf0b..7d239340e4 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -38,10 +38,7 @@ int otg_enabled; const FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW}; const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED}; -typedef struct { - int16_t r; - int16_t i; -} scopeSample_t; +typedef struct complex16 scopeSample_t; #define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i) typedef struct OAIgraph { @@ -59,7 +56,7 @@ typedef struct OAIgraph { double *waterFallAvg; boolean_t initDone; int iteration; - void (*gNBfunct) (struct OAIgraph *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id); + void (*gNBfunct) (struct OAIgraph *graph, scopeData_t *p, int UE_id); void (*nrUEfunct)(struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); } OAIgraph_t; @@ -135,7 +132,7 @@ static void commonGraph(OAIgraph_t *graph, int type, FL_Coord x, FL_Coord y, FL_ graph->iteration=0; } -static OAIgraph_t gNBcommonGraph( void (*funct) (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id), +static OAIgraph_t gNBcommonGraph( void (*funct) (OAIgraph_t *graph, scopeData_t *p, int UE_id), int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) { OAIgraph_t graph; commonGraph(&graph, type, x, y, w, h, label, pointColor); @@ -226,7 +223,8 @@ static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int laye static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const int datasize, const int divisions, const char *label) { if ( values == NULL ) - return; + return; + fl_winset(FL_ObjWin(graph->graph)); const int samplesPerPixel=datasize/graph->w; int displayPart=graph->waterFallh-ScaleZone; @@ -297,10 +295,10 @@ static void genericPowerPerAntena(OAIgraph_t *graph, const int nb_ant, const sc } } -static void gNBWaterFall (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { - NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms; +static void gNBWaterFall (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { + NR_DL_FRAME_PARMS *frame_parms=&p->gNB->frame_parms; //use 1st antenna - genericWaterFall(graph, (scopeSample_t *)phy_vars_ru->common.rxdata[0], + genericWaterFall(graph, (scopeSample_t *)p->ru->common.rxdata[0], frame_parms->samples_per_frame, frame_parms->slots_per_frame, "X axis:one frame in time"); } @@ -318,31 +316,35 @@ static void timeSignal (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy } */ -static void timeResponse (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { - const int len=2*phy_vars_gnb->frame_parms.ofdm_symbol_size; +static void timeResponse (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { + const int len=2*p->gNB->frame_parms.ofdm_symbol_size; float *values, *time; oai_xygraph_getbuff(graph, &time, &values, len, 0); const int ant=0; // display antenna 0 for each UE for (int ue=0; uepusch_vars[ue]->ul_ch_estimates_time[ant]; + if ( p->gNB->pusch_vars && p->gNB->pusch_vars[ue] && + p->gNB->pusch_vars[ue]->ul_ch_estimates_time && + p->gNB->pusch_vars[ue]->ul_ch_estimates_time[ant] ) { + scopeSample_t *data= (scopeSample_t *)p->gNB->pusch_vars[ue]->ul_ch_estimates_time[ant]; - if (data != NULL) { - for (int i=0; iframe_parms; +static void gNBfreqWaterFall (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { + NR_DL_FRAME_PARMS *frame_parms=&p->gNB->frame_parms; //use 1st antenna - genericWaterFall(graph, (scopeSample_t *)phy_vars_ru->common.rxdataF[0], frame_parms->samples_per_frame_wCP, + genericWaterFall(graph, (scopeSample_t *)p->rxdataF, frame_parms->samples_per_frame_wCP, frame_parms->slots_per_frame, - "X axis: Frequency domain, one frame"); + "X axis: Frequency domain, one subframe"); } /* @@ -354,16 +356,18 @@ static void frequencyResponse (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU } */ -static void puschLLR (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { +static void puschLLR (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { //int Qm = 2; int coded_bits_per_codeword =3*8*6144+12; // (8*((3*8*6144)+12)); // frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti; for (int ue=0; uepusch_vars[ue]->llr; - float *llr, *bit; - oai_xygraph_getbuff(graph, &bit, &llr, coded_bits_per_codeword, ue); + if ( p->gNB->pusch_vars && + p->gNB->pusch_vars[ue] && + p->gNB->pusch_vars[ue]->llr ) { + int16_t *pusch_llr = (int16_t *)p->gNB->pusch_vars[ue]->llr; + float *llr, *bit; + oai_xygraph_getbuff(graph, &bit, &llr, coded_bits_per_codeword, ue); - if (pusch_llr) { for (int i=0; iframe_parms; +static void puschIQ (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { + NR_DL_FRAME_PARMS *frame_parms=&p->gNB->frame_parms; int sz=frame_parms->N_RB_UL*12*frame_parms->symbols_per_slot; for (int ue=0; uepusch_vars[ue]->rxdataF_comp[0]; - float *I, *Q; - oai_xygraph_getbuff(graph, &I, &Q, sz, ue); + if ( p->gNB->pusch_vars && + p->gNB->pusch_vars[ue] && + p->gNB->pusch_vars[ue]->rxdataF_comp && + p->gNB->pusch_vars[ue]->rxdataF_comp[0] ) { + scopeSample_t *pusch_comp = (scopeSample_t *) p->gNB->pusch_vars[ue]->rxdataF_comp[0]; + float *I, *Q; + oai_xygraph_getbuff(graph, &I, &Q, sz, ue); - if (pusch_comp) { for (int k=0; kpucch1ab_stats[UE_id]; @@ -418,11 +425,9 @@ static void pucchEnergy (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *ph } */ } - -static void pucchIQ (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { +static void pucchIQ (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { } - -static void puschThroughtput (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) { +static void puschThroughtput (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { // PUSCH Throughput /* float tput_time_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; @@ -437,7 +442,6 @@ static void puschThroughtput (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_ // fl_set_xyplot_ybounds(form->pusch_tput,0,ymax); */ } - static OAI_phy_scope_t *create_phy_scope_gnb(void) { FL_OBJECT *obj; OAI_phy_scope_t *fdui = calloc(( sizeof *fdui ),1); @@ -486,11 +490,9 @@ static OAI_phy_scope_t *create_phy_scope_gnb(void) { fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, "LTE UL SCOPE gNB"); return fdui; } - static const int scope_enb_num_ue = 1; void phy_scope_gNB(OAI_phy_scope_t *form, - PHY_VARS_gNB *phy_vars_gnb, - RU_t *phy_vars_ru, + scopeData_t *p, int UE_id) { static OAI_phy_scope_t *rememberForm=NULL; @@ -505,15 +507,14 @@ void phy_scope_gNB(OAI_phy_scope_t *form, int i=0; while (form->graph[i].graph) { - form->graph[i].gNBfunct(form->graph+i, phy_vars_gnb, phy_vars_ru, UE_id); + form->graph[i].gNBfunct(form->graph+i, p, UE_id); i++; } //fl_check_forms(); } - static void *scope_thread_gNB(void *arg) { - scopeParms_t *p=(scopeParms_t *) arg; + scopeData_t *p=(scopeData_t *) arg; //# ifdef ENABLE_XFORMS_WRITE_STATS // FILE *gNB_stats = fopen("gNB_stats.txt", "w"); //#endif @@ -530,20 +531,32 @@ static void *scope_thread_gNB(void *arg) { OAI_phy_scope_t *form_gnb = create_phy_scope_gnb(); while (!oai_exit) { - phy_scope_gNB(form_gnb, p->gNB, p->ru, nb_ue); + phy_scope_gNB(form_gnb, p, nb_ue); usleep(99*1000); } return NULL; } - +static void copyRxdataF(int32_t *data, int slot, void *scopeData) { + scopeData_t *scope=(scopeData_t *)scopeData; + memcpy(scope->rxdataF + slot*scope->gNB->frame_parms.samples_per_slot_wCP, + data, + scope->gNB->frame_parms.samples_per_slot_wCP); +} void gNBinitScope(scopeParms_t *p) { - static scopeParms_t parms; - memcpy(&parms,p,sizeof(parms)); + p->gNB->scopeData=malloc(sizeof(scopeData_t)); + AssertFatal(p->gNB->scopeData,""); + scopeData_t *scope=(scopeData_t *) p->gNB->scopeData; + scope->argc=p->argc; + scope->argv=p->argv; + scope->ru=p->ru; + scope->gNB=p->gNB; + scope->slotFunc=copyRxdataF; + scope->rxdataF=(int32_t *) calloc(p->gNB->frame_parms.samples_per_frame_wCP*sizeof(int32_t),1); + AssertFatal(scope->rxdataF,""); pthread_t forms_thread; - threadCreate(&forms_thread, scope_thread_gNB, &parms, "scope", -1, OAI_PRIORITY_RT_LOW); + threadCreate(&forms_thread, scope_thread_gNB, p->gNB->scopeData, "scope", -1, OAI_PRIORITY_RT_LOW); } - static void ueWaterFall (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // Received signal in time domain of receive antenna 0 genericWaterFall(graph, @@ -552,7 +565,6 @@ static void ueWaterFall (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eN phy_vars_ue->frame_parms.slots_per_frame, "X axis: one frame time"); } - /* replaced by waterfall static void ueTimeResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // Received signal in time domain of receive antenna 0 @@ -561,14 +573,12 @@ static void ueTimeResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int phy_vars_ue->frame_parms.samples_per_frame); } */ - static void ueChannelResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // Channel Impulse Response genericPowerPerAntena(graph, phy_vars_ue->frame_parms.nb_antennas_rx, (const scopeSample_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time, phy_vars_ue->frame_parms.ofdm_symbol_size>>3); } - static void ueFreqWaterFall (OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) { NR_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->frame_parms; //use 1st antenna @@ -578,7 +588,6 @@ static void ueFreqWaterFall (OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int phy_vars_ue->frame_parms.slots_per_frame, "X axis: one frame frequency" ); } - /* static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // Channel Frequency Response (includes 5 complex sample for filter) @@ -614,7 +623,6 @@ static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue oai_xygraph(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,0,10); } */ - static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PBCH LLRs if ( !phy_vars_ue->pbch_vars[eNB_id]->llr) @@ -630,7 +638,6 @@ static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ oai_xygraph(graph,bit_pbch,llr_pbch,864,0,10); } - static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PBCH I/Q of MF Output if (!phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]) @@ -665,15 +672,14 @@ static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i AssertFatal(base <= 180*3,""); oai_xygraph(graph,I,Q,base,0, 10); } - static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDCCH LLRs if (!phy_vars_ue->pdcch_vars[0][eNB_id]->llr) return; - int num_re = 4*273*12; // 12*frame_parms->N_RB_DL*num_pdcch_symbols - int Qm = 2; - int coded_bits_per_codeword = num_re*Qm; + //int num_re = 4*273*12; // 12*frame_parms->N_RB_DL*num_pdcch_symbols + //int Qm = 2; + int coded_bits_per_codeword = 2*4*100*12; //num_re*Qm; float *llr, *bit; oai_xygraph_getbuff(graph, &bit, &llr, coded_bits_per_codeword*RX_NB_TH_MAX, 0); int base=0; @@ -691,7 +697,6 @@ static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ AssertFatal(base <= coded_bits_per_codeword*RX_NB_TH_MAX, ""); oai_xygraph(graph,bit,llr,base,0,10); } - static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDCCH I/Q of MF Output if (!phy_vars_ue->pdcch_vars[0][eNB_id]->rxdataF_comp[0]) @@ -716,7 +721,6 @@ static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i AssertFatal(base <= nb*RX_NB_TH_MAX, ""); oai_xygraph(graph,I,Q,base,0,10); } - static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDSCH LLRs if (!phy_vars_ue->pdsch_vars[0][eNB_id]->llr[0]) @@ -744,7 +748,6 @@ static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB //fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); oai_xygraph(graph,bit,llr,base,0,10); } - static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDSCH I/Q of MF Output if (!phy_vars_ue->pdsch_vars[0][eNB_id]->rxdataF_comp0[0]) @@ -772,7 +775,6 @@ static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ AssertFatal(base <= sz*RX_NB_TH_MAX, ""); oai_xygraph(graph,I,Q,sz*RX_NB_TH_MAX,0,10); } - static void uePdschThroughput (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { /* float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; @@ -796,7 +798,6 @@ static void uePdschThroughput (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]); */ } - static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) { FL_OBJECT *obj; OAI_phy_scope_t *fdui = calloc(( sizeof *fdui ),1); @@ -866,7 +867,6 @@ static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) { fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, buf); return fdui; } - void phy_scope_nrUE(OAI_phy_scope_t *form, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, @@ -890,8 +890,6 @@ void phy_scope_nrUE(OAI_phy_scope_t *form, //fl_check_forms(); } - - static void *nrUEscopeThread(void *arg) { PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg; size_t stksize; @@ -915,13 +913,10 @@ static void *nrUEscopeThread(void *arg) { pthread_exit((void *)arg); } - void nrUEinitScope(PHY_VARS_NR_UE *ue) { pthread_t forms_thread; threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); } - - void nrscope_autoinit(void *dataptr) { AssertFatal( (IS_SOFTMODEM_GNB_BIT||IS_SOFTMODEM_5GUE_BIT),"Scope cannot find NRUE or GNB context"); @@ -956,7 +951,6 @@ static void reset_stats_gNB(FL_OBJECT *button, } } } - static FD_stats_form *create_form_stats_form(int ID) { FL_OBJECT *obj; FD_stats_form *fdui = calloc(( sizeof *fdui ),1); diff --git a/openair1/PHY/TOOLS/nr_phy_scope.h b/openair1/PHY/TOOLS/nr_phy_scope.h index 84b9e66908..e34ddf2c20 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.h +++ b/openair1/PHY/TOOLS/nr_phy_scope.h @@ -33,13 +33,7 @@ //#include "PHY/impl_defs_top.h" #include "PHY/defs_nr_UE.h" -typedef struct { - int *argc; - char **argv; - RU_t *ru; - PHY_VARS_gNB *gNB; -} scopeParms_t; - +#include extern RAN_CONTEXT_t RC; #endif diff --git a/openair1/PHY/TOOLS/phy_scope_interface.h b/openair1/PHY/TOOLS/phy_scope_interface.h index adf04d5ea4..8b747d575d 100644 --- a/openair1/PHY/TOOLS/phy_scope_interface.h +++ b/openair1/PHY/TOOLS/phy_scope_interface.h @@ -29,7 +29,26 @@ * \note * \warning */ +#ifndef __PHY_SCOPE_INTERFACE_H__ +#define __PHY_SCOPE_INTERFACE_H__ +#include +typedef struct { + int *argc; + char **argv; + RU_t *ru; + PHY_VARS_gNB *gNB; +} scopeParms_t; +typedef struct scopeData_s { + int *argc; + char **argv; + RU_t *ru; + PHY_VARS_gNB *gNB; + int32_t * rxdataF; + void (*slotFunc)(int32_t* data, int slot, void * scopeData); +} scopeData_t; + int load_softscope(char *exectype, void *initarg); int end_forms(void) ; +#endif diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c index 396674333a..891238c347 100644 --- a/openair1/PHY/TOOLS/time_meas.c +++ b/openair1/PHY/TOOLS/time_meas.c @@ -31,14 +31,14 @@ double cpu_freq_GHz __attribute__ ((aligned(32)))=0.0; double get_cpu_freq_GHz(void) { if (cpu_freq_GHz <1 ) { - time_stats_t ts = {0}; - reset_meas(&ts); - ts.trials++; - ts.in = rdtsc_oai(); - sleep(1); - ts.diff = (rdtsc_oai()-ts.in); - cpu_freq_GHz = (double)ts.diff/1000000000; - printf("CPU Freq is %f \n", cpu_freq_GHz); + time_stats_t ts = {0}; + reset_meas(&ts); + ts.trials++; + ts.in = rdtsc_oai(); + sleep(1); + ts.diff = (rdtsc_oai()-ts.in); + cpu_freq_GHz = (double)ts.diff/1000000000; + printf("CPU Freq is %f \n", cpu_freq_GHz); } return cpu_freq_GHz; } diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 2f6c4324b0..b7152632a1 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -846,7 +846,7 @@ typedef struct PHY_VARS_gNB_s { tpool_t *threadPool; int nbDecode; uint8_t pusch_proc_threads; - + void * scopeData; } PHY_VARS_gNB; typedef struct LDPCDecode_s { diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index df66217e49..638a89b2d3 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1134,7 +1134,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch1->harq_processes[harq_pid]->TBS); } - LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ \n", frame_rx, nr_slot_rx); + LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ decoded in %d \n", frame_rx, nr_slot_rx, ret); LOG_D(PHY, "harq_pid: %d, TBS expected dlsch0: %d \n",harq_pid, dlsch0->harq_processes[harq_pid]->TBS); if(retmax_ldpc_iterations+1){ diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c index 560c7b9383..0455c481d5 100644 --- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c +++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c @@ -975,7 +975,7 @@ uint8_t get_downlink_ack(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t LOG_E(PHY,"PUCCH Downlink DAI has an invalid value : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME); } else if (harq_status->send_harq_status == 0) { - LOG_D(PHY,"PUCCH Downlink ack can not be transmitted : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME); + LOG_E(PHY,"PUCCH Downlink ack can not be transmitted : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME); } else { diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h index 67be560778..88f2cb1615 100644 --- a/openair2/GNB_APP/L1_nr_paramdef.h +++ b/openair2/GNB_APP/L1_nr_paramdef.h @@ -62,7 +62,7 @@ {CONFIG_STRING_L1_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \ -{CONFIG_STRING_L1_PUSCH_PROC_THREADS, NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0} \ +{CONFIG_STRING_L1_PUSCH_PROC_THREADS, NULL, 0, uptr:NULL, defintval:3, TYPE_UINT, 0} \ } #define L1_CC_IDX 0 #define L1_TRANSPORT_N_PREFERENCE_IDX 1 diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index b40ff5d9e2..9aa2f0fc67 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -1014,14 +1014,16 @@ int RCconfig_nr_gtpu(void ) { MessageDef *message; if (gnb_mode == 1) { // NSA - AssertFatal((message = itti_alloc_new_message(TASK_GNB_APP, 0, GTPV1U_ENB_S1_REQ))!=NULL,""); + message = itti_alloc_new_message(TASK_GNB_APP, 0, GTPV1U_ENB_S1_REQ); + AssertFatal(message!=NULL,""); // IPV4_STR_ADDR_TO_INT_NWBO ( address, RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); // LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up); IPV4_STR_ADDR_TO_INT_NWBO (address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up); GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = gnb_port_for_S1U; } else {// TODO SA - AssertFatal((message = itti_alloc_new_message(TASK_GNB_APP, 0, GTPV1U_GNB_NG_REQ))!=NULL,""); + message = itti_alloc_new_message(TASK_GNB_APP, 0, GTPV1U_GNB_NG_REQ); + AssertFatal(message!=NULL,""); IPV4_STR_ADDR_TO_INT_NWBO (address, GTPV1U_GNB_NG_REQ(message).gnb_ip_address_for_NGu_up, "BAD IP ADDRESS FORMAT FOR gNB NG_U !\n" ); LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_GNB_NG_REQ(message).gnb_ip_address_for_NGu_up); GTPV1U_GNB_NG_REQ(message).gnb_port_for_NGu_up = gnb_port_for_NGU; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 844ee95d32..eea30abde3 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -981,7 +981,7 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac, struct NR_PUSCH_TimeDomainResourceAllocationList *pusch_TimeDomainAllocationList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; // k2 as per 3GPP TS 38.214 version 15.9.0 Release 15 ch 6.1.2.1.1 // PUSCH time domain resource allocation is higher layer configured from uschTimeDomainAllocationList in either pusch-ConfigCommon - uint8_t k2; + int k2; if (is_Msg3) { k2 = *pusch_TimeDomainAllocationList->list.array[tda_id]->k2; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 30a89cce77..8f54c3a498 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -806,6 +806,7 @@ void nr_schedule_ue_spec(module_id_t module_id, pdsch_pdu->qamModOrder[0] = Qm; pdsch_pdu->mcsIndex[0] = sched_ctrl->mcs; pdsch_pdu->mcsTable[0] = sched_ctrl->mcsTableIdx; + AssertFatal(harq->round<4,"%d",harq->round); pdsch_pdu->rvIndex[0] = nr_rv_round_map[harq->round]; pdsch_pdu->TBSize[0] = TBS; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 247a7e2c45..3e53f07084 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -569,7 +569,9 @@ static void handle_dl_harq(module_id_t mod_id, add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid); harq->round = 0; harq->ndi ^= 1; - } else if (harq->round == MAX_HARQ_ROUNDS) { + } else { + harq->round++; + if (harq->round == MAX_HARQ_ROUNDS) { add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid); harq->round = 0; harq->ndi ^= 1; @@ -578,7 +580,7 @@ static void handle_dl_harq(module_id_t mod_id, LOG_D(MAC, "retransmission error for UE %d (total %d)\n", UE_id, stats->dlsch_errors); } else { add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].retrans_dl_harq, harq_pid); - harq->round++; + } } } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 9784b6b79e..aff809fc55 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -346,7 +346,9 @@ void handle_nr_ul_harq(module_id_t mod_id, harq_pid, crc_pdu->rnti); add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid); - } else if (harq->round == MAX_HARQ_ROUNDS) { + } else { + harq->round++; + if (harq->round == MAX_HARQ_ROUNDS) { harq->ndi ^= 1; harq->round = 0; LOG_D(MAC, @@ -356,12 +358,12 @@ void handle_nr_ul_harq(module_id_t mod_id, UE_info->mac_stats[UE_id].ulsch_errors++; add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid); } else { - harq->round++; LOG_D(MAC, "Ulharq id %d crc failed for RNTI %04x\n", harq_pid, crc_pdu->rnti); add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid); + } } } diff --git a/openair2/NETWORK_DRIVER/UE_IP/netlink.c b/openair2/NETWORK_DRIVER/UE_IP/netlink.c index 79fc37ae39..b3829c51d1 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/netlink.c +++ b/openair2/NETWORK_DRIVER/UE_IP/netlink.c @@ -39,7 +39,7 @@ #include "local.h" #include "proto_extern.h" -MODULE_LICENSE("GPL"); +MODULE_LICENSE("OAI"); #define OAI_IP_DRIVER_NETLINK_ID 31 #define NL_DEST_PID 1 diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h index a542c7bbab..bdf8872371 100644 --- a/openair2/PHY_INTERFACE/phy_stub_UE.h +++ b/openair2/PHY_INTERFACE/phy_stub_UE.h @@ -18,7 +18,6 @@ //#include "openair1/PHY/LTE_TRANSPORT/defs.h" //below 2 difinitions move to phy_stub_UE.c to add initialization when difinition. -extern int tx_req_num_elems; extern UL_IND_t *UL_INFO; extern nfapi_tx_request_pdu_t* tx_request_pdu_list; // New @@ -27,14 +26,7 @@ extern nfapi_tx_request_pdu_t* tx_request_pdu_list; extern nfapi_dl_config_request_t* dl_config_req; extern nfapi_ul_config_request_t* ul_config_req; extern nfapi_hi_dci0_request_t* hi_dci0_req; - - -//below 2 difinitions move to lte-ue.c to add initialization when difinition. -//int next_ra_frame; -//module_id_t next_Mod_id; - - - +extern int tx_req_num_elems; // This function should return all the sched_response config messages which concern a specific UE. Inside this // function we should somehow make the translation of config message's rnti to Mod_ID. diff --git a/openair2/RRC/LTE/plmn_data.h b/openair2/RRC/LTE/plmn_data.h index 15dbd4aa23..701bcaf764 100644 --- a/openair2/RRC/LTE/plmn_data.h +++ b/openair2/RRC/LTE/plmn_data.h @@ -2296,7 +2296,6 @@ static const plmn_data_t plmn_data[] = { 648 4 Econet Wireless Econet Operational */ - }; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 535db82dfc..96df4a971f 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -282,6 +282,15 @@ THREAD_STRUCT = ( } ); +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + log_config : { global_log_level ="info"; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 2db8ce5e7f..bdca959281 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -732,7 +732,7 @@ int main ( int argc, char **argv ) fflush(stderr); // end of CI modifications //getchar(); - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) load_softscope("enb",NULL); itti_wait_tasks_end(); oai_exit=1; @@ -740,7 +740,7 @@ int main ( int argc, char **argv ) // stop threads if (RC.nb_inst == 0 || !NODE_IS_CU(node_type)) { - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) end_forms(); LOG_I(ENB_APP,"stopping MODEM threads\n"); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 0ea2368b25..82140ea5aa 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -183,7 +183,7 @@ PHY_VARS_UE *init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, { PHY_VARS_UE *ue = (PHY_VARS_UE *)calloc(1,sizeof(PHY_VARS_UE)); - + AssertFatal(ue,""); if (frame_parms!=(LTE_DL_FRAME_PARMS *)NULL) { // if we want to give initial frame parms, allocate the PHY_VARS_UE structure and put them in memcpy(&(ue->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); } diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 9b0c8c3c91..6830fdacd3 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -759,7 +759,7 @@ int main( int argc, char **argv ) { PHY_vars_UE_g[0][0]->no_timing_correction = 1; } - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) load_softscope("ue",NULL); config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS); @@ -784,7 +784,7 @@ int main( int argc, char **argv ) { printf("oai_exit=%d\n",oai_exit); // stop threads - if(IS_SOFTMODEM_DOFORMS) + if(IS_SOFTMODEM_DOSCOPE) end_forms(); printf("stopping MODEM threads\n"); From a8a34df01f5bc7248576e9b192c0045b651087c1 Mon Sep 17 00:00:00 2001 From: rmagueta Date: Wed, 14 Apr 2021 00:28:41 +0100 Subject: [PATCH 125/125] Fix compilation warning in oai_usrpdevif --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 8025337ecb..8a2800611d 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1337,18 +1337,18 @@ extern "C" { if(is_equal(s->sample_rate, (double)7.68e6)) s->tx_forward_nsamps = 50; - recplay_state_t *recPlay=device->recplay_state; + recplay_state_t *recPlay=device->recplay_state; - if (recPlay != NULL) { // record mode - recPlay->maxSizeBytes=openair0_cfg[0].recplay_conf->u_sf_max * + if (recPlay != NULL) { // record mode + recPlay->maxSizeBytes=openair0_cfg[0].recplay_conf->u_sf_max * (sizeof(iqrec_t)+BELL_LABS_IQ_BYTES_PER_SF); - recPlay->ms_sample = (iqrec_t *) malloc(recPlay->maxSizeBytes); - recPlay->currentPtr= (uint8_t *)recPlay->ms_sample; + recPlay->ms_sample = (iqrec_t *) malloc(recPlay->maxSizeBytes); + recPlay->currentPtr= (uint8_t *)recPlay->ms_sample; - if (recPlay->ms_sample == NULL) { - std::cerr<< "Memory allocation failed for subframe record or replay mode." << std::endl; - exit(-1); - } + if (recPlay->ms_sample == NULL) { + std::cerr<< "Memory allocation failed for subframe record or replay mode." << std::endl; + exit(-1); + } } return 0; }