defs.h 37.5 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * 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
 */

22
/*! \file LAYER2/MAC/defs.h
23
* \brief MAC data structures, constant, and function prototype
24
* \author Navid Nikaein and Raymond Knopp
25
26
* \date 2011
* \version 0.5
27
* \email navid.nikaein@eurecom.fr
28
29

*/
30
31
32
33
/** @defgroup _oai2  openair2 Reference Implementation
 * @ingroup _ref_implementation_
 * @{
 */
34

35
/*@}*/
36

37
38
39
40
41
42
43
44
45
46
47
48
49
#ifndef __LAYER2_MAC_DEFS_H__
#define __LAYER2_MAC_DEFS_H__



#ifdef USER_MODE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#endif

//#include "COMMON/openair_defs.h"

50
51
52
53


#include "PHY/defs.h"
#include "PHY/LTE_TRANSPORT/defs.h"
54
#include "COMMON/platform_constants.h"
55
#include "BCCH-BCH-Message.h"
56
57
58
59
60
61
#include "RadioResourceConfigCommon.h"
#include "RadioResourceConfigDedicated.h"
#include "MeasGapConfig.h"
#include "TDD-Config.h"
#include "RACH-ConfigCommon.h"
#include "MeasObjectToAddModList.h"
62
#include "MobilityControlInfo.h"
Cedric Roux's avatar
Cedric Roux committed
63
#if defined(Rel10) || defined(Rel14)
64
65
66
#include "MBSFN-AreaInfoList-r9.h"
#include "MBSFN-SubframeConfigList.h"
#include "PMCH-InfoList-r9.h"
knopp's avatar
   
knopp committed
67
#include "SCellToAddMod-r10.h"
68
69
#endif

70
71
#include "nfapi_interface.h"
#include "PHY_INTERFACE/IF_Module.h"
72

73
74
/** @defgroup _mac  MAC
 * @ingroup _oai2
75
76
77
 * @{
 */

78
#define BCCH_PAYLOAD_SIZE_MAX 128
79
#define CCCH_PAYLOAD_SIZE_MAX 128
80
#define PCCH_PAYLOAD_SIZE_MAX 128
81
#define RAR_PAYLOAD_SIZE_MAX 128
82

83
84
85
#define SCH_PAYLOAD_SIZE_MAX 4096
/// Logical channel ids from 36-311 (Note BCCH is not specified in 36-311, uses the same as first DRB)

Cedric Roux's avatar
Cedric Roux committed
86
#if defined(Rel10) || defined(Rel14)
87

88
// Mask for identifying subframe for MBMS
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#define MBSFN_TDD_SF3 0x80// for TDD
#define MBSFN_TDD_SF4 0x40
#define MBSFN_TDD_SF7 0x20
#define MBSFN_TDD_SF8 0x10
#define MBSFN_TDD_SF9 0x08
#define MBSFN_FDD_SF1 0x80// for FDD
#define MBSFN_FDD_SF2 0x40
#define MBSFN_FDD_SF3 0x20
#define MBSFN_FDD_SF6 0x10
#define MBSFN_FDD_SF7 0x08
#define MBSFN_FDD_SF8 0x04

#define MAX_MBSFN_AREA 8
#define MAX_PMCH_perMBSFN 15
103
/*!\brief MAX MCCH payload size  */
104
#define MCCH_PAYLOAD_SIZE_MAX 128
105
//#define MCH_PAYLOAD_SIZE_MAX 16384// this value is using in case mcs and TBS index are high
106
107
108
109
110
111
#endif

#ifdef USER_MODE
#define printk printf
#endif //USER_MODE

112
/*!\brief Maximum number of logical channl group IDs */
113
#define MAX_NUM_LCGID 4
114
115
116
117
118
119
120
121
122
/*!\brief logical channl group ID 0 */
#define LCGID0 0
/*!\brief logical channl group ID 1 */
#define LCGID1 1
/*!\brief logical channl group ID 2 */
#define LCGID2 2
/*!\brief logical channl group ID 3 */
#define LCGID3 3
/*!\brief Maximum number of logical chanels */
123
#define MAX_NUM_LCID 11
124
/*!\brief Maximum number od control elemenets */
125
#define MAX_NUM_CE 5
126
/*!\brief Maximum number of random access process */
127
#define NB_RA_PROC_MAX 4
128
/*!\brief size of buffer status report table */
129
#define BSR_TABLE_SIZE 64
130
/*!\brief The power headroom reporting range is from -23 ...+40 dB and beyond, with step 1 */
131
#define PHR_MAPPING_OFFSET 23  // if ( x>= -23 ) val = floor (x + 23) 
132
/*!\brief maximum number of resource block groups */
133
#define N_RBG_MAX 25 // for 20MHz channel BW
134
/*!\brief minimum value for channel quality indicator */
135
#define MIN_CQI_VALUE  0
136
/*!\brief maximum value for channel quality indicator */
137
#define MAX_CQI_VALUE  15
138
139
140
141
/*!\briefmaximum number of supported bandwidth (1.4, 5, 10, 20 MHz) */
#define MAX_SUPPORTED_BW  4  
/*!\brief CQI values range from 1 to 15 (4 bits) */
#define CQI_VALUE_RANGE 16 
142

Bilel's avatar
Bilel committed
143
/*!\brief value for indicating BSR Timer is not running */
Bilel's avatar
Bilel committed
144
#define MAC_UE_BSR_TIMER_NOT_RUNNING   (0xFFFF)
145

