oaisim_functions.c 53.5 KB
Newer Older
1
/*******************************************************************************
2
    OpenAirInterface
3
    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
    You should have received a copy of the GNU General Public License
17
18
    along with OpenAirInterface.The full GNU General Public License is
    included in this distribution in the file called "COPYING". If not,
19
    see <http://www.gnu.org/licenses/>.
20

21
22
23
   Contact Information
   OpenAirInterface Admin: openair_admin@eurecom.fr
   OpenAirInterface Tech : openair_tech@eurecom.fr
24
   OpenAirInterface Dev  : openair4g-devel@lists.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
30
31
32
33
34
35
36
37
38
/*! \file oaisim_functions.c
* \brief function primitives of oaisim
* \author Navid Nikaein 
* \date 2013-2015
* \version 1.0
* \company Eurecom
* \email: openair_tech@eurecom.fr
* \note
* \warning
*/
39
40


41
42
43
44
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
45
#include <execinfo.h>
46
#include <time.h>
gauthier's avatar
gauthier committed
47
#include <mcheck.h>
48
#include <sys/timerfd.h>
49

50
#include "assertions.h"
51
52
53
54
55
#include "oaisim_functions.h"

#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#include "LAYER2/MAC/extern.h"
56
57
#ifdef OPENAIR2
#include "LAYER2/MAC/proto.h"
58
#endif
59
60
61
#include "LAYER2/PDCP_v10.1.0/pdcp.h"
#include "LAYER2/PDCP_v10.1.0/pdcp_primitives.h"
#include "RRC/LITE/extern.h"
Cedric Roux's avatar
Cedric Roux committed
62
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
63
#include "PHY_INTERFACE/extern.h"
64
//#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
65
#include "SCHED/extern.h"
Cedric Roux's avatar
Cedric Roux committed
66
#include "SIMULATION/ETH_TRANSPORT/proto.h"
67
68
69
#include "UTIL/OCG/OCG_extern.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
#include "UTIL/OPT/opt.h"
70
#include "UTIL/OTG/otg_config.h"
winckel's avatar
winckel committed
71
#include "UTIL/OTG/otg_tx.h"
72
#if ENABLE_RAL
73
74
#include "lteRALenb.h"
#include "lteRALue.h"
gauthier's avatar
gauthier committed
75
#endif
76

Cedric Roux's avatar
Cedric Roux committed
77
#include "cor_SF_sim.h"
78
#include "enb_config.h"
Cedric Roux's avatar
Cedric Roux committed
79

80
81
82
83
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
#endif

84
85
86
87
#if defined(ENABLE_USE_MME)
# include "s1ap_eNB.h"
#endif

88
#ifdef SMBV
gauthier's avatar
gauthier committed
89
extern uint8_t config_smbv;
90
91
92
93
94
95
96
97
98
extern char smbv_ip[16];
#endif

//constant for OAISIM soft realtime calibration
#define SF_DEVIATION_OFFSET_NS 100000 //= 0.1ms : should be as a number of UE
#define SLEEP_STEP_US       100 //  = 0.01ms could be adaptive, should be as a number of UE
#define K 2                  // averaging coefficient
#define TARGET_SF_TIME_NS 1000000       // 1ms = 1000000 ns

gauthier's avatar
gauthier committed
99
100
101
102
int           otg_times             = 0;
int           if_times              = 0;
int           for_times             = 0;

gauthier's avatar
gauthier committed
103
uint16_t           Nid_cell              = 0; //needed by init_lte_vars
gauthier's avatar
gauthier committed
104
int           nb_antennas_rx        = 2; // //
105
uint8_t            target_dl_mcs         = 16; // max mcs used by MAC scheduler
gauthier's avatar
gauthier committed
106
uint8_t            rate_adaptation_flag  = 0;
107
uint8_t        set_snr         = 0;
gauthier's avatar
gauthier committed
108
uint8_t            set_sinr              = 0;
109
double             snr_dB=0, sinr_dB=0;
gauthier's avatar
gauthier committed
110
111
112
113
uint8_t            set_seed              = 0;
uint8_t            cooperation_flag;          // for cooperative communication
uint8_t            abstraction_flag      = 0;
uint8_t            ethernet_flag         = 0;
gauthier's avatar
gauthier committed
114
double        snr_step              = 1.0;
gauthier's avatar
gauthier committed
115
uint8_t            ue_connection_test    = 0;
gauthier's avatar
gauthier committed
116
double        forgetting_factor     = 0.0;
gauthier's avatar
gauthier committed
117
118
119
uint8_t            beta_ACK              = 0;
uint8_t            beta_RI               = 0;
uint8_t            beta_CQI              = 2;
120
uint8_t            target_ul_mcs         = 16;
knopp's avatar
   
knopp committed
121
LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs];
gauthier's avatar
gauthier committed
122
123
int           map1,map2;
double      **ShaF                  = NULL;
124
// pointers signal buffers (s = transmit, r,r0 = receive)
gauthier's avatar
gauthier committed
125
double      **s_re, **s_im, **r_re, **r_im, **r_re0, **r_im0;
126
127
node_list*     ue_node_list          = NULL;
node_list*     enb_node_list         = NULL;
128
int           omg_period            = 10000;
129
int           pdcp_period           = 0;
130
int           cba_backoff           = 30;
131
132
// time calibration for soft realtime mode
struct timespec time_spec;
gauthier's avatar
gauthier committed
133
134
135
136
137
unsigned long   time_last           = 0;
unsigned long   time_now            = 0;
int             td                  = 0;
int             td_avg              = 0;
int             sleep_time_us       = 0;
138

Florian Kaltenberger's avatar
Florian Kaltenberger committed
139
140
int phy_test = 0;

141
142
143
144
#ifdef OPENAIR2
// omv related info
//pid_t omv_pid;
char full_name[200];
145
extern int pfd[2]; // fd for omv : fixme: this could be a local var
146
147
148
149
150
151
152
153
154
155
156
157
158
char fdstr[10];
char frames[10];
char num_enb[10];
char num_ue[10];
//area_x, area_y and area_z for omv
char x_area[20];
char y_area[20];
char z_area[20];
char nb_antenna[20];
char frame_type[10];
char tdd_config[10];
#endif

gauthier's avatar
gauthier committed
159
Packet_OTG_List_t *otg_pdcp_buffer = NULL;
160
161
162

extern node_desc_t *enb_data[NUMBER_OF_eNB_MAX];
extern node_desc_t *ue_data[NUMBER_OF_UE_MAX];
knopp's avatar
   
