defs.h 33.1 KB
Newer Older
1
/*******************************************************************************
2 3
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom
4

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


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

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

  Contact Information
22 23
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
24
  OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
25

ghaddab's avatar
ghaddab committed
26
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
27 28

*******************************************************************************/
29
/*! \file LAYER2/MAC/defs.h
30
* \brief MAC data structures, constant, and function prototype
31
* \author Navid Nikaein and Raymond Knopp
32 33
* \date 2011
* \version 0.5
34
* \email navid.nikaein@eurecom.fr
35 36

*/
37 38 39 40
/** @defgroup _oai2  openair2 Reference Implementation
 * @ingroup _ref_implementation_
 * @{
 */
41

42
/*@}*/
43

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#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"

#include "COMMON/platform_constants.h"
#include "COMMON/mac_rrc_primitives.h"
#include "PHY/defs.h"
#include "RadioResourceConfigCommon.h"
#include "RadioResourceConfigDedicated.h"
#include "MeasGapConfig.h"
#include "TDD-Config.h"
#include "RACH-ConfigCommon.h"
#include "MeasObjectToAddModList.h"
66
#include "MobilityControlInfo.h"
67 68 69 70
#ifdef Rel10
#include "MBSFN-AreaInfoList-r9.h"
#include "MBSFN-SubframeConfigList.h"
#include "PMCH-InfoList-r9.h"
Raymond Knopp's avatar
 
Raymond Knopp committed
71
#include "SCellToAddMod-r10.h"
72 73 74 75 76 77
#endif

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

78 79
/** @defgroup _mac  MAC
 * @ingroup _oai2
80 81 82
 * @{
 */

83
#define BCCH_PAYLOAD_SIZE_MAX 128
84
#define CCCH_PAYLOAD_SIZE_MAX 128
85

86 87 88 89 90
#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)

#ifdef Rel10

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

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

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

142

143 144 145
#define LCID_EMPTY 0
#define LCID_NOT_EMPTY 1

146 147 148
/* 
 * eNB part 
 */ 
149

150 151 152 153 154

/* 
 * UE/ENB common part 
 */ 
/*!\brief MAC header of Random Access Response for Random access preamble identifier (RAPID) */
155
typedef struct {
156 157 158
  uint8_t RAPID:6;
  uint8_t T:1;
  uint8_t E:1;
159 160
} __attribute__((__packed__))RA_HEADER_RAPID;

161
/*!\brief  MAC header of Random Access Response for backoff indicator (BI)*/
162
typedef struct {
163 164 165 166
  uint8_t BI:4;
  uint8_t R:2;
  uint8_t T:1;
  uint8_t E:1;
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
} __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
*/
197
/*!\brief  MAC subheader short with 7bit Length field */
198
typedef struct {
199 200 201 202 203
  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
204
} __attribute__((__packed__))SCH_SUBHEADER_SHORT;
205
/*!\brief  MAC subheader long  with 15bit Length field */
206
typedef struct {
207 208 209 210 211 212 213
  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;
214
} __attribute__((__packed__))SCH_SUBHEADER_LONG;
215
/*!\brief MAC subheader short without length field */
216
typedef struct {
217 218 219
  uint8_t LCID:5;
  uint8_t E:1;
  uint8_t R:2;
220 221
} __attribute__((__packed__))SCH_SUBHEADER_FIXED;

222
/*!\brief  mac control element: short buffer status report for a specific logical channel group ID*/
223
typedef struct {
224 225
  uint8_t Buffer_size:6;  // octet 1 LSB
  uint8_t LCGID:2;        // octet 1 MSB
226 227 228
} __attribute__((__packed__))BSR_SHORT;

typedef BSR_SHORT BSR_TRUNCATED;
229
/*!\brief  mac control element: long buffer status report for all logical channel group ID*/
230
typedef struct {
231 232 233 234 235
  uint32_t Buffer_size3:6;
  uint32_t Buffer_size2:6;
  uint32_t Buffer_size1:6;
  uint32_t Buffer_size0:6;
  uint32_t padding:8;
236 237 238
} __attribute__((__packed__))BSR_LONG;

#define BSR_LONG_SIZE  (sizeof(BSR_LONG))
239
/*!\brief  mac control element: timing advance  */
240
typedef struct {
241 242
  uint8_t TA:6;
  uint8_t R:2;
243
} __attribute__((__packed__))TIMING_ADVANCE_CMD;
244
/*!\brief  mac control element: power headroom report  */
245
typedef struct {
246 247
  uint8_t PH:6;
  uint8_t R:2;
248 249
} __attribute__((__packed__))POWER_HEADROOM_CMD;