146
147
148
#define LCID_EMPTY 0
#define LCID_NOT_EMPTY 1

Bilel's avatar
Bilel committed
149
150
151
152
153
154
/*!\brief minimum RLC PDU size to be transmitted = min RLC Status PDU or RLC UM PDU SN 5 bits */
#define MIN_RLC_PDU_SIZE    (2)

/*!\brief minimum MAC data needed for transmitting 1 min RLC PDU size + 1 byte MAC subHeader */
#define MIN_MAC_HDR_RLC_SIZE    (1 + MIN_RLC_PDU_SIZE)

155
156
157
/*!\brief maximum number of slices / groups */
#define MAX_NUM_SLICES 4 

158
159
160
/* 
 * eNB part 
 */ 
161

162
163
164
165
166

/* 
 * UE/ENB common part 
 */ 
/*!\brief MAC header of Random Access Response for Random access preamble identifier (RAPID) */
167
typedef struct {
gauthier's avatar
gauthier committed
168
169
170
  uint8_t RAPID:6;
  uint8_t T:1;
  uint8_t E:1;
171
172
} __attribute__((__packed__))RA_HEADER_RAPID;

173
/*!\brief  MAC header of Random Access Response for backoff indicator (BI)*/
174
typedef struct {
gauthier's avatar
gauthier committed
175
176
177
178
  uint8_t BI:4;
  uint8_t R:2;
  uint8_t T:1;
  uint8_t E:1;
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
} __attribute__((__packed__))RA_HEADER_BI;
/*
typedef struct {
  uint64_t padding:16;
  uint64_t t_crnti:16;
  uint64_t hopping_flag:1;
  uint64_t rb_alloc:10;
  uint64_t mcs:4;
  uint64_t TPC:3;
  uint64_t UL_delay:1;
  uint64_t cqi_req:1;
  uint64_t Timing_Advance_Command:11;  // first/2nd octet LSB
  uint64_t R:1;                        // octet MSB
  } __attribute__((__packed__))RAR_PDU;

typedef struct {
  uint64_t padding:16;
  uint64_t R:1;                        // octet MSB
  uint64_t Timing_Advance_Command:11;  // first/2nd octet LSB
  uint64_t cqi_req:1;
  uint64_t UL_delay:1;
  uint64_t TPC:3;
  uint64_t mcs:4;
  uint64_t rb_alloc:10;
  uint64_t hopping_flag:1;
  uint64_t t_crnti:16;
  } __attribute__((__packed__))RAR_PDU;

#define sizeof_RAR_PDU 6
*/
209
/*!\brief  MAC subheader short with 7bit Length field */
210
typedef struct {
gauthier's avatar
gauthier committed
211
212
213
214
215
  uint8_t LCID:5;  // octet 1 LSB
  uint8_t E:1;
  uint8_t R:2;     // octet 1 MSB
  uint8_t L:7;     // octet 2 LSB
  uint8_t F:1;     // octet 2 MSB
216
} __attribute__((__packed__))SCH_SUBHEADER_SHORT;
217
/*!\brief  MAC subheader long  with 15bit Length field */
218
typedef struct {
gauthier's avatar
gauthier committed
219
220
221
222
223
224
225
  uint8_t LCID:5;   // octet 1 LSB
  uint8_t E:1;
  uint8_t R:2;      // octet 1 MSB
  uint8_t L_MSB:7;
  uint8_t F:1;      // octet 2 MSB
  uint8_t L_LSB:8;
  uint8_t padding;
226
} __attribute__((__packed__))SCH_SUBHEADER_LONG;
227
/*!\brief MAC subheader short without length field */
228
typedef struct {
gauthier's avatar
gauthier committed
229
230
231
  uint8_t LCID:5;
  uint8_t E:1;
  uint8_t R:2;
232
233
} __attribute__((__packed__))SCH_SUBHEADER_FIXED;

234
/*!\brief  mac control element: short buffer status report for a specific logical channel group ID*/
235
typedef struct {
gauthier's avatar
gauthier committed
236
237
  uint8_t Buffer_size:6;  // octet 1 LSB
  uint8_t LCGID:2;        // octet 1 MSB
238
239
240
} __attribute__((__packed__))BSR_SHORT;

typedef BSR_SHORT BSR_TRUNCATED;
241
/*!\brief  mac control element: long buffer status report for all logical channel group ID*/
242
typedef struct {
fnabet's avatar
fnabet committed
243
244
245
246
  uint8_t Buffer_size3:6;
  uint8_t Buffer_size2:6;
  uint8_t Buffer_size1:6;
  uint8_t Buffer_size0:6;
247
248
249
} __attribute__((__packed__))BSR_LONG;

#define BSR_LONG_SIZE  (sizeof(BSR_LONG))
250
/*!\brief  mac control element: timing advance  */
251
typedef struct {
gauthier's avatar
gauthier committed
252
253
  uint8_t TA:6;
  uint8_t R:2;
254
} __attribute__((__packed__))TIMING_ADVANCE_CMD;
255
/*!\brief  mac control element: power headroom report  */
256
typedef struct {
gauthier's avatar
gauthier committed
257
258
  uint8_t PH:6;
  uint8_t R:2;
259
260
} __attribute__((__packed__))POWER_HEADROOM_CMD;

