asn1_msg.c 149 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

  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);

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
430 431 432 433 434
  //TTN - This is for SIB18
  sib_type=SIB_Type_sibType18_v1250;
  ASN_SEQUENCE_ADD(&schedulingInfo.sib_MappingInfo.list,&sib_type);
  ASN_SEQUENCE_ADD(&(*sib1)->schedulingInfoList.list,&schedulingInfo);

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
435 436 437 438 439
  //TTN - This is for SIB19
  sib_type=SIB_Type_sibType19_v1250;
  ASN_SEQUENCE_ADD(&schedulingInfo.sib_MappingInfo.list,&sib_type);
  ASN_SEQUENCE_ADD(&(*sib1)->schedulingInfoList.list,&schedulingInfo);

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

442
#if defined(ENABLE_ITTI)
443

444
  if (configuration->frame_type[CC_id] == TDD)
445 446
#endif
  {
447
    (*sib1)->tdd_Config =                             CALLOC(1,sizeof(struct TDD_Config));
448

449
    (*sib1)->tdd_Config->subframeAssignment =
450
#if defined(ENABLE_ITTI)
451
      configuration->tdd_config[CC_id];
452
#else
453
      3;
454
#endif
455

456
    (*sib1)->tdd_Config->specialSubframePatterns =
457
#if defined(ENABLE_ITTI)
458
      configuration->tdd_config_s[CC_id];
459
#else
460
    0;
461
#endif
462
  }
463 464 465 466 467 468 469 470 471

  (*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
472 473 474
                                   (void*)bcch_message,
                                   buffer,
                                   100);
knopp's avatar
 
knopp committed
475
  AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
476
               enc_rval.failed_type->name, enc_rval.encoded);
winckel's avatar
winckel committed
477 478 479 480 481 482 483

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

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

winckel's avatar
winckel committed
487 488 489
      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);
490
      itti_send_msg_to_task(TASK_UNKNOWN, Mod_id, msg_p);
winckel's avatar
winckel committed
491 492 493 494 495
    }
  }
# endif
#endif

496 497 498 499
#ifdef USER_MODE
  LOG_D(RRC,"[eNB] SystemInformationBlockType1 Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
#endif

500
  if (enc_rval.encoded==-1) {
501
    return(-1);
502
  }
503

504 505 506 507
  return((enc_rval.encoded+7)/8);
}

uint8_t do_SIB23(uint8_t Mod_id,
508

509
                 int CC_id
510
#if defined(ENABLE_ITTI)
511
                 , RrcConfigurationReq *configuration
512
#endif
513 514
                )
{
515
  struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib2_part,*sib3_part;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
516 517 518 519 520 521 522 523

  //TTN - for D2D
  struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib18_part, *sib19_part, *sib21_part;
  SL_CommRxPoolList_r12_t *SL_CommRxPoolList; //for SIB18
  struct SL_CommResourcePool_r12 *SL_CommResourcePool; //for SIB18
  SL_DiscRxPoolList_r12_t *SL_DiscRxPoolList; //for SIB19
  struct SL_DiscResourcePool_r12 *SL_DiscResourcePool; //for SIB19

Cedric Roux's avatar
Cedric Roux committed
524
#if defined(Rel10) || defined(Rel14)
525
  struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib13_part;
526 527
  MBSFN_SubframeConfigList_t *MBSFNSubframeConfigList;
  MBSFN_AreaInfoList_r9_t *MBSFNArea_list;
528
  struct MBSFN_AreaInfo_r9 *MBSFN_Area1, *MBSFN_Area2;
529 530 531
#endif
  asn_enc_rval_t enc_rval;

532 533 534 535
  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;
536
#if defined(Rel10) || defined(Rel14)
537 538 539 540
  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

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
541 542 543

  //TTN - for D2D
  SystemInformationBlockType18_r12_t     **sib18        = &RC.rrc[Mod_id]->carrier[CC_id].sib18;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
544
  SystemInformationBlockType19_r12_t     **sib19        = &RC.rrc[Mod_id]->carrier[CC_id].sib19;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
545 546
  //SystemInformationBlockType21_r14_t     **sib21        = &RC.rrc[Mod_id]->carrier[CC_id].sib21;

547
  if (bcch_message) {
548
    memset(bcch_message,0,sizeof(BCCH_DL_SCH_Message_t));
549
  } else {
winckel's avatar
winckel committed
550
    LOG_E(RRC,"[eNB %d] BCCH_MESSAGE is null, exiting\n", Mod_id);
551 552 553 554
    exit(-1);
  }

  if (!sib2) {
winckel's avatar
winckel committed
555
    LOG_E(RRC,"[eNB %d] sib2 is null, exiting\n", Mod_id);
556 557 558 559
    exit(-1);
  }

  if (!sib3) {
winckel's avatar
winckel committed
560
    LOG_E(RRC,"[eNB %d] sib3 is null, exiting\n", Mod_id);
561 562
    exit(-1);
  }
563

Cedric Roux's avatar
Cedric Roux committed
564
#if defined(Rel10) || defined(Rel14)
winckel's avatar
winckel committed
565
  LOG_I(RRC,"[eNB %d] Configuration SIB2/3, MBMS = %d\n", Mod_id, MBMS_flag);
566
#else
winckel's avatar
winckel committed
567
  LOG_I(RRC,"[eNB %d] Configuration SIB2/3\n", Mod_id);
568
#endif
569 570 571 572
  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));
