defs.h 36.4 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 55
#include "COMMON/platform_constants.h"
#include "COMMON/mac_rrc_primitives.h"
56
#include "BCCH-BCH-Message.h"
57 58 59 60 61 62
#include "RadioResourceConfigCommon.h"
#include "RadioResourceConfigDedicated.h"
#include "MeasGapConfig.h"
#include "TDD-Config.h"
#include "RACH-ConfigCommon.h"
#include "MeasObjectToAddModList.h"
63
#include "MobilityControlInfo.h"
Cedric Roux's avatar
Cedric Roux committed
64
#if defined(Rel10) || defined(Rel14)
65 66 67
#include "MBSFN-AreaInfoList-r9.h"
#include "MBSFN-SubframeConfigList.h"
#include "PMCH-InfoList-r9.h"
Raymond Knopp's avatar
 
Raymond Knopp committed
68
#include "SCellToAddMod-r10.h"
69 70 71 72 73 74
#endif

//#ifdef PHY_EMUL
//#include "SIMULATION/PHY_EMULATION/impl_defs.h"
//#endif

75 76
/** @defgroup _mac  MAC
 * @ingroup _oai2
77 78 79
 * @{
 */

80
#define BCCH_PAYLOAD_SIZE_MAX 128
81
#define CCCH_PAYLOAD_SIZE_MAX 128
82
#define PCCH_PAYLOAD_SIZE_MAX 128
83

84 85 86
#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
87
#if defined(Rel10) || defined(Rel14)
88

89
// Mask for identifying subframe for MBMS
90 91 92 93 94 95 96 97 98 99 100 101 102 103
#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
104
/*!\brief MAX MCCH payload size  */
105
#define MCCH_PAYLOAD_SIZE_MAX 128
106
//#define MCH_PAYLOAD_SIZE_MAX 16384// this value is using in case mcs and TBS index are high
107 108 109 110 111 112
#endif

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

113
/*!\brief Maximum number of logical channl group IDs */
114
#define MAX_NUM_LCGID 4
115 116 117 118 119 120 121 122 123
/*!\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 */
124
#define MAX_NUM_LCID 11
125
/*!\brief Maximum number od control elemenets */
126
#define MAX_NUM_CE 5
127
/*!\brief Maximum number of random access process */
128
#define NB_RA_PROC_MAX 4
129
/*!\brief size of buffer status report table */
130
#define BSR_TABLE_SIZE 64
131
/*!\brief The power headroom reporting range is from -23 ...+40 dB and beyond, with step 1 */
132
#define PHR_MAPPING_OFFSET 23  // if ( x>= -23 ) val = floor (x + 23) 
133
/*!\brief maximum number of resource block groups */
134
#define N_RBG_MAX 25 // for 20MHz channel BW
135
/*!\brief minimum value for channel quality indicator */
136
#define MIN_CQI_VALUE  0
137
/*!\brief maximum value for channel quality indicator */
138
#define MAX_CQI_VALUE  15
139 140 141 142
/*!\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 
143

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

147 148 149
#define LCID_EMPTY 0
#define LCID_NOT_EMPTY 1

hbilel's avatar
hbilel committed
150 151 152 153 154 155
/*!\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)

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

159 160 161
/* 
 * eNB part 
 */ 
162

163 164 165 166 167

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

174
/*!\brief  MAC header of Random Access Response for backoff indicator (BI)*/
175
typedef struct {
176 177 178 179
  uint8_t BI:4;
  uint8_t R:2;
  uint8_t T:1;
  uint8_t E:1;
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 209
} __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
*/
210
/*!\brief  MAC subheader short with 7bit Length field */
211
typedef struct {
212 213 214 215 216
  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
217
} __attribute__((__packed__))SCH_SUBHEADER_SHORT;
218
/*!\brief  MAC subheader long  with 15bit Length field */
219
typedef struct {
220 221 222 223 224 225 226
  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;
227
} __attribute__((__packed__))SCH_SUBHEADER_LONG;
228
/*!\brief MAC subheader short without length field */
229
typedef struct {
230 231 232
  uint8_t LCID:5;
  uint8_t E:1;
  uint8_t R:2;
233 234
} __attribute__((__packed__))SCH_SUBHEADER_FIXED;

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

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

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