261
/*! \brief MIB payload */
262
typedef struct {
263
264
  uint8_t payload[3] ;
} __attribute__((__packed__))MIB_PDU;
265
/*! \brief CCCH payload */
266
typedef struct {
267
  uint8_t payload[CCCH_PAYLOAD_SIZE_MAX] ;
268
} __attribute__((__packed__))CCCH_PDU;
269
/*! \brief BCCH payload */
270
typedef struct {
271
  uint8_t payload[BCCH_PAYLOAD_SIZE_MAX] ;
272
} __attribute__((__packed__))BCCH_PDU;
273
274
275
276
/*! \brief RAR payload */
typedef struct {
  uint8_t payload[RAR_PAYLOAD_SIZE_MAX];
} __attribute__ ((__packed__)) RAR_PDU;
277
278
279
280
/*! \brief BCCH payload */
typedef struct {
  uint8_t payload[PCCH_PAYLOAD_SIZE_MAX] ;
} __attribute__((__packed__))PCCH_PDU;
281

Cedric Roux's avatar
Cedric Roux committed
282
#if defined(Rel10) || defined(Rel14)
283
/*! \brief MCCH payload */
284
typedef struct {
285
  uint8_t payload[MCCH_PAYLOAD_SIZE_MAX] ;
286
} __attribute__((__packed__))MCCH_PDU;
287
/*!< \brief MAC control element for activation and deactivation of component carriers */
288
289
290
291
292
293
294
295
296
297
typedef struct {
  uint8_t C7:1;/*!< \brief Component carrier 7 */
  uint8_t C6:1;/*!< \brief Component carrier 6 */
  uint8_t C5:1;/*!< \brief Component carrier 5 */
  uint8_t C4:1;/*!< \brief Component carrier 4 */
  uint8_t C3:1;/*!< \brief Component carrier 3 */
  uint8_t C2:1;/*!< \brief Component carrier 2 */
  uint8_t C1:1;/*!< \brief Component carrier 1 */
  uint8_t R:1;/*!< \brief Reserved  */
} __attribute__((__packed__))CC_ELEMENT;
298
/*! \brief MAC control element: MCH Scheduling Information */
299
typedef struct {
gauthier's avatar
gauthier committed
300
301
302
  uint8_t stop_sf_MSB:3; // octet 1 LSB
  uint8_t lcid:5;        // octet 2 MSB
  uint8_t stop_sf_LSB:8;
303
} __attribute__((__packed__))MSI_ELEMENT;
304
305
#endif
/*! \brief Values of CCCH LCID for DLSCH */ 
306
#define CCCH_LCHANID 0
307
/*!\brief Values of BCCH logical channel (fake)*/
308
#define BCCH 3  // SI 
309
/*!\brief Values of PCCH logical channel (fake)*/
310
#define PCCH 4  // Paging 
311
312
/*!\brief Values of PCCH logical channel (fake) */
#define MIBCH 5  // MIB 
313
314
315
316
317
318
319
320
321
322
323
324
325
326
/*!\brief Value of CCCH / SRB0 logical channel */
#define CCCH 0  // srb0
/*!\brief DCCH / SRB1 logical channel */
#define DCCH 1  // srb1
/*!\brief DCCH1 / SRB2  logical channel */
#define DCCH1 2 // srb2
/*!\brief DTCH DRB1  logical channel */
#define DTCH 3 // LCID
/*!\brief MCCH logical channel */
#define MCCH 4 
/*!\brief MTCH logical channel */
#define MTCH 1 
// DLSCH LCHAN ID
/*!\brief LCID of UE contention resolution identity for DLSCH*/
327
#define UE_CONT_RES 28
328
/*!\brief LCID of timing advance for DLSCH */
329
#define TIMING_ADV_CMD 29
330
/*!\brief LCID of discontinous reception mode for DLSCH */
331
#define DRX_CMD 30
332
/*!\brief LCID of padding LCID for DLSCH */
333
334
#define SHORT_PADDING 31

Cedric Roux's avatar
Cedric Roux committed
335
#if defined(Rel10) || defined(Rel14)
336
// MCH LCHAN IDs (table6.2.1-4 TS36.321)
337
/*!\brief LCID of MCCH for DL */
338
#define MCCH_LCHANID 0
339
340
341
/*!\brief LCID of MCH scheduling info for DL */
#define MCH_SCHDL_INFO 3
/*!\brief LCID of Carrier component activation/deactivation */
342
#define CC_ACT_DEACT 27
343
344
345
#endif

// ULSCH LCHAN IDs
346
/*!\brief LCID of extended power headroom for ULSCH */
347
#define EXTENDED_POWER_HEADROOM 25
348
/*!\brief LCID of power headroom for ULSCH */
349
#define POWER_HEADROOM 26
350
/*!\brief LCID of CRNTI for ULSCH */
351
#define CRNTI 27
352
/*!\brief LCID of truncated BSR for ULSCH */
353
#define TRUNCATED_BSR 28
354
/*!\brief LCID of short BSR for ULSCH */
355
#define SHORT_BSR 29
356
/*!\brief LCID of long BSR for ULSCH */
357
#define LONG_BSR 30
fnabet's avatar
fnabet committed
358
359
360
361
362
/*!\bitmaps for BSR Triggers */
#define	BSR_TRIGGER_NONE		(0)			/* No BSR Trigger */
#define	BSR_TRIGGER_REGULAR		(1)			/* For Regular and ReTxBSR Expiry Triggers */
#define	BSR_TRIGGER_PERIODIC	(2)			/* For BSR Periodic Timer Expiry Trigger */
#define	BSR_TRIGGER_PADDING		(4)			/* For Padding BSR Trigger */
363
364


