rrc_UE.c 148 KB
Newer Older
1
/*******************************************************************************
2 3
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom
4

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


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

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

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

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

28
*******************************************************************************/
29
/*! \file rrc_UE.c
30
 * \brief rrc procedures for UE
31 32
 * \author Navid Nikaein and Raymond Knopp
 * \date 2011 - 2014
33 34
 * \version 1.0
 * \company Eurecom
35
 * \email: navid.nikaein@eurecom.fr and raymond.knopp@eurecom.fr
36
 */
37

Lionel Gauthier's avatar
Lionel Gauthier committed
38 39
#define RRC_UE
#define RRC_UE_C
40

41
#include "assertions.h"
42
#include "asn1_conversions.h"
43
#include "defs.h"
44
#include "PHY/TOOLS/dB_routines.h"
45 46 47 48 49 50
#include "extern.h"
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
#include "LAYER2/RLC/rlc.h"
#include "COMMON/mac_rrc_primitives.h"
#include "UTIL/LOG/log.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
51 52 53
#ifndef CELLULAR
#include "RRC/LITE/MESSAGES/asn1_msg.h"
#endif
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
#include "RRCConnectionRequest.h"
#include "RRCConnectionReconfiguration.h"
#include "UL-CCCH-Message.h"
#include "DL-CCCH-Message.h"
#include "UL-DCCH-Message.h"
#include "DL-DCCH-Message.h"
#include "BCCH-DL-SCH-Message.h"
#ifdef Rel10
#include "MCCH-Message.h"
#endif
#include "MeasConfig.h"
#include "MeasGapConfig.h"
#include "MeasObjectEUTRA.h"
#include "TDD-Config.h"
#include "UECapabilityEnquiry.h"
#include "UE-CapabilityRequest.h"
#ifdef PHY_ABSTRACTION
#include "OCG.h"
#include "OCG_extern.h"
#endif
#ifdef USER_MODE
#include "RRC/NAS/nas_config.h"
#include "RRC/NAS/rb_config.h"
#endif
Lionel Gauthier's avatar
Lionel Gauthier committed
78 79 80
#ifdef ENABLE_RAL
#include "rrc_UE_ral.h"
#endif
81 82 83 84 85

#if defined(ENABLE_SECURITY)
# include "UTIL/OSA/osa_defs.h"
#endif

86 87
#include "pdcp.h"

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

92 93 94 95 96 97 98 99 100 101 102 103
#ifdef PHY_EMUL
extern EMULATION_VARS *Emul_vars;
#endif
extern eNB_MAC_INST *eNB_mac_inst;
extern UE_MAC_INST *UE_mac_inst;
#ifdef BIGPHYSAREA
extern void *bigphys_malloc(int);
#endif

//#define XER_PRINT

extern inline unsigned int taus(void);
104
extern int8_t dB_fixed2(uint32_t x,uint32_t y);
105

winckel's avatar
winckel committed
106
/*------------------------------------------------------------------------------*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
107 108
static Rrc_State_t rrc_get_state (module_id_t ue_mod_idP) {
  return UE_rrc_inst[ue_mod_idP].RrcState;
winckel's avatar
winckel committed
109 110
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
111 112
static Rrc_Sub_State_t rrc_get_sub_state (module_id_t ue_mod_idP) {
  return UE_rrc_inst[ue_mod_idP].RrcSubState;
winckel's avatar
winckel committed
113 114
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
115
static int rrc_set_state (module_id_t ue_mod_idP, Rrc_State_t state) {
winckel's avatar
winckel committed
116
  AssertFatal ((RRC_STATE_FIRST <= state) && (state <= RRC_STATE_LAST),
117
      "Invalid state %d!\n", state);
winckel's avatar
winckel committed
118

Lionel Gauthier's avatar
 
Lionel Gauthier committed
119 120
  if (UE_rrc_inst[ue_mod_idP].RrcState != state) {
      UE_rrc_inst[ue_mod_idP].RrcState = state;
winckel's avatar
winckel committed
121

122
#if defined(ENABLE_ITTI)
123 124
      {
        MessageDef *msg_p;
125

126
        msg_p = itti_alloc_new_message(TASK_RRC_UE, RRC_STATE_IND);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
127 128
        RRC_STATE_IND(msg_p).state = UE_rrc_inst[ue_mod_idP].RrcState;
        RRC_STATE_IND(msg_p).sub_state = UE_rrc_inst[ue_mod_idP].RrcSubState;
winckel's avatar
winckel committed
129

Lionel Gauthier's avatar
 
Lionel Gauthier committed
130
        itti_send_msg_to_task(TASK_UNKNOWN, NB_eNB_INST + ue_mod_idP, msg_p);
131
      }
132
#endif
133
      return (1);
winckel's avatar
winckel committed
134 135 136 137 138
  }

  return (0);
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
139
static int rrc_set_sub_state (module_id_t ue_mod_idP, Rrc_Sub_State_t subState) {
140
#if (defined(ENABLE_ITTI) && (defined(ENABLE_USE_MME) || defined(ENABLE_RAL)))
Lionel Gauthier's avatar
 
Lionel Gauthier committed
141
  switch (UE_rrc_inst[ue_mod_idP].RrcState) {
142 143
  case RRC_STATE_INACTIVE:
    AssertFatal ((RRC_SUB_STATE_INACTIVE_FIRST <= subState) && (subState <= RRC_SUB_STATE_INACTIVE_LAST),
Lionel Gauthier's avatar
 
Lionel Gauthier committed
144
        "Invalid sub state %d for state %d!\n", subState, UE_rrc_inst[ue_mod_idP].RrcState);
145 146 147 148
    break;

  case RRC_STATE_IDLE:
    AssertFatal ((RRC_SUB_STATE_IDLE_FIRST <= subState) && (subState <= RRC_SUB_STATE_IDLE_LAST),
Lionel Gauthier's avatar
 
Lionel Gauthier committed
149
        "Invalid sub state %d for state %d!\n", subState, UE_rrc_inst[ue_mod_idP].RrcState);
150 151 152 153
    break;

  case RRC_STATE_CONNECTED:
    AssertFatal ((RRC_SUB_STATE_CONNECTED_FIRST <= subState) && (subState <= RRC_SUB_STATE_CONNECTED_LAST),
Lionel Gauthier's avatar
 
Lionel Gauthier committed
154
        "Invalid sub state %d for state %d!\n", subState, UE_rrc_inst[ue_mod_idP].RrcState);
155
    break;
winckel's avatar
winckel committed
156
  }
157
#endif
winckel's avatar
winckel committed
158

Lionel Gauthier's avatar
 
Lionel Gauthier committed
159 160
  if (UE_rrc_inst[ue_mod_idP].RrcSubState != subState) {
      UE_rrc_inst[ue_mod_idP].RrcSubState = subState;
winckel's avatar
winckel committed
161

162
#if defined(ENABLE_ITTI)
163 164
      {
        MessageDef *msg_p;
winckel's avatar
winckel committed
165

166
        msg_p = itti_alloc_new_message(TASK_RRC_UE, RRC_STATE_IND);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
167 168
        RRC_STATE_IND(msg_p).state = UE_rrc_inst[ue_mod_idP].RrcState;
        RRC_STATE_IND(msg_p).sub_state = UE_rrc_inst[ue_mod_idP].RrcSubState;
169

Lionel Gauthier's avatar
 
Lionel Gauthier committed
170
        itti_send_msg_to_task(TASK_UNKNOWN, NB_eNB_INST + ue_mod_idP, msg_p);
171
      }
172
#endif
173
      return (1);
winckel's avatar
winckel committed
174 175 176 177 178 179
  }

  return (0);
}

/*------------------------------------------------------------------------------*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
180
void init_SI_UE(module_id_t ue_mod_idP,uint8_t eNB_index) {
181 182 183 184

  int i;


Lionel Gauthier's avatar
 
Lionel Gauthier committed
185 186
  UE_rrc_inst[ue_mod_idP].sizeof_SIB1[eNB_index] = 0;
  UE_rrc_inst[ue_mod_idP].sizeof_SI[eNB_index] = 0;
187

Lionel Gauthier's avatar
 
Lionel Gauthier committed
188 189 190
  UE_rrc_inst[ue_mod_idP].SIB1[eNB_index] = (uint8_t *)malloc16(32);
  UE_rrc_inst[ue_mod_idP].sib1[eNB_index] = (SystemInformationBlockType1_t *)malloc16(sizeof(SystemInformationBlockType1_t));
  UE_rrc_inst[ue_mod_idP].SI[eNB_index] = (uint8_t *)malloc16(64);
191 192

  for (i=0;i<NB_CNX_UE;i++) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
193
      UE_rrc_inst[ue_mod_idP].si[eNB_index][i] = (SystemInformation_t *)malloc16(sizeof(SystemInformation_t));
194 195
  }

Lionel Gauthier's avatar
 
Lionel Gauthier committed
196 197
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIB1Status = 0;
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIStatus = 0;
198 199 200
}

#ifdef Rel10
Lionel Gauthier's avatar
 
Lionel Gauthier committed
201
void init_MCCH_UE(module_id_t ue_mod_idP, uint8_t eNB_index) {
202
  int i;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
203 204 205
  UE_rrc_inst[ue_mod_idP].sizeof_MCCH_MESSAGE[eNB_index] = 0;
  UE_rrc_inst[ue_mod_idP].MCCH_MESSAGE[eNB_index] = (uint8_t *)malloc16(32);
  UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index] = (MBSFNAreaConfiguration_r9_t *)malloc16(sizeof(MBSFNAreaConfiguration_r9_t));
206
  for (i=0; i<8;i++) // MAX MBSFN Area
Lionel Gauthier's avatar
 
Lionel Gauthier committed
207
    UE_rrc_inst[ue_mod_idP].Info[eNB_index].MCCHStatus[i] = 0;
208 209 210 211 212

}
#endif

static
Lionel Gauthier's avatar
 
Lionel Gauthier committed
213
void openair_rrc_lite_ue_init_security(module_id_t ue_mod_idP)
214 215
{
#if defined(ENABLE_SECURITY)
216 217 218 219
  //    uint8_t *kRRCenc;
  //    uint8_t *kRRCint;
  char ascii_buffer[65];
  uint8_t i;
220

Lionel Gauthier's avatar
 
Lionel Gauthier committed
221
  memset(UE_rrc_inst[ue_mod_idP].kenb, ue_mod_idP, 32);
222

223
  for (i = 0; i < 32; i++) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
224
      sprintf(&ascii_buffer[2 * i], "%02X", UE_rrc_inst[ue_mod_idP].kenb[i]);
225
  }
226

Lionel Gauthier's avatar
 
Lionel Gauthier committed
227
  LOG_T(RRC, "[OSA][UE %02d] kenb    = %s\n", ue_mod_idP, ascii_buffer);
228
#endif
229
}
230 231

/*------------------------------------------------------------------------------*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
232
char openair_rrc_lite_ue_init(module_id_t ue_mod_idP, unsigned char eNB_index){
233
  /*-----------------------------------------------------------------------------*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
  rrc_set_state (ue_mod_idP, RRC_STATE_INACTIVE);
  rrc_set_sub_state (ue_mod_idP, RRC_SUB_STATE_INACTIVE);

  LOG_D(RRC,"[UE %d] INIT State = RRC_IDLE (eNB %d)\n",ue_mod_idP,eNB_index);
  LOG_D(RRC,"[MSC_NEW][FRAME 00000][RRC_UE][MOD %02d][]\n", ue_mod_idP+NB_eNB_INST);
  LOG_D(RRC, "[MSC_NEW][FRAME 00000][IP][MOD %02d][]\n", ue_mod_idP+NB_eNB_INST);

  UE_rrc_inst[ue_mod_idP].Info[eNB_index].State=RRC_IDLE;
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].T300_active = 0;
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].T304_active = 0;
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].T310_active = 0;
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].UE_index=0xffff;
  UE_rrc_inst[ue_mod_idP].Srb0[eNB_index].Active=0;
  UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Active=0;
  UE_rrc_inst[ue_mod_idP].Srb2[eNB_index].Active=0;
  UE_rrc_inst[ue_mod_idP].HandoverInfoUe.measFlag=1;

  UE_rrc_inst[ue_mod_idP].ciphering_algorithm = SecurityAlgorithmConfig__cipheringAlgorithm_eea0;
252
#ifdef Rel10
Lionel Gauthier's avatar
 
Lionel Gauthier committed
253
  UE_rrc_inst[ue_mod_idP].integrity_algorithm = SecurityAlgorithmConfig__integrityProtAlgorithm_eia0_v920;
254
#else
Lionel Gauthier's avatar
 
Lionel Gauthier committed
255
  UE_rrc_inst[ue_mod_idP].integrity_algorithm = SecurityAlgorithmConfig__integrityProtAlgorithm_reserved;
256 257
#endif

Lionel Gauthier's avatar
 
Lionel Gauthier committed
258
  openair_rrc_lite_ue_init_security(ue_mod_idP);
259

Lionel Gauthier's avatar
 
Lionel Gauthier committed
260 261
  init_SI_UE(ue_mod_idP,eNB_index);
  LOG_D(RRC,"[UE %d] INIT: phy_sync_2_ch_ind\n", ue_mod_idP);
262 263

#ifndef NO_RRM
Lionel Gauthier's avatar
 
Lionel Gauthier committed
264
  send_msg(&S_rrc,msg_rrc_phy_synch_to_CH_ind(ue_mod_idP,eNB_index,UE_rrc_inst[ue_mod_idP].Mac_id));
265 266 267
#endif

#ifdef NO_RRM //init ch SRB0, SRB1 & BDTCH
Lionel Gauthier's avatar
 
Lionel Gauthier committed
268
  openair_rrc_on(ue_mod_idP,0);
269 270 271 272
#endif
#ifdef CBA 
  int j;
  for(j=0; j<NUM_MAX_CBA_GROUP; j++)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
273 274
    UE_rrc_inst[ue_mod_idP].cba_rnti[j] = 0x0000;
  UE_rrc_inst[ue_mod_idP].num_active_cba_groups = 0;
275 276 277 278 279 280
#endif

  return 0;
}

/*------------------------------------------------------------------------------*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
281
void rrc_ue_generate_RRCConnectionRequest(module_id_t ue_mod_idP, frame_t frameP, uint8_t eNB_index){
282 283
  /*------------------------------------------------------------------------------*/

284
  uint8_t i=0,rv[6];
285

Lionel Gauthier's avatar
 
Lionel Gauthier committed
286
  if(UE_rrc_inst[ue_mod_idP].Srb0[eNB_index].Tx_buffer.payload_size ==0){
287

288 289
      // Get RRCConnectionRequest, fill random for now
      // Generate random byte stream for contention resolution
290 291
      for (i=0;i<6;i++) {
#ifdef SMBV   
292 293
          // if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
          rv[i]=i;
294
#else
295
          rv[i]=taus()&0xff;
296
#endif
297 298 299
          LOG_T(RRC,"%x.",rv[i]);
      }
      LOG_T(RRC,"\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
300
      UE_rrc_inst[ue_mod_idP].Srb0[eNB_index].Tx_buffer.payload_size = do_RRCConnectionRequest(ue_mod_idP, (uint8_t *)UE_rrc_inst[ue_mod_idP].Srb0[eNB_index].Tx_buffer.Payload,rv);
301

302
      LOG_I(RRC,"[UE %d] : Frame %d, Logical Channel UL-CCCH (SRB0), Generating RRCConnectionRequest (bytes %d, eNB %d)\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
303
          ue_mod_idP, frameP, UE_rrc_inst[ue_mod_idP].Srb0[eNB_index].Tx_buffer.payload_size, eNB_index);
304

Lionel Gauthier's avatar
 
Lionel Gauthier committed
305 306
      for (i=0;i<UE_rrc_inst[ue_mod_idP].Srb0[eNB_index].Tx_buffer.payload_size;i++) {
          LOG_T(RRC,"%x.",UE_rrc_inst[ue_mod_idP].Srb0[eNB_index].Tx_buffer.Payload[i]);
307 308 309
      }
      LOG_T(RRC,"\n");
      /*
Lionel Gauthier's avatar
 
Lionel Gauthier committed
310
      UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.Payload[i] = taus()&0xff;
311

Lionel Gauthier's avatar
 
Lionel Gauthier committed
312
    UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.payload_size =i;
313
       */
314 315 316 317 318 319 320

  }
}


mui_t rrc_mui=0;

321
/* NAS Attach request with IMSI */
322
static const char const nas_attach_req_imsi[] =
323 324 325 326 327 328 329 330 331 332 333 334
    {
        0x07, 0x41,
        /* EPS Mobile identity = IMSI */
        0x71, 0x08, 0x29, 0x80, 0x43, 0x21, 0x43, 0x65, 0x87,
        0xF9,
        /* End of EPS Mobile Identity */
        0x02, 0xE0, 0xE0, 0x00, 0x20, 0x02, 0x03,
        0xD0, 0x11, 0x27, 0x1A, 0x80, 0x80, 0x21, 0x10, 0x01, 0x00, 0x00,
        0x10, 0x81, 0x06, 0x00, 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0A, 0x00, 0x52, 0x12, 0xF2,
        0x01, 0x27, 0x11,
    };
335 336

/* NAS Attach request with GUTI */
337
static const char const nas_attach_req_guti[] =
338 339 340 341 342 343 344 345 346 347 348 349
    {
        0x07, 0x41,
        /* EPS Mobile identity = GUTI */
        0x71, 0x0B, 0xF6, 0x12, 0xF2, 0x01, 0x80, 0x00, 0x01, 0xE0, 0x00,
        0xDA, 0x1F,
        /* End of EPS Mobile Identity */
        0x02, 0xE0, 0xE0, 0x00, 0x20, 0x02, 0x03,
        0xD0, 0x11, 0x27, 0x1A, 0x80, 0x80, 0x21, 0x10, 0x01, 0x00, 0x00,
        0x10, 0x81, 0x06, 0x00, 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0A, 0x00, 0x52, 0x12, 0xF2,
        0x01, 0x27, 0x11,
    };
350

351
/*------------------------------------------------------------------------------*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
352
void rrc_ue_generate_RRCConnectionSetupComplete(module_id_t ue_mod_idP, frame_t frameP, uint8_t eNB_index, uint8_t Transaction_id){
353 354
  /*------------------------------------------------------------------------------*/

355 356
  uint8_t    buffer[100];
  uint8_t    size;
357
  const char * nas_msg;
winckel's avatar
winckel committed
358
  int   nas_msg_length;
359

winckel's avatar
winckel committed
360
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
361 362
  nas_msg         = (char *) UE_rrc_inst[ue_mod_idP].initialNasMsg.data;
  nas_msg_length  = UE_rrc_inst[ue_mod_idP].initialNasMsg.length;
winckel's avatar
winckel committed
363 364 365 366 367
#else
  nas_msg         = nas_attach_req_imsi;
  nas_msg_length  = sizeof(nas_attach_req_imsi);
#endif

Lionel Gauthier's avatar
 
Lionel Gauthier committed
368
  size = do_RRCConnectionSetupComplete(ue_mod_idP, buffer, Transaction_id, nas_msg_length, nas_msg);
369 370

  LOG_I(RRC,"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCConnectionSetupComplete (bytes%d, eNB %d)\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
371
      ue_mod_idP,frameP, size, eNB_index);
372

373
  LOG_D(RLC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to eNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
374
      frameP, ue_mod_idP+NB_eNB_INST, size, eNB_index, rrc_mui, ue_mod_idP+NB_eNB_INST, DCCH);
375

Lionel Gauthier's avatar
 
Lionel Gauthier committed
376 377
  //  rrc_rlc_data_req(ue_mod_idP+NB_eNB_INST,frameP, 0 ,DCCH,rrc_mui++,0,size,(char*)buffer);
  pdcp_rrc_data_req (eNB_index, ue_mod_idP, frameP, 0, DCCH, rrc_mui++, 0, size, buffer, 1);
378 379
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
380
void rrc_ue_generate_RRCConnectionReconfigurationComplete(module_id_t ue_mod_idP, frame_t frameP, uint8_t eNB_index, uint8_t Transaction_id) {
381

382
  uint8_t buffer[32], size;
383

Lionel Gauthier's avatar
 
Lionel Gauthier committed
384
  size = do_RRCConnectionReconfigurationComplete(ue_mod_idP, buffer, Transaction_id);
385 386

  LOG_I(RRC,"[UE %d] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCConnectionReconfigurationComplete (bytes %d, eNB_index %d)\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
387
      ue_mod_idP,frameP, size, eNB_index);
388
  LOG_D(RLC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionReconfigurationComplete to eNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
389
      frameP, ue_mod_idP+NB_eNB_INST, size, eNB_index, rrc_mui, ue_mod_idP+NB_eNB_INST, DCCH);
390

Lionel Gauthier's avatar
 
Lionel Gauthier committed
391 392
  //rrc_rlc_data_req(ue_mod_idP+NB_eNB_INST,frameP, 0 ,DCCH,rrc_mui++,0,size,(char*)buffer);
  pdcp_rrc_data_req (eNB_index, ue_mod_idP, frameP, 0, DCCH, rrc_mui++, 0, size, buffer, 1);
393 394 395
}

/*------------------------------------------------------------------------------*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
396
int rrc_ue_decode_ccch(module_id_t ue_mod_idP, frame_t frameP, SRB_INFO *Srb_info, uint8_t eNB_index){
397 398 399 400 401
  /*------------------------------------------------------------------------------*/

  //DL_CCCH_Message_t dlccchmsg;
  DL_CCCH_Message_t *dl_ccch_msg=NULL;//&dlccchmsg;
  asn_dec_rval_t dec_rval;
402
  int rval=0;
403 404 405 406 407

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_IN);

  //memset(dl_ccch_msg,0,sizeof(DL_CCCH_Message_t));

Lionel Gauthier's avatar
 
Lionel Gauthier committed
408 409
  //  LOG_D(RRC,"[UE %d] Decoding DL-CCCH message (%d bytes), State %d\n",ue_mod_idP,Srb_info->Rx_buffer.payload_size,
  //  UE_rrc_inst[ue_mod_idP].Info[eNB_index].State);
410 411

  dec_rval = uper_decode(NULL,
412 413 414 415
      &asn_DEF_DL_CCCH_Message,
      (void**)&dl_ccch_msg,
      (uint8_t*)Srb_info->Rx_buffer.Payload,
      100,0,0);
416 417 418 419 420

#ifdef XER_PRINT
  xer_fprint(stdout,&asn_DEF_DL_CCCH_Message,(void*)dl_ccch_msg);
#endif

421
#if defined(ENABLE_ITTI)
422
# if defined(DISABLE_ITTI_XER_PRINT)
423
  {
winckel's avatar
winckel committed
424
    MessageDef *msg_p;
425

winckel's avatar
winckel committed
426 427
    msg_p = itti_alloc_new_message (TASK_RRC_UE, RRC_DL_CCCH_MESSAGE);
    memcpy (&msg_p->ittiMsg, (void *) dl_ccch_msg, sizeof(RrcDlCcchMessage));
428

Lionel Gauthier's avatar
 
Lionel Gauthier committed
429
    itti_send_msg_to_task (TASK_UNKNOWN, ue_mod_idP + NB_eNB_INST, msg_p);
430
  }
431 432
# else
  {
433 434
    char        message_string[10000];
    size_t      message_string_size;
435

436
    if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_DL_CCCH_Message, (void *)dl_ccch_msg)) > 0)
437 438
      {
        MessageDef *msg_p;
439

440 441 442
        msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_DL_CCCH, message_string_size + sizeof (IttiMsgText));
        msg_p->ittiMsg.rrc_dl_ccch.size = message_string_size;
        memcpy(&msg_p->ittiMsg.rrc_dl_ccch.text, message_string, message_string_size);