262
/*!\brief  DCI PDU filled by MAC for the PHY  */
263
typedef struct {
264 265
  uint8_t Num_ue_spec_dci ;
  uint8_t Num_common_dci  ;
Raymond Knopp's avatar
Raymond Knopp committed
266
  //  uint32_t nCCE;
267
  uint32_t num_pdcch_symbols;
268 269
  DCI_ALLOC_t dci_alloc[NUM_DCI_MAX] ;
} DCI_PDU;
270
/*! \brief CCCH payload */
271
typedef struct {
272
  uint8_t payload[CCCH_PAYLOAD_SIZE_MAX] ;
273
} __attribute__((__packed__))CCCH_PDU;
274
/*! \brief BCCH payload */
275
typedef struct {
276
  uint8_t payload[BCCH_PAYLOAD_SIZE_MAX] ;
277
} __attribute__((__packed__))BCCH_PDU;
278 279 280 281
/*! \brief BCCH payload */
typedef struct {
  uint8_t payload[PCCH_PAYLOAD_SIZE_MAX] ;
} __attribute__((__packed__))PCCH_PDU;
282

Cedric Roux's avatar
Cedric Roux committed
283
#if defined(Rel10) || defined(Rel14)
284
/*! \brief MCCH payload */
285
typedef struct {
286
  uint8_t payload[MCCH_PAYLOAD_SIZE_MAX] ;
287
} __attribute__((__packed__))MCCH_PDU;
288
/*!< \brief MAC control element for activation and deactivation of component carriers */
289 290 291 292 293 294 295 296 297 298
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;
299
/*! \brief MAC control element: MCH Scheduling Information */
300
typedef struct {
301 302 303
  uint8_t stop_sf_MSB:3; // octet 1 LSB
  uint8_t lcid:5;        // octet 2 MSB
  uint8_t stop_sf_LSB:8;
304
} __attribute__((__packed__))MSI_ELEMENT;
305 306
#endif
/*! \brief Values of CCCH LCID for DLSCH */ 
307
#define CCCH_LCHANID 0
308 309
/*!\brief Values of BCCH logical channel */
#define BCCH 3  // SI 
310 311
/*!\brief Values of PCCH logical channel */
#define PCCH 4  // Paging 
312 313 314 315 316 317 318 319 320 321 322 323 324 325
/*!\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*/
326
#define UE_CONT_RES 28
327
/*!\brief LCID of timing advance for DLSCH */
328
#define TIMING_ADV_CMD 29
329
/*!\brief LCID of discontinous reception mode for DLSCH */
330
#define DRX_CMD 30
331
/*!\brief LCID of padding LCID for DLSCH */
332 333
#define SHORT_PADDING 31

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

// ULSCH LCHAN IDs
345
/*!\brief LCID of extended power headroom for ULSCH */
346
#define EXTENDED_POWER_HEADROOM 25
347
/*!\brief LCID of power headroom for ULSCH */
348
#define POWER_HEADROOM 26
349
/*!\brief LCID of CRNTI for ULSCH */
350
#define CRNTI 27
351
/*!\brief LCID of truncated BSR for ULSCH */
352
#define TRUNCATED_BSR 28
353
/*!\brief LCID of short BSR for ULSCH */
354
#define SHORT_BSR 29
355
/*!\brief LCID of long BSR for ULSCH */
356
#define LONG_BSR 30
357 358 359 360 361
/*!\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 */
362 363


364
/*! \brief Downlink SCH PDU Structure */
365
typedef struct {
366 367
  int8_t payload[8][SCH_PAYLOAD_SIZE_MAX];
  uint16_t Pdu_size[8];
368 369
} __attribute__ ((__packed__)) DLSCH_PDU;

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

381
/*! \brief Uplink SCH PDU Structure */
382
typedef struct {
383 384
  int8_t payload[SCH_PAYLOAD_SIZE_MAX];         /*!< \brief SACH payload */
  uint16_t Pdu_size;
385 386 387 388
} __attribute__ ((__packed__)) ULSCH_PDU;

#include "PHY/impl_defs_top.h"

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

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

407
/*!\brief  scheduling policy for the contention-based access */
408
typedef enum {
409 410 411 412 413
  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
414 415 416
} CBA_POLICY;