250
/*!\brief  DCI PDU filled by MAC for the PHY  */
251
typedef struct {
252 253
  uint8_t Num_ue_spec_dci ;
  uint8_t Num_common_dci  ;
254 255 256
  unsigned int nCCE;
  DCI_ALLOC_t dci_alloc[NUM_DCI_MAX] ;
} DCI_PDU;
257
/*! \brief CCCH payload */
258
typedef struct {
259
  uint8_t payload[CCCH_PAYLOAD_SIZE_MAX] ;
260
} __attribute__((__packed__))CCCH_PDU;
261
/*! \brief BCCH payload */
262
typedef struct {
263
  uint8_t payload[BCCH_PAYLOAD_SIZE_MAX] ;
264 265 266
} __attribute__((__packed__))BCCH_PDU;

#ifdef Rel10
267
/*! \brief MCCH payload */
268
typedef struct {
269
  uint8_t payload[MCCH_PAYLOAD_SIZE_MAX] ;
270
} __attribute__((__packed__))MCCH_PDU;
271
/*!< \brief MAC control element for activation and deactivation of component carriers */
272 273 274 275 276 277 278 279 280 281
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;
282
/*! \brief MAC control element: MCH Scheduling Information */
283
typedef struct {
284 285 286
  uint8_t stop_sf_MSB:3; // octet 1 LSB
  uint8_t lcid:5;        // octet 2 MSB
  uint8_t stop_sf_LSB:8;
287
} __attribute__((__packed__))MSI_ELEMENT;
288 289
#endif
/*! \brief Values of CCCH LCID for DLSCH */ 
290
#define CCCH_LCHANID 0
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
/*!\brief Values of BCCH logical channel */
#define BCCH 3  // SI 
/*!\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*/
307
#define UE_CONT_RES 28
308
/*!\brief LCID of timing advance for DLSCH */
309
#define TIMING_ADV_CMD 29
310
/*!\brief LCID of discontinous reception mode for DLSCH */
311
#define DRX_CMD 30
312
/*!\brief LCID of padding LCID for DLSCH */
313 314 315 316
#define SHORT_PADDING 31

#ifdef Rel10
// MCH LCHAN IDs (table6.2.1-4 TS36.321)
317
/*!\brief LCID of MCCH for DL */
318
#define MCCH_LCHANID 0
319 320 321
/*!\brief LCID of MCH scheduling info for DL */
#define MCH_SCHDL_INFO 3
/*!\brief LCID of Carrier component activation/deactivation */
322
#define CC_ACT_DEACT 27
323 324 325
#endif

// ULSCH LCHAN IDs
326
/*!\brief LCID of extended power headroom for ULSCH */
327
#define EXTENDED_POWER_HEADROOM 25
328
/*!\brief LCID of power headroom for ULSCH */
329
#define POWER_HEADROOM 26
330
/*!\brief LCID of CRNTI for ULSCH */
331
#define CRNTI 27
332
/*!\brief LCID of truncated BSR for ULSCH */
333
#define TRUNCATED_BSR 28
334
/*!\brief LCID of short BSR for ULSCH */
335
#define SHORT_BSR 29
336
/*!\brief LCID of long BSR for ULSCH */
337 338
#define LONG_BSR 30

339
/*! \brief Downlink SCH PDU Structure */
340
typedef struct {
341 342
  int8_t payload[8][SCH_PAYLOAD_SIZE_MAX];
  uint16_t Pdu_size[8];
343 344
} __attribute__ ((__packed__)) DLSCH_PDU;

345
/*! \brief MCH PDU Structure */
346
typedef struct {
347 348
  int8_t payload[SCH_PAYLOAD_SIZE_MAX];
  uint16_t Pdu_size;
349
  uint8_t mcs;
350 351 352
  uint8_t sync_area;
  uint8_t msi_active;
  uint8_t mcch_active;
353
  uint8_t mtch_active;
354 355
} __attribute__ ((__packed__)) MCH_PDU;

356
/*! \brief Uplink SCH PDU Structure */
357
typedef struct {
358 359
  int8_t payload[SCH_PAYLOAD_SIZE_MAX];         /*!< \brief SACH payload */
  uint16_t Pdu_size;
360 361 362 363
} __attribute__ ((__packed__)) ULSCH_PDU;

#include "PHY/impl_defs_top.h"

364
/*!\brief  UE ULSCH scheduling states*/
365 366 367
typedef enum {
  S_UL_NONE =0,
  S_UL_WAITING,
368 369
  S_UL_SCHEDULED,
  S_UL_BUFFERED,
370 371 372
  S_UL_NUM_STATUS
} UE_ULSCH_STATUS;