365
/*! \brief Downlink SCH PDU Structure */
366
typedef struct {
367
  uint8_t payload[8][SCH_PAYLOAD_SIZE_MAX];
gauthier's avatar
gauthier committed
368
  uint16_t Pdu_size[8];
369
370
} __attribute__ ((__packed__)) DLSCH_PDU;

371

372
/*! \brief MCH PDU Structure */
373
typedef struct {
gauthier's avatar
gauthier committed
374
375
  int8_t payload[SCH_PAYLOAD_SIZE_MAX];
  uint16_t Pdu_size;
376
  uint8_t mcs;
377
378
379
  uint8_t sync_area;
  uint8_t msi_active;
  uint8_t mcch_active;
380
  uint8_t mtch_active;
381
382
} __attribute__ ((__packed__)) MCH_PDU;

383
/*! \brief Uplink SCH PDU Structure */
384
typedef struct {
gauthier's avatar
gauthier committed
385
386
  int8_t payload[SCH_PAYLOAD_SIZE_MAX];         /*!< \brief SACH payload */
  uint16_t Pdu_size;
387
388
389
390
} __attribute__ ((__packed__)) ULSCH_PDU;

#include "PHY/impl_defs_top.h"

391
/*!\brief  UE ULSCH scheduling states*/
392
393
394
typedef enum {
  S_UL_NONE =0,
  S_UL_WAITING,
395
396
  S_UL_SCHEDULED,
  S_UL_BUFFERED,
397
398
399
  S_UL_NUM_STATUS
} UE_ULSCH_STATUS;

400
/*!\brief  UE DLSCH scheduling states*/
401
402
403
typedef enum {
  S_DL_NONE =0,
  S_DL_WAITING,
404
405
  S_DL_SCHEDULED,
  S_DL_BUFFERED,
406
407
408
  S_DL_NUM_STATUS
} UE_DLSCH_STATUS;

409
/*!\brief  scheduling policy for the contention-based access */
410
typedef enum {
411
412
413
414
415
  CBA_ES=0, /// equal share of RB among groups w
  CBA_ES_S,  /// equal share of RB among groups with small allocation
  CBA_PF, /// proportional fair (kind of)
  CBA_PF_S,  /// proportional fair (kind of) with small RB allocation
  CBA_RS /// random allocation
416
417
418
} CBA_POLICY;


