asn1_msg.c 123 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.0  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */
21 22

/*! \file asn1_msg.c
23
* \brief primitives to build the asn1 messages
24 25
* \author Raymond Knopp and Navid Nikaein
* \date 2011
26
* \version 1.0
27 28
* \company Eurecom
* \email: raymond.knopp@eurecom.fr and  navid.nikaein@eurecom.fr
29
*/
30

31 32 33
#ifdef USER_MODE
#include <stdio.h>
#include <sys/types.h>
34 35 36 37 38
#include <stdlib.h> /* for atoi(3) */
#include <unistd.h> /* for getopt(3) */
#include <string.h> /* for strerror(3) */
#include <sysexits.h> /* for EX_* exit codes */
#include <errno.h>  /* for errno */
39 40 41 42 43 44 45 46 47
#else
#include <linux/module.h>  /* Needed by all modules */
#endif
#ifdef USER_MODE
//#include "RRC/LITE/defs.h"
//#include "COMMON/mac_rrc_primitives.h"
#include "UTIL/LOG/log.h"
#endif
#include <asn_application.h>
48
#include <asn_internal.h> /* for _ASN_DEFAULT_STACK_MAX */
49 50
#include <per_encoder.h>

51
#include "assertions.h"
52 53 54 55 56 57 58 59 60
#include "RRCConnectionRequest.h"
#include "UL-CCCH-Message.h"
#include "UL-DCCH-Message.h"
#include "DL-CCCH-Message.h"
#include "DL-DCCH-Message.h"
#include "EstablishmentCause.h"
#include "RRCConnectionSetup.h"
#include "SRB-ToAddModList.h"
#include "DRB-ToAddModList.h"
Cedric Roux's avatar
Cedric Roux committed
61
#if defined(Rel10) || defined(Rel14)
62
#include "MCCH-Message.h"
63
//#define MRB1 1
64 65 66
#endif

#include "RRC/LITE/defs.h"
67
#include "RRC/LITE/extern.h"
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
#include "RRCConnectionSetupComplete.h"
#include "RRCConnectionReconfigurationComplete.h"
#include "RRCConnectionReconfiguration.h"
#include "MasterInformationBlock.h"
#include "SystemInformation.h"

#include "SystemInformationBlockType1.h"

#include "SIB-Type.h"

#include "BCCH-DL-SCH-Message.h"

#include "PHY/defs.h"

#include "MeasObjectToAddModList.h"
#include "ReportConfigToAddModList.h"
#include "MeasIdToAddModList.h"
85
#include "enb_config.h"
86

87 88 89 90
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
#endif

91 92
#include "common/ran_context.h"

93 94 95 96 97 98 99
//#include "PHY/defs.h"
#ifndef USER_MODE
#define msg printk
#ifndef errno
int errno;
#endif
#else
100 101 102
# if !defined (msg)
#   define msg printf
# endif
103 104
#endif

105
//#define XER_PRINT
106

107 108 109 110
typedef struct xer_sprint_string_s {
  char *string;
  size_t string_size;
  size_t string_index;
111 112
} xer_sprint_string_t;

113
extern unsigned char NB_eNB_INST;
114
extern uint8_t usim_test;
115

116 117
extern RAN_CONTEXT_t RC;

118 119
uint16_t two_tier_hexagonal_cellIds[7] = {0,1,2,4,5,7,8};
uint16_t two_tier_hexagonal_adjacent_cellIds[7][6] = {{1,2,4,5,7,8},    // CellId 0
120 121 122 123 124 125 126
  {11,18,2,0,8,15}, // CellId 1
  {18,13,3,4,0,1},  // CellId 2
  {2,3,14,6,5,0},   // CellId 4
  {0,4,6,16,9,7},   // CellId 5
  {8,0,5,9,17,12},  // CellId 7
  {15,1,0,7,12,10}
};// CellId 8
127

128 129 130 131 132 133
/*
 * This is a helper function for xer_sprint, which directs all incoming data
 * into the provided string.
 */
static int xer__print2s (const void *buffer, size_t size, void *app_key)
{
134 135 136 137 138 139
  xer_sprint_string_t *string_buffer = (xer_sprint_string_t *) app_key;
  size_t string_remaining = string_buffer->string_size - string_buffer->string_index;

  if (string_remaining > 0) {
    if (size > string_remaining) {
      size = string_remaining;
140
    }
141

142 143 144 145 146
    memcpy(&string_buffer->string[string_buffer->string_index], buffer, size);
    string_buffer->string_index += size;
  }

  return 0;
147 148
}