373
/*!\brief  UE DLSCH scheduling states*/
374 375 376
typedef enum {
  S_DL_NONE =0,
  S_DL_WAITING,
377 378
  S_DL_SCHEDULED,
  S_DL_BUFFERED,
379 380 381
  S_DL_NUM_STATUS
} UE_DLSCH_STATUS;

382
/*!\brief  scheduling policy for the contention-based access */
383
typedef enum {
384 385 386 387 388
  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
389 390 391
} CBA_POLICY;


392
/*! \brief temporary struct for ULSCH sched */
393
typedef struct {
394
  rnti_t rnti;
395 396
  uint16_t subframe;
  uint16_t serving_num;
397 398
  UE_ULSCH_STATUS status;
} eNB_ULSCH_INFO;
399
/*! \brief temp struct for DLSCH sched */
400
typedef struct {
401
  rnti_t rnti;
402 403 404
  uint16_t weight;
  uint16_t subframe;
  uint16_t serving_num;
405 406
  UE_DLSCH_STATUS status;
} eNB_DLSCH_INFO;
407
/*! \brief eNB overall statistics */
408
typedef struct {
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
  /// 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
428 429 430 431 432
  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;
433 434
  /// aggregation
  /// total avilable nccc : num control channel element
435
  uint16_t available_ncces;
436 437
  // only for a new transmission, should be extended for retransmission
  // current dlsch  bit rate for all transport channels
438 439 440 441 442
  uint32_t dlsch_bitrate;
  //
  uint32_t dlsch_bytes_tx;
  //
  uint32_t dlsch_pdus_tx;
443
  //
444 445 446 447 448
  uint32_t total_dlsch_bitrate;
  //
  uint32_t total_dlsch_bytes_tx;
  //
  uint32_t total_dlsch_pdus_tx;
449 450
  
  // here for RX
451 452 453 454 455
  //
  uint32_t ulsch_bitrate;
  //
  uint32_t ulsch_bytes_rx;
  //
456 457 458 459 460 461 462 463
  uint64_t ulsch_pdus_rx; 

  uint32_t total_ulsch_bitrate;
  //
  uint32_t total_ulsch_bytes_rx;
  //
  uint32_t total_ulsch_pdus_rx;
  
464
} eNB_STATS;
465
/*! \brief eNB statistics for the connected UEs*/
466
typedef struct {
467 468

  /// CRNTI of UE
469
  rnti_t crnti; ///user id (rnti) of connected UEs
470
  // rrc status
471 472 473
  uint8_t rrc_status;
  /// harq pid
  uint8_t harq_pid;
474
  /// harq rounf
475
  uint8_t harq_round;
476
  /// DL Wideband CQI index (2 TBs)
477 478 479 480 481
  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;
482
  /// total nccc used for a new transmission: num control channel element
483
  uint16_t ncce_used;
484
  /// total avilable nccc for a retransmission: num control channel element
485
  uint16_t ncce_used_retx;
486 487

  // mcs1 before the rate adaptaion
488
  uint8_t dlsch_mcs1;
489
  /// Target mcs2 after rate-adaptation
490
  uint8_t dlsch_mcs2;
491
  //  current TBS with mcs2
492
  uint32_t TBS;
493
  //  total TBS with mcs2
494
  //  uint32_t total_TBS;
495
  //  total rb used for a new transmission
496
  uint32_t total_rbs_used;
497
  //  total rb used for retransmission
498
  uint32_t total_rbs_used_retx;
499

500
   /// TX
501 502 503 504 505 506 507 508
  /// 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];
509 510

  /// overall
511
  //
512 513 514 515
  uint32_t  dlsch_bitrate;
  //total
  uint32_t  total_dlsch_bitrate;
  /// headers+ CE +  padding bytes for a MAC PDU
516
  uint64_t overhead_bytes;
517
  /// headers+ CE +  padding bytes for a MAC PDU
518
  uint64_t total_overhead_bytes;
519
  /// headers+ CE +  padding bytes for a MAC PDU
520
  uint64_t avg_overhead_bytes;
521
  // MAC multiplexed payload
522 523 524
  uint64_t total_sdu_bytes;
  // total MAC pdu bytes
  uint64_t total_pdu_bytes;
525

526 527 528 529
  // total num pdu
  uint32_t total_num_pdus;
  //
  //  uint32_t avg_pdu_size;
530 531

  /// RX
532 533 534 535 536 537

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

538 539 540 541
  /// estimated average pdu inter-departure time
  uint32_t avg_pdu_idt;
  /// estimated average pdu size
  uint32_t avg_pdu_ps;
542
  ///
543 544
  uint32_t aggregated_pdu_size;
  uint32_t aggregated_pdu_arrival;
545

546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561
  ///  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;

562
  /// num rx pdu
563
  uint32_t num_pdu_rx[NB_RB_MAX];
564
  /// num bytes rx
565
  uint32_t num_bytes_rx[NB_RB_MAX];
566
  /// instantaneous rx throughput for each TTI
567
  //  uint32_t tti_goodput[NB_RB_MAX];
568 569
  /// errors
  uint32_t num_errors_rx;
570 571 572 573 574 575 576 577 578 579
  
  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;
580
  /// overall
581 582
  ///  MAC pdu bytes
  uint64_t pdu_bytes_rx;
583
  /// total MAC pdu bytes
584
  uint64_t total_pdu_bytes_rx;
585
  /// total num pdu
586
  uint32_t total_num_pdus_rx;
587
  /// num of error pdus
588
  uint32_t total_num_errors_rx;
589

590
} eNB_UE_STATS;
591
/*! \brief eNB template for UE context information  */
592
typedef struct {
593
  /// C-RNTI of UE
594
  rnti_t rnti;
595 596 597 598
  /// NDI from last scheduling
  uint8_t oldNDI[8];
  /// NDI from last UL scheduling
  uint8_t oldNDI_UL[8];
599
  /// Flag to indicate UL has been scheduled at least once
Lionel Gauthier's avatar
Lionel Gauthier committed
600
  boolean_t ul_active;
Raymond Knopp's avatar
 
Raymond Knopp committed
601 602
  /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received)
  boolean_t configured;