419
/*! \brief temporary struct for ULSCH sched */
420
typedef struct {
gauthier's avatar
gauthier committed
421
  rnti_t rnti;
gauthier's avatar
gauthier committed
422
423
  uint16_t subframe;
  uint16_t serving_num;
424
425
  UE_ULSCH_STATUS status;
} eNB_ULSCH_INFO;
426
/*! \brief temp struct for DLSCH sched */
427
typedef struct {
gauthier's avatar
gauthier committed
428
  rnti_t rnti;
gauthier's avatar
gauthier committed
429
430
431
  uint16_t weight;
  uint16_t subframe;
  uint16_t serving_num;
432
433
  UE_DLSCH_STATUS status;
} eNB_DLSCH_INFO;
434
/*! \brief eNB overall statistics */
435
typedef struct {
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
  /// num BCCH PDU per CC 
  uint32_t total_num_bcch_pdu;
  /// BCCH buffer size  
  uint32_t bcch_buffer;
  /// total BCCH buffer size  
  uint32_t total_bcch_buffer;
  /// BCCH MCS
  uint32_t bcch_mcs;

  /// num CCCH PDU per CC 
  uint32_t total_num_ccch_pdu;
  /// BCCH buffer size  
  uint32_t ccch_buffer;
  /// total BCCH buffer size  
  uint32_t total_ccch_buffer;
  /// BCCH MCS
  uint32_t ccch_mcs;

/// num active users
455
456
457
458
459
  uint16_t num_dlactive_UEs;
  ///  available number of PRBs for a give SF
  uint16_t available_prbs;
  /// total number of PRB available for the user plane
  uint32_t total_available_prbs;
460
461
  /// aggregation
  /// total avilable nccc : num control channel element
462
  uint16_t available_ncces;
463
464
  // only for a new transmission, should be extended for retransmission
  // current dlsch  bit rate for all transport channels
465
466
467
468
469
  uint32_t dlsch_bitrate;
  //
  uint32_t dlsch_bytes_tx;
  //
  uint32_t dlsch_pdus_tx;
470
  //
471
472
473
474
475
  uint32_t total_dlsch_bitrate;
  //
  uint32_t total_dlsch_bytes_tx;
  //
  uint32_t total_dlsch_pdus_tx;
476
477
  
  // here for RX
478
479
480
481
482
  //
  uint32_t ulsch_bitrate;
  //
  uint32_t ulsch_bytes_rx;
  //
483
484
485
486
487
488
489
490
  uint64_t ulsch_pdus_rx; 

  uint32_t total_ulsch_bitrate;
  //
  uint32_t total_ulsch_bytes_rx;
  //
  uint32_t total_ulsch_pdus_rx;
  
491
492
493
494
495
496
497
  
  /// MAC agent-related stats
  /// total number of scheduling decisions
  int sched_decisions;
  /// missed deadlines
  int missed_deadlines;

498
} eNB_STATS;
499
/*! \brief eNB statistics for the connected UEs*/
500
typedef struct {
501
502

  /// CRNTI of UE
gauthier's avatar
gauthier committed
503
  rnti_t crnti; ///user id (rnti) of connected UEs
504
  // rrc status
505
506
507
  uint8_t rrc_status;
  /// harq pid
  uint8_t harq_pid;
508
  /// harq rounf
509
  uint8_t harq_round;
510
  /// DL Wideband CQI index (2 TBs)
511
512
513
514
515
  uint8_t dl_cqi;
  /// total available number of PRBs for a new transmission
  uint16_t rbs_used;
  /// total available number of PRBs for a retransmission
  uint16_t rbs_used_retx;
516
  /// total nccc used for a new transmission: num control channel element
517
  uint16_t ncce_used;
518
  /// total avilable nccc for a retransmission: num control channel element
519
  uint16_t ncce_used_retx;
520
521

  // mcs1 before the rate adaptaion
522
  uint8_t dlsch_mcs1;
523
  /// Target mcs2 after rate-adaptation
524
  uint8_t dlsch_mcs2;
525
  //  current TBS with mcs2
526
  uint32_t TBS;
527
  //  total TBS with mcs2
528
  //  uint32_t total_TBS;
529
  //  total rb used for a new transmission
530
  uint32_t total_rbs_used;
531
  //  total rb used for retransmission
532
  uint32_t total_rbs_used_retx;
533

534
   /// TX
535
536
537
538
539
540
541
542
  /// Num pkt
  uint32_t num_pdu_tx[NB_RB_MAX];
  /// num bytes
  uint32_t num_bytes_tx[NB_RB_MAX];
  /// num retransmission / harq
  uint32_t num_retransmission;
  /// instantaneous tx throughput for each TTI
  //  uint32_t tti_throughput[NB_RB_MAX];
543
544

  /// overall
545
  //
546
547
548
549
  uint32_t  dlsch_bitrate;
  //total
  uint32_t  total_dlsch_bitrate;
  /// headers+ CE +  padding bytes for a MAC PDU
550
  uint64_t overhead_bytes;
551
  /// headers+ CE +  padding bytes for a MAC PDU
552
  uint64_t total_overhead_bytes;
553
  /// headers+ CE +  padding bytes for a MAC PDU
554
  uint64_t avg_overhead_bytes;
555
  // MAC multiplexed payload
556
557
558
  uint64_t total_sdu_bytes;
  // total MAC pdu bytes
  uint64_t total_pdu_bytes;
559

560
561
562
563
  // total num pdu
  uint32_t total_num_pdus;
  //
  //  uint32_t avg_pdu_size;
564
565

  /// RX
566

567
568
569
570
571
572
  /// PUCCH1a/b power (dBm)
  int32_t Po_PUCCH_dBm;
  /// Indicator that Po_PUCCH has been updated by PHY
  int32_t Po_PUCCH_update;
  /// Uplink measured RSSI
  int32_t UL_rssi;
573
574
575
576
577
  /// preassigned mcs after rate adaptation
  uint8_t ulsch_mcs1;
  /// adjusted mcs
  uint8_t ulsch_mcs2;

578
579
580
581
  /// estimated average pdu inter-departure time
  uint32_t avg_pdu_idt;
  /// estimated average pdu size
  uint32_t avg_pdu_ps;
582
  ///
583
584
  uint32_t aggregated_pdu_size;
  uint32_t aggregated_pdu_arrival;
585

586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
  ///  uplink transport block size
  uint32_t ulsch_TBS;

  ///  total rb used for a new uplink transmission
  uint32_t num_retransmission_rx;
  ///  total rb used for a new uplink transmission
  uint32_t rbs_used_rx;
   ///  total rb used for a new uplink retransmission
  uint32_t rbs_used_retx_rx;
  ///  total rb used for a new uplink transmission
  uint32_t total_rbs_used_rx;
  /// normalized rx power 
  int32_t      normalized_rx_power;
   /// target rx power 
  int32_t    target_rx_power;

602
  /// num rx pdu
603
  uint32_t num_pdu_rx[NB_RB_MAX];
604
  /// num bytes rx
605
  uint32_t num_bytes_rx[NB_RB_MAX];
606
  /// instantaneous rx throughput for each TTI
607
  //  uint32_t tti_goodput[NB_RB_MAX];
608
609
  /// errors
  uint32_t num_errors_rx;
610
611
612
613
614
615
616
617
618
619
  
  uint64_t overhead_bytes_rx;
  /// headers+ CE +  padding bytes for a MAC PDU
  uint64_t total_overhead_bytes_rx;
  /// headers+ CE +  padding bytes for a MAC PDU
  uint64_t avg_overhead_bytes_rx;
 //
  uint32_t  ulsch_bitrate;
  //total
  uint32_t  total_ulsch_bitrate;
620
  /// overall
621
622
  ///  MAC pdu bytes
  uint64_t pdu_bytes_rx;
623
  /// total MAC pdu bytes
624
  uint64_t total_pdu_bytes_rx;
625
  /// total num pdu
626
  uint32_t total_num_pdus_rx;
627
  /// num of error pdus
628
  uint32_t total_num_errors_rx;
629

630
} eNB_UE_STATS;
631
/*! \brief eNB template for UE context information  */
632
typedef struct {
633
  /// C-RNTI of UE
gauthier's avatar
gauthier committed
634
  rnti_t rnti;
635
636
  /// NDI from last scheduling
  uint8_t oldNDI[8];
637
638
639
640
  /// mcs1 from last scheduling
  uint8_t oldmcs1[8];
  /// mcs2 from last scheduling
  uint8_t oldmcs2[8];
641
642
  /// NDI from last UL scheduling
  uint8_t oldNDI_UL[8];
643
  /// Flag to indicate UL has been scheduled at least once
gauthier's avatar
gauthier committed
644
  boolean_t ul_active;
knopp's avatar
   
knopp committed
645
646
  /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received)
  boolean_t configured;
