defs.h 23.9 KB
Newer Older
1
/*******************************************************************************
ghaddab's avatar
ghaddab committed
2 3
    OpenAirInterface 
    Copyright(c) 1999 - 2014 Eurecom
4

ghaddab's avatar
ghaddab committed
5 6 7 8
    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
9 10


ghaddab's avatar
ghaddab committed
11 12 13 14
    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
15

ghaddab's avatar
ghaddab committed
16 17 18 19
    You should have received a copy of the GNU General Public License
    along with OpenAirInterface.The full GNU General Public License is 
   included in this distribution in the file called "COPYING". If not, 
   see <http://www.gnu.org/licenses/>.
20 21

  Contact Information
ghaddab's avatar
ghaddab committed
22 23 24 25
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
  OpenAirInterface Dev  : openair4g-devel@eurecom.fr
  
ghaddab's avatar
ghaddab committed
26
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
27

ghaddab's avatar
ghaddab committed
28
 *******************************************************************************/
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

/*! \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__H__
#define __PHY_DEFS__H__

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
//#include <complex.h>
49
#include "assertions.h"
50
#ifdef MEX
51
# define msg mexPrintf
52
#else
53
# ifdef OPENAIR2
54 55 56 57 58
#   if defined(ENABLE_RAL)
#     include "collection/hashtable/hashtable.h"
#     include "COMMON/ral_messages_types.h"
#     include "UTIL/queue.h"
#   endif
59 60 61 62 63
#   include "log.h"
#   define msg(aRGS...) LOG_D(PHY, ##aRGS)
# else
#   define msg printf
# endif
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
#endif
//use msg in the real-time thread context
#define msg_nrt printf   
//use msg_nrt in the non real-time context (for initialization, ...)
#ifdef EXPRESSMIMO_TARGET
#define malloc16(x) malloc(x)
#else //EXPRESSMIMO_TARGET
#define malloc16(x) memalign(16,x)
#endif //EXPRESSMIMO_TARGET
#define free16(y,x) free(y)
#define bigmalloc malloc
#define bigmalloc16 malloc16
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
#ifdef EXPRESSMIMO_TARGET
    //! \brief Allocate \c size bytes of memory on the heap and zero it afterwards.
    //! If no more memory is available, this function will terminate the program with an assertion error.
    static inline void* malloc16_clear( size_t size ) {
        void* ptr = malloc(size);
        DevAssert(ptr);
        memset( ptr, 0, size );
        return ptr;
    }
#else //EXPRESSMIMO_TARGET
    //! \brief Allocate \c size bytes of memory on the heap with alignment 16 and zero it afterwards.
    //! If no more memory is available, this function will terminate the program with an assertion error.
    static inline void* malloc16_clear( size_t size ) {
        void* ptr = memalign(16, size);
        DevAssert(ptr);
        memset( ptr, 0, size );
        return ptr;
    }
#endif //EXPRESSMIMO_TARGET


100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
#define PAGE_MASK 0xfffff000
#define virt_to_phys(x) (x)

#define openair_sched_exit() exit(-1)


#define max(a,b)  ((a)>(b) ? (a) : (b))
#define min(a,b)  ((a)<(b) ? (a) : (b))


#define bzero(s,n) (memset((s),0,(n)))

#define cmax(a,b)  ((a>b) ? (a) : (b))
#define cmin(a,b)  ((a<b) ? (a) : (b))

#define cmax3(a,b,c) ((cmax(a,b)>c) ? (cmax(a,b)) : (c))

117 118 119
/// suppress compiler warning for unused arguments
#define UNUSED(x) (void)x;

120 121 122 123 124 125 126 127 128 129 130 131
#ifdef EXPRESSMIMO_TARGET
#define Zero_Buffer(x,y) Zero_Buffer_nommx(x,y)
#endif //EXPRESSMiMO_TARGET
 

#include "spec_defs_top.h"
#include "impl_defs_top.h"
#include "impl_defs_lte.h"

#include "PHY/TOOLS/time_meas.h"
#include "PHY/CODING/defs.h"
#include "PHY/TOOLS/defs.h"
132
#include "platform_types.h"
133 134 135 136 137 138

#ifdef OPENAIR_LTE

//#include "PHY/LTE_ESTIMATION/defs.h"

#include "PHY/LTE_TRANSPORT/defs.h"
knopp's avatar
knopp committed
139
#include <pthread.h>
140 141 142 143 144

#define NUM_DCI_MAX 32

#define NUMBER_OF_eNB_SECTORS_MAX 3

145 146
#define NB_BANDS_MAX 8

147 148 149 150 151 152 153 154 155 156 157
typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5} runmode_t;

enum transmission_access_mode{
  NO_ACCESS=0,
  POSTPONED_ACCESS,
  CANCELED_ACCESS,
  UNKNOWN_ACCESS,
  SCHEDULED_ACCESS,
  CBA_ACCESS
};

158 159
typedef struct UE_SCAN_INFO_s {
  /// 10 best amplitudes (linear) for each pss signals
160
  int32_t amp[3][10];
161
  /// 10 frequency offsets (kHz) corresponding to best amplitudes, with respect do minimum DL frequency in the band
162
  int32_t freq_offset_Hz[3][10];
163 164
} UE_SCAN_INFO_t;

165 166 167 168 169
#if defined(ENABLE_RAL)
  typedef struct ral_threshold_phy_s {
      SLIST_ENTRY(ral_threshold_phy_s) ral_thresholds;
      ral_threshold_t                  threshold;
      ral_th_action_t                  th_action;
gauthier's avatar
gauthier committed
170
      ral_link_param_t                 link_param;
171 172 173 174
      long                             timer_id;
  }ral_threshold_phy_t;
#endif

knopp's avatar
knopp committed
175
/// Context data structure for eNB subframe processing
knopp's avatar
knopp committed
176
typedef struct {
177 178
 /// Component Carrier index
  uint8_t              CC_id;
knopp's avatar
knopp committed
179 180 181 182 183 184 185 186 187 188 189
  /// subframe index
  int subframe;
  /// 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;
  /// instance count for tx processing thread
knopp's avatar
knopp committed
190
  int instance_cnt_tx;
knopp's avatar
knopp committed
191
  /// instance count for rx processing thread
knopp's avatar
knopp committed
192
  int instance_cnt_rx;
knopp's avatar
knopp committed
193
  /// pthread structure for tx processing thread
knopp's avatar
knopp committed
194
  pthread_t pthread_tx;
knopp's avatar
knopp committed
195
  /// pthread structure for rx processing thread
knopp's avatar
knopp committed
196
  pthread_t pthread_rx;
knopp's avatar
knopp committed
197
  /// condition variable for tx processing thread
knopp's avatar
knopp committed
198
  pthread_cond_t cond_tx;
knopp's avatar
knopp committed
199
  /// condition variable for rx processing thread
knopp's avatar
knopp committed
200
  pthread_cond_t cond_rx;
knopp's avatar
knopp committed
201
  /// mutex for tx processing thread
knopp's avatar
knopp committed
202
  pthread_mutex_t mutex_tx;
knopp's avatar
knopp committed
203
  /// mutex for tx processing thread
knopp's avatar
knopp committed
204
  pthread_mutex_t mutex_rx;
knopp's avatar
knopp committed
205 206
} eNB_proc_t;

207
/// Top-level PHY Data Structure for eNB 
208
typedef struct PHY_VARS_eNB_s{
209
  /// Module ID indicator for this instance
knopp's avatar
knopp committed
210 211 212 213 214
  module_id_t          Mod_id;
  uint8_t              CC_id;
  eNB_proc_t           proc[10];
  uint8_t              local_flag;
  uint32_t             rx_total_gain_eNB_dB;
215
  LTE_DL_FRAME_PARMS   lte_frame_parms;
216
  PHY_MEASUREMENTS_eNB PHY_measurements_eNB[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables 
217 218 219
  LTE_eNB_COMMON       lte_eNB_common_vars;
  LTE_eNB_SRS          lte_eNB_srs_vars[NUMBER_OF_UE_MAX];
  LTE_eNB_PBCH         lte_eNB_pbch;
220 221 222
  /// \brief ?.
  /// - first index: UE [0..NUMBER_OF_UE_MAX[ (hard coded)
  /// - second index: UE [0..NUMBER_OF_UE_MAX[
223 224 225
  LTE_eNB_PUSCH       *lte_eNB_pusch_vars[NUMBER_OF_UE_MAX];
  LTE_eNB_PRACH        lte_eNB_prach_vars;
  LTE_eNB_DLSCH_t     *dlsch_eNB[NUMBER_OF_UE_MAX][2];   // Nusers times two spatial streams
226
  // old: LTE_eNB_DLSCH_t  **dlsch_eNB[2];   // Nusers times two spatial streams
227 228 229 230 231
  LTE_eNB_ULSCH_t     *ulsch_eNB[NUMBER_OF_UE_MAX+1];      // Nusers + number of RA
  LTE_eNB_DLSCH_t     *dlsch_eNB_SI,*dlsch_eNB_ra;
  LTE_eNB_DLSCH_t     *dlsch_eNB_MCH;
  LTE_eNB_UE_stats     eNB_UE_stats[NUMBER_OF_UE_MAX];
  LTE_eNB_UE_stats    *eNB_UE_stats_ptr[NUMBER_OF_UE_MAX];
232 233

  /// cell-specific reference symbols
knopp's avatar
knopp committed
234 235 236 237
  uint32_t         lte_gold_table[20][2][14];

  /// UE-specific reference symbols (p=7...14), TM 8/9/10
  uint32_t         lte_gold_uespec_table[2][20][2][21];
238 239
  
  /// mbsfn reference symbols
knopp's avatar
knopp committed
240
  uint32_t         lte_gold_mbsfn_table[10][3][42];
241
  
242
  uint32_t X_u[64][839];
243

244
  uint8_t pbch_pdu[4]; //PBCH_PDU_SIZE
245 246 247
  char eNB_generate_rar;

  /// Indicator set to 0 after first SR
248
  uint8_t first_sr[NUMBER_OF_UE_MAX];
249

knopp's avatar
knopp committed
250
  uint32_t max_peak_val; 
251 252
  int max_eNB_id, max_sync_pos;

253
  int              N_TA_offset; ///timing offset used in TDD
254

255 256
  /// \brief sinr for all subcarriers of the current link (used only for abstraction).
  /// first index: ? [0..N_RB_DL*12[
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
  double *sinr_dB;

 /// N0 (used for abstraction)
  double N0;

  unsigned char first_run_timing_advance[NUMBER_OF_UE_MAX];
  unsigned char first_run_I0_measurements;

  unsigned char cooperation_flag; // for cooperative communication

  unsigned char    is_secondary_eNB; // primary by default
  unsigned char    is_init_sync;     /// Flag to tell if initial synchronization is performed. This affects how often the secondary eNB will listen to the PSS from the primary system.
  unsigned char    has_valid_precoder; /// Flag to tell if secondary eNB has channel estimates to create NULL-beams from, and this B/F vector is created.
  unsigned char    PeNB_id;          /// id of Primary eNB
  int              rx_offset;        /// Timing offset (used if is_secondary_eNB)

  /// hold the precoder for NULL beam to the primary user
  int              **dl_precoder_SeNB[3];
  char             log2_maxp; /// holds the maximum channel/precoder coefficient

  /// For emulation only (used by UE abstraction to retrieve DCI)
278 279
  uint8_t num_common_dci[2];                         // num_dci in even/odd subframes
  uint8_t num_ue_spec_dci[2];                         // num_dci in even/odd subframes
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
  DCI_ALLOC_t dci_alloc[2][NUM_DCI_MAX]; // dci_alloc from even/odd subframes


  // PDSCH Varaibles
  PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_UE_MAX];

  // PUSCH Varaibles
  PUSCH_CONFIG_DEDICATED pusch_config_dedicated[NUMBER_OF_UE_MAX];

  // PUCCH variables
  PUCCH_CONFIG_DEDICATED pucch_config_dedicated[NUMBER_OF_UE_MAX];

  // UL-POWER-Control
  UL_POWER_CONTROL_DEDICATED ul_power_control_dedicated[NUMBER_OF_UE_MAX];

  // TPC
  TPC_PDCCH_CONFIG tpc_pdcch_config_pucch[NUMBER_OF_UE_MAX];
  TPC_PDCCH_CONFIG tpc_pdcch_config_pusch[NUMBER_OF_UE_MAX];

  // CQI reporting
  CQI_REPORT_CONFIG cqi_report_config[NUMBER_OF_UE_MAX];

  // SRS Variables
  SOUNDINGRS_UL_CONFIG_DEDICATED soundingrs_ul_config_dedicated[NUMBER_OF_UE_MAX];
304
  uint8_t ncs_cell[20][7];
305 306 307 308 309

  // Scheduling Request Config
  SCHEDULING_REQUEST_CONFIG scheduling_request_config[NUMBER_OF_UE_MAX];

  // Transmission mode per UE
310
  uint8_t transmission_mode[NUMBER_OF_UE_MAX];
311 312 313 314 315 316 317 318 319 320 321 322 323

  /// cba_last successful reception for each group, used for collision detection
  uint8_t cba_last_reception[4];
  
  // Pointers for active physicalConfigDedicated to be applied in current subframe
  struct PhysicalConfigDedicated *physicalConfigDedicated[NUMBER_OF_UE_MAX];

  
  /// Information regarding TM5
  MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];


  ///check for Total Transmissions
knopp's avatar
knopp committed
324
  uint32_t check_for_total_transmissions;
325 326

  ///check for MU-MIMO Transmissions
knopp's avatar
knopp committed
327
  uint32_t check_for_MUMIMO_transmissions;
328 329

  ///check for SU-MIMO Transmissions
knopp's avatar
knopp committed
330
  uint32_t check_for_SUMIMO_transmissions;
331 332

  ///check for FULL MU-MIMO Transmissions
knopp's avatar
knopp committed
333
  uint32_t  FULL_MUMIMO_transmissions;
334 335

  /// Counter for total bitrate, bits and throughput in downlink
knopp's avatar
knopp committed
336 337 338
  uint32_t total_dlsch_bitrate;
  uint32_t total_transmitted_bits;
  uint32_t total_system_throughput;
339 340 341 342
  
  time_stats_t phy_proc;
  time_stats_t phy_proc_tx;
  time_stats_t phy_proc_rx;
343 344 345 346 347
  /*
  time_stats_t phy_proc_sf[10]; // for each subframe
  time_stats_t phy_proc_tx_sf[10]; 
  time_stats_t phy_proc_rx_sf[10];
  */