443

Lionel Gauthier's avatar
 
Lionel Gauthier committed
444
        itti_send_msg_to_task(TASK_UNKNOWN, ue_mod_idP + NB_eNB_INST, msg_p);
445
      }
446 447
  }
# endif
448 449
#endif

450
  if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
451
      LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%d bytes)\n",ue_mod_idP,dec_rval.consumed);
452 453
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT);
      return -1;
454 455 456 457
  }

  if (dl_ccch_msg->message.present == DL_CCCH_MessageType_PR_c1) {

Lionel Gauthier's avatar
 
Lionel Gauthier committed
458
      if (UE_rrc_inst[ue_mod_idP].Info[eNB_index].State == RRC_SI_RECEIVED) {
459

460
          switch (dl_ccch_msg->message.choice.c1.present) {
461

462
          case DL_CCCH_MessageType__c1_PR_NOTHING:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
463
            LOG_I(RRC, "[UE%d] Frame %d : Received PR_NOTHING on DL-CCCH-Message\n", ue_mod_idP, frameP);
464 465
            rval = 0;
            break;
466

467 468
          case DL_CCCH_MessageType__c1_PR_rrcConnectionReestablishment:
            LOG_D(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
469
                "[MSC_MSG][FRAME %05d][MAC_UE][MOD %02d][][--- MAC_DATA_IND (rrcConnectionReestablishment ENB %d) --->][RRC_UE][MOD %02d][]\n", frameP, ue_mod_idP+NB_eNB_INST, eNB_index, ue_mod_idP+NB_eNB_INST);
470

471
            LOG_I(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
472
                "[UE%d] Frame %d : Logical Channel DL-CCCH (SRB0), Received RRCConnectionReestablishment\n", ue_mod_idP, frameP);
473 474
            rval = 0;
            break;
475

476 477
          case DL_CCCH_MessageType__c1_PR_rrcConnectionReestablishmentReject:
            LOG_D(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
478
                "[MSC_MSG][FRAME %05d][MAC_UE][MOD %02d][][--- MAC_DATA_IND (RRCConnectionReestablishmentReject ENB %d) --->][RRC_UE][MOD %02d][]\n", frameP, ue_mod_idP+NB_eNB_INST, eNB_index, ue_mod_idP+NB_eNB_INST);
479
            LOG_I(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
480
                "[UE%d] Frame %d : Logical Channel DL-CCCH (SRB0), Received RRCConnectionReestablishmentReject\n", ue_mod_idP, frameP);
481 482
            rval = 0;
            break;
483

484 485
          case DL_CCCH_MessageType__c1_PR_rrcConnectionReject:
            LOG_D(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
486
                "[MSC_MSG][FRAME %05d][MAC_UE][MOD %02d][][--- MAC_DATA_IND (rrcConnectionReject ENB %d) --->][RRC_UE][MOD %02d][]\n", frameP, ue_mod_idP+NB_eNB_INST, eNB_index, ue_mod_idP+NB_eNB_INST);
487

488
            LOG_I(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
489
                "[UE%d] Frame %d : Logical Channel DL-CCCH (SRB0), Received RRCConnectionReject \n", ue_mod_idP, frameP);
490 491
            rval = 0;
            break;
492

493 494
          case DL_CCCH_MessageType__c1_PR_rrcConnectionSetup:
            LOG_D(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
495
                "[MSC_MSG][FRAME %05d][MAC_UE][MOD %02d][][--- MAC_DATA_IND (rrcConnectionSetup ENB %d) --->][RRC_UE][MOD %02d][]\n", frameP, ue_mod_idP+NB_eNB_INST, eNB_index, ue_mod_idP+NB_eNB_INST);
496

497
            LOG_I(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
498
                "[UE%d][RAPROC] Frame %d : Logical Channel DL-CCCH (SRB0), Received RRCConnectionSetup \n", ue_mod_idP, frameP);
499
            // Get configuration
500

501
            // Release T300 timer
Lionel Gauthier's avatar
 
Lionel Gauthier committed
502 503
            UE_rrc_inst[ue_mod_idP].Info[eNB_index].T300_active = 0;
            rrc_ue_process_radioResourceConfigDedicated(ue_mod_idP, frameP, eNB_index,
504
                &dl_ccch_msg->message.choice.c1.choice.rrcConnectionSetup.criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated);
505

Lionel Gauthier's avatar
 
Lionel Gauthier committed
506 507 508
            rrc_set_state (ue_mod_idP, RRC_STATE_CONNECTED);
            rrc_set_sub_state (ue_mod_idP, RRC_SUB_STATE_CONNECTED);
            rrc_ue_generate_RRCConnectionSetupComplete(ue_mod_idP, frameP, eNB_index, dl_ccch_msg->message.choice.c1.choice.rrcConnectionSetup.rrc_TransactionIdentifier);
509

510 511
            rval = 0;
            break;
512

513
          default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
514
            LOG_E(RRC, "[UE%d] Frame %d : Unknown message\n", ue_mod_idP, frameP);
515 516 517
            rval = -1;
            break;
          }
518 519 520 521 522 523 524
      }
  }

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT);
  return rval;
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
525
int32_t rrc_ue_establish_srb1(module_id_t ue_mod_idP, frame_t frameP,uint8_t eNB_index, struct SRB_ToAddMod *SRB_config) {
526
  // add descriptor from RRC PDU
527

528
  uint8_t lchan_id = DCCH;
529

Lionel Gauthier's avatar
 
Lionel Gauthier committed
530 531 532
  UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Active = 1;
  UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Status = RADIO_CONFIG_OK;//RADIO CFG
  UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Srb_id = 1;
533

534
  // copy default configuration for now
Lionel Gauthier's avatar
 
Lionel Gauthier committed
535 536
  //  memcpy(&UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Lchan_desc[0],&DCCH_LCHAN_DESC,LCHAN_DESC_SIZE);
  //  memcpy(&UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Lchan_desc[1],&DCCH_LCHAN_DESC,LCHAN_DESC_SIZE);
537 538


Lionel Gauthier's avatar
 
Lionel Gauthier committed
539
  LOG_I(RRC,"[UE %d], CONFIG_SRB1 %d corresponding to eNB_index %d\n", ue_mod_idP,lchan_id,eNB_index);
540

Lionel Gauthier's avatar
 
Lionel Gauthier committed
541 542
  //rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, lchan_id,UNDEF_SECURITY_MODE);
  //  rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,lchan_id,SIGNALLING_RADIO_BEARER,Rlc_info_am_config);
543

Lionel Gauthier's avatar
 
Lionel Gauthier committed
544
  //  UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Tx_buffer.payload_size=DEFAULT_MEAS_IND_SIZE+1;
545 546 547 548 549


  return(0);
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
550
int32_t rrc_ue_establish_srb2(module_id_t ue_mod_idP, frame_t frameP,uint8_t eNB_index, struct SRB_ToAddMod *SRB_config) {
551
  // add descriptor from RRC PDU
552

553
  uint8_t lchan_id = DCCH1;
554

Lionel Gauthier's avatar
 
Lionel Gauthier committed
555 556 557
  UE_rrc_inst[ue_mod_idP].Srb2[eNB_index].Active = 1;
  UE_rrc_inst[ue_mod_idP].Srb2[eNB_index].Status = RADIO_CONFIG_OK;//RADIO CFG
  UE_rrc_inst[ue_mod_idP].Srb2[eNB_index].Srb_info.Srb_id = 2;
558

559
  // copy default configuration for now
Lionel Gauthier's avatar
 
Lionel Gauthier committed
560 561
  //  memcpy(&UE_rrc_inst[ue_mod_idP].Srb2[eNB_index].Srb_info.Lchan_desc[0],&DCCH_LCHAN_DESC,LCHAN_DESC_SIZE);
  //  memcpy(&UE_rrc_inst[ue_mod_idP].Srb2[eNB_index].Srb_info.Lchan_desc[1],&DCCH_LCHAN_DESC,LCHAN_DESC_SIZE);
562 563


Lionel Gauthier's avatar
 
Lionel Gauthier committed
564
  LOG_I(RRC,"[UE %d], CONFIG_SRB2 %d corresponding to eNB_index %d\n",ue_mod_idP,lchan_id,eNB_index);
565

Lionel Gauthier's avatar
 
Lionel Gauthier committed
566 567
  //rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, lchan_id, UNDEF_SECURITY_MODE);
  //  rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,lchan_id,SIGNALLING_RADIO_BEARER,Rlc_info_am_config);
568

Lionel Gauthier's avatar
 
Lionel Gauthier committed
569
  //  UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Tx_buffer.payload_size=DEFAULT_MEAS_IND_SIZE+1;
570 571 572 573 574


  return(0);
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
575
int32_t rrc_ue_establish_drb(module_id_t ue_mod_idP, frame_t frameP,uint8_t eNB_index,
576
    struct DRB_ToAddMod *DRB_config) { // add descriptor from RRC PDU
577
#ifdef NAS_NETLINK
578
  int oip_ifup=0,ip_addr_offset3=0,ip_addr_offset4=0;
579
#endif
580

581
  LOG_I(RRC,"[UE %d] Frame %d: processing RRCConnectionReconfiguration: reconfiguring DRB %ld/LCID %d\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
582
      ue_mod_idP, frameP, DRB_config->drb_Identity, (int)*DRB_config->logicalChannelIdentity);
583
  /*
Lionel Gauthier's avatar
 
Lionel Gauthier committed
584
  rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD,
585
                             (eNB_index * NB_RB_MAX) + *DRB_config->logicalChannelIdentity, UNDEF_SECURITY_MODE);
586

Lionel Gauthier's avatar
 
Lionel Gauthier committed
587
 rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,
588 589
                    (eNB_index * NB_RB_MAX) + *DRB_config->logicalChannelIdentity,
                    RADIO_ACCESS_BEARER,Rlc_info_um);
590
   */
591 592
#ifdef NAS_NETLINK
#    ifdef OAI_EMU
593 594
  ip_addr_offset3 = oai_emulation.info.nb_enb_local;
  ip_addr_offset4 = NB_eNB_INST;
595
#    else
596 597
  ip_addr_offset3 = 0;
  ip_addr_offset4 = 8;
598 599
#    endif
#    if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
600 601 602 603 604
  LOG_I(OIP,"[UE %d] trying to bring up the OAI interface oai%d, IP 10.0.%d.%d\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP,
      ip_addr_offset3+ue_mod_idP+1,ip_addr_offset4+ue_mod_idP+1);
  oip_ifup=nas_config(ip_addr_offset3+ue_mod_idP,   // interface_id
      ip_addr_offset3+ue_mod_idP+1, // third_octet
      ip_addr_offset4+ue_mod_idP+1); // fourth_octet
605
  if (oip_ifup == 0 ){ // interface is up --> send a config the DRB
606
#        ifdef OAI_EMU
Lionel Gauthier's avatar
 
Lionel Gauthier committed
607
      oai_emulation.info.oai_ifup[ue_mod_idP]=1;
608 609
#        endif
      LOG_I(OIP,"[UE %d] Config the oai%d to send/receive pkt on DRB %d to/from the protocol stack\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
610 611
          ue_mod_idP,
          ip_addr_offset3+ue_mod_idP,
612
          (eNB_index * maxDRB) + DRB_config->drb_Identity);
613 614

      rb_conf_ipv4(0,//add
Lionel Gauthier's avatar
 
Lionel Gauthier committed
615 616
          ue_mod_idP,//cx align with the UE index
          ip_addr_offset3+ue_mod_idP,//inst num_enb+ue_index
617
          (eNB_index * maxDRB) + DRB_config->drb_Identity,//rb
618
          0,//dscp
Lionel Gauthier's avatar
 
Lionel Gauthier committed
619 620 621
          ipv4_address(ip_addr_offset3+ue_mod_idP+1,ip_addr_offset4+ue_mod_idP+1),//saddr
          ipv4_address(ip_addr_offset3+ue_mod_idP+1,eNB_index+1));//daddr
      LOG_D(RRC,"[UE %d] State = Attached (eNB %d)\n",ue_mod_idP,eNB_index);
622
  }
623 624
#    else
#        ifdef OAI_EMU
Lionel Gauthier's avatar
 
Lionel Gauthier committed
625
  oai_emulation.info.oai_ifup[ue_mod_idP]=1;
626 627 628 629 630 631 632 633
#        endif
#    endif
#endif

  return(0);
}


Lionel Gauthier's avatar
 
Lionel Gauthier committed
634
void  rrc_ue_process_measConfig(module_id_t ue_mod_idP, frame_t frameP, uint8_t eNB_index,MeasConfig_t *measConfig){
635 636 637 638 639 640 641

  // This is the procedure described in 36.331 Section 5.5.2.1
  int i;
  long ind;
  MeasObjectToAddMod_t *measObj;

  if (measConfig->measObjectToRemoveList != NULL) {
642 643
      for (i=0;i<measConfig->measObjectToRemoveList->list.count;i++) {
          ind   = *measConfig->measObjectToRemoveList->list.array[i];
Lionel Gauthier's avatar
 
Lionel Gauthier committed
644
          free(UE_rrc_inst[ue_mod_idP].MeasObj[eNB_index][ind-1]);
645
      }
646 647
  }
  if (measConfig->measObjectToAddModList != NULL) {
648 649 650 651 652
      LOG_D(RRC,"Measurement Object List is present\n");
      for (i=0;i<measConfig->measObjectToAddModList->list.count;i++) {
          measObj = measConfig->measObjectToAddModList->list.array[i];
          ind   = measConfig->measObjectToAddModList->list.array[i]->measObjectId;

Lionel Gauthier's avatar
 
Lionel Gauthier committed
653
          if (UE_rrc_inst[ue_mod_idP].MeasObj[eNB_index][ind-1]) {
654
              LOG_D(RRC,"Modifying measurement object %d\n",ind);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
655
              memcpy((char*)UE_rrc_inst[ue_mod_idP].MeasObj[eNB_index][ind-1],
656 657 658 659 660 661 662 663 664 665 666
                  (char*)measObj,
                  sizeof(MeasObjectToAddMod_t));
          }
          else {
              LOG_I(RRC,"Adding measurement object %d\n",ind);
              if (measObj->measObject.present == MeasObjectToAddMod__measObject_PR_measObjectEUTRA) {
                  LOG_I(RRC,"EUTRA Measurement : carrierFreq %d, allowedMeasBandwidth %d,presenceAntennaPort1 %d, neighCellConfig %d\n",
                      measObj->measObject.choice.measObjectEUTRA.carrierFreq,
                      measObj->measObject.choice.measObjectEUTRA.allowedMeasBandwidth,
                      measObj->measObject.choice.measObjectEUTRA.presenceAntennaPort1,
                      measObj->measObject.choice.measObjectEUTRA.neighCellConfig.buf[0]);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
667
                  UE_rrc_inst[ue_mod_idP].MeasObj[eNB_index][ind-1]=measObj;
668 669
              }
          }
670
      }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
671
      rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
672 673
          (RadioResourceConfigCommonSIB_t *)NULL,
          (struct PhysicalConfigDedicated *)NULL,
674 675 676 677
#ifdef Rel10
			 (SCellToAddMod_r10_t *)NULL,
	  //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
#endif
Lionel Gauthier's avatar
 
Lionel Gauthier committed
678
          UE_rrc_inst[ue_mod_idP].MeasObj[eNB_index],
679 680 681 682 683 684 685 686 687 688 689 690
          (MAC_MainConfig_t *)NULL,
          0,
          (struct LogicalChannelConfig *)NULL,
          (MeasGapConfig_t *)NULL,
          (TDD_Config_t *)NULL,
          (MobilityControlInfo_t *)NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL
691
#ifdef Rel10
692 693 694 695
          ,
          0,
          (MBSFN_AreaInfoList_r9_t *)NULL,
          (PMCH_InfoList_r9_t *)NULL
696 697
#endif
#ifdef CBA
698 699 700
          ,
          0,
          0
701
#endif
702
      );
703 704
  }
  if (measConfig->reportConfigToRemoveList != NULL) {
705 706
      for (i=0;i<measConfig->reportConfigToRemoveList->list.count;i++) {
          ind   = *measConfig->reportConfigToRemoveList->list.array[i];
Lionel Gauthier's avatar
 
Lionel Gauthier committed
707
          free(UE_rrc_inst[ue_mod_idP].ReportConfig[eNB_index][ind-1]);
708
      }
709 710
  }
  if (measConfig->reportConfigToAddModList != NULL) {
711 712 713
      LOG_I(RRC,"Report Configuration List is present\n");
      for (i=0;i<measConfig->reportConfigToAddModList->list.count;i++) {
          ind   = measConfig->reportConfigToAddModList->list.array[i]->reportConfigId;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
714
          if (UE_rrc_inst[ue_mod_idP].ReportConfig[eNB_index][ind-1]) {
715
              LOG_I(RRC,"Modifying Report Configuration %d\n",ind-1);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
716
              memcpy((char*)UE_rrc_inst[ue_mod_idP].ReportConfig[eNB_index][ind-1],
717 718 719 720 721
                  (char*)measConfig->reportConfigToAddModList->list.array[i],
                  sizeof(ReportConfigToAddMod_t));
          }
          else {
              LOG_D(RRC,"Adding Report Configuration %d %p \n",ind-1,measConfig->reportConfigToAddModList->list.array[i]);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
722
              UE_rrc_inst[ue_mod_idP].ReportConfig[eNB_index][ind-1] = measConfig->reportConfigToAddModList->list.array[i];
723
          }
724 725 726 727
      }
  }

  if (measConfig->quantityConfig != NULL) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
728
      if (UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index]) {
729
          LOG_D(RRC,"Modifying Quantity Configuration \n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
730
          memcpy((char*)UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index],
731 732 733 734 735
              (char*)measConfig->quantityConfig,
              sizeof(QuantityConfig_t));
      }
      else {
          LOG_D(RRC,"Adding Quantity configuration\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
736
          UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index] = measConfig->quantityConfig;
737
      }
738 739 740
  }

  if (measConfig->measIdToRemoveList != NULL) {
741 742
      for (i=0;i<measConfig->measIdToRemoveList->list.count;i++) {
          ind   = *measConfig->measIdToRemoveList->list.array[i];
Lionel Gauthier's avatar
 
Lionel Gauthier committed
743
          free(UE_rrc_inst[ue_mod_idP].MeasId[eNB_index][ind-1]);
744
      }
745 746 747
  }

  if (measConfig->measIdToAddModList != NULL) {
748 749
      for (i=0;i<measConfig->measIdToAddModList->list.count;i++) {
          ind   = measConfig->measIdToAddModList->list.array[i]->measId;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
750
          if (UE_rrc_inst[ue_mod_idP].MeasId[eNB_index][ind-1]) {
751
              LOG_D(RRC,"Modifying Measurement ID %d\n",ind-1);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
752
              memcpy((char*)UE_rrc_inst[ue_mod_idP].MeasId[eNB_index][ind-1],
753 754 755 756 757
                  (char*)measConfig->measIdToAddModList->list.array[i],
                  sizeof(MeasIdToAddMod_t));
          }
          else {
              LOG_D(RRC,"Adding Measurement ID %d %p\n",ind-1,measConfig->measIdToAddModList->list.array[i]);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
758
              UE_rrc_inst[ue_mod_idP].MeasId[eNB_index][ind-1] = measConfig->measIdToAddModList->list.array[i];
759
          }
760 761 762 763
      }
  }

  if (measConfig->measGapConfig !=NULL) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
764 765
      if (UE_rrc_inst[ue_mod_idP].measGapConfig[eNB_index]) {
          memcpy((char*)UE_rrc_inst[ue_mod_idP].measGapConfig[eNB_index],
766 767 768 769
              (char*)measConfig->measGapConfig,
              sizeof(MeasGapConfig_t));
      }
      else {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
770
          UE_rrc_inst[ue_mod_idP].measGapConfig[eNB_index] = measConfig->measGapConfig;
771
      }
772 773
  }

774
  if (measConfig->quantityConfig != NULL) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
775
      if (UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index]) {
776
          LOG_I(RRC,"Modifying Quantity Configuration \n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
777
          memcpy((char*)UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index],
778 779 780 781 782
              (char*)measConfig->quantityConfig,
              sizeof(QuantityConfig_t));
      }
      else {
          LOG_I(RRC,"Adding Quantity configuration\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
783
          UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index] = measConfig->quantityConfig;
784 785
      }

Lionel Gauthier's avatar
 
Lionel Gauthier committed
786 787
      UE_rrc_inst[ue_mod_idP].filter_coeff_rsrp = 1./pow(2,(*UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRP)/4);
      UE_rrc_inst[ue_mod_idP].filter_coeff_rsrq = 1./pow(2,(*UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRQ)/4);
788 789

      LOG_I(RRC,"[UE %d] set rsrp-coeff for eNB %d: %d rsrq-coeff: %d rsrp_factor: %f rsrq_factor: %f \n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
790 791 792 793 794
          ue_mod_idP, eNB_index, // UE_rrc_inst[ue_mod_idP].Info[eNB_index].UE_index,
          *UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRP,
          *UE_rrc_inst[ue_mod_idP].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRQ,
          UE_rrc_inst[ue_mod_idP].filter_coeff_rsrp, UE_rrc_inst[ue_mod_idP].filter_coeff_rsrp,
          UE_rrc_inst[ue_mod_idP].filter_coeff_rsrp, UE_rrc_inst[ue_mod_idP].filter_coeff_rsrq);
795 796
  }

797
  if (measConfig->s_Measure != NULL) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
798
      UE_rrc_inst[ue_mod_idP].s_measure = *measConfig->s_Measure;
799
  }
800

801
  if (measConfig->speedStatePars != NULL) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
802 803
      if (UE_rrc_inst[ue_mod_idP].speedStatePars)
        memcpy((char*)UE_rrc_inst[ue_mod_idP].speedStatePars,(char*)measConfig->speedStatePars,sizeof(struct MeasConfig__speedStatePars));
804
      else
Lionel Gauthier's avatar
 
Lionel Gauthier committed
805
        UE_rrc_inst[ue_mod_idP].speedStatePars = measConfig->speedStatePars;
806
      LOG_I(RRC,"[UE %d] Configuring mobility optimization params for UE %d \n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
807
          ue_mod_idP,UE_rrc_inst[ue_mod_idP].Info[0].UE_index);
808
  }
809 810
}

811
void    
Lionel Gauthier's avatar
 
Lionel Gauthier committed
812
rrc_ue_process_radioResourceConfigDedicated(module_id_t ue_mod_idP, frame_t frameP, uint8_t eNB_index,
813
    RadioResourceConfigDedicated_t *radioResourceConfigDedicated) {
814 815 816 817 818 819 820 821 822 823 824

  long SRB_id,DRB_id;
  int i,cnt;
  LogicalChannelConfig_t *SRB1_logicalChannelConfig,*SRB2_logicalChannelConfig;
#ifdef CBA  
  uint8_t cba_found = 0;
  uint16_t cba_RNTI;
#endif 

  // Save physicalConfigDedicated if present
  if (radioResourceConfigDedicated->physicalConfigDedicated) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
825 826
      if (UE_rrc_inst[ue_mod_idP].physicalConfigDedicated[eNB_index]) {
          memcpy((char*)UE_rrc_inst[ue_mod_idP].physicalConfigDedicated[eNB_index],(char*)radioResourceConfigDedicated->physicalConfigDedicated,
827
              sizeof(struct PhysicalConfigDedicated));
828

829 830
      }
      else {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
831
          UE_rrc_inst[ue_mod_idP].physicalConfigDedicated[eNB_index] = radioResourceConfigDedicated->physicalConfigDedicated;
832
      }
833 834 835
  }
  // Apply macMainConfig if present
  if (radioResourceConfigDedicated->mac_MainConfig) {
836
      if (radioResourceConfigDedicated->mac_MainConfig->present == RadioResourceConfigDedicated__mac_MainConfig_PR_explicitValue) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
837 838
          if (UE_rrc_inst[ue_mod_idP].mac_MainConfig[eNB_index]) {
              memcpy((char*)UE_rrc_inst[ue_mod_idP].mac_MainConfig[eNB_index],(char*)&radioResourceConfigDedicated->mac_MainConfig->choice.explicitValue,
839 840 841
                  sizeof(MAC_MainConfig_t));
          }
          else
Lionel Gauthier's avatar
 
Lionel Gauthier committed
842
            UE_rrc_inst[ue_mod_idP].mac_MainConfig[eNB_index] = &radioResourceConfigDedicated->mac_MainConfig->choice.explicitValue;
843 844 845 846 847
      }
  }

  // Apply spsConfig if present
  if (radioResourceConfigDedicated->sps_Config) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
