/* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The OpenAirInterface Software Alliance licenses this file to You under * the OAI Public License, Version 1.1 (the "License"); you may not use this file * except in compliance with the License. * You may obtain a copy of the License at * * http://www.openairinterface.org/?page_id=698 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *------------------------------------------------------------------------------- * For more information about the OpenAirInterface (OAI) Software Alliance: * contact@openairinterface.org */ /*! \file PHY/defs.h \brief Top-level defines and structure definitions \author R. Knopp, F. Kaltenberger \date 2011 \version 0.1 \company Eurecom \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr \note \warning */ #ifndef __PHY_DEFS_UE_H__ #define __PHY_DEFS_UE_H__ #define _GNU_SOURCE #include <sched.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/mman.h> #include <linux/sched.h> #include <signal.h> #include <execinfo.h> #include <getopt.h> #include <sys/sysinfo.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #include <math.h> #include "common_lib.h" #include "msc.h" #include "defs_common.h" #include "impl_defs_top.h" #include "PHY/TOOLS/time_meas.h" #include "PHY/CODING/coding_defs.h" #include "PHY/TOOLS/tools_defs.h" #include "platform_types.h" #include "PHY/LTE_UE_TRANSPORT/transport_ue.h" #include "PHY/LTE_TRANSPORT/transport_eNB.h" // for SIC #include <pthread.h> #include "assertions.h" #ifdef MEX #include "mex.h" #define msg mexPrintf #undef LOG_D #undef LOG_E #undef LOG_I #undef LOG_N #undef LOG_T #undef LOG_W #undef LOG_M #define LOG_D(x, ...) mexPrintf(__VA_ARGS__) #define LOG_E(x, ...) mexPrintf(__VA_ARGS__) #define LOG_I(x, ...) mexPrintf(__VA_ARGS__) #define LOG_N(x, ...) mexPrintf(__VA_ARGS__) #define LOG_T(x, ...) mexPrintf(__VA_ARGS__) #define LOG_W(x, ...) mexPrintf(__VA_ARGS__) #define LOG_M(x, ...) mexPrintf(__VA_ARGS__) #else #ifdef OPENAIR2 #if ENABLE_RAL #include "collection/hashtable/hashtable.h" #include "COMMON/ral_messages_types.h" #include "UTIL/queue.h" #endif #include "common/utils/LOG/log.h" #define msg(aRGS...) LOG_D(PHY, ##aRGS) #else #define msg printf #endif #endif /// Context data structure for RX/TX portion of subframe processing typedef struct { /// index of the current UE RX/TX proc int proc_id; /// Component Carrier index uint8_t CC_id; /// timestamp transmitted to HW openair0_timestamp timestamp_tx; /// subframe to act upon for transmission int subframe_tx; /// subframe to act upon for reception int subframe_rx; /// frame to act upon for transmission int frame_tx; /// frame to act upon for reception int frame_rx; /// \brief Instance count for RXn-TXnp4 processing thread. /// \internal This variable is protected by \ref mutex_rxtx. int instance_cnt_rxtx; /// pthread structure for RXn-TXnp4 processing thread pthread_t pthread_rxtx; /// pthread attributes for RXn-TXnp4 processing thread pthread_attr_t attr_rxtx; /// condition variable for tx processing thread pthread_cond_t cond_rxtx; /// mutex for RXn-TXnp4 processing thread pthread_mutex_t mutex_rxtx; /// scheduling parameters for RXn-TXnp4 thread struct sched_param sched_param_rxtx; /// internal This variable is protected by ref mutex_fep_slot1. //int instance_cnt_slot0_dl_processing; int instance_cnt_slot1_dl_processing; /// pthread descriptor fep_slot1 thread //pthread_t pthread_slot0_dl_processing; pthread_t pthread_slot1_dl_processing; /// pthread attributes for fep_slot1 processing thread // pthread_attr_t attr_slot0_dl_processing; pthread_attr_t attr_slot1_dl_processing; /// condition variable for UE fep_slot1 thread; //pthread_cond_t cond_slot0_dl_processing; pthread_cond_t cond_slot1_dl_processing; /// mutex for UE synch thread //pthread_mutex_t mutex_slot0_dl_processing; pthread_mutex_t mutex_slot1_dl_processing; // uint8_t chan_est_pilot0_slot1_available; uint8_t chan_est_slot1_available; uint8_t llr_slot1_available; uint8_t dci_slot0_available; uint8_t first_symbol_available; //uint8_t channel_level; /// scheduling parameters for fep_slot1 thread struct sched_param sched_param_fep_slot1; int sub_frame_start; int sub_frame_step; unsigned long long gotIQs; } UE_rxtx_proc_t; /// Context data structure for eNB subframe processing typedef struct { /// Component Carrier index uint8_t CC_id; /// Last RX timestamp openair0_timestamp timestamp_rx; /// pthread attributes for main UE thread pthread_attr_t attr_ue; /// scheduling parameters for main UE thread struct sched_param sched_param_ue; /// pthread descriptor main UE thread pthread_t pthread_ue; /// \brief Instance count for synch thread. /// \internal This variable is protected by \ref mutex_synch. int instance_cnt_synch; /// pthread attributes for synch processing thread pthread_attr_t attr_synch; /// scheduling parameters for synch thread struct sched_param sched_param_synch; /// pthread descriptor synch thread pthread_t pthread_synch; /// condition variable for UE synch thread; pthread_cond_t cond_synch; /// mutex for UE synch thread pthread_mutex_t mutex_synch; /// instance count for eNBs int instance_cnt_eNBs; /// set of scheduling variables RXn-TXnp4 threads UE_rxtx_proc_t proc_rxtx[RX_NB_TH]; } UE_proc_t; /// Structure holding timer_thread related elements (phy_stub_UE mode) typedef struct { pthread_t pthread_timer; /// mutex for waiting SF ticking pthread_mutex_t mutex_ticking; /// \brief ticking var for ticking thread. /// \internal This variable is protected by \ref mutex_ticking. int ticking_var; /// condition variable for timer_thread; pthread_cond_t cond_ticking; //time_stats_t timer_stats; // below 3 members is used for waiting each UE threads(multiple UEs test) in L2 FAPI simulator. // This used in UE_phy_stub_single_thread_rxn_txnp4 pthread_mutex_t mutex_single_thread; pthread_cond_t cond_single_thread; int num_single_thread[NUMBER_OF_UE_MAX]; } SF_ticking; typedef struct { //unsigned int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (linear) //unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (dB) //unsigned short rx_avg_power_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated avg received signal power (dB) // RRC measurements uint32_t rssi; int n_adj_cells; unsigned int adj_cell_id[6]; uint32_t rsrq[7]; uint32_t rsrp[7]; float rsrp_filtered[7]; // after layer 3 filtering float rsrq_filtered[7]; // common measurements //! estimated noise power (linear) unsigned int n0_power[NB_ANTENNAS_RX]; //! estimated noise power (dB) unsigned short n0_power_dB[NB_ANTENNAS_RX]; //! total estimated noise power (linear) unsigned int n0_power_tot; //! total estimated noise power (dB) unsigned short n0_power_tot_dB; //! average estimated noise power (linear) unsigned int n0_power_avg; //! average estimated noise power (dB) unsigned short n0_power_avg_dB; //! total estimated noise power (dBm) short n0_power_tot_dBm; // UE measurements //! estimated received spatial signal power (linear) int rx_spatial_power[NUMBER_OF_CONNECTED_eNB_MAX][2][2]; //! estimated received spatial signal power (dB) unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][2][2]; /// estimated received signal power (sum over all TX antennas) //int wideband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; /// estimated received signal power (sum over all TX antennas) //int wideband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; /// estimated received signal power (sum over all TX/RX antennas) int rx_power_tot[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW /// estimated received signal power (sum over all TX/RX antennas) unsigned short rx_power_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW //! estimated received signal power (sum of all TX/RX antennas, time average) int rx_power_avg[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated received signal power (sum of all TX/RX antennas, time average, in dB) unsigned short rx_power_avg_dB[NUMBER_OF_CONNECTED_eNB_MAX]; /// SINR (sum of all TX/RX antennas, in dB) int wideband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX]; /// SINR (sum of all TX/RX antennas, time average, in dB) int wideband_cqi_avg[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated rssi (dBm) short rx_rssi_dBm[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation) int rx_correlation[NUMBER_OF_CONNECTED_eNB_MAX][2]; //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation) int rx_correlation_dB[NUMBER_OF_CONNECTED_eNB_MAX][2]; /// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (3,4,5,6), up to 4 spatial streams) int precoded_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX+1][4]; /// Subband CQI per RX antenna (= SINR) int subband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX]; /// Total Subband CQI (= SINR) int subband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; /// Subband CQI in dB (= SINR dB) int subband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX]; /// Total Subband CQI int subband_cqi_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; /// Wideband PMI for each RX antenna int wideband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; /// Wideband PMI for each RX antenna int wideband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; ///Subband PMI for each RX antenna int subband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX]; ///Subband PMI for each RX antenna int subband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX]; /// chosen RX antennas (1=Rx antenna 1, 2=Rx antenna 2, 3=both Rx antennas) unsigned char selected_rx_antennas[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; /// Wideband Rank indication unsigned char rank[NUMBER_OF_CONNECTED_eNB_MAX]; /// Number of RX Antennas unsigned char nb_antennas_rx; /// DLSCH error counter // short dlsch_errors; } PHY_MEASUREMENTS; typedef struct { /// \brief Holds the received data in the frequency domain. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: symbol [0..28*ofdm_symbol_size[ int32_t **rxdataF; /// \brief Hold the channel estimates in frequency domain. /// - first index: eNB id [0..6] (hard coded) /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - third index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ int32_t **dl_ch_estimates[7]; /// \brief Hold the channel estimates in time domain (used for tracking). /// - first index: eNB id [0..6] (hard coded) /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - third index: samples? [0..2*ofdm_symbol_size[ int32_t **dl_ch_estimates_time[7]; } LTE_UE_COMMON_PER_THREAD; typedef struct { /// \brief Holds the transmit data in time domain. /// For IFFT_FPGA this points to the same memory as PHY_vars->tx_vars[a].TX_DMA_BUFFER. /// - first index: tx antenna [0..nb_antennas_tx[ /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES[ int32_t **txdata; /// \brief Holds the transmit data in the frequency domain. /// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. /// - first index: tx antenna [0..nb_antennas_tx[ /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX[ int32_t **txdataF; /// \brief Holds the received data in time domain. /// Should point to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES+2048[ int32_t **rxdata; LTE_UE_COMMON_PER_THREAD common_vars_rx_data_per_thread[RX_NB_TH_MAX]; /// holds output of the sync correlator int32_t *sync_corr; /// estimated frequency offset (in radians) for all subcarriers int32_t freq_offset; /// eNb_id user is synched to int32_t eNb_id; } LTE_UE_COMMON; typedef struct { /// \brief Received frequency-domain signal after extraction. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **rxdataF_ext; /// \brief Received frequency-domain ue specific pilots. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..12*N_RB_DL[ int32_t **rxdataF_uespec_pilots; /// \brief Received frequency-domain signal after extraction and channel compensation. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **rxdataF_comp0; /// \brief Received frequency-domain signal after extraction and channel compensation for the second stream. For the SIC receiver we need to store the history of this for each harq process and round /// - first index: ? [0..7] (hard coded) accessed via \c harq_pid /// - second index: ? [0..7] (hard coded) accessed via \c round /// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - fourth index: ? [0..168*N_RB_DL[ int32_t **rxdataF_comp1[8][8]; /// \brief Downlink channel estimates extracted in PRBS. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_estimates_ext; /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. For the SIC receiver we need to store the history of this for each harq process and round /// - first index: ? [0..7] (hard coded) accessed via \c harq_pid /// - second index: ? [0..7] (hard coded) accessed via \c round /// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - fourth index: ? [0..168*N_RB_DL[ int32_t **dl_ch_rho_ext[8][8]; /// \brief Downlink beamforming channel estimates in frequency domain. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ int32_t **dl_bf_ch_estimates; /// \brief Downlink beamforming channel estimates. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_bf_ch_estimates_ext; /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_rho2_ext; /// \brief Downlink PMIs extracted in PRBS and grouped in subbands. /// - first index: ressource block [0..N_RB_DL[ uint8_t *pmi_ext; /// \brief Magnitude of Downlink Channel first layer (16QAM level/First 64QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_mag0; /// \brief Magnitude of Downlink Channel second layer (16QAM level/First 64QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_mag1[8][8]; /// \brief Magnitude of Downlink Channel, first layer (2nd 64QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_magb0; /// \brief Magnitude of Downlink Channel second layer (2nd 64QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_magb1[8][8]; /// \brief Cross-correlation of two eNB signals. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: symbol [0..] int32_t **rho; /// never used... always send dl_ch_rho_ext instead... int32_t **rho_i; /// \brief Pointers to llr vectors (2 TBs). /// - first index: ? [0..1] (hard coded) /// - second index: ? [0..1179743] (hard coded) int16_t *llr[2]; /// \f$\log_2(\max|H_i|^2)\f$ int16_t log2_maxh; /// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer1 channel compensation int16_t log2_maxh0; /// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer2 channel commpensation int16_t log2_maxh1; /// \brief LLR shifts for subband scaling. /// - first index: ? [0..168*N_RB_DL[ uint8_t *llr_shifts; /// \brief Pointer to LLR shifts. /// - first index: ? [0..168*N_RB_DL[ uint8_t *llr_shifts_p; /// \brief Pointers to llr vectors (128-bit alignment). /// - first index: ? [0..0] (hard coded) /// - second index: ? [0..] int16_t **llr128; /// \brief Pointers to llr vectors (128-bit alignment). /// - first index: ? [0..0] (hard coded) /// - second index: ? [0..] int16_t **llr128_2ndstream; //uint32_t *rb_alloc; //uint8_t Qm[2]; //MIMO_mode_t mimo_mode; // llr offset per ofdm symbol uint32_t llr_offset[14]; // llr length per ofdm symbol uint32_t llr_length[14]; } LTE_UE_PDSCH; typedef struct { /// \brief Pointers to extracted PDCCH symbols in frequency-domain. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **rxdataF_ext; /// \brief Pointers to extracted and compensated PDCCH symbols in frequency-domain. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **rxdataF_comp; /// \brief Pointers to extracted channel estimates of PDCCH symbols. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_estimates_ext; /// \brief Pointers to channel cross-correlation vectors for multi-eNB detection. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_rho_ext; /// \brief Pointers to channel cross-correlation vectors for multi-eNB detection. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: ? [0..] int32_t **rho; /// \brief Pointer to llrs, 4-bit resolution. /// - first index: ? [0..48*N_RB_DL[ uint16_t *llr; /// \brief Pointer to llrs, 16-bit resolution. /// - first index: ? [0..96*N_RB_DL[ uint16_t *llr16; /// \brief \f$\overline{w}\f$ from 36-211. /// - first index: ? [0..48*N_RB_DL[ uint16_t *wbar; /// \brief PDCCH/DCI e-sequence (input to rate matching). /// - first index: ? [0..96*N_RB_DL[ int8_t *e_rx; /// number of PDCCH symbols in current subframe uint8_t num_pdcch_symbols; /// Allocated CRNTI for UE uint16_t crnti; /// 1: the allocated crnti is Temporary C-RNTI / 0: otherwise uint8_t crnti_is_temporary; /// Total number of PDU errors (diagnostic mode) uint32_t dci_errors; /// Total number of PDU received uint32_t dci_received; /// Total number of DCI False detection (diagnostic mode) uint32_t dci_false; /// Total number of DCI missed (diagnostic mode) uint32_t dci_missed; /// nCCE for PUCCH per subframe uint8_t nCCE[10]; //Check for specific DCIFormat and AgregationLevel uint8_t dciFormat; uint8_t agregationLevel; } LTE_UE_PDCCH; typedef struct { /// \brief Pointers to extracted PBCH symbols in frequency-domain. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: ? [0..287] (hard coded) int32_t **rxdataF_ext; /// \brief Pointers to extracted and compensated PBCH symbols in frequency-domain. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..287] (hard coded) int32_t **rxdataF_comp; /// \brief Pointers to downlink channel estimates in frequency-domain extracted in PRBS. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..287] (hard coded) int32_t **dl_ch_estimates_ext; /// \brief Pointer to PBCH llrs. /// - first index: ? [0..1919] (hard coded) int8_t *llr; /// \brief Pointer to PBCH decoded output. /// - first index: ? [0..63] (hard coded) uint8_t *decoded_output; /// \brief Total number of PDU errors. uint32_t pdu_errors; /// \brief Total number of PDU errors 128 frames ago. uint32_t pdu_errors_last; /// \brief Total number of consecutive PDU errors. uint32_t pdu_errors_conseq; /// \brief FER (in percent) . uint32_t pdu_fer; } LTE_UE_PBCH; typedef struct { int16_t amp; int16_t *prachF; int16_t *prach; } LTE_UE_PRACH; typedef enum { /// do not detect any DCIs in the current subframe NO_DCI = 0x0, /// detect only downlink DCIs in the current subframe UL_DCI = 0x1, /// detect only uplink DCIs in the current subframe DL_DCI = 0x2, /// detect both uplink and downlink DCIs in the current subframe UL_DL_DCI = 0x3 } dci_detect_mode_t; typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals int32_t amp[3][10]; /// 10 frequency offsets (kHz) corresponding to best amplitudes, with respect do minimum DL frequency in the band int32_t freq_offset_Hz[3][10]; } UE_SCAN_INFO_t; /// Top-level PHY Data Structure for UE typedef struct { /// \brief Module ID indicator for this instance uint8_t Mod_id; /// \brief Component carrier ID for this PHY instance uint8_t CC_id; /// \brief Mapping of CC_id antennas to cards openair0_rf_map rf_map; //uint8_t local_flag; /// \brief Indicator of current run mode of UE (normal_txrx, rx_calib_ue, no_L2_connect, debug_prach) runmode_t mode; /// \brief Indicator that UE is configured for FeMBMS functionality (This flag should be avoided) ... just kept for PBCH initical scan (TODO) int FeMBMS_active; /// \brief Indicator that UE should perform band scanning int UE_scan; /// \brief Indicator that UE should perform coarse scanning around carrier int UE_scan_carrier; /// \brief Indicator that UE is synchronized to an eNB int is_synchronized; /// Data structure for UE process scheduling UE_proc_t proc; /// Flag to indicate the UE shouldn't do timing correction at all int no_timing_correction; /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna) uint32_t tx_total_gain_dB; /// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card. uint32_t rx_total_gain_dB; /// \brief Total gains with maximum RF gain stage (ExpressMIMO2/Lime) uint32_t rx_gain_max[4]; /// \brief Total gains with medium RF gain stage (ExpressMIMO2/Lime) uint32_t rx_gain_med[4]; /// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime) uint32_t rx_gain_byp[4]; /// \brief Current transmit power int16_t tx_power_dBm[10]; /// \brief Total number of REs in current transmission int tx_total_RE[10]; /// \brief Maximum transmit power int8_t tx_power_max_dBm; /// \brief Number of eNB seen by UE uint8_t n_connected_eNB; /// \brief indicator that Handover procedure has been initiated uint8_t ho_initiated; /// \brief indicator that Handover procedure has been triggered uint8_t ho_triggered; /// \brief Measurement variables. PHY_MEASUREMENTS measurements; LTE_DL_FRAME_PARMS frame_parms; /// \brief Frame parame before ho used to recover if ho fails. LTE_DL_FRAME_PARMS frame_parms_before_ho; LTE_UE_COMMON common_vars; // point to the current rxTx thread index uint8_t current_thread_id[10]; LTE_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_MCH[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PDCCH *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX][2]; // two RxTx Threads LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; // This is for SIC in the UE, to store the reencoded data LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX]; //Paging parameters uint32_t IMSImod1024; uint32_t PF; uint32_t PO; // For abstraction-purposes only uint8_t sr[10]; uint8_t pucch_sel[10]; uint8_t pucch_payload[22]; UE_MODE_t UE_mode[NUMBER_OF_CONNECTED_eNB_MAX]; /// cell-specific reference symbols uint32_t lte_gold_table[7][20][2][14]; /// UE-specific reference symbols (p=5), TM 7 uint32_t lte_gold_uespec_port5_table[20][38]; /// ue-specific reference symbols uint32_t lte_gold_uespec_table[2][20][2][21]; /// mbsfn reference symbols uint32_t lte_gold_mbsfn_table[10][3][42]; /// mbsfn reference symbols uint32_t lte_gold_mbsfn_khz_1dot25_table[10][150]; uint32_t X_u[64][839]; uint32_t high_speed_flag; uint32_t perfect_ce; int16_t ch_est_alpha; int generate_ul_signal[NUMBER_OF_CONNECTED_eNB_MAX]; UE_SCAN_INFO_t scan_info[NB_BANDS_MAX]; char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX]; unsigned char ulsch_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX]; uint32_t ulsch_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX]; unsigned char ulsch_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX]; PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_eNB_MAX]; int turbo_iterations, turbo_cntl_iterations; /// \brief ?. /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded) uint32_t total_TBS[NUMBER_OF_CONNECTED_eNB_MAX]; /// \brief ?. /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded) uint32_t total_TBS_last[NUMBER_OF_CONNECTED_eNB_MAX]; /// \brief ?. /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded) uint32_t bitrate[NUMBER_OF_CONNECTED_eNB_MAX]; /// \brief ?. /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded) uint32_t total_received_bits[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_errors_last[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_received_last[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_fer[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_SI_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_SI_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_ra_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_ra_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_p_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_p_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mch_received_sf[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mch_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mcch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mtch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mcch_errors[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mtch_errors[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mcch_trials[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mtch_trials[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int current_dlsch_cqi[NUMBER_OF_CONNECTED_eNB_MAX]; unsigned char first_run_timing_advance[NUMBER_OF_CONNECTED_eNB_MAX]; uint8_t generate_prach; uint8_t prach_cnt; uint8_t prach_PreambleIndex; // uint8_t prach_timer; uint8_t decode_SIB; uint8_t decode_MIB; int rx_offset; /// Timing offset int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP int time_sync_cell; int timing_advance; ///timing advance signalled from eNB int hw_timing_advance; int N_TA_offset; ///timing offset used in TDD /// Flag to tell if UE is secondary user (cognitive mode) unsigned char is_secondary_ue; /// Flag to tell if secondary eNB has channel estimates to create NULL-beams from. unsigned char has_valid_precoder; /// hold the precoder for NULL beam to the primary eNB int **ul_precoder_S_UE; /// holds the maximum channel/precoder coefficient char log2_maxp; /// if ==0 enables phy only test mode int mac_enabled; /// Flag to initialize averaging of PHY measurements int init_averaging; /// \brief sinr for all subcarriers of the current link (used only for abstraction). /// - first index: ? [0..12*N_RB_DL[ double *sinr_dB; /// \brief sinr for all subcarriers of first symbol for the CQI Calculation. /// - first index: ? [0..12*N_RB_DL[ double *sinr_CQI_dB; /// sinr_effective used for CQI calulcation double sinr_eff; /// N0 (used for abstraction) double N0; /// PDSCH Varaibles PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_CONNECTED_eNB_MAX]; /// PUSCH Varaibles PUSCH_CONFIG_DEDICATED pusch_config_dedicated[NUMBER_OF_CONNECTED_eNB_MAX]; /// PUSCH contention-based access vars PUSCH_CA_CONFIG_DEDICATED pusch_ca_config_dedicated[NUMBER_OF_eNB_MAX]; // lola /// PUCCH variables PUCCH_CONFIG_DEDICATED pucch_config_dedicated[NUMBER_OF_CONNECTED_eNB_MAX]; uint8_t ncs_cell[20][7]; /// UL-POWER-Control UL_POWER_CONTROL_DEDICATED ul_power_control_dedicated[NUMBER_OF_CONNECTED_eNB_MAX]; /// TPC TPC_PDCCH_CONFIG tpc_pdcch_config_pucch[NUMBER_OF_CONNECTED_eNB_MAX]; TPC_PDCCH_CONFIG tpc_pdcch_config_pusch[NUMBER_OF_CONNECTED_eNB_MAX]; /// CQI reporting CQI_REPORT_CONFIG cqi_report_config[NUMBER_OF_CONNECTED_eNB_MAX]; /// SRS Variables SOUNDINGRS_UL_CONFIG_DEDICATED soundingrs_ul_config_dedicated[NUMBER_OF_CONNECTED_eNB_MAX]; /// Scheduling Request Config SCHEDULING_REQUEST_CONFIG scheduling_request_config[NUMBER_OF_CONNECTED_eNB_MAX]; /// Transmission mode per eNB uint8_t transmission_mode[NUMBER_OF_CONNECTED_eNB_MAX]; time_stats_t phy_proc[RX_NB_TH]; time_stats_t phy_proc_tx; time_stats_t phy_proc_rx[RX_NB_TH]; uint32_t use_ia_receiver; time_stats_t ofdm_mod_stats; time_stats_t ulsch_encoding_stats; time_stats_t ulsch_modulation_stats; time_stats_t ulsch_segmentation_stats; time_stats_t ulsch_rate_matching_stats; time_stats_t ulsch_turbo_encoding_stats; time_stats_t ulsch_interleaving_stats; time_stats_t ulsch_multiplexing_stats; time_stats_t generic_stat; time_stats_t generic_stat_bis[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME]; time_stats_t ue_front_end_stat[RX_NB_TH]; time_stats_t ue_front_end_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME]; time_stats_t pdcch_procedures_stat[RX_NB_TH]; time_stats_t pdsch_procedures_stat[RX_NB_TH]; time_stats_t pdsch_procedures_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME]; time_stats_t dlsch_procedures_stat[RX_NB_TH]; time_stats_t crnti_procedures_stats; time_stats_t ofdm_demod_stats; time_stats_t dlsch_rx_pdcch_stats; time_stats_t rx_dft_stats; time_stats_t dlsch_channel_estimation_stats; time_stats_t dlsch_freq_offset_estimation_stats; time_stats_t dlsch_decoding_stats[2]; time_stats_t dlsch_demodulation_stats; time_stats_t dlsch_rate_unmatching_stats; time_stats_t dlsch_turbo_decoding_stats; time_stats_t dlsch_deinterleaving_stats; time_stats_t dlsch_llr_stats; time_stats_t dlsch_llr_stats_parallelization[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME]; time_stats_t dlsch_unscrambling_stats; time_stats_t dlsch_rate_matching_stats; time_stats_t dlsch_turbo_encoding_stats; time_stats_t dlsch_interleaving_stats; time_stats_t dlsch_tc_init_stats; time_stats_t dlsch_tc_alpha_stats; time_stats_t dlsch_tc_beta_stats; time_stats_t dlsch_tc_gamma_stats; time_stats_t dlsch_tc_ext_stats; time_stats_t dlsch_tc_intl1_stats; time_stats_t dlsch_tc_intl2_stats; time_stats_t tx_prach; time_stats_t timer_stats; pthread_mutex_t timer_mutex; pthread_cond_t timer_cond; int instance_cnt_timer; /// RF and Interface devices per CC openair0_device rfdevice; } PHY_VARS_UE; /* this structure is used to pass both UE phy vars and * proc to the function UE_thread_rxn_txnp4 */ struct rx_tx_thread_data { PHY_VARS_UE *UE; UE_rxtx_proc_t *proc; uint16_t ue_thread_id; }; #endif // __PHY_DEFS__H__