defs.h 36.2 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * 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.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.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
 */
21
22
23
24
25
26
27
28
29
30
31
32
33
34

/*! \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__

35
#define _GNU_SOURCE 
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
41
42
#include "common_lib.h"

43
//#include <complex.h>
44
#include "assertions.h"
45
#ifdef MEX
46
# define msg mexPrintf
47
#else
48
# ifdef OPENAIR2
Thomas Laurent's avatar
Thomas Laurent committed
49
50
51
52
53
#   if ENABLE_RAL
#     include "collection/hashtable/hashtable.h"
#     include "COMMON/ral_messages_types.h"
#     include "UTIL/queue.h"
#   endif
54
55
56
57
58
#   include "log.h"
#   define msg(aRGS...) LOG_D(PHY, ##aRGS)
# else
#   define msg printf
# endif
59
60
#endif
//use msg in the real-time thread context
61
#define msg_nrt printf
62
//use msg_nrt in the non real-time context (for initialization, ...)
Cedric Roux's avatar
Cedric Roux committed
63
64
65
66
67
68
#ifndef malloc16
#  ifdef __AVX2__
#    define malloc16(x) memalign(32,x)
#  else
#    define malloc16(x) memalign(16,x)
#  endif
69
#endif
70
71
72
73
74
75
#define free16(y,x) free(y)
#define bigmalloc malloc
#define bigmalloc16 malloc16
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096

Bilel's avatar
Bilel committed
76
77
#define RX_NB_TH_MAX 2
#define RX_NB_TH 2
78

Bilel's avatar
Bilel committed
79

80
81
82
83
84
85
86
//#ifdef SHRLIBDEV
//extern int rxrescale;
//#define RX_IQRESCALELEN rxrescale
//#else
//#define RX_IQRESCALELEN 15
//#endif

87
88
89
90
//! \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 )
{
91
92
93
#ifdef __AVX2__
  void* ptr = memalign(32, size);
#else
94
  void* ptr = memalign(16, size);
95
#endif
96
97
98
99
  DevAssert(ptr);
  memset( ptr, 0, size );
  return ptr;
}
100

101
102


103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#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))

120
121
122
/// suppress compiler warning for unused arguments
#define UNUSED(x) (void)x;

123
124
125
126
127
128
129

#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"
gauthier's avatar
gauthier committed
130
#include "platform_types.h"
131

Thomas Laurent's avatar
Thomas Laurent committed
132
133
#ifdef OPENAIR_LTE

134
#include "PHY/LTE_TRANSPORT/defs.h"
knopp's avatar
   
knopp committed
135
#include <pthread.h>
136

137
138
#include "targets/ARCH/COMMON/common_lib.h"

139
140
141
142
#define NUM_DCI_MAX 32

#define NUMBER_OF_eNB_SECTORS_MAX 3

143
144
#define NB_BANDS_MAX 8

Thomas Laurent's avatar
Thomas Laurent committed
145
146
147
#ifdef OCP_FRAMEWORK
#include <enums.h>
#else
148
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,calib_prach_tx=6,rx_dump_frame=7,loop_through_memory=8} runmode_t;
149

150
enum transmission_access_mode {
151
152
153
154
155
  NO_ACCESS=0,
  POSTPONED_ACCESS,
  CANCELED_ACCESS,
  UNKNOWN_ACCESS,
  SCHEDULED_ACCESS,
156
157
  CBA_ACCESS};

158
typedef enum  {
159
  eNodeB_3GPP=0,   // classical eNodeB function
160
  eNodeB_3GPP_BBU, // eNodeB with NGFI IF5
161
  NGFI_RCC_IF4p5,  // NGFI_RCC (NGFI radio cloud center)
knopp's avatar
knopp committed
162
163
  NGFI_RAU_IF4p5,
  NGFI_RRU_IF5,    // NGFI_RRU (NGFI remote radio-unit,IF5)
164
  NGFI_RRU_IF4p5   // NGFI_RRU (NGFI remote radio-unit,IF4p5)
165
} eNB_func_t;
166

167
168
169
170
typedef enum {
  synch_to_ext_device=0,  // synch to RF or Ethernet device
  synch_to_other          // synch to another source (timer, other CC_id)
} eNB_timing_t;
Thomas Laurent's avatar
Thomas Laurent committed
171
#endif
172

173
174
typedef struct UE_SCAN_INFO_s {
  /// 10 best amplitudes (linear) for each pss signals
175
  int32_t amp[3][10];
176
  /// 10 frequency offsets (kHz) corresponding to best amplitudes, with respect do minimum DL frequency in the band
177
  int32_t freq_offset_Hz[3][10];
178
179
} UE_SCAN_INFO_t;

180
181
182
183
184
185
186
187
188
189
190
191
192
193
/// Top-level PHY Data Structure for RN
typedef struct {
  /// Module ID indicator for this instance
  uint8_t Mod_id;
  uint32_t frame;
  // phy_vars_eNB
  // phy_vars ue
  // cuurently only used to store and forward the PMCH
  uint8_t mch_avtive[10];
  uint8_t sync_area[10]; // num SF
  LTE_UE_DLSCH_t   *dlsch_rn_MCH[10];

} PHY_VARS_RN;

knopp's avatar
knopp committed
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
/// Context data structure for RX/TX portion of subframe processing
typedef struct {
  /// 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;
} eNB_rxtx_proc_t;
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236

typedef struct {
  struct PHY_VARS_eNB_s *eNB;
  int UE_id;
  int harq_pid;
  int llr8_flag;
  int ret;
} td_params;

typedef struct {
  struct PHY_VARS_eNB_s *eNB;
  LTE_eNB_DLSCH_t *dlsch;
  int G;
} te_params;

knopp's avatar
   
knopp committed
237
/// Context data structure for eNB subframe processing
238
typedef struct eNB_proc_t_s {
239
  /// Component Carrier index
240
  uint8_t              CC_id;
241
242
243
244
  /// thread index
  int thread_index;
  /// timestamp received from HW
  openair0_timestamp timestamp_rx;
245
246
  /// timestamp to send to "slave rru"
  openair0_timestamp timestamp_tx;
247
  /// subframe to act upon for reception
knopp's avatar
   
knopp committed
248
  int subframe_rx;
249
250
  /// symbol mask for IF4p5 reception per subframe
  uint32_t symbol_mask[10];
251
252
  /// subframe to act upon for PRACH
  int subframe_prach;
253
  /// frame to act upon for reception
knopp's avatar
   
knopp committed
254
  int frame_rx;
255
256
  /// frame to act upon for transmission
  int frame_tx;
257
258
  /// frame offset for secondary eNBs (to correct for frame asynchronism at startup)
  int frame_offset;
259
260
  /// frame to act upon for PRACH
  int frame_prach;
261
262
  /// \internal This variable is protected by \ref mutex_fep.
  int instance_cnt_fep;
263
264
265
266
  /// \internal This variable is protected by \ref mutex_td.
  int instance_cnt_td;
  /// \internal This variable is protected by \ref mutex_te.
  int instance_cnt_te;
267
268
269
  /// \brief Instance count for FH processing thread.
  /// \internal This variable is protected by \ref mutex_FH.
  int instance_cnt_FH;
270
  /// \brief Instance count for rx processing thread.
271
272
  /// \internal This variable is protected by \ref mutex_prach.
  int instance_cnt_prach;
273
274
  // instance count for over-the-air eNB synchronization
  int instance_cnt_synch;
275
276
  /// \internal This variable is protected by \ref mutex_asynch_rxtx.
  int instance_cnt_asynch_rxtx;
277
278
  /// pthread structure for FH processing thread
  pthread_t pthread_FH;
knopp's avatar
knopp committed
279
280
  /// pthread structure for eNB single processing thread
  pthread_t pthread_single;
281
282
  /// pthread structure for asychronous RX/TX processing thread
  pthread_t pthread_asynch_rxtx;
283
284
  /// flag to indicate first RX acquisition
  int first_rx;
knopp's avatar
knopp committed
285
286
  /// flag to indicate first TX transmission
  int first_tx;
287
288
  /// pthread attributes for parallel fep thread
  pthread_attr_t attr_fep;
289
290
291
292
  /// pthread attributes for parallel turbo-decoder thread
  pthread_attr_t attr_td;
  /// pthread attributes for parallel turbo-encoder thread
  pthread_attr_t attr_te;
293
294
  /// pthread attributes for FH processing thread
  pthread_attr_t attr_FH;
knopp's avatar
knopp committed
295
296
  /// pthread attributes for single eNB processing thread
  pthread_attr_t attr_single;
297
298
  /// pthread attributes for prach processing thread
  pthread_attr_t attr_prach;
299
300
  /// pthread attributes for over-the-air synch thread
  pthread_attr_t attr_synch;
301
  /// pthread attributes for asynchronous RX thread
302
  pthread_attr_t attr_asynch_rxtx;
303
304
  /// scheduling parameters for parallel fep thread
  struct sched_param sched_param_fep;
305
306
307
308
  /// scheduling parameters for parallel turbo-decoder thread
  struct sched_param sched_param_td;
  /// scheduling parameters for parallel turbo-encoder thread
  struct sched_param sched_param_te;
309
310
  /// scheduling parameters for FH thread
  struct sched_param sched_param_FH;
knopp's avatar
knopp committed
311
312
  /// scheduling parameters for single eNB thread
  struct sched_param sched_param_single;
313
314
  /// scheduling parameters for prach thread
  struct sched_param sched_param_prach;
315
316
  /// scheduling parameters for over-the-air synchronization thread
  struct sched_param sched_param_synch;
317
318
  /// scheduling parameters for asynch_rxtx thread
  struct sched_param sched_param_asynch_rxtx;
319
320
  /// pthread structure for parallel fep thread
  pthread_t pthread_fep;
321
322
323
324
  /// pthread structure for parallel turbo-decoder thread
  pthread_t pthread_td;
  /// pthread structure for parallel turbo-encoder thread
  pthread_t pthread_te;
325
  /// pthread structure for PRACH thread
knopp's avatar
knopp committed
326
  pthread_t pthread_prach;
327
328
  /// pthread structure for eNB synch thread
  pthread_t pthread_synch;
329
330
  /// condition variable for parallel fep thread
  pthread_cond_t cond_fep;
331
332
333
334
  /// condition variable for parallel turbo-decoder thread
  pthread_cond_t cond_td;
  /// condition variable for parallel turbo-encoder thread
  pthread_cond_t cond_te;
335
336
337
  /// condition variable for FH thread
  pthread_cond_t cond_FH;
  /// condition variable for PRACH processing thread;
338
  pthread_cond_t cond_prach;
339
340
  // condition variable for over-the-air eNB synchronization
  pthread_cond_t cond_synch;
341
342
  /// condition variable for asynch RX/TX thread
  pthread_cond_t cond_asynch_rxtx;
343
344
  /// mutex for parallel fep thread
  pthread_mutex_t mutex_fep;
345
346
347
348
  /// mutex for parallel turbo-decoder thread
  pthread_mutex_t mutex_td;
  /// mutex for parallel turbo-encoder thread
  pthread_mutex_t mutex_te;
349
350
351
  /// mutex for FH
  pthread_mutex_t mutex_FH;
  /// mutex for PRACH thread
352
  pthread_mutex_t mutex_prach;
353
354
  // mutex for over-the-air eNB synchronization
  pthread_mutex_t mutex_synch;
355
356
  /// mutex for asynch RX/TX thread
  pthread_mutex_t mutex_asynch_rxtx;
357
358
359
360
  /// parameters for turbo-decoding worker thread
  td_params tdp;
  /// parameters for turbo-encoding worker thread
  te_params tep;
knopp's avatar
knopp committed
361
362
  /// set of scheduling variables RXn-TXnp4 threads
  eNB_rxtx_proc_t proc_rxtx[2];
363
364
365
366
  /// number of slave threads
  int                  num_slaves;
  /// array of pointers to slaves
  struct eNB_proc_t_s           **slave_proc;
knopp's avatar
   
knopp committed
367
368
} eNB_proc_t;

369
370
371

/// Context data structure for RX/TX portion of subframe processing
typedef struct {
Wilson's avatar
Wilson committed
372
373
  /// index of the current UE RX/TX proc
  int                  proc_id;
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
  /// 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;
399
400

  /// internal This variable is protected by ref mutex_fep_slot1.
401
402
  //int instance_cnt_slot0_dl_processing;
  int instance_cnt_slot1_dl_processing;
403
  /// pthread descriptor fep_slot1 thread
404
405
  //pthread_t pthread_slot0_dl_processing;
  pthread_t pthread_slot1_dl_processing;
406
  /// pthread attributes for fep_slot1 processing thread
407
408
 // pthread_attr_t attr_slot0_dl_processing;
  pthread_attr_t attr_slot1_dl_processing;
409
  /// condition variable for UE fep_slot1 thread;
410
411
  //pthread_cond_t cond_slot0_dl_processing;
  pthread_cond_t cond_slot1_dl_processing;
412
  /// mutex for UE synch thread
413
414
  //pthread_mutex_t mutex_slot0_dl_processing;
  pthread_mutex_t mutex_slot1_dl_processing;
415
416
  //
  uint8_t chan_est_pilot0_slot1_available;
417
  uint8_t chan_est_slot1_available;
418
419
420
  uint8_t llr_slot1_available;
  uint8_t dci_slot0_available;
  uint8_t first_symbol_available;
421
  uint8_t channel_level;
422
423
424
  /// scheduling parameters for fep_slot1 thread
  struct sched_param sched_param_fep_slot1;

laurent's avatar
laurent committed
425
426
427
  int sub_frame_start;
  int sub_frame_step;
  unsigned long long gotIQs;
428
429
430
431
432
433
434
435
} 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;
knopp's avatar
knopp committed
436
437
438
439
440
441
  /// 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;
442
443
444
  /// \brief Instance count for synch thread.
  /// \internal This variable is protected by \ref mutex_synch.
  int instance_cnt_synch;
knopp's avatar
knopp committed
445
  /// pthread attributes for synch processing thread
446
447
448
449
450
451
452
453
454
455
  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;
  /// set of scheduling variables RXn-TXnp4 threads
Bilel's avatar
Bilel committed
456
  UE_rxtx_proc_t proc_rxtx[RX_NB_TH];
457
} UE_proc_t;
458
459

/// Top-level PHY Data Structure for eNB
460
typedef struct PHY_VARS_eNB_s {
461
  /// Module ID indicator for this instance
knopp's avatar
   
knopp committed
462
463
  module_id_t          Mod_id;
  uint8_t              CC_id;
464
  eNB_proc_t           proc;
465
  eNB_func_t           node_function;
466
  eNB_timing_t         node_timing;
467
  eth_params_t         *eth_params;
knopp's avatar
knopp committed
468
  int                  single_thread_flag;
knopp's avatar
knopp committed
469
  openair0_rf_map      rf_map;
470
  int                  abstraction_flag;
knopp's avatar
knopp committed
471
  openair0_timestamp   ts_offset;
472
473
474
475
  // indicator for synchronization state of eNB
  int                  in_synch;
  // indicator for master/slave (RRU)
  int                  is_slave;
476
477
  // indicator for precoding function (eNB,3GPP_eNB_BBU)
  int                  do_precoding;
478
  void                 (*do_prach)(struct PHY_VARS_eNB_s *eNB,int frame,int subframe);
479
  void                 (*fep)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc);
480
481
  int                  (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag);
  int                  (*te)(struct PHY_VARS_eNB_s *,uint8_t *,uint8_t,LTE_eNB_DLSCH_t *,int,uint8_t,time_stats_t *,time_stats_t *,time_stats_t *);
482
483
484
  void                 (*proc_uespec_rx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type);
  void                 (*proc_tx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *rn);
  void                 (*tx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc);
knopp's avatar
knopp committed
485
  void                 (*rx_fh)(struct PHY_VARS_eNB_s *eNB,int *frame, int *subframe);
486
487
  int                  (*start_rf)(struct PHY_VARS_eNB_s *eNB);
  int                  (*start_if)(struct PHY_VARS_eNB_s *eNB);
knopp's avatar
knopp committed
488
  void                 (*fh_asynch)(struct PHY_VARS_eNB_s *eNB,int *frame, int *subframe);
knopp's avatar
   
knopp committed
489
  uint8_t              local_flag;
490
491
492
493
494
495
496
497
498
499
500
501
502
503
  uint32_t             rx_total_gain_dB;
  LTE_DL_FRAME_PARMS   frame_parms;
  PHY_MEASUREMENTS_eNB measurements[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables
  LTE_eNB_COMMON       common_vars;
  LTE_eNB_SRS          srs_vars[NUMBER_OF_UE_MAX];
  LTE_eNB_PBCH         pbch;
  LTE_eNB_PUSCH       *pusch_vars[NUMBER_OF_UE_MAX];
  LTE_eNB_PRACH        prach_vars;
  LTE_eNB_DLSCH_t     *dlsch[NUMBER_OF_UE_MAX][2];   // Nusers times two spatial streams
  LTE_eNB_ULSCH_t     *ulsch[NUMBER_OF_UE_MAX+1];      // Nusers + number of RA
  LTE_eNB_DLSCH_t     *dlsch_SI,*dlsch_ra;
  LTE_eNB_DLSCH_t     *dlsch_MCH;
  LTE_eNB_UE_stats     UE_stats[NUMBER_OF_UE_MAX];
  LTE_eNB_UE_stats    *UE_stats_ptr[NUMBER_OF_UE_MAX];
504
505

  /// cell-specific reference symbols
knopp's avatar
   
knopp committed
506
507
  uint32_t         lte_gold_table[20][2][14];

508
  /// UE-specific reference symbols (p=5), TM 7
509
  uint32_t         lte_gold_uespec_port5_table[NUMBER_OF_UE_MAX][20][38];
510

knopp's avatar
   
knopp committed
511
512
  /// UE-specific reference symbols (p=7...14), TM 8/9/10
  uint32_t         lte_gold_uespec_table[2][20][2][21];
513

514
  /// mbsfn reference symbols
knopp's avatar
   
knopp committed
515
  uint32_t         lte_gold_mbsfn_table[10][3][42];
516

gauthier's avatar
gauthier committed
517
  uint32_t X_u[64][839];
518

gauthier's avatar
gauthier committed
519
  uint8_t pbch_pdu[4]; //PBCH_PDU_SIZE
520
521
522
  char eNB_generate_rar;

  /// Indicator set to 0 after first SR
gauthier's avatar
gauthier committed
523
  uint8_t first_sr[NUMBER_OF_UE_MAX];
524

525
  uint32_t max_peak_val;
526
527
  int max_eNB_id, max_sync_pos;

528
  int              N_TA_offset; ///timing offset used in TDD
529

530
531
  /// \brief sinr for all subcarriers of the current link (used only for abstraction).
  /// first index: ? [0..N_RB_DL*12[
532
533
  double *sinr_dB;

534
  /// N0 (used for abstraction)
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
  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

552
  /// if ==0 enables phy only test mode
553
554
  int mac_enabled;

555
  /// For emulation only (used by UE abstraction to retrieve DCI)
gauthier's avatar
gauthier committed
556
557
  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
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
  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];
gauthier's avatar
gauthier committed
582
  uint8_t ncs_cell[20][7];
583
584
585
586
587

  // Scheduling Request Config
  SCHEDULING_REQUEST_CONFIG scheduling_request_config[NUMBER_OF_UE_MAX];

  // Transmission mode per UE
gauthier's avatar
gauthier committed
588
  uint8_t transmission_mode[NUMBER_OF_UE_MAX];
589
590
591

  /// cba_last successful reception for each group, used for collision detection
  uint8_t cba_last_reception[4];
592

593
594
595
  // Pointers for active physicalConfigDedicated to be applied in current subframe
  struct PhysicalConfigDedicated *physicalConfigDedicated[NUMBER_OF_UE_MAX];

596

597
598
  uint32_t rb_mask_ul[4];

599
600
601
602
  /// Information regarding TM5
  MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];


603
604
605
606
607
608
609
610
611
  /// target_ue_dl_mcs : only for debug purposes
  uint32_t target_ue_dl_mcs;
  /// target_ue_ul_mcs : only for debug purposes
  uint32_t target_ue_ul_mcs;
  /// target_ue_dl_rballoc : only for debug purposes
  uint32_t ue_dl_rb_alloc;
  /// target ul PRBs : only for debug
  uint32_t ue_ul_nb_rb;

612
  ///check for Total Transmissions
knopp's avatar
   
knopp committed
613
  uint32_t check_for_total_transmissions;
614
615

  ///check for MU-MIMO Transmissions
knopp's avatar
   
knopp committed
616
  uint32_t check_for_MUMIMO_transmissions;
617
618

  ///check for SU-MIMO Transmissions
knopp's avatar
   
knopp committed
619
  uint32_t check_for_SUMIMO_transmissions;
620
621

  ///check for FULL MU-MIMO Transmissions
knopp's avatar
   
knopp committed
622
  uint32_t  FULL_MUMIMO_transmissions;
623
624

  /// Counter for total bitrate, bits and throughput in downlink
knopp's avatar
   
knopp committed
625
626
627
  uint32_t total_dlsch_bitrate;
  uint32_t total_transmitted_bits;
  uint32_t total_system_throughput;
628

629
  int hw_timing_advance;
630

631
632
633
634
  time_stats_t phy_proc;
  time_stats_t phy_proc_tx;
  time_stats_t phy_proc_rx;
  time_stats_t rx_prach;
635

636
637
638
  time_stats_t ofdm_mod_stats;
  time_stats_t dlsch_encoding_stats;
  time_stats_t dlsch_modulation_stats;
gauthier's avatar
gauthier committed
639
  time_stats_t dlsch_scrambling_stats;
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
  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;
662

663
664
665
#ifdef LOCALIZATION
  /// time state for localization
  time_stats_t localization_stats;
666
#endif
667

668
669
  int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10];
  int32_t pucch1_stats[NUMBER_OF_UE_MAX][10*1024];
670
  int32_t pucch1_stats_thres[NUMBER_OF_UE_MAX][10*1024];
671
  int32_t pucch1ab_stats_cnt[NUMBER_OF_UE_MAX][10];
672
  int32_t pucch1ab_stats[NUMBER_OF_UE_MAX][2*10*1024];
673
674
675
676
677
  int32_t pusch_stats_rb[NUMBER_OF_UE_MAX][10240];
  int32_t pusch_stats_round[NUMBER_OF_UE_MAX][10240];
  int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240];
  int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240];
  int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240];
678

679
  /// RF and Interface devices per CC
680
  openair0_device rfdevice;
681
  openair0_device ifdevice;
Sandeep Kumar's avatar
Sandeep Kumar committed
682
683
  /// Pointer for ifdevice buffer struct
  if_buffer_t ifbuffer;
gauthier's avatar
gauthier committed
684

685
686
687
} PHY_VARS_eNB;

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

689
690
/// Top-level PHY Data Structure for UE
typedef struct {
knopp's avatar
   
knopp committed
691
  /// \brief Module ID indicator for this instance
gauthier's avatar
gauthier committed
692
  uint8_t Mod_id;
knopp's avatar
   
knopp committed
693
  /// \brief Component carrier ID for this PHY instance
knopp's avatar
   
knopp committed
694
  uint8_t CC_id;
knopp's avatar
knopp committed
695
696
  /// \brief Mapping of CC_id antennas to cards
  openair0_rf_map      rf_map;
knopp's avatar
   
knopp committed
697
698
699
700
701
  //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;
702
703
  /// \brief Indicator that UE should perform coarse scanning around carrier
  int UE_scan_carrier;
knopp's avatar
   
knopp committed
704
  /// \brief Indicator that UE is synchronized to an eNB
705
  int is_synchronized;
706
707
  /// Data structure for UE process scheduling
  UE_proc_t proc;
708
709
  /// Flag to indicate the UE shouldn't do timing correction at all
  int no_timing_correction;
knopp's avatar
   
knopp committed
710
  /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna)
knopp's avatar
   
knopp committed
711
  uint32_t tx_total_gain_dB;
knopp's avatar
   
knopp committed
712
  /// \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.
713
  uint32_t rx_total_gain_dB;
knopp's avatar
   
knopp committed
714
  /// \brief Total gains with maximum RF gain stage (ExpressMIMO2/Lime)
knopp's avatar
   
knopp committed
715
  uint32_t rx_gain_max[4];
knopp's avatar
   
knopp committed
716
  /// \brief Total gains with medium RF gain stage (ExpressMIMO2/Lime)
knopp's avatar
   
knopp committed
717
  uint32_t rx_gain_med[4];
knopp's avatar
   
knopp committed
718
  /// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime)
knopp's avatar
   
knopp committed
719
  uint32_t rx_gain_byp[4];
knopp's avatar
   
knopp committed
720
  /// \brief Current transmit power
721
  int16_t tx_power_dBm[10];
knopp's avatar
   
knopp committed
722
  /// \brief Total number of REs in current transmission
723
  int tx_total_RE[10];
knopp's avatar
   
knopp committed
724
  /// \brief Maximum transmit power
gauthier's avatar
gauthier committed
725
  int8_t tx_power_max_dBm;
knopp's avatar
   
knopp committed
726
  /// \brief Number of eNB seen by UE
gauthier's avatar
gauthier committed
727
  uint8_t n_connected_eNB;
knopp's avatar
   
knopp committed
728
  /// \brief indicator that Handover procedure has been initiated
gauthier's avatar
gauthier committed
729
  uint8_t ho_initiated;
knopp's avatar
   
knopp committed
730
  /// \brief indicator that Handover procedure has been triggered
gauthier's avatar
gauthier committed
731
  uint8_t ho_triggered;
732
  /// \brief Measurement variables.
733
734
  PHY_MEASUREMENTS measurements;
  LTE_DL_FRAME_PARMS  frame_parms;
735
  /// \brief Frame parame before ho used to recover if ho fails.
736
737
738
  LTE_DL_FRAME_PARMS  frame_parms_before_ho;
  LTE_UE_COMMON    common_vars;

739
740
741
  // point to the current rxTx thread index
  uint8_t current_thread_id[10];

Bilel's avatar
Bilel committed
742
  LTE_UE_PDSCH     *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
743
744
745
  LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
  LTE_UE_PDSCH     *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
  LTE_UE_PDSCH     *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
746
  LTE_UE_PDSCH     *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1];
747
748
  LTE_UE_PDSCH     *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_PBCH      *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
Bilel's avatar
Bilel committed
749
  LTE_UE_PDCCH     *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX];
750
  LTE_UE_PRACH     *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
Bilel's avatar
Bilel committed
751
  LTE_UE_DLSCH_t   *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX][2]; // two RxTx Threads
752
  LTE_UE_ULSCH_t   *ulsch[NUMBER_OF_CONNECTED_eNB_MAX];
753
754
755
  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];
756
  LTE_UE_DLSCH_t   *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
knopp's avatar
knopp committed
757
758
759
  // This is for SIC in the UE, to store the reencoded data
  LTE_eNB_DLSCH_t  *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX];

760
761
762
763
764
  //Paging parameters
  uint32_t              IMSImod1024;
  uint32_t              PF;
  uint32_t              PO;

765
  // For abstraction-purposes only
gauthier's avatar
gauthier committed
766
767
768
  uint8_t               sr[10];
  uint8_t               pucch_sel[10];
  uint8_t               pucch_payload[22];
769
770
771

  UE_MODE_t        UE_mode[NUMBER_OF_CONNECTED_eNB_MAX];
  /// cell-specific reference symbols
knopp's avatar
   
knopp committed
772
773
  uint32_t lte_gold_table[7][20][2][14];

774
  /// UE-specific reference symbols (p=5), TM 7
775
  uint32_t lte_gold_uespec_port5_table[20][38];
776

knopp's avatar
   
knopp committed
777
  /// ue-specific reference symbols
778
  uint32_t lte_gold_uespec_table[2][20][2][21];
779

knopp's avatar
   
knopp committed
780
781
  /// mbsfn reference symbols
  uint32_t lte_gold_mbsfn_table[10][3][42];
782

gauthier's avatar
gauthier committed
783
  uint32_t X_u[64][839];
784

785
  uint32_t high_speed_flag;
knopp's avatar
   
knopp committed
786
  uint32_t perfect_ce;
787
  int16_t ch_est_alpha;
788
789
  int generate_ul_signal[NUMBER_OF_CONNECTED_eNB_MAX];

790
  UE_SCAN_INFO_t scan_info[NB_BANDS_MAX];
791

792
793
  char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX];

794
795


796
797
798
  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];
799
800
  PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_eNB_MAX];
  int turbo_iterations, turbo_cntl_iterations;
801
802
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
knopp's avatar
   
knopp committed
803
  uint32_t total_TBS[NUMBER_OF_CONNECTED_eNB_MAX];
804
805
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
knopp's avatar
   
knopp committed
806
  uint32_t total_TBS_last[NUMBER_OF_CONNECTED_eNB_MAX];
807
808
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
knopp's avatar
   
knopp committed
809
  uint32_t bitrate[NUMBER_OF_CONNECTED_eNB_MAX];
810
811
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
knopp's avatar
   
knopp committed
812
  uint32_t total_received_bits[NUMBER_OF_CONNECTED_eNB_MAX];
813
814
815
816
817
818
819
820
821
  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];
822
823
  int dlsch_p_received[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_p_errors[NUMBER_OF_CONNECTED_eNB_MAX];
824
825
826
827
828
829
830
831
  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];
832
833
  int current_dlsch_cqi[NUMBER_OF_CONNECTED_eNB_MAX];
  unsigned char first_run_timing_advance[NUMBER_OF_CONNECTED_eNB_MAX];
gauthier's avatar
gauthier committed
834
835
836
837
  uint8_t               generate_prach;
  uint8_t               prach_cnt;
  uint8_t               prach_PreambleIndex;
  //  uint8_t               prach_timer;
838
839
  uint8_t               decode_SIB;
  uint8_t               decode_MIB;
840
  int              rx_offset; /// Timing offset
841
  int              rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
842
  int              time_sync_cell;
843
  int              timing_advance; ///timing advance signalled from eNB
844
  int              hw_timing_advance;
845
  int              N_TA_offset; ///timing offset used in TDD
846
  /// Flag to tell if UE is secondary user (cognitive mode)
847
  unsigned char    is_secondary_ue;
848
  /// Flag to tell if secondary eNB has channel estimates to create NULL-beams from.
849
  unsigned char    has_valid_precoder;
850
851
852
  /// hold the precoder for NULL beam to the primary eNB
  int              **ul_precoder_S_UE;
  /// holds the maximum channel/precoder coefficient
853
  char             log2_maxp;
854

855
856
857
  /// if ==0 enables phy only test mode
  int mac_enabled;

858
  /// Flag to initialize averaging of PHY measurements
859
  int init_averaging;
860

861
862
  /// \brief sinr for all subcarriers of the current link (used only for abstraction).
  /// - first index: ? [0..12*N_RB_DL[
863
  double *sinr_dB;
864

865
866
  /// \brief sinr for all subcarriers of first symbol for the CQI Calculation.
  /// - first index: ? [0..12*N_RB_DL[
867
868
  double *sinr_CQI_dB;

869
870
871
  /// sinr_effective used for CQI calulcation
  double sinr_eff;

872
873
  /// N0 (used for abstraction)
  double N0;
874

875
876
877
878
879
  /// 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];
880

881
882
883
884
885
886
887
  /// 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];

gauthier's avatar
gauthier committed
888
  uint8_t ncs_cell[20][7];
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906

  /// 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
gauthier's avatar
gauthier committed
907
  uint8_t transmission_mode[NUMBER_OF_CONNECTED_eNB_MAX];
908

909
  time_stats_t phy_proc[RX_NB_TH];
910
  time_stats_t phy_proc_tx;
911
  time_stats_t phy_proc_rx[RX_NB_TH];
912

913
914
  uint32_t use_ia_receiver;

915
916
917
918
919
920
921
922
923
  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;

Bilel's avatar
Bilel committed
924
  time_stats_t generic_stat;
925
  time_stats_t generic_stat_bis[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
926
927
928
929
930
931
  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];
Bilel's avatar
Bilel committed
932

933
  time_stats_t ofdm_demod_stats;
934
  time_stats_t dlsch_rx_pdcch_stats;
935
936
937
  time_stats_t rx_dft_stats;
  time_stats_t dlsch_channel_estimation_stats;
  time_stats_t dlsch_freq_offset_estimation_stats;
938
  time_stats_t dlsch_decoding_stats[2];
939
940
941
942
  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;
943
  time_stats_t dlsch_llr_stats[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
944
  time_stats_t dlsch_unscrambling_stats;
knopp's avatar
knopp committed
945
946
947
  time_stats_t dlsch_rate_matching_stats;
  time_stats_t dlsch_turbo_encoding_stats;
  time_stats_t dlsch_interleaving_stats;
948
949
950
951
952
953
954
  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;
955
  time_stats_t tx_prach;
956

knopp's avatar
knopp committed
957
  /// RF and Interface devices per CC
958
  openair0_device rfdevice;
959
960
961
962
963
964
  time_stats_t dlsch_encoding_SIC_stats;
  time_stats_t dlsch_scrambling_SIC_stats;
  time_stats_t dlsch_modulation_SIC_stats;
  time_stats_t dlsch_llr_stripping_unit_SIC_stats;
  time_stats_t dlsch_unscrambling_SIC_stats;

965
#if ENABLE_RAL
966
967
968
969
  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
knopp's avatar
knopp committed
970

971
972
} PHY_VARS_UE;

973
974
975
976
977
978
979
980
/* 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;
};

981
982
void exit_fun(const char* s);

983
static inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) {
984
985
986
987
988
989

  if (pthread_mutex_lock(mutex) != 0) {
    LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
990

991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
  while (*instance_cnt < 0) {
    // most of the time the thread is waiting here
    // proc->instance_cnt_rxtx is -1
    pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again
  }

  if (pthread_mutex_unlock(mutex) != 0) {
    LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
  return(0);
}

1005
static inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) {
1006
1007
1008
1009
1010
1011

  if (pthread_mutex_lock(mutex) != 0) {
    LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
1012

1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
  while (*instance_cnt == 0) {
    // most of the time the thread will skip this
    // waits only if proc->instance_cnt_rxtx is 0
    pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again
  }

  if (pthread_mutex_unlock(mutex) != 0) {
    LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
  return(0);
}

1027
static inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) {
1028
1029
1030
1031
1032
1033

  if (pthread_mutex_lock(mutex) != 0) {
    LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
1034

1035
  *instance_cnt=*instance_cnt-1;
1036

1037
1038
1039
1040
1041
1042
1043
  if (pthread_mutex_unlock(mutex) != 0) {
    LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
  return(0);
}
1044

1045
1046
1047
1048
1049
1050
1051
1052

#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"
Thomas Laurent's avatar
Thomas Laurent committed
1053
#endif
1054
#endif //  __PHY_DEFS__H__