848 849
      if (UE_rrc_inst[ue_mod_idP].sps_Config[eNB_index]) {
          memcpy(UE_rrc_inst[ue_mod_idP].sps_Config[eNB_index],radioResourceConfigDedicated->sps_Config,
850 851 852
              sizeof(struct SPS_Config));
      }
      else {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
853
          UE_rrc_inst[ue_mod_idP].sps_Config[eNB_index] = radioResourceConfigDedicated->sps_Config;
854
      }
855 856 857
  }
#ifdef CBA
  if (radioResourceConfigDedicated->cba_RNTI_vlola) {
858 859 860
      cba_RNTI = (uint16_t) (((radioResourceConfigDedicated->cba_RNTI_vlola->buf[1]&0xff) << 8) |
          (radioResourceConfigDedicated->cba_RNTI_vlola->buf[0]&0xff));
      for (i=0 ; i< NUM_MAX_CBA_GROUP; i++) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
861
          if (UE_rrc_inst[ue_mod_idP].cba_rnti[i] == cba_RNTI ) {
862 863
              cba_found=1;
              break;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
864
          } else if (UE_rrc_inst[ue_mod_idP].cba_rnti[i] == 0 )
865 866 867
            break;
      }
      if (cba_found==0) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
868 869
          UE_rrc_inst[ue_mod_idP].num_active_cba_groups++;
          UE_rrc_inst[ue_mod_idP].cba_rnti[i]=cba_RNTI;
870
          LOG_D(RRC, "[UE %d] Frame %d: radioResourceConfigDedicated reveived CBA_RNTI = %x for group %d from eNB %d \n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
871
              ue_mod_idP,frameP, UE_rrc_inst[ue_mod_idP].cba_rnti[i], i, eNB_index);
872
      }
873 874 875 876 877
  }
#endif 
  // Establish SRBs if present
  // loop through SRBToAddModList
  if (radioResourceConfigDedicated->srb_ToAddModList) {
878 879
      uint8_t *kRRCenc = NULL;
      uint8_t *kRRCint = NULL;
880 881

#if defined(ENABLE_SECURITY)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
882 883 884 885
      derive_key_rrc_enc(UE_rrc_inst[ue_mod_idP].ciphering_algorithm,
          UE_rrc_inst[ue_mod_idP].kenb, &kRRCenc);
      derive_key_rrc_int(UE_rrc_inst[ue_mod_idP].integrity_algorithm,
          UE_rrc_inst[ue_mod_idP].kenb, &kRRCint);
886
#endif
887 888

// Refresh SRBs
Lionel Gauthier's avatar
 
Lionel Gauthier committed
889
      rrc_pdcp_config_asn1_req(eNB_index,ue_mod_idP,frameP,0,
890 891 892
          radioResourceConfigDedicated->srb_ToAddModList,
          (DRB_ToAddModList_t*)NULL,
          (DRB_ToReleaseList_t*)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
893 894
          UE_rrc_inst[ue_mod_idP].ciphering_algorithm |
          (UE_rrc_inst[ue_mod_idP].integrity_algorithm << 4),
895 896 897
          kRRCenc,
          kRRCint,
          NULL
898
#ifdef Rel10
899
,(PMCH_InfoList_r9_t *)NULL
900
#endif
901
      );
902

903
      // Refresh SRBs
Lionel Gauthier's avatar
 
Lionel Gauthier committed
904
      rrc_rlc_config_asn1_req(eNB_index,ue_mod_idP,frameP,0,
905 906 907
          radioResourceConfigDedicated->srb_ToAddModList,
          (DRB_ToAddModList_t*)NULL,
          (DRB_ToReleaseList_t*)NULL
908
#ifdef Rel10
909
          ,(PMCH_InfoList_r9_t *)NULL
910
#endif
911
      );
912

913 914 915 916 917
#ifdef ENABLE_RAL
	// first msg that includes srb config	
	UE_rrc_inst[ue_mod_idP].num_srb=radioResourceConfigDedicated->srb_ToAddModList->list.count;
#endif 

918
      for (cnt=0;cnt<radioResourceConfigDedicated->srb_ToAddModList->list.count;cnt++) {
919
	//	connection_reestablishment_ind.num_srb+=1;
920
          SRB_id = radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt]->srb_Identity;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
921
          LOG_D(RRC,"[UE %d]: Frame %d SRB config cnt %d (SRB%ld)\n",ue_mod_idP,frameP,cnt,SRB_id);
922
          if (SRB_id == 1) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
923 924
              if (UE_rrc_inst[ue_mod_idP].SRB1_config[eNB_index]) {
                  memcpy(UE_rrc_inst[ue_mod_idP].SRB1_config[eNB_index],radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt],
925 926 927
                      sizeof(struct SRB_ToAddMod));
              }
              else {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
928
                  UE_rrc_inst[ue_mod_idP].SRB1_config[eNB_index] = radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt];
929

Lionel Gauthier's avatar
 
Lionel Gauthier committed
930 931 932 933
                  rrc_ue_establish_srb1(ue_mod_idP,frameP,eNB_index,radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt]);
                  if (UE_rrc_inst[ue_mod_idP].SRB1_config[eNB_index]->logicalChannelConfig) {
                      if (UE_rrc_inst[ue_mod_idP].SRB1_config[eNB_index]->logicalChannelConfig->present == SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) {
                          SRB1_logicalChannelConfig = &UE_rrc_inst[ue_mod_idP].SRB1_config[eNB_index]->logicalChannelConfig->choice.explicitValue;
934 935 936 937 938 939 940 941
                      }
                      else {
                          SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue;
                      }
                  }
                  else {
                      SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue;
                  }
942

943
                  LOG_D(RRC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ  (SRB1 eNB %d) --->][MAC_UE][MOD %02d][]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
944 945
                      frameP, ue_mod_idP, eNB_index, ue_mod_idP);
                  rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
946
                      (RadioResourceConfigCommonSIB_t *)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
947
                      UE_rrc_inst[ue_mod_idP].physicalConfigDedicated[eNB_index],
948 949 950 951
#ifdef Rel10
				     (SCellToAddMod_r10_t *)NULL,
		       //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
#endif
952
                      (MeasObjectToAddMod_t **)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
953
                      UE_rrc_inst[ue_mod_idP].mac_MainConfig[eNB_index],
954 955 956 957 958 959 960 961 962 963 964
                      1,
                      SRB1_logicalChannelConfig,
                      (MeasGapConfig_t *)NULL,
                      NULL,
                      NULL,
                      NULL,
                      NULL,
                      NULL,
                      NULL,
                      NULL,
                      NULL
965
#ifdef Rel10	       
966 967 968 969
                      ,
                      0,
                      (MBSFN_AreaInfoList_r9_t *)NULL,
                      (PMCH_InfoList_r9_t *)NULL
970 971
#endif
#ifdef CBA
972 973 974
                      ,
                      0,
                      0
975
#endif
976 977
                  );
              }
978 979
          }
          else {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
980 981
              if (UE_rrc_inst[ue_mod_idP].SRB2_config[eNB_index]) {
                  memcpy(UE_rrc_inst[ue_mod_idP].SRB2_config[eNB_index],radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt],
982 983 984
                      sizeof(struct SRB_ToAddMod));
              }
              else {
985

Lionel Gauthier's avatar
 
Lionel Gauthier committed
986
                  UE_rrc_inst[ue_mod_idP].SRB2_config[eNB_index] = radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt];
987

Lionel Gauthier's avatar
 
Lionel Gauthier committed
988 989 990
                  rrc_ue_establish_srb2(ue_mod_idP,frameP,eNB_index,radioResourceConfigDedicated->srb_ToAddModList->list.array[cnt]);
                  if (UE_rrc_inst[ue_mod_idP].SRB2_config[eNB_index]->logicalChannelConfig) {
                      if (UE_rrc_inst[ue_mod_idP].SRB2_config[eNB_index]->logicalChannelConfig->present == SRB_ToAddMod__logicalChannelConfig_PR_explicitValue){
991
                          LOG_I(RRC,"Applying Explicit SRB2 logicalChannelConfig\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
992
                          SRB2_logicalChannelConfig = &UE_rrc_inst[ue_mod_idP].SRB2_config[eNB_index]->logicalChannelConfig->choice.explicitValue;
993 994 995 996 997 998 999 1000 1001 1002 1003
                      }
                      else {
                          LOG_I(RRC,"Applying default SRB2 logicalChannelConfig\n");
                          SRB2_logicalChannelConfig = &SRB2_logicalChannelConfig_defaultValue;
                      }
                  }
                  else {
                      SRB2_logicalChannelConfig = &SRB2_logicalChannelConfig_defaultValue;
                  }

                  LOG_D(RRC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ  (SRB2 eNB %d) --->][MAC_UE][MOD %02d][]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1004 1005
                      frameP, ue_mod_idP, eNB_index, ue_mod_idP);
                  rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
1006
                      (RadioResourceConfigCommonSIB_t *)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1007
                      UE_rrc_inst[ue_mod_idP].physicalConfigDedicated[eNB_index],
1008 1009 1010 1011
#ifdef Rel10
				     (SCellToAddMod_r10_t *)NULL,
		       //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
#endif
1012
                      (MeasObjectToAddMod_t **)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1013
                      UE_rrc_inst[ue_mod_idP].mac_MainConfig[eNB_index],
1014 1015
                      2,
                      SRB2_logicalChannelConfig,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1016
                      UE_rrc_inst[ue_mod_idP].measGapConfig[eNB_index],
1017 1018 1019 1020 1021 1022 1023 1024
                      (TDD_Config_t *)NULL,
                      (MobilityControlInfo_t *)NULL,
                      NULL,
                      NULL,
                      NULL,
                      NULL,
                      NULL,
                      NULL
1025
#ifdef Rel10
1026 1027 1028 1029
,
0,
(MBSFN_AreaInfoList_r9_t *)NULL,
(PMCH_InfoList_r9_t *)NULL
1030 1031
#endif
#ifdef CBA
1032 1033 1034
,
0,
0
1035
#endif
1036 1037 1038
                  );
              }
          }
1039 1040 1041 1042 1043
      }
  }

  // Establish DRBs if present
  if (radioResourceConfigDedicated->drb_ToAddModList) {
1044
      uint8_t *kUPenc = NULL;
1045 1046

#if defined(ENABLE_SECURITY)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1047 1048
      derive_key_up_enc(UE_rrc_inst[ue_mod_idP].integrity_algorithm,
          UE_rrc_inst[ue_mod_idP].kenb, &kUPenc);
1049 1050 1051
#endif

      // Refresh DRBs
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1052
      rrc_pdcp_config_asn1_req(eNB_index, ue_mod_idP,frameP,0,
1053 1054 1055
          (SRB_ToAddModList_t*)NULL,
          radioResourceConfigDedicated->drb_ToAddModList,
          (DRB_ToReleaseList_t*)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1056 1057
          UE_rrc_inst[ue_mod_idP].ciphering_algorithm |
          (UE_rrc_inst[ue_mod_idP].integrity_algorithm << 4),
1058 1059 1060
          NULL,
          NULL,
          kUPenc
1061
#ifdef Rel10
1062
,(PMCH_InfoList_r9_t *)NULL
1063
#endif
1064
      );
1065

1066
      // Refresh DRBs
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1067
      rrc_rlc_config_asn1_req(eNB_index,ue_mod_idP,frameP,0,
1068 1069 1070
          (SRB_ToAddModList_t*)NULL,
          radioResourceConfigDedicated->drb_ToAddModList,
          (DRB_ToReleaseList_t*)NULL
1071
#ifdef Rel10
1072 1073 1074 1075 1076
          ,(PMCH_InfoList_r9_t *)NULL
#endif
      );
      for (i=0;i<radioResourceConfigDedicated->drb_ToAddModList->list.count;i++) {
          DRB_id   = radioResourceConfigDedicated->drb_ToAddModList->list.array[i]->drb_Identity-1;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1077 1078
          if (UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index][DRB_id]) {
              memcpy(UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index][DRB_id],radioResourceConfigDedicated->drb_ToAddModList->list.array[i],
1079 1080 1081
                  sizeof(struct DRB_ToAddMod));
          }
          else {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1082
              UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index][DRB_id] = radioResourceConfigDedicated->drb_ToAddModList->list.array[i];
1083

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1084
              rrc_ue_establish_drb(ue_mod_idP,frameP,eNB_index,radioResourceConfigDedicated->drb_ToAddModList->list.array[i]);
1085 1086
              // MAC/PHY Configuration
              LOG_D(RRC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB %d eNB %d) --->][MAC_UE][MOD %02d][]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1087 1088
                  frameP, ue_mod_idP, radioResourceConfigDedicated->drb_ToAddModList->list.array[i]->drb_Identity, eNB_index, ue_mod_idP);
              rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
1089
                  (RadioResourceConfigCommonSIB_t *)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1090
                  UE_rrc_inst[ue_mod_idP].physicalConfigDedicated[eNB_index],
1091 1092 1093 1094
#ifdef Rel10
				 (SCellToAddMod_r10_t *)NULL,
		       //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
#endif
1095
                  (MeasObjectToAddMod_t **)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1096 1097 1098 1099
                  UE_rrc_inst[ue_mod_idP].mac_MainConfig[eNB_index],
                  *UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index][DRB_id]->logicalChannelIdentity,
                  UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index][DRB_id]->logicalChannelConfig,
                  UE_rrc_inst[ue_mod_idP].measGapConfig[eNB_index],
1100 1101 1102 1103 1104 1105 1106 1107
                  (TDD_Config_t*)NULL,
                  (MobilityControlInfo_t *)NULL,
                  NULL,
                  NULL,
                  NULL,
                  NULL,
                  NULL,
                  NULL
1108
#ifdef Rel10
1109 1110 1111 1112
,
0,
(MBSFN_AreaInfoList_r9_t *)NULL,
(PMCH_InfoList_r9_t *)NULL
1113 1114
#endif
#ifdef CBA
1115
,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1116 1117
UE_rrc_inst[ue_mod_idP].num_active_cba_groups, //
UE_rrc_inst[ue_mod_idP].cba_rnti[0]
1118
#endif
1119
              );
1120

1121
          }
1122 1123 1124
      }
  }

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1125 1126
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].State = RRC_CONNECTED;
  LOG_I(RRC,"[UE %d] State = RRC_CONNECTED (eNB %d)\n",ue_mod_idP,eNB_index);
1127 1128 1129 1130


}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1131
void rrc_ue_process_securityModeCommand(uint8_t ue_mod_idP, frame_t frameP,SecurityModeCommand_t *securityModeCommand,uint8_t eNB_index) {
1132 1133 1134 1135 1136 1137 1138

  asn_enc_rval_t enc_rval;

  UL_DCCH_Message_t ul_dcch_msg;
  // SecurityModeCommand_t SecurityModeCommand;
  uint8_t buffer[200];
  int i, securityMode;
1139

1140
  LOG_I(RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), Processing securityModeCommand (eNB %d)\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1141
      ue_mod_idP,frameP,eNB_index);
1142 1143 1144

  switch (securityModeCommand->criticalExtensions.choice.c1.choice.securityModeCommand_r8.securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm){
  case SecurityAlgorithmConfig__cipheringAlgorithm_eea0:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1145
    LOG_I(RRC,"[UE %d] Security algorithm is set to eea0\n",ue_mod_idP);
1146 1147 1148
    securityMode= SecurityAlgorithmConfig__cipheringAlgorithm_eea0;
    break;
  case SecurityAlgorithmConfig__cipheringAlgorithm_eea1:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1149
    LOG_I(RRC,"[UE %d] Security algorithm is set to eea1\n",ue_mod_idP);
1150 1151 1152
    securityMode= SecurityAlgorithmConfig__cipheringAlgorithm_eea1;
    break;
  case SecurityAlgorithmConfig__cipheringAlgorithm_eea2:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1153
    LOG_I(RRC,"[UE %d] Security algorithm is set to eea2\n",ue_mod_idP);
1154 1155 1156
    securityMode = SecurityAlgorithmConfig__cipheringAlgorithm_eea2;
    break;
  default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1157
    LOG_I(RRC,"[UE %d] Security algorithm is set to none\n",ue_mod_idP);
1158 1159 1160 1161 1162
    securityMode = SecurityAlgorithmConfig__cipheringAlgorithm_spare1;
    break;
  }
  switch (securityModeCommand->criticalExtensions.choice.c1.choice.securityModeCommand_r8.securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm){
  case SecurityAlgorithmConfig__integrityProtAlgorithm_eia1:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1163
    LOG_I(RRC,"[UE %d] Integrity protection algorithm is set to eia1\n",ue_mod_idP);
1164 1165 1166
    securityMode |= 1 << 5;
    break;
  case SecurityAlgorithmConfig__integrityProtAlgorithm_eia2:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1167
    LOG_I(RRC,"[UE %d] Integrity protection algorithm is set to eia2\n",ue_mod_idP);
1168 1169 1170
    securityMode |= 1 << 6;
    break;
  default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1171
    LOG_I(RRC,"[UE %d] Integrity protection algorithm is set to none\n",ue_mod_idP);
1172 1173 1174
    securityMode |= 0x70 ;
    break;
  }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1175
  LOG_D(RRC,"[UE %d] security mode is %x \n",ue_mod_idP, securityMode);
1176 1177

  /* Store the parameters received */
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1178 1179
  UE_rrc_inst[ue_mod_idP].ciphering_algorithm = securityModeCommand->criticalExtensions.choice.c1.choice.securityModeCommand_r8.securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm;
  UE_rrc_inst[ue_mod_idP].integrity_algorithm = securityModeCommand->criticalExtensions.choice.c1.choice.securityModeCommand_r8.securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm;
1180

1181 1182 1183 1184 1185 1186 1187 1188
  memset((void *)&ul_dcch_msg,0,sizeof(UL_DCCH_Message_t));
  //memset((void *)&SecurityModeCommand,0,sizeof(SecurityModeCommand_t));

  ul_dcch_msg.message.present           = UL_DCCH_MessageType_PR_c1;
  if (securityMode >= NO_SECURITY_MODE)
    ul_dcch_msg.message.choice.c1.present = UL_DCCH_MessageType__c1_PR_securityModeComplete;
  else 
    ul_dcch_msg.message.choice.c1.present = UL_DCCH_MessageType__c1_PR_securityModeFailure;
1189

1190
  if (securityModeCommand->criticalExtensions.present == SecurityModeCommand__criticalExtensions_PR_c1) {
1191 1192 1193 1194 1195 1196 1197
      if (securityModeCommand->criticalExtensions.choice.c1.present == SecurityModeCommand__criticalExtensions__c1_PR_securityModeCommand_r8) {

          ul_dcch_msg.message.choice.c1.choice.securityModeComplete.rrc_TransactionIdentifier = securityModeCommand->rrc_TransactionIdentifier;
          ul_dcch_msg.message.choice.c1.choice.securityModeComplete.criticalExtensions.present = SecurityModeCommand__criticalExtensions_PR_c1;
          ul_dcch_msg.message.choice.c1.choice.securityModeComplete.criticalExtensions.choice.securityModeComplete_r8.nonCriticalExtension =NULL;

          LOG_I(RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), encoding securityModeComplete (eNB %d)\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1198
              ue_mod_idP,frameP,eNB_index);
1199 1200 1201 1202 1203

          enc_rval = uper_encode_to_buffer(&asn_DEF_UL_DCCH_Message,
              (void*)&ul_dcch_msg,
              buffer,
              100);
thomasl's avatar
thomasl committed
1204
          AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
1205
              enc_rval.failed_type->name, enc_rval.encoded);
1206 1207

#ifdef XER_PRINT
1208
          xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg);
1209 1210
#endif	  

1211 1212
#if defined(ENABLE_ITTI)
# if !defined(DISABLE_XER_SPRINT)
1213 1214 1215
          {
            char        message_string[20000];
            size_t      message_string_size;
1216

1217 1218 1219
            if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_DCCH_Message, (void *) &ul_dcch_msg)) > 0)
              {
                MessageDef *msg_p;
1220

1221 1222 1223
                msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_UL_DCCH, message_string_size + sizeof (IttiMsgText));
                msg_p->ittiMsg.rrc_ul_dcch.size = message_string_size;
                memcpy(&msg_p->ittiMsg.rrc_ul_dcch.text, message_string, message_string_size);
1224

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1225
                itti_send_msg_to_task(TASK_UNKNOWN, NB_eNB_INST + ue_mod_idP, msg_p);
1226 1227
              }
          }
1228 1229 1230
# endif
#endif

1231
#ifdef USER_MODE
1232
          LOG_D(RRC, "securityModeComplete Encoded %d bits (%d bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8);
1233
#endif
1234 1235 1236
          for (i = 0; i < (enc_rval.encoded + 7) / 8; i++)
            LOG_T(RRC, "%02x.", buffer[i]);
          LOG_T(RRC, "\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1237
          pdcp_rrc_data_req (eNB_index, ue_mod_idP, frameP, 0, DCCH, rrc_mui++, 0, (enc_rval.encoded + 7) / 8, buffer, 1);
1238
      }
1239
  }
1240

1241
}
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1242
void rrc_ue_process_ueCapabilityEnquiry(uint8_t ue_mod_idP, frame_t frameP,UECapabilityEnquiry_t *UECapabilityEnquiry,uint8_t eNB_index) {
1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254

  asn_enc_rval_t enc_rval;

  UL_DCCH_Message_t ul_dcch_msg;


  UE_CapabilityRAT_Container_t ue_CapabilityRAT_Container;

  uint8_t buffer[200];
  int i;

  LOG_I(RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), Processing UECapabilityEnquiry (eNB %d)\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1255
      ue_mod_idP,frameP,eNB_index);
1256 1257 1258 1259 1260 1261 1262


  memset((void *)&ul_dcch_msg,0,sizeof(UL_DCCH_Message_t));
  memset((void *)&ue_CapabilityRAT_Container,0,sizeof(UE_CapabilityRAT_Container_t));

  ul_dcch_msg.message.present           = UL_DCCH_MessageType_PR_c1;
  ul_dcch_msg.message.choice.c1.present = UL_DCCH_MessageType__c1_PR_ueCapabilityInformation;
1263
  ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.rrc_TransactionIdentifier = UECapabilityEnquiry->rrc_TransactionIdentifier;
1264 1265 1266

  ue_CapabilityRAT_Container.rat_Type = RAT_Type_eutra;
  OCTET_STRING_fromBuf(&ue_CapabilityRAT_Container.ueCapabilityRAT_Container,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1267 1268 1269 1270
      (const char*)UE_rrc_inst[ue_mod_idP].UECapability,
      UE_rrc_inst[ue_mod_idP].UECapability_size);
  //  ue_CapabilityRAT_Container.ueCapabilityRAT_Container.buf  = UE_rrc_inst[ue_mod_idP].UECapability;
  // ue_CapabilityRAT_Container.ueCapabilityRAT_Container.size = UE_rrc_inst[ue_mod_idP].UECapability_size;
