main.c 17.4 KB
Newer Older
1
/*******************************************************************************
nikaeinn's avatar
nikaeinn committed
2
3
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom
4

nikaeinn's avatar
nikaeinn committed
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


nikaeinn's avatar
nikaeinn committed
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

nikaeinn's avatar
nikaeinn committed
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
nikaeinn's avatar
nikaeinn committed
22
23
24
25
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
  OpenAirInterface Dev  : openair4g-devel@eurecom.fr

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

nikaeinn's avatar
nikaeinn committed
28
*******************************************************************************/
29
/*! \file main.c
gauthier's avatar
gauthier committed
30
 * \brief top init of Layer 2
31
32
 * \author  Navid Nikaein and Raymond Knopp 
 * \date 2010 - 2014
nikaeinn's avatar
nikaeinn committed
33
 * \version 1.0
gauthier's avatar
gauthier committed
34
35
 * \email: navid.nikaein@eurecom.fr
 * @ingroup _mac
36

gauthier's avatar
gauthier committed
37
 */
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

#ifdef USER_MODE
#include "LAYER2/register.h"
#else
#ifdef KERNEL2_6
//#include <linux/config.h>
#include <linux/slab.h>
#endif

#ifdef KERNEL2_4
#include <linux/malloc.h>
#include <linux/wrapper.h>
#endif


#endif //USER_MODE

#include "defs.h"
56
#include "proto.h"
57
#include "extern.h"
gauthier's avatar
gauthier committed
58
#include "assertions.h"
59
60
61
62
#include "PHY_INTERFACE/extern.h"
#include "PHY_INTERFACE/defs.h"
#include "PHY/defs.h"
#include "SCHED/defs.h"
gauthier's avatar
gauthier committed
63
#include "LAYER2/PDCP_v10.1.0/pdcp.h"
64
65
66
67
68
69
70
71
72
#include "RRC/LITE/defs.h"
#include "UTIL/LOG/log.h"
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
#ifdef PHY_EMUL
#include "SIMULATION/simulation_defs.h"
#endif //PHY_EMUL

#include "SCHED/defs.h"

gauthier's avatar
gauthier committed
73
74
75
void dl_phy_sync_success(module_id_t   module_idP,
    frame_t       frameP,
    unsigned char eNB_index,
gauthier's avatar
gauthier committed
76
    uint8_t            first_sync){  //init as MR
gauthier's avatar
gauthier committed
77
  LOG_D(MAC,"[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n", module_idP, frameP, eNB_index);
78
  if (first_sync==1) {
gauthier's avatar
gauthier committed
79
80
      layer2_init_UE(module_idP);
      openair_rrc_ue_init(module_idP,eNB_index);
81
82
  }
  else {
gauthier's avatar
gauthier committed
83
      mac_in_sync_ind(module_idP,frameP,eNB_index);
84
  }
gauthier's avatar
gauthier committed
85

86
87
}

gauthier's avatar
gauthier committed
88
void mrbch_phy_sync_failure(module_id_t module_idP, frame_t frameP, uint8_t free_eNB_index){//init as CH
89

gauthier's avatar
gauthier committed
90
91
92
  LOG_I(MAC,"[eNB %d] Frame %d: PHY Sync failure \n",module_idP,frameP);
  layer2_init_eNB(module_idP, free_eNB_index);
  openair_rrc_eNB_init(module_idP);
93
94
}

gauthier's avatar
gauthier committed
95
char layer2_init_eNB(module_id_t module_idP, unsigned char eNB_index){
96
97
98
99
100

  return 0;

}

gauthier's avatar
gauthier committed
101
102
char layer2_init_UE(module_id_t module_idP){

103
104
105
  return 0;
}

gauthier's avatar
gauthier committed
106
void mac_UE_out_of_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index){
107

gauthier's avatar
gauthier committed
108
  //  Mac_rlc_xface->mac_out_of_sync_ind(Mod_id, frameP, eNB_index);
109
110
111
}