149
int xer_sprint (char *string, size_t string_size, asn_TYPE_descriptor_t *td, void *sptr)
150
{
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
  asn_enc_rval_t er;
  xer_sprint_string_t string_buffer;

  string_buffer.string = string;
  string_buffer.string_size = string_size;
  string_buffer.string_index = 0;

  er = xer_encode(td, sptr, XER_F_BASIC, xer__print2s, &string_buffer);

  if (er.encoded < 0) {
    LOG_E(RRC, "xer_sprint encoding error (%d)!", er.encoded);
    er.encoded = string_buffer.string_size;
  } else {
    if (er.encoded > string_buffer.string_size) {
      LOG_E(RRC, "xer_sprint string buffer too small, got %d need %d!", string_buffer.string_size, er.encoded);
      er.encoded = string_buffer.string_size;
167
    }
168
  }
169

170
  return er.encoded;
171
}
172

173 174
uint16_t get_adjacent_cell_id(uint8_t Mod_id,uint8_t index)
{
175 176
  return(two_tier_hexagonal_adjacent_cellIds[Mod_id][index]);
}
177
/* This only works for the hexagonal topology...need a more general function for other topologies */
winckel's avatar
RRC:  
winckel committed
178

179 180
uint8_t get_adjacent_cell_mod_id(uint16_t phyCellId)
{
winckel's avatar
RRC:  
winckel committed
181
  uint8_t i;
182 183

  for(i=0; i<7; i++) {
184
    if(two_tier_hexagonal_cellIds[i] == phyCellId) {
185
      return i;
186
    }
187
  }
188

189 190 191
  LOG_E(RRC,"\nCannot get adjacent cell mod id! Fatal error!\n");
  return 0xFF; //error!
}
winckel's avatar
RRC:  
winckel committed
192

193
uint8_t do_MIB(rrc_eNB_carrier_data_t *carrier, uint32_t N_RB_DL, uint32_t phich_Resource, uint32_t phich_duration, uint32_t frame)
194
{
195 196

  asn_enc_rval_t enc_rval;
197
  BCCH_BCH_Message_t *mib=&carrier->mib ;
198
  uint8_t sfn = (uint8_t)((frame>>2)&0xff);
Cedric Roux's avatar
Cedric Roux committed
199 200
  uint16_t *spare= calloc(1, sizeof(uint16_t));
  if (spare == NULL) abort();
201

202
  switch (N_RB_DL) {
203 204

  case 6:
205
    mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n6;
206
    break;
207

208
  case 15:
209
    mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n15;
210
    break;
211

212
  case 25:
213
    mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n25;
214
    break;
215

216
  case 50:
217
    mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n50;
218
    break;
219

220
  case 75:
221
    mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n75;
222
    break;
223

224
  case 100:
225
    mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n100;
226 227
    break;
  default:
228
    AssertFatal(1==0,"Unknown dl_Bandwidth %d\n",N_RB_DL);
229 230
  }

231 232 233 234
  AssertFatal(phich_Resource <= PHICH_Config__phich_Resource_two,"Illegal phich_Resource\n");
  mib->message.phich_Config.phich_Resource = phich_Resource;
  AssertFatal(phich_Resource <= PHICH_Config__phich_Duration_extended,"Illegal phich_Duration\n");
  mib->message.phich_Config.phich_Duration = phich_duration;
235 236 237 238
  LOG_I(RRC,"[MIB] systemBandwidth %x, phich_duration %x, phich_resource %x,sfn %x\n",
         (uint32_t)mib->message.dl_Bandwidth,
         (uint32_t)phich_duration,
         (uint32_t)phich_Resource,
239
         (uint32_t)sfn);
240

241 242 243
  mib->message.systemFrameNumber.buf = &sfn;
  mib->message.systemFrameNumber.size = 1;
  mib->message.systemFrameNumber.bits_unused=0;
Cedric Roux's avatar
Cedric Roux committed
244
  mib->message.spare.buf = (uint8_t *)spare;
245
#ifndef Rel14
246 247
  mib->message.spare.size = 2;
  mib->message.spare.bits_unused = 6;  // This makes a spare of 10 bits
248 249 250 251 252
#else
  mib->message.spare.size = 1;
  mib->message.spare.bits_unused = 3;  // This makes a spare of 5 bits
  mib->message.schedulingInfoSIB1_BR_r13 = 0; // turn off eMTC
#endif
253 254

  enc_rval = uper_encode_to_buffer(&asn_DEF_BCCH_BCH_Message,
255
                                   (void*)mib,
Cedric Roux's avatar
Cedric Roux committed
256 257
                                   carrier->MIB,
                                   24);
knopp's avatar
 
knopp committed
258
  AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
259
               enc_rval.failed_type->name, enc_rval.encoded);
260

