defs.h 29.1 KB
Newer Older
1
2
3
4
5
/*
 * 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
Cedric Roux's avatar
Cedric Roux committed
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */
21

22
/*! \file RRC/LITE/defs.h
nikaeinn's avatar
nikaeinn committed
23
24
25
* \brief RRC struct definitions and function prototypes
* \author Navid Nikaein and Raymond Knopp
* \date 2010 - 2014
26
27
* \version 1.0
* \company Eurecom
28
* \email: navid.nikaein@eurecom.fr, raymond.knopp@eurecom.fr
29
30
31
32
33
34
35
36
37
38
39
*/

#ifndef __OPENAIR_RRC_DEFS_H__
#define __OPENAIR_RRC_DEFS_H__

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

40
#include "collection/tree.h"
winckel's avatar
winckel committed
41
#include "rrc_types.h"
42
#include "PHY/defs.h"
43
44
#include "LAYER2/RLC/rlc.h"

45
#include "COMMON/platform_constants.h"
46
#include "COMMON/platform_types.h"
47
48
49

#include "LAYER2/MAC/defs.h"

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
50
//for D2D
51
52
53
54
55
56
57
58
59
60
#define CONTROL_SOCKET_PORT_NO 8888
#define DEBUG_CTRL_SOCKET
#define BUFSIZE 1024
#define CONTROL_SOCKET_PORT_NO 8888

//netlink
//#define DEBUG_PDCP
#define UE_IP_PDCP_NETLINK_ID 31
#define PDCP_PID 1
#define NETLINK_HEADER_SIZE 16
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
61
62
#define SL_DEFAULT_RAB_ID     3
#define SLRB_ID              3
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

#define MAX_PAYLOAD 1024 /* maximum payload size*/

#define UE_STATE_NOTIFICATION_INTERVAL      50

#define IPV4_ADDR    "%u.%u.%u.%u"
#define IPV4_ADDR_FORMAT(aDDRESS)                 \
      (uint8_t)((aDDRESS)  & 0x000000ff),         \
      (uint8_t)(((aDDRESS) & 0x0000ff00) >> 8 ),  \
      (uint8_t)(((aDDRESS) & 0x00ff0000) >> 16),  \
      (uint8_t)(((aDDRESS) & 0xff000000) >> 24)


//-----------------------------------------------------
// header for Control socket

//Primitives
#define SESSION_INIT_REQ                    1
#define UE_STATUS_INFO                      2
#define GROUP_COMMUNICATION_ESTABLISH_REQ   3
#define GROUP_COMMUNICATION_ESTABLISH_RSP   4
#define DIRECT_COMMUNICATION_ESTABLISH_REQ  5
#define DIRECT_COMMUNICATION_ESTABLISH_RSP  6
#define GROUP_COMMUNICATION_RELEASE_REQ     7
#define GROUP_COMMUNICATION_RELEASE_RSP     8
88
89
#define PC5S_ESTABLISH_REQ                  9
#define PC5S_ESTABLISH_RSP                  10
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
90
#define PC5_DISCOVERY_ANNOUNCEMENT          11
91

92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

typedef enum {
   UE_STATE_OFF_NETWORK,
   UE_STATE_ON_NETWORK
} SL_UE_STATE_t;

typedef enum {
   GROUP_COMMUNICATION_RELEASE_OK = 0,
   GROUP_COMMUNICATION_RELEASE_FAILURE
} Group_Communication_Status_t;

struct GroupCommunicationEstablishReq {
   uint8_t type; //0 - rx, 1 - tx
   uint32_t sourceL2Id;
   uint32_t groupL2Id;
   uint32_t groupIpAddress;
   uint8_t pppp;
};

111
112
113
114
115
116
struct GroupCommunicationReleaseReq {
   uint32_t sourceL2Id;
   uint32_t groupL2Id;
   int slrb_id;
};

117
118
119
struct DirectCommunicationEstablishReq {
   uint32_t sourceL2Id;
   uint32_t destinationL2Id;
120
   uint32_t pppp;
121
122
};

123
struct PC5SEstablishReq{
124
   uint8_t type;
125
126
127
128
129
130
131
132
133
   uint32_t sourceL2Id;
   uint32_t destinationL2Id;
};

struct PC5SEstablishRsp{
   uint32_t sourceL2Id;
   uint32_t destinationL2Id;
   uint8_t status;
};
134

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
135
136
137
138
139
140
141
142
//example of PC5_DSICOVERY ANNOUNCEMENT (for testing only)
typedef struct  {
   uint8_t msg_type;
   uint32_t discoveryGroupId;
   //AnnouncerInfo
   uint32_t proSeUEId;
}  __attribute__((__packed__)) PC5DiscoveryAnnouncement;