knopp committed
163
164
extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs];
extern channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs];
165
166

extern mapping small_scale_names[];
gauthier's avatar
gauthier committed
167
168
169
170
#if defined(Rel10)
extern pdcp_mbms_t pdcp_mbms_array_ue[NUMBER_OF_UE_MAX][maxServiceCount][maxSessionPerPMCH];
extern pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH];
#endif
171

172
173
extern time_stats_t dl_chan_stats;
extern time_stats_t ul_chan_stats;
174

175
176
extern int xforms;

177
178
void get_simulation_options(int argc, char *argv[])
{
winckel's avatar
winckel committed
179
180
  int                           option;
  const Enb_properties_array_t *enb_properties;
181
  char  *conf_config_file_name = NULL;
winckel's avatar
winckel committed
182

winckel's avatar
winckel committed
183
  enum long_option_e {
gauthier's avatar
gauthier committed
184
    LONG_OPTION_START = 0x100, /* Start after regular single char options */
winckel's avatar
winckel committed
185

gauthier's avatar
gauthier committed
186
    LONG_OPTION_ENB_CONF,
winckel's avatar
winckel committed
187

gauthier's avatar
gauthier committed
188
189
    LONG_OPTION_PDNC_PERIOD,
    LONG_OPTION_OMG_PERIOD,
190
    LONG_OPTION_OEH_ENABLED,
winckel's avatar
winckel committed
191

gauthier's avatar
gauthier committed
192
193
194
195
    LONG_OPTION_ENB_RAL_LISTENING_PORT,
    LONG_OPTION_ENB_RAL_IP_ADDRESS,
    LONG_OPTION_ENB_RAL_LINK_ID,
    LONG_OPTION_ENB_RAL_LINK_ADDRESS,
winckel's avatar
winckel committed
196

gauthier's avatar
gauthier committed
197
198
199
    LONG_OPTION_ENB_MIHF_REMOTE_PORT,
    LONG_OPTION_ENB_MIHF_IP_ADDRESS,
    LONG_OPTION_ENB_MIHF_ID,
winckel's avatar
winckel committed
200

gauthier's avatar
gauthier committed
201
202
203
204
    LONG_OPTION_UE_RAL_LISTENING_PORT,
    LONG_OPTION_UE_RAL_IP_ADDRESS,
    LONG_OPTION_UE_RAL_LINK_ID,
    LONG_OPTION_UE_RAL_LINK_ADDRESS,
winckel's avatar
winckel committed
205

gauthier's avatar
gauthier committed
206
207
208
    LONG_OPTION_UE_MIHF_REMOTE_PORT,
    LONG_OPTION_UE_MIHF_IP_ADDRESS,
    LONG_OPTION_UE_MIHF_ID,
gauthier's avatar
gauthier committed
209
210

    LONG_OPTION_MALLOC_TRACE_ENABLED,
211
212

    LONG_OPTION_CBA_BACKOFF_TIMER,
213

Florian Kaltenberger's avatar
Florian Kaltenberger committed
214
    LONG_OPTION_PHYTEST,
215
    LONG_OPTION_XFORMS,
winckel's avatar
winckel committed
216
  };
winckel's avatar
winckel committed
217

winckel's avatar
winckel committed
218
  static struct option long_options[] = {
219
    {"enb-conf",               required_argument, 0, LONG_OPTION_ENB_CONF},
winckel's avatar
winckel committed
220

221
222
223
    {"pdcp-period",            required_argument, 0, LONG_OPTION_PDNC_PERIOD},
    {"omg-period",             required_argument, 0, LONG_OPTION_OMG_PERIOD},
    {"oeh-enabled",            no_argument, 0, LONG_OPTION_OEH_ENABLED},
winckel's avatar
winckel committed
224

225
226
227
228
    {"enb-ral-listening-port", required_argument, 0, LONG_OPTION_ENB_RAL_LISTENING_PORT},
    {"enb-ral-ip-address",     required_argument, 0, LONG_OPTION_ENB_RAL_IP_ADDRESS},
    {"enb-ral-link-id",        required_argument, 0, LONG_OPTION_ENB_RAL_LINK_ID},
    {"enb-ral-link-address",   required_argument, 0, LONG_OPTION_ENB_RAL_LINK_ADDRESS},
winckel's avatar
winckel committed
229

230
231
232
    {"enb-mihf-remote-port",   required_argument, 0, LONG_OPTION_ENB_MIHF_REMOTE_PORT},
    {"enb-mihf-ip-address",    required_argument, 0, LONG_OPTION_ENB_MIHF_IP_ADDRESS},
    {"enb-mihf-id",            required_argument, 0, LONG_OPTION_ENB_MIHF_ID},
winckel's avatar
winckel committed
233

234
235
236
237
    {"ue-ral-listening-port",  required_argument, 0, LONG_OPTION_UE_RAL_LISTENING_PORT},
    {"ue-ral-ip-address",      required_argument, 0, LONG_OPTION_UE_RAL_IP_ADDRESS},
    {"ue-ral-link-id",         required_argument, 0, LONG_OPTION_UE_RAL_LINK_ID},
    {"ue-ral-link-address",    required_argument, 0, LONG_OPTION_UE_RAL_LINK_ADDRESS},
winckel's avatar
winckel committed
238

239
240
241
    {"ue-mihf-remote-port",    required_argument, 0, LONG_OPTION_UE_MIHF_REMOTE_PORT},
    {"ue-mihf-ip-address",     required_argument, 0, LONG_OPTION_UE_MIHF_IP_ADDRESS},
    {"ue-mihf-id",             required_argument, 0, LONG_OPTION_UE_MIHF_ID},
242

243
    {"malloc-trace-enabled",   no_argument,       0, LONG_OPTION_MALLOC_TRACE_ENABLED},
244

245
    {"cba-backoff",            required_argument, 0, LONG_OPTION_CBA_BACKOFF_TIMER},
246

Florian Kaltenberger's avatar
Florian Kaltenberger committed
247
    {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST},
248
    {"xforms",                 no_argument,       0, LONG_OPTION_XFORMS},
Florian Kaltenberger's avatar
Florian Kaltenberger committed
249

250
    {NULL, 0, NULL, 0}
winckel's avatar
winckel committed
251
  };
winckel's avatar
winckel committed
252

253
  while ((option = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hHi:IJ:j:k:K:l:L:m:M:n:N:oO:p:P:qQ:rR:s:S:t:T:u:U:vV:w:W:x:X:y:Y:z:Z:", long_options, NULL)) != -1) {
254
    switch (option) {
Florian Kaltenberger's avatar
Florian Kaltenberger committed
255
256
257
258
    case LONG_OPTION_PHYTEST:
      phy_test = 1;
      break;

259
260
261
262
263
264
    case LONG_OPTION_ENB_CONF:
      if (optarg) {
        free(conf_config_file_name); // prevent memory leak if option is used multiple times
        conf_config_file_name = strdup(optarg);
        printf("eNB configuration file is %s\n", conf_config_file_name);
      }
winckel's avatar
winckel committed
265

266
      break;
winckel's avatar
winckel committed
267

268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
    case LONG_OPTION_PDNC_PERIOD:
      if (optarg) {
        pdcp_period = atoi(optarg);
        printf("PDCP period is %d\n", pdcp_period);
      }

      break;

    case LONG_OPTION_OMG_PERIOD:
      if (optarg) {
        omg_period = atoi(optarg);
        printf("OMG period is %d\n", omg_period);
      }

      break;

    case LONG_OPTION_OEH_ENABLED:
      oai_emulation.info.oeh_enabled = 1;
      break;

    case LONG_OPTION_MALLOC_TRACE_ENABLED:
      mtrace();
      break;

    case LONG_OPTION_CBA_BACKOFF_TIMER:
      oai_emulation.info.cba_backoff=atoi(optarg);
      cba_backoff=atoi(optarg);
      printf("setting CBA backoff to %d\n", cba_backoff);
      break;
gauthier's avatar
gauthier committed
297

298
#if ENABLE_RAL
winckel's avatar
winckel committed
299

300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
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
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
    case LONG_OPTION_ENB_RAL_LISTENING_PORT:
      if (optarg) {
        g_conf_enb_ral_listening_port = strdup(optarg);
        printf("eNB RAL listening port is %s\n", g_conf_enb_ral_listening_port);
      }

      break;

    case LONG_OPTION_ENB_RAL_IP_ADDRESS:
      if (optarg) {
        g_conf_enb_ral_ip_address = strdup(optarg);
        printf("eNB RAL IP address is %s\n", g_conf_enb_ral_ip_address);
      }

      break;

    case LONG_OPTION_ENB_RAL_LINK_ADDRESS:
      if (optarg) {
        g_conf_enb_ral_link_address = strdup(optarg);
        printf("eNB RAL link address is %s\n", g_conf_enb_ral_link_address);
      }

      break;

    case LONG_OPTION_ENB_RAL_LINK_ID:
      if (optarg) {
        g_conf_enb_ral_link_id = strdup(optarg);
        printf("eNB RAL link id is %s\n", g_conf_enb_ral_link_id);
      }

      break;

    case LONG_OPTION_ENB_MIHF_REMOTE_PORT:
      if (optarg) {
        g_conf_enb_mihf_remote_port = strdup(optarg);
        printf("eNB MIH-F remote port is %s\n", g_conf_enb_mihf_remote_port);
      }

      break;

    case LONG_OPTION_ENB_MIHF_IP_ADDRESS:
      if (optarg) {
        g_conf_enb_mihf_ip_address = strdup(optarg);
        printf("eNB MIH-F IP address is %s\n", g_conf_enb_mihf_ip_address);
      }

      break;

    case LONG_OPTION_ENB_MIHF_ID:
      if (optarg) {
        g_conf_enb_mihf_id = strdup(optarg);
        printf("eNB MIH-F id is %s\n", g_conf_enb_mihf_id);
      }

      break;

    case LONG_OPTION_UE_RAL_LISTENING_PORT:
      if (optarg) {
        g_conf_ue_ral_listening_port = strdup(optarg);
        printf("UE RAL listening port is %s\n", g_conf_ue_ral_listening_port);
      }

      break;

    case LONG_OPTION_UE_RAL_IP_ADDRESS:
      if (optarg) {
        g_conf_ue_ral_ip_address = strdup(optarg);
        printf("UE RAL IP address is %s\n", g_conf_ue_ral_ip_address);
      }

      break;

    case LONG_OPTION_UE_RAL_LINK_ID:
      if (optarg) {
        g_conf_ue_ral_link_id = strdup(optarg);
        printf("UE RAL link id is %s\n", g_conf_ue_ral_link_id);
      }

      break;

    case LONG_OPTION_UE_RAL_LINK_ADDRESS:
      if (optarg) {
        g_conf_ue_ral_link_address = strdup(optarg);
        printf("UE RAL link address is %s\n", g_conf_ue_ral_link_address);
      }

      break;

    case LONG_OPTION_UE_MIHF_REMOTE_PORT:
      if (optarg) {
        g_conf_ue_mihf_remote_port = strdup(optarg);
        printf("UE MIH-F remote port is %s\n", g_conf_ue_mihf_remote_port);
      }

      break;

    case LONG_OPTION_UE_MIHF_IP_ADDRESS:
      if (optarg) {
        g_conf_ue_mihf_ip_address = strdup(optarg);
        printf("UE MIH-F IP address is %s\n", g_conf_ue_mihf_ip_address);
      }

      break;

    case LONG_OPTION_UE_MIHF_ID:
      if (optarg) {
        g_conf_ue_mihf_id = strdup(optarg);
        printf("UE MIH-F id is %s\n", g_conf_ue_mihf_id);
      }

      break;
411
#endif
412

413
414
415
416
    case LONG_OPTION_XFORMS:
      xforms=1;
      break;

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
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
    case 'a':
      abstraction_flag = 1;
      break;

    case 'A':

      //oai_emulation.info.ocm_enabled=1;
      if (optarg == NULL)
        oai_emulation.environment_system_config.fading.small_scale.selected_option="AWGN";
      else
        oai_emulation.environment_system_config.fading.small_scale.selected_option= optarg;

      //awgn_flag = 1;
      break;

    case 'b':
      oai_emulation.info.nb_enb_local = atoi (optarg);
      break;

    case 'B':
      oai_emulation.topology_config.mobility.eNB_mobility.eNB_mobility_type.selected_option = optarg;
      //oai_emulation.info.omg_model_enb = atoi (optarg);
      break;

    case 'c':
      //strcpy(oai_emulation.info.local_server, optarg);
      strncpy(oai_emulation.info.local_server, optarg, sizeof(oai_emulation.info.local_server));
      oai_emulation.info.local_server[sizeof(oai_emulation.info.local_server) - 1] = 0; // terminate string
      oai_emulation.info.ocg_enabled=1;
      break;

    case 'C':
      oai_emulation.info.tdd_config[0] = atoi (optarg);
      AssertFatal (oai_emulation.info.tdd_config[0] <= TDD_Config__subframeAssignment_sa6, "Illegal tdd_config %d (should be 0-%d)!",
                   oai_emulation.info.tdd_config[0], TDD_Config__subframeAssignment_sa6);
      break;

    case 'D':
      oai_emulation.info.multicast_ifname = strdup(optarg);
      break;

    case 'e':
      oai_emulation.info.extended_prefix_flag[0] = 1;
      break;

    case 'E':
      set_seed = 1;
      oai_emulation.info.seed = atoi (optarg);
      break;

    case 'f':
      forgetting_factor = atof (optarg);
      break;

    case 'F':                   // set FDD
      printf("Setting Frame to FDD\n");
      oai_emulation.info.frame_type[0] = 0;
      oai_emulation.info.frame_type_name[0] = "FDD";
      break;

    case 'g':
      oai_emulation.info.multicast_group = atoi (optarg);
      break;

    case 'G' :
      oai_emulation.info.otg_bg_traffic_enabled = 1;
      break;

    case 'h':
      help ();
      exit (1);
      break;

    case 'H':
      oai_emulation.info.handover_active=1;
      printf("Activate the handover procedure at RRC\n");
      break;

    case 'i':
winckel's avatar
winckel committed
496
#ifdef PROC
497
498
499
      Process_Flag=1;
      node_id = wgt+atoi(optarg);
      port+=atoi(optarg);
winckel's avatar
winckel committed
500
#endif
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
      break;

    case 'I':
      oai_emulation.info.cli_enabled = 1;
      break;

    case 'j' :
      // number of relay nodes: currently only applicable to eMBMS
      oai_emulation.info.nb_rn_local = atoi (optarg);
      break;

    case 'J':
      ue_connection_test=1;
      oai_emulation.info.ocm_enabled=0;
      snr_step = atof(optarg);
      break;

    case 'k':
      //ricean_factor = atof (optarg);
      printf("[SIM] Option k is no longer supported on the command line. Please specify your channel model in the xml template\n");
      exit(-1);
      break;

    case 'K':
      oai_emulation.info.itti_dump_file = optarg;
      break;

    case 'l':
      oai_emulation.info.g_log_level = atoi(optarg);
      break;

    case 'L':                   // set FDD
      flag_LA = atoi(optarg);
      break;

    case 'm':
      target_dl_mcs = atoi (optarg);
      printf("Max target downlink MCS used by MAC scheduler is set to %d\n", target_dl_mcs);
      break;

    case 'M':
      abstraction_flag = 1;
      ethernet_flag = 1;
      oai_emulation.info.ethernet_id = atoi (optarg);
      oai_emulation.info.master_id = oai_emulation.info.ethernet_id;
      oai_emulation.info.ethernet_flag = 1;
      break;

    case 'n':
      oai_emulation.info.n_frames = atoi (optarg);
      oai_emulation.emulation_config.emulation_time_ms= oai_emulation.info.n_frames * 10; // 10 ms frame
      //n_frames = (n_frames >1024) ? 1024: n_frames; // adjust the n_frames if higher that 1024
      oai_emulation.info.n_frames_flag = 1;
      break;

    case 'N':
      Nid_cell = atoi (optarg);

      if (Nid_cell > 503) {
        printf("Illegal Nid_cell %d (should be 0 ... 503)\n", Nid_cell);
winckel's avatar
winckel committed
561
        exit(-1);
562
      }
gauthier's avatar
gauthier committed
563

564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
      break;

    case 'O':
      if (optarg) {
        free(conf_config_file_name); // prevent memory leak if option is used multiple times
        conf_config_file_name = strdup(optarg);
      }

      break;

    case 'o':
      oai_emulation.info.slot_isr = 1;
      break;

    case 'p':
      oai_emulation.info.nb_master = atoi (optarg);
      break;

    case 'P':
      oai_emulation.info.opt_enabled = 1;
      opt_enabled = 1;

      if (strcmp(optarg, "wireshark") == 0) {
        opt_type = OPT_WIRESHARK;
        printf("Enabling OPT for wireshark\n");
      } else if (strcmp(optarg, "pcap") == 0) {
        opt_type = OPT_PCAP;
        printf("Enabling OPT for pcap\n");
      } else {
        printf("Unrecognized option for OPT module. -> Disabling it\n");
        printf("Possible values are either wireshark or pcap\n");
        opt_type = OPT_NONE;
        oai_emulation.info.opt_enabled = 0;
        opt_enabled = 0;
      }

      oai_emulation.info.opt_mode = opt_type;
      break;

    case 'q':
      // openair performane profiler
      oai_emulation.info.opp_enabled = 1; // this var is used for OCG
      opp_enabled = 1; // this is the global var used by oaisim
      break;

    case 'Q':
      //eMBMS_active=1;
      // 0 : not used (default), 1: eMBMS and RRC enabled, 2: eMBMS relaying and RRC enabled, 3: eMBMS enabled, RRC disabled, 4: eMBMS relaying enabled, RRC disabled
      oai_emulation.info.eMBMS_active_state = atoi (optarg);
      break;

    case 'r':
      rate_adaptation_flag = 1;
      break;

    case 'R':
      oai_emulation.info.N_RB_DL[0] = atoi (optarg);

      if ((oai_emulation.info.N_RB_DL[0] != 6) && (oai_emulation.info.N_RB_DL[0] != 15) && (oai_emulation.info.N_RB_DL[0] != 25)
          && (oai_emulation.info.N_RB_DL[0] != 50) && (oai_emulation.info.N_RB_DL[0] != 75) && (oai_emulation.info.N_RB_DL[0] != 100)) {
        printf("Illegal N_RB_DL %d (should be one of 6,15,25,50,75,100)\n", oai_emulation.info.N_RB_DL[0]);
        exit (-1);
      }

      break;

    case 's':
      snr_dB = atoi (optarg);
      //      set_snr = 1;
      oai_emulation.info.ocm_enabled=0;
      break;

    case 'S':
      sinr_dB = atoi (optarg);
      set_sinr = 1;
      oai_emulation.info.ocm_enabled=0;
      break;

    case 't':
      target_ul_mcs = atoi (optarg);
      printf("Max target uplink MCS used by MAC scheduler is set to %d\n", target_ul_mcs);
      break;

    case 'T':
      oai_emulation.info.otg_enabled = 1;
      oai_emulation.info.otg_traffic = optarg;
      break;

    case 'u':
      oai_emulation.info.nb_ue_local = atoi (optarg);
      break;

    case 'U':
      oai_emulation.topology_config.mobility.UE_mobility.UE_mobility_type.selected_option = optarg;
      break;

    case 'v':
      oai_emulation.info.omv_enabled = 1;
      break;

    case 'V':
      ouput_vcd = 1;
      oai_emulation.info.vcd_enabled = 1;
      oai_emulation.info.vcd_file = optarg;
      break;

    case 'w':
      oai_emulation.info.cba_group_active = atoi (optarg);
      break;

    case 'W':
675
#ifdef SMBV
676
677
678
679
680
      config_smbv = 1;

      if(atoi(optarg)!=0)
        strcpy(smbv_ip,optarg);

681
#endif
682
      break;
winckel's avatar
winckel committed
683

684
685
686
687
688
689
690
691
    case 'x':
      oai_emulation.info.transmission_mode[0] = atoi (optarg);

      if ((oai_emulation.info.transmission_mode[0] != 1) &&  (oai_emulation.info.transmission_mode[0] != 2) && (oai_emulation.info.transmission_mode[0] != 3)
          && (oai_emulation.info.transmission_mode[0] != 5) && (oai_emulation.info.transmission_mode[0] != 6)) {
        printf("Unsupported transmission mode %d\n",oai_emulation.info.transmission_mode[0]);
        exit(-1);
      }
winckel's avatar
winckel committed
692

693
694
695
      break;

    case 'X':
winckel's avatar
winckel committed
696
#ifdef PROC
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
      temp=atoi(optarg);

      if(temp==0) {
        port=CHANNEL_PORT;
        Channel_Flag=1;
        Process_Flag=0;
        wgt=0;
      } else if(temp==1) {
        port=eNB_PORT;
        wgt=0;
      } else {
        port=UE_PORT;
        wgt=MAX_eNB;
      }

winckel's avatar
winckel committed
712
#endif
713
      break;
winckel's avatar
winckel committed
714

715
716
    case 'y':
      nb_antennas_rx=atoi(optarg);
winckel's avatar
winckel committed
717

718
719
720
721
      if (nb_antennas_rx>4) {
        printf("Cannot have more than 4 antennas\n");
        exit(-1);
      }
winckel's avatar
winckel committed
722

723
      break;
winckel's avatar
winckel committed
724

725
726
727
    case 'Y':
      oai_emulation.info.g_log_verbosity_option = strdup(optarg);
      break;
winckel's avatar
winckel committed
728

729
730
731
732
733
734
735
736
737
738
739
740
741
    case 'z':
      cooperation_flag = atoi (optarg);
      break;

    case 'Z':
      /* Sebastien ROUX: Reserved for future use (currently used in ltenow branch) */
      break;

    default:
      help ();
      exit (-1);
      break;
    }
winckel's avatar
winckel committed
742
  }
743

744
745
746
  if ((oai_emulation.info.nb_enb_local > 0) && (conf_config_file_name != NULL)) {
    /* Read eNB configuration file */
    enb_properties = enb_config_init(conf_config_file_name);
747

748
749
750
    AssertFatal (oai_emulation.info.nb_enb_local <= enb_properties->number,
                 "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!",
                 conf_config_file_name, oai_emulation.info.nb_enb_local, enb_properties->number);
751

752
753
754
755
756
757
    /* Update some simulation parameters */
    oai_emulation.info.frame_type[0] =           enb_properties->properties[0]->frame_type[0];
    oai_emulation.info.tdd_config[0] =           enb_properties->properties[0]->tdd_config[0];
    oai_emulation.info.tdd_config_S[0] =         enb_properties->properties[0]->tdd_config_s[0];
    oai_emulation.info.extended_prefix_flag[0] = enb_properties->properties[0]->prefix_type[0];
  }
758

759
760
  free(conf_config_file_name);
  conf_config_file_name = 0;
761
762
}

763
764
void check_and_adjust_params(void)
{
765

gauthier's avatar
gauthier committed
766
  int32_t ret;
767
768
  int i,j;

769
  if (oai_emulation.info.nb_ue_local  + oai_emulation.info.nb_rn_local > NUMBER_OF_UE_MAX) {
770
771
    LOG_E(EMU,"Enter fewer than %d UEs/RNs for the moment or change the NUMBER_OF_UE_MAX\n", NUMBER_OF_UE_MAX);
    exit(EXIT_FAILURE);
772
773
  }

774
  if (oai_emulation.info.nb_enb_local + oai_emulation.info.nb_rn_local > NUMBER_OF_eNB_MAX) {
775
776
    LOG_E(EMU,"Enter fewer than %d eNBs/RNs for the moment or change the NUMBER_OF_UE_MAX\n", NUMBER_OF_eNB_MAX);
    exit(EXIT_FAILURE);
777
  }
778

779
  if (oai_emulation.info.nb_rn_local > NUMBER_OF_RN_MAX) {
780
781
    LOG_E(EMU,"Enter fewer than %d RNs for the moment or change the NUMBER_OF_RN_MAX\n", NUMBER_OF_RN_MAX);
    exit(EXIT_FAILURE);
782
  }
783

784
785
786
787
788
789
790
791
792
793
794
  // fix ethernet and abstraction with RRC_CELLULAR Flag
#ifdef RRC_CELLULAR
  abstraction_flag = 1;
  ethernet_flag = 1;
#endif

  if (set_sinr == 0)
    sinr_dB = snr_dB - 20;

  // setup netdevice interface (netlink socket)
  LOG_I(EMU,"[INIT] Starting NAS netlink interface\n");
Cedric Roux's avatar
Cedric Roux committed
795
  ret = netlink_init();
796

797
  if (ret < 0)
798
    LOG_W(EMU,"[INIT] Netlink not available, careful ...\n");
799
800

  if (ethernet_flag == 1) {
801
802
    oai_emulation.info.master[oai_emulation.info.master_id].nb_ue = oai_emulation.info.nb_ue_local + oai_emulation.info.nb_rn_local;
    oai_emulation.info.master[oai_emulation.info.master_id].nb_enb = oai_emulation.info.nb_enb_local + oai_emulation.info.nb_rn_local;
803

804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
    if (oai_emulation.info.nb_rn_local>0)
      LOG_N(EMU,"Ethernet emulation is not yet tested with the relay nodes\n");

    if (!oai_emulation.info.master_id)
      oai_emulation.info.is_primary_master = 1;

    j = 1;

    for (i = 0; i < oai_emulation.info.nb_master; i++) {
      if (i != oai_emulation.info.master_id)
        oai_emulation.info.master_list = oai_emulation.info.master_list + j;

      LOG_I (EMU, "Index of master id i=%d  MASTER_LIST %d\n", i, oai_emulation.info.master_list);
      j *= 2;
    }

    LOG_I (EMU, " Total number of master %d my master id %d\n", oai_emulation.info.nb_master, oai_emulation.info.master_id);
    init_bypass ();

    while (emu_tx_status != SYNCED_TRANSPORT) {
      LOG_I (EMU, " Waiting for EMU Transport to be synced\n");
      emu_transport_sync ();    //emulation_tx_rx();
    }
827
828
  } // ethernet flag

829
  //
830
831
  NB_UE_INST = oai_emulation.info.nb_ue_local + oai_emulation.info.nb_ue_remote;
  NB_eNB_INST = oai_emulation.info.nb_enb_local + oai_emulation.info.nb_enb_remote;
832
833
  NB_RN_INST = oai_emulation.info.nb_rn_local + oai_emulation.info.nb_rn_remote;

834
#if defined(PDCP_USE_NETLINK_QUEUES) && defined(OPENAIR2)
835
836
837
  pdcp_netlink_init();
#endif

838
  if (NB_RN_INST > 0 ) {
839
840
    LOG_N(EMU,"Total number of RN %d (local %d, remote %d) mobility (the same as eNB) %s  \n", NB_RN_INST,oai_emulation.info.nb_rn_local,oai_emulation.info.nb_rn_remote,
          oai_emulation.topology_config.mobility.eNB_mobility.eNB_mobility_type.selected_option);
841

842
    LOG_N(EMU,"Adjust the number of eNB inst (%d->%d) and UE inst (%d->%d)\n ",
gauthier's avatar
gauthier committed
843
844
          NB_eNB_INST, NB_eNB_INST+NB_RN_INST,
          NB_UE_INST, NB_UE_INST+NB_RN_INST);
845
846
    NB_eNB_INST+=NB_RN_INST;
    NB_UE_INST+=NB_RN_INST;
847
  }
848

849
  LOG_I(EMU,"Total number of UE %d (first local %d , num local %d, remote %d, relay %d) mobility %s \n",
850
851
852
        NB_UE_INST,oai_emulation.info.first_ue_local, oai_emulation.info.nb_ue_local,oai_emulation.info.nb_ue_remote,
        NB_RN_INST,
        oai_emulation.topology_config.mobility.UE_mobility.UE_mobility_type.selected_option);
853
854

  LOG_I(EMU,"Total number of eNB %d (local %d, remote %d, relay %d) mobility %s \n",
855
856
857
        NB_eNB_INST,oai_emulation.info.nb_enb_local,oai_emulation.info.nb_enb_remote,
        NB_RN_INST,
        oai_emulation.topology_config.mobility.eNB_mobility.eNB_mobility_type.selected_option);
858

859
860
}

861
#ifdef OPENAIR2
862
863
void init_omv(void)
{
864
865
  if (oai_emulation.info.omv_enabled == 1) {

866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
    if(pipe(pfd) == -1)
      perror("pipe error \n");

    snprintf( full_name, sizeof(full_name), "%s/UTIL/OMV/OMV",getenv("OPENAIR2_DIR") );
    LOG_I(EMU,"Stating the OMV path %s pfd[0] %d pfd[1] %d \n", full_name, pfd[0],pfd[1]);

    switch(fork()) {
    case -1 :
      perror("fork failed \n");
      break;

    case 0 : // child is going to be the omv, it is the reader
      if(close(pfd[1]) == -1 ) // we close the write desc.
        perror("close on write\n" );

      sprintf(fdstr, "%d", pfd[0] );
      sprintf(num_enb, "%d", NB_eNB_INST);
      sprintf(num_ue, "%d", NB_UE_INST);
      sprintf(x_area, "%f", oai_emulation.topology_config.area.x_m );
      sprintf(y_area, "%f", oai_emulation.topology_config.area.y_m );
      sprintf(z_area, "%f", 200.0 );
      sprintf(frames, "%d", oai_emulation.info.n_frames);
      sprintf(nb_antenna, "%d", 4);
      sprintf(frame_type, "%s", (oai_emulation.info.frame_type[0] == 0) ? "FDD" : "TDD");
      sprintf(tdd_config, "%d", oai_emulation.info.tdd_config[0]);
      // execl is used to launch the visualisor
      execl(full_name,"OMV", fdstr, frames, num_enb, num_ue, x_area, y_area, z_area, nb_antenna, frame_type, tdd_config,NULL );
      perror( "error in execl the OMV" );
    }

    //parent
    if(close( pfd[0] ) == -1 ) // we close the write desc.
      perror("close on read\n" );
899
900
  }
}
901
#endif
902

903
904
void init_seed(uint8_t set_seed)
{
905
906
907

  if(set_seed) {

908
909
    randominit (oai_emulation.info.seed);
    set_taus_seed (oai_emulation.info.seed);
910
911

  } else {
912
913
    randominit (0);
    set_taus_seed (0);
914
915
916
  }
}

917
918
void init_openair1(void)
{
gauthier's avatar
gauthier committed
919
  module_id_t UE_id, eNB_id;
knopp's avatar
   
knopp committed
920
  uint8_t CC_id;
921
#if ENABLE_RAL
922
923
  int list_index;
#endif
924

925
  // change the nb_connected_eNB
926
927
928
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
    init_lte_vars (&frame_parms[CC_id], oai_emulation.info.frame_type[CC_id], oai_emulation.info.tdd_config[CC_id], oai_emulation.info.tdd_config_S[CC_id],oai_emulation.info.extended_prefix_flag[CC_id],
                   oai_emulation.info.N_RB_DL[CC_id], Nid_cell, cooperation_flag, oai_emulation.info.transmission_mode[CC_id], abstraction_flag,nb_antennas_rx, oai_emulation.info.eMBMS_active_state);
knopp's avatar
   
knopp committed
929
  }
930

931
932
933
934
935
936
937
938
939
940
941
942
  for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
    for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
        PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK;
        PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_RI_Index  = beta_RI;
        PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI;
        PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.p_b = (frame_parms[CC_id]->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_A = rho_B

        PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK;
        PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_RI_Index  = beta_RI;
        PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI;
        PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.pdsch_config_common.p_b = (frame_parms[CC_id]->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_A = rho_B
943
      }
944
    }
945
946
  }