gauthier's avatar
gauthier committed
112
int mac_top_init(int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active){
113

gauthier's avatar
gauthier committed
114
  module_id_t    Mod_id,i,j;
115
116
  RA_TEMPLATE *RA_template;
  UE_TEMPLATE *UE_template;
117
  int size_bytes1,size_bytes2,size_bits1,size_bits2;
knopp's avatar
   
knopp committed
118
119
120
  int CC_id;
  int list_el;
  UE_list_t *UE_list;
121
122
123

  LOG_I(MAC,"[MAIN] Init function start:Nb_UE_INST=%d\n",NB_UE_INST);
  if (NB_UE_INST>0) {
gauthier's avatar
gauthier committed
124
125
126
127
128
129
130
131
132
133
134
      UE_mac_inst = (UE_MAC_INST*)malloc16(NB_UE_INST*sizeof(UE_MAC_INST));
      if (UE_mac_inst == NULL) {
          LOG_C(MAC,"[MAIN] Can't ALLOCATE %d Bytes for %d UE_MAC_INST with size %d \n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,sizeof(UE_MAC_INST));
          mac_xface->macphy_exit("[MAC][MAIN] not enough memory for UEs \n");
      }
      LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d UE_MAC_INST @ %p\n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,UE_mac_inst);

      bzero(UE_mac_inst,NB_UE_INST*sizeof(UE_MAC_INST));
      for(i=0;i<NB_UE_INST; i++)
        ue_init_mac(i);

135
136
137
  }
  else 
    UE_mac_inst = NULL;
gauthier's avatar
gauthier committed
138

139
140
  LOG_I(MAC,"[MAIN] Init function start:Nb_eNB_INST=%d\n",NB_eNB_INST);
  if (NB_eNB_INST>0) {
gauthier's avatar
gauthier committed
141
142
      eNB_mac_inst = (eNB_MAC_INST*)malloc16(NB_eNB_INST*sizeof(eNB_MAC_INST));
      if (eNB_mac_inst == NULL){
knopp's avatar
   
knopp committed
143
          LOG_D(MAC,"[MAIN] can't ALLOCATE %d Bytes for %d eNB_MAC_INST with size %d \n",NB_eNB_INST*sizeof(eNB_MAC_INST*),NB_eNB_INST,sizeof(eNB_MAC_INST));
gauthier's avatar
gauthier committed
144
145
          mac_xface->macphy_exit("[MAC][MAIN] not enough memory for eNB \n");
      }
knopp's avatar
   
knopp committed
146
147
148
149
      else{
	LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d eNB_MAC_INST @ %p\n",sizeof(eNB_MAC_INST),NB_eNB_INST,eNB_mac_inst);
	bzero(eNB_mac_inst,NB_eNB_INST*sizeof(eNB_MAC_INST));
      }
150
151
152
  }
  else
    eNB_mac_inst = NULL;
gauthier's avatar
gauthier committed
153

knopp's avatar
   
knopp committed
154
  // Initialize Linked-List for Active UEs
155
  for(Mod_id=0;Mod_id<NB_eNB_INST;Mod_id++){
knopp's avatar
   
knopp committed
156
157
158
159
    UE_list = &eNB_mac_inst[Mod_id].UE_list;

    UE_list->num_UEs=0;
    UE_list->head=-1;
160
    UE_list->head_ul=-1; 
knopp's avatar
   
knopp committed
161
162
163
    UE_list->avail=0;
    for (list_el=0;list_el<NUMBER_OF_UE_MAX-1;list_el++) {
      UE_list->next[list_el]=list_el+1;
164
      UE_list->next_ul[list_el]=list_el+1;
knopp's avatar
   
knopp committed
165
166
    }
    UE_list->next[list_el]=-1;
167
    UE_list->next_ul[list_el]=-1;
knopp's avatar
   
knopp committed
168
    
169
#ifdef PHY_EMUL
knopp's avatar
   
knopp committed
170
    Mac_rlc_xface->Is_cluster_head[Mod_id]=2;//0: MR, 1: CH, 2: not CH neither MR
171
#endif
gauthier's avatar
gauthier committed
172
      /*#ifdef Rel10
173
174
175
176
    int n;
    for (n=0;n<4096;n++)
      eNB_mac_inst[Mod_id].MCH_pdu.payload[n] = taus();
    //    Mac_rlc_xface->Node_id[Mod_id]=NODE_ID[Mod_id];
177
    #endif*/
178
179
180
181
182
  }
  //  Mac_rlc_xface->frame=Mac_rlc_xface->frame;


  if (Is_rrc_registered == 1){
gauthier's avatar
gauthier committed
183
      LOG_I(MAC,"[MAIN] calling RRC\n");
184
#ifndef CELLULAR //nothing to be done yet for cellular
gauthier's avatar
gauthier committed
185
      openair_rrc_top_init(eMBMS_active, cba_group_active,HO_active);
186
187
#endif
  }
gauthier's avatar
gauthier committed
188
  else {
189
      LOG_I(MAC,"[MAIN] Running without an RRC\n");
gauthier's avatar
gauthier committed
190
  }
191
192
193
#ifndef USER_MODE
#ifndef PHY_EMUL
  LOG_I(MAC,"[MAIN] add openair2 proc\n");
gauthier's avatar
gauthier committed
194
  ////  add_openair2_stats();
195
196
197
#endif
#endif

nikaeinn's avatar
nikaeinn committed
198
  //init_transport_channels(2);
199
200
201

  // Set up DCIs for TDD 5MHz Config 1..6

knopp's avatar
   
knopp committed
202
203
  for (i=0;i<NB_eNB_INST;i++) 
    for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
gauthier's avatar
gauthier committed
204
205
206
      LOG_D(MAC,"[MAIN][eNB %d] initializing RA_template\n",i);
      LOG_D(MAC, "[MSC_NEW][FRAME 00000][MAC_eNB][MOD %02d][]\n", i);

knopp's avatar
   
knopp committed
207
      RA_template = (RA_TEMPLATE *)&eNB_mac_inst[i].common_channels[CC_id].RA_template[0];
gauthier's avatar
gauthier committed
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
      for (j=0;j<NB_RA_PROC_MAX;j++) {
          if (mac_xface->lte_frame_parms->frame_type == TDD) {
              switch (mac_xface->lte_frame_parms->N_RB_DL) {
              case 6:
                size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
                size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
                size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
                size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
                break;
              case 25:
                size_bytes1 = sizeof(DCI1A_5MHz_TDD_1_6_t);
                size_bytes2 = sizeof(DCI1A_5MHz_TDD_1_6_t);
                size_bits1 = sizeof_DCI1A_5MHz_TDD_1_6_t;
                size_bits2 = sizeof_DCI1A_5MHz_TDD_1_6_t;
                break;
              case 50:
                size_bytes1 = sizeof(DCI1A_10MHz_TDD_1_6_t);
                size_bytes2 = sizeof(DCI1A_10MHz_TDD_1_6_t);
                size_bits1 = sizeof_DCI1A_10MHz_TDD_1_6_t;
                size_bits2 = sizeof_DCI1A_10MHz_TDD_1_6_t;
                break;
              case 100:
                size_bytes1 = sizeof(DCI1A_20MHz_TDD_1_6_t);
                size_bytes2 = sizeof(DCI1A_20MHz_TDD_1_6_t);
                size_bits1 = sizeof_DCI1A_20MHz_TDD_1_6_t;
                size_bits2 = sizeof_DCI1A_20MHz_TDD_1_6_t;
                break;
              default:
                size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
                size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
                size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
                size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
                break;
              }

          }
          else {
              switch (mac_xface->lte_frame_parms->N_RB_DL) {
              case 6:
                size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t);
                size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t);
                size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t;
                size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t;
                break;
              case 25:
                size_bytes1 = sizeof(DCI1A_5MHz_FDD_t);
                size_bytes2 = sizeof(DCI1A_5MHz_FDD_t);
                size_bits1 = sizeof_DCI1A_5MHz_FDD_t;
                size_bits2 = sizeof_DCI1A_5MHz_FDD_t;
                break;
              case 50:
                size_bytes1 = sizeof(DCI1A_10MHz_FDD_t);
                size_bytes2 = sizeof(DCI1A_10MHz_FDD_t);
                size_bits1 = sizeof_DCI1A_10MHz_FDD_t;
                size_bits2 = sizeof_DCI1A_10MHz_FDD_t;
                break;
              case 100:
                size_bytes1 = sizeof(DCI1A_20MHz_FDD_t);
                size_bytes2 = sizeof(DCI1A_20MHz_FDD_t);
                size_bits1 = sizeof_DCI1A_20MHz_FDD_t;
                size_bits2 = sizeof_DCI1A_20MHz_FDD_t;
                break;
              default:
                size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t);
                size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t);
                size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t;
                size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t;
                break;
              }
          }
          memcpy((void *)&RA_template[j].RA_alloc_pdu1[0],(void *)&RA_alloc_pdu,size_bytes1);
          memcpy((void *)&RA_template[j].RA_alloc_pdu2[0],(void *)&DLSCH_alloc_pdu1A,size_bytes2);
          RA_template[j].RA_dci_size_bytes1 = size_bytes1;
          RA_template[j].RA_dci_size_bytes2 = size_bytes2;
          RA_template[j].RA_dci_size_bits1  = size_bits1;
          RA_template[j].RA_dci_size_bits2  = size_bits2;

          RA_template[j].RA_dci_fmt1        = format1A;
          RA_template[j].RA_dci_fmt2        = format1A;