143
144
145
146
147
148
149
150
151
struct sidelink_ctrl_element {
   unsigned short type;
   union {
      struct GroupCommunicationEstablishReq group_comm_establish_req;
      struct DirectCommunicationEstablishReq direct_comm_estblish_req;
      Group_Communication_Status_t group_comm_release_rsp;
      //struct DirectCommunicationReleaseReq  direct_comm_release_req;
      SL_UE_STATE_t ue_state;
      int slrb_id;
152
153
      struct PC5SEstablishReq pc5s_establish_req;
      struct PC5SEstablishRsp pc5s_establish_rsp;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
154
      PC5DiscoveryAnnouncement pc5_discovery_announcement;
155
156
157
   } sidelinkPrimitive;
};

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
158

159
160
161
162
163
164
165
166
//global variables
extern struct sockaddr_in clientaddr;
extern int slrb_id;
extern pthread_mutex_t slrb_mutex;

//the thread function
void *send_UE_status_notification(void *);

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
167

168

169
170
171
172
173
174
175
176
177
178
179
180
//#include "COMMON/openair_defs.h"
#ifndef USER_MODE
#include <rtai.h>
#endif

#include "SystemInformationBlockType1.h"
#include "SystemInformation.h"
#include "RRCConnectionReconfiguration.h"
#include "RRCConnectionReconfigurationComplete.h"
#include "RRCConnectionSetup.h"
#include "RRCConnectionSetupComplete.h"
#include "RRCConnectionRequest.h"
181
#include "RRCConnectionReestablishmentRequest.h"
182
#include "BCCH-DL-SCH-Message.h"
183
#include "SBCCH-SL-BCH-MessageType.h"
184
#include "BCCH-BCH-Message.h"
Cedric Roux's avatar
Cedric Roux committed
185
#if defined(Rel10) || defined(Rel14)
186
187
#include "MCCH-Message.h"
#include "MBSFNAreaConfiguration-r9.h"
188
#include "SCellToAddMod-r10.h"
189
#endif
190
191
#include "AS-Config.h"
#include "AS-Context.h"
192
193
#include "UE-EUTRA-Capability.h"
#include "MeasResults.h"
194
#include "SidelinkUEInformation-r12.h"
195

Cedric Roux's avatar
Cedric Roux committed
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
/* correct Rel(8|10)/Rel14 differences
 * the code is in favor of Rel14, those defines do the translation
 */
#if !defined(Rel14)
#  define CipheringAlgorithm_r12_t e_SecurityAlgorithmConfig__cipheringAlgorithm
#  define CipheringAlgorithm_r12_eea0 SecurityAlgorithmConfig__cipheringAlgorithm_eea0
#  define CipheringAlgorithm_r12_eea1 SecurityAlgorithmConfig__cipheringAlgorithm_eea1
#  define CipheringAlgorithm_r12_eea2 SecurityAlgorithmConfig__cipheringAlgorithm_eea2
#  define CipheringAlgorithm_r12_spare1 SecurityAlgorithmConfig__cipheringAlgorithm_spare1
#  define Alpha_r12_al0 UplinkPowerControlCommon__alpha_al0
#  define Alpha_r12_al04 UplinkPowerControlCommon__alpha_al04
#  define Alpha_r12_al05 UplinkPowerControlCommon__alpha_al05
#  define Alpha_r12_al06 UplinkPowerControlCommon__alpha_al06
#  define Alpha_r12_al07 UplinkPowerControlCommon__alpha_al07
#  define Alpha_r12_al08 UplinkPowerControlCommon__alpha_al08
#  define Alpha_r12_al09 UplinkPowerControlCommon__alpha_al09
#  define Alpha_r12_al1 UplinkPowerControlCommon__alpha_al1
#  define PreambleTransMax_n3 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3
#  define PreambleTransMax_n4 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4
#  define PreambleTransMax_n5 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5
#  define PreambleTransMax_n6 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6
#  define PreambleTransMax_n7 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7
#  define PreambleTransMax_n8 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8
#  define PreambleTransMax_n10 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10
#  define PreambleTransMax_n20 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20
#  define PreambleTransMax_n50 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50
#  define PreambleTransMax_n100 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100
#  define PreambleTransMax_n200 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200
#  define PeriodicBSR_Timer_r12_sf5 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf5
#  define PeriodicBSR_Timer_r12_sf10 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf10
#  define PeriodicBSR_Timer_r12_sf16 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf16
#  define PeriodicBSR_Timer_r12_sf20 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf20
#  define PeriodicBSR_Timer_r12_sf32 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf32
#  define PeriodicBSR_Timer_r12_sf40 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf40
#  define PeriodicBSR_Timer_r12_sf64 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf64
#  define PeriodicBSR_Timer_r12_sf80 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf80
#  define PeriodicBSR_Timer_r12_sf128 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf128
#  define PeriodicBSR_Timer_r12_sf160 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf160
#  define PeriodicBSR_Timer_r12_sf320 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf320
#  define PeriodicBSR_Timer_r12_sf640 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf640
#  define PeriodicBSR_Timer_r12_sf1280 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf1280
#  define PeriodicBSR_Timer_r12_sf2560 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf2560
#  define PeriodicBSR_Timer_r12_infinity MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
#  define RetxBSR_Timer_r12_sf320 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf320
#  define RetxBSR_Timer_r12_sf640 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf640
#  define RetxBSR_Timer_r12_sf1280 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf1280
#  define RetxBSR_Timer_r12_sf2560 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560
#  define RetxBSR_Timer_r12_sf5120 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf5120
#  define RetxBSR_Timer_r12_sf10240 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf10240
#endif