348 349
  time_stats_t rx_prach;
  
350 351 352
  time_stats_t ofdm_mod_stats;
  time_stats_t dlsch_encoding_stats;
  time_stats_t dlsch_modulation_stats;
353
  time_stats_t dlsch_scrambling_stats;
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375
  time_stats_t dlsch_rate_matching_stats;
  time_stats_t dlsch_turbo_encoding_stats;
  time_stats_t dlsch_interleaving_stats;

  time_stats_t ofdm_demod_stats;
  time_stats_t rx_dft_stats;
  time_stats_t ulsch_channel_estimation_stats;
  time_stats_t ulsch_freq_offset_estimation_stats;
  time_stats_t ulsch_decoding_stats;
  time_stats_t ulsch_demodulation_stats;
  time_stats_t ulsch_rate_unmatching_stats;
  time_stats_t ulsch_turbo_decoding_stats;
  time_stats_t ulsch_deinterleaving_stats;
  time_stats_t ulsch_demultiplexing_stats;
  time_stats_t ulsch_llr_stats;
  time_stats_t ulsch_tc_init_stats;
  time_stats_t ulsch_tc_alpha_stats;
  time_stats_t ulsch_tc_beta_stats;
  time_stats_t ulsch_tc_gamma_stats;
  time_stats_t ulsch_tc_ext_stats;
  time_stats_t ulsch_tc_intl1_stats;
  time_stats_t ulsch_tc_intl2_stats;