287
      }
gauthier's avatar
gauthier committed
288
289

      memset (&eNB_mac_inst[i].eNB_stats,0,sizeof(eNB_STATS));
knopp's avatar
   
knopp committed
290
      UE_template = (UE_TEMPLATE *)&eNB_mac_inst[i].UE_list.UE_template[CC_id][0];
gauthier's avatar
gauthier committed
291
292
293
      for (j=0;j<NUMBER_OF_UE_MAX;j++) {
          UE_template[j].rnti=0;
          // initiallize the eNB to UE statistics
knopp's avatar
   
knopp committed
294
          memset (&eNB_mac_inst[i].UE_list.eNB_UE_stats[CC_id][j],0,sizeof(eNB_UE_STATS));
295
      }
knopp's avatar
   
knopp committed
296
    }
297
298


gauthier's avatar
gauthier committed
299
  //ICIC init param
300
#ifdef ICIC
gauthier's avatar
gauthier committed
301
  uint8_t SB_size;
302
303
304
305
  SB_size=mac_xface->get_SB_size(mac_xface->lte_frame_parms->N_RB_DL);

  srand (time(NULL));

knopp's avatar
   
knopp committed
306
307
308
309
310
311
  for(j=0;j<NB_eNB_INST;j++)
    for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++){
      eNB_mac_inst[j][CC_id].sbmap_conf.first_subframe=0;
      eNB_mac_inst[j][CC_id].sbmap_conf.periodicity=10;
      eNB_mac_inst[j][CC_id].sbmap_conf.sb_size=SB_size;
      eNB_mac_inst[j][CC_id].sbmap_conf.nb_active_sb=1;
gauthier's avatar
gauthier committed
312
      for(i=0;i<NUMBER_OF_SUBBANDS;i++)
knopp's avatar
   
knopp committed
313
        eNB_mac_inst[j][CC_id].sbmap_conf.sbmap[i]=1;
314

knopp's avatar
   
knopp committed
315
      eNB_mac_inst[j][CC_id].sbmap_conf.sbmap[rand()%NUMBER_OF_SUBBANDS]=0;
316
317
318

  }