603 604 605 606

  // PHY interface info

  /// DCI format for DLSCH
607
  uint16_t DLSCH_dci_fmt;
608

609
  /// Current Aggregation Level for DCI
610
  uint8_t DCI_aggregation_min;
611

612
  /// size of DLSCH size in bit 
613
  uint8_t DLSCH_dci_size_bits;
614 615

  /// DCI buffer for DLSCH
616
  uint8_t DLSCH_DCI[8][(MAX_DCI_SIZE_BITS>>3)+1];
617 618

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

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

624 625
  /// Number of Allocated RBs by the ulsch preprocessor
  uint8_t pre_allocated_nb_rb_ul;
626

627 628
  /// index of Allocated RBs by the ulsch preprocessor
  int8_t pre_allocated_rb_table_index_ul;
629

630 631
  /// total allocated RBs
  int8_t total_allocated_rbs;
632

633
  /// pre-assigned MCS by the ulsch preprocessor
634
  uint8_t pre_assigned_mcs_ul;
635 636 637 638

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

639
  /// DCI buffer for ULSCH
640
  uint8_t ULSCH_DCI[8][(MAX_DCI_SIZE_BITS>>3)+1];
641 642

  /// DL DAI
643
  uint8_t DAI;
644 645

  /// UL DAI
646
  uint8_t DAI_ul[10];
647 648

  /// UL Scheduling Request Received
649
  uint8_t ul_SR;
650

651
  ///Resource Block indication for each sub-band in MU-MIMO
652
  uint8_t rballoc_subband[8][50];
653 654 655 656

  // Logical channel info for link with RLC

  /// UE BSR info for each logical channel group id
657
  uint8_t bsr_info[MAX_NUM_LCGID];
658 659

  /// phr information
660
  int8_t phr_info;
661

662 663 664
  /// phr information
  int8_t phr_info_configured;

665
  ///dl buffer info
666
  uint32_t dl_buffer_info[MAX_NUM_LCID];
667
  /// total downlink buffer info
668
  uint32_t dl_buffer_total;
669
  /// total downlink pdus
670
  uint32_t dl_pdus_total;
671
  /// downlink pdus for each LCID
672
  uint32_t dl_pdus_in_buffer[MAX_NUM_LCID];
673
  /// creation time of the downlink buffer head for each LCID
674
  uint32_t dl_buffer_head_sdu_creation_time[MAX_NUM_LCID];
675
  /// maximum creation time of the downlink buffer head across all LCID
676
  uint32_t  dl_buffer_head_sdu_creation_time_max;
677
  /// a flag indicating that the downlink head SDU is segmented  
678
  uint8_t    dl_buffer_head_sdu_is_segmented[MAX_NUM_LCID];
679
  /// size of remaining size to send for the downlink head SDU
680
  uint32_t dl_buffer_head_sdu_remaining_size_to_send[MAX_NUM_LCID];