1271

1272 1273

  if (UECapabilityEnquiry->criticalExtensions.present == UECapabilityEnquiry__criticalExtensions_PR_c1) {
1274 1275 1276 1277
      if (UECapabilityEnquiry->criticalExtensions.choice.c1.present == UECapabilityEnquiry__criticalExtensions__c1_PR_ueCapabilityEnquiry_r8) {
          ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.present           = UECapabilityInformation__criticalExtensions_PR_c1;
          ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.present = UECapabilityInformation__criticalExtensions__c1_PR_ueCapabilityInformation_r8;
          ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.count=0;
1278

1279
          for (i=0;i<UECapabilityEnquiry->criticalExtensions.choice.c1.choice.ueCapabilityEnquiry_r8.ue_CapabilityRequest.list.count;i++) {
1280

1281 1282 1283 1284 1285
              if (*UECapabilityEnquiry->criticalExtensions.choice.c1.choice.ueCapabilityEnquiry_r8.ue_CapabilityRequest.list.array[i]
                                                                                                                                   == RAT_Type_eutra) {
                  ASN_SEQUENCE_ADD(
                      &ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list,
                      &ue_CapabilityRAT_Container);
1286

1287
                  enc_rval = uper_encode_to_buffer(&asn_DEF_UL_DCCH_Message, (void*) &ul_dcch_msg, buffer, 100);
thomasl's avatar
thomasl committed
1288
                  AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
1289
                      enc_rval.failed_type->name, enc_rval.encoded);
1290 1291

#ifdef XER_PRINT
1292
                  xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg);
1293
#endif
1294

1295 1296
#if defined(ENABLE_ITTI)
# if !defined(DISABLE_XER_SPRINT)
1297 1298 1299
                  {
                    char        message_string[20000];
                    size_t      message_string_size;
1300

1301 1302 1303
                    if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_DCCH_Message, (void *) &ul_dcch_msg)) > 0)
                      {
                        MessageDef *msg_p;
1304

1305 1306 1307
                        msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_UL_DCCH, message_string_size + sizeof (IttiMsgText));
                        msg_p->ittiMsg.rrc_ul_dcch.size = message_string_size;
                        memcpy(&msg_p->ittiMsg.rrc_ul_dcch.text, message_string, message_string_size);
1308

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1309
                        itti_send_msg_to_task(TASK_UNKNOWN, NB_eNB_INST + ue_mod_idP, msg_p);
1310 1311
                      }
                  }
1312 1313 1314
# endif
#endif

1315
#ifdef USER_MODE
1316
                  LOG_D(RRC,"UECapabilityInformation Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
1317
#endif
1318 1319 1320
                  for (i = 0; i < (enc_rval.encoded + 7) / 8; i++)
                    LOG_T(RRC, "%02x.", buffer[i]);
                  LOG_T(RRC, "\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1321
                  pdcp_rrc_data_req (eNB_index, ue_mod_idP, frameP, 0, DCCH, rrc_mui++, 0, (enc_rval.encoded + 7) / 8, buffer, 1);
1322 1323
              }
          }
1324 1325 1326 1327
      }
  }
}

1328

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1329
void rrc_ue_process_rrcConnectionReconfiguration(module_id_t ue_mod_idP, frame_t frameP,
1330
    RRCConnectionReconfiguration_t *rrcConnectionReconfiguration,
1331
    uint8_t eNB_index) {
1332

1333
  LOG_I(RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), Processing RRCConnectionReconfiguration (eNB %d)\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1334
      ue_mod_idP,frameP,eNB_index);
1335 1336 1337 1338
  if (rrcConnectionReconfiguration->criticalExtensions.present == RRCConnectionReconfiguration__criticalExtensions_PR_c1) {
      if (rrcConnectionReconfiguration->criticalExtensions.choice.c1.present ==
          RRCConnectionReconfiguration__criticalExtensions__c1_PR_rrcConnectionReconfiguration_r8) {
          RRCConnectionReconfiguration_r8_IEs_t *rrcConnectionReconfiguration_r8 = &rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8;
Lionel Gauthier's avatar
Lionel Gauthier committed
1339

1340 1341
          if (rrcConnectionReconfiguration_r8->mobilityControlInfo) {
              LOG_I(RRC,"Mobility Control Information is present\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1342
              rrc_ue_process_mobilityControlInfo(ue_mod_idP, eNB_index, frameP, rrcConnectionReconfiguration_r8->mobilityControlInfo);
1343 1344 1345
          }
          if (rrcConnectionReconfiguration_r8->measConfig != NULL) {
              LOG_I(RRC,"Measurement Configuration is present\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1346
              rrc_ue_process_measConfig(ue_mod_idP,frameP, eNB_index,
1347 1348 1349 1350
                  rrcConnectionReconfiguration_r8->measConfig);
          }
          if (rrcConnectionReconfiguration_r8->radioResourceConfigDedicated) {
              LOG_I(RRC,"Radio Resource Configuration is present\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1351
              rrc_ue_process_radioResourceConfigDedicated(ue_mod_idP,frameP,eNB_index, rrcConnectionReconfiguration_r8->radioResourceConfigDedicated);
1352
          }
1353 1354

#if defined(ENABLE_ITTI)
1355 1356 1357 1358 1359 1360
          /* Check if there is dedicated NAS information to forward to NAS */
          if (rrcConnectionReconfiguration_r8->dedicatedInfoNASList != NULL) {
              int list_count;
              uint32_t pdu_length;
              uint8_t *pdu_buffer;
              MessageDef *msg_p;
1361

1362 1363 1364
              for (list_count = 0; list_count < rrcConnectionReconfiguration_r8->dedicatedInfoNASList->list.count; list_count++) {
                  pdu_length = rrcConnectionReconfiguration_r8->dedicatedInfoNASList->list.array[list_count]->size;
                  pdu_buffer = rrcConnectionReconfiguration_r8->dedicatedInfoNASList->list.array[list_count]->buf;
1365

1366 1367 1368 1369
                  msg_p = itti_alloc_new_message(TASK_RRC_UE, NAS_CONN_ESTABLI_CNF);
                  NAS_CONN_ESTABLI_CNF(msg_p).errCode = AS_SUCCESS;
                  NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length = pdu_length;
                  NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.data = pdu_buffer;
1370

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1371
                  itti_send_msg_to_task(TASK_NAS_UE, ue_mod_idP, msg_p);
1372
              }
1373

1374 1375
              free (rrcConnectionReconfiguration_r8->dedicatedInfoNASList);
          }
1376
#ifdef ENABLE_RAL
1377 1378 1379 1380 1381 1382 1383 1384
          {
            MessageDef                                 *message_ral_p = NULL;
            rrc_ral_connection_reestablishment_ind_t    connection_reestablishment_ind;
            int                                         i;

            message_ral_p = itti_alloc_new_message (TASK_RRC_UE, RRC_RAL_CONNECTION_REESTABLISHMENT_IND);
            memset(&connection_reestablishment_ind, 0, sizeof(rrc_ral_connection_reestablishment_ind_t));
            // TO DO ral_si_ind.plmn_id        = 0;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1385
            connection_reestablishment_ind.ue_id            = ue_mod_idP;
1386 1387 1388 1389 1390 1391
            if (rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList != NULL) {
                connection_reestablishment_ind.num_drb      = rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.count;

                for (i=0;(i<rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.count) && (i < maxDRB);i++) {
                    // why minus 1 in RRC code for drb_identity ?
                    connection_reestablishment_ind.drb_id[i]   = rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.array[i]->drb_Identity;
Lionel Gauthier's avatar
Lionel Gauthier committed
1392
                }
1393 1394
            } else {
                connection_reestablishment_ind.num_drb      = 0;
Lionel Gauthier's avatar
Lionel Gauthier committed
1395
            }
1396
            if (rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->srb_ToAddModList != NULL) {
1397 1398
                connection_reestablishment_ind.num_srb      = rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->srb_ToAddModList->list.count + UE_rrc_inst[ue_mod_idP].num_srb;
		
1399
            } else {
1400
 	              connection_reestablishment_ind.num_srb      += UE_rrc_inst[ue_mod_idP].num_srb;
1401
            }
1402 1403 1404
	   if (connection_reestablishment_ind.num_srb > 2) // fixme: only 2 srbs can exist, adjust the value
		connection_reestablishment_ind.num_srb =2;
		
1405
            memcpy (&message_ral_p->ittiMsg, (void *) &connection_reestablishment_ind, sizeof(rrc_ral_connection_reestablishment_ind_t));
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1406
            //#warning "ue_mod_idP ? for instance ? => YES"
1407
            LOG_I(RRC, "Sending RRC_RAL_CONNECTION_REESTABLISHMENT_IND to mRAL\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1408
            itti_send_msg_to_task (TASK_RAL_UE, ue_mod_idP + NB_eNB_INST, message_ral_p);
1409
          }
Lionel Gauthier's avatar
Lionel Gauthier committed
1410
#endif
1411
#endif
1412 1413
      } // c1 present
  } // critical extensions present
1414 1415
}

1416
/* 36.331, 5.3.5.4      Reception of an RRCConnectionReconfiguration including the mobilityControlInfo by the UE (handover) */
1417
void rrc_ue_process_mobilityControlInfo(uint8_t eNB_index, uint8_t UE_id, frame_t frameP, struct MobilityControlInfo *mobilityControlInfo)
1418
{
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1419
  module_id_t ue_mod_idP = UE_id;
1420
  /*
1421 1422
  DRB_ToReleaseList_t*  drb2release_list;
  DRB_Identity_t *lcid;
1423
   */
1424
  LOG_N(RRC,"Note: This function needs some updates\n");
1425 1426 1427 1428
  if(UE_rrc_inst[UE_id].Info[eNB_index].T310_active == 1)
    UE_rrc_inst[UE_id].Info[eNB_index].T310_active = 0;
  UE_rrc_inst[UE_id].Info[eNB_index].T304_active = 1;
  UE_rrc_inst[UE_id].Info[eNB_index].T304_cnt = T304[mobilityControlInfo->t304];
1429

1430
  /*
1431 1432 1433
  drb2release_list = CALLOC (1, sizeof (*drb2release_list));
  lcid= CALLOC (1, sizeof (DRB_Identity_t)); // long
  for (*lcid=0;*lcid<NB_RB_MAX;*lcid++)
1434
  {
1435
    ASN_SEQUENCE_ADD (&(drb2release_list)->list,lcid);
1436
  }
1437
   */
1438 1439

  //Removing SRB1 and SRB2 and DRB0
1440
  LOG_N(RRC,"[UE %d] : Update needed for rrc_pdcp_config_req (deprecated) and rrc_rlc_config_req commands(deprecated)\n", UE_id);
1441 1442
  rrc_pdcp_config_req (eNB_index, UE_id, frameP, ENB_FLAG_NO, SRB_FLAG_YES, CONFIG_ACTION_REMOVE, DCCH,UNDEF_SECURITY_MODE);
  rrc_rlc_config_req(eNB_index, ue_mod_idP,frameP,ENB_FLAG_NO, SRB_FLAG_YES, MBMS_FLAG_NO, CONFIG_ACTION_REMOVE,ue_mod_idP+DCCH,Rlc_info_am_config);
1443

1444 1445
  rrc_pdcp_config_req (eNB_index, UE_id, frameP, ENB_FLAG_NO, SRB_FLAG_YES, CONFIG_ACTION_REMOVE, DCCH1,UNDEF_SECURITY_MODE);
  rrc_rlc_config_req(eNB_index, ue_mod_idP,frameP,ENB_FLAG_NO, SRB_FLAG_YES,CONFIG_ACTION_REMOVE, MBMS_FLAG_NO,ue_mod_idP+DCCH1,Rlc_info_am_config);
1446

1447 1448
  rrc_pdcp_config_req (eNB_index, UE_id, frameP, ENB_FLAG_NO, SRB_FLAG_NO, CONFIG_ACTION_REMOVE, DTCH,UNDEF_SECURITY_MODE);
  rrc_rlc_config_req(eNB_index, ue_mod_idP,frameP,ENB_FLAG_NO, SRB_FLAG_NO,CONFIG_ACTION_REMOVE, MBMS_FLAG_NO,ue_mod_idP+DTCH,Rlc_info_um);
1449
  /*
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1450
  rrc_pdcp_config_asn1_req(NB_eNB_INST+ue_mod_idP,frameP, 0,eNB_index,
1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461
			   NULL, // SRB_ToAddModList
			   NULL, // DRB_ToAddModList
			   drb2release_list,
			   0, // security mode
			   NULL, // key rrc encryption
			   NULL, // key rrc integrity
			   NULL // key encryption
#ifdef Rel10
			   ,NULL
#endif
			   );
1462

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1463
  rrc_rlc_config_asn1_req(NB_eNB_INST+ue_mod_idP, frameP,0,eNB_index,
1464 1465 1466 1467 1468 1469 1470 1471
			  NULL,// SRB_ToAddModList
			  NULL,// DRB_ToAddModList
			  drb2release_list // DRB_ToReleaseList
#ifdef Rel10
			  ,NULL
#endif 
			  );
   */
1472

1473 1474 1475 1476

  //A little cleanup at RRC...
  //Copying current queue config to free RRC index
  /*
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1477 1478 1479
    memcpy((void *)UE_rrc_inst[ue_mod_idP].SRB1_config[~(7<<eNB_index)],(void *)UE_rrc_inst[ue_mod_idP].SRB1_config[7<<eNB_index],sizeof(SRB_ToAddMod_t));
    memcpy((void *)UE_rrc_inst[ue_mod_idP].SRB2_config[~(7<<eNB_index)],(void *)UE_rrc_inst[ue_mod_idP].SRB2_config[7<<eNB_index],sizeof(SRB_ToAddMod_t));
    memcpy((void *)UE_rrc_inst[ue_mod_idP].DRB_config[~(7<<eNB_index)][0],(void *)UE_rrc_inst[ue_mod_idP].DRB_config[7<<eNB_index][0],sizeof(DRB_ToAddMod_t));
1480
   */
1481 1482
  /*
  LOG_N(RRC,"Not sure if Freeing the current queue config works properly: Fix me\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1483 1484 1485
  free((void *)&UE_rrc_inst[ue_mod_idP].SRB1_config[eNB_index]);
  free((void *)&UE_rrc_inst[ue_mod_idP].SRB2_config[eNB_index]);
  free((void *)&UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index][0]);
1486

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1487 1488 1489
  UE_rrc_inst[ue_mod_idP].SRB1_config[eNB_index] = NULL;
  UE_rrc_inst[ue_mod_idP].SRB2_config[eNB_index] = NULL;
  UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index][0] = NULL;
1490
   */
1491 1492
  //Synchronisation to DL of target cell
  LOG_D(RRC,"HO: Reset PDCP and RLC for configured RBs.. \n[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ  (SRB2 eNB %d) --->][MAC_UE][MOD %02d][]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1493
      frameP, ue_mod_idP, eNB_index, ue_mod_idP);
1494 1495

  // Reset MAC and configure PHY
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1496
  rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
1497 1498
      (RadioResourceConfigCommonSIB_t *)NULL,
      (struct PhysicalConfigDedicated *)NULL,
1499 1500 1501 1502
#ifdef Rel10
	(SCellToAddMod_r10_t *)NULL,
	//(struct PhysicalConfigDedicatedSCell_r10 *)NULL,
#endif
1503 1504 1505 1506 1507 1508 1509
      (MeasObjectToAddMod_t **)NULL,
      (MAC_MainConfig_t *)NULL,
      0,
      (struct LogicalChannelConfig *)NULL,
      (MeasGapConfig_t *)NULL,
      (TDD_Config_t *)NULL,
      mobilityControlInfo,
1510 1511
      (uint8_t *)NULL,
      (uint16_t *)NULL,
1512 1513 1514 1515 1516 1517 1518 1519
      NULL,
      NULL,
      NULL,
      NULL
#ifdef Rel10
      ,0,
      (MBSFN_AreaInfoList_r9_t *)NULL,
      (PMCH_InfoList_r9_t *)NULL
1520 1521
#endif
#ifdef CBA
1522 1523
      ,0,
      0
1524
#endif
1525 1526
  );

1527
  // Re-establish PDCP for all RBs that are established
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1528 1529 1530
  // rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, ue_mod_idP+DCCH);
  // rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, ue_mod_idP+DCCH1);
  // rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, ue_mod_idP+DTCH);
1531 1532


1533
  // Re-establish RLC for all RBs that are established
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1534 1535 1536
  // rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,ue_mod_idP+DCCH,SIGNALLING_RADIO_BEARER,Rlc_info_am_config);
  // rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,ue_mod_idP+DCCH1,SIGNALLING_RADIO_BEARER,Rlc_info_am_config);
  // rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,ue_mod_idP+DTCH,RADIO_ACCESS_BEARER,Rlc_info_um);
1537

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1538
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].State = RRC_SI_RECEIVED;
1539 1540

}
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1541 1542
void rrc_detach_from_eNB(module_id_t ue_mod_idP,uint8_t eNB_index) {
  //UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index]
1543 1544
}

1545
/*------------------------------------------------------------------------------------------*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1546
void  rrc_ue_decode_dcch(module_id_t ue_mod_idP, frame_t frameP,uint8_t Srb_id, uint8_t *Buffer,uint8_t eNB_index){
1547 1548 1549 1550 1551
  /*------------------------------------------------------------------------------------------*/

  //DL_DCCH_Message_t dldcchmsg;
  DL_DCCH_Message_t *dl_dcch_msg=NULL;//&dldcchmsg;
  //  asn_dec_rval_t dec_rval;
1552
  // int i;
1553
  uint8_t target_eNB_index=0xFF;
winckel's avatar
winckel committed
1554 1555 1556 1557
#if defined(ENABLE_ITTI)
  MessageDef *msg_p;
#endif

1558
  if (Srb_id != 1) {
1559
      LOG_E(RRC,"[UE %d] Frame %d: Received message on DL-DCCH (SRB%d), should not have ...\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1560
          ue_mod_idP, frameP, Srb_id);
1561
      return;
1562 1563 1564 1565 1566
  }

  //memset(dl_dcch_msg,0,sizeof(DL_DCCH_Message_t));

  // decode messages
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1567
  //  LOG_D(RRC,"[UE %d] Decoding DL-DCCH message\n",ue_mod_idP);
1568 1569 1570 1571
  /*
  for (i=0;i<30;i++)
    LOG_T(RRC,"%x.",Buffer[i]);
  LOG_T(RRC, "\n");
1572
   */
1573
  uper_decode(NULL,
1574 1575 1576 1577
      &asn_DEF_DL_DCCH_Message,
      (void**)&dl_dcch_msg,
      (uint8_t*)Buffer,
      RRC_BUF_SIZE,0,0);
1578 1579 1580 1581 1582

#ifdef XER_PRINT
  xer_fprint(stdout,&asn_DEF_DL_DCCH_Message,(void*)dl_dcch_msg);
#endif

1583
#if defined(ENABLE_ITTI)
1584
# if defined(DISABLE_ITTI_XER_PRINT)
1585
  {
winckel's avatar
winckel committed
1586 1587
    msg_p = itti_alloc_new_message (TASK_RRC_UE, RRC_DL_DCCH_MESSAGE);
    memcpy (&msg_p->ittiMsg, (void *) dl_dcch_msg, sizeof(RrcDlDcchMessage));
1588

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1589
    itti_send_msg_to_task (TASK_UNKNOWN, ue_mod_idP + NB_eNB_INST, msg_p);
1590
  }
1591 1592
# else
  {
1593
    char        message_string[30000];
1594
    size_t      message_string_size;
1595

1596
    if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_DL_DCCH_Message, (void *)dl_dcch_msg)) > 0)
1597 1598 1599 1600
      {
        msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_DL_DCCH, message_string_size + sizeof (IttiMsgText));
        msg_p->ittiMsg.rrc_dl_dcch.size = message_string_size;
        memcpy(&msg_p->ittiMsg.rrc_dl_dcch.text, message_string, message_string_size);
1601

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1602
        itti_send_msg_to_task(TASK_UNKNOWN, ue_mod_idP + NB_eNB_INST, msg_p);
1603
      }
1604 1605
  }
# endif
1606 1607
#endif