gauthier's avatar
gauthier committed
376
  
377 378 379 380 381
#ifdef LOCALIZATION
  /// time state for localization
  time_stats_t localization_stats;
#endif 
  
gauthier's avatar
gauthier committed
382 383 384 385 386 387
#if defined(ENABLE_RAL)
  hash_table_t    *ral_thresholds_timed;
  SLIST_HEAD(ral_thresholds_gen_poll_enb_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
  SLIST_HEAD(ral_thresholds_lte_poll_enb_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
#endif

388 389 390 391 392
} PHY_VARS_eNB;

#define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg
//#define debug_msg msg

knopp's avatar
knopp committed
393
/*
394 395 396
typedef enum {
  max_gain=0,med_gain,byp_gain
} rx_gain_t;
knopp's avatar
knopp committed
397
*/
398

399 400 401
/// Top-level PHY Data Structure for UE 
typedef struct
{
knopp's avatar
knopp committed
402
  /// \brief Module ID indicator for this instance
403
  uint8_t Mod_id;
knopp's avatar
knopp committed
404
  /// \brief Component carrier ID for this PHY instance
knopp's avatar
knopp committed
405
  uint8_t CC_id;
knopp's avatar
knopp committed
406 407 408 409 410 411
  //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 should perform band scanning
  int UE_scan;
  /// \brief Indicator that UE is synchronized to an eNB
412
  int is_synchronized;
knopp's avatar
knopp committed
413
  /// \brief Instance count of TX processing thread (-1 means ready, 0 means busy)
knopp's avatar
knopp committed
414
  int instance_cnt_tx;
knopp's avatar
knopp committed
415
  /// \brief Instance count of RX processing thread (-1 means ready, 0 means busy)
knopp's avatar
knopp committed
416
  int instance_cnt_rx;
knopp's avatar
knopp committed
417
  /// \brief Instance cound of initial synchronization thread (-1 means ready, 0 means busy)
knopp's avatar
knopp committed
418
  int instance_cnt_synch;
knopp's avatar
knopp committed
419
  /// \brief Condition variable for TX processing thread
knopp's avatar
knopp committed
420
  pthread_cond_t cond_tx;
knopp's avatar
knopp committed
421
  /// \brief Condition variable for RX processing thread
knopp's avatar
knopp committed
422
  pthread_cond_t cond_rx;
knopp's avatar
knopp committed
423
  /// \brief Condition variable for initial synchronization thread
knopp's avatar
knopp committed
424
  pthread_cond_t cond_synch;
knopp's avatar
knopp committed
425
  /// \brief Mutex for TX processing thread
knopp's avatar
knopp committed
426
  pthread_mutex_t mutex_tx;
knopp's avatar
knopp committed
427
  /// \brief Mutex for RX processing thread
knopp's avatar
knopp committed
428
  pthread_mutex_t mutex_rx;
knopp's avatar
knopp committed
429
  /// \brief Mutex for initial synchronization thread
knopp's avatar
knopp committed
430
  pthread_mutex_t mutex_synch;
knopp's avatar
knopp committed
431
  /// \brief Pthread structure for RX processing thread
knopp's avatar
knopp committed
432
  pthread_t       thread_rx;
knopp's avatar
knopp committed
433
  /// \brief Pthread structure for TX processing thread
knopp's avatar
knopp committed
434
  pthread_t       thread_tx;
knopp's avatar
knopp committed
435
  /// \brief Pthread structure to RX processing thread
knopp's avatar
knopp committed
436
  pthread_t       thread_synch;
knopp's avatar
knopp committed
437
  /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna)
knopp's avatar
knopp committed
438
  uint32_t tx_total_gain_dB;
knopp's avatar
knopp committed
439
  /// \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.
440
  uint32_t rx_total_gain_dB;
knopp's avatar
knopp committed
441
  /// \brief Total gains with maximum RF gain stage (ExpressMIMO2/Lime)
knopp's avatar
knopp committed
442
  uint32_t rx_gain_max[4];
knopp's avatar
knopp committed
443
  /// \brief Total gains with medium RF gain stage (ExpressMIMO2/Lime)
knopp's avatar
knopp committed
444
  uint32_t rx_gain_med[4];
knopp's avatar
knopp committed
445
  /// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime)
knopp's avatar
knopp committed
446
  uint32_t rx_gain_byp[4];
knopp's avatar
knopp committed
447
  /// \brief Current transmit power
448
  int8_t tx_power_dBm;
knopp's avatar
knopp committed
449
  /// \brief Total number of REs in current transmission
knopp's avatar
knopp committed
450
  int tx_total_RE;
knopp's avatar
knopp committed
451
  /// \brief Maximum transmit power
452
  int8_t tx_power_max_dBm;
knopp's avatar
knopp committed
453
  /// \brief Frame counters for TX and RX processing
knopp's avatar
knopp committed
454
  uint32_t frame_rx,frame_tx;
knopp's avatar
knopp committed
455
  /// \brief Slot counters for TX and RX processing
knopp's avatar
knopp committed
456
  uint32_t slot_tx,slot_rx;
knopp's avatar
knopp committed
457
  /// \brief Number of eNB seen by UE
458
  uint8_t n_connected_eNB;
knopp's avatar
knopp committed
459
  /// \brief indicator that Handover procedure has been initiated
460
  uint8_t ho_initiated;
knopp's avatar
knopp committed
461
  /// \brief indicator that Handover procedure has been triggered
462
  uint8_t ho_triggered;
463 464
  /// \brief Measurement variables.
  PHY_MEASUREMENTS PHY_measurements;
465
  LTE_DL_FRAME_PARMS  lte_frame_parms;
466 467
  /// \brief Frame parame before ho used to recover if ho fails.
  LTE_DL_FRAME_PARMS  lte_frame_parms_before_ho;
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
  LTE_UE_COMMON    lte_ue_common_vars;

  LTE_UE_PDSCH     *lte_ue_pdsch_vars[NUMBER_OF_CONNECTED_eNB_MAX+1];
  LTE_UE_PDSCH_FLP *lte_ue_pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
  LTE_UE_PDSCH     *lte_ue_pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
  LTE_UE_PDSCH     *lte_ue_pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
  LTE_UE_PDSCH     *lte_ue_pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_PBCH      *lte_ue_pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_PDCCH     *lte_ue_pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_PRACH     *lte_ue_prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_DLSCH_t   *dlsch_ue[NUMBER_OF_CONNECTED_eNB_MAX][2];
  LTE_UE_ULSCH_t   *ulsch_ue[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_DLSCH_t   *dlsch_ue_col[NUMBER_OF_CONNECTED_eNB_MAX][2];
  LTE_UE_DLSCH_t   *ulsch_ue_col[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_DLSCH_t   *dlsch_ue_SI[NUMBER_OF_CONNECTED_eNB_MAX],*dlsch_ue_ra[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_DLSCH_t   *dlsch_ue_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
knopp's avatar
knopp committed
484 485 486
  // This is for SIC in the UE, to store the reencoded data
  LTE_eNB_DLSCH_t  *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX];

487
  // For abstraction-purposes only
488 489 490
  uint8_t               sr[10];
  uint8_t               pucch_sel[10];
  uint8_t               pucch_payload[22];
491 492

  UE_MODE_t        UE_mode[NUMBER_OF_CONNECTED_eNB_MAX];
493
  int8_t               g_pucch[NUMBER_OF_CONNECTED_eNB_MAX];
494
  /// cell-specific reference symbols
knopp's avatar
knopp committed
495 496 497 498
  uint32_t lte_gold_table[7][20][2][14];

  /// ue-specific reference symbols
  uint32_t         lte_gold_uespec_table[2][20][2][21];
499

knopp's avatar
knopp committed
500 501
  /// mbsfn reference symbols
  uint32_t lte_gold_mbsfn_table[10][3][42];
502
  
503
  uint32_t X_u[64][839];
504

505
  uint32_t high_speed_flag;
knopp's avatar
knopp committed
506
  uint32_t perfect_ce;
507
  int16_t ch_est_alpha;
508
  UE_SCAN_INFO_t scan_info[NB_BANDS_MAX];
509

510 511 512
  char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX];

  unsigned char ulsch_ue_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX];
knopp's avatar
knopp committed
513
  uint32_t  ulsch_ue_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX];