681

682
  /// total uplink buffer size 
683
  uint32_t ul_total_buffer;
684
  /// uplink buffer creation time for each LCID
685
  uint32_t ul_buffer_creation_time[MAX_NUM_LCGID];
686
  /// maximum uplink buffer creation time across all the LCIDs
687
  uint32_t ul_buffer_creation_time_max;
688
  /// uplink buffer size per LCID
689 690
  uint32_t ul_buffer_info[MAX_NUM_LCGID];

691 692 693
  /// UE tx power
  int32_t ue_tx_power;

kaltenbe's avatar
kaltenbe committed
694
  /// stores the frame where the last TPC was transmitted
695 696 697 698
  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
699

700 701 702
#ifdef LOCALIZATION
  eNB_UE_estimated_distances distance;
#endif
703 704
} UE_TEMPLATE;

705
/*! \brief scheduling control information set through an API (not used)*/
706
typedef struct {
707
  ///UL transmission bandwidth in RBs
708
  uint8_t ul_bandwidth[MAX_NUM_LCID];
709
  ///DL transmission bandwidth in RBs
710
  uint8_t dl_bandwidth[MAX_NUM_LCID];
711

712 713
  //To do GBR bearer
  uint8_t min_ul_bandwidth[MAX_NUM_LCID];
714

715
  uint8_t min_dl_bandwidth[MAX_NUM_LCID];
716

717
  ///aggregated bit rate of non-gbr bearer per UE
718
  uint64_t  ue_AggregatedMaximumBitrateDL;
719
  ///aggregated bit rate of non-gbr bearer per UE
720
  uint64_t  ue_AggregatedMaximumBitrateUL;
721
  ///CQI scheduling interval in subframes.
722
  uint16_t cqiSchedInterval;
723
  ///Contention resolution timer used during random access
724
  uint8_t mac_ContentionResolutionTimer;
725

726
  uint16_t max_allowed_rbs[MAX_NUM_LCID];
727

728
  uint8_t max_mcs[MAX_NUM_LCID];
729

730
  uint16_t priority[MAX_NUM_LCID];
731

732 733 734 735 736 737 738
  // 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];

739
} UE_sched_ctrl;
740
/*! \brief eNB template for the Random access information */
741 742
typedef struct {
  /// Flag to indicate this process is active
Lionel Gauthier's avatar
Lionel Gauthier committed
743
  boolean_t RA_active;
744
  /// Size of DCI for RA-Response (bytes)
745
  uint8_t RA_dci_size_bytes1;
746
  /// Size of DCI for RA-Response (bits)
747
  uint8_t RA_dci_size_bits1;
748
  /// Actual DCI to transmit for RA-Response
749
  uint8_t RA_alloc_pdu1[(MAX_DCI_SIZE_BITS>>3)+1];
750
  /// DCI format for RA-Response (should be 1A)
751
  uint8_t RA_dci_fmt1;
752
  /// Size of DCI for Msg4/ContRes (bytes)
753
  uint8_t RA_dci_size_bytes2;
754
  /// Size of DCI for Msg4/ContRes (bits)
755
  uint8_t RA_dci_size_bits2;
756
  /// Actual DCI to transmit for Msg4/ContRes
757
  uint8_t RA_alloc_pdu2[(MAX_DCI_SIZE_BITS>>3)+1];
758
  /// DCI format for Msg4/ContRes (should be 1A)
759
  uint8_t RA_dci_fmt2;
760
  /// Flag to indicate the eNB should generate RAR.  This is triggered by detection of PRACH
761
  uint8_t generate_rar;
762
  /// Subframe where preamble was received
763
  uint8_t preamble_subframe;
764
  /// Subframe where Msg3 is to be sent
765
  uint8_t Msg3_subframe;
766
  /// 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.
767
  uint8_t generate_Msg4;
768
  /// Flag to indicate the eNB should generate the DCI for Msg4, after getting the SDU from RRC.
769
  uint8_t generate_Msg4_dci;
770
  /// Flag to indicate that eNB is waiting for ACK that UE has received Msg3.
771
  uint8_t wait_ack_Msg4;
772
  /// UE RNTI allocated during RAR
773
  rnti_t rnti;
774
  /// RA RNTI allocated from received PRACH
775
  uint16_t RA_rnti;
776
  /// Received preamble_index
777
  uint8_t preamble_index;
778
  /// Received UE Contention Resolution Identifier
779
  uint8_t cont_res_id[6];
780
  /// Timing offset indicated by PHY
781
  int16_t timing_offset;
782
  /// Timeout for RRC connection
783
  int16_t RRC_timer;
784 785 786
} RA_TEMPLATE;