#endif
gauthier's avatar
gauthier committed
319
  //end ALU's algo
320

gauthier's avatar
gauthier committed
321
  LOG_I(MAC,"[MAIN][INIT] Init function finished\n");
322
323
324
325
326
327
328
329

  return(0);

}


int mac_init_global_param(void){

330

331
332
333
334
335
336
337
338
339
340
341
342
  Mac_rlc_xface = NULL;
  LOG_I(MAC,"[MAIN] CALLING RLC_MODULE_INIT...\n");

  if (rlc_module_init()!=0)
    return(-1);

  LOG_I(MAC,"[MAIN] RLC_MODULE_INIT OK, malloc16 for mac_rlc_xface...\n");

  Mac_rlc_xface = (MAC_RLC_XFACE*)malloc16(sizeof(MAC_RLC_XFACE));
  bzero(Mac_rlc_xface,sizeof(MAC_RLC_XFACE));

  if(Mac_rlc_xface == NULL){
gauthier's avatar
gauthier committed
343
344
      LOG_E(MAC,"[MAIN] FATAL EROOR: Could not allocate memory for Mac_rlc_xface !!!\n");
      return (-1);
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375

  }

  LOG_I(MAC,"[MAIN] malloc16 OK, mac_rlc_xface @ %p\n",(void *)Mac_rlc_xface);

  //  mac_xface->macphy_data_ind=macphy_data_ind;
  mac_xface->mrbch_phy_sync_failure=mrbch_phy_sync_failure;
  mac_xface->dl_phy_sync_success=dl_phy_sync_success;
  mac_xface->out_of_sync_ind=mac_out_of_sync_ind;

  //  Mac_rlc_xface->macphy_exit=  mac_xface->macphy_exit;
  //  Mac_rlc_xface->frame = 0;
  //  Mac_rlc_xface->mac_config_req=mac_config_req;
  //  Mac_rlc_xface->mac_meas_req=mac_meas_req;
  //  Mac_rlc_xface->rrc_rlc_config_req=rrc_rlc_config_req;
  //  Mac_rlc_xface->rrc_rlc_data_req=rrc_rlc_data_req;
  //  Mac_rlc_xface->rrc_rlc_register_rrc=rrc_rlc_register_rrc;

  //  Mac_rlc_xface->rrc_mac_config_req=rrc_mac_config_req;

  //  LOG_I(MAC,"[MAIN] INIT_GLOBAL_PARAM: Mac_rlc_xface=%p,rrc_rlc_register_rrc =%p\n",Mac_rlc_xface,Mac_rlc_xface->rrc_rlc_register_rrc);

  //  Mac_rlc_xface->mac_rlc_data_req=mac_rlc_data_req;
  //  Mac_rlc_xface->mac_rlc_data_ind=mac_rlc_data_ind;
  //  Mac_rlc_xface->mac_rlc_status_ind=mac_rlc_status_ind;
  //  Mac_rlc_xface->pdcp_data_req=pdcp_data_req;
  //  Mac_rlc_xface->mrbch_phy_sync_failure=mrbch_phy_sync_failure;
  //  Mac_rlc_xface->dl_phy_sync_success=dl_phy_sync_success;

  LOG_I(MAC,"[MAIN] RLC interface setup and init\n");
  rrc_init_global_param();
376

377
378
379
380
381
382
383
384
385
386
387
388
389
#ifdef USER_MODE
  pdcp_layer_init ();
#else
  pdcp_module_init ();
#endif

  LOG_I(MAC,"[MAIN] Init Global Param Done\n");

  return 0;
}