647

648
649
650
651
652
653
  /// MCS from last scheduling
  uint8_t mcs[8];

  /// TPC from last scheduling
  uint8_t oldTPC[8];

654
655
656
  // PHY interface info

  /// Number of Allocated RBs for DL after scheduling (prior to frequency allocation)
657
  uint16_t nb_rb[8]; // num_max_harq
658

659
  /// Number of Allocated RBs for UL after scheduling
660
  uint16_t nb_rb_ul[8]; // num_max_harq
661

662
663
664
665
666
667
  /// Number of Allocated RBs for UL after scheduling
  uint16_t first_rb_ul[8]; // num_max_harq

  /// Cyclic shift for DMRS after scheduling
  uint16_t cshift[8]; // num_max_harq

668
669
  /// Number of Allocated RBs by the ulsch preprocessor
  uint8_t pre_allocated_nb_rb_ul;
670

671
672
  /// index of Allocated RBs by the ulsch preprocessor
  int8_t pre_allocated_rb_table_index_ul;
673

674
675
  /// total allocated RBs
  int8_t total_allocated_rbs;
676

677
  /// pre-assigned MCS by the ulsch preprocessor
678
  uint8_t pre_assigned_mcs_ul;
679
680
681
682

  /// assigned MCS by the ulsch scheduler
  uint8_t assigned_mcs_ul;

683
  /// DL DAI
gauthier's avatar
gauthier committed
684
  uint8_t DAI;
685
686

  /// UL DAI
gauthier's avatar
gauthier committed
687
  uint8_t DAI_ul[10];
688
689

  /// UL Scheduling Request Received
gauthier's avatar
gauthier committed
690
  uint8_t ul_SR;
691

692
  ///Resource Block indication for each sub-band in MU-MIMO
gauthier's avatar
gauthier committed
693
  uint8_t rballoc_subband[8][50];
694
695
696

  // Logical channel info for link with RLC

697
  /// Last received UE BSR info for each logical channel group id
gauthier's avatar
gauthier committed
698
  uint8_t bsr_info[MAX_NUM_LCGID];
699

700
701
702
  /// LCGID mapping
  long lcgidmap[11];

703
  /// phr information
704
  int8_t phr_info;
705

706
707
708
  /// phr information
  int8_t phr_info_configured;

709
  ///dl buffer info
gauthier's avatar
gauthier committed
710
  uint32_t dl_buffer_info[MAX_NUM_LCID];
711
  /// total downlink buffer info
gauthier's avatar
gauthier committed
712
  uint32_t dl_buffer_total;
713
  /// total downlink pdus
gauthier's avatar
gauthier committed
714
  uint32_t dl_pdus_total;
715
  /// downlink pdus for each LCID
gauthier's avatar
gauthier committed
716
  uint32_t dl_pdus_in_buffer[MAX_NUM_LCID];
717
  /// creation time of the downlink buffer head for each LCID
gauthier's avatar
gauthier committed
718
  uint32_t dl_buffer_head_sdu_creation_time[MAX_NUM_LCID];
719
  /// maximum creation time of the downlink buffer head across all LCID
720
  uint32_t  dl_buffer_head_sdu_creation_time_max;
721
  /// a flag indicating that the downlink head SDU is segmented  
gauthier's avatar
gauthier committed
722
  uint8_t    dl_buffer_head_sdu_is_segmented[MAX_NUM_LCID];
723
  /// size of remaining size to send for the downlink head SDU
gauthier's avatar
gauthier committed
724
  uint32_t dl_buffer_head_sdu_remaining_size_to_send[MAX_NUM_LCID];
725

726
  /// total uplink buffer size 
727
  uint32_t ul_total_buffer;
728
  /// uplink buffer creation time for each LCID
729
  uint32_t ul_buffer_creation_time[MAX_NUM_LCGID];
730
  /// maximum uplink buffer creation time across all the LCIDs
731
  uint32_t ul_buffer_creation_time_max;
732
  /// uplink buffer size per LCID
733
734
  uint32_t ul_buffer_info[MAX_NUM_LCGID];

735
736
737
  /// UE tx power
  int32_t ue_tx_power;

kaltenbe's avatar
kaltenbe committed
738
  /// stores the frame where the last TPC was transmitted
knopp's avatar
knopp committed
739
740
741
742
  uint32_t pusch_tpc_tx_frame;
  uint32_t pusch_tpc_tx_subframe;
  uint32_t pucch_tpc_tx_frame;
  uint32_t pucch_tpc_tx_subframe;
kaltenbe's avatar
kaltenbe committed
743

744
745
746
#ifdef LOCALIZATION
  eNB_UE_estimated_distances distance;
#endif
747
748
} UE_TEMPLATE;