247
// This corrects something generated by asn1c which is different between Rel8 and Rel10
Cedric Roux's avatar
Cedric Roux committed
248
#if !defined(Rel10) && !defined(Rel14)
249
250
251
252
253
254
255
256
257
258
259
260
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member SystemInformation_r8_IEs_sib_TypeAndInfo_Member
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib2
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib3
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib4
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib5
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib6
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib7
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib8
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib9
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib10
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib11
#endif
261
262
263
264
265
266
267


#define NB_SIG_CNX_CH 1
#define NB_CNX_CH MAX_MOBILES_PER_ENB
#define NB_SIG_CNX_UE 2 //MAX_MANAGED_RG_PER_MOBILE
#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE

268
/*
Cedric Roux's avatar
Cedric Roux committed
269
#if defined(Rel10) || defined(Rel14)
270
271
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib12_v920
#define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib13_v920
272
#endif
273
*/
274
275
276
277
278
279
280
//#include "L3_rrc_defs.h"
#ifndef NO_RRM
#include "L3_rrc_interface.h"
#include "rrc_rrm_msg.h"
#include "rrc_rrm_interface.h"
#endif

281
282
283
284
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
#endif

Cedric Roux's avatar
Cedric Roux committed
285
286
287
288
289
290
291
292
/* TODO: be sure this include is correct.
 * It solves a problem of compilation of the RRH GW,
 * issue #186.
 */
#if !defined(ENABLE_ITTI)
# include "as_message.h"
#endif

293
294
295
296
#if defined(ENABLE_USE_MME)
# include "commonDef.h"
#endif

297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
//--------
typedef unsigned int uid_t;
#define UID_LINEAR_ALLOCATOR_BITMAP_SIZE (((NUMBER_OF_UE_MAX/8)/sizeof(unsigned int)) + 1)
typedef struct uid_linear_allocator_s {
  unsigned int   bitmap[UID_LINEAR_ALLOCATOR_BITMAP_SIZE];
} uid_allocator_t;

//--------



#define PROTOCOL_RRC_CTXT_UE_FMT           PROTOCOL_CTXT_FMT
#define PROTOCOL_RRC_CTXT_UE_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp)

#define PROTOCOL_RRC_CTXT_FMT           PROTOCOL_CTXT_FMT
#define PROTOCOL_RRC_CTXT_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp)
313
314
/** @defgroup _rrc RRC 
 * @ingroup _oai2
315
316
317
318
 * @{
 */


319
320
#define UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!!
#define UE_INDEX_INVALID  ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! used to be -1
winckel's avatar
winckel committed
321

322
323
324
325
326
327
328
329
typedef enum {
  RRC_OK=0,
  RRC_ConnSetup_failed,
  RRC_PHY_RESYNCH,
  RRC_Handover_failed,
  RRC_HO_STARTED
} RRC_status_t;

winckel's avatar
winckel committed
330
typedef enum UE_STATE_e {
winckel's avatar
winckel committed
331
332
  RRC_INACTIVE=0,
  RRC_IDLE,
333
334
  RRC_SI_RECEIVED,
  RRC_CONNECTED,
335
336
  RRC_RECONFIGURED,
  RRC_HO_EXECUTION
337
338
} UE_STATE_t;

winckel's avatar
winckel committed
339
typedef enum HO_STATE_e {
340
341
342
343
344
345
346
  HO_IDLE=0,
  HO_MEASURMENT,
  HO_PREPARE,
  HO_CMD, // initiated by the src eNB
  HO_COMPLETE // initiated by the target eNB
} HO_STATE_t;

347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
typedef enum SL_TRIGGER_e {
  SL_RECEIVE_COMMUNICATION=0,
  SL_TRANSMIT_RELAY_ONE_TO_ONE,
  SL_TRANSMIT_RELAY_ONE_TO_MANY,
  SL_TRANSMIT_NON_RELAY_ONE_TO_ONE,
  SL_TRANSMIT_NON_RELAY_ONE_TO_MANY,
  SL_RECEIVE_DISCOVERY,
  SL_TRANSMIT_NON_PS_DISCOVERY,
  SL_TRANSMIT_PS_DISCOVERY,
  SL_RECEIVE_V2X,
  SL_TRANSMIT_V2X,
  SL_REQUEST_DISCOVERY_TRANSMISSION_GAPS,
  SL_REQUEST_DISCOVERY_RECEPTION_GAPS
} SL_TRIGGER_t;