417
/*! \brief temporary struct for ULSCH sched */
418
typedef struct {
419
  rnti_t rnti;
420 421
  uint16_t subframe;
  uint16_t serving_num;
422 423
  UE_ULSCH_STATUS status;
} eNB_ULSCH_INFO;
424
/*! \brief temp struct for DLSCH sched */
425
typedef struct {
426
  rnti_t rnti;
427 428 429
  uint16_t weight;
  uint16_t subframe;
  uint16_t serving_num;
430 431
  UE_DLSCH_STATUS status;
} eNB_DLSCH_INFO;
432
/*! \brief eNB overall statistics */
433
typedef struct {
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
  /// 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
453 454 455 456 457
  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;
458 459
  /// aggregation
  /// total avilable nccc : num control channel element
460
  uint16_t available_ncces;
461 462
  // only for a new transmission, should be extended for retransmission
  // current dlsch  bit rate for all transport channels
463 464 465 466 467
  uint32_t dlsch_bitrate;
  //
  uint32_t dlsch_bytes_tx;
  //
  uint32_t dlsch_pdus_tx;
468
  //
469 470 471 472 473
  uint32_t total_dlsch_bitrate;
  //
  uint32_t total_dlsch_bytes_tx;
  //
  uint32_t total_dlsch_pdus_tx;
474 475
  
  // here for RX
476 477 478 479 480
  //
  uint32_t ulsch_bitrate;
  //
  uint32_t ulsch_bytes_rx;
  //
481 482 483 484 485 486 487 488
  uint64_t ulsch_pdus_rx; 

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

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

  /// CRNTI of UE
501
  rnti_t crnti; ///user id (rnti) of connected UEs
502
  // rrc status
503 504 505
  uint8_t rrc_status;
  /// harq pid
  uint8_t harq_pid;
506
  /// harq rounf
507
  uint8_t harq_round;
508
  /// DL Wideband CQI index (2 TBs)
509 510 511 512 513
  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;
514
  /// total nccc used for a new transmission: num control channel element
515
  uint16_t ncce_used;
516
  /// total avilable nccc for a retransmission: num control channel element
517
  uint16_t ncce_used_retx;
518 519

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

532
   /// TX
533 534 535 536 537 538 539 540
  /// 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];
541 542

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

558 559 560 561
  // total num pdu
  uint32_t total_num_pdus;
  //
  //  uint32_t avg_pdu_size;
562 563

  /// RX
564 565 566 567 568 569

  /// preassigned mcs after rate adaptation
  uint8_t ulsch_mcs1;
  /// adjusted mcs
  uint8_t ulsch_mcs2;

570 571 572 573
  /// estimated average pdu inter-departure time
  uint32_t avg_pdu_idt;
  /// estimated average pdu size
  uint32_t avg_pdu_ps;
574
  ///
575 576
  uint32_t aggregated_pdu_size;
  uint32_t aggregated_pdu_arrival;
577

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

594
  /// num rx pdu
595
  uint32_t num_pdu_rx[NB_RB_MAX];
596
  /// num bytes rx
597
  uint32_t num_bytes_rx[NB_RB_MAX];
598
  /// instantaneous rx throughput for each TTI
599
  //  uint32_t tti_goodput[NB_RB_MAX];
600 601
  /// errors
  uint32_t num_errors_rx;
602 603 604 605 606 607 608 609 610 611
  
  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;
612
  /// overall
613 614
  ///  MAC pdu bytes
  uint64_t pdu_bytes_rx;
615
  /// total MAC pdu bytes
616
  uint64_t total_pdu_bytes_rx;
617
  /// total num pdu
618
  uint32_t total_num_pdus_rx;
619
  /// num of error pdus
620
  uint32_t total_num_errors_rx;
621

622
} eNB_UE_STATS;
623
/*! \brief eNB template for UE context information  */
624
typedef struct {
625
  /// C-RNTI of UE
626
  rnti_t rnti;
627 628 629 630
  /// NDI from last scheduling
  uint8_t oldNDI[8];
  /// NDI from last UL scheduling
  uint8_t oldNDI_UL[8];
631
  /// Flag to indicate UL has been scheduled at least once
Lionel Gauthier's avatar
Lionel Gauthier committed
632
  boolean_t ul_active;
Raymond Knopp's avatar
 
Raymond Knopp committed
633 634
  /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received)
  boolean_t configured;
635

636 637 638 639 640 641
  /// MCS from last scheduling
  uint8_t mcs[8];

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

642 643 644
  // PHY interface info

  /// DCI format for DLSCH
645
  uint16_t DLSCH_dci_fmt;
646

647
  /// Current Aggregation Level for DCI
648
  uint8_t DCI_aggregation_min;
649

650
  /// size of DLSCH size in bit 