261
  /*
262 263 264
#if defined(ENABLE_ITTI)
# if !defined(DISABLE_XER_SPRINT)
  {
265
    char        message_string[20000];
266 267
    size_t      message_string_size;

268
    if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_BCCH_BCH_Message, (void *) &mib)) > 0) {
269
      MessageDef *msg_p;
270

winckel's avatar
winckel committed
271 272 273
      msg_p = itti_alloc_new_message_sized (TASK_RRC_ENB, RRC_DL_BCCH, message_string_size + sizeof (IttiMsgText));
      msg_p->ittiMsg.rrc_dl_bcch.size = message_string_size;
      memcpy(&msg_p->ittiMsg.rrc_dl_bcch.text, message_string, message_string_size);
274

275
      itti_send_msg_to_task(TASK_UNKNOWN, enb_module_idP, msg_p);
276 277 278 279
    }
  }
# endif
#endif
280
  */
281
  if (enc_rval.encoded==-1) {
282
    return(-1);
283
  }
284

285 286
  return((enc_rval.encoded+7)/8);
}
winckel's avatar
RRC:  
winckel committed
287

288 289
uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
		int Mod_id,int CC_id
winckel's avatar
winckel committed
290
#if defined(ENABLE_ITTI)
291
                , RrcConfigurationReq *configuration
winckel's avatar
winckel committed
292
#endif
293 294
               )
{
295 296 297

  //  SystemInformation_t systemInformation;
  PLMN_IdentityInfo_t PLMN_identity_info;
winckel's avatar
winckel committed
298
  MCC_MNC_Digit_t dummy_mcc[3],dummy_mnc[3];
299 300 301 302
  asn_enc_rval_t enc_rval;
  SchedulingInfo_t schedulingInfo;
  SIB_Type_t sib_type;

303 304 305 306 307
  uint8_t *buffer                      = carrier->SIB1;
  BCCH_DL_SCH_Message_t *bcch_message  = &carrier->siblock1;
  SystemInformationBlockType1_t **sib1 = &carrier->sib1;

  
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
  memset(bcch_message,0,sizeof(BCCH_DL_SCH_Message_t));
  bcch_message->message.present = BCCH_DL_SCH_MessageType_PR_c1;
  bcch_message->message.choice.c1.present = BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1;
  //  memcpy(&bcch_message.message.choice.c1.choice.systemInformationBlockType1,sib1,sizeof(SystemInformationBlockType1_t));

  *sib1 = &bcch_message->message.choice.c1.choice.systemInformationBlockType1;

  memset(&PLMN_identity_info,0,sizeof(PLMN_IdentityInfo_t));
  memset(&schedulingInfo,0,sizeof(SchedulingInfo_t));
  memset(&sib_type,0,sizeof(SIB_Type_t));



  PLMN_identity_info.plmn_Identity.mcc = CALLOC(1,sizeof(*PLMN_identity_info.plmn_Identity.mcc));
  memset(PLMN_identity_info.plmn_Identity.mcc,0,sizeof(*PLMN_identity_info.plmn_Identity.mcc));

  asn_set_empty(&PLMN_identity_info.plmn_Identity.mcc->list);//.size=0;

winckel's avatar
winckel committed
326 327 328 329 330 331 332 333 334 335 336 337
#if defined(ENABLE_ITTI)
  dummy_mcc[0] = (configuration->mcc / 100) % 10;
  dummy_mcc[1] = (configuration->mcc / 10) % 10;
  dummy_mcc[2] = (configuration->mcc / 1) % 10;
#else
  dummy_mcc[0] = 0;
  dummy_mcc[1] = 0;
  dummy_mcc[2] = 1;
#endif
  ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mcc->list,&dummy_mcc[0]);
  ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mcc->list,&dummy_mcc[1]);
  ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mcc->list,&dummy_mcc[2]);
338 339 340

  PLMN_identity_info.plmn_Identity.mnc.list.size=0;
  PLMN_identity_info.plmn_Identity.mnc.list.count=0;
winckel's avatar
winckel committed
341
#if defined(ENABLE_ITTI)
342

winckel's avatar
winckel committed
343
  if (configuration->mnc >= 100) {
344 345 346 347 348 349 350 351 352 353
    dummy_mnc[0] = (configuration->mnc / 100) % 10;
    dummy_mnc[1] = (configuration->mnc / 10) % 10;
    dummy_mnc[2] = (configuration->mnc / 1) % 10;
  } else {
    if (configuration->mnc_digit_length == 2) {
      dummy_mnc[0] = (configuration->mnc / 10) % 10;
      dummy_mnc[1] = (configuration->mnc / 1) % 10;
      dummy_mnc[2] = 0xf;
    } else {
      dummy_mnc[0] = (configuration->mnc / 100) % 100;
winckel's avatar
winckel committed
354 355
      dummy_mnc[1] = (configuration->mnc / 10) % 10;
      dummy_mnc[2] = (configuration->mnc / 1) % 10;
356
    }
winckel's avatar
winckel committed
357
  }