749
/*! \brief scheduling control information set through an API (not used)*/
750
typedef struct {
751
  ///UL transmission bandwidth in RBs
752
  uint8_t ul_bandwidth[MAX_NUM_LCID];
753
  ///DL transmission bandwidth in RBs
754
  uint8_t dl_bandwidth[MAX_NUM_LCID];
755

756
757
  //To do GBR bearer
  uint8_t min_ul_bandwidth[MAX_NUM_LCID];
758

759
  uint8_t min_dl_bandwidth[MAX_NUM_LCID];
760

761
  ///aggregated bit rate of non-gbr bearer per UE
762
  uint64_t  ue_AggregatedMaximumBitrateDL;
763
  ///aggregated bit rate of non-gbr bearer per UE
764
  uint64_t  ue_AggregatedMaximumBitrateUL;
765
  ///CQI scheduling interval in subframes.
766
  uint16_t cqiSchedInterval;
767
  ///Contention resolution timer used during random access
768
  uint8_t mac_ContentionResolutionTimer;
769

770
  uint16_t max_allowed_rbs[MAX_NUM_LCID];
771

772
  uint8_t max_mcs[MAX_NUM_LCID];
773

774
  uint16_t priority[MAX_NUM_LCID];
775

776
777
778
  // resource scheduling information
  uint8_t       harq_pid[MAX_NUM_CCs];
  uint8_t       round[MAX_NUM_CCs];
779
  uint8_t       round_UL[MAX_NUM_CCs];
780
781
782
  uint8_t       dl_pow_off[MAX_NUM_CCs];
  uint16_t      pre_nb_available_rbs[MAX_NUM_CCs];
  unsigned char rballoc_sub_UE[MAX_NUM_CCs][N_RBG_MAX];
783
  uint16_t      ta_timer;
784
785
  int16_t       ta_update;
  int32_t       context_active_timer;
786
  int32_t       cqi_req_timer;
787
  int32_t       ul_inactivity_timer;
788
  int32_t       ul_failure_timer;
789
  int32_t       ul_scheduled;
790
  int32_t       ra_pdcch_order_sent;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
791
  int32_t       ul_out_of_sync;
792
  int32_t       phr_received;
793
} UE_sched_ctrl;
794
/*! \brief eNB template for the Random access information */
795
796
typedef struct {
  /// Flag to indicate this process is active
gauthier's avatar
gauthier committed
797
  boolean_t RA_active;
798
  /// Size of DCI for RA-Response (bytes)
gauthier's avatar
gauthier committed
799
  uint8_t RA_dci_size_bytes1;
800
  /// Size of DCI for RA-Response (bits)
gauthier's avatar
gauthier committed
801
  uint8_t RA_dci_size_bits1;
802
  /// Actual DCI to transmit for RA-Response
gauthier's avatar
gauthier committed
803
  uint8_t RA_alloc_pdu1[(MAX_DCI_SIZE_BITS>>3)+1];
804
  /// DCI format for RA-Response (should be 1A)
gauthier's avatar
gauthier committed
805
  uint8_t RA_dci_fmt1;
806
  /// Size of DCI for Msg4/ContRes (bytes)
gauthier's avatar
gauthier committed
807
  uint8_t RA_dci_size_bytes2;
808
  /// Size of DCI for Msg4/ContRes (bits)
gauthier's avatar
gauthier committed
809
  uint8_t RA_dci_size_bits2;
810
  /// Actual DCI to transmit for Msg4/ContRes
gauthier's avatar
gauthier committed
811
  uint8_t RA_alloc_pdu2[(MAX_DCI_SIZE_BITS>>3)+1];
812
  /// DCI format for Msg4/ContRes (should be 1A)
gauthier's avatar
gauthier committed
813
  uint8_t RA_dci_fmt2;
814
  /// Flag to indicate the eNB should generate RAR.  This is triggered by detection of PRACH
gauthier's avatar
gauthier committed
815
  uint8_t generate_rar;
816
  /// Subframe where preamble was received
gauthier's avatar
gauthier committed
817
  uint8_t preamble_subframe;
818
  /// Subframe where Msg3 is to be sent
gauthier's avatar
gauthier committed
819
  uint8_t Msg3_subframe;
820
  /// Flag to indicate the eNB should generate Msg4 upon reception of SDU from RRC.  This is triggered by first ULSCH reception at eNB for new user.
821
  uint8_t generate_Msg4;
822
  /// Flag to indicate that eNB is waiting for ACK that UE has received Msg3.
gauthier's avatar
gauthier committed
823
  uint8_t wait_ack_Msg4;
824
  /// UE RNTI allocated during RAR
gauthier's avatar
gauthier committed
825
  rnti_t rnti;
826
  /// RA RNTI allocated from received PRACH
gauthier's avatar
gauthier committed
827
  uint16_t RA_rnti;
828
  /// Received preamble_index
gauthier's avatar
gauthier committed
829
  uint8_t preamble_index;
830
  /// Received UE Contention Resolution Identifier
gauthier's avatar
gauthier committed
831
  uint8_t cont_res_id[6];
832
  /// Timing offset indicated by PHY
gauthier's avatar
gauthier committed
833
  int16_t timing_offset;
834
  /// Timeout for RRC connection
gauthier's avatar
gauthier committed
835
  int16_t RRC_timer;
836
837
838
} RA_TEMPLATE;