514 515 516 517 518
  unsigned char ulsch_ue_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX];
  //  unsigned char Msg3_timer[NUMBER_OF_CONNECTED_eNB_MAX];
  //unsigned char *Msg3_ptr[NUMBER_OF_CONNECTED_eNB_MAX];
  PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_eNB_MAX];
  int turbo_iterations, turbo_cntl_iterations;
519 520
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
knopp's avatar
knopp committed
521
  uint32_t total_TBS[NUMBER_OF_CONNECTED_eNB_MAX];
522 523
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
knopp's avatar
knopp committed
524
  uint32_t total_TBS_last[NUMBER_OF_CONNECTED_eNB_MAX];
525 526
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
knopp's avatar
knopp committed
527
  uint32_t bitrate[NUMBER_OF_CONNECTED_eNB_MAX];
528 529
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
knopp's avatar
knopp committed
530
  uint32_t total_received_bits[NUMBER_OF_CONNECTED_eNB_MAX];
531 532 533 534 535 536 537 538 539
  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];
540 541 542 543 544 545 546 547
  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];
548 549
  int current_dlsch_cqi[NUMBER_OF_CONNECTED_eNB_MAX];
  unsigned char first_run_timing_advance[NUMBER_OF_CONNECTED_eNB_MAX];
550 551 552 553
  uint8_t               generate_prach;
  uint8_t               prach_cnt;
  uint8_t               prach_PreambleIndex;
  //  uint8_t               prach_timer;