787
/*! \brief subband bitmap confguration (for ALU icic algo purpose), in test phase */
788 789 790 791 792 793 794
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;
795
/*! \brief UE list used by eNB to order UEs/CC for scheduling*/ 
796
typedef struct {
797
  /// DLSCH pdu 
Raymond Knopp's avatar
 
Raymond Knopp committed
798 799 800 801 802
  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];
803
  /// sorted downlink component carrier for the scheduler 
Raymond Knopp's avatar
 
Raymond Knopp committed
804
  int ordered_CCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
805
  /// number of downlink active component carrier 
Raymond Knopp's avatar
 
Raymond Knopp committed
806
  int numactiveCCs[NUMBER_OF_UE_MAX];
807
  /// sorted uplink component carrier for the scheduler 
Raymond Knopp's avatar
 
Raymond Knopp committed
808
  int ordered_ULCCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
809
  /// number of uplink active component carrier 
Raymond Knopp's avatar
 
Raymond Knopp committed
810
  int numactiveULCCs[NUMBER_OF_UE_MAX];
811
  /// number of downlink active component carrier 
812
  uint8_t dl_CC_bitmap[NUMBER_OF_UE_MAX];
813
  /// eNB to UE statistics
Raymond Knopp's avatar
 
Raymond Knopp committed
814
  eNB_UE_STATS eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
815
  /// scheduling control info
Raymond Knopp's avatar
 
Raymond Knopp committed
816 817 818
  UE_sched_ctrl UE_sched_ctrl[NUMBER_OF_UE_MAX];

  int next[NUMBER_OF_UE_MAX];
819
  int head;
820 821
  int next_ul[NUMBER_OF_UE_MAX];
  int head_ul;
Raymond Knopp's avatar
 
Raymond Knopp committed
822 823 824 825
  int avail;
  int num_UEs;
  boolean_t active[NUMBER_OF_UE_MAX];
} UE_list_t;
826

827
/*! \brief eNB common channels */ 
828
typedef struct {
829 830 831 832
  /// Outgoing DCI for PHY generated by eNB scheduler
  DCI_PDU DCI_pdu;
  /// Outgoing BCCH pdu for PHY
  BCCH_PDU BCCH_pdu;
833 834
  /// Outgoing BCCH DCI allocation
  uint32_t BCCH_alloc_pdu;
835 836 837 838
  /// Outgoing CCCH pdu for PHY
  CCCH_PDU CCCH_pdu;
  RA_TEMPLATE RA_template[NB_RA_PROC_MAX];
  /// BCCH active flag
839
  uint8_t bcch_active;
840 841
  /// MBSFN SubframeConfig
  struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8];
842
  /// number of subframe allocation pattern available for MBSFN sync area
843
  uint8_t num_sf_allocation_pattern;
844
#ifdef Rel10
845
  /// MBMS Flag
846
  uint8_t MBMS_flag;
847 848 849
  /// Outgoing MCCH pdu for PHY
  MCCH_PDU MCCH_pdu;
  /// MCCH active flag
850
  uint8_t msi_active;
851
  /// MCCH active flag
852
  uint8_t mcch_active;
853
  /// MTCH active flag
854
  uint8_t mtch_active;
855
  /// number of active MBSFN area
856
  uint8_t num_active_mbsfn_area;
857 858 859 860 861 862 863 864 865 866
  /// 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
867
  /// number of CBA groups 
868
  uint8_t num_active_cba_groups;
869
  /// RNTI for each CBA group 
870
  uint16_t cba_rnti[NUM_MAX_CBA_GROUP];
871
  /// MCS for each CBA group 
872
  uint8_t group_mcs[NUM_MAX_CBA_GROUP];
873 874
#endif
} COMMON_channels_t;
875
/*! \brief top level eNB MAC structure */ 
876 877
typedef struct {
  ///
Raymond Knopp's avatar
 
Raymond Knopp committed
878 879 880 881 882 883 884 885
  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];
  UE_list_t UE_list;
886 887
  ///subband bitmap configuration
  SBMAP_CONF sbmap_conf;
888 889

  ///  active flag for Other lcid
Raymond Knopp's avatar
 
Raymond Knopp committed
890
  //  uint8_t lcid_active[NB_RB_MAX];
891
  /// eNB stats
892
  eNB_STATS eNB_stats[MAX_NUM_CCs];
893
  // MAC function execution peformance profiler
894
  /// processing time of eNB scheduler 
895
  time_stats_t eNB_scheduler;