1608 1609
  if (dl_dcch_msg->message.present == DL_DCCH_MessageType_PR_c1) {

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1610
      if (UE_rrc_inst[ue_mod_idP].Info[eNB_index].State >= RRC_CONNECTED) {
1611

1612
          switch (dl_dcch_msg->message.choice.c1.present) {
1613

1614
          case DL_DCCH_MessageType__c1_PR_NOTHING:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1615
            LOG_I(RRC, "[UE %d] Frame %d : Received PR_NOTHING on DL-DCCH-Message\n", ue_mod_idP, frameP);
1616
            return;
winckel's avatar
RRC:  
winckel committed
1617

1618 1619
          case DL_DCCH_MessageType__c1_PR_csfbParametersResponseCDMA2000:
            break;
1620

1621
          case DL_DCCH_MessageType__c1_PR_dlInformationTransfer: {
winckel's avatar
RRC:  
winckel committed
1622
#if defined(ENABLE_ITTI)
1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635
            DLInformationTransfer_t *dlInformationTransfer = &dl_dcch_msg->message.choice.c1.choice.dlInformationTransfer;

            if ((dlInformationTransfer->criticalExtensions.present == DLInformationTransfer__criticalExtensions_PR_c1)
                && (dlInformationTransfer->criticalExtensions.choice.c1.present
                    == DLInformationTransfer__criticalExtensions__c1_PR_dlInformationTransfer_r8)
                    && (dlInformationTransfer->criticalExtensions.choice.c1.choice.dlInformationTransfer_r8.dedicatedInfoType.present
                        == DLInformationTransfer_r8_IEs__dedicatedInfoType_PR_dedicatedInfoNAS)) {
                /* This message hold a dedicated info NAS payload, forward it to NAS */
                struct DLInformationTransfer_r8_IEs__dedicatedInfoType *dedicatedInfoType =
                    &dlInformationTransfer->criticalExtensions.choice.c1.choice.dlInformationTransfer_r8.dedicatedInfoType;
                uint32_t pdu_length;
                uint8_t *pdu_buffer;
                MessageDef *msg_p;
1636

1637 1638 1639 1640
                pdu_length = dedicatedInfoType->choice.dedicatedInfoNAS.size;
                pdu_buffer = dedicatedInfoType->choice.dedicatedInfoNAS.buf;

                msg_p = itti_alloc_new_message(TASK_RRC_UE, NAS_DOWNLINK_DATA_IND);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1641
                NAS_DOWNLINK_DATA_IND(msg_p).UEid = ue_mod_idP; // TODO set the UEid to something else ?
1642 1643 1644
                NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length = pdu_length;
                NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.data = pdu_buffer;

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1645
                itti_send_msg_to_task(TASK_NAS_UE, ue_mod_idP + NB_eNB_INST, msg_p);
1646
            }
winckel's avatar
RRC:  
winckel committed
1647
#endif
1648 1649
            break;
          }
1650

1651 1652
          case DL_DCCH_MessageType__c1_PR_handoverFromEUTRAPreparationRequest:
            break;
1653

1654 1655
          case DL_DCCH_MessageType__c1_PR_mobilityFromEUTRACommand:
            break;
1656

1657 1658 1659 1660 1661
          case DL_DCCH_MessageType__c1_PR_rrcConnectionReconfiguration:
            // first check if mobilityControlInfo  is present
            if (dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.mobilityControlInfo
                != NULL) {
                /* 36.331, 5.3.5.4 Reception of an RRCConnectionReconfiguration including the mobilityControlInfo by the UE (handover)*/
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1662
                if (UE_rrc_inst[ue_mod_idP].HandoverInfoUe.targetCellId
1663 1664
                    != dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.mobilityControlInfo->targetPhysCellId) {
                    LOG_W(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1665
                        "[UE %d] Frame %d: Handover target (%d) is different from RSRP measured target (%d)..\n", ue_mod_idP, frameP, dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.mobilityControlInfo->targetPhysCellId, UE_rrc_inst[ue_mod_idP].HandoverInfoUe.targetCellId);
1666 1667 1668
                    return;
                }
                else
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1669
                  if ((target_eNB_index = get_adjacent_cell_mod_id(UE_rrc_inst[ue_mod_idP].HandoverInfoUe.targetCellId))
1670 1671
                      == 0xFF) {
                      LOG_W(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1672
                          "[UE %d] Frame %d: ue_mod_idP of the target eNB not found, check the network topology\n", ue_mod_idP, frameP);
1673 1674 1675 1676
                      return;
                  }
                  else {
                      LOG_I(RRC,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1677 1678
                          "[UE% d] Frame %d: Received rrcConnectionReconfiguration with mobilityControlInfo \n", ue_mod_idP, frameP);
                      UE_rrc_inst[ue_mod_idP].HandoverInfoUe.measFlag = 1; // Ready to send more MeasReports if required
1679
                  }
1680
            }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1681
            rrc_ue_process_rrcConnectionReconfiguration(ue_mod_idP, frameP,
1682 1683
                &dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration, eNB_index);
            if (target_eNB_index != 0xFF) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1684
                rrc_ue_generate_RRCConnectionReconfigurationComplete(ue_mod_idP, frameP, target_eNB_index,
1685
                    dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.rrc_TransactionIdentifier);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1686 1687 1688
                UE_rrc_inst[ue_mod_idP].Info[eNB_index].State = RRC_HO_EXECUTION;
                UE_rrc_inst[ue_mod_idP].Info[target_eNB_index].State = RRC_RECONFIGURED;
                LOG_I(RRC, "[UE %d] State = RRC_RECONFIGURED during HO (eNB %d)\n", ue_mod_idP, target_eNB_index);
Lionel Gauthier's avatar
Lionel Gauthier committed
1689 1690
#if defined(ENABLE_ITTI)
#ifdef ENABLE_RAL
1691 1692 1693 1694 1695 1696 1697
                {
                  MessageDef                                 *message_ral_p = NULL;
                  rrc_ral_connection_reconfiguration_ho_ind_t connection_reconfiguration_ho_ind;
                  int                                         i;

                  message_ral_p = itti_alloc_new_message (TASK_RRC_UE, RRC_RAL_CONNECTION_RECONFIGURATION_HO_IND);
                  memset(&connection_reconfiguration_ho_ind, 0, sizeof(rrc_ral_connection_reconfiguration_ho_ind_t));
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1698
                  connection_reconfiguration_ho_ind.ue_id = ue_mod_idP;
1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
                  if (dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList != NULL) {
                      connection_reconfiguration_ho_ind.num_drb      = dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.count;

                      for (i=0;(i<dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.count) && (i < maxDRB);i++) {
                          // why minus 1 in RRC code for drb_identity ?
                          connection_reconfiguration_ho_ind.drb_id[i]   = dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.array[i]->drb_Identity;
                      }
                  } else {
                      connection_reconfiguration_ho_ind.num_drb      = 0;
                  }
                  if (dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->srb_ToAddModList != NULL) {
1710
                      connection_reconfiguration_ho_ind.num_srb      = dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->srb_ToAddModList->list.count + UE_rrc_inst[ue_mod_idP].num_srb;
1711
                  } else {
1712
                      connection_reconfiguration_ho_ind.num_srb      += UE_rrc_inst[ue_mod_idP].num_srb;
1713
                  }
1714 1715
		  if (connection_reconfiguration_ho_ind.num_srb > 2 )
         		connection_reconfiguration_ho_ind.num_srb =2;
1716
                  memcpy (&message_ral_p->ittiMsg, (void *) &connection_reconfiguration_ho_ind, sizeof(rrc_ral_connection_reconfiguration_ho_ind_t));
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1717
                  //#warning "ue_mod_idP ? for instance ? => YES"
1718
                  LOG_I(RRC, "Sending RRC_RAL_CONNECTION_RECONFIGURATION_HO_IND to mRAL\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1719
                  itti_send_msg_to_task (TASK_RAL_UE, ue_mod_idP + NB_eNB_INST, message_ral_p);
Lionel Gauthier's avatar
Lionel Gauthier committed
1720 1721 1722
                }
#endif
#endif
1723 1724
            }
            else {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1725
                rrc_ue_generate_RRCConnectionReconfigurationComplete(ue_mod_idP, frameP, eNB_index,
1726
                    dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.rrc_TransactionIdentifier);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1727 1728
                UE_rrc_inst[ue_mod_idP].Info[eNB_index].State = RRC_RECONFIGURED;
                LOG_I(RRC, "[UE %d] State = RRC_RECONFIGURED (eNB %d)\n", ue_mod_idP, eNB_index);
Lionel Gauthier's avatar
Lionel Gauthier committed
1729 1730
#if defined(ENABLE_ITTI)
#ifdef ENABLE_RAL
1731 1732 1733 1734 1735 1736 1737
                {
                  MessageDef                                 *message_ral_p = NULL;
                  rrc_ral_connection_reconfiguration_ind_t    connection_reconfiguration_ind;
                  int                                         i;

                  message_ral_p = itti_alloc_new_message (TASK_RRC_UE, RRC_RAL_CONNECTION_RECONFIGURATION_IND);
                  memset(&connection_reconfiguration_ind, 0, sizeof(rrc_ral_connection_reconfiguration_ind_t));
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1738
                  connection_reconfiguration_ind.ue_id = ue_mod_idP;
1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749
                  if (dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList != NULL) {
                      connection_reconfiguration_ind.num_drb      = dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.count;

                      for (i=0;(i<dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.count) && (i < maxDRB);i++) {
                          // why minus 1 in RRC code for drb_identity ?
                          connection_reconfiguration_ind.drb_id[i]   = dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->drb_ToAddModList->list.array[i]->drb_Identity;
                      }
                  } else {
                      connection_reconfiguration_ind.num_drb      = 0;
                  }
                  if (dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->srb_ToAddModList != NULL) {
1750
                      connection_reconfiguration_ind.num_srb      = dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.radioResourceConfigDedicated->srb_ToAddModList->list.count + UE_rrc_inst[ue_mod_idP].num_srb;
1751
                  } else {
1752
                      connection_reconfiguration_ind.num_srb      +=UE_rrc_inst[ue_mod_idP].num_srb;
1753
                  }
1754 1755
		  if (connection_reconfiguration_ind.num_srb > 2 )
			connection_reconfiguration_ind.num_srb =2;
1756
                  memcpy (&message_ral_p->ittiMsg, (void *) &connection_reconfiguration_ind, sizeof(rrc_ral_connection_reconfiguration_ind_t));
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1757
                  //#warning "ue_mod_idP ? for instance ? => YES"
1758
                  LOG_I(RRC, "Sending RRC_RAL_CONNECTION_RECONFIGURATION_IND to mRAL\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1759
                  itti_send_msg_to_task (TASK_RAL_UE, ue_mod_idP + NB_eNB_INST, message_ral_p);
Lionel Gauthier's avatar
Lionel Gauthier committed
1760 1761 1762 1763
                }
#endif
#endif

1764 1765
            }
            break;
1766

1767
          case DL_DCCH_MessageType__c1_PR_rrcConnectionRelease:
1768
#if defined(ENABLE_ITTI)
1769 1770 1771 1772 1773 1774 1775 1776
            msg_p = itti_alloc_new_message(TASK_RRC_UE, NAS_CONN_RELEASE_IND);
            if ((dl_dcch_msg->message.choice.c1.choice.rrcConnectionRelease.criticalExtensions.present
                == RRCConnectionRelease__criticalExtensions_PR_c1)
                && (dl_dcch_msg->message.choice.c1.choice.rrcConnectionRelease.criticalExtensions.choice.c1.present
                    == RRCConnectionRelease__criticalExtensions__c1_PR_rrcConnectionRelease_r8)) {
                NAS_CONN_RELEASE_IND(msg_p).cause =
                    dl_dcch_msg->message.choice.c1.choice.rrcConnectionRelease.criticalExtensions.choice.c1.choice.rrcConnectionRelease_r8.releaseCause;
            }
winckel's avatar
winckel committed
1777

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1778
            itti_send_msg_to_task(TASK_NAS_UE, ue_mod_idP + NB_eNB_INST, msg_p);
Lionel Gauthier's avatar
Lionel Gauthier committed
1779
#if defined(ENABLE_RAL)
1780
            msg_p = itti_alloc_new_message(TASK_RRC_UE, RRC_RAL_CONNECTION_RELEASE_IND);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1781 1782
            RRC_RAL_CONNECTION_RELEASE_IND(msg_p).ue_id = ue_mod_idP;
            itti_send_msg_to_task(TASK_RAL_UE, ue_mod_idP + NB_eNB_INST, msg_p);
Lionel Gauthier's avatar
Lionel Gauthier committed
1783
#endif
1784
#endif
1785
            break;
1786

1787
          case DL_DCCH_MessageType__c1_PR_securityModeCommand:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1788 1789
            LOG_I(RRC, "[UE %d] Received securityModeCommand (eNB %d)\n", ue_mod_idP, eNB_index);
            rrc_ue_process_securityModeCommand(ue_mod_idP, frameP, &dl_dcch_msg->message.choice.c1.choice.securityModeCommand,
1790 1791
                eNB_index);
            break;
1792

1793
          case DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1794 1795
            LOG_I(RRC, "[UE %d] Received Capability Enquiry (eNB %d)\n", ue_mod_idP, eNB_index);
            rrc_ue_process_ueCapabilityEnquiry(ue_mod_idP, frameP, &dl_dcch_msg->message.choice.c1.choice.ueCapabilityEnquiry,
1796 1797
                eNB_index);
            break;
1798

1799 1800
          case DL_DCCH_MessageType__c1_PR_counterCheck:
            break;
winckel's avatar
RRC:  
winckel committed
1801

1802
#ifdef Rel10
1803 1804 1805 1806 1807 1808
          case DL_DCCH_MessageType__c1_PR_ueInformationRequest_r9:
            break;
          case DL_DCCH_MessageType__c1_PR_loggedMeasurementConfiguration_r10:
            break;
          case DL_DCCH_MessageType__c1_PR_rnReconfiguration_r10:
            break;
1809
#endif
1810

1811 1812 1813 1814 1815
          case DL_DCCH_MessageType__c1_PR_spare1:
          case DL_DCCH_MessageType__c1_PR_spare2:
          case DL_DCCH_MessageType__c1_PR_spare3:
          case DL_DCCH_MessageType__c1_PR_spare4:
            break;
1816

1817 1818 1819
          default:
            break;
          }
1820 1821 1822
      }
  }
#ifndef NO_RRM
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1823
  send_msg(&S_rrc,msg_rrc_end_scan_req(ue_mod_idP,eNB_index));
1824 1825 1826 1827 1828 1829 1830 1831 1832 1833
#endif
}

const char siWindowLength[7][5] = {"1ms\0","2ms\0","5ms\0","10ms\0","15ms\0","20ms\0","40ms\0"};
const char siWindowLength_int[7] = {1,2,5,10,15,20,40};

const char SIBType[16][6] ={"SIB3\0","SIB4\0","SIB5\0","SIB6\0","SIB7\0","SIB8\0","SIB9\0","SIB10\0","SIB11\0","SIB12\0","SIB13\0","Sp2\0","Sp3\0","Sp4\0"};
const char SIBPeriod[7][7]= {"80ms\0","160ms\0","320ms\0","640ms\0","1280ms\0","2560ms\0","5120ms\0"};
int siPeriod_int[7] = {80,160,320,640,1280,2560,5120};

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1834
int decode_BCCH_DLSCH_Message(module_id_t ue_mod_idP, frame_t frameP,uint8_t eNB_index,uint8_t *Sdu,uint8_t Sdu_len, uint8_t rsrq, uint8_t rsrp) {
1835 1836 1837

  //BCCH_DL_SCH_Message_t bcch_message;
  BCCH_DL_SCH_Message_t *bcch_message=NULL;//_ptr=&bcch_message;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1838 1839
  SystemInformationBlockType1_t **sib1=&UE_rrc_inst[ue_mod_idP].sib1[eNB_index];
  SystemInformation_t **si=UE_rrc_inst[ue_mod_idP].si[eNB_index];
1840 1841
  asn_dec_rval_t dec_rval;
  uint32_t si_window;//, sib1_decoded=0, si_decoded=0;
1842
  // int i;
1843 1844 1845 1846

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_IN);


Lionel Gauthier's avatar
 
Lionel Gauthier committed
1847 1848
  if ((UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIB1Status == 1) &&
      (UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIStatus == 1)) {
1849 1850 1851
      // Avoid decoding to prevent memory bloating
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT);
      return 0;
1852 1853 1854
  } 
  else {

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1855
      rrc_set_sub_state (ue_mod_idP, RRC_SUB_STATE_IDLE_RECEIVING_SIB);
winckel's avatar
winckel committed
1856

1857 1858
      //memset(&bcch_message,0,sizeof(BCCH_DL_SCH_Message_t));
      /*
1859 1860 1861 1862 1863 1864 1865
      LOG_D(RRC,"[UE %d] Decoding DL_BCCH_DLSCH_Message\n",ue_mod_idP);
      int i;
      for (i=0;i<Sdu_len;i++)
	printf("%x.",Sdu[i]);
      printf("\n");
      */

1866 1867 1868 1869 1870 1871 1872
      dec_rval = uper_decode_complete(NULL,
          &asn_DEF_BCCH_DL_SCH_Message,
          (void **)&bcch_message,
          (const void *)Sdu,
          Sdu_len);//,0,0);

      if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1873
          LOG_E(RRC,"[UE %d] Failed to decode BCCH_DLSCH_MESSAGE (%d bits)\n",ue_mod_idP,dec_rval.consumed);
1874 1875 1876 1877 1878 1879
          //free the memory
          SEQUENCE_free(&asn_DEF_BCCH_DL_SCH_Message, (void*)bcch_message, 1);
          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT);
          return -1;
      }
      //  xer_fprint(stdout,  &asn_DEF_BCCH_DL_SCH_Message, (void*)&bcch_message);
1880 1881

#if defined(ENABLE_ITTI)
1882
# if defined(DISABLE_ITTI_XER_PRINT)
1883 1884
      {
        MessageDef *msg_p;
1885

1886 1887
        msg_p = itti_alloc_new_message (TASK_RRC_UE, RRC_DL_BCCH_MESSAGE);
        memcpy (&msg_p->ittiMsg, (void *) bcch_message, sizeof(RrcDlBcchMessage));
1888

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1889
        itti_send_msg_to_task (TASK_UNKNOWN, ue_mod_idP + NB_eNB_INST, msg_p);
1890
      }
1891
# else
winckel's avatar
winckel committed
1892
      {
1893 1894 1895 1896 1897 1898
        char        message_string[15000];
        size_t      message_string_size;

        if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_BCCH_DL_SCH_Message, (void *)bcch_message)) > 0)
          {
            MessageDef *msg_p;
1899

1900 1901 1902
            msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, 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);
winckel's avatar
winckel committed
1903

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1904
            itti_send_msg_to_task(TASK_UNKNOWN, ue_mod_idP + NB_eNB_INST, msg_p);
1905
          }
winckel's avatar
winckel committed
1906
      }
1907
# endif
1908 1909
#endif

1910 1911 1912 1913
      if (bcch_message->message.present == BCCH_DL_SCH_MessageType_PR_c1) {
          switch (bcch_message->message.choice.c1.present) {
          case BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1:
            if ((frameP %2) == 0) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1914
                if (UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIB1Status == 0) {
1915 1916 1917
                    memcpy((void*)*sib1,
                        (void*)&bcch_message->message.choice.c1.choice.systemInformationBlockType1,
                        sizeof(SystemInformationBlockType1_t));
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1918 1919
                    LOG_D(RRC,"[UE %d] Decoding First SIB1\n",ue_mod_idP);
                    decode_SIB1(ue_mod_idP, eNB_index, rsrq, rsrp);
1920 1921
                    //mac_xface->macphy_exit("after decode_SIB1");
                }
1922
            }
1923
            break;
1924

1925
          case BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1926 1927
            if ((UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIB1Status == 1) &&
                (UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIStatus == 0)) {
1928
                //                                                if ((frameP %8) == 1) {  // check only in odd frames for SI
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1929
                si_window = (frameP%(UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIperiod/10))/(UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIwindowsize/10);
1930 1931 1932
                memcpy((void*)si[si_window],
                    (void*)&bcch_message->message.choice.c1.choice.systemInformation,
                    sizeof(SystemInformation_t));
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1933 1934
                LOG_D(RRC,"[UE %d] Decoding SI for frameP %d, si_window %d\n",ue_mod_idP,frameP,si_window);
                decode_SI(ue_mod_idP,frameP,eNB_index,si_window);
1935 1936 1937 1938 1939
                //mac_xface->macphy_exit("after decode_SI");

                //                                }
            }
            break;
1940

1941 1942 1943 1944
          case BCCH_DL_SCH_MessageType__c1_PR_NOTHING:
          default:
            break;
          }
1945 1946
      }
  }
winckel's avatar
winckel committed
1947

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1948
  if ((rrc_get_sub_state(ue_mod_idP) == RRC_SUB_STATE_IDLE_SIB_COMPLETE)
1949
# if defined(ENABLE_USE_MME)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1950
      && (UE_rrc_inst[ue_mod_idP].initialNasMsg.data != NULL)
1951 1952
#endif
  ) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1953
      rrc_ue_generate_RRCConnectionRequest(ue_mod_idP, frameP, 0);
1954
      LOG_I(RRC, "not sending connection request\n");
winckel's avatar
winckel committed
1955

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1956
      rrc_set_sub_state (ue_mod_idP, RRC_SUB_STATE_IDLE_CONNECTING);
winckel's avatar
winckel committed
1957 1958
  }

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1959 1960
  /*  if ((UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIB1Status == 1) &&
      (UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIStatus == 1) && (frameP >= ue_mod_idP * 20 + 10))
1961 1962
      SEQUENCE_free(&asn_DEF_BCCH_DL_SCH_Message, (void*)bcch_message, 0);*/
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT);
1963 1964

  return 0;
1965 1966 1967
}


Lionel Gauthier's avatar
 
Lionel Gauthier committed
1968 1969
int decode_SIB1(module_id_t ue_mod_idP,uint8_t eNB_index, uint8_t rsrq, uint8_t rsrp) {
  SystemInformationBlockType1_t **sib1=&UE_rrc_inst[ue_mod_idP].sib1[eNB_index];
1970 1971 1972 1973
  int i;

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1, VCD_FUNCTION_IN);

Lionel Gauthier's avatar
 
Lionel Gauthier committed
1974
  LOG_D(RRC,"[UE %d] : Dumping SIB 1\n",ue_mod_idP);