554 555
  int              rx_offset; /// Timing offset
  int              timing_advance; ///timing advance signalled from eNB
556
  int              N_TA_offset; ///timing offset used in TDD
557 558 559 560 561 562 563 564 565 566 567 568
  /// 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; 

  /// Flag to initialize averaging of PHY measurements
  int init_averaging; 

569 570
  /// \brief sinr for all subcarriers of the current link (used only for abstraction).
  /// - first index: ? [0..12*N_RB_DL[
571 572
  double *sinr_dB;
  
573 574
  /// \brief sinr for all subcarriers of first symbol for the CQI Calculation.
  /// - first index: ? [0..12*N_RB_DL[
575 576
  double *sinr_CQI_dB;

577 578 579
  /// sinr_effective used for CQI calulcation
  double sinr_eff;

580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
  /// 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];

596
  uint8_t ncs_cell[20][7];
597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614

  /// 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
615
  uint8_t transmission_mode[NUMBER_OF_CONNECTED_eNB_MAX];
616 617 618 619 620
 
  time_stats_t phy_proc;
  time_stats_t phy_proc_tx;
  time_stats_t phy_proc_rx;
  
621 622 623 624 625 626 627 628 629 630
  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 ofdm_demod_stats;
631
  time_stats_t dlsch_rx_pdcch_stats;