573

574 575
  sib2_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2;
  sib3_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3;
576 577 578 579

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

Cedric Roux's avatar
Cedric Roux committed
580
#if defined(Rel10) || defined(Rel14)
581

582
  if (MBMS_flag > 0) {
583 584 585
    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;
586 587
    *sib13 = &sib13_part->choice.sib13_v920;
  }
588

589 590
#endif

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
591 592
  //TTN - for D2D
  sib18_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
593
  sib19_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
594 595
  //sib21_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
  memset(sib18_part,0,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
596
  memset(sib19_part,0,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
597 598 599
  //memset(sib21_part,0,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member));

  sib18_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib18_v1250;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
600
  sib19_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib19_v1250;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
601 602 603
  //sib21_part->present = SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib21_v14x0;

  *sib18 = &sib18_part->choice.sib18_v1250;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
604
  *sib19 = &sib19_part->choice.sib19_v1250;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
605 606 607 608
  //*sib21 = &sib19_part->choice.sib21_v14x0;



609 610 611
  // sib2

  (*sib2)->ac_BarringInfo = NULL;
Cedric Roux's avatar
Cedric Roux committed
612
#if defined(Rel10) || defined(Rel14)
613
#if 0
614 615 616 617
  (*sib2)->ssac_BarringForMMTEL_Voice_r9 = NULL;
  (*sib2)->ssac_BarringForMMTEL_Video_r9 = NULL;
  (*sib2)->ac_BarringForCSFB_r10 = NULL;
#endif
618 619 620
  (*sib2)->ext1 = NULL;
  (*sib2)->ext2 = NULL;
#endif
621

knopp's avatar
knopp committed
622 623
#if defined(ENABLE_ITTI)

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

627
  if (configuration->rach_preamblesGroupAConfig[CC_id]) {
628 629 630
    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig
      = CALLOC(1,sizeof(struct RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig));
    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA
631
      = configuration->rach_sizeOfRA_PreamblesGroupA[CC_id];
632
    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->messageSizeGroupA
633
      = configuration->rach_messageSizeGroupA[CC_id];
knopp's avatar
knopp committed
634
    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->messagePowerOffsetGroupB
635
      = configuration->rach_messagePowerOffsetGroupB[CC_id];
knopp's avatar
knopp committed
636
  }
637

638
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep                   = configuration->rach_powerRampingStep[CC_id];
639
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower =
640 641 642
    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];
643
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer          =
644 645
    configuration->rach_macContentionResolutionTimer[CC_id];
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx                                            = configuration->rach_maxHARQ_Msg3Tx[CC_id];
knopp's avatar
knopp committed
646 647

  // BCCH-Config
648
  (*sib2)->radioResourceConfigCommon.bcch_Config.modificationPeriodCoeff
649
    = configuration->bcch_modificationPeriodCoeff[CC_id];
knopp's avatar
knopp committed
650 651

  // PCCH-Config
652
  (*sib2)->radioResourceConfigCommon.pcch_Config.defaultPagingCycle
653
    = configuration->pcch_defaultPagingCycle[CC_id];
654
  (*sib2)->radioResourceConfigCommon.pcch_Config.nB
655
    = configuration->pcch_nB[CC_id];
knopp's avatar
knopp committed
656 657

  // PRACH-Config
658
  (*sib2)->radioResourceConfigCommon.prach_Config.rootSequenceIndex
659
    = configuration->prach_root[CC_id];
660
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_ConfigIndex
661
    = configuration->prach_config_index[CC_id];
662
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.highSpeedFlag
663
    = configuration->prach_high_speed[CC_id];
664
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig
665
    = configuration->prach_zero_correlation[CC_id];
666
  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset
667
    = configuration->prach_freq_offset[CC_id];
knopp's avatar
knopp committed
668 669 670

  // PDSCH-Config
  (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower
671
    = configuration->pdsch_referenceSignalPower[CC_id];
knopp's avatar
knopp committed
672
  (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b
673
    = configuration->pdsch_p_b[CC_id];
knopp's avatar
knopp committed
674 675

  // PUSCH-Config
676
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB
677
    = configuration->pusch_n_SB[CC_id];
knopp's avatar
knopp committed
678
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode
679
    = configuration->pusch_hoppingMode[CC_id];
knopp's avatar
knopp committed
680
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset
681
    = configuration->pusch_hoppingOffset[CC_id];
knopp's avatar
knopp committed
682
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM
683
    = configuration->pusch_enable64QAM[CC_id];
knopp's avatar
knopp committed
684
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled
685
    = configuration->pusch_groupHoppingEnabled[CC_id];
knopp's avatar
knopp committed
686
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH
687
    = configuration->pusch_groupAssignment[CC_id];
knopp's avatar
knopp committed
688
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled
689
    = configuration->pusch_sequenceHoppingEnabled[CC_id];
knopp's avatar
knopp committed
690
  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift
691
    = configuration->pusch_nDMRS1[CC_id];
knopp's avatar
knopp committed
692 693 694 695

  // PUCCH-Config

  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.deltaPUCCH_Shift
696
    = configuration->pucch_delta_shift[CC_id];
697
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nRB_CQI
698
    = configuration->pucch_nRB_CQI[CC_id];
699
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN
700
    = configuration->pucch_nCS_AN[CC_id];
Cedric Roux's avatar
Cedric Roux committed
701
#if !defined(Rel10) && !defined(Rel14)
702
  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN
703
    = configuration->pucch_n1_AN[CC_id];
704
#endif
knopp's avatar
knopp committed
705 706

  // SRS Config
707
  if (configuration->srs_enable[CC_id]==1) {
knopp's avatar
knopp committed
708
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present
709
      = SoundingRS_UL_ConfigCommon_PR_setup;
knopp's avatar
knopp committed
710
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig
711
      = configuration->srs_BandwidthConfig[CC_id];
knopp's avatar
knopp committed
712
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig
713
      = configuration->srs_SubframeConfig[CC_id];
knopp's avatar
knopp committed
714
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission
715
      = configuration->srs_ackNackST[CC_id];
716

717
    if (configuration->srs_MaxUpPts[CC_id]) {
knopp's avatar
knopp committed
718
      (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts
719
        = CALLOC(1,sizeof(long));
knopp's avatar
knopp committed
720
      *(*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts=1;
721
    } else {
knopp's avatar
knopp committed
722 723
      (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts = NULL;
    }
724
    RC.rrc[Mod_id]->srs_enable[CC_id] = 1;
725
  } else {
726
    RC.rrc[Mod_id]->srs_enable[CC_id] = 0;
knopp's avatar
knopp committed
727 728 729 730 731 732
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present=SoundingRS_UL_ConfigCommon_PR_release;
    (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.release=0;
  }

  // uplinkPowerControlCommon

733
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUSCH
734
    = configuration->pusch_p0_Nominal[CC_id];
735
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUCCH
736
    = configuration->pucch_p0_Nominal[CC_id];
737
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.alpha
738
    = configuration->pusch_alpha[CC_id];
knopp's avatar
knopp committed
739
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1
740
    = configuration->pucch_deltaF_Format1[CC_id];
knopp's avatar
knopp committed
741
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b
742
    = configuration->pucch_deltaF_Format1b[CC_id];
knopp's avatar
knopp committed
743
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2
744
    = configuration->pucch_deltaF_Format2[CC_id];
knopp's avatar
knopp committed
745
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a
746
    = configuration->pucch_deltaF_Format2a[CC_id];
knopp's avatar
knopp committed
747
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b
748
    = configuration->pucch_deltaF_Format2b[CC_id];
knopp's avatar
knopp committed
749
  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaPreambleMsg3
750
    = configuration->msg3_delta_Preamble[CC_id];
knopp's avatar
knopp committed
751
  (*sib2)->radioResourceConfigCommon.ul_CyclicPrefixLength
752
    = configuration->ul_CyclicPrefixLength[CC_id];
knopp's avatar
knopp committed
753 754 755 756

  // UE Timers and Constants

  (*sib2)->ue_TimersAndConstants.t300
757
    = configuration->ue_TimersAndConstants_t300[CC_id];
knopp's avatar
knopp committed
758
  (*sib2)->ue_TimersAndConstants.t301
759
    = configuration->ue_TimersAndConstants_t301[CC_id];
knopp's avatar
knopp committed
760
  (*sib2)->ue_TimersAndConstants.t310
761
    = configuration->ue_TimersAndConstants_t310[CC_id];
knopp's avatar
knopp committed
762
  (*sib2)->ue_TimersAndConstants.n310
763
    = configuration->ue_TimersAndConstants_n310[CC_id];
knopp's avatar
knopp committed
764
  (*sib2)->ue_TimersAndConstants.t311
765
    = configuration->ue_TimersAndConstants_t311[CC_id];
knopp's avatar
knopp committed
766
  (*sib2)->ue_TimersAndConstants.n311
767
    = configuration->ue_TimersAndConstants_n311[CC_id];
knopp's avatar
knopp committed
768 769

#else
770 771 772
  (*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;
773 774
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower=
    RACH_ConfigCommon__powerRampingParameters__preambleInitialReceivedTargetPower_dBm_100;
775
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax=RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10;
knopp's avatar
knopp committed
776
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize=RACH_ConfigCommon__ra_SupervisionInfo__ra_ResponseWindowSize_sf10;
777 778
  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer=
    RACH_ConfigCommon__ra_SupervisionInfo__mac_ContentionResolutionTimer_sf48;
779 780 781 782 783 784
  (*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
785
  (*sib2)->radioResourceConfigCommon.pcch_Config.defaultPagingCycle = PCCH_Config__defaultPagingCycle_rf128;
786 787 788 789 790 791 792 793 794 795
  (*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
796
  (*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
797

798