1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987

  //  xer_fprint(stdout,&asn_DEF_SystemInformationBlockType1, (void*)*sib1);

  LOG_D(RRC,"cellAccessRelatedInfo.cellIdentity : %x.%x.%x.%x\n",
      (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[0],
      (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[1],
      (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[2],
      (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[3]);

  LOG_D(RRC,"cellSelectionInfo.q_RxLevMin       : %d\n",(int)(*sib1)->cellSelectionInfo.q_RxLevMin);
  LOG_D(RRC,"freqBandIndicator                  : %d\n",(int)(*sib1)->freqBandIndicator);
  LOG_D(RRC,"siWindowLength                     : %s\n",siWindowLength[(*sib1)->si_WindowLength]);
  if ((*sib1)->schedulingInfoList.list.count>0) {
1988 1989 1990 1991 1992 1993 1994
      for (i=0;i<(*sib1)->schedulingInfoList.list.count;i++) {
          LOG_D(RRC,"siSchedulingInfoPeriod[%d]          : %s\n",i,SIBPeriod[(int)(*sib1)->schedulingInfoList.list.array[i]->si_Periodicity]);
          if ((*sib1)->schedulingInfoList.list.array[i]->sib_MappingInfo.list.count>0)
            LOG_D(RRC,"siSchedulingInfoSIBType[%d]         : %s\n",i,SIBType[(int)(*(*sib1)->schedulingInfoList.list.array[i]->sib_MappingInfo.list.array[0])]);
          else {
              LOG_W(RRC,"mapping list %d is null\n",i);
          }
1995 1996 1997
      }
  }
  else {
1998 1999
      LOG_E(RRC,"siSchedulingInfoPeriod[0]          : PROBLEM!!!\n");
      return -1;
2000 2001 2002
  }

  if ((*sib1)->tdd_Config) {
2003 2004
      LOG_D(RRC,"TDD subframe assignment            : %d\n",(int)(*sib1)->tdd_Config->subframeAssignment);
      LOG_D(RRC,"S-Subframe Config                  : %d\n",(int)(*sib1)->tdd_Config->specialSubframePatterns);
2005 2006
  }

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2007 2008
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIperiod     = siPeriod_int[(*sib1)->schedulingInfoList.list.array[0]->si_Periodicity];
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIwindowsize = siWindowLength_int[(*sib1)->si_WindowLength];
2009
  LOG_D(RRC, "[MSC_MSG][FRAME unknown][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SIB1 params eNB %d) --->][MAC_UE][MOD %02d][]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2010
      ue_mod_idP, eNB_index, ue_mod_idP);
2011

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2012
  rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
2013 2014
      (RadioResourceConfigCommonSIB_t *)NULL,
      (struct PhysicalConfigDedicated *)NULL,
2015 2016 2017 2018
#ifdef Rel10
	(SCellToAddMod_r10_t *)NULL,
	//(struct PhysicalConfigDedicatedSCell_r10 *)NULL,
#endif
2019 2020 2021 2022 2023
      (MeasObjectToAddMod_t **)NULL,
      (MAC_MainConfig_t *)NULL,
      0,
      (struct LogicalChannelConfig *)NULL,
      (MeasGapConfig_t *)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2024
      UE_rrc_inst[ue_mod_idP].sib1[eNB_index]->tdd_Config,
2025
      (MobilityControlInfo_t *) NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2026 2027
      &UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIwindowsize,
      &UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIperiod,
2028 2029 2030 2031 2032 2033 2034 2035
      NULL,
      NULL,
      NULL,
      (MBSFN_SubframeConfigList_t *)NULL
#ifdef Rel10
      ,0,
      (MBSFN_AreaInfoList_r9_t *)NULL,
      (PMCH_InfoList_r9_t *)NULL
2036 2037
#endif
#ifdef CBA
2038 2039 2040
      ,
      0,
      0
2041
#endif
2042
  );
2043

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2044 2045
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIB1Status = 1;
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIB1systemInfoValueTag = (*sib1)->systemInfoValueTag;
2046 2047 2048 2049 2050 2051

#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
  {
    int cell_valid = 0;

    if ((*sib1)->cellAccessRelatedInfo.cellBarred == SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred) {
2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
        /* Cell is not barred */
        int plmn;
        int plmn_number;

        plmn_number = (*sib1)->cellAccessRelatedInfo.plmn_IdentityList.list.count;

        /* Compare requested PLMN and PLMNs from SIB1*/
        for (plmn = 0; plmn < plmn_number; plmn++) {
            PLMN_Identity_t *plmn_Identity;

            plmn_Identity = &(*sib1)->cellAccessRelatedInfo.plmn_IdentityList.list.array[plmn]->plmn_Identity;
            if (((plmn_Identity->mcc == NULL)
                ||
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2065 2066 2067
                ((UE_rrc_inst[ue_mod_idP].plmnID.MCCdigit1 == *(plmn_Identity->mcc->list.array[0])) &&
                    (UE_rrc_inst[ue_mod_idP].plmnID.MCCdigit2 == *(plmn_Identity->mcc->list.array[1])) &&
                    (UE_rrc_inst[ue_mod_idP].plmnID.MCCdigit3 == *(plmn_Identity->mcc->list.array[2]))))
2068
                    &&
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2069 2070 2071
                    (UE_rrc_inst[ue_mod_idP].plmnID.MNCdigit1 == *(plmn_Identity->mnc.list.array[0])) &&
                    (UE_rrc_inst[ue_mod_idP].plmnID.MNCdigit2 == *(plmn_Identity->mnc.list.array[1])) &&
                    (((UE_rrc_inst[ue_mod_idP].plmnID.MNCdigit3 == 0xf) && (plmn_Identity->mnc.list.count == 2))
2072
                        ||
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2073
                        (UE_rrc_inst[ue_mod_idP].plmnID.MNCdigit3 == *(plmn_Identity->mnc.list.array[2])))) {
2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084
                /* PLMN match, send a confirmation to NAS */
                MessageDef  *msg_p;

                msg_p = itti_alloc_new_message(TASK_RRC_UE, NAS_CELL_SELECTION_CNF);
                NAS_CELL_SELECTION_CNF (msg_p).errCode = AS_SUCCESS;
                NAS_CELL_SELECTION_CNF (msg_p).cellID = BIT_STRING_to_uint32(&(*sib1)->cellAccessRelatedInfo.cellIdentity);
                NAS_CELL_SELECTION_CNF (msg_p).tac = BIT_STRING_to_uint16(&(*sib1)->cellAccessRelatedInfo.trackingAreaCode);
                NAS_CELL_SELECTION_CNF (msg_p).rat = 0xFF;
                NAS_CELL_SELECTION_CNF (msg_p).rsrq = rsrq;
                NAS_CELL_SELECTION_CNF (msg_p).rsrp = rsrp;

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2085
                itti_send_msg_to_task(TASK_NAS_UE, ue_mod_idP + NB_eNB_INST, msg_p);
2086 2087 2088
                cell_valid = 1;
                break;
            }
2089 2090 2091 2092
        }
    }

    if (cell_valid == 0)
2093 2094 2095
      {
        /* Cell can not be used, ask PHY to try the next one */
        MessageDef  *msg_p;
2096

2097
        msg_p = itti_alloc_new_message(TASK_RRC_UE, PHY_FIND_NEXT_CELL_REQ);
2098

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2099
        itti_send_msg_to_task(TASK_PHY_UE, ue_mod_idP + NB_eNB_INST, msg_p);
2100
      }
2101 2102 2103
  }
#endif

2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1, VCD_FUNCTION_OUT);
  return 0;

}


void dump_sib2(SystemInformationBlockType2_t *sib2) {

  LOG_D(RRC,"radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles : %ld\n",
      sib2->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles);

  //  if (radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig)
  //msg("radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig ",sib2->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig = NULL;

  LOG_D(RRC,"[UE]radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep : %ld\n",sib2->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep);

  LOG_D(RRC,"[UE]radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower : %ld\n",sib2->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower);

  LOG_D(RRC,"radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax  : %ld\n",sib2->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax);

  LOG_D(RRC,"radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize : %ld\n",sib2->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize);

  LOG_D(RRC,"radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer : %ld\n",sib2->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer);

  LOG_D(RRC,"radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx : %ld\n",
      sib2->radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx);

  LOG_D(RRC,"radioResourceConfigCommon.prach_Config.rootSequenceIndex : %ld\n",sib2->radioResourceConfigCommon.prach_Config.rootSequenceIndex);
  LOG_D(RRC,"radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_ConfigIndex : %ld\n",sib2->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_ConfigIndex);
  LOG_D(RRC,"radioResourceConfigCommon.prach_Config.prach_ConfigInfo.highSpeedFlag : %d\n",  (int)sib2->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.highSpeedFlag);
  LOG_D(RRC,"radioResourceConfigCommon.prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig : %ld\n",  sib2->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig);
  LOG_D(RRC,"radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset %ld\n",  sib2->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset);

  // PDSCH-Config
  LOG_D(RRC,"radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower  : %ld\n",sib2->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower);
  LOG_D(RRC,"radioResourceConfigCommon.pdsch_ConfigCommon.p_b : %ld\n",sib2->radioResourceConfigCommon.pdsch_ConfigCommon.p_b);

  // PUSCH-Config
  LOG_D(RRC,"radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB  : %ld\n",sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB);
  LOG_D(RRC,"radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode  : %ld\n",sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode);
  LOG_D(RRC,"radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset : %ld\n",sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset);
  LOG_D(RRC,"radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM : %d\n",(int)sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM);
  LOG_D(RRC,"radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled : %d\n",(int)sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled);
  LOG_D(RRC,"radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH : %ld\n",sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH);
  LOG_D(RRC,"radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled : %d\n",(int)sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled);
  LOG_D(RRC,"radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift : %ld\n",sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift);

  // PUCCH-Config

  LOG_D(RRC,"radioResourceConfigCommon.pucch_ConfigCommon.deltaPUCCH_Shift : %ld\n",sib2->radioResourceConfigCommon.pucch_ConfigCommon.deltaPUCCH_Shift);
  LOG_D(RRC,"radioResourceConfigCommon.pucch_ConfigCommon.nRB_CQI : %ld\n",sib2->radioResourceConfigCommon.pucch_ConfigCommon.nRB_CQI);
  LOG_D(RRC,"radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN : %ld\n",sib2->radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN);
  LOG_D(RRC,"radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN : %ld\n",sib2->radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN);

  LOG_D(RRC,"radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present : %d\n",sib2-> radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present);


  // uplinkPowerControlCommon

  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUSCH : %ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUSCH);
  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.alpha : %ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.alpha);

  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUCCH : %ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUCCH);
  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1 : %ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1);
  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b :%ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b);
  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2  :%ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2);
  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a :%ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a);
  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b :%ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b);

  LOG_D(RRC,"radioResourceConfigCommon.uplinkPowerControlCommon.deltaPreambleMsg3 : %ld\n",sib2->radioResourceConfigCommon.uplinkPowerControlCommon.deltaPreambleMsg3);

  LOG_D(RRC,"radioResourceConfigCommon.ul_CyclicPrefixLength : %ld\n", sib2->radioResourceConfigCommon.ul_CyclicPrefixLength);

  LOG_D(RRC,"ue_TimersAndConstants.t300 : %ld\n", sib2->ue_TimersAndConstants.t300);
  LOG_D(RRC,"ue_TimersAndConstants.t301 : %ld\n", sib2->ue_TimersAndConstants.t301);
  LOG_D(RRC,"ue_TimersAndConstants.t310 : %ld\n", sib2->ue_TimersAndConstants.t310);
  LOG_D(RRC,"ue_TimersAndConstants.n310 : %ld\n", sib2->ue_TimersAndConstants.n310);
  LOG_D(RRC,"ue_TimersAndConstants.t311 : %ld\n", sib2->ue_TimersAndConstants.t311);
  LOG_D(RRC,"ue_TimersAndConstants.n311 : %ld\n", sib2->ue_TimersAndConstants.n311);

  LOG_D(RRC,"freqInfo.additionalSpectrumEmission : %ld\n",sib2->freqInfo.additionalSpectrumEmission);
2185 2186 2187
  LOG_D(RRC,"freqInfo.ul_CarrierFreq : %p\n", sib2->freqInfo.ul_CarrierFreq);
  LOG_D(RRC,"freqInfo.ul_Bandwidth : %p\n", sib2->freqInfo.ul_Bandwidth);
  LOG_D(RRC,"mbsfn_SubframeConfigList : %p\n", sib2->mbsfn_SubframeConfigList);
2188
  LOG_D(RRC,"timeAlignmentTimerCommon : %ld\n", sib2->timeAlignmentTimerCommon);
2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205
}

void dump_sib3(SystemInformationBlockType3_t *sib3) {

}

#ifdef Rel10
void dump_sib13(SystemInformationBlockType13_r9_t *sib13) {

  LOG_D(RRC,"[RRC][UE] Dumping SIB13\n");
  LOG_D(RRC,"[RRC][UE] dumping sib13 second time\n");
  LOG_D(RRC,"[RRC][UE] NotificationRepetitionCoeff-r9 : %ld\n", sib13->notificationConfig_r9.notificationRepetitionCoeff_r9);
  LOG_D(RRC,"[RRC][UE] NotificationOffset-r9 : %d\n", (int)sib13->notificationConfig_r9.notificationOffset_r9);
  LOG_D(RRC,"[RRC][UE] NotificationSF-Index-r9 : %d\n", (int)sib13->notificationConfig_r9.notificationSF_Index_r9);

}
#endif
winckel's avatar
winckel committed
2206

2207
//const char SIBPeriod[7][7]= {"80ms\0","160ms\0","320ms\0","640ms\0","1280ms\0","2560ms\0","5120ms\0"};
2208

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2209
int decode_SI(module_id_t ue_mod_idP, frame_t frameP,uint8_t eNB_index,uint8_t si_window) {
2210

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2211
  SystemInformation_t **si=&UE_rrc_inst[ue_mod_idP].si[eNB_index][si_window];
2212
  int i;
2213
  struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *typeandinfo;
2214 2215 2216 2217 2218

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI  , VCD_FUNCTION_IN);

  // Dump contents
  if ((*si)->criticalExtensions.present==SystemInformation__criticalExtensions_PR_systemInformation_r8) {
2219 2220
      LOG_D(RRC,"(*si)->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count %d\n",
          (*si)->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count);
2221 2222
  }
  else {
2223 2224
      LOG_D(RRC,"[UE] Unknown criticalExtension version (not Rel8)\n");
      return -1;
2225 2226 2227
  }

  for (i=0;i<(*si)->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count;i++) {
2228 2229 2230 2231
      LOG_D(RRC,"SI count %d\n",i);
      typeandinfo=(*si)->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.array[i];

      switch(typeandinfo->present) {
2232
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2233 2234 2235
        UE_rrc_inst[ue_mod_idP].sib2[eNB_index] = &typeandinfo->choice.sib2;
        LOG_D(RRC,"[UE %d] Frame %d Found SIB2 from eNB %d\n",ue_mod_idP,frameP,eNB_index);
        dump_sib2(UE_rrc_inst[ue_mod_idP].sib2[eNB_index]);
2236
        LOG_D(RRC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SIB2 params  eNB %d) --->][MAC_UE][MOD %02d][]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2237 2238 2239
            frameP, ue_mod_idP, eNB_index, ue_mod_idP);
        rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
            &UE_rrc_inst[ue_mod_idP].sib2[eNB_index]->radioResourceConfigCommon,
2240
            (struct PhysicalConfigDedicated *)NULL,
2241 2242 2243 2244
#ifdef Rel10
  	(SCellToAddMod_r10_t *)NULL,
	//(struct PhysicalConfigDedicatedSCell_r10 *)NULL,
#endif			   
2245 2246 2247 2248 2249 2250 2251 2252 2253
            (MeasObjectToAddMod_t **)NULL,
            (MAC_MainConfig_t *)NULL,
            0,
            (struct LogicalChannelConfig *)NULL,
            (MeasGapConfig_t *)NULL,
            (TDD_Config_t *)NULL,
            (MobilityControlInfo_t *)NULL,
            NULL,
            NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2254 2255 2256 2257
            UE_rrc_inst[ue_mod_idP].sib2[eNB_index]->freqInfo.ul_CarrierFreq,
            UE_rrc_inst[ue_mod_idP].sib2[eNB_index]->freqInfo.ul_Bandwidth,
            &UE_rrc_inst[ue_mod_idP].sib2[eNB_index]->freqInfo.additionalSpectrumEmission,
            UE_rrc_inst[ue_mod_idP].sib2[eNB_index]->mbsfn_SubframeConfigList
winckel's avatar
winckel committed
2258
#ifdef Rel10
2259 2260 2261
,0,
(MBSFN_AreaInfoList_r9_t *)NULL,
(PMCH_InfoList_r9_t *)NULL
2262 2263
#endif
#ifdef CBA
2264 2265
,0,
0
2266
#endif
2267
        );
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2268
        UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIStatus = 1;
2269
        // After SI is received, prepare RRCConnectionRequest
2270
#ifdef Rel10
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2271
        if (UE_rrc_inst[ue_mod_idP].MBMS_flag < 3) // see -Q option
2272
#endif
winckel's avatar
winckel committed
2273
#if !(defined(ENABLE_ITTI) && defined(ENABLE_USE_MME))
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2274
          rrc_ue_generate_RRCConnectionRequest(ue_mod_idP,frameP,eNB_index);
2275
        LOG_I(RRC, "not sending connection request\n");
winckel's avatar
winckel committed
2276
#endif
2277

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2278 2279 2280
        if (UE_rrc_inst[ue_mod_idP].Info[eNB_index].State == RRC_IDLE) {
            LOG_I(RRC,"[UE %d] Received SIB1/SIB2/SIB3 Switching to RRC_SI_RECEIVED\n",ue_mod_idP);
            UE_rrc_inst[ue_mod_idP].Info[eNB_index].State = RRC_SI_RECEIVED;
2281
#ifdef ENABLE_RAL
2282
            {
2283 2284 2285 2286 2287
              MessageDef                            *message_ral_p = NULL;
              rrc_ral_system_information_ind_t       ral_si_ind;

              message_ral_p = itti_alloc_new_message (TASK_RRC_UE, RRC_RAL_SYSTEM_INFORMATION_IND);
              memset(&ral_si_ind, 0, sizeof(rrc_ral_system_information_ind_t));
Lionel Gauthier's avatar
Lionel Gauthier committed
2288 2289 2290 2291 2292 2293 2294
              ral_si_ind.plmn_id.MCCdigit2 = '0';
              ral_si_ind.plmn_id.MCCdigit1 = '2';
              ral_si_ind.plmn_id.MNCdigit3 = '0';
              ral_si_ind.plmn_id.MCCdigit3 = '8';
              ral_si_ind.plmn_id.MNCdigit2 = '9';
              ral_si_ind.plmn_id.MNCdigit1 = '9';
              ral_si_ind.cell_id        = 1;
2295
              ral_si_ind.dbm            = 0;
Lionel Gauthier's avatar
Lionel Gauthier committed
2296 2297
              //ral_si_ind.dbm            = fifo_dump_emos_UE.PHY_measurements->rx_rssi_dBm[eNB_index];
              // TO DO
2298
              ral_si_ind.sinr           = 0;
Lionel Gauthier's avatar
Lionel Gauthier committed
2299 2300
              //ral_si_ind.sinr           = fifo_dump_emos_UE.PHY_measurements->subband_cqi_dB[eNB_index][phy_vars_ue->lte_frame_parms.nb_antennas_rx][0];
              // TO DO
2301 2302
              ral_si_ind.link_data_rate = 0;
              memcpy (&message_ral_p->ittiMsg, (void *) &ral_si_ind, sizeof(rrc_ral_system_information_ind_t));
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2303 2304
#warning "ue_mod_idP ? for instance ?"
              itti_send_msg_to_task (TASK_RAL_UE, ue_mod_idP + NB_eNB_INST, message_ral_p);
2305
            }
2306
#endif
2307 2308
        }
        break;
2309
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2310 2311 2312 2313
        UE_rrc_inst[ue_mod_idP].sib3[eNB_index] = &typeandinfo->choice.sib3;
        LOG_I(RRC,"[UE %d] Frame %d Found SIB3 from eNB %d\n",ue_mod_idP,frameP,eNB_index);
        dump_sib3(UE_rrc_inst[ue_mod_idP].sib3[eNB_index]);
        UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIStatus = 1;
2314

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2315
        rrc_set_sub_state (ue_mod_idP, RRC_SUB_STATE_IDLE_SIB_COMPLETE);
2316
        break;
2317
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2318 2319
        UE_rrc_inst[ue_mod_idP].sib4[eNB_index] = &typeandinfo->choice.sib4;
        LOG_I(RRC,"[UE %d] Frame %d Found SIB4 from eNB %d\n",ue_mod_idP,frameP,eNB_index);
2320
        break;
2321
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2322 2323
        UE_rrc_inst[ue_mod_idP].sib5[eNB_index] = &typeandinfo->choice.sib5;
        LOG_I(RRC,"[UE %d] Found SIB5 from eNB %d\n",ue_mod_idP,eNB_index);
2324
        break;
2325
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2326 2327
        UE_rrc_inst[ue_mod_idP].sib6[eNB_index] = &typeandinfo->choice.sib6;
        LOG_I(RRC,"[UE %d] Found SIB6 from eNB %d\n",ue_mod_idP,eNB_index);
2328
        break;
2329
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2330 2331
        UE_rrc_inst[ue_mod_idP].sib7[eNB_index] = &typeandinfo->choice.sib7;
        LOG_I(RRC,"[UE %d] Found SIB7 from eNB %d\n",ue_mod_idP,eNB_index);
2332
        break;
2333
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2334 2335
        UE_rrc_inst[ue_mod_idP].sib8[eNB_index] = &typeandinfo->choice.sib8;
        LOG_I(RRC,"[UE %d] Found SIB8 from eNB %d\n",ue_mod_idP,eNB_index);
2336
        break;
2337
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2338 2339
        UE_rrc_inst[ue_mod_idP].sib9[eNB_index] = &typeandinfo->choice.sib9;
        LOG_I(RRC,"[UE %d] Found SIB9 from eNB %d\n",ue_mod_idP,eNB_index);
2340
        break;
2341
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2342 2343
        UE_rrc_inst[ue_mod_idP].sib10[eNB_index] = &typeandinfo->choice.sib10;
        LOG_I(RRC,"[UE %d] Found SIB10 from eNB %d\n",ue_mod_idP,eNB_index);
2344
        break;
2345
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2346 2347
        UE_rrc_inst[ue_mod_idP].sib11[eNB_index] = &typeandinfo->choice.sib11;
        LOG_I(RRC,"[UE %d] Found SIB11 from eNB %d\n",ue_mod_idP,eNB_index);
2348
        break;
2349
#ifdef Rel10
2350
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2351 2352
        UE_rrc_inst[ue_mod_idP].sib12[eNB_index] = &typeandinfo->choice.sib12_v920;
        LOG_I(RRC,"[RRC][UE %d] Found SIB12 from eNB %d\n",ue_mod_idP,eNB_index);
2353
        break;
2354
      case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2355 2356 2357
        UE_rrc_inst[ue_mod_idP].sib13[eNB_index] = &typeandinfo->choice.sib13_v920;
        LOG_I(RRC,"[RRC][UE %d] Found SIB13 from eNB %d\n",ue_mod_idP,eNB_index);
        dump_sib13(UE_rrc_inst[ue_mod_idP].sib13[eNB_index]);
2358 2359
        // adding here function to store necessary parameters for using in decode_MCCH_Message + maybe transfer to PHY layer
        LOG_D(RRC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SIB13 params eNB %d) --->][MAC_UE][MOD %02d][]\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2360 2361
            frameP, ue_mod_idP, eNB_index, ue_mod_idP);
        rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
2362 2363
            (RadioResourceConfigCommonSIB_t *)NULL,
            (struct PhysicalConfigDedicated *)NULL,
2364 2365 2366 2367
#ifdef Rel10
	(SCellToAddMod_r10_t *)NULL,
	//(struct PhysicalConfigDedicatedSCell_r10 *)NULL,
#endif
2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381
            (MeasObjectToAddMod_t **)NULL,
            (MAC_MainConfig_t *)NULL,
            0,
            (struct LogicalChannelConfig *)NULL,
            (MeasGapConfig_t *)NULL,
            (TDD_Config_t *)NULL,
            (MobilityControlInfo_t *)NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            (MBSFN_SubframeConfigList_t *)NULL
            ,0,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2382
            &UE_rrc_inst[ue_mod_idP].sib13[eNB_index]->mbsfn_AreaInfoList_r9,
2383
            (PMCH_InfoList_r9_t *)NULL
2384
#ifdef CBA
2385 2386
,0,
0
2387
#endif
2388
        );
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2389
        UE_rrc_inst[ue_mod_idP].Info[eNB_index].SIStatus = 1;
2390
        break;
2391
#endif
2392 2393 2394
      default:
        break;
      }
2395 2396 2397 2398 2399 2400 2401

  }

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI  , VCD_FUNCTION_OUT);
  return 0;
}

2402
// layer 3 filtering of RSRP (EUTRA) measurements: 36.331, Sec. 5.5.3.2
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2403 2404 2405
void ue_meas_filtering(module_id_t ue_mod_idP, frame_t frameP,uint8_t eNB_index){
  float a  = UE_rrc_inst[ue_mod_idP].filter_coeff_rsrp; // 'a' in 36.331 Sec. 5.5.3.2
  float a1 = UE_rrc_inst[ue_mod_idP].filter_coeff_rsrq;
2406
  //float rsrp_db, rsrq_db;
2407
  uint8_t    eNB_offset;
2408

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2409 2410 2411
  if(UE_rrc_inst[ue_mod_idP].QuantityConfig[0] != NULL) { // Only consider 1 serving cell (index: 0)
      if (UE_rrc_inst[ue_mod_idP].QuantityConfig[0]->quantityConfigEUTRA != NULL) {
          if(UE_rrc_inst[ue_mod_idP].QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRP != NULL) {
2412
              for (eNB_offset = 0;eNB_offset<1+mac_xface->get_n_adj_cells(ue_mod_idP,0);eNB_offset++) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2413
                  //filter_factor = 1/power(2,*UE_rrc_inst[ue_mod_idP].QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRP/4);
2414
                  // LOG_N(RRC,"[UE %d] Frame %d : check proper operation in abstraction mode rsrp (%d), rx gain (%d) N_RB_DL (%d)\n",
2415 2416
                  //	ue_mod_idP,frameP,mac_xface->get_RSRP(ue_mod_idP,0,eNB_offset),mac_xface->get_rx_total_gain_dB(ue_mod_idP,0),mac_xface->lte_frame_parms->N_RB_DL);
                  UE_rrc_inst[ue_mod_idP].rsrp_db[eNB_offset] = (dB_fixed_times10(mac_xface->get_RSRP(ue_mod_idP,0,eNB_offset))/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2417 2418
                  UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset] = (1.0-a)*UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset] +  a*UE_rrc_inst[ue_mod_idP].rsrp_db[eNB_offset];
                  //mac_xface->set_RSRP_filtered(ue_mod_idP,eNB_offset,UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]);
2419

2420 2421 2422

                  //LOG_D(RRC,"RSRP_total_dB: %3.2f \n",(dB_fixed_times10(mac_xface->get_RSRP(ue_mod_idP,0,eNB_offset))/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12));

2423 2424 2425 2426 2427
                  LOG_D(RRC,"RSRP_dBm: %3.2f \n",(dB_fixed_times10(mac_xface->get_RSRP(ue_mod_idP,0,eNB_offset))/10.0));
                  LOG_D(RRC,"gain_loss_dB: %d \n",mac_xface->get_rx_total_gain_dB(ue_mod_idP,0));
                  LOG_D(RRC,"gain_fixed_dB: %d \n",dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12));
                  LOG_D(PHY,"[UE %d] Frame %d, RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB)\n",
              			ue_mod_idP, frameP,	10*log10(mac_xface->get_RSSI(ue_mod_idP,0))-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0),10*log10(mac_xface->get_RSSI(ue_mod_idP,0)));
2428
                  LOG_D(RRC,"[UE %d] Frame %d: Meas RSRP: eNB_offset: %d rsrp_coef: %3.1f filter_coef: %d before L3 filtering: rsrp: %3.1f after L3 filtering: rsrp: %3.1f \n ",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2429
                      ue_mod_idP, frameP, eNB_offset,a,
2430
                      *UE_rrc_inst->QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRP,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2431 2432
                      UE_rrc_inst[ue_mod_idP].rsrp_db[eNB_offset],
                      UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]);