651
  uint8_t DLSCH_dci_size_bits;
652 653

  /// DCI buffer for DLSCH
654 655 656
  /* rounded to 32 bits unit (actual value should be 8 due to the logic
   * of the function generate_dci0) */
  uint8_t DLSCH_DCI[8][(((MAX_DCI_SIZE_BITS)+31)>>5)*4];
657 658

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

  /// Number of Allocated RBs for UL after scheduling (prior to frequency allocation)
662
  uint16_t nb_rb_ul[8]; // num_max_harq
663

664 665
  /// Number of Allocated RBs by the ulsch preprocessor
  uint8_t pre_allocated_nb_rb_ul;
666

667 668
  /// index of Allocated RBs by the ulsch preprocessor
  int8_t pre_allocated_rb_table_index_ul;
669

670 671
  /// total allocated RBs
  int8_t total_allocated_rbs;
672

673
  /// pre-assigned MCS by the ulsch preprocessor
674
  uint8_t pre_assigned_mcs_ul;
675 676 677 678

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

679
  /// DCI buffer for ULSCH
680 681 682
  /* rounded to 32 bits unit (actual value should be 8 due to the logic
   * of the function generate_dci0) */
  uint8_t ULSCH_DCI[8][(((MAX_DCI_SIZE_BITS)+31)>>5)*4];
683 684

  /// DL DAI
685
  uint8_t DAI;
686 687

  /// UL DAI
688
  uint8_t DAI_ul[10];
689 690

  /// UL Scheduling Request Received
691
  uint8_t ul_SR;
692

693
  ///Resource Block indication for each sub-band in MU-MIMO
694
  uint8_t rballoc_subband[8][50];
695 696 697

  // Logical channel info for link with RLC

698
  /// Last received UE BSR info for each logical channel group id
699
  uint8_t bsr_info[MAX_NUM_LCGID];
700

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

704
  /// phr information
705
  int8_t phr_info;
706

707 708 709
  /// phr information
  int8_t phr_info_configured;

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

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

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

kaltenbe's avatar
kaltenbe committed
739
  /// stores the frame where the last TPC was transmitted
740 741 742 743
  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
744

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

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

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

760
  uint8_t min_dl_bandwidth[MAX_NUM_LCID];
761

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

771
  uint16_t max_allowed_rbs[MAX_NUM_LCID];
772

773
  uint8_t max_mcs[MAX_NUM_LCID];
774

775
  uint16_t priority[MAX_NUM_LCID];
776

777 778 779 780 781 782
  // resource scheduling information
  uint8_t       harq_pid[MAX_NUM_CCs];
  uint8_t       round[MAX_NUM_CCs];
  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;
kaltenbe's avatar
kaltenbe 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
Lionel Gauthier's avatar
Lionel Gauthier committed
797
  boolean_t RA_active;
798
  /// Size of DCI for RA-Response (bytes)
799
  uint8_t RA_dci_size_bytes1;
800
  /// Size of DCI for RA-Response (bits)
801
  uint8_t RA_dci_size_bits1;
802
  /// Actual DCI to transmit for RA-Response
803
  uint8_t RA_alloc_pdu1[(MAX_DCI_SIZE_BITS>>3)+1];
804
  /// DCI format for RA-Response (should be 1A)
805
  uint8_t RA_dci_fmt1;
806
  /// Size of DCI for Msg4/ContRes (bytes)
807
  uint8_t RA_dci_size_bytes2;
808
  /// Size of DCI for Msg4/ContRes (bits)
809
  uint8_t RA_dci_size_bits2;
810
  /// Actual DCI to transmit for Msg4/ContRes
811
  uint8_t RA_alloc_pdu2[(MAX_DCI_SIZE_BITS>>3)+1];
812
  /// DCI format for Msg4/ContRes (should be 1A)
813
  uint8_t RA_dci_fmt2;
814
  /// Flag to indicate the eNB should generate RAR.  This is triggered by detection of PRACH
815
  uint8_t generate_rar;
816
  /// Subframe where preamble was received
817
  uint8_t preamble_subframe;
818
  /// Subframe where Msg3 is to be sent
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.
823
  uint8_t wait_ack_Msg4;
824
  /// UE RNTI allocated during RAR
825
  rnti_t rnti;
826
  /// RA RNTI allocated from received PRACH
827
  uint16_t RA_rnti;
828
  /// Received preamble_index
829
  uint8_t preamble_index;
830
  /// Received UE Contention Resolution Identifier