632 633 634 635 636 637 638 639 640
  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;
  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;
641
  time_stats_t dlsch_unscrambling_stats;
knopp's avatar
knopp committed
642 643 644
  time_stats_t dlsch_rate_matching_stats;
  time_stats_t dlsch_turbo_encoding_stats;
  time_stats_t dlsch_interleaving_stats;
645 646 647 648 649 650 651
  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;
652 653
  time_stats_t tx_prach;
  
654 655 656 657 658
#if defined(ENABLE_RAL)
  hash_table_t    *ral_thresholds_timed;
  SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
  SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
#endif
659 660
} PHY_VARS_UE;

661 662 663
/// Top-level PHY Data Structure for RN
typedef struct {
  /// Module ID indicator for this instance
664 665
  uint8_t Mod_id;
  uint32_t frame;
666 667 668
  // phy_vars_eNB 
  // phy_vars ue 
  // cuurently only used to store and forward the PMCH
669 670
  uint8_t mch_avtive[10];
  uint8_t sync_area[10]; // num SF
671 672 673
  LTE_UE_DLSCH_t   *dlsch_rn_MCH[10];
   
} PHY_VARS_RN;
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691

#include "PHY/INIT/defs.h"
#include "PHY/LTE_REFSIG/defs.h"
#include "PHY/MODULATION/defs.h"
#include "PHY/LTE_TRANSPORT/proto.h"
#include "PHY/LTE_ESTIMATION/defs.h"

#include "SIMULATION/ETH_TRANSPORT/defs.h"
#endif //OPENAIR_LTE


#endif //  __PHY_DEFS__H__