2433 2434
              }
          }
2435
      }
2436
      else {
2437 2438
          for (eNB_offset = 0;eNB_offset<1+mac_xface->get_n_adj_cells(ue_mod_idP,0);eNB_offset++) {
              UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]= mac_xface->get_RSRP(ue_mod_idP,0,eNB_offset);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2439 2440
              // phy_vars_ue->PHY_measurements.rsrp_filtered[eNB_offset]=UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset];
              //mac_xface->set_RSRP_filtered(ue_mod_idP,eNB_offset,UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]);
2441
          }
2442
      }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2443 2444
      if (UE_rrc_inst[ue_mod_idP].QuantityConfig[0]->quantityConfigEUTRA != NULL) {
          if(UE_rrc_inst[ue_mod_idP].QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRQ != NULL) {
2445
              for (eNB_offset = 0;eNB_offset<1+mac_xface->get_n_adj_cells(ue_mod_idP,0);eNB_offset++) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2446
                  // LOG_N(RRC,"[UE %d] Frame %d : check if this operation workes properly in abstraction mode\n",ue_mod_idP,frameP);
2447
                  UE_rrc_inst[ue_mod_idP].rsrq_db[eNB_offset] = (10*log10(mac_xface->get_RSRQ(ue_mod_idP,0,eNB_offset)))-20;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2448 2449
                  UE_rrc_inst[ue_mod_idP].rsrq_db_filtered[eNB_offset]=(1-a1)*UE_rrc_inst[ue_mod_idP].rsrq_db_filtered[eNB_offset] + a1 *UE_rrc_inst[ue_mod_idP].rsrq_db[eNB_offset];
                  //mac_xface->set_RSRP_filtered(ue_mod_idP,eNB_offset,UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]);
2450
                  /*
2451 2452
          LOG_D(RRC,"[UE %d] Frame %d: Meas RSRQ: eNB_offset: %d rsrq_coef: %3.2f filter_coef: %d before L3 filtering: rsrq: %3.1f after L3 filtering: rsrq: %3.1f \n ",
            ue_mod_idP,frameP,eNB_offset,a1,
2453
                   *UE_rrc_inst->QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRQ,
2454
            mac_xface->get_RSRQ(ue_mod_idP,0,eNB_offset),
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2455 2456
            UE_rrc_inst[ue_mod_idP].rsrq_db[eNB_offset],
            UE_rrc_inst[ue_mod_idP].rsrq_db_filtered[eNB_offset]);
2457 2458 2459
                   */
              }
          }
2460
      }
2461
      else{
2462 2463
          for (eNB_offset = 0;eNB_offset<1+mac_xface->get_n_adj_cells(ue_mod_idP,0);eNB_offset++) {
              UE_rrc_inst[ue_mod_idP].rsrq_db_filtered[eNB_offset]= mac_xface->get_RSRQ(ue_mod_idP,0,eNB_offset);
2464
          }
2465 2466 2467 2468
      }
  }
}

2469
//Below routine implements Measurement Reporting procedure from 36.331 Section 5.5.5
2470 2471 2472 2473 2474 2475 2476
void rrc_ue_generate_MeasurementReport(module_id_t eNB_id, module_id_t UE_id, frame_t frameP) {

  uint8_t             buffer[32], size;
  uint8_t             i;
  uint8_t             target_eNB_offset;
  MeasId_t         measId;
  PhysCellId_t     cellId, targetCellId;
2477 2478 2479
  long             rsrp_t,rsrq_t;
  long             rsrp_s,rsrq_s;
  long             nElem, nElem1;
2480 2481 2482
  float            rsrp_filtered, rsrq_filtered;
  static frame_t   pframe=0;
  int              result;
2483

2484 2485 2486 2487


  nElem = 98;
  nElem1 = 35;
2488
  target_eNB_offset = UE_rrc_inst[UE_id].Info[0].handoverTarget; // eNB_offset of target eNB: used to obtain the mod_id of target eNB
2489 2490

  for (i=0;i<MAX_MEAS_ID;i++) {
2491 2492 2493 2494 2495
      if (UE_rrc_inst[UE_id].measReportList[0][i] != NULL) {
          measId = UE_rrc_inst[UE_id].measReportList[0][i]->measId;

          // Note: Values in the meas report have to be the mapped values...to implement binary search for LUT
          rsrp_filtered = UE_rrc_inst[UE_id].rsrp_db_filtered[eNB_id];//nid_cell];
2496
          rsrp_s = binary_search_float(RSRP_meas_mapping,nElem, rsrp_filtered);
2497 2498

          rsrq_filtered = UE_rrc_inst[UE_id].rsrq_db_filtered[eNB_id];//nid_cell]; //RSRQ of serving cell
2499
          rsrq_s = binary_search_float(RSRQ_meas_mapping,nElem1,rsrq_filtered);//mapped RSRQ of serving cell
2500

2501
          LOG_D(RRC,"[UE %d] Frame %d: source eNB %d :rsrp_s: %ld rsrq_s: %ld rsrp_filtered: %f rsrq_filtered: %f \n",
2502 2503 2504 2505 2506
              UE_id, frameP, eNB_id, rsrp_s,rsrq_s,rsrp_filtered,rsrq_filtered);

          rsrp_t = binary_search_float(RSRP_meas_mapping,nElem,UE_rrc_inst[UE_id].rsrp_db_filtered[target_eNB_offset]); //RSRP of target cell
          rsrq_t = binary_search_float(RSRQ_meas_mapping,nElem1,UE_rrc_inst[UE_id].rsrq_db_filtered[target_eNB_offset]); //RSRQ of target cell

2507 2508 2509
          LOG_D(RRC,"[UE %d] Frame %d: target eNB %d :rsrp_t: %ld rsrq_t: %ld rsrp_filtered: %f rsrq_filtered: %f \n",
              UE_id, frameP, target_eNB_offset, rsrp_t,rsrq_t,UE_rrc_inst[UE_id].rsrp_db_filtered[target_eNB_offset],UE_rrc_inst[UE_id].rsrq_db_filtered[target_eNB_offset]);

2510 2511
          //  if (measFlag == 1) {
          cellId = get_adjacent_cell_id(UE_id, eNB_id); //PhycellId of serving cell
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2512
          targetCellId = UE_rrc_inst[UE_id].HandoverInfoUe.targetCellId ;//get_adjacent_cell_id(ue_mod_idP,target_eNB_offset); //PhycellId of target cell
2513 2514 2515

          if (pframe!=frameP){
              pframe=frameP;
2516
              LOG_D(RRC, "[UE %d] Frame %d: doing MeasReport: servingCell(%d) targetCell(%d) rsrp_s(%ld) rsrq_s(%ld) rsrp_t(%ld) rsrq_t(%ld) \n",
2517
                  UE_id, frameP, cellId,targetCellId,rsrp_s,rsrq_s,rsrp_t,rsrq_t);
2518 2519
	      size = do_MeasurementReport(UE_id, buffer,measId,targetCellId,rsrp_s,rsrq_s,rsrp_t,rsrq_t);
              
2520 2521 2522
              LOG_I(RRC, "[UE %d] Frame %d : Generating Measurement Report for eNB %d\n", UE_id, frameP, eNB_id);
              LOG_D(RLC, "[MSC_MSG][FRAME %05d][RRC_UE][UE %02d][][--- PDCP_DATA_REQ/%d Bytes (MeasurementReport to eNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n",
                  frameP, UE_id, size, eNB_id, rrc_mui, eNB_id, DCCH);
2523
              result = pdcp_data_req(eNB_id, UE_id, frameP, ENB_FLAG_NO,  SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA);
2524
              AssertFatal (result == TRUE, "PDCP data request failed!\n");
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2525
              //LOG_D(RRC, "[UE %d] Frame %d Sending MeasReport (%d bytes) through DCCH%d to PDCP \n",ue_mod_idP,frameP, size, DCCH);
2526 2527 2528
          }
          //          measFlag = 0; //re-setting measFlag so that no more MeasReports are sent in this frameP
          //          }
2529 2530 2531 2532
      }
  }
}

2533
// Measurement report triggering, described in 36.331 Section 5.5.4.1: called periodically 
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2534
void ue_measurement_report_triggering(module_id_t ue_mod_idP, frame_t frameP,uint8_t eNB_index) {
2535
  uint8_t               i,j;
2536 2537 2538 2539 2540 2541 2542 2543
  Hysteresis_t     hys;
  TimeToTrigger_t  ttt_ms;
  Q_OffsetRange_t  ofn;
  Q_OffsetRange_t  ocn;
  Q_OffsetRange_t  ofs = 0;
  Q_OffsetRange_t  ocs = 0;
  long             a3_offset;
  MeasObjectId_t   measObjId;
2544
  ReportConfigId_t reportConfigId;
2545

2546
  for(i=0 ; i<NB_CNX_UE ; i++) {
2547
      for(j=0 ; j<MAX_MEAS_ID ; j++) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2548 2549 2550 2551 2552
          if(UE_rrc_inst[ue_mod_idP].MeasId[i][j] != NULL) {
              measObjId = UE_rrc_inst[ue_mod_idP].MeasId[i][j]->measObjectId;
              reportConfigId = UE_rrc_inst[ue_mod_idP].MeasId[i][j]->reportConfigId;
              if( /*UE_rrc_inst[ue_mod_idP].MeasId[i][j] != NULL && */ UE_rrc_inst[ue_mod_idP].MeasObj[i][measObjId-1] != NULL) {
                  if(UE_rrc_inst[ue_mod_idP].MeasObj[i][measObjId-1]->measObject.present == MeasObjectToAddMod__measObject_PR_measObjectEUTRA) {
2553 2554 2555
                      /* consider any neighboring cell detected on the associated frequency to be
                       * applicable when the concerned cell is not included in the blackCellsToAddModList
                       * defined within the VarMeasConfig for this measId */
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2556 2557 2558 2559 2560 2561 2562
                      //    LOG_I(RRC,"event %d %d %p \n", measObjId,reportConfigId, UE_rrc_inst[ue_mod_idP].ReportConfig[i][reportConfigId-1]);
                      if((UE_rrc_inst[ue_mod_idP].ReportConfig[i][reportConfigId-1] != NULL) &&
                          (UE_rrc_inst[ue_mod_idP].ReportConfig[i][reportConfigId-1]->reportConfig.present==ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA) &&
                          (UE_rrc_inst[ue_mod_idP].ReportConfig[i][reportConfigId-1]->reportConfig.choice.reportConfigEUTRA.triggerType.present == ReportConfigEUTRA__triggerType_PR_event)) {
                          hys = UE_rrc_inst[ue_mod_idP].ReportConfig[i][reportConfigId-1]->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.hysteresis;
                          //LOG_N(RRC,"[UE%d] Frame %d Check below lines for segfault :), Fix me \n",ue_mod_idP, frameP);
                          ttt_ms = timeToTrigger_ms[UE_rrc_inst[ue_mod_idP].ReportConfig[i][reportConfigId-1]->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.timeToTrigger];
2563
                          // Freq specific offset of neighbor cell freq
2564 2565
                          ofn = 5;//((UE_rrc_inst[ue_mod_idP].MeasObj[i][measObjId-1]->measObject.choice.measObjectEUTRA.offsetFreq != NULL) ?
                             // *UE_rrc_inst[ue_mod_idP].MeasObj[i][measObjId-1]->measObject.choice.measObjectEUTRA.offsetFreq : 15); //  /* 15 is the Default */
2566 2567
                          // cellIndividualOffset of neighbor cell - not defined yet
                          ocn = 0;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2568
                          a3_offset = UE_rrc_inst[ue_mod_idP].ReportConfig[i][reportConfigId-1]->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice.eventA3.a3_Offset;
2569

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2570
                          switch (UE_rrc_inst[ue_mod_idP].ReportConfig[i][reportConfigId-1]->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present) {
2571
                          case ReportConfigEUTRA__triggerType__event__eventId_PR_eventA1:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2572
                            LOG_D(RRC,"[UE %d] Frame %d : A1 event: check if serving becomes better than threshold\n",ue_mod_idP, frameP);
2573 2574
                            break;
                          case ReportConfigEUTRA__triggerType__event__eventId_PR_eventA2:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2575
                            LOG_D(RRC,"[UE %d] Frame %d : A2 event, check if serving becomes worse than a threshold\n",ue_mod_idP, frameP);
2576 2577
                            break;
                          case ReportConfigEUTRA__triggerType__event__eventId_PR_eventA3:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2578 2579 2580 2581 2582
                            LOG_D(RRC,"[UE %d] Frame %d : A3 event: check if a neighboring cell becomes offset better than serving to trigger a measurement event \n",ue_mod_idP, frameP);
                            if ((check_trigger_meas_event(ue_mod_idP,frameP,eNB_index,i,j,ofn,ocn,hys,ofs,ocs,a3_offset,ttt_ms)) &&
                                (UE_rrc_inst[ue_mod_idP].Info[0].State >= RRC_CONNECTED) &&
                                (UE_rrc_inst[ue_mod_idP].Info[0].T304_active == 0 )      &&
                                (UE_rrc_inst[ue_mod_idP].HandoverInfoUe.measFlag == 1)) {
2583
                                //trigger measurement reporting procedure (36.331, section 5.5.5)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2584 2585
                                if (UE_rrc_inst[ue_mod_idP].measReportList[i][j] == NULL) {
                                    UE_rrc_inst[ue_mod_idP].measReportList[i][j] = malloc(sizeof(MEAS_REPORT_LIST));
2586
                                }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2587 2588
                                UE_rrc_inst[ue_mod_idP].measReportList[i][j]->measId = UE_rrc_inst[ue_mod_idP].MeasId[i][j]->measId;
                                UE_rrc_inst[ue_mod_idP].measReportList[i][j]->numberOfReportsSent = 0;
2589
                                rrc_ue_generate_MeasurementReport(eNB_index, ue_mod_idP,frameP);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2590 2591
                                UE_rrc_inst[ue_mod_idP].HandoverInfoUe.measFlag = 1;
                                LOG_I(RRC,"[UE %d] Frame %d: A3 event detected, state: %d \n", ue_mod_idP, frameP, UE_rrc_inst[ue_mod_idP].Info[0].State);
2592 2593
                            }
                            else {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2594 2595
                                if(UE_rrc_inst[ue_mod_idP].measReportList[i][j] != NULL){
                                    free(UE_rrc_inst[ue_mod_idP].measReportList[i][j]);
2596
                                }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2597
                                UE_rrc_inst[ue_mod_idP].measReportList[i][j] = NULL;
2598 2599 2600
                            }
                            break;
                          case ReportConfigEUTRA__triggerType__event__eventId_PR_eventA4:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2601
                            LOG_D(RRC,"[UE %d] Frame %d : received an A4 event, neighbor becomes offset better than a threshold\n",ue_mod_idP, frameP);
2602 2603
                            break;
                          case ReportConfigEUTRA__triggerType__event__eventId_PR_eventA5:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2604
                            LOG_D(RRC,"[UE %d] Frame %d: received an A5 event, serving becomes worse than threshold 1 and neighbor becomes better than threshold 2\n",ue_mod_idP, frameP);
2605 2606 2607
                            break;
                          default:
                            LOG_D(RRC,"Invalid ReportConfigEUTRA__triggerType__event__eventId: %d",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2608
                                UE_rrc_inst[ue_mod_idP].ReportConfig[i][j]->reportConfig.choice.reportConfigEUTRA.triggerType.present);
2609 2610 2611 2612
                            break;
                          }
                      }
                  }
winckel's avatar
winckel committed
2613 2614
              }
          }
2615 2616 2617 2618
      }
  }
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2619 2620
//check_trigger_meas_event(ue_mod_idP, frameP, eNB_index, i,j,ofn,ocn,hys,ofs,ocs,a3_offset,ttt_ms)
uint8_t check_trigger_meas_event(module_id_t ue_mod_idP,frame_t frameP, uint8_t eNB_index, uint8_t ue_cnx_index, uint8_t meas_index,
2621 2622
    Q_OffsetRange_t ofn, Q_OffsetRange_t ocn, Hysteresis_t hys,
    Q_OffsetRange_t ofs, Q_OffsetRange_t ocs, long a3_offset, TimeToTrigger_t ttt) {
2623 2624
  uint8_t eNB_offset;
  uint8_t currentCellIndex = mac_xface->lte_frame_parms->Nid_cell;
2625
  uint8_t tmp_offset;
2626 2627 2628
  LOG_I(RRC,"[UE %d] ofn(%d) ocn(%d) hys(%d) ofs(%d) ocs(%d) a3_offset(%d) ttt(%d) rssi %3.1f\n",
	ue_mod_idP, 
	ofn,ocn,hys,ofs,ocs,a3_offset,ttt,
2629 2630 2631
	10*log10(mac_xface->get_RSSI(ue_mod_idP,0))-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0));
  for (eNB_offset = 0;eNB_offset<1+mac_xface->get_n_adj_cells(ue_mod_idP,0);eNB_offset++) {
  //for (eNB_offset = 1;(eNB_offset<1+mac_xface->get_n_adj_cells(ue_mod_idP,0));eNB_offset++) {
2632
      /* RHS: Verify that idx 0 corresponds to currentCellIndex in rsrp array */
2633
	  if((eNB_offset!=eNB_index)&&(eNB_offset<NB_eNB_INST)){
2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663
	    if(eNB_offset<eNB_index){
	      tmp_offset = eNB_offset;
	    }
	    else {
	      tmp_offset = eNB_offset-1;
	    }
	    if(UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]+ofn+ocn-hys > UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_index]+ofs+ocs-1/*+a3_offset*/) {
	      UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset] += 2; //Called every subframe = 2ms
	      LOG_D(RRC,"[UE %d] Frame %d: Entry measTimer[%d][%d][%d]: %d currentCell: %d betterCell: %d \n",
		    ue_mod_idP, frameP, ue_cnx_index,meas_index,tmp_offset,UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset],currentCellIndex,eNB_offset);
	    }
	    else {
	      UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset] = 0; //Exit condition: Resetting the measurement timer
	      LOG_D(RRC,"[UE %d] Frame %d: Exit measTimer[%d][%d][%d]: %d currentCell: %d betterCell: %d \n",
		    ue_mod_idP, frameP, ue_cnx_index,meas_index,tmp_offset,UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset],currentCellIndex,eNB_offset);
	    }
	    if (UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset] >= ttt) {
	      UE_rrc_inst->HandoverInfoUe.targetCellId = get_adjacent_cell_id(ue_mod_idP,tmp_offset); //WARNING!!!...check this!
	      LOG_D(RRC,"[UE %d] Frame %d eNB %d: Handover triggered: targetCellId: %d currentCellId: %d eNB_offset: %d rsrp source: %3.1f rsrp target: %3.1f\n", \
		    ue_mod_idP, frameP, eNB_index,
		    UE_rrc_inst->HandoverInfoUe.targetCellId,ue_cnx_index,eNB_offset,
		    (dB_fixed_times10(UE_rrc_inst[ue_mod_idP].rsrp_db[0])/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12),
		    (dB_fixed_times10(UE_rrc_inst[ue_mod_idP].rsrp_db[eNB_offset])/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12));
	      UE_rrc_inst->Info[0].handoverTarget = eNB_offset;
	      //LOG_D(RRC,"PHY_ID: %d \n",UE_rrc_inst->HandoverInfoUe.targetCellId);
	      return 1;
	    }
	    // else{
	    //	LOG_D(RRC,"Condition does not hold\n");
	    // }
2664
	  }
2665 2666 2667 2668
  }
  return 0;
}

2669
#ifdef Rel10
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2670
int decode_MCCH_Message(module_id_t ue_mod_idP, frame_t frameP, uint8_t eNB_index, uint8_t *Sdu, uint8_t Sdu_len,uint8_t mbsfn_sync_area) {
2671

2672
  MCCH_Message_t *mcch=NULL;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2673
  MBSFNAreaConfiguration_r9_t **mcch_message=&UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index];
2674
  asn_dec_rval_t dec_rval;
2675

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2676
  if (UE_rrc_inst[ue_mod_idP].Info[eNB_index].MCCHStatus[mbsfn_sync_area] == 1) {
2677
      LOG_D(RRC,"[UE %d] Frame %d: MCCH MESSAGE for MBSFN sync area %d has been already received!\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2678
          ue_mod_idP, frameP, mbsfn_sync_area);
2679
      return 0; // avoid decoding to prevent memory bloating
2680 2681
  }
  else {
2682 2683 2684 2685 2686 2687
      dec_rval = uper_decode_complete(NULL,
          &asn_DEF_MCCH_Message,
          (void **)&mcch,
          (const void *)Sdu,
          Sdu_len);
      if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2688
          LOG_E(RRC,"[UE %d] Failed to decode MCCH__MESSAGE (%d bits)\n",ue_mod_idP,dec_rval.consumed);
2689 2690 2691 2692
          //free the memory
          SEQUENCE_free(&asn_DEF_MCCH_Message, (void*)mcch, 1);
          return -1;
      }
2693
#ifdef XER_PRINT
2694
      xer_fprint(stdout, &asn_DEF_MCCH_Message, (void*)mcch);
2695 2696
#endif

2697
      if (mcch->message.present == MCCH_MessageType_PR_c1) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2698
          LOG_D(RRC,"[UE %d] Found mcch message \n",ue_mod_idP);
2699 2700
          if(mcch->message.choice.c1.present == MCCH_MessageType__c1_PR_mbsfnAreaConfiguration_r9) {
              /*
winckel's avatar
winckel committed
2701 2702 2703
        memcpy((void*)*mcch_message,
               (void*)&mcch->message.choice.c1.choice.mbsfnAreaConfiguration_r9,
               sizeof(MBSFNAreaConfiguration_r9_t)); */
2704
              *mcch_message = &mcch->message.choice.c1.choice.mbsfnAreaConfiguration_r9;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2705 2706
              LOG_I(RRC,"[UE %d] Frame %d : Found MBSFNAreaConfiguration from eNB %d \n",ue_mod_idP, frameP, eNB_index);
              decode_MBSFNAreaConfiguration(ue_mod_idP,eNB_index,frameP, mbsfn_sync_area);
2707

2708
          }