358

winckel's avatar
winckel committed
359 360 361 362 363 364 365
#else
  dummy_mnc[0] = 0;
  dummy_mnc[1] = 1;
  dummy_mnc[2] = 0xf;
#endif
  ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mnc.list,&dummy_mnc[0]);
  ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mnc.list,&dummy_mnc[1]);
366

winckel's avatar
winckel committed
367 368 369 370
  if (dummy_mnc[2] != 0xf) {
    ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mnc.list,&dummy_mnc[2]);
  }

371 372 373 374 375 376 377 378
  //assign_enum(&PLMN_identity_info.cellReservedForOperatorUse,PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved);
  PLMN_identity_info.cellReservedForOperatorUse=PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved;

  ASN_SEQUENCE_ADD(&(*sib1)->cellAccessRelatedInfo.plmn_IdentityList.list,&PLMN_identity_info);


  // 16 bits
  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf = MALLOC(2);
winckel's avatar
winckel committed
379 380 381 382 383 384 385
#if defined(ENABLE_ITTI)
  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf[0] = (configuration->tac >> 8) & 0xff;
  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf[1] = (configuration->tac >> 0) & 0xff;
#else
  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf[0] = 0x00;
  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf[1] = 0x01;
#endif
386 387 388 389 390
  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.size=2;
  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.bits_unused=0;

  // 28 bits
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf = MALLOC(8);
winckel's avatar
winckel committed
391 392 393 394 395 396 397 398 399 400 401
#if defined(ENABLE_ITTI)
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[0] = (configuration->cell_identity >> 20) & 0xff;
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[1] = (configuration->cell_identity >> 12) & 0xff;
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[2] = (configuration->cell_identity >>  4) & 0xff;
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[3] = (configuration->cell_identity <<  4) & 0xf0;
#else
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[0] = 0x00;
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[1] = 0x00;
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[2] = 0x00;
  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[3] = 0x10;
#endif
402 403 404 405 406 407 408 409 410 411 412 413
  (*sib1)->cellAccessRelatedInfo.cellIdentity.size=4;
  (*sib1)->cellAccessRelatedInfo.cellIdentity.bits_unused=4;

  //  assign_enum(&(*sib1)->cellAccessRelatedInfo.cellBarred,SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred);
  (*sib1)->cellAccessRelatedInfo.cellBarred=SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred;

  //  assign_enum(&(*sib1)->cellAccessRelatedInfo.intraFreqReselection,SystemInformationBlockType1__cellAccessRelatedInfo__intraFreqReselection_allowed);
  (*sib1)->cellAccessRelatedInfo.intraFreqReselection=SystemInformationBlockType1__cellAccessRelatedInfo__intraFreqReselection_notAllowed;
  (*sib1)->cellAccessRelatedInfo.csg_Indication=0;

  (*sib1)->cellSelectionInfo.q_RxLevMin=-65;
  (*sib1)->cellSelectionInfo.q_RxLevMinOffset=NULL;
414
  //(*sib1)->p_Max = CALLOC(1, sizeof(P_Max_t));
415
  //*((*sib1)->p_Max) = 23;
416 417
  (*sib1)->freqBandIndicator =
#if defined(ENABLE_ITTI)
418
    configuration->eutra_band[CC_id];
419
#else
420
    7;
421
#endif
422 423 424 425 426 427 428 429 430

  schedulingInfo.si_Periodicity=SchedulingInfo__si_Periodicity_rf8;

  // This is for SIB2/3
  sib_type=SIB_Type_sibType3;
  ASN_SEQUENCE_ADD(&schedulingInfo.sib_MappingInfo.list,&sib_type);
  ASN_SEQUENCE_ADD(&(*sib1)->schedulingInfoList.list,&schedulingInfo);

  //  ASN_SEQUENCE_ADD(&schedulingInfo.sib_MappingInfo.list,NULL);
431

432
#if defined(ENABLE_ITTI)
433

434
  if (configuration->frame_type[CC_id] == TDD)
435 436
#endif
  {
437
    (*sib1)->tdd_Config =                             CALLOC(1,sizeof(struct TDD_Config));
438

439
    (*sib1)->tdd_Config->subframeAssignment =
440
#if defined(ENABLE_ITTI)
441
      configuration->tdd_config[CC_id];
442
#else
443
      3;
444
#endif
445

446
    (*sib1)->tdd_Config->specialSubframePatterns =
447
#if defined(ENABLE_ITTI)
448
      configuration->tdd_config_s[CC_id];
449
#else
450
    0;
451
#endif
452
  }