896
  /// processing time of eNB scheduler for SI 
897
  time_stats_t schedule_si;
898
  /// processing time of eNB scheduler for Random access
899
  time_stats_t schedule_ra;
900
  /// processing time of eNB ULSCH scheduler 
901
  time_stats_t schedule_ulsch;
902
  /// processing time of eNB DCI generation
903
  time_stats_t fill_DLSCH_dci;
904
  /// processing time of eNB MAC preprocessor
905
  time_stats_t schedule_dlsch_preprocessor;
906
  /// processing time of eNB DLSCH scheduler 
907
  time_stats_t schedule_dlsch; // include rlc_data_req + MAC header + preprocessor
908
  /// processing time of eNB MCH scheduler 
909
  time_stats_t schedule_mch;
910
  /// processing time of eNB ULSCH reception
911
  time_stats_t rx_ulsch_sdu; // include rlc_data_ind
912 913

} eNB_MAC_INST;
914

915 916 917 918 919 920 921 922 923 924 925 926 927
/* 
 * 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 */
928 929
typedef struct {
  /// buffer status for each lcgid
930
  uint8_t  BSR[MAX_NUM_LCGID]; // should be more for mesh topology
931
  /// keep the number of bytes in rlc buffer for each lcid
932
  uint16_t  BSR_bytes[MAX_NUM_LCGID];
933
  /// buffer status for each lcid
934
  uint8_t  LCID_status[MAX_NUM_LCID];
935
  /// SR pending as defined in 36.321
936
  uint8_t  SR_pending;
937
  /// SR_COUNTER as defined in 36.321
938
  uint16_t SR_COUNTER;
939
  /// logical channel group ide for each LCID
940
  uint8_t  LCGID[MAX_NUM_LCID];
941
  /// retxBSR-Timer, default value is sf2560
942
  uint16_t retxBSR_Timer;
943
  /// retxBSR_SF, number of subframe before triggering a regular BSR
944
  int16_t retxBSR_SF;
945
  /// periodicBSR-Timer, default to infinity
946
  uint16_t periodicBSR_Timer;
947
  /// periodicBSR_SF, number of subframe before triggering a periodic BSR
948
  int16_t periodicBSR_SF;
949
  /// default value is 0: not configured
950
  uint16_t sr_ProhibitTimer;
951
  /// sr ProhibitTime running
952
  uint8_t sr_ProhibitTimer_Running;
953
  ///  default value to n5
954
  uint16_t maxHARQ_Tx;
955
  /// default value is false
956
  uint16_t ttiBundling;
957
  /// default value is release
958 959 960 961
  struct DRX_Config *drx_config;
  /// default value is release
  struct MAC_MainConfig__phr_Config *phr_config;
  ///timer before triggering a periodic PHR
962
  uint16_t periodicPHR_Timer;
963
  ///timer before triggering a prohibit PHR
964
  uint16_t prohibitPHR_Timer;
965
  ///DL Pathloss change value
966
  uint16_t PathlossChange;
967
  ///number of subframe before triggering a periodic PHR
968
  int16_t periodicPHR_SF;
969
  ///number of subframe before triggering a prohibit PHR
970
  int16_t prohibitPHR_SF;
971
  ///DL Pathloss Change in db
972
  uint16_t PathlossChange_db;
973
  //Bj bucket usage per  lcid
974
  int16_t Bj[MAX_NUM_LCID];
975
  // Bucket size per lcid
976
  int16_t bucket_size[MAX_NUM_LCID];
977
} UE_SCHEDULING_INFO;
978
/*!\brief Top level UE MAC structure */
979
typedef struct {
980
  uint16_t Node_id;
981
  /// frame counter
982
  frame_t     frame;
983
  /// subframe counter
984
  sub_frame_t subframe;
985
  /// C-RNTI of UE
986
  uint16_t crnti;
987
  /// C-RNTI of UE before HO
988
  rnti_t crnti_before_ho; ///user id (rnti) of connected UEs
989 990
  /// uplink active flag
  uint8_t ul_active;
991
  /// pointer to RRC PHY configuration
992
  RadioResourceConfigCommonSIB_t *radioResourceConfigCommon;
993
  /// pointer to RACH_ConfigDedicated (NULL when not active, i.e. upon HO completion or T304 expiry)
994 995
  struct RACH_ConfigDedicated *rach_ConfigDedicated;
  /// pointer to RRC PHY configuration
996
  struct PhysicalConfigDedicated *physicalConfigDedicated;
997 998 999 1000
#ifdef Rel10
  /// pointer to RRC PHY configuration SCEll
  struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10;
#endif
1001 1002 1003
  /// pointer to TDD Configuration (NULL for FDD)
  TDD_Config_t *tdd_Config;
  /// Number of adjacent cells to measure
1004
  uint8_t  n_adj_cells;
1005
  /// Array of adjacent physical cell ids
1006
  uint32_t adj_cell_id[6];
1007 1008 1009 1010 1011 1012
  /// 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];
1013
  /// Scheduling Information
1014 1015 1016 1017 1018 1019
  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
1020
  uint8_t RA_attempt_number;
1021
  /// Random-access procedure flag
1022
  uint8_t RA_active;
1023
  /// Random-access window counter
1024
  int8_t RA_window_cnt;
1025
  /// Random-access Msg3 size in bytes
1026
  uint8_t RA_Msg3_size;
1027
  /// Random-access prachMaskIndex
1028
  uint8_t RA_prachMaskIndex;
1029
  /// Flag indicating Preamble set (A,B) used for first Msg3 transmission
1030
  uint8_t RA_usedGroupA;
1031 1032 1033
  /// Random-access Resources
  PRACH_RESOURCES_t RA_prach_resources;
  /// Random-access PREAMBLE_TRANSMISSION_COUNTER
1034
  uint8_t RA_PREAMBLE_TRANSMISSION_COUNTER;
1035
  /// Random-access backoff counter
1036
  int16_t RA_backoff_cnt;
1037
  /// Random-access variable for window calculation (frame of last change in window counter)
1038
  uint32_t RA_tx_frame;
1039
  /// Random-access variable for window calculation (subframe of last change in window counter)
1040
  uint8_t RA_tx_subframe;
1041 1042
  /// Random-access Group B maximum path-loss
  /// Random-access variable for backoff (frame of last change in backoff counter)
1043
  uint32_t RA_backoff_frame;
1044
  /// Random-access variable for backoff (subframe of last change in backoff counter)
1045
  uint8_t RA_backoff_subframe;
1046
  /// Random-access Group B maximum path-loss
1047
  uint16_t RA_maxPL;
1048
  /// Random-access Contention Resolution Timer active flag
1049
  uint8_t RA_contention_resolution_timer_active;
1050
  /// Random-access Contention Resolution Timer count value
1051
  uint8_t RA_contention_resolution_cnt;
1052
  /// power headroom reporitng reconfigured
1053
  uint8_t PHR_reconfigured;
1054
  /// power headroom state as configured by the higher layers
1055
  uint8_t PHR_state;
1056
  /// power backoff due to power management (as allowed by P-MPRc) for this cell
1057
  uint8_t PHR_reporting_active;
1058
  /// power backoff due to power management (as allowed by P-MPRc) for this cell
1059
  uint8_t power_backoff_db[NUMBER_OF_eNB_MAX];
1060
  /// MBSFN_Subframe Configuration
1061
  struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8]; // FIXME replace 8 by MAX_MBSFN_AREA?