831
  uint8_t cont_res_id[6];
832
  /// Timing offset indicated by PHY
833
  int16_t timing_offset;
834
  /// Timeout for RRC connection
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
  struct PhysicalConfigDedicated  *physicalConfigDedicated[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
850
  /// DLSCH pdu 
Raymond Knopp's avatar
 
Raymond Knopp committed
851 852 853 854 855
  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];
856
  /// sorted downlink component carrier for the scheduler 
Raymond Knopp's avatar
 
Raymond Knopp committed
857
  int ordered_CCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
858
  /// number of downlink active component carrier 
Raymond Knopp's avatar
 
Raymond Knopp committed
859
  int numactiveCCs[NUMBER_OF_UE_MAX];
860
  /// sorted uplink component carrier for the scheduler 
Raymond Knopp's avatar
 
Raymond Knopp committed
861
  int ordered_ULCCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
862
  /// number of uplink active component carrier 
Raymond Knopp's avatar
 
Raymond Knopp committed
863
  int numactiveULCCs[NUMBER_OF_UE_MAX];
864
  /// number of downlink active component carrier 
865
  uint8_t dl_CC_bitmap[NUMBER_OF_UE_MAX];
866
  /// eNB to UE statistics
Raymond Knopp's avatar
 
Raymond Knopp committed
867
  eNB_UE_STATS eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
868
  /// scheduling control info
Raymond Knopp's avatar
 
Raymond Knopp committed
869 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;
Raymond Knopp's avatar
 
Raymond 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 889 890 891 892 893
  int                              physCellId;
  int                              p_eNB;
  int                              Ncp;
  int                              eutra_band;
  uint32_t                         dl_CarrierFreq;
  BCCH_BCH_Message_t               *mib;
  RadioResourceConfigCommonSIB_t   *radioResourceConfigCommon;  
  TDD_Config_t                     *tdd_Config;
  uint8_t                          SIwindowsize;
  uint16_t                         SIperiod;
  ARFCN_ValueEUTRA_t               ul_CarrierFreq;
  long                             ul_Bandwidth;
894 895 896 897
  /// Outgoing DCI for PHY generated by eNB scheduler
  DCI_PDU DCI_pdu;
  /// Outgoing BCCH pdu for PHY
  BCCH_PDU BCCH_pdu;
898 899
  /// Outgoing BCCH DCI allocation
  uint32_t BCCH_alloc_pdu;
900 901 902
  /// Outgoing CCCH pdu for PHY
  CCCH_PDU CCCH_pdu;
  RA_TEMPLATE RA_template[NB_RA_PROC_MAX];
903 904
  /// VRB map for common channels
  uint8_t vrb_map[100];
905 906
  /// MBSFN SubframeConfig
  struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8];
907
  /// number of subframe allocation pattern available for MBSFN sync area
908
  uint8_t num_sf_allocation_pattern;
Cedric Roux's avatar
Cedric Roux committed
909
#if defined(Rel10) || defined(Rel14)
910
  /// MBMS Flag
911
  uint8_t MBMS_flag;
912 913 914
  /// Outgoing MCCH pdu for PHY
  MCCH_PDU MCCH_pdu;
  /// MCCH active flag
915
  uint8_t msi_active;
916
  /// MCCH active flag
917
  uint8_t mcch_active;
918
  /// MTCH active flag
919
  uint8_t mtch_active;
920
  /// number of active MBSFN area
921
  uint8_t num_active_mbsfn_area;
922 923 924 925 926 927 928 929 930 931
  /// 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
#ifdef CBA
932
  /// number of CBA groups 
933
  uint8_t num_active_cba_groups;
934
  /// RNTI for each CBA group 
935
  uint16_t cba_rnti[NUM_MAX_CBA_GROUP];
936
  /// MCS for each CBA group 
937
  uint8_t group_mcs[NUM_MAX_CBA_GROUP];
