proto.h 16.8 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 21
 * 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 23 24
/*! \file proto.h
 * \brief RRC functions prototypes for eNB and UE
 * \author Navid Nikaein and Raymond Knopp
25
 * \date 2010 - 2014
26 27
 * \email navid.nikaein@eurecom.fr
 * \version 1.0
28 29 30 31
 
 */
/** \addtogroup _rrc
 *  @{
32 33
 */

34 35
#include "RRC/LITE/defs.h"

Xenofon Foukas's avatar
Xenofon Foukas committed
36 37
#include "flexran_agent_extern.h"

38 39 40
//main.c
int rrc_init_global_param(void);
int L3_xface_init(void);
41
void openair_rrc_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,uint8_t HO_enabled);
42 43
#if defined(ENABLE_ITTI)
char
44
openair_rrc_eNB_configuration(
45 46 47 48
  const module_id_t enb_mod_idP,
  RrcConfigurationReq* configuration
);
#endif
49
char openair_rrc_eNB_init(
50 51
  const module_id_t module_idP);

52
char openair_rrc_ue_init(
53 54
  const module_id_t module_idP,
  const uint8_t CH_IDX);
55
void rrc_config_buffer(SRB_INFO *srb_info, uint8_t Lchan_type, uint8_t Role);
56 57 58
void
openair_rrc_on(
  const protocol_ctxt_t* const ctxt_pP);
59 60 61 62
void
openair_rrc_on_ue(
  const protocol_ctxt_t* const ctxt_pP);

63 64
void rrc_top_cleanup(void);

65
/** \brief Function to update eNB timers every subframe.  
66 67 68
@param ctxt_pP  running context
@param enb_index
@param CC_id
69
*/
70 71
RRC_status_t
rrc_rx_tx(
72 73 74 75 76 77 78 79 80 81 82
  protocol_ctxt_t* const ctxt_pP,
  const int          CC_id
);

/** \brief Function to update timers every subframe.  For UE it updates T300,T304 and T310.
@param ctxt_pP  running context
@param enb_index
@param CC_id
*/
RRC_status_t
rrc_rx_tx_ue(
83
  protocol_ctxt_t* const ctxt_pP,
84 85 86
  const uint8_t      enb_index,
  const int          CC_id
);
87 88 89 90

// UE RRC Procedures

/** \brief Decodes DL-CCCH message and invokes appropriate routine to handle the message
91
    \param ctxt_pP Running context
92 93
    \param Srb_info Pointer to SRB_INFO structure (SRB0)
    \param eNB_index Index of corresponding eNB/CH*/
94
int rrc_ue_decode_ccch( const protocol_ctxt_t* const ctxt_pP, const SRB_INFO* const Srb_info, const uint8_t eNB_index );
95 96

/** \brief Decodes a DL-DCCH message and invokes appropriate routine to handle the message
97
    \param ctxt_pP Running context
98 99
    \param Srb_id Index of Srb (1,2)
    \param buffer_pP Pointer to received SDU
100 101 102 103 104 105 106 107
    \param eNB_index Index of corresponding eNB/CH*/
void
rrc_ue_decode_dcch(
  const protocol_ctxt_t* const ctxt_pP,
  const rb_id_t                Srb_id,
  const uint8_t*         const Buffer,
  const uint8_t                eNB_indexP
);
108

109
/** \brief Generate/Encodes RRCConnnectionRequest message at UE
110
    \param ctxt_pP Running context
111
    \param eNB_index Index of corresponding eNB/CH*/
112 113 114 115 116
void
rrc_ue_generate_RRCConnectionRequest(
  const protocol_ctxt_t* const ctxt_pP,
  const uint8_t                eNB_index
);
117

118
/** \brief process the received rrcConnectionReconfiguration message at UE
119
    \param ctxt_pP Running context
120 121
    \param *rrcConnectionReconfiguration pointer to the sturcture
    \param eNB_index Index of corresponding eNB/CH*/
122 123 124 125 126 127
void
rrc_ue_process_rrcConnectionReconfiguration(
  const protocol_ctxt_t* const       ctxt_pP,
  RRCConnectionReconfiguration_t* rrcConnectionReconfiguration,
  uint8_t eNB_index
);
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