1062
  /// number of subframe allocation pattern available for MBSFN sync area
1063
  uint8_t num_sf_allocation_pattern;
1064
#ifdef Rel10
1065
  /// number of active MBSFN area
1066
  uint8_t num_active_mbsfn_area;
1067 1068 1069 1070 1071
  /// 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
1072
  uint8_t mcch_status;
1073
  /// MSI status
1074
  uint8_t msi_status;// could be an array if there are >1 MCH in one MBSFN area
1075
#endif
1076
  //#ifdef CBA
1077
  /// CBA RNTI for each group 
1078
  uint16_t cba_rnti[NUM_MAX_CBA_GROUP];
1079
  /// last SFN for CBA channel access 
1080
  uint8_t cba_last_access[NUM_MAX_CBA_GROUP];
1081
  //#endif
1082
  /// total UE scheduler processing time 
1083
  time_stats_t ue_scheduler; // total
1084 1085 1086 1087 1088
  /// 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 
1089
  time_stats_t ue_query_mch;
1090
  /// UE MCH rx processing time 
1091
  time_stats_t rx_mch_sdu;
1092 1093
  /// UE BCCH rx processing time including RLC interface (mac_rrc_data_ind) 
  time_stats_t rx_si; 
1094
} UE_MAC_INST;
1095
/*! \brief ID of the neighboring cells used for HO*/
1096
typedef struct {
1097 1098
  uint16_t cell_ids[6];
  uint8_t n_adj_cells;
1099 1100
} neigh_cell_id_t;

1101
#include "proto.h"
1102
/*@}*/
1103
#endif /*__LAYER2_MAC_DEFS_H__ */
1104 1105 1106