362
363
//#define NUMBER_OF_UE_MAX MAX_MOBILES_PER_RG
#define RRM_FREE(p)       if ( (p) != NULL) { free(p) ; p=NULL ; }
364
365
366
#define RRM_MALLOC(t,n)   (t *) malloc16( sizeof(t) * n )
#define RRM_CALLOC(t,n)   (t *) malloc16( sizeof(t) * n)
#define RRM_CALLOC2(t,s)  (t *) malloc16( s )
367

368
369
370
#define MAX_MEAS_OBJ 6
#define MAX_MEAS_CONFIG 6
#define MAX_MEAS_ID 6
371
372

#define PAYLOAD_SIZE_MAX 1024
373
#define RRC_BUF_SIZE 255
374
#define UNDEF_SECURITY_MODE 0xff
375
#define NO_SECURITY_MODE 0x20
376
377
378
379

#define CBA_OFFSET        0xfff4
// #define NUM_MAX_CBA_GROUP 4 // in the platform_constants

380
381
382
/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */
#define RRC_TRANSACTION_IDENTIFIER_NUMBER  3

383
384
385
386
387
388
389
390
391
392
393
394
typedef struct {
  unsigned short transport_block_size;                  /*!< \brief Minimum PDU size in bytes provided by RLC to MAC layer interface */
  unsigned short max_transport_blocks;                  /*!< \brief Maximum PDU size in bytes provided by RLC to MAC layer interface */
  unsigned long  Guaranteed_bit_rate;           /*!< \brief Guaranteed Bit Rate (average) to be offered by MAC layer scheduling*/
  unsigned long  Max_bit_rate;                  /*!< \brief Maximum Bit Rate that can be offered by MAC layer scheduling*/
  uint8_t  Delay_class;                  /*!< \brief Delay class offered by MAC layer scheduling*/
  uint8_t  Target_bler;                  /*!< \brief Target Average Transport Block Error rate*/
  uint8_t  Lchan_t;                      /*!< \brief Logical Channel Type (BCCH,CCCH,DCCH,DTCH_B,DTCH,MRBCH)*/
} __attribute__ ((__packed__))  LCHAN_DESC;

#define LCHAN_DESC_SIZE sizeof(LCHAN_DESC)

winckel's avatar
winckel committed
395
typedef struct UE_RRC_INFO_s {
396
  UE_STATE_t State;
gauthier's avatar
gauthier committed
397
  uint8_t SIB1systemInfoValueTag;
398
399
  uint32_t SIStatus;
  uint32_t SIcnt;
Cedric Roux's avatar
Cedric Roux committed
400
#if defined(Rel10) || defined(Rel14)
gauthier's avatar
gauthier committed
401
  uint8_t MCCHStatus[8]; // MAX_MBSFN_AREA
402
#endif
403
  uint8_t SIwindowsize; //!< Corresponds to the SIB1 si-WindowLength parameter. The unit is ms. Possible values are (final): 1,2,5,10,15,20,40
gauthier's avatar
gauthier committed
404
  uint8_t handoverTarget;
405
  HO_STATE_t ho_state;
406
  uint16_t SIperiod; //!< Corresponds to the SIB1 si-Periodicity parameter (multiplied by 10). Possible values are (final): 80,160,320,640,1280,2560,5120
407
  unsigned short UE_index;
gauthier's avatar
gauthier committed
408
409
410
411
412
413
414
415
  uint32_t T300_active;
  uint32_t T300_cnt;
  uint32_t T304_active;
  uint32_t T304_cnt;
  uint32_t T310_active;
  uint32_t T310_cnt;
  uint32_t N310_cnt;
  uint32_t N311_cnt;
416
  rnti_t   rnti;
winckel's avatar
winckel committed
417
} __attribute__ ((__packed__)) UE_RRC_INFO;
418

419
typedef struct UE_S_TMSI_s {
gauthier's avatar
gauthier committed
420
421
422
  boolean_t  presence;
  mme_code_t mme_code;
  m_tmsi_t   m_tmsi;
winckel's avatar
winckel committed
423
} __attribute__ ((__packed__)) UE_S_TMSI;
424

425
#if defined(ENABLE_ITTI)
winckel's avatar
winckel committed
426
typedef enum e_rab_satus_e {
427
  E_RAB_STATUS_NEW,
428
429
  E_RAB_STATUS_DONE, // from the eNB perspective
  E_RAB_STATUS_ESTABLISHED, // get the reconfigurationcomplete form UE
430
  E_RAB_STATUS_FAILED,
winckel's avatar
winckel committed
431
432
} e_rab_status_t;

433
typedef struct e_rab_param_s {
434
435
  e_rab_t param;
  uint8_t status;
436
  uint8_t xid; // transaction_id
winckel's avatar
winckel committed
437
} __attribute__ ((__packed__)) e_rab_param_t;
438
439
#endif