void mac_top_cleanup(void){
390

391
392
393
394
395
396
397
398
399
400
#ifndef USER_MODE
  pdcp_module_cleanup ();
#endif
  if (NB_UE_INST>0)
    free (UE_mac_inst);
  if (NB_eNB_INST>0)
    free(eNB_mac_inst);
  free( Mac_rlc_xface);
}

gauthier's avatar
gauthier committed
401
int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active) {
402
403
404
405
406
407
408



  LOG_I(MAC,"[MAIN] MAC_INIT_GLOBAL_PARAM IN...\n");
  //    NB_NODE=2;
  //    NB_INST=2;

409
  Is_rrc_registered=0;
410
  mac_init_global_param();
411
  Is_rrc_registered=1;
412

Cedric Roux's avatar
Cedric Roux committed
413
  mac_xface->macphy_init = mac_top_init;
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
#ifndef USER_MODE
  mac_xface->macphy_exit = openair_sched_exit;
#else
  mac_xface->macphy_exit=(void (*)(const char*)) exit;
#endif
  LOG_I(MAC,"[MAIN] init eNB MAC functions  \n");
  mac_xface->eNB_dlsch_ulsch_scheduler = eNB_dlsch_ulsch_scheduler;
  mac_xface->get_dci_sdu               = get_dci_sdu;
  mac_xface->fill_rar                  = fill_rar;
  mac_xface->initiate_ra_proc          = initiate_ra_proc;
  mac_xface->cancel_ra_proc            = cancel_ra_proc;
  mac_xface->SR_indication             = SR_indication;
  mac_xface->rx_sdu                    = rx_sdu;
  mac_xface->get_dlsch_sdu             = get_dlsch_sdu;
  mac_xface->get_eNB_UE_stats          = get_eNB_UE_stats;
  mac_xface->get_transmission_mode     = get_transmission_mode;
  mac_xface->get_rballoc               = get_rballoc;
  mac_xface->get_nb_rb                 = conv_nprb;
  mac_xface->get_SB_size               = Get_SB_size;
  mac_xface->get_subframe_direction    = get_subframe_direction;
  mac_xface->Msg3_transmitted          = Msg3_tx;
  mac_xface->Msg1_transmitted          = Msg1_tx;
  mac_xface->ra_failed                 = ra_failed;
  mac_xface->ra_succeeded              = ra_succeeded;

  LOG_I(MAC,"[MAIN] init UE MAC functions \n");
  mac_xface->ue_decode_si              = ue_decode_si;
  mac_xface->ue_send_sdu               = ue_send_sdu;
#ifdef Rel10
  mac_xface->ue_send_mch_sdu           = ue_send_mch_sdu;
  mac_xface->ue_query_mch              = ue_query_mch;
#endif
  mac_xface->ue_get_SR                 = ue_get_SR;
  mac_xface->ue_get_sdu                = ue_get_sdu;
  mac_xface->ue_get_rach               = ue_get_rach;
  mac_xface->ue_process_rar            = ue_process_rar;
  mac_xface->ue_scheduler              = ue_scheduler;
  mac_xface->process_timing_advance    = process_timing_advance;


  LOG_I(MAC,"[MAIN] PHY Frame configuration \n");
  mac_xface->lte_frame_parms = frame_parms;

  mac_xface->get_ue_active_harq_pid = get_ue_active_harq_pid;
  mac_xface->get_PL                 = get_PL;
459
460
461
462
463
  mac_xface->get_RSRP               = get_RSRP;
  mac_xface->get_RSRQ               = get_RSRQ;
  mac_xface->get_RSSI               = get_RSSI;
  mac_xface->get_n_adj_cells        = get_n_adj_cells;
  mac_xface->get_rx_total_gain_dB   = get_rx_total_gain_dB;
464
465
466
467
468
469
470
471
  mac_xface->get_Po_NOMINAL_PUSCH   = get_Po_NOMINAL_PUSCH;
  mac_xface->get_num_prach_tdd      = get_num_prach_tdd;
  mac_xface->get_fid_prach_tdd      = get_fid_prach_tdd;
  mac_xface->get_deltaP_rampup      = get_deltaP_rampup;
  mac_xface->computeRIV             = computeRIV;
  mac_xface->get_TBS_DL             = get_TBS_DL;
  mac_xface->get_TBS_UL             = get_TBS_UL;
  mac_xface->get_nCCE_max           = get_nCCE_max;
nikaeinn's avatar
nikaeinn committed
472
  mac_xface->get_nCCE_offset        = get_nCCE_offset;
473
474
475
476
477
478
  mac_xface->get_ue_mode            = get_ue_mode;
  mac_xface->phy_config_sib1_eNB    = phy_config_sib1_eNB;
  mac_xface->phy_config_sib1_ue     = phy_config_sib1_ue;

  mac_xface->phy_config_sib2_eNB        = phy_config_sib2_eNB;
  mac_xface->phy_config_sib2_ue         = phy_config_sib2_ue;
479
  mac_xface->phy_config_afterHO_ue      = phy_config_afterHO_ue;
480
481
482
483
484
485
486
#ifdef Rel10
  mac_xface->phy_config_sib13_eNB        = phy_config_sib13_eNB;
  mac_xface->phy_config_sib13_ue         = phy_config_sib13_ue;
#endif
#ifdef CBA
  mac_xface->phy_config_cba_rnti         = phy_config_cba_rnti ;
#endif 
487
  mac_xface->estimate_ue_tx_power        = estimate_ue_tx_power;
488
  mac_xface->phy_config_meas_ue          = phy_config_meas_ue;
489
  mac_xface->phy_reset_ue		 = phy_reset_ue;
490
491
492
493

  mac_xface->phy_config_dedicated_eNB    = phy_config_dedicated_eNB;
  mac_xface->phy_config_dedicated_ue     = phy_config_dedicated_ue;

494
495
496
  mac_xface->get_lte_frame_parms        = get_lte_frame_parms;
  mac_xface->get_mu_mimo_mode           = get_mu_mimo_mode;

497
498
#ifdef Rel10
  mac_xface->get_mch_sdu                 = get_mch_sdu;
499
500
501
  mac_xface->phy_config_dedicated_scell_eNB= phy_config_dedicated_scell_eNB;
  mac_xface->phy_config_dedicated_scell_ue= phy_config_dedicated_scell_ue;
  
502
503
504
505
506
#endif

  mac_xface->get_PHR = get_PHR;
  LOG_D(MAC,"[MAIN] ALL INIT OK\n");

507
  mac_xface->macphy_init(eMBMS_active,cba_group_active,HO_active);
508
509
510
511

  //Mac_rlc_xface->Is_cluster_head[0] = 1;
  //Mac_rlc_xface->Is_cluster_head[1] = 0;

gauthier's avatar
gauthier committed
512

513
514
515
  return(1);
}