2709 2710 2711 2712 2713
      }
  }
  return 0;
}

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2714
void decode_MBSFNAreaConfiguration(module_id_t ue_mod_idP, uint8_t eNB_index, frame_t frameP,uint8_t mbsfn_sync_area) {
2715
  LOG_D(RRC,"[UE %d] Frame %d : Number of MCH(s) in the MBSFN Sync Area %d  is %d\n", 
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2716
      ue_mod_idP, frameP, mbsfn_sync_area, UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9.list.count);
2717
  //  store to MAC/PHY necessary parameters for receiving MTCHs
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2718
  rrc_mac_config_req(ue_mod_idP,ENB_FLAG_NO,0,eNB_index,
2719 2720
      (RadioResourceConfigCommonSIB_t *)NULL,
      (struct PhysicalConfigDedicated *)NULL,
2721 2722 2723 2724
#ifdef Rel10
	(SCellToAddMod_r10_t *)NULL,
	//(struct PhysicalConfigDedicatedSCell_r10 *)NULL,
#endif
2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737
      (MeasObjectToAddMod_t **)NULL,
      (MAC_MainConfig_t *)NULL,
      0,
      (struct LogicalChannelConfig *)NULL,
      (MeasGapConfig_t *)NULL,
      (TDD_Config_t *)NULL,
      (MobilityControlInfo_t *)NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      (MBSFN_SubframeConfigList_t *)NULL
2738
#ifdef Rel10	       
2739 2740 2741
,
0,
(MBSFN_AreaInfoList_r9_t *)NULL,
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2742
&UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9
2743 2744
#endif
#ifdef CBA
2745 2746 2747
,
0,
0
2748
#endif
2749
  );
2750

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2751
  UE_rrc_inst[ue_mod_idP].Info[eNB_index].MCCHStatus[mbsfn_sync_area] = 1;
2752

2753
  // Config Radio Bearer for MBMS user data (similar way to configure for eNB side in init_MBMS function)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2754
  rrc_pdcp_config_asn1_req(eNB_index, ue_mod_idP, frameP, 0,
2755 2756 2757 2758 2759 2760 2761
      NULL, // SRB_ToAddModList
      NULL, // DRB_ToAddModList
      (DRB_ToReleaseList_t*)NULL,
      0, // security mode
      NULL, // key rrc encryption
      NULL, // key rrc integrity
      NULL // key encryption
2762
#ifdef Rel10
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2763
      ,&(UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9)
2764
#endif
2765
  );
winckel's avatar
winckel committed
2766

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2767
  rrc_rlc_config_asn1_req(eNB_index, ue_mod_idP, frameP,0,
2768 2769 2770
      NULL,// SRB_ToAddModList
      NULL,// DRB_ToAddModList
      NULL,// DRB_ToReleaseList
2771
#ifdef Rel10
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2772
      &(UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9)
2773
#endif 
2774
  );
2775
  // */
2776

2777 2778 2779 2780 2781 2782 2783
}

#endif // rel10

#ifndef USER_MODE
EXPORT_SYMBOL(Rlc_info_am_config);
#endif
2784 2785 2786

#if defined(ENABLE_ITTI)
void *rrc_ue_task(void *args_p) {
2787 2788 2789
  MessageDef   *msg_p;
  const char   *msg_name;
  instance_t    instance;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2790
  unsigned int  ue_mod_id;
2791 2792
  int           result;
  SRB_INFO     *srb_info_p;
2793 2794 2795 2796

  itti_mark_task_ready (TASK_RRC_UE);

  while(1) {
2797 2798
      // Wait for a message
      itti_receive_msg (TASK_RRC_UE, &msg_p);
2799

2800 2801
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2802
      ue_mod_id = instance - NB_eNB_INST;
2803

2804
      switch (ITTI_MSG_ID(msg_p)) {
2805 2806 2807 2808 2809
      case TERMINATE_MESSAGE:
        itti_exit_task ();
        break;

      case MESSAGE_TEST:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2810
        LOG_I(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name);
2811 2812
        break;

2813
        /* MAC messages */
2814
      case RRC_MAC_IN_SYNC_IND:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2815
        LOG_D(RRC, "[UE %d] Received %s: frameP %d, eNB %d\n", ue_mod_id, msg_name,
2816
            RRC_MAC_IN_SYNC_IND (msg_p).frame, RRC_MAC_IN_SYNC_IND (msg_p).enb_index);
2817

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2818 2819 2820
        UE_rrc_inst[ue_mod_id].Info[RRC_MAC_IN_SYNC_IND (msg_p).enb_index].N310_cnt = 0;
        if (UE_rrc_inst[ue_mod_id].Info[RRC_MAC_IN_SYNC_IND (msg_p).enb_index].T310_active == 1)
          UE_rrc_inst[ue_mod_id].Info[RRC_MAC_IN_SYNC_IND (msg_p).enb_index].N311_cnt++;
2821 2822 2823
        break;

      case RRC_MAC_OUT_OF_SYNC_IND:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2824
        LOG_I(RRC, "[UE %d] Received %s: frameP %d, eNB %d\n", ue_mod_id, msg_name,
2825
            RRC_MAC_OUT_OF_SYNC_IND (msg_p).frame, RRC_MAC_OUT_OF_SYNC_IND (msg_p).enb_index);
2826

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2827
        UE_rrc_inst[ue_mod_id].Info[RRC_MAC_OUT_OF_SYNC_IND (msg_p).enb_index].N310_cnt ++;
2828 2829 2830
        break;

      case RRC_MAC_BCCH_DATA_IND:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2831
        LOG_D(RRC, "[UE %d] Received %s: frameP %d, eNB %d\n", ue_mod_id, msg_name,
2832
            RRC_MAC_BCCH_DATA_IND (msg_p).frame, RRC_MAC_BCCH_DATA_IND (msg_p).enb_index);
2833

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2834
        decode_BCCH_DLSCH_Message (ue_mod_id, RRC_MAC_BCCH_DATA_IND (msg_p).frame,
2835 2836 2837
            RRC_MAC_BCCH_DATA_IND (msg_p).enb_index, RRC_MAC_BCCH_DATA_IND (msg_p).sdu,
            RRC_MAC_BCCH_DATA_IND (msg_p).sdu_size,
            RRC_MAC_BCCH_DATA_IND (msg_p).rsrq, RRC_MAC_BCCH_DATA_IND (msg_p).rsrp);
2838
        break;
2839

2840
      case RRC_MAC_CCCH_DATA_CNF:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2841
        LOG_I(RRC, "[UE %d] Received %s: eNB %d\n", ue_mod_id, msg_name,
2842
            RRC_MAC_CCCH_DATA_CNF (msg_p).enb_index);
2843 2844

        // reset the tx buffer to indicate RRC that ccch was successfully transmitted (for example if contention resolution succeeds)
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2845
        UE_rrc_inst[ue_mod_id].Srb0[RRC_MAC_CCCH_DATA_CNF (msg_p).enb_index].Tx_buffer.payload_size = 0;
2846 2847 2848
        break;

      case RRC_MAC_CCCH_DATA_IND:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2849
        LOG_I(RRC, "[UE %d] Received %s: frameP %d, eNB %d\n", ue_mod_id, msg_name,
2850
            RRC_MAC_CCCH_DATA_IND (msg_p).frame, RRC_MAC_CCCH_DATA_IND (msg_p).enb_index);
2851

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2852
        srb_info_p = &UE_rrc_inst[ue_mod_id].Srb0[RRC_MAC_CCCH_DATA_IND (msg_p).enb_index];
2853

2854
        memcpy (srb_info_p->Rx_buffer.Payload, RRC_MAC_CCCH_DATA_IND (msg_p).sdu,
2855
            RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size);
2856
        srb_info_p->Rx_buffer.payload_size = RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2857
        rrc_ue_decode_ccch (ue_mod_id, RRC_MAC_CCCH_DATA_IND (msg_p).frame, srb_info_p,
2858
            RRC_MAC_CCCH_DATA_IND (msg_p).enb_index);
2859 2860
        break;

2861
# ifdef Rel10
2862
      case RRC_MAC_MCCH_DATA_IND:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2863
        LOG_I(RRC, "[UE %d] Received %s: frameP %d, eNB %d, mbsfn SA %d\n", ue_mod_id, msg_name,
2864
            RRC_MAC_MCCH_DATA_IND (msg_p).frame, RRC_MAC_MCCH_DATA_IND (msg_p).enb_index, RRC_MAC_MCCH_DATA_IND (msg_p).mbsfn_sync_area);
2865

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2866
        decode_MCCH_Message (ue_mod_id, RRC_MAC_MCCH_DATA_IND (msg_p).frame, RRC_MAC_MCCH_DATA_IND (msg_p).enb_index,
2867 2868
            RRC_MAC_MCCH_DATA_IND (msg_p).sdu, RRC_MAC_MCCH_DATA_IND (msg_p).sdu_size,
            RRC_MAC_MCCH_DATA_IND (msg_p).mbsfn_sync_area);
2869
        break;
2870
# endif
2871

2872
/* PDCP messages */
2873
      case RRC_DCCH_DATA_IND:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2874
        LOG_I(RRC, "[UE %d] Received %s: frameP %d, DCCH %d, eNB %d\n", ue_mod_id, msg_name,
2875
            RRC_DCCH_DATA_IND (msg_p).frame, RRC_DCCH_DATA_IND (msg_p).dcch_index, RRC_DCCH_DATA_IND (msg_p).eNB_index);
2876

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2877
        rrc_ue_decode_dcch (ue_mod_id, RRC_DCCH_DATA_IND (msg_p).frame,
2878 2879
            RRC_DCCH_DATA_IND (msg_p).dcch_index, RRC_DCCH_DATA_IND (msg_p).sdu_p,
            RRC_DCCH_DATA_IND (msg_p).eNB_index);
2880 2881

        // Message buffer has been processed, free it now.
2882 2883
        result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_IND (msg_p).sdu_p);
        AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
2884 2885
        break;

2886
# if defined(ENABLE_USE_MME)
2887
        /* NAS messages */
winckel's avatar
winckel committed
2888
      case NAS_CELL_SELECTION_REQ:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2889
        ue_mod_id = 0; /* TODO force ue_mod_id to first UE, NAS UE not virtualized yet */
2890

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2891
        LOG_I(RRC, "[UE %d] Received %s: state %d, plmnID %d, rat %x\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id),
2892
            NAS_CELL_SELECTION_REQ (msg_p).plmnID, NAS_CELL_SELECTION_REQ (msg_p).rat);
2893

2894 2895 2896 2897 2898
        if (rrc_get_state(ue_mod_id) == RRC_STATE_INACTIVE) {
            // have a look at MAC/main.c void dl_phy_sync_success(...)
            openair_rrc_ue_init(ue_mod_id,0);
        }

2899 2900
        /* Save cell selection criterion */
        {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2901 2902
          UE_rrc_inst[ue_mod_id].plmnID = NAS_CELL_SELECTION_REQ (msg_p).plmnID;
          UE_rrc_inst[ue_mod_id].rat = NAS_CELL_SELECTION_REQ (msg_p).rat;
2903
        }
2904

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2905
        switch (rrc_get_state(ue_mod_id)) {
2906 2907 2908 2909
        case RRC_STATE_INACTIVE:
          {
            /* Need to first activate lower layers */
            MessageDef *message_p;
2910

2911
            message_p = itti_alloc_new_message(TASK_RRC_UE, ACTIVATE_MESSAGE);
2912

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2913
            itti_send_msg_to_task(TASK_L2L1, NB_eNB_INST + ue_mod_id, message_p);
2914

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2915
            rrc_set_state (ue_mod_id, RRC_STATE_IDLE);
2916 2917
            /* Fall through to next case */
          }
winckel's avatar
winckel committed
2918

2919 2920 2921 2922
        case RRC_STATE_IDLE:
          {
            /* Ask to layer 1 to find a cell matching the criterion */
            MessageDef *message_p;
winckel's avatar
winckel committed
2923

2924
            message_p = itti_alloc_new_message(TASK_RRC_UE, PHY_FIND_CELL_REQ);
winckel's avatar
winckel committed
2925

2926 2927
            PHY_FIND_CELL_REQ (message_p).earfcn_start = 1;
            PHY_FIND_CELL_REQ (message_p).earfcn_end = 1;
winckel's avatar
winckel committed
2928

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2929 2930
            itti_send_msg_to_task(TASK_PHY_UE, NB_eNB_INST + ue_mod_id, message_p);
            rrc_set_sub_state (ue_mod_id, RRC_SUB_STATE_IDLE_SEARCHING);
winckel's avatar
winckel committed
2931

2932 2933
            break;
          }
2934

2935 2936
        case RRC_STATE_CONNECTED:
          /* should not happen */
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2937
          LOG_E(RRC, "[UE %d] request %s in RRC state %d\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id));
2938
          break;
2939

2940
        default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2941
          LOG_C(RRC, "[UE %d] Invalid RRC state %d\n", ue_mod_id, rrc_get_state(ue_mod_id));
winckel's avatar
winckel committed
2942
          break;
2943 2944
        }
        break;
winckel's avatar
winckel committed
2945

2946
        case NAS_CONN_ESTABLI_REQ:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2947
          LOG_I(RRC, "[UE %d] Received %s: cause %d, type %d, s_tmsi %d, plmnID %d\n", ue_mod_id, msg_name, NAS_CONN_ESTABLI_REQ (msg_p).cause,
2948
              NAS_CONN_ESTABLI_REQ (msg_p).type, NAS_CONN_ESTABLI_REQ (msg_p).s_tmsi, NAS_CONN_ESTABLI_REQ (msg_p).plmnID);
winckel's avatar
winckel committed
2949

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2950
          UE_rrc_inst[ue_mod_id].initialNasMsg = NAS_CONN_ESTABLI_REQ (msg_p).initialNasMsg;
winckel's avatar
winckel committed
2951

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2952
          switch (rrc_get_state(ue_mod_id)) {
2953 2954
          case RRC_STATE_IDLE:
            {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2955
              if (rrc_get_sub_state(ue_mod_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE)
2956
                {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2957
                  rrc_ue_generate_RRCConnectionRequest(ue_mod_id, 0 /* TODO put frameP number ! */, 0);
2958
                  LOG_I(RRC, "not sending connection request\n");
winckel's avatar
winckel committed
2959

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2960
                  rrc_set_sub_state (ue_mod_id, RRC_SUB_STATE_IDLE_CONNECTING);
2961 2962 2963
                }
              break;
            }
winckel's avatar
winckel committed
2964

2965 2966 2967
          case RRC_STATE_INACTIVE:
          case RRC_STATE_CONNECTED:
            /* should not happen */
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2968
            LOG_E(RRC, "[UE %d] request %s in RRC state %d\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id));
2969
            break;
winckel's avatar
winckel committed
2970

2971
          default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2972
            LOG_C(RRC, "[UE %d] Invalid RRC state %d\n", ue_mod_id, rrc_get_state(ue_mod_id));
2973
            break;
winckel's avatar
winckel committed
2974
          }
winckel's avatar
winckel committed
2975 2976
          break;

2977 2978 2979 2980
          case NAS_UPLINK_DATA_REQ:
            {
              uint32_t length;
              uint8_t *buffer;
winckel's avatar
RRC:  
winckel committed
2981

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2982
              LOG_I(RRC, "[UE %d] Received %s: UEid %d\n", ue_mod_id, msg_name, NAS_UPLINK_DATA_REQ (msg_p).UEid);
winckel's avatar
RRC:  
winckel committed
2983

2984 2985
              /* Create message for PDCP (ULInformationTransfer_t) */
              length = do_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.data);
winckel's avatar
RRC:  
winckel committed
2986

2987
              /* Transfer data to PDCP */
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2988
              pdcp_rrc_data_req (0, ue_mod_id, 0 /* TODO put frameP number ! */, 0, DCCH, rrc_mui++, 0, length, buffer, 1);
2989 2990
              break;
            }
2991
# endif
winckel's avatar
RRC:  
winckel committed
2992

2993
# if defined(ENABLE_RAL)
2994
          case RRC_RAL_SCAN_REQ:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2995
            LOG_I(RRC, "[UE %d] Received %s: state %d\n", ue_mod_id, msg_name);
2996

Lionel Gauthier's avatar
 
Lionel Gauthier committed
2997
            switch (rrc_get_state(ue_mod_id)) {
2998
            case RRC_STATE_INACTIVE:
2999
              {
3000 3001
                /* Need to first activate lower layers */
                MessageDef *message_p;
3002

3003
                message_p = itti_alloc_new_message(TASK_RRC_UE, ACTIVATE_MESSAGE);
3004

3005
                itti_send_msg_to_task(TASK_L2L1, instance, message_p);
3006

Lionel Gauthier's avatar
 
Lionel Gauthier committed
3007
                rrc_set_state (ue_mod_id, RRC_STATE_IDLE);
3008
                /* Fall through to next case */
3009 3010
              }

3011
            case RRC_STATE_IDLE:
3012
              {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3013
                if (rrc_get_sub_state(ue_mod_id) != RRC_SUB_STATE_IDLE_SEARCHING) {
3014 3015
                    /* Ask to layer 1 to find a cell matching the criterion */
                    MessageDef *message_p;
3016

3017
                    message_p = itti_alloc_new_message(TASK_RRC_UE, PHY_FIND_CELL_REQ);
3018

Lionel Gauthier's avatar
 
Lionel Gauthier committed
3019
                    rrc_set_sub_state (ue_mod_id, RRC_SUB_STATE_IDLE_SEARCHING);
3020

3021 3022 3023
                    PHY_FIND_CELL_REQ (message_p).transaction_id = RRC_RAL_SCAN_REQ (msg_p).transaction_id;
                    PHY_FIND_CELL_REQ (message_p).earfcn_start   = 1;
                    PHY_FIND_CELL_REQ (message_p).earfcn_end     = 1; //44
3024

3025 3026 3027
                    itti_send_msg_to_task(TASK_PHY_UE, instance, message_p);
                }
                break;
3028 3029
              }

3030 3031
            case RRC_STATE_CONNECTED:
              /* should not happen */
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3032
              LOG_E(RRC, "[UE %d] request %s in RRC state %d\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id));
3033
              break;
3034

3035
            default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3036
              LOG_C(RRC, "[UE %d] Invalid RRC state %d\n", ue_mod_id, rrc_get_state(ue_mod_id));
3037 3038 3039
              break;
            }
            break;
3040

3041
            case PHY_FIND_CELL_IND:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3042 3043
              LOG_I(RRC, "[UE %d] Received %s: state %d\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id));
              switch (rrc_get_state(ue_mod_id)) {
3044
              case RRC_STATE_IDLE:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3045
                switch (rrc_get_sub_state(ue_mod_id)) {
3046 3047 3048 3049
                case RRC_SUB_STATE_IDLE_SEARCHING:
                  {
                    MessageDef *message_p;
                    int         i;
3050

3051
                    message_p = itti_alloc_new_message(TASK_RRC_UE, RRC_RAL_SCAN_CONF);
3052

3053 3054 3055 3056 3057 3058 3059
                    RRC_RAL_SCAN_CONF (message_p).transaction_id = PHY_FIND_CELL_IND(msg_p).transaction_id;
                    RRC_RAL_SCAN_CONF (message_p).num_scan_resp  = PHY_FIND_CELL_IND(msg_p).cell_nb;
                    for (i = 0 ; i < PHY_FIND_CELL_IND(msg_p).cell_nb; i++) {
                        // TO DO
                        memset(&RRC_RAL_SCAN_CONF (message_p).link_scan_resp[i].link_addr,  0, sizeof(ral_link_addr_t));
                        // TO DO
                        memset(&RRC_RAL_SCAN_CONF (message_p).link_scan_resp[i].network_id, 0, sizeof(ral_network_id_t));
3060

3061 3062 3063
                        RRC_RAL_SCAN_CONF (message_p).link_scan_resp[i].sig_strength.choice     = RAL_SIG_STRENGTH_CHOICE_DBM;
                        RRC_RAL_SCAN_CONF (message_p).link_scan_resp[i].sig_strength._union.dbm = PHY_FIND_CELL_IND(msg_p).cells[i].rsrp;
                    }
3064

Lionel Gauthier's avatar
 
Lionel Gauthier committed
3065
                    rrc_set_sub_state (ue_mod_id, RRC_SUB_STATE_IDLE);
3066

3067 3068
                    itti_send_msg_to_task(TASK_RAL_UE, instance, message_p);
                    break;
3069 3070
                  }

3071 3072
                default:
                  LOG_C(RRC, "[UE %d] Invalid RRC state %d substate %d\n",
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3073 3074 3075
                      ue_mod_id,
                      rrc_get_state(ue_mod_id),
                      rrc_get_sub_state(ue_mod_id));
3076 3077 3078 3079 3080
                }
                break;

                case RRC_STATE_INACTIVE:
                case RRC_STATE_CONNECTED:
3081
                  /* should not happen */
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3082
                  LOG_E(RRC, "[UE %d] indication %s in RRC state %d\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id));
3083 3084
                  break;

3085
                default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3086
                  LOG_C(RRC, "[UE %d] Invalid RRC state %d\n", ue_mod_id, rrc_get_state(ue_mod_id));
3087
                  break;
3088
              }
3089
              break; // PHY_FIND_CELL_IND
3090

3091 3092 3093 3094
              case PHY_MEAS_REPORT_IND:
                {
                  MessageDef *message_p;
                  message_p = itti_alloc_new_message(TASK_RRC_UE, RRC_RAL_MEASUREMENT_REPORT_IND);
3095

3096 3097 3098
                  memcpy(&RRC_RAL_MEASUREMENT_REPORT_IND (message_p).threshold,
                      &PHY_MEAS_REPORT_IND(msg_p).threshold,
                      sizeof(RRC_RAL_MEASUREMENT_REPORT_IND (message_p).threshold));
3099

3100 3101 3102
                  memcpy(&RRC_RAL_MEASUREMENT_REPORT_IND (message_p).link_param,
                      &PHY_MEAS_REPORT_IND(msg_p).link_param,
                      sizeof(RRC_RAL_MEASUREMENT_REPORT_IND (message_p).link_param));
3103 3104
		
		  LOG_I(RRC, "[UE %d] PHY_MEAS_REPORT_IN: sending msg %s to %s \n", ue_mod_id, "RRC_RAL_MEASUREMENT_REPORT_IND", "TASK_RAL_UE");
3105 3106 3107
                  itti_send_msg_to_task(TASK_RAL_UE, instance, message_p);
                  break;
                }
3108

3109
              case RRC_RAL_CONFIGURE_THRESHOLD_REQ:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3110
                rrc_ue_ral_handle_configure_threshold_request(ue_mod_id, msg_p);
3111
                break;
3112

3113
              case RRC_RAL_CONNECTION_ESTABLISHMENT_REQ:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3114 3115
                LOG_I(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name);
                switch (rrc_get_state(ue_mod_id)) {
3116
                case RRC_STATE_IDLE:
3117
                  {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3118
                    if (rrc_get_sub_state(ue_mod_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE)
3119
                      {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3120
                        rrc_ue_generate_RRCConnectionRequest(ue_mod_id, 0 /* TODO put frameP number ! */, 0);
3121
                        LOG_I(RRC, "not sending connection request\n");
3122

Lionel Gauthier's avatar
 
Lionel Gauthier committed
3123
                        rrc_set_sub_state (ue_mod_id, RRC_SUB_STATE_IDLE_CONNECTING);
3124 3125
                      }
                    break;
3126 3127
                  }

3128 3129
                case RRC_STATE_INACTIVE:
                case RRC_STATE_CONNECTED:
3130
                  /* should not happen */
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3131
                  LOG_E(RRC, "[UE %d] request %s in RRC state %d\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id));
3132 3133
                  break;

3134
                default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3135
                  LOG_C(RRC, "[UE %d] Invalid RRC state %d\n", ue_mod_id, rrc_get_state(ue_mod_id));
3136
                  break;
3137 3138
                }
                break;
3139

3140
                case RRC_RAL_CONNECTION_RELEASE_REQ:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3141 3142
                  ue_mod_id = 0; /* TODO force ue_mod_id to first UE, NAS UE not virtualized yet */
                  LOG_I(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name);
3143
                  break;
Lionel Gauthier's avatar
Lionel Gauthier committed
3144
#endif
3145

3146
                default:
Lionel Gauthier's avatar
 
Lionel Gauthier committed
3147
                  LOG_E(RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, msg_name);
3148 3149
                  break;
      }
3150

3151 3152 3153 3154
      result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
      AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
      AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
      msg_p = NULL;
3155 3156 3157
  }
}
#endif