440
441


442
/* Intermediate structure for Handover management. Associated per-UE in eNB_RRC_INST */
winckel's avatar
winckel committed
443
typedef struct HANDOVER_INFO_s {
gauthier's avatar
gauthier committed
444
445
446
447
448
449
  uint8_t ho_prepare;
  uint8_t ho_complete;
  uint8_t modid_s; //module_idP of serving cell
  uint8_t modid_t; //module_idP of target cell
  uint8_t ueid_s; //UE index in serving cell
  uint8_t ueid_t; //UE index in target cell
450
451
  AS_Config_t as_config; /* these two parameters are taken from 36.331 section 10.2.2: HandoverPreparationInformation-r8-IEs */
  AS_Context_t as_context; /* They are mandatory for HO */
452
453
  uint8_t buf[RRC_BUF_SIZE];  /* ASN.1 encoded handoverCommandMessage */
  int size;   /* size of above message in bytes */
winckel's avatar
winckel committed
454
} HANDOVER_INFO;
455
456
457

#define RRC_HEADER_SIZE_MAX 64
#define RRC_BUFFER_SIZE_MAX 1024
458
typedef struct {
459
  char Payload[RRC_BUFFER_SIZE_MAX];
460
  char Header[RRC_HEADER_SIZE_MAX];
461
  char payload_size;
462
} RRC_BUFFER;
463
464
#define RRC_BUFFER_SIZE sizeof(RRC_BUFFER)

winckel's avatar
winckel committed
465
typedef struct RB_INFO_s {
gauthier's avatar
gauthier committed
466
  uint16_t Rb_id;  //=Lchan_id
467
  LCHAN_DESC Lchan_desc[2];
468
  //  MAC_MEAS_REQ_ENTRY *Meas_entry;
winckel's avatar
winckel committed
469
} RB_INFO;
470

winckel's avatar
winckel committed
471
typedef struct SRB_INFO_s {
gauthier's avatar
gauthier committed
472
  uint16_t Srb_id;  //=Lchan_id
473
474
  RRC_BUFFER Rx_buffer;
  RRC_BUFFER Tx_buffer;
475
476
  LCHAN_DESC Lchan_desc[2];
  unsigned int Trans_id;
gauthier's avatar
gauthier committed
477
  uint8_t Active;
winckel's avatar
winckel committed
478
} SRB_INFO;
479

winckel's avatar
winckel committed
480
typedef struct RB_INFO_TABLE_ENTRY_s {
481
  RB_INFO Rb_info;
gauthier's avatar
gauthier committed
482
483
484
  uint8_t Active;
  uint32_t Next_check_frame;
  uint8_t Status;
winckel's avatar
winckel committed
485
} RB_INFO_TABLE_ENTRY;
486

winckel's avatar
winckel committed
487
typedef struct SRB_INFO_TABLE_ENTRY_s {
488
  SRB_INFO Srb_info;
gauthier's avatar
gauthier committed
489
490
  uint8_t Active;
  uint8_t Status;
491
  uint32_t Next_check_frame; 
492
} SRB_INFO_TABLE_ENTRY;
493

winckel's avatar
winckel committed
494
typedef struct MEAS_REPORT_LIST_s {
495
  MeasId_t measId;
496
  //CellsTriggeredList  cellsTriggeredList;//OPTIONAL
gauthier's avatar
gauthier committed
497
  uint32_t numberOfReportsSent;
498
} MEAS_REPORT_LIST;
499

winckel's avatar
winckel committed
500
typedef struct HANDOVER_INFO_UE_s {
501
  PhysCellId_t targetCellId;
gauthier's avatar
gauthier committed
502
  uint8_t measFlag;
winckel's avatar
winckel committed
503
} HANDOVER_INFO_UE;
504

505
typedef struct eNB_RRC_UE_s {
506
  uint8_t                            primaryCC_id;
Cedric Roux's avatar
Cedric Roux committed
507
#if defined(Rel10) || defined(Rel14)
508
509
510
  SCellToAddMod_r10_t                sCell_config[2];
#endif
  SRB_ToAddModList_t*                SRB_configList;
511
  SRB_ToAddModList_t*                SRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER];
512
  DRB_ToAddModList_t*                DRB_configList;
513
  DRB_ToAddModList_t*                DRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER];
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
  uint8_t                            DRB_active[8];
  struct PhysicalConfigDedicated*    physicalConfigDedicated;
  struct SPS_Config*                 sps_Config;
  MeasObjectToAddMod_t*              MeasObj[MAX_MEAS_OBJ];
  struct ReportConfigToAddMod*       ReportConfig[MAX_MEAS_CONFIG];
  struct QuantityConfig*             QuantityConfig;
  struct MeasIdToAddMod*             MeasId[MAX_MEAS_ID];
  MAC_MainConfig_t*                  mac_MainConfig;
  MeasGapConfig_t*                   measGapConfig;
  SRB_INFO                           SI;
  SRB_INFO                           Srb0;
  SRB_INFO_TABLE_ENTRY               Srb1;
  SRB_INFO_TABLE_ENTRY               Srb2;
  MeasConfig_t*                      measConfig;
  HANDOVER_INFO*                     handover_info;