947
948
949
950
951
  printf ("AFTER init: MAX_NUM_CCs %d, Nid_cell %d frame_type %d,tdd_config %d\n",
          MAX_NUM_CCs,
          PHY_vars_eNB_g[0][0]->lte_frame_parms.Nid_cell,
          PHY_vars_eNB_g[0][0]->lte_frame_parms.frame_type,
          PHY_vars_eNB_g[0][0]->lte_frame_parms.tdd_config);
952
953
954
955
956
957
958

  number_of_cards = 1;

  openair_daq_vars.rx_rf_mode = 1;
  openair_daq_vars.tdd = 1;
  openair_daq_vars.rx_gain_mode = DAQ_AGC_ON;

knopp's avatar
   
knopp committed
959
  openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0];
Cedric Roux's avatar
Cedric Roux committed
960
//#warning "NN->FK: OAI EMU channel abstraction does not work for MCS higher than"
961
  openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16);
962
963
964
965
966
967
  openair_daq_vars.target_ue_ul_mcs = target_ul_mcs;
  openair_daq_vars.ue_dl_rb_alloc=0x1fff;
  openair_daq_vars.ue_ul_nb_rb=6;
  openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag;
  openair_daq_vars.use_ia_receiver = 0;

968
  //N_TA_offset
969
970
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
    for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