453 454 455 456 457 458 459 460 461

  (*sib1)->si_WindowLength=SystemInformationBlockType1__si_WindowLength_ms20;
  (*sib1)->systemInfoValueTag=0;
  //  (*sib1).nonCriticalExtension = calloc(1,sizeof(*(*sib1).nonCriticalExtension));

#ifdef XER_PRINT
  xer_fprint(stdout, &asn_DEF_BCCH_DL_SCH_Message, (void*)bcch_message);
#endif
  enc_rval = uper_encode_to_buffer(&asn_DEF_BCCH_DL_SCH_Message,
winckel's avatar
winckel committed
462 463 464
                                   (void*)bcch_message,
                                   buffer,
                                   100);
knopp's avatar
 
knopp committed
465
  AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
466
               enc_rval.failed_type->name, enc_rval.encoded);
winckel's avatar
winckel committed
467 468 469 470 471 472 473

#if defined(ENABLE_ITTI)
# if !defined(DISABLE_XER_SPRINT)
  {
    char        message_string[10000];
    size_t      message_string_size;

474
    if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_BCCH_DL_SCH_Message, (void *)bcch_message)) > 0) {
475
      MessageDef *msg_p;
winckel's avatar
winckel committed
476

winckel's avatar
winckel committed
477 478 479
      msg_p = itti_alloc_new_message_sized (TASK_RRC_ENB, RRC_DL_BCCH, message_string_size + sizeof (IttiMsgText));
      msg_p->ittiMsg.rrc_dl_bcch.size = message_string_size;
      memcpy(&msg_p->ittiMsg.rrc_dl_bcch.text, message_string, message_string_size);
480
      itti_send_msg_to_task(TASK_UNKNOWN, Mod_id, msg_p);
winckel's avatar
winckel committed
481 482 483 484 485
    }
  }
# endif
#endif

486 487 488 489
#ifdef USER_MODE
  LOG_D(RRC,"[eNB] SystemInformationBlockType1 Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
#endif

490
  if (enc_rval.encoded==-1) {
491
    return(-1);
492
  }
493

494 495 496 497
  return((enc_rval.encoded+7)/8);
}