#if defined(ENABLE_SECURITY)
  /* KeNB as derived from KASME received from EPC */
  uint8_t kenb[32];
#endif
  /* Used integrity/ciphering algorithms */
Cedric Roux's avatar
Cedric Roux committed
535
  CipheringAlgorithm_r12_t                          ciphering_algorithm;
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
  e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm;

  uint8_t                            Status;
  rnti_t                             rnti;
  uint64_t                           random_ue_identity;

#if defined(ENABLE_ITTI)
  /* Information from UE RRC ConnectionRequest */
  UE_S_TMSI                          Initialue_identity_s_TMSI;
  EstablishmentCause_t               establishment_cause;

  /* Information from UE RRC ConnectionReestablishmentRequest */
  ReestablishmentCause_t             reestablishment_cause;

  /* UE id for initial connection to S1AP */
  uint16_t                           ue_initial_id;

  /* Information from S1AP initial_context_setup_req */
  uint32_t                           eNB_ue_s1ap_id :24;

  security_capabilities_t            security_capabilities;

558
559
  /* Total number of e_rab already setup in the list */
  uint8_t                           setup_e_rabs;
560
561
562
  /* Number of e_rab to be setup in the list */
  uint8_t                            nb_of_e_rabs;
  /* list of e_rab to be setup by RRC layers */
563
  e_rab_param_t                      e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
564
565
566
567
568
569

  // LG: For GTPV1 TUNNELS
  uint32_t                           enb_gtp_teid[S1AP_MAX_E_RAB];
  transport_layer_addr_t             enb_gtp_addrs[S1AP_MAX_E_RAB];
  rb_id_t                            enb_gtp_ebi[S1AP_MAX_E_RAB];
#endif
570
  uint32_t                           ul_failure_timer;
571
  uint32_t                           ue_release_timer;
572
  uint32_t                           ue_release_timer_thres;
573
574
575
} eNB_RRC_UE_t;

typedef uid_t ue_uid_t;
576

577
578
579
580
581
582
583
584
585
typedef struct rrc_eNB_ue_context_s {
  /* Tree related data */
  RB_ENTRY(rrc_eNB_ue_context_s) entries;

  /* Uniquely identifies the UE between MME and eNB within the eNB.
   * This id is encoded on 24bits.
   */
  rnti_t         ue_id_rnti;

586
  // another key for protocol layers but should not be used as a key for RB tree
587
588
589
590
591
  ue_uid_t       local_uid;

  /* UE id for initial connection to S1AP */
  struct eNB_RRC_UE_s   ue_context;
} rrc_eNB_ue_context_t;
592

593
typedef struct {
594
595
  uint8_t                           *MIB;
  uint8_t                           sizeof_MIB;
596
597
598
599
  uint8_t                           *SIB1;
  uint8_t                           sizeof_SIB1;
  uint8_t                           *SIB23;
  uint8_t                           sizeof_SIB23;
600
#ifdef Rel14
601
602
  uint8_t                           *SIB1_BR;
  uint8_t                           sizeof_SIB1_BR;
603
604
605
  uint8_t                           *SIB23_BR;
  uint8_t                           sizeof_SIB23_BR;
#endif
606
607
608
609
610
  int                               physCellId;
  int                               Ncp;
  int                               p_eNB;
  uint32_t                          dl_CarrierFreq;
  uint32_t                          ul_CarrierFreq;
611
  uint32_t                          pbch_repetition;
612
613
614
615
616
617
  BCCH_BCH_Message_t                mib;
  BCCH_DL_SCH_Message_t             siblock1;
  BCCH_DL_SCH_Message_t             systemInformation;
  //  SystemInformation_t               systemInformation;
  SystemInformationBlockType1_t     *sib1;
  SystemInformationBlockType2_t     *sib2;
618
  SystemInformationBlockType3_t     *sib3;
619
#ifdef Rel14
620
  SystemInformationBlockType1_t     *sib1_BR;
621
  SystemInformationBlockType2_t     *sib2_BR;
622
  SystemInformationBlockType2_t     *sib3_BR;
623
#endif
Cedric Roux's avatar
Cedric Roux committed
624
#if defined(Rel10) || defined(Rel14)
625
626
  SystemInformationBlockType13_r9_t *sib13;
  uint8_t                           MBMS_flag;
627
628
629
  uint8_t                           num_mbsfn_sync_area;
  uint8_t                           **MCCH_MESSAGE; //  MAX_MBSFN_AREA
  uint8_t                           sizeof_MCCH_MESSAGE[8];// MAX_MBSFN_AREA
630
  MCCH_Message_t            mcch;
631
  MBSFNAreaConfiguration_r9_t       *mcch_message;
632
  SRB_INFO                          MCCH_MESS[8];// MAX_MBSFN_AREA
633
#endif
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
634
635
636
637
638
  //TTN - SIB 18,19,21 for D2D
  SystemInformationBlockType18_r12_t *sib18;
  SystemInformationBlockType19_r12_t *sib19;
  SystemInformationBlockType21_r14_t *sib21;
  // End - TTN
639
640
  SRB_INFO                          SI;
  SRB_INFO                          Srb0;
641
} rrc_eNB_carrier_data_t;
642
643