/** \brief Establish SRB1 based on configuration in SRB_ToAddMod structure.  Configures RLC/PDCP accordingly
    \param module_idP Instance ID of UE
    \param frame Frame index
    \param eNB_index Index of corresponding eNB/CH
    \param SRB_config Pointer to SRB_ToAddMod IE from configuration
    @returns 0 on success*/
int32_t  rrc_ue_establish_srb1(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,struct SRB_ToAddMod *SRB_config);

/** \brief Establish SRB2 based on configuration in SRB_ToAddMod structure.  Configures RLC/PDCP accordingly
    \param module_idP Instance ID of UE
    \param frame Frame index
    \param eNB_index Index of corresponding eNB/CH
    \param SRB_config Pointer to SRB_ToAddMod IE from configuration
    @returns 0 on success*/
int32_t  rrc_ue_establish_srb2(module_id_t module_idP,frame_t frameP, uint8_t eNB_index,struct SRB_ToAddMod *SRB_config);

/** \brief Establish a DRB according to DRB_ToAddMod structure
    \param module_idP Instance ID of UE
    \param eNB_index Index of corresponding CH/eNB
    \param DRB_config Pointer to DRB_ToAddMod IE from configuration
    @returns 0 on success */
int32_t  rrc_ue_establish_drb(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,struct DRB_ToAddMod *DRB_config);

/** \brief Process MobilityControlInfo Message to proceed with handover and configure PHY/MAC
153
    \param ctxt_pP Running context
154 155 156
    \param eNB_index Index of corresponding CH/eNB
    \param mobilityControlInfo Pointer to mobilityControlInfo
*/
157 158 159 160 161 162
void
rrc_ue_process_mobilityControlInfo(
  const protocol_ctxt_t* const       ctxt_pP,
  const uint8_t                      eNB_index,
  struct MobilityControlInfo* const mobilityControlInfo
);
163 164

/** \brief Process a measConfig Message and configure PHY/MAC
165
    \param  ctxt_pP    Running context
166 167
    \param eNB_index Index of corresponding CH/eNB
    \param  measConfig Pointer to MeasConfig  IE from configuration*/
168 169 170 171 172 173
void
rrc_ue_process_measConfig(
  const protocol_ctxt_t* const       ctxt_pP,
  const uint8_t                      eNB_index,
  MeasConfig_t* const               measConfig
);
174 175

/** \brief Process a RadioResourceConfigDedicated Message and configure PHY/MAC
176
    \param ctxt_pP Running context
177 178
    \param eNB_index Index of corresponding CH/eNB
    \param radioResourceConfigDedicated Pointer to RadioResourceConfigDedicated IE from configuration*/
179 180 181
void rrc_ue_process_radioResourceConfigDedicated(
  const protocol_ctxt_t* const ctxt_pP,
  uint8_t eNB_index,
182
  RadioResourceConfigDedicated_t *radioResourceConfigDedicated);
183 184 185 186 187 188 189 190 191

// eNB/CH RRC Procedures

/**\brief Function to get the next transaction identifier.
   \param module_idP Instance ID for CH/eNB
   \return a transaction identifier*/
uint8_t rrc_eNB_get_next_transaction_identifier(module_id_t module_idP);

/**\brief Entry routine to decode a UL-CCCH-Message.  Invokes PER decoder and parses message.
192
   \param ctxt_pP Running context
193
   \param Srb_info Pointer to SRB0 information structure (buffer, etc.)*/
194 195 196
int
rrc_eNB_decode_ccch(
  protocol_ctxt_t* const ctxt_pP,
197 198
  const SRB_INFO*        const Srb_info,
  const int              CC_id
199
);
200 201

/**\brief Entry routine to decode a UL-DCCH-Message.  Invokes PER decoder and parses message.
202
   \param ctxt_pP Context
203 204
   \param Rx_sdu Pointer Received Message
   \param sdu_size Size of incoming SDU*/
205 206 207 208 209 210 211
int
rrc_eNB_decode_dcch(
  const protocol_ctxt_t* const ctxt_pP,
  const rb_id_t                Srb_id,
  const uint8_t*    const      Rx_sdu,
  const sdu_size_t             sdu_sizeP
);
212 213