uint8_t do_SIB23(uint8_t Mod_id,
498

499
                 int CC_id
500
#if defined(ENABLE_ITTI)
501
                 , RrcConfigurationReq *configuration
502
#endif
503 504
                )
{
505
  struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib2_part,*sib3_part;
Cedric Roux's avatar
Cedric Roux committed
506
#if defined(Rel10) || defined(Rel14)
507
  struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib13_part;
508 509
  MBSFN_SubframeConfigList_t *MBSFNSubframeConfigList;
  MBSFN_AreaInfoList_r9_t *MBSFNArea_list;
510
  struct MBSFN_AreaInfo_r9 *MBSFN_Area1, *MBSFN_Area2;
511 512 513
#endif
  asn_enc_rval_t enc_rval;

514 515 516 517
  uint8_t                           *buffer       = RC.rrc[Mod_id]->carrier[CC_id].SIB23;
  BCCH_DL_SCH_Message_t             *bcch_message = &RC.rrc[Mod_id]->carrier[CC_id].systemInformation;
  SystemInformationBlockType2_t     **sib2        = &RC.rrc[Mod_id]->carrier[CC_id].sib2;
  SystemInformationBlockType3_t     **sib3        = &RC.rrc[Mod_id]->carrier[CC_id].sib3;
518
#if defined(Rel10) || defined(Rel14)
519 520 521 522
  SystemInformationBlockType13_r9_t **sib13       = &RC.rrc[Mod_id]->carrier[CC_id].sib13;
  uint8_t                           MBMS_flag     = RC.rrc[Mod_id]->carrier[CC_id].MBMS_flag;
#endif

523
  if (bcch_message) {
524
    memset(bcch_message,0,sizeof(BCCH_DL_SCH_Message_t));
525
  } else {
winckel's avatar
winckel committed
526
    LOG_E(RRC,"[eNB %d] BCCH_MESSAGE is null, exiting\n", Mod_id);
527 528 529 530
    exit(-1);
  }

  if (!sib2) {
winckel's avatar
winckel committed
531
    LOG_E(RRC,"[eNB %d] sib2 is null, exiting\n", Mod_id);
532 533 534 535
    exit(-1);
  }

  if (!sib3) {
winckel's avatar
winckel committed
536
    LOG_E(RRC,"[eNB %d] sib3 is null, exiting\n", Mod_id);
537 538
    exit(-1);
  }
539

Cedric Roux's avatar
Cedric Roux committed
540
#if defined(Rel10) || defined(Rel14)
winckel's avatar
winckel committed
541
  LOG_I(RRC,"[eNB %d] Configuration SIB2/3, MBMS = %d\n", Mod_id, MBMS_flag);
542
#else
winckel's avatar
winckel committed
543
  LOG_I(RRC,"[eNB %d] Configuration SIB2/3\n", Mod_id);
544
#endif
545 546 547 548
  sib2_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
  sib3_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
  memset(sib2_part,0,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
  memset(sib3_part,0,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
549

550 551
  sib2_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2;
  sib3_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3;
552 553 554 555

  *sib2 = &sib2_part->choice.sib2;
  *sib3 = &sib3_part->choice.sib3;

Cedric Roux's avatar
Cedric Roux committed
556
#if defined(Rel10) || defined(Rel14)
557

558
  if (MBMS_flag > 0) {
559 560 561
    sib13_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
    memset(sib13_part,0,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
    sib13_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920;
562 563
    *sib13 = &sib13_part->choice.sib13_v920;
  }
564

565 566 567 568 569
#endif

  // sib2

  (*sib2)->ac_BarringInfo = NULL;
Cedric Roux's avatar
Cedric Roux committed
570
#if defined(Rel10) || defined(Rel14)
571
#if 0
572 573 574 575
  (*sib2)->ssac_BarringForMMTEL_Voice_r9 = NULL;
  (*sib2)->ssac_BarringForMMTEL_Video_r9 = NULL;
  (*sib2)->ac_BarringForCSFB_r10 = NULL;
#endif
576 577 578
  (*sib2)->ext1 = NULL;
  (*sib2)->ext2 = NULL;
#endif
579

knopp's avatar
knopp committed
580 581
#if defined(ENABLE_ITTI)

582
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles                         = configuration->rach_numberOfRA_Preambles[CC_id];
knopp's avatar
knopp committed
583
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig                        = NULL;
584

585
  if (configuration->rach_preamblesGroupAConfig[CC_id]) {
586 587 588
    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig
      = CALLOC(1,sizeof(struct RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig));
    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA
589
      = configuration->rach_sizeOfRA_PreamblesGroupA[CC_id];
590
    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->messageSizeGroupA
591
      = configuration->rach_messageSizeGroupA[CC_id];
knopp's avatar
knopp committed
592
    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->messagePowerOffsetGroupB
593
      = configuration->rach_messagePowerOffsetGroupB[CC_id];
knopp's avatar
knopp committed
594
  }
595

596
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep                   = configuration->rach_powerRampingStep[CC_id];
597
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower =
598 599 600
    configuration->rach_preambleInitialReceivedTargetPower[CC_id];
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax                       = configuration->rach_preambleTransMax[CC_id];
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize                  = configuration->rach_raResponseWindowSize[CC_id];
601
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer          =
602 603
    configuration->rach_macContentionResolutionTimer[CC_id];
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx                                            = configuration->rach_maxHARQ_Msg3Tx[CC_id];
knopp's avatar
knopp committed
604 605

  // BCCH-Config
606
  (*sib2)->radioResourceConfigCommon.bcch_Config.modificationPeriodCoeff
607
    = configuration->bcch_modificationPeriodCoeff[CC_id];
knopp's avatar
knopp committed
608 609

  // PCCH-Config
610
  (*sib2)->radioResourceConfigCommon.pcch_Config.defaultPagingCycle
611
    = configuration->pcch_defaultPagingCycle[CC_id];
612
  (*sib2)->radioResourceConfigCommon.pcch_Config.nB
613
    = configuration->pcch_nB[CC_id];
knopp's avatar
knopp committed
614 615

  // PRACH-Config
616
  (*sib2)->radioResourceConfigCommon.prach_Config.rootSequenceIndex
617
    = configuration->prach_root[CC_id];
618
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_ConfigIndex
619
    = configuration->prach_config_index[CC_id];
620
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.highSpeedFlag
621
    = configuration->prach_high_speed[CC_id];
622
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig
623
    = configuration->prach_zero_correlation[CC_id];
624
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset
625
    = configuration->prach_freq_offset[CC_id];
knopp's avatar
knopp committed
626 627 628

  // PDSCH-Config
  (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower
629
    = configuration->pdsch_referenceSignalPower[CC_id];
knopp's avatar
knopp committed
630
  (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b
631
    = configuration->pdsch_p_b[CC_id];
knopp's avatar
knopp committed
632 633

  // PUSCH-Config
634
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB
635
    = configuration->pusch_n_SB[CC_id];
knopp's avatar
knopp committed
636
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode
637
    = configuration->pusch_hoppingMode[CC_id];
knopp's avatar
knopp committed
638
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset
639
    = configuration->pusch_hoppingOffset[CC_id];
knopp's avatar
knopp committed
640
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM
641
    = configuration->pusch_enable64QAM[CC_id];
knopp's avatar
knopp committed
642
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled
643
    = configuration->pusch_groupHoppingEnabled[CC_id];
knopp's avatar
knopp committed
644
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH
645
    = configuration->pusch_groupAssignment[CC_id];
knopp's avatar
knopp committed
646
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled
647
    = configuration->pusch_sequenceHoppingEnabled[CC_id];
knopp's avatar
knopp committed
648
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift
649
    = configuration->pusch_nDMRS1[CC_id];
knopp's avatar
knopp committed
650 651 652 653

  // PUCCH-Config

  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.deltaPUCCH_Shift
654
    = configuration->pucch_delta_shift[CC_id];
655
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nRB_CQI
656
    = configuration->pucch_nRB_CQI[CC_id];
657
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN
658
    = configuration->pucch_nCS_AN[CC_id];
Cedric Roux's avatar
Cedric Roux committed
659
#if !defined(Rel10) && !defined(Rel14)
660
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN
661
    = configuration->pucch_n1_AN[CC_id];
662
#endif
knopp's avatar
knopp committed
663 664

  // SRS Config
665
  if (configuration->srs_enable[CC_id]==1) {
knopp's avatar
knopp committed
666
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present
667
      = SoundingRS_UL_ConfigCommon_PR_setup;
knopp's avatar
knopp committed
668
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig
669
      = configuration->srs_BandwidthConfig[CC_id];
knopp's avatar
knopp committed
670
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig
671
      = configuration->srs_SubframeConfig[CC_id];
knopp's avatar
knopp committed
672
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission
673
      = configuration->srs_ackNackST[CC_id];
674

675
    if (configuration->srs_MaxUpPts[CC_id]) {
knopp's avatar
knopp committed
676
      (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts
677
        = CALLOC(1,sizeof(long));
knopp's avatar
knopp committed
678
      *(*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts=1;
679
    } else {
knopp's avatar
knopp committed
680 681
      (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts = NULL;
    }
682
    RC.rrc[Mod_id]->srs_enable[CC_id] = 1;
683
  } else {
684
    RC.rrc[Mod_id]->srs_enable[CC_id] = 0;
knopp's avatar
knopp committed
685 686 687 688 689 690
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present=SoundingRS_UL_ConfigCommon_PR_release;
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.release=0;
  }

  // uplinkPowerControlCommon

691
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUSCH
692
    = configuration->pusch_p0_Nominal[CC_id];
693
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUCCH
694
    = configuration->pucch_p0_Nominal[CC_id];
695
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.alpha
696
    = configuration->pusch_alpha[CC_id];
knopp's avatar
knopp committed
697
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1
698
    = configuration->pucch_deltaF_Format1[CC_id];
knopp's avatar
knopp committed
699
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b
700
    = configuration->pucch_deltaF_Format1b[CC_id];
knopp's avatar
knopp committed
701
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2
702
    = configuration->pucch_deltaF_Format2[CC_id];
knopp's avatar
knopp committed
703
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a
704
    = configuration->pucch_deltaF_Format2a[CC_id];
knopp's avatar
knopp committed
705
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b
706
    = configuration->pucch_deltaF_Format2b[CC_id];
knopp's avatar
knopp committed
707
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaPreambleMsg3
708
    = configuration->msg3_delta_Preamble[CC_id];
knopp's avatar
knopp committed
709
  (*sib2)->radioResourceConfigCommon.ul_CyclicPrefixLength
710
    = configuration->ul_CyclicPrefixLength[CC_id];
knopp's avatar
knopp committed
711 712 713 714

  // UE Timers and Constants

  (*sib2)->ue_TimersAndConstants.t300
715
    = configuration->ue_TimersAndConstants_t300[CC_id];
knopp's avatar
knopp committed
716
  (*sib2)->ue_TimersAndConstants.t301
717
    = configuration->ue_TimersAndConstants_t301[CC_id];
knopp's avatar
knopp committed
718
  (*sib2)->ue_TimersAndConstants.t310
719
    = configuration->ue_TimersAndConstants_t310[CC_id];
knopp's avatar
knopp committed
720
  (*sib2)->ue_TimersAndConstants.n310
721
    = configuration->ue_TimersAndConstants_n310[CC_id];
knopp's avatar
knopp committed
722
  (*sib2)->ue_TimersAndConstants.t311
723
    = configuration->ue_TimersAndConstants_t311[CC_id];
knopp's avatar
knopp committed
724
  (*sib2)->ue_TimersAndConstants.n311
725
    = configuration->ue_TimersAndConstants_n311[CC_id];
knopp's avatar
knopp committed
726 727

#else
728 729 730
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles=RACH_ConfigCommon__preambleInfo__numberOfRA_Preambles_n64;
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig = NULL;
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep=RACH_ConfigCommon__powerRampingParameters__powerRampingStep_dB2;
731 732
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower=
    RACH_ConfigCommon__powerRampingParameters__preambleInitialReceivedTargetPower_dBm_100;
733
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax=RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10;
knopp's avatar
knopp committed
734
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize=RACH_ConfigCommon__ra_SupervisionInfo__ra_ResponseWindowSize_sf10;
735 736
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer=
    RACH_ConfigCommon__ra_SupervisionInfo__mac_ContentionResolutionTimer_sf48;
737 738 739 740 741 742
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx = 4;

  // BCCH-Config
  (*sib2)->radioResourceConfigCommon.bcch_Config.modificationPeriodCoeff=BCCH_Config__modificationPeriodCoeff_n2;

  // PCCH-Config
knopp's avatar
knopp committed
743
  (*sib2)->radioResourceConfigCommon.pcch_Config.defaultPagingCycle = PCCH_Config__defaultPagingCycle_rf128;
744 745 746 747 748 749 750 751 752 753
  (*sib2)->radioResourceConfigCommon.pcch_Config.nB=PCCH_Config__nB_oneT;

  // PRACH-Config
  (*sib2)->radioResourceConfigCommon.prach_Config.rootSequenceIndex=Mod_id;//0;//384;
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_ConfigIndex = 0;//3;
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.highSpeedFlag = 0;
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig = 1;//12;
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset = 2;

  // PDSCH-Config
knopp's avatar
 
knopp committed
754
  (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=0;  // corresponds to 24.7 dBm 5 MHz/ 27.7 10 MHz/ 30.7 20 MHz
knopp's avatar
knopp committed
755

756

757
  (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=0;
758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809

  // PUSCH-Config
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB=1;
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode=PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame;
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset=0;
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM=0;
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled=1;
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH=0;
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled=0;
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift=0;

  // PUCCH-Config

  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.deltaPUCCH_Shift=PUCCH_ConfigCommon__deltaPUCCH_Shift_ds1;
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nRB_CQI = 1;
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN = 0;
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN = 32;


  (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present=SoundingRS_UL_ConfigCommon_PR_release;
  (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.release=0;

  // uplinkPowerControlCommon

  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUSCH = -108;
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUCCH = -108;
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.alpha=UplinkPowerControlCommon__alpha_al1;
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1=DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2;
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b=DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3;

  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2=DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0;

  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a=DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0;

  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b=DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0;

  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaPreambleMsg3 = 6;

  (*sib2)->radioResourceConfigCommon.ul_CyclicPrefixLength=UL_CyclicPrefixLength_len1;

  (*sib2)->ue_TimersAndConstants.t300=UE_TimersAndConstants__t300_ms1000;

  (*sib2)->ue_TimersAndConstants.t301=UE_TimersAndConstants__t301_ms1000;

  (*sib2)->ue_TimersAndConstants.t310=UE_TimersAndConstants__t310_ms1000;

  (*sib2)->ue_TimersAndConstants.n310=UE_TimersAndConstants__n310_n20;

  (*sib2)->ue_TimersAndConstants.t311=UE_TimersAndConstants__t311_ms10000;

  (*sib2)->ue_TimersAndConstants.n311=UE_TimersAndConstants__n311_n1;

knopp's avatar
knopp committed
810 811
#endif

812 813 814 815 816
  (*sib2)->freqInfo.additionalSpectrumEmission = 1;
  (*sib2)->freqInfo.ul_CarrierFreq = NULL;
  (*sib2)->freqInfo.ul_Bandwidth = NULL;
  //  (*sib2)->mbsfn_SubframeConfigList = NULL;

Cedric Roux's avatar
Cedric Roux committed
817
#if defined(Rel10) || defined(Rel14)
818

819
  if (MBMS_flag > 0) {
820
    LOG_I(RRC,"Adding MBSFN subframe Configuration 1 to SIB2\n");
821 822 823
    MBSFN_SubframeConfig_t *sib2_mbsfn_SubframeConfig1;
    (*sib2)->mbsfn_SubframeConfigList = CALLOC(1,sizeof(struct MBSFN_SubframeConfigList));
    MBSFNSubframeConfigList = (*sib2)->mbsfn_SubframeConfigList;
824

825 826
    sib2_mbsfn_SubframeC