typedef struct eNB_RRC_INST_s {
644
645
  /// southbound midhaul configuration
  eth_params_t                    eth_params_s;
646
  rrc_eNB_carrier_data_t          carrier[MAX_NUM_CCs];
647
648
  uid_allocator_t                    uid_allocator; // for rrc_ue_head
  RB_HEAD(rrc_ue_tree_s, rrc_eNB_ue_context_s)     rrc_ue_head; // ue_context tree key search by rnti
649
  uint8_t                           HO_flag;
650
  uint8_t                            Nb_ue;
651
652
653
  hash_table_t                      *initial_id2_s1ap_ids; // key is    content is rrc_ue_s1ap_ids_t
  hash_table_t                      *s1ap_id2_s1ap_ids   ; // key is    content is rrc_ue_s1ap_ids_t

654
655
656
657
658
659
#ifdef LOCALIZATION
  /// localization type, 0: power based, 1: time based
  uint8_t loc_type;
  /// epoch timestamp in millisecond, RRC
  int32_t reference_timestamp_ms;
  /// aggregate physical states every n millisecond
660
  int32_t aggregation_period_ms;
661
662
  /// localization list for aggregated measurements from PHY
  struct list loc_list;
663
#endif
664

665
  //RRC configuration
666
#if defined(ENABLE_ITTI)
667
  RrcConfigurationReq configuration;
668
#endif
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
  // other PLMN parameters
  /// Mobile country code
  int mcc;
  /// Mobile network code
  int mnc;
  /// number of mnc digits
  int mnc_digit_length;

  // other RAN parameters
  int srb1_timer_poll_retransmit;
  int srb1_poll_pdu;
  int srb1_poll_byte;
  int srb1_max_retx_threshold;
  int srb1_timer_reordering;
  int srb1_timer_status_prohibit;
  int srs_enable[MAX_NUM_CCs];
685
686
687
} eNB_RRC_INST;

#define MAX_UE_CAPABILITY_SIZE 255
winckel's avatar
winckel committed
688
typedef struct OAI_UECapability_s {
689
690
691
692
693
  uint8_t sdu[MAX_UE_CAPABILITY_SIZE];
  uint8_t sdu_size;
  UE_EUTRA_Capability_t *UE_EUTRA_Capability;
} OAI_UECapability_t;