938 939
#endif
} COMMON_channels_t;
940
/*! \brief top level eNB MAC structure */ 
941
typedef struct eNB_MAC_INST_s {
942
  ///
Raymond Knopp's avatar
 
Raymond Knopp committed
943 944 945 946 947 948 949
  uint16_t Node_id;
  /// frame counter
  frame_t frame;
  /// subframe counter
  sub_frame_t subframe;
  /// Common cell resources
  COMMON_channels_t common_channels[MAX_NUM_CCs];
950

Raymond Knopp's avatar
 
Raymond Knopp committed
951
  UE_list_t UE_list;
952

953 954
  ///subband bitmap configuration
  SBMAP_CONF sbmap_conf;
955 956
  /// CCE table used to build DCI scheduling information
  int CCE_table[MAX_NUM_CCs][800];
957
  ///  active flag for Other lcid
958
  uint8_t lcid_active[NB_RB_MAX];
959
  /// eNB stats
960
  eNB_STATS eNB_stats[MAX_NUM_CCs];
961
  // MAC function execution peformance profiler
962
  /// processing time of eNB scheduler 
963
  time_stats_t eNB_scheduler;
964
  /// processing time of eNB scheduler for SI 
965
  time_stats_t schedule_si;
966
  /// processing time of eNB scheduler for Random access
967
  time_stats_t schedule_ra;
968
  /// processing time of eNB ULSCH scheduler 
969
  time_stats_t schedule_ulsch;
970
  /// processing time of eNB DCI generation
971
  time_stats_t fill_DLSCH_dci;
972
  /// processing time of eNB MAC preprocessor
973
  time_stats_t schedule_dlsch_preprocessor;
974
  /// processing time of eNB DLSCH scheduler 
975
  time_stats_t schedule_dlsch; // include rlc_data_req + MAC header + preprocessor
976
  /// processing time of eNB MCH scheduler 
977
  time_stats_t schedule_mch;
978
  /// processing time of eNB ULSCH reception
979
  time_stats_t rx_ulsch_sdu; // include rlc_data_ind
980
} eNB_MAC_INST;
981

982 983 984 985 986 987 988 989 990 991 992 993 994
/* 
 * UE part 
 */ 

/*!\brief UE layer 2 status */
typedef enum {
  CONNECTION_OK=0,
  CONNECTION_LOST,
  PHY_RESYNCH,
  PHY_HO_PRACH
} UE_L2_STATE_t;