/**\brief Generate the RRCConnectionSetup based on information coming from RRM
214 215 216 217 218
   \param ctxt_pP       Running context
   \param ue_context_pP UE context*/
void
rrc_eNB_generate_RRCConnectionSetup(
  const protocol_ctxt_t* const ctxt_pP,
219 220
  rrc_eNB_ue_context_t* const ue_context_pP,
  const int                    CC_id
221
);
222

223 224 225 226 227 228 229 230 231 232 233
/**\brief Generate RRCConnectionReestablishmentReject
   \param ctxt_pP       Running context
   \param ue_context_pP UE context
   \param CC_id         Component Carrier ID*/
void
rrc_eNB_generate_RRCConnectionReestablishmentReject(
  const protocol_ctxt_t* const ctxt_pP,
  rrc_eNB_ue_context_t* const ue_context_pP,
  const int                    CC_id
);

234
/**\brief Process the RRCConnectionSetupComplete based on information coming from UE
235 236
   \param ctxt_pP       Running context
   \param ue_context_pP RRC UE context
237
   \param rrcConnectionSetupComplete Pointer to RRCConnectionSetupComplete message*/
238 239 240
void
rrc_eNB_process_RRCConnectionSetupComplete(
  const protocol_ctxt_t* const ctxt_pP,
241
  rrc_eNB_ue_context_t*        ue_context_pP,
242 243
  RRCConnectionSetupComplete_r8_IEs_t* rrcConnectionSetupComplete
);
244 245

/**\brief Process the RRCConnectionReconfigurationComplete based on information coming from UE
246 247
   \param ctxt_pP       Running context
   \param ue_context_pP RRC UE context
248 249 250
   \param rrcConnectionReconfigurationComplete Pointer to RRCConnectionReconfigurationComplete message
   \param xid         the transaction id for the rrcconnectionreconfiguration procedure
*/
251 252 253
void
rrc_eNB_process_RRCConnectionReconfigurationComplete(
  const protocol_ctxt_t* const ctxt_pP,
254 255
  rrc_eNB_ue_context_t*        ue_context_pP,
  const uint8_t xid
256
);
257

258
/**\brief Generate the RRCConnectionRelease
259 260 261 262 263 264 265 266 267 268 269 270 271 272
   \param ctxt_pP Running context
   \param ue_context_pP UE context of UE receiving the message*/
void
rrc_eNB_generate_RRCConnectionRelease(
  const protocol_ctxt_t* const ctxt_pP,
  rrc_eNB_ue_context_t*          const ue_context_pP
);

void
rrc_eNB_generate_defaultRRCConnectionReconfiguration(
  const protocol_ctxt_t* const ctxt_pP,
  rrc_eNB_ue_context_t*          const ue_context_pP,
  const uint8_t                ho_state
);
273

Xenofon Foukas's avatar
Xenofon Foukas committed
274 275 276 277 278 279 280 281 282

void
flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(
							     const protocol_ctxt_t* const ctxt_pP,
							     rrc_eNB_ue_context_t* const ue_context_pP,
							     const uint8_t ho_state,
							     agent_reconf_rrc * trig_param
							     );

283 284
int freq_to_arfcn10(int band, unsigned long freq);

285 286 287 288 289 290 291
void
rrc_eNB_generate_dedeicatedRRCConnectionReconfiguration(
  const protocol_ctxt_t* const ctxt_pP,
  rrc_eNB_ue_context_t*          const ue_context_pP,
  const uint8_t                ho_state
);

292 293 294 295 296 297 298 299 300 301 302 303
/**\brief release Data Radio Bearer between ENB and UE
   \param ctxt_pP Running context
   \param ue_context_pP UE context of UE receiving the message*/
void
rrc_eNB_generate_dedicatedRRCConnectionReconfiguration_release(
  const protocol_ctxt_t*   const ctxt_pP,
  rrc_eNB_ue_context_t*    const ue_context_pP,
  uint8_t                  xid,
  uint32_t                 nas_length,
  uint8_t*                 nas_buffer
);