winckel's avatar
winckel committed
694
typedef struct UE_RRC_INST_s {
winckel's avatar
winckel committed
695
696
  Rrc_State_t     RrcState;
  Rrc_Sub_State_t RrcSubState;
697
# if defined(ENABLE_USE_MME)
winckel's avatar
winckel committed
698
699
700
  plmn_t          plmnID;
  Byte_t          rat;
  as_nas_info_t   initialNasMsg;
701
# endif
knopp's avatar
   
knopp committed
702
  OAI_UECapability_t *UECap;
703
704
705
706
707
708
  uint8_t *UECapability;
  uint8_t UECapability_size;
  UE_RRC_INFO Info[NB_SIG_CNX_UE];
  SRB_INFO Srb0[NB_SIG_CNX_UE];
  SRB_INFO_TABLE_ENTRY Srb1[NB_CNX_UE];
  SRB_INFO_TABLE_ENTRY Srb2[NB_CNX_UE];
709
  HANDOVER_INFO_UE HandoverInfoUe;
gauthier's avatar
gauthier committed
710
711
712
713
714
715
  uint8_t *SIB1[NB_CNX_UE];
  uint8_t sizeof_SIB1[NB_CNX_UE];
  uint8_t *SI[NB_CNX_UE];
  uint8_t sizeof_SI[NB_CNX_UE];
  uint8_t SIB1Status[NB_CNX_UE];
  uint8_t SIStatus[NB_CNX_UE];
716
  SystemInformationBlockType1_t *sib1[NB_CNX_UE];
717
  SystemInformation_t *si[NB_CNX_UE]; //!< Temporary storage for an SI message. Decoding happens in decode_SI().
718
719
720
721
722
723
724
725
726
727
  SystemInformationBlockType2_t *sib2[NB_CNX_UE];
  SystemInformationBlockType3_t *sib3[NB_CNX_UE];
  SystemInformationBlockType4_t *sib4[NB_CNX_UE];
  SystemInformationBlockType5_t *sib5[NB_CNX_UE];
  SystemInformationBlockType6_t *sib6[NB_CNX_UE];
  SystemInformationBlockType7_t *sib7[NB_CNX_UE];
  SystemInformationBlockType8_t *sib8[NB_CNX_UE];
  SystemInformationBlockType9_t *sib9[NB_CNX_UE];
  SystemInformationBlockType10_t *sib10[NB_CNX_UE];
  SystemInformationBlockType11_t *sib11[NB_CNX_UE];
728
729
  uint8_t                           *MIB;
#ifdef Rel14
730
  //SIB18
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
731
  SystemInformationBlockType18_r12_t *sib18[NB_CNX_UE];
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
732
  SystemInformationBlockType19_r12_t *sib19[NB_CNX_UE];
733

734
  SBCCH_SL_BCH_MessageType_t   mib_sl[NB_CNX_UE];
735
736
  /// Preconfiguration for Sidelink
  struct SL_Preconfiguration_r12 *SL_Preconfiguration[NB_CNX_UE];
737
738
739
740
741
742
  //source L2 Id
  uint32_t sourceL2Id;
  //group L2 Id
  uint32_t groupL2Id;
  //destination L2 Id
  uint32_t destinationL2Id;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
743
744
  //sl_discovery..
  SRB_INFO SL_Discovery[NB_CNX_UE];
745
#endif
746

Cedric Roux's avatar
Cedric Roux committed
747
#if defined(Rel10) || defined(Rel14)
748
  uint8_t                           MBMS_flag;
gauthier's avatar
gauthier committed
749
750
751
  uint8_t *MCCH_MESSAGE[NB_CNX_UE];
  uint8_t sizeof_MCCH_MESSAGE[NB_CNX_UE];
  uint8_t MCCH_MESSAGEStatus[NB_CNX_UE];
752
  MBSFNAreaConfiguration_r9_t       *mcch_message[NB_CNX_UE];
753
754
  SystemInformationBlockType12_r9_t *sib12[NB_CNX_UE];
  SystemInformationBlockType13_r9_t *sib13[NB_CNX_UE];
755
#endif
756
757
758
759
#ifdef CBA
  uint8_t                         num_active_cba_groups;
  uint16_t                        cba_rnti[NUM_MAX_CBA_GROUP];
#endif
760
  uint8_t                         num_srb;
761
762
763
  struct SRB_ToAddMod             *SRB1_config[NB_CNX_UE];
  struct SRB_ToAddMod             *SRB2_config[NB_CNX_UE];
  struct DRB_ToAddMod             *DRB_config[NB_CNX_UE][8];
764
  rb_id_t                         *defaultDRB; // remember the ID of the default DRB
765
766
767
768
  MeasObjectToAddMod_t            *MeasObj[NB_CNX_UE][MAX_MEAS_OBJ];
  struct ReportConfigToAddMod     *ReportConfig[NB_CNX_UE][MAX_MEAS_CONFIG];
  struct QuantityConfig           *QuantityConfig[NB_CNX_UE];
  struct MeasIdToAddMod           *MeasId[NB_CNX_UE][MAX_MEAS_ID];
769
770
  MEAS_REPORT_LIST      *measReportList[NB_CNX_UE][MAX_MEAS_ID];
  uint32_t           measTimer[NB_CNX_UE][MAX_MEAS_ID][6]; // 6 neighboring cells
771
  RSRP_Range_t                    s_measure;
772
  struct MeasConfig__speedStatePars *speedStatePars;
773
774
775
776
  struct PhysicalConfigDedicated  *physicalConfigDedicated[NB_CNX_UE];
  struct SPS_Config               *sps_Config[NB_CNX_UE];
  MAC_MainConfig_t                *mac_MainConfig[NB_CNX_UE];
  MeasGapConfig_t                 *measGapConfig[NB_CNX_UE];
777
  double                          filter_coeff_rsrp; // [7] ???
778
  double                          filter_coeff_rsrq; // [7] ???
779
780
781
782
  float                           rsrp_db[7];
  float                           rsrq_db[7];
  float                           rsrp_db_filtered[7];
  float                           rsrq_db_filtered[7];
783
784
785
786
787
788
#if defined(ENABLE_SECURITY)
  /* KeNB as computed from parameters within USIM card */
  uint8_t kenb[32];
#endif

  /* Used integrity/ciphering algorithms */
Cedric Roux's avatar
Cedric Roux committed
789
  CipheringAlgorithm_r12_t                          ciphering_algorithm;
790
  e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm;
791
792
793
794
795

#ifdef Rel14
  /// Used for Sidelink Preconfiguration
  DRB_ToAddModList_t *DRB_configList;
#endif
winckel's avatar
winckel committed
796
} UE_RRC_INST;
797

798
#include "proto.h"
winckel's avatar
winckel committed
799

800
#endif
801
/** @} */