971
      if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.frame_type == TDD) {
972
973
974
975
976
977
978
979
        if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 100)
          PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624;
        else if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 50)
          PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624/2;
        else if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 25)
          PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624/4;
      } else {
        PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 0;
980
981
      }
    }
982
983

    for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
984
      if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.frame_type == TDD) {
985
986
987
988
989
990
991
992
        if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 100)
          PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624;
        else if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 50)
          PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624/2;
        else if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 25)
          PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624/4;
      } else {
        PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 0;
993
994
      }
    }
995
  }
996

Florian Kaltenberger's avatar
Florian Kaltenberger committed
997
998
999
1000
1001
1002
1003
1004
  for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++)
    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
      if (phy_test==1)
	PHY_vars_eNB_g[eNB_id][CC_id]->mac_enabled=0;
      else
	PHY_vars_eNB_g[eNB_id][CC_id]->mac_enabled=1;
    }

1005
  // init_ue_status();
1006
1007
  for (UE_id=0; UE_id<NB_UE_INST; UE_id++)
    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1008
1009
1010

      PHY_vars_UE_g[UE_id][CC_id]->tx_power_max_dBm=23;

1011
      PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB=100;
1012

gauthier's avatar
gauthier committed
1013
1014
      // update UE_mode for each eNB_id not just 0
      if (abstraction_flag == 0)
knopp's avatar
   
knopp committed
1015
        PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] = NOT_SYNCHED;
gauthier's avatar
gauthier committed
1016
      else {
1017
1018
        // 0 is the index of the connected eNB
        PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] = PRACH;
gauthier's avatar
gauthier committed
1019
      }
1020

Florian Kaltenberger's avatar
Florian Kaltenberger committed
1021
1022
1023
1024
1025
      if (phy_test==1)
	PHY_vars_UE_g[UE_id][CC_id]->mac_enabled=0;
      else
	PHY_vars_UE_g[UE_id][CC_id]->mac_enabled=1;

knopp's avatar
   
knopp committed
1026
1027
      PHY_vars_UE_g[UE_id][CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235 + UE_id;
      PHY_vars_UE_g[UE_id][CC_id]->current_dlsch_cqi[0] = 10;
1028

knopp's avatar
   
knopp committed
1029
      LOG_I(EMU, "UE %d mode is initialized to %d\n", UE_id, PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] );
1030
#if ENABLE_RAL
knopp's avatar
   
knopp committed
1031
      PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_timed = hashtable_create (64, NULL, NULL);
1032

gauthier's avatar
gauthier committed
1033
      for (list_index = 0; list_index < RAL_LINK_PARAM_GEN_MAX; list_index++) {
1034
        SLIST_INIT(&PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_gen_polled[list_index]);
gauthier's avatar
gauthier committed
1035
      }
1036

gauthier's avatar
gauthier committed
1037
      for (list_index = 0; list_index < RAL_LINK_PARAM_LTE_MAX; list_index++) {
1038
        SLIST_INIT(&PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_lte_polled[list_index]);
gauthier's avatar
gauthier committed
1039
      }
1040

1041
1042
#endif

1043
    }
1044
1045
}

1046
1047
void init_openair2(void)
{
1048
#ifdef OPENAIR2
gauthier's avatar
gauthier committed
1049
1050
  module_id_t enb_id;
  module_id_t UE_id;
knopp's avatar
   
knopp committed
1051
  int CC_id;
Cedric Roux's avatar
Cedric Roux committed
1052
//#warning "eNB index is hard coded to zero"
1053
1054

  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++)
knopp's avatar
   
knopp committed
1055
    l2_init (&PHY_vars_eNB_g[0][CC_id]->lte_frame_parms,
1056
1057
1058
1059
1060
             oai_emulation.info.eMBMS_active_state,
             NULL,
             oai_emulation.info.cba_group_active,
             oai_emulation.info.handover_active);

gauthier's avatar
gauthier committed
1061
1062
  for (enb_id = 0; enb_id < NB_eNB_INST; enb_id++)
    mac_xface->mrbch_phy_sync_failure (enb_id, 0, enb_id);
1063
1064

  if (abstraction_flag == 1) {
1065
1066
    for (UE_id = 0; UE_id < NB_UE_INST; UE_id++)
      mac_xface->dl_phy_sync_success (UE_id, 0, 0,1);   //UE_id%NB_eNB_INST);
1067
1068
1069
  }

  mac_xface->macphy_exit = exit_fun;
1070

1071
1072
1073
#endif
}

1074
1075
void init_ocm(void)
{
gauthier's avatar
gauthier committed
1076
  module_id_t UE_id, eNB_id;
knopp's avatar
   
knopp committed
1077
  int CC_id;
gauthier's avatar
gauthier committed
1078

1079
  /* Added for PHY abstraction */
gauthier's avatar
gauthier committed
1080
1081

  char* frame_type = "unknown";
1082

gauthier's avatar
gauthier committed
1083
1084
1085
1086
  switch (oai_emulation.info.frame_type[0]) {
  case FDD:
    frame_type = "FDD";
    break;
1087

gauthier's avatar
gauthier committed
1088
1089
1090
1091
  case TDD:
    frame_type = "FDD";
    break;
  }
1092

gauthier's avatar
gauthier committed
1093
  LOG_I(OCM,"Running with frame_type %d (%s), Nid_cell %d, N_RB_DL %d, EP %d, mode %d, target dl_mcs %d, rate adaptation %d, nframes %d, abstraction %d, channel %s\n",
1094
1095
        oai_emulation.info.frame_type[0], frame_type, Nid_cell, oai_emulation.info.N_RB_DL[0], oai_emulation.info.extended_prefix_flag[0], oai_emulation.info.transmission_mode[0],target_dl_mcs,
        rate_adaptation_flag,oai_emulation.info.n_frames,abstraction_flag,oai_emulation.environment_system_config.fading.small_scale.selected_option);
1096

gauthier's avatar
gauthier committed
1097
  if (abstraction_flag) {
1098

1099
    get_beta_map();
1100
#ifdef PHY_ABSTRACTION_UL
1101
    get_beta_map_up();
1102
#endif
1103
    get_MIESM_param();
1104

1105
    //load_pbch_desc();
1106
  }
1107

1108
1109

  for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
1110
1111
    enb_data[eNB_id] = (node_desc_t *)malloc(sizeof(node_desc_t));
    init_enb(enb_data[eNB_id],oai_emulation.environment_system_config.antenna.eNB_antenna);
1112
1113
1114
  }

  for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
1115
1116
    ue_data[UE_id] = (node_desc_t *)malloc(sizeof(node_desc_t));
    init_ue(ue_data[UE_id],oai_emulation.environment_system_config.antenna.UE_antenna);
1117
1118
1119
1120
1121
1122
  }

  if ((oai_emulation.info.ocm_enabled == 1)&& (ethernet_flag == 0 ) &&
      (oai_emulation.environment_system_config.fading.shadowing.decorrelation_distance_m>0) &&
      (oai_emulation.environment_system_config.fading.shadowing.variance_dB>0)) {

1123
1124
1125
1126
    // init SF map here!!!
    map1 =(int)oai_emulation.topology_config.area.x_m;
    map2 =(int)oai_emulation.topology_config.area.y_m;
    ShaF = init_SF(map1,map2,oai_emulation.environment_system_config.fading.shadowing.decorrelation_distance_m,oai_emulation.environment_system_config.fading.shadowing.variance_dB);
1127

1128
1129
    // size of area to generate shadow fading map
    LOG_D(EMU,"Simulation area x=%f, y=%f\n",
1130
1131
1132
1133
1134
          oai_emulation.topology_config.area.x_m,
          oai_emulation.topology_config.area.y_m);
  }

  if (abstraction_flag == 0)
knopp's avatar
   
knopp committed
1135
    init_channel_vars (frame_parms[0], &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
1136
1137
1138

  // initialize channel descriptors
  for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
knopp's avatar
   
knopp committed
1139
    for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
1140
1141
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
        LOG_D(OCM,"Initializing channel (%s, %d) from eNB %d to UE %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
gauthier's avatar
gauthier committed
1142
              map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option), eNB_id, UE_id);
1143

1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
        /* if (oai_emulation.info.transmission_mode == 5)
                  eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_tx,
                                                     PHY_vars_UE_g[UE_id]->lte_frame_parms.nb_antennas_rx,
                                                     (UE_id == 0)? Rice1_corr : Rice1_anticorr,
                                                     oai_emulation.environment_system_config.system_bandwidth_MB,
                                                     forgetting_factor,
                                                     0,
                                                     0);

              else
         */

Florian Kaltenberger's avatar
Florian Kaltenberger committed
1156
1157
1158
1159
1160
1161
1162
1163
1164
        eNB2UE[eNB_id][UE_id][CC_id] = 
	  new_channel_desc_scm(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_tx,
			       PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.nb_antennas_rx,
			       map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option),
			       N_RB2sampling_rate(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL),
			       N_RB2channel_bandwidth(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL),
			       forgetting_factor,
			       0,
			       0);
1165
1166
1167
        random_channel(eNB2UE[eNB_id][UE_id][CC_id],abstraction_flag);
        LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to eNB %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
              map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, eNB_id);
1168

Florian Kaltenberger's avatar
Florian Kaltenberger committed
1169
1170
1171
1172
1173
1174
1175
1176
1177
        UE2eNB[UE_id][eNB_id][CC_id] = 
	  new_channel_desc_scm(PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.nb_antennas_tx,
			       PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_rx,
			       map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),
			       N_RB2sampling_rate(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_UL),
			       N_RB2channel_bandwidth(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_UL),
			       forgetting_factor,
			       0,
			       0);
gauthier's avatar
gauthier committed
1178

1179
1180
1181
1182
        random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag);

        // to make channel reciprocal uncomment following line instead of previous. However this only works for SISO at the moment. For MIMO the channel would need to be transposed.
        //UE2eNB[UE_id][eNB_id] = eNB2UE[eNB_id][UE_id];
knopp's avatar
   
knopp committed
1183
      }
1184
1185
    }
  }
1186
1187
}

1188
1189
void init_otg_pdcp_buffer(void)
{
gauthier's avatar
gauthier committed
1190
  module_id_t i;
gauthier's avatar
gauthier committed
1191
  otg_pdcp_buffer = malloc((NB_UE_INST + NB_eNB_INST) * sizeof(Packet_OTG_List_t));
1192
1193

  for (i = 0; i < NB_UE_INST + NB_eNB_INST; i++) {
1194
1195
    pkt_list_init(&(otg_pdcp_buffer[i]));
    //LOG_I(EMU,"HEAD of otg_pdcp_buffer[%d] is %p\n", i, pkt_list_get_head(&(otg_pdcp_buffer[i])));
1196
1197
1198
  }
}

1199
1200
void update_omg (frame_t frameP)
{
gauthier's avatar
gauthier committed
1201
  module_id_t UE_id, eNB_id;
1202
1203
  int new_omg_model;

gauthier's avatar
gauthier committed
1204
  if ((frameP % omg_period) == 0 ) { // call OMG every 10ms