304 305 306 307
void 
rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP,
			  rrc_eNB_ue_context_t*  ue_context_pP);

308 309 310 311 312 313 314 315 316 317 318 319 320 321
#if defined(ENABLE_ITTI)
/**\brief RRC eNB task.
   \param void *args_p Pointer on arguments to start the task. */
void *rrc_enb_task(void *args_p);

/**\brief RRC UE task.
   \param void *args_p Pointer on arguments to start the task. */
void *rrc_ue_task(void *args_p);
#endif

/**\brief Generate/decode the handover RRCConnectionReconfiguration at eNB
   \param module_idP Instance ID for eNB/CH
   \param frame Frame index
   \param ue_module_idP Index of UE transmitting the messages*/
322 323 324 325 326 327 328
void
rrc_eNB_generate_RRCConnectionReconfiguration_handover(
  const protocol_ctxt_t* const ctxt_pP,
  rrc_eNB_ue_context_t*           const ue_context_pP,
  uint8_t*                const nas_pdu,
  const uint32_t                nas_length
);
329 330

//L2_interface.c
331
int8_t
332
mac_rrc_data_req(
333
  const module_id_t Mod_idP,
334
  const int         CC_id,
335 336 337 338 339 340 341 342
  const frame_t     frameP,
  const rb_id_t     Srb_id,
  const uint8_t     Nb_tb,
  uint8_t*    const buffer_pP,
  const uint8_t     mbsfn_sync_area
);

int8_t
343
mac_rrc_data_ind(
344
  const module_id_t     module_idP,
345
  const int         CC_id,
346
  const frame_t         frameP,
gauthier's avatar
gauthier committed
347
  const sub_frame_t     sub_frameP,
348 349 350 351
  const rnti_t          rntiP,
  const rb_id_t         srb_idP,
  const uint8_t*        sduP,
  const sdu_size_t      sdu_lenP,
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
  const uint8_t         mbsfn_sync_areaP
);

int8_t
mac_rrc_data_req_ue(
  const module_id_t Mod_idP,
  const int         CC_id,
  const frame_t     frameP,
  const rb_id_t     Srb_id,
  const uint8_t     Nb_tb,
  uint8_t*    const buffer_pP,
  const mac_enb_index_t eNB_indexP,
  const uint8_t     mbsfn_sync_area
);

int8_t
mac_rrc_data_ind_ue(
  const module_id_t     module_idP,
  const int         CC_id,
  const frame_t         frameP,
  const sub_frame_t     sub_frameP,
  const rnti_t          rntiP,
  const rb_id_t         srb_idP,
  const uint8_t*        sduP,
  const sdu_size_t      sdu_lenP,
377 378 379
  const mac_enb_index_t eNB_indexP,
  const uint8_t         mbsfn_sync_areaP
);
380 381 382

void mac_sync_ind( module_id_t Mod_instP, uint8_t status);

383 384 385 386 387 388
void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP, 
			    const int CC_id, 
			    const frame_t frameP,
			    const sub_frame_t subframeP,
			    const rnti_t rnti);

389 390 391 392 393 394
void mac_eNB_rrc_uplane_failure(const module_id_t Mod_instP,
                const int CC_id,
                const frame_t frameP,
                const sub_frame_t subframeP,
                const rnti_t rnti);

395 396 397 398 399 400
void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP, 
			    const int CC_id, 
			    const frame_t frameP,
			    const sub_frame_t subframeP,
			    const rnti_t rnti);

401
uint8_t
402
rrc_data_req(
403 404 405 406 407 408 409 410 411 412
  const protocol_ctxt_t*   const ctxt_pP,
  const rb_id_t                  rb_idP,
  const mui_t                    muiP,
  const confirm_t                confirmP,
  const sdu_size_t               sdu_size,
  uint8_t*                 const buffer_pP,
  const pdcp_transmission_mode_t modeP
);

void
413
rrc_data_ind(
414 415 416 417 418
  const protocol_ctxt_t* const ctxt_pP,
  const rb_id_t                Srb_id,
  const sdu_size_t             sdu_sizeP,
  const uint8_t*   const       buffer_pP
);
419

420
void rrc_in_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index);
421