839
/*! \brief subband bitmap confguration (for ALU icic algo purpose), in test phase */
840
841
842
843
844
845
846
typedef struct {
  uint8_t sbmap[NUMBER_OF_SUBBANDS_MAX]; //13 = number of SB MAX for 100 PRB
  uint8_t periodicity;
  uint8_t first_subframe;
  uint8_t sb_size;
  uint8_t nb_active_sb;
} SBMAP_CONF;
847
/*! \brief UE list used by eNB to order UEs/CC for scheduling*/ 
848
typedef struct {
849
  /// Dedicated information for UEs
850
  struct PhysicalConfigDedicated  *physicalConfigDedicated[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
851
  /// DLSCH pdu 
knopp's avatar
   
knopp committed
852
853
854
855
856
  DLSCH_PDU DLSCH_pdu[MAX_NUM_CCs][2][NUMBER_OF_UE_MAX];
  /// DCI template and MAC connection parameters for UEs
  UE_TEMPLATE UE_template[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
  /// DCI template and MAC connection for RA processes
  int pCC_id[NUMBER_OF_UE_MAX];
857
  /// sorted downlink component carrier for the scheduler 
knopp's avatar
   
knopp committed
858
  int ordered_CCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
859
  /// number of downlink active component carrier 
knopp's avatar
   
knopp committed
860
  int numactiveCCs[NUMBER_OF_UE_MAX];
861
  /// sorted uplink component carrier for the scheduler 
knopp's avatar
   
knopp committed
862
  int ordered_ULCCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
863
  /// number of uplink active component carrier 
knopp's avatar
   
knopp committed
864
  int numactiveULCCs[NUMBER_OF_UE_MAX];
865
  /// number of downlink active component carrier 
866
  uint8_t dl_CC_bitmap[NUMBER_OF_UE_MAX];
867
  /// eNB to UE statistics
knopp's avatar
   
knopp committed
868
  eNB_UE_STATS eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
869
  /// scheduling control info
knopp's avatar
   
knopp committed
870
871
  UE_sched_ctrl UE_sched_ctrl[NUMBER_OF_UE_MAX];
  int next[NUMBER_OF_UE_MAX];
872
  int head;
873
874
  int next_ul[NUMBER_OF_UE_MAX];
  int head_ul;
knopp's avatar
   
knopp committed
875
876
877
878
  int avail;
  int num_UEs;
  boolean_t active[NUMBER_OF_UE_MAX];
} UE_list_t;
879

880
/*! \brief eNB common channels */ 
881
typedef struct {
882
883
884
885
886
887
888
  int                              physCellId;
  int                              p_eNB;
  int                              Ncp;
  int                              eutra_band;
  uint32_t                         dl_CarrierFreq;
  BCCH_BCH_Message_t               *mib;
  RadioResourceConfigCommonSIB_t   *radioResourceConfigCommon;  
889
  RadioResourceConfigCommonSIB_t   *radioResourceConfigCommon_BR;  
890
891
892
893
894
  TDD_Config_t                     *tdd_Config;
  uint8_t                          SIwindowsize;
  uint16_t                         SIperiod;
  ARFCN_ValueEUTRA_t               ul_CarrierFreq;
  long                             ul_Bandwidth;
895
896
  /// Outgoing MIB PDU for PHY
  MIB_PDU MIB_pdu;
897
898
  /// Outgoing BCCH pdu for PHY
  BCCH_PDU BCCH_pdu;
899
900
  /// Outgoing BCCH DCI allocation
  uint32_t BCCH_alloc_pdu;
901
902
  /// Outgoing CCCH pdu for PHY
  CCCH_PDU CCCH_pdu;
903
904
905
  /// Outgoing RAR pdu for PHY
  RAR_PDU RAR_pdu;
  /// Template for RA computations
906
  RA_TEMPLATE RA_template[NB_RA_PROC_MAX];
907
908
  /// VRB map for common channels
  uint8_t vrb_map[100];
909
910
  /// MBSFN SubframeConfig
  struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8];
911
  /// number of subframe allocation pattern available for MBSFN sync area
gauthier's avatar
gauthier committed
912
  uint8_t num_sf_allocation_pattern;
Cedric Roux's avatar
Cedric Roux committed
913
#if defined(Rel10) || defined(Rel14)
914
  /// MBMS Flag
gauthier's avatar
gauthier committed
915
  uint8_t MBMS_flag;
916
917
918
  /// Outgoing MCCH pdu for PHY
  MCCH_PDU MCCH_pdu;
  /// MCCH active flag
gauthier's avatar
gauthier committed
919
  uint8_t msi_active;
920
  /// MCCH active flag
gauthier's avatar
gauthier committed
921
  uint8_t mcch_active;
922
  /// MTCH active flag
gauthier's avatar
gauthier committed
923
  uint8_t mtch_active;
924
  /// number of active MBSFN area
gauthier's avatar
gauthier committed
925
  uint8_t num_active_mbsfn_area;
926
927
928
929
930
931
932
933
934
  /// MBSFN Area Info
  struct  MBSFN_AreaInfo_r9 *mbsfn_AreaInfo[MAX_MBSFN_AREA];
  /// PMCH Config
  struct PMCH_Config_r9 *pmch_Config[MAX_PMCH_perMBSFN];
  /// MBMS session info list
  struct MBMS_SessionInfoList_r9 *mbms_SessionList[MAX_PMCH_perMBSFN];
  /// Outgoing MCH pdu for PHY
  MCH_PDU MCH_pdu;
#endif
935
} COMMON_channels_t;
936
/*! \brief top level eNB MAC structure */ 
937
typedef struct eNB_MAC_INST_s {
938
939
940
941
  /// Ethernet parameters for northbound midhaul interface
  eth_params_t         eth_params_n;
  /// Ethernet parameters for fronthaul interface
  eth_params_t         eth_params_s;
942
  ///
knopp's avatar