/*!\brief UE scheduling info */
995 996
typedef struct {
  /// buffer status for each lcgid
997
  uint8_t  BSR[MAX_NUM_LCGID]; // should be more for mesh topology
fnabet's avatar
fnabet committed
998
  /// keep the number of bytes in rlc buffer for each lcgid
999
  int32_t  BSR_bytes[MAX_NUM_LCGID];
fnabet's avatar
fnabet committed
1000
  /// after multiplexing buffer remain for each lcid
1001
  int32_t  LCID_buffer_remain[MAX_NUM_LCID];
calvin wang's avatar
calvin wang committed
1002 1003
  /// sum of all lcid buffer size
  uint16_t  All_lcid_buffer_size_lastTTI;
1004
  /// buffer status for each lcid
1005
  uint8_t  LCID_status[MAX_NUM_LCID];
1006
  /// SR pending as defined in 36.321
1007
  uint8_t  SR_pending;
1008
  /// SR_COUNTER as defined in 36.321
1009
  uint16_t SR_COUNTER;
1010
  /// logical channel group ide for each LCID
1011
  uint8_t  LCGID[MAX_NUM_LCID];
1012
  /// retxBSR-Timer, default value is sf2560
1013
  uint16_t retxBSR_Timer;
1014
  /// retxBSR_SF, number of subframe before triggering a regular BSR
hbilel's avatar
hbilel committed
1015
  uint16_t retxBSR_SF;
1016
  /// periodicBSR-Timer, default to infinity
1017
  uint16_t periodicBSR_Timer;
1018
  /// periodicBSR_SF, number of subframe before triggering a periodic BSR
hbilel's avatar
hbilel committed
1019
  uint16_t periodicBSR_SF;
1020
  /// default value is 0: not configured
1021
  uint16_t sr_ProhibitTimer;
1022
  /// sr ProhibitTime running
1023
  uint8_t sr_ProhibitTimer_Running;
1024
  ///  default value to n5
1025
  uint16_t maxHARQ_Tx;
1026
  /// default value is false
1027
  uint16_t ttiBundling;
1028
  /// default value is release
1029 1030 1031 1032
  struct DRX_Config *drx_config;
  /// default value is release
  struct MAC_MainConfig__phr_Config *phr_config;
  ///timer before triggering a periodic PHR
1033
  uint16_t periodicPHR_Timer;
1034
  ///timer before triggering a prohibit PHR
1035
  uint16_t prohibitPHR_Timer;
1036
  ///DL Pathloss change value
1037
  uint16_t PathlossChange;
1038
  ///number of subframe before triggering a periodic PHR
1039
  int16_t periodicPHR_SF;
1040
  ///number of subframe before triggering a prohibit PHR
1041
  int16_t prohibitPHR_SF;
1042
  ///DL Pathloss Change in db
1043
  uint16_t PathlossChange_db;
fnabet's avatar
fnabet committed
1044 1045 1046 1047 1048 1049

  /// default value is false
  uint16_t extendedBSR_Sizes_r10;
  /// default value is false
  uint16_t extendedPHR_r10;

1050
  //Bj bucket usage per  lcid
1051
  int16_t Bj[MAX_NUM_LCID];
1052
  // Bucket size per lcid
1053
  int16_t bucket_size[MAX_NUM_LCID];
1054
} UE_SCHEDULING_INFO;
1055
/*!\brief Top level UE MAC structure */
1056
typedef struct {
1057
  uint16_t Node_id;
1058 1059 1060 1061 1062 1063 1064 1065
  /// RX frame counter
  frame_t     rxFrame;
  /// RX subframe counter
  sub_frame_t rxSubframe;
  /// TX frame counter
  frame_t     txFrame;
  /// TX subframe counter
  sub_frame_t txSubframe;
1066
  /// C-RNTI of UE
1067
  uint16_t crnti;
1068
  /// C-RNTI of UE before HO
1069
  rnti_t crnti_before_ho; ///user id (rnti) of connected UEs
1070 1071
  /// uplink active flag
  uint8_t ul_active;
1072
  /// pointer to RRC PHY configuration
1073
  RadioResourceConfigCommonSIB_t *radioResourceConfigCommon;
1074
  /// pointer to RACH_ConfigDedicated (NULL when not active, i.e. upon HO completion or T304 expiry)
1075 1076
  struct RACH_ConfigDedicated *rach_ConfigDedicated;
  /// pointer to RRC PHY configuration
1077
  struct PhysicalConfigDedicated *physicalConfigDedicated;
Cedric Roux's avatar
Cedric Roux committed
1078
#if defined(Rel10) || defined(Rel14)
1079 1080 1081
  /// pointer to RRC PHY configuration SCEll
  struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10;
#endif
1082 1083 1084
  /// pointer to TDD Configuration (NULL for FDD)
  TDD_Config_t *tdd_Config;
  /// Number of adjacent cells to measure
1085
  uint8_t  n_adj_cells;
1086
  /// Array of adjacent physical cell ids
1087
  uint32_t adj_cell_id[6];
1088 1089 1090 1091 1092 1093
  /// Pointer to RRC MAC configuration
  MAC_MainConfig_t *macConfig;
  /// Pointer to RRC Measurement gap configuration
  MeasGapConfig_t  *measGapConfig;
  /// Pointers to LogicalChannelConfig indexed by LogicalChannelIdentity. Note NULL means LCHAN is inactive.
  LogicalChannelConfig_t *logicalChannelConfig[MAX_NUM_LCID];
1094
  /// Scheduling Information
1095 1096 1097 1098 1099 1100
  UE_SCHEDULING_INFO scheduling_info;
  /// Outgoing CCCH pdu for PHY
  CCCH_PDU CCCH_pdu;
  /// Incoming DLSCH pdu for PHY
  //DLSCH_PDU DLSCH_pdu[NUMBER_OF_UE_MAX][2];
  /// number of attempt for rach
1101
  uint8_t RA_attempt_number;
1102
  /// Random-access procedure flag
1103
  uint8_t RA_active;
1104
  /// Random-access window counter
1105
  int8_t RA_window_cnt;
1106
  /// Random-access Msg3 size in bytes
1107
  uint8_t RA_Msg3_size;
1108
  /// Random-access prachMaskIndex
1109
  uint8_t RA_prachMaskIndex;
1110
  /// Flag indicating Preamble set (A,B) used for first Msg3 transmission
1111
  uint8_t RA_usedGroupA;
1112 1113 1114
  /// Random-access Resources
  PRACH_RESOURCES_t RA_prach_resources;
  /// Random-access PREAMBLE_TRANSMISSION_COUNTER
1115
  uint8_t RA_PREAMBLE_TRANSMISSION_COUNTER;
1116
  /// Random-access backoff counter
1117
  int16_t RA_backoff_cnt;
1118
  /// Random-access variable for window calculation (frame of last change in window counter)
1119
  uint32_t RA_tx_frame;
1120
  /// Random-access variable for window calculation (subframe of last change in window counter)
1121
  uint8_t RA_tx_subframe;
1122 1123
  /// Random-access Group B maximum path-loss
  /// Random-access variable for backoff (frame of last change in backoff counter)
1124
  uint32_t RA_backoff_frame;
1125
  /// Random-access variable for backoff (subframe of last change in backoff counter)
1126
  uint8_t RA_backoff_subframe;
1127
  /// Random-access Group B maximum path-loss
1128
  uint16_t RA_maxPL;
1129
  /// Random-access Contention Resolution Timer active flag
1130
  uint8_t RA_contention_resolution_timer_active;
1131
  /// Random-access Contention Resolution Timer count value
1132
  uint8_t RA_contention_resolution_cnt;
1133
  /// power headroom reporitng reconfigured
1134
  uint8_t PHR_reconfigured;
1135
  /// power headroom state as configured by the higher layers
1136
  uint8_t PHR_state;
1137
  /// power backoff due to power management (as allowed by P-MPRc) for this cell
1138
  uint8_t PHR_reporting_active;
1139
  /// power backoff due to power management (as allowed by P-MPRc) for this cell
1140
  uint8_t power_backoff_db[NUMBER_OF_eNB_MAX];
fnabet's avatar
fnabet committed
1141 1142
  /// BSR report falg management
  uint8_t BSR_reporting_active;
calvin wang's avatar
calvin wang committed
1143 1144
  /// retxBSR-Timer expires flag
  uint8_t retxBSRTimer_expires_flag;
1145 1146 1147
  /// periodBSR-Timer expires flag
  uint8_t periodBSRTimer_expires_flag;

1148
  /// MBSFN_Subframe Configuration
1149
  struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8]; // FIXME replace 8 by MAX_MBSFN_AREA?
1150
  /// number of subframe allocation pattern available for MBSFN sync area
1151
  uint8_t num_sf_allocation_pattern;
Cedric Roux's avatar
Cedric Roux committed
1152
#if defined(Rel10) || defined(Rel14)
1153
  /// number of active MBSFN area
1154
  uint8_t num_active_mbsfn_area;
1155 1156 1157 1158 1159
  /// MBSFN Area Info
  struct  MBSFN_AreaInfo_r9 *mbsfn_AreaInfo[MAX_MBSFN_AREA];
  /// PMCH Config
  struct PMCH_Config_r9 *pmch_Config[MAX_PMCH_perMBSFN];
  /// MCCH status
1160
  uint8_t mcch_status;
1161
  /// MSI status
1162
  uint8_t msi_status;// could be an array if there are >1 MCH in one MBSFN area
1163
#endif
1164
  //#ifdef CBA
1165
  /// CBA RNTI for each group 
1166
  uint16_t cba_rnti[NUM_MAX_CBA_GROUP];
1167
  /// last SFN for CBA channel access 
1168
  uint8_t cba_last_access[NUM_MAX_CBA_GROUP];
1169
  //#endif
1170
  /// total UE scheduler processing time 
1171
  time_stats_t ue_scheduler; // total
1172 1173 1174 1175 1176
  /// UE ULSCH tx  processing time inlcuding RLC interface (rlc_data_req) and mac header generation 
  time_stats_t tx_ulsch_sdu;  
  /// UE DLSCH rx  processing time inlcuding RLC interface (mac_rrc_data_ind or mac_rlc_status_ind+mac_rlc_data_ind) and mac header parser
  time_stats_t rx_dlsch_sdu ; 
  /// UE query for MCH subframe processing time 
1177
  time_stats_t ue_query_mch;
1178
  /// UE MCH rx processing time 
1179
  time_stats_t rx_mch_sdu;
1180 1181
  /// UE BCCH rx processing time including RLC interface (mac_rrc_data_ind) 
  time_stats_t rx_si; 
1182 1183
  /// UE PCCH rx processing time including RLC interface (mac_rrc_data_ind) 
  time_stats_t rx_p; 
1184
} UE_MAC_INST;
1185
/*! \brief ID of the neighboring cells used for HO*/
1186
typedef struct {
1187 1188
  uint16_t cell_ids[6];
  uint8_t n_adj_cells;
1189 1190
} neigh_cell_id_t;

1191
#include "proto.h"
1192
/*@}*/
1193
#endif /*__LAYER2_MAC_DEFS_H__ */
1194 1195 1196