422
void rrc_out_of_sync_ind(module_id_t module_idP, frame_t frameP, unsigned short eNB_index);
423

424
int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t* const Sdu, const uint8_t Sdu_len, const uint8_t mbsfn_sync_area );
425

426
int decode_BCCH_DLSCH_Message(
427 428 429 430 431
  const protocol_ctxt_t* const ctxt_pP,
  const uint8_t                eNB_index,
  uint8_t*               const Sdu,
  const uint8_t                Sdu_len,
  const uint8_t                rsrq,
432
  const uint8_t                rsrp );
433

434 435 436 437 438 439
int decode_PCCH_DLSCH_Message(
  const protocol_ctxt_t* const ctxt_pP,
  const uint8_t                eNB_index,
  uint8_t*               const Sdu,
  const uint8_t                Sdu_len);

440 441 442 443 444 445 446 447
void
ue_meas_filtering(
  const protocol_ctxt_t* const ctxt_pP,
  const uint8_t                eNB_index
);

void
ue_measurement_report_triggering(
448
  protocol_ctxt_t*        const ctxt_pP,
449 450 451 452
  const uint8_t                 eNB_index
);

int
453
mac_eNB_get_rrc_status(
454 455 456 457 458
  const module_id_t Mod_idP,
  const rnti_t      rntiP
);

int
459
mac_UE_get_rrc_status(
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478
  const module_id_t Mod_idP,
  const uint8_t     indexP
);

void
rrc_eNB_generate_UECapabilityEnquiry(
  const protocol_ctxt_t* const ctxt_pP,
  rrc_eNB_ue_context_t*          const ue_context_pP
);

void
rrc_eNB_generate_SecurityModeCommand(
  const protocol_ctxt_t* const ctxt_pP,
  rrc_eNB_ue_context_t*          const ue_context_pP
);

void
rrc_eNB_process_MeasurementReport(
  const protocol_ctxt_t* const ctxt_pP,
479
  rrc_eNB_ue_context_t*        ue_context_pP,
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
  const MeasResults_t*   const measResults2
);

void
rrc_eNB_generate_HandoverPreparationInformation(
  const protocol_ctxt_t* const ctxt_pP,
  rrc_eNB_ue_context_t*          const ue_context_pP,
  PhysCellId_t targetPhyId
);

void
check_handovers(
  protocol_ctxt_t* const ctxt_pP
);

//void rrc_ue_process_ueCapabilityEnquiry(uint8_t module_idP,uint32_t frame,UECapabilityEnquiry_t *UECapabilityEnquiry,uint8_t eNB_index);
/*void
rrc_ue_process_securityModeCommand(
                const protocol_ctxt_t* const ctxt_pP,
                SecurityModeCommand_t *const securityModeCommand,
                const uint8_t                eNB_index
                );
*/
503

504 505 506 507 508 509 510 511 512
#if !defined(ENABLE_USE_MME)
void rrc_eNB_emulation_notify_ue_module_id(
  const module_id_t ue_module_idP,
  const rnti_t      rntiP,
  const uint8_t     cell_identity_byte0P,
  const uint8_t     cell_identity_byte1P,
  const uint8_t     cell_identity_byte2P,
  const uint8_t     cell_identity_byte3P);
#endif
513 514


515 516 517 518 519
void
rrc_eNB_free_mem_UE_context(
  const protocol_ctxt_t*               const ctxt_pP,
  struct rrc_eNB_ue_context_s*         const ue_context_pP
);
520 521


522 523
void
rrc_eNB_free_UE(
524 525
		const module_id_t enb_mod_idP,
		const struct rrc_eNB_ue_context_s*         const ue_context_pP
526
);
527 528 529 530 531

long binary_search_int(int elements[], long numElem, int value);

long binary_search_float(float elements[], long numElem, float value);

532
void openair_rrc_top_init_eNB(int eMBMS_active,uint8_t HO_active);
Cedric Roux's avatar
Cedric Roux committed
533 534 535 536 537 538 539 540

void openair_rrc_top_init_ue(
                        int eMBMS_active,
                        char* uecap_xer,
                        uint8_t cba_group_active,
                        uint8_t HO_active
);

541
/** @}*/