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

22 23
/*! \file lte-enb.c
 * \brief Top-level threads for eNodeB
24
 * \author R. Knopp, F. Kaltenberger, Navid Nikaein
knopp's avatar
knopp committed
25 26 27
 * \date 2012
 * \version 0.1
 * \company Eurecom
28
 * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr
knopp's avatar
knopp committed
29 30 31
 * \note
 * \warning
 */
32 33

#include "lte-softmodem.h"
34

35 36
#include "T.h"

37
#include "rt_wrapper.h"
38

39

40 41
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all

42
#include "assertions.h"
43
#include "msc.h"
44 45

#include "PHY/types.h"
46

47
#include "PHY/defs.h"
48 49
#include "common/ran_context.h"

50
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
knopp's avatar
knopp committed
51
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
52

knopp's avatar
knopp committed
53
#include "../../ARCH/COMMON/common_lib.h"
54
#include "../../ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
knopp's avatar
knopp committed
55

knopp's avatar
knopp committed
56
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
57 58 59 60 61 62 63 64 65

#include "PHY/vars.h"
#include "SCHED/vars.h"
#include "LAYER2/MAC/vars.h"

#include "../../SIMU/USER/init_lte.h"

#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/vars.h"
66
#include "LAYER2/MAC/proto.h"
67 68 69 70 71 72 73 74
#include "RRC/LITE/vars.h"
#include "PHY_INTERFACE/vars.h"

#ifdef SMBV
#include "PHY/TOOLS/smbv.h"
unsigned short config_frames[4] = {2,9,11,13};
#endif
#include "UTIL/LOG/log_extern.h"
nikaeinn's avatar
nikaeinn committed
75
#include "UTIL/OTG/otg_tx.h"
76
#include "UTIL/OTG/otg_externs.h"
77 78
#include "UTIL/MATH/oml.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
79
#include "UTIL/OPT/opt.h"
80
#include "enb_config.h"
nikaeinn's avatar
nikaeinn committed
81
//#include "PHY/TOOLS/time_meas.h"
82

Florian Kaltenberger's avatar
Florian Kaltenberger committed
83 84 85 86
#ifndef OPENAIR2
#include "UTIL/OTG/otg_vars.h"
#endif

87
#if defined(ENABLE_ITTI)
88 89
#include "intertask_interface_init.h"
#include "create_tasks.h"
90 91
#endif

92 93
#include "system.h"

94 95 96
#ifdef XFORMS
#include "PHY/TOOLS/lte_phy_scope.h"
#include "stats.h"
97 98
#endif

99

100

101
#ifdef XFORMS
102
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
103
// at eNB 0, an UL scope for every UE
104
FD_lte_phy_scope_ue  *form_ue[NUMBER_OF_UE_MAX];
105
FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
106
FD_stats_form                  *form_stats=NULL,*form_stats_l2=NULL;
107
char title[255];
108
unsigned char                   scope_enb_num_ue = 2;
109
static pthread_t                forms_thread; //xforms
110 111
#endif //XFORMS

knopp's avatar
knopp committed
112 113
pthread_cond_t sync_cond;
pthread_mutex_t sync_mutex;
114
int sync_var=-1; //!< protected by mutex \ref sync_mutex.
115

116 117
uint16_t runtime_phy_rx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100]
uint16_t runtime_phy_tx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100]
knopp's avatar
knopp committed
118

119
#if defined(ENABLE_ITTI)
120 121
volatile int             start_eNB = 0;
volatile int             start_UE = 0;
122
#endif
knopp's avatar
knopp committed
123
volatile int             oai_exit = 0;
124

125
static clock_source_t clock_source = internal;
126
static int wait_for_sync = 0;
knopp's avatar
knopp committed
127

knopp's avatar
knopp committed
128
static char              UE_flag=0;
129
unsigned int                    mmapped_dma=0;
130
int                             single_thread_flag=1;
131

132
static char                     threequarter_fs=0;
133

134
uint32_t                 downlink_frequency[MAX_NUM_CCs][4];
135
int32_t                  uplink_frequency_offset[MAX_NUM_CCs][4];
gauthier's avatar
gauthier committed
136

137

138
static char                    *conf_config_file_name = NULL;
139
#if defined(ENABLE_ITTI)
140
static char                    *itti_dump_file = NULL;
knopp's avatar
knopp committed
141 142
#endif

143
int UE_scan = 1;
144
int UE_scan_carrier = 0;
145 146
runmode_t mode = normal_txrx;

147 148
FILE *input_fd=NULL;

149

150 151
#if MAX_NUM_CCs == 1
rx_gain_t                rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}};
152 153
double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0}};
double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0}};
154 155 156 157
#else
rx_gain_t                rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain},{max_gain,max_gain,max_gain,max_gain}};
double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0},{20,0,0,0}};
double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,0,0}};
gauthier's avatar
gauthier committed
158
#endif
knopp's avatar
knopp committed
159

160
double rx_gain_off = 0.0;
161

knopp's avatar
knopp committed
162
double sample_rate=30.72e6;
163
double bw = 10.0e6;
164

165
static int                      tx_max_power[MAX_NUM_CCs]; /* =  {0,0}*/;
166

167 168
char   rf_config_file[1024];

Florian Kaltenberger's avatar
Florian Kaltenberger committed
169
int chain_offset=0;
170
int phy_test = 0;
171
uint8_t usim_test = 0;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
172

173 174
uint8_t nb_antenna_tx = 1;
uint8_t nb_antenna_rx = 1;
175

knopp's avatar
knopp committed
176 177 178
char ref[128] = "internal";
char channels[128] = "0";

179
int                      rx_input_level_dBm;
180
static int                      online_log_messages=0;
181
#ifdef XFORMS
182
extern int                      otg_enabled;
183
static char                     do_forms=0;
184
#else
185
int                             otg_enabled;
186
#endif
knopp's avatar
knopp committed
187
//int                             number_of_cards =   1;
188

189 190

static LTE_DL_FRAME_PARMS      *frame_parms[MAX_NUM_CCs];
Florian Kaltenberger's avatar
Florian Kaltenberger committed
191
uint32_t target_dl_mcs = 28; //maximum allowed mcs
192
uint32_t target_ul_mcs = 20;
193
uint32_t timing_advance = 0;
194 195
uint8_t exit_missed_slots=1;
uint64_t num_missed_slots=0; // counter for the number of missed slots
196

197

198 199
extern void reset_opp_meas(void);
extern void print_opp_meas(void);
200

201
int transmission_mode=1;
knopp's avatar
knopp committed
202

203
int16_t           glog_level         = LOG_INFO;
gauthier's avatar
gauthier committed
204
int16_t           glog_verbosity     = LOG_MED;
205
int16_t           hw_log_level       = LOG_INFO;
gauthier's avatar
gauthier committed
206
int16_t           hw_log_verbosity   = LOG_MED;
207
int16_t           phy_log_level      = LOG_INFO;
gauthier's avatar
gauthier committed
208
int16_t           phy_log_verbosity  = LOG_MED;
209
int16_t           mac_log_level      = LOG_INFO;
gauthier's avatar
gauthier committed
210
int16_t           mac_log_verbosity  = LOG_MED;
211
int16_t           rlc_log_level      = LOG_INFO;
gauthier's avatar
gauthier committed
212
int16_t           rlc_log_verbosity  = LOG_MED;
213
int16_t           pdcp_log_level     = LOG_INFO;
gauthier's avatar
gauthier committed
214
int16_t           pdcp_log_verbosity = LOG_MED;
215
int16_t           rrc_log_level      = LOG_INFO;
gauthier's avatar
gauthier committed
216
int16_t           rrc_log_verbosity  = LOG_MED;
217 218 219
int16_t           opt_log_level      = LOG_INFO;
int16_t           opt_log_verbosity  = LOG_MED;

gauthier's avatar
gauthier committed
220 221 222 223 224 225
# if defined(ENABLE_USE_MME)
int16_t           gtpu_log_level     = LOG_DEBUG;
int16_t           gtpu_log_verbosity = LOG_MED;
int16_t           udp_log_level      = LOG_DEBUG;
int16_t           udp_log_verbosity  = LOG_MED;
#endif
226 227 228
#if defined (ENABLE_SECURITY)
int16_t           osa_log_level      = LOG_INFO;
int16_t           osa_log_verbosity  = LOG_MED;
229
#endif
230

231 232 233
/* struct for ethernet specific parameters given in eNB conf file */
eth_params_t *eth_params;

234 235 236 237
openair0_config_t openair0_cfg[MAX_CARDS];

double cpuf;

238 239
extern char uecap_xer[1024];
char uecap_xer_in=0;
240

241
int oaisim_flag=0;
242
threads_t threads= {-1,-1,-1};
knopp's avatar
knopp committed
243

Cedric Roux's avatar
Cedric Roux committed
244 245 246 247
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
 * this is very hackish - find a proper solution
 */
uint8_t abstraction_flag=0;
knopp's avatar
knopp committed
248

249 250 251 252 253
/*---------------------BMC: timespec helpers -----------------------------*/

struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 };
struct timespec max_diff_time = { .tv_sec = 0, .tv_nsec = 0 };

254
struct timespec clock_difftime(struct timespec start, struct timespec end) {
255 256 257 258 259 260 261 262 263
  struct timespec temp;
  if ((end.tv_nsec-start.tv_nsec)<0) {
    temp.tv_sec = end.tv_sec-start.tv_sec-1;
    temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
  } else {
    temp.tv_sec = end.tv_sec-start.tv_sec;
    temp.tv_nsec = end.tv_nsec-start.tv_nsec;
  }
  return temp;
264 265
}

266
void print_difftimes(void) {
267
#ifdef DEBUG
268
  printf("difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec);
269
#else
270
  LOG_I(HW,"difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec);
271 272 273
#endif
}

274
void update_difftimes(struct timespec start, struct timespec end) {
275 276 277
  struct timespec diff_time = { .tv_sec = 0, .tv_nsec = 0 };
  int             changed = 0;
  diff_time = clock_difftime(start, end);
278 279 280 281 282 283 284 285
  if ((min_diff_time.tv_nsec == 0) || (diff_time.tv_nsec < min_diff_time.tv_nsec)) {
    min_diff_time.tv_nsec = diff_time.tv_nsec;
    changed = 1;
  }
  if ((max_diff_time.tv_nsec == 0) || (diff_time.tv_nsec > max_diff_time.tv_nsec)) {
    max_diff_time.tv_nsec = diff_time.tv_nsec;
    changed = 1;
  }
286
#if 1
287
  if (changed) print_difftimes();
288 289 290 291 292
#endif
}

/*------------------------------------------------------------------------*/

293
unsigned int build_rflocal(int txi, int txq, int rxi, int rxq) {
knopp's avatar
knopp committed
294
  return (txi + (txq<<6) + (rxi<<12) + (rxq<<18));
295
}
296
unsigned int build_rfdc(int dcoff_i_rxfe, int dcoff_q_rxfe) {
knopp's avatar
knopp committed
297
  return (dcoff_i_rxfe + (dcoff_q_rxfe<<8));
298 299
}

300
#if !defined(ENABLE_ITTI)
301
void signal_handler(int sig) {
302 303 304 305 306 307
  void *array[10];
  size_t size;

  if (sig==SIGSEGV) {
    // get void*'s for all entries on the stack
    size = backtrace(array, 10);
308

309 310 311 312
    // print out all the frames to stderr
    fprintf(stderr, "Error: signal %d:\n", sig);
    backtrace_symbols_fd(array, size, 2);
    exit(-1);
313 314
  } else {
    printf("trying to exit gracefully...\n");
315
    oai_exit = 1;
316 317
  }
}
318
#endif
319 320 321 322 323 324 325 326 327 328 329
#define KNRM  "\x1B[0m"
#define KRED  "\x1B[31m"
#define KGRN  "\x1B[32m"
#define KBLU  "\x1B[34m"
#define RESET "\033[0m"

void help (void) {
  printf (KGRN "Usage:\n");
  printf("  sudo -E lte-softmodem [options]\n");
  printf("  sudo -E ./lte-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf -S -V -m 26 -t 16 -x 1 --ulsch-max-errors 100 -W\n\n");
  printf("Options:\n");
330
  printf("  --rf-config-file Configuration file for front-end (e.g. LMS7002M)\n");
331 332 333 334
  printf("  --ulsch-max-errors set the max ULSCH erros\n");
  printf("  --calib-ue-rx set UE RX calibration\n");
  printf("  --calib-ue-rx-med \n");
  printf("  --calib-ue-rxbyp\n");
knopp's avatar
knopp committed
335 336
  printf("  --debug-ue-prach run normal prach power ramping, but don't continue random-access\n");
  printf("  --calib-prach-tx run normal prach with maximum power, but don't continue random-access\n");
337
  printf("  --no-L2-connect bypass L2 and upper layers\n");
338
  printf("  --ue-rxgain set UE RX gain\n");
339
  printf("  --ue-rxgain-off external UE amplifier offset\n");
340
  printf("  --ue-txgain set UE TX gain\n");
Cedric Roux's avatar
Cedric Roux committed
341 342
  printf("  --ue-nb-ant-rx  set UE number of rx antennas\n");
  printf("  --ue-scan-carrier set UE to scan around carrier\n");
343
  printf("  --dlsch-demod-shift dynamic shift for LLR compuation for TM3/4 (default 0)\n");
344
  printf("  --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n");
345
  printf("  --mmapped-dma sets flag for improved EXMIMO UE performance\n");  
346
  printf("  --external-clock tells hardware to use an external clock reference\n");
347
  printf("  --usim-test use XOR autentication algo in case of test usim mode\n"); 
348
  printf("  --single-thread-disable. Disables single-thread mode in lte-softmodem\n"); 
349
  printf("  -A Set timing_advance\n");
350
  printf("  -C Set the downlink frequency for all component carriers\n");
351 352 353
  printf("  -d Enable soft scope and L1 and L2 stats (Xforms)\n");
  printf("  -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n");
  printf("  -g Set the global log level, valide options: (9:trace, 8/7:debug, 6:info, 4:warn, 3:error)\n");
354
  printf("  -G Set the global log verbosity \n");
355 356 357 358 359
  printf("  -h provides this help message!\n");
  printf("  -K Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n");
  printf("  -m Set the maximum downlink MCS\n");
  printf("  -O eNB configuration file (located in targets/PROJECTS/GENERIC-LTE-EPC/CONF\n");
  printf("  -q Enable processing timing measurement of lte softmodem on per subframe basis \n");
kaltenbe's avatar
kaltenbe committed
360
  printf("  -r Set the PRB, valid values: 6, 25, 50, 100  \n");    
361 362
  printf("  -S Skip the missed slots/subframes \n");    
  printf("  -t Set the maximum uplink MCS\n");
363
  printf("  -T Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n");
364 365 366
  printf("  -U Set the lte softmodem as a UE\n");
  printf("  -W Enable L2 wireshark messages on localhost \n");
  printf("  -V Enable VCD (generated file will be located atopenair_dump_eNB.vcd, read it with target/RT/USER/eNB.gtkw\n");
367
  printf("  -x Set the transmission mode, valid options: 1 \n");
368
  printf("  -E Apply three-quarter of sampling frequency, 23.04 Msps to reduce the data rate on USB/PCIe transfers (only valid for 20 MHz)\n");
369 370 371
#if T_TRACER
  printf("  --T_port [port]    use given port\n");
  printf("  --T_nowait         don't wait for tracer, start immediately\n");
372
  printf("  --T_dont_fork      to ease debugging with gdb\n");
373 374 375
#endif
  printf(RESET);
  fflush(stdout);
376
}
377

Raymond Knopp's avatar
Raymond Knopp committed
378

379 380
void exit_fun(const char* s)
{
Raymond Knopp's avatar
Raymond Knopp committed
381
  int CC_id;
382
  int ru_id;
Raymond Knopp's avatar
Raymond Knopp committed
383

384
  if (s != NULL) {
385
    printf("%s %s() Exiting OAI softmodem: %s\n",__FILE__, __FUNCTION__, s);
386 387 388
  }

  oai_exit = 1;
389 390 391 392 393 394 395 396 397 398

  if (UE_flag==0) {
    for (ru_id=0; ru_id<RC.nb_RU;ru_id++) {
      if (RC.ru[ru_id]->rfdevice.trx_end_func)
	RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice);
      if (RC.ru[ru_id]->ifdevice.trx_end_func)
	RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);  
    }
  }

Raymond Knopp's avatar
Raymond Knopp committed
399
  for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
400 401 402 403

    oai_exit = 1;

    for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
404 405 406 407 408
      if (UE_flag == 0) {
      } else {
	if (PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func)
	  PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][CC_id]->rfdevice);
      }
knopp's avatar
knopp committed
409
    }
410 411

#if defined(ENABLE_ITTI)
412 413
    sleep(1); //allow lte-softmodem threads to exit first
    itti_terminate_tasks (TASK_UNKNOWN);
414
#endif
415

416
  }
417

418
}
419

420
#ifdef XFORMS
421

422

423 424
void reset_stats(FL_OBJECT *button, long arg)
{
425
  int i,j,k;
426
  PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0];
427 428 429

  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
    for (k=0; k<8; k++) { //harq_processes
430
      for (j=0; j<phy_vars_eNB->dlsch[i][0]->Mlimit; j++) {
431 432 433
	phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0;
	phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0;
	phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0;
434
      }
435

436 437 438
      phy_vars_eNB->UE_stats[i].dlsch_l2_errors[k]=0;
      phy_vars_eNB->UE_stats[i].ulsch_errors[k]=0;
      phy_vars_eNB->UE_stats[i].ulsch_consecutive_errors=0;
439 440


441 442 443
      phy_vars_eNB->UE_stats[i].dlsch_sliding_cnt=0;
      phy_vars_eNB->UE_stats[i].dlsch_NAK_round0=0;
      phy_vars_eNB->UE_stats[i].dlsch_mcs_offset=0;
444 445 446 447
    }
  }
}

448
static void *scope_thread(void *arg) {
knopp's avatar
knopp committed
449
  char stats_buffer[16384];
450
# ifdef ENABLE_XFORMS_WRITE_STATS
knopp's avatar
knopp committed
451
  FILE *UE_stats, *eNB_stats;
452
# endif
Florian Kaltenberger's avatar
Florian Kaltenberger committed
453
  int len = 0;
knopp's avatar
knopp committed
454
  struct sched_param sched_param;
455
  int UE_id, CC_id;
456
  int ue_cnt=0;
457

458
  sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
knopp's avatar
knopp committed
459
  sched_setscheduler(0, SCHED_FIFO,&sched_param);
460

knopp's avatar
knopp committed
461
  printf("Scope thread has priority %d\n",sched_param.sched_priority);
462

463
# ifdef ENABLE_XFORMS_WRITE_STATS
464 465

  if (UE_flag==1)
knopp's avatar
knopp committed
466
    UE_stats  = fopen("UE_stats.txt", "w");
467
  else
knopp's avatar
knopp committed
468
    eNB_stats = fopen("eNB_stats.txt", "w");
469

470
#endif
471

knopp's avatar
knopp committed
472 473
  while (!oai_exit) {
    if (UE_flag==1) {
474
      len = dump_ue_stats (PHY_vars_UE_g[0][0], &PHY_vars_UE_g[0][0]->proc.proc_rxtx[0],stats_buffer, 0, mode,rx_input_level_dBm);
knopp's avatar
knopp committed
475 476 477
      //fl_set_object_label(form_stats->stats_text, stats_buffer);
      fl_clear_browser(form_stats->stats_text);
      fl_add_browser_line(form_stats->stats_text, stats_buffer);
478

479
      phy_scope_UE(form_ue[0],
480 481 482 483
		   PHY_vars_UE_g[0][0],
		   0,
		   0,7);

484

knopp's avatar
knopp committed
485
    } else {
486
      /*
487
	if (RC.eNB[0][0]->mac_enabled==1) {
488 489 490 491
	len = dump_eNB_l2_stats (stats_buffer, 0);
	//fl_set_object_label(form_stats_l2->stats_text, stats_buffer);
	fl_clear_browser(form_stats_l2->stats_text);
	fl_add_browser_line(form_stats_l2->stats_text, stats_buffer);
492 493
	}
	len = dump_eNB_stats (RC.eNB[0][0], stats_buffer, 0);
494

495 496
	if (MAX_NUM_CCs>1)
	len += dump_eNB_stats (RC.eNB[0][1], &stats_buffer[len], 0);
497

498 499 500
	//fl_set_object_label(form_stats->stats_text, stats_buffer);
	fl_clear_browser(form_stats->stats_text);
	fl_add_browser_line(form_stats->stats_text, stats_buffer);
501
      */
502 503
      ue_cnt=0;
      for(UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
504
	for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
505
	  //	  if ((RC.eNB[0][CC_id]->dlsch[UE_id][0]->rnti>0) && (ue_cnt<scope_enb_num_ue)) {
506
	  if ((ue_cnt<scope_enb_num_ue)) {
gauthier's avatar
gauthier committed
507
	    phy_scope_eNB(form_enb[CC_id][ue_cnt],
508
			  RC.eNB[0][CC_id],
509 510 511
			  UE_id);
	    ue_cnt++;
	  }
512
	}
knopp's avatar
knopp committed
513
      }
514

515
    }
516
	
knopp's avatar
knopp committed
517
    //printf("doing forms\n");
Florian Kaltenberger's avatar
Florian Kaltenberger committed
518 519
    //usleep(100000); // 100 ms
    sleep(1);
knopp's avatar
knopp committed
520
  }
521

522
  //  printf("%s",stats_buffer);
523

524
# ifdef ENABLE_XFORMS_WRITE_STATS
525

526 527 528 529 530 531
  if (UE_flag==1) {
    if (UE_stats) {
      rewind (UE_stats);
      fwrite (stats_buffer, 1, len, UE_stats);
      fclose (UE_stats);
    }
532
  } else {
533 534 535 536 537 538
    if (eNB_stats) {
      rewind (eNB_stats);
      fwrite (stats_buffer, 1, len, eNB_stats);
      fclose (eNB_stats);
    }
  }
539

540
# endif
541

knopp's avatar
knopp committed
542
  pthread_exit((void*)arg);
543 544 545
}
#endif

546

547

548

knopp's avatar
knopp committed
549
#if defined(ENABLE_ITTI)
550
void *l2l1_task(void *arg) {
knopp's avatar
knopp committed
551 552 553 554 555
  MessageDef *message_p = NULL;
  int         result;

  itti_set_task_real_time(TASK_L2L1);
  itti_mark_task_ready(TASK_L2L1);
556

knopp's avatar
knopp committed
557 558
  if (UE_flag == 0) {
    /* Wait for the initialize message */
559
    printf("Wait for the ITTI initialize message\n");
560
    do {
knopp's avatar
knopp committed
561
      if (message_p != NULL) {
562 563
	result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
	AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
knopp's avatar
knopp committed
564
      }
565

566 567 568
      itti_receive_msg (TASK_L2L1, &message_p);

      switch (ITTI_MSG_ID(message_p)) {
knopp's avatar
knopp committed
569
      case INITIALIZE_MESSAGE:
570 571 572 573
	/* Start eNB thread */
	LOG_D(EMU, "L2L1 TASK received %s\n", ITTI_MSG_NAME(message_p));
	start_eNB = 1;
	break;
knopp's avatar
knopp committed
574 575

      case TERMINATE_MESSAGE:
576 577 578 579
	printf("received terminate message\n");
	oai_exit=1;
	itti_exit_task ();
	break;
knopp's avatar
knopp committed
580 581

      default:
582 583
	LOG_E(EMU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p));
	break;
584
      }
knopp's avatar
knopp committed
585
    } while (ITTI_MSG_ID(message_p) != INITIALIZE_MESSAGE);
586

knopp's avatar
knopp committed
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
    result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
    AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
  }

  do {
    // Wait for a message
    itti_receive_msg (TASK_L2L1, &message_p);

    switch (ITTI_MSG_ID(message_p)) {
    case TERMINATE_MESSAGE:
      oai_exit=1;
      itti_exit_task ();
      break;

    case ACTIVATE_MESSAGE:
      start_UE = 1;
      break;

    case DEACTIVATE_MESSAGE:
      start_UE = 0;
      break;
608

knopp's avatar
knopp committed
609 610 611 612 613 614 615 616 617 618 619
    case MESSAGE_TEST:
      LOG_I(EMU, "Received %s\n", ITTI_MSG_NAME(message_p));
      break;

    default:
      LOG_E(EMU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p));
      break;
    }

    result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
    AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
620
  } while(!oai_exit);
621

knopp's avatar
knopp committed
622
  return NULL;
623 624 625
}
#endif

knopp's avatar
knopp committed
626 627


628 629

static void get_options (int argc, char **argv) {
630 631 632
  int c;
  //  char                          line[1000];
  //  int                           l;
633
  int k,i;//,j,k;
634
#if defined(OAI_USRP) || defined(CPRIGW)
635
  int clock_src;
knopp's avatar
knopp committed
636
#endif
637
  int CC_id;
knopp's avatar
knopp committed
638 639


640

641 642
  enum long_option_e {
    LONG_OPTION_START = 0x100, /* Start after regular single char options */
643
    LONG_OPTION_RF_CONFIG_FILE,
644 645 646 647 648
    LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS,
    LONG_OPTION_CALIB_UE_RX,
    LONG_OPTION_CALIB_UE_RX_MED,
    LONG_OPTION_CALIB_UE_RX_BYP,
    LONG_OPTION_DEBUG_UE_PRACH,
649
    LONG_OPTION_NO_L2_CONNECT,
knopp's avatar
knopp committed
650
    LONG_OPTION_CALIB_PRACH_TX,
651
    LONG_OPTION_RXGAIN,
652
    LONG_OPTION_RXGAINOFF,
653
    LONG_OPTION_TXGAIN,
654 655
    LONG_OPTION_NBRXANT,
    LONG_OPTION_NBTXANT,
656
    LONG_OPTION_SCANCARRIER,
657 658
    LONG_OPTION_MAXPOWER,
    LONG_OPTION_DUMP_FRAME,
659
    LONG_OPTION_LOOPMEMORY,
660
    LONG_OPTION_PHYTEST,
661
    LONG_OPTION_USIMTEST,
Cedric Roux's avatar
Cedric Roux committed
662
    LONG_OPTION_MMAPPED_DMA,
663
    LONG_OPTION_EXTERNAL_CLOCK,
664
    LONG_OPTION_WAIT_FOR_SYNC,
665
    LONG_OPTION_SINGLE_THREAD_DISABLE,
666 667 668 669
    LONG_OPTION_THREADIQ,
    LONG_OPTION_THREADODDSUBFRAME,
    LONG_OPTION_THREADEVENSUBFRAME,
    LONG_OPTION_DEMOD_SHIFT,
670 671 672
#if T_TRACER
    LONG_OPTION_T_PORT,
    LONG_OPTION_T_NOWAIT,
Cedric Roux's avatar
Cedric Roux committed
673
    LONG_OPTION_T_DONT_FORK,
674
#endif
675

676
  };
677

678
  static const struct option long_options[] = {
679
    {"rf-config-file",required_argument,  NULL, LONG_OPTION_RF_CONFIG_FILE},
680 681 682 683 684 685
    {"ulsch-max-errors",required_argument,  NULL, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS},
    {"calib-ue-rx",     required_argument,  NULL, LONG_OPTION_CALIB_UE_RX},
    {"calib-ue-rx-med", required_argument,  NULL, LONG_OPTION_CALIB_UE_RX_MED},
    {"calib-ue-rx-byp", required_argument,  NULL, LONG_OPTION_CALIB_UE_RX_BYP},
    {"debug-ue-prach",  no_argument,        NULL, LONG_OPTION_DEBUG_UE_PRACH},
    {"no-L2-connect",   no_argument,        NULL, LONG_OPTION_NO_L2_CONNECT},
knopp's avatar
knopp committed
686 687
    {"calib-prach-tx",   no_argument,        NULL, LONG_OPTION_CALIB_PRACH_TX},
    {"ue-rxgain",   required_argument,  NULL, LONG_OPTION_RXGAIN},
688
    {"ue-rxgain-off",   required_argument,  NULL, LONG_OPTION_RXGAINOFF},
knopp's avatar
knopp committed
689
    {"ue-txgain",   required_argument,  NULL, LONG_OPTION_TXGAIN},
690 691
    {"ue-nb-ant-rx", required_argument,  NULL, LONG_OPTION_NBRXANT},
    {"ue-nb-ant-tx", required_argument,  NULL, LONG_OPTION_NBTXANT},
knopp's avatar
knopp committed
692
    {"ue-scan-carrier",   no_argument,  NULL, LONG_OPTION_SCANCARRIER},
693
    {"ue-max-power",   required_argument,  NULL, LONG_OPTION_MAXPOWER},
694 695
    {"ue-dump-frame", no_argument, NULL, LONG_OPTION_DUMP_FRAME},
    {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY},
696
    {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST},
697
    {"usim-test", no_argument, NULL, LONG_OPTION_USIMTEST},
698
    {"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA},
699
    {"external-clock", no_argument, NULL, LONG_OPTION_EXTERNAL_CLOCK},
700
    {"wait-for-sync", no_argument, NULL, LONG_OPTION_WAIT_FOR_SYNC},
701
    {"single-thread-disable", no_argument, NULL, LONG_OPTION_SINGLE_THREAD_DISABLE},
702 703 704 705
    {"threadIQ",  required_argument, NULL, LONG_OPTION_THREADIQ},
    {"threadOddSubframe",  required_argument, NULL, LONG_OPTION_THREADODDSUBFRAME},
    {"threadEvenSubframe",  required_argument, NULL, LONG_OPTION_THREADEVENSUBFRAME},
    {"dlsch-demod-shift", required_argument,  NULL, LONG_OPTION_DEMOD_SHIFT},
706 707 708
#if T_TRACER
    {"T_port",                 required_argument, 0, LONG_OPTION_T_PORT},
    {"T_nowait",               no_argument,       0, LONG_OPTION_T_NOWAIT},
709
    {"T_dont_fork",            no_argument,       0, LONG_OPTION_T_DONT_FORK},
710
#endif
711 712 713
    {NULL, 0, NULL, 0}
  };

714
  while ((c = getopt_long (argc, argv, "A:a:C:dEK:g:F:G:hqO:m:SUVRM:r:P:Ws:t:Tx:",long_options,NULL)) != -1) {
715
    switch (c) {
716
    case LONG_OPTION_RF_CONFIG_FILE:
717 718 719 720 721 722
      if ((strcmp("null", optarg) == 0) || (strcmp("NULL", optarg) == 0)) {
	printf("no configuration filename is provided\n");
      }
      else if (strlen(optarg)<=1024){
	strcpy(rf_config_file,optarg);
      }else {
723 724
	printf("Configuration filename is too long\n");
	exit(-1);   
725 726
      }
      break;
727 728 729 730
    case LONG_OPTION_MAXPOWER:
      tx_max_power[0]=atoi(optarg);
      for (CC_id=1;CC_id<MAX_NUM_CCs;CC_id++)
	tx_max_power[CC_id]=tx_max_power[0];
731
      break;
732 733 734 735
    case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
      ULSCH_max_consecutive_errors = atoi(optarg);
      printf("Set ULSCH_max_consecutive_errors = %d\n",ULSCH_max_consecutive_errors);
      break;
736

737 738 739 740 741
    case LONG_OPTION_CALIB_UE_RX:
      mode = rx_calib_ue;
      rx_input_level_dBm = atoi(optarg);
      printf("Running with UE calibration on (LNA max), input level %d dBm\n",rx_input_level_dBm);
      break;
742

743 744 745 746
    case LONG_OPTION_CALIB_UE_RX_MED:
      mode = rx_calib_ue_med;
      rx_input_level_dBm = atoi(optarg);
      printf("Running with UE calibration on (LNA med), input level %d dBm\n",rx_input_level_dBm);
knopp's avatar
knopp committed
747
      break;
748

749 750 751 752 753
    case LONG_OPTION_CALIB_UE_RX_BYP:
      mode = rx_calib_ue_byp;
      rx_input_level_dBm = atoi(optarg);
      printf("Running with UE calibration on (LNA byp), input level %d dBm\n",rx_input_level_dBm);
      break;
754

755 756 757
    case LONG_OPTION_DEBUG_UE_PRACH:
      mode = debug_prach;
      break;
758

759 760 761
    case LONG_OPTION_NO_L2_CONNECT:
      mode = no_L2_connect;
      break;
762

knopp's avatar
knopp committed
763 764
    case LONG_OPTION_CALIB_PRACH_TX:
      mode = calib_prach_tx;
Rohit Gupta's avatar
Rohit Gupta committed
765
      printf("Setting mode to calib_prach_tx (%d)\n",mode);
knopp's avatar
knopp committed
766 767
      break;

768
    case LONG_OPTION_RXGAIN:
769
      for (i=0; i<4; i++)
770
	rx_gain[0][i] = atof(optarg);
771

772
      break;
773

774 775 776 777
    case LONG_OPTION_RXGAINOFF:
      rx_gain_off = atof(optarg);
      break;

778 779
    case LONG_OPTION_TXGAIN:
      for (i=0; i<4; i++)
780
	tx_gain[0][i] = atof(optarg);
781

782
      break;
783
    case LONG_OPTION_NBRXANT:
784 785
      nb_antenna_rx = atof(optarg);
      break;
786
    case LONG_OPTION_NBTXANT:
787 788
      nb_antenna_tx = atof(optarg);
      break;
789 790 791 792 793
    case LONG_OPTION_SCANCARRIER:
      UE_scan_carrier=1;

      break;

794 795 796 797 798 799
    case LONG_OPTION_LOOPMEMORY:
      mode=loop_through_memory;
      input_fd = fopen(optarg,"r");
      AssertFatal(input_fd != NULL,"Please provide an input file\n");
      break;

800 801 802 803
    case LONG_OPTION_DUMP_FRAME:
      mode = rx_dump_frame;
      break;
      
804 805 806
    case LONG_OPTION_PHYTEST:
      phy_test = 1;
      break;
807

808
    case LONG_OPTION_USIMTEST:
809
      usim_test = 1;
810
      break;
811 812 813
    case LONG_OPTION_MMAPPED_DMA:
      mmapped_dma = 1;
      break;
knopp's avatar
knopp committed
814

815 816
    case LONG_OPTION_SINGLE_THREAD_DISABLE:
      single_thread_flag = 0;
knopp's avatar
knopp committed
817
      break;
818 819 820 821 822

    case LONG_OPTION_EXTERNAL_CLOCK:
      clock_source = external;
      break;

823 824 825 826
    case LONG_OPTION_WAIT_FOR_SYNC:
      wait_for_sync = 1;
      break;

827
    case LONG_OPTION_THREADIQ:
828 829
      threads.iq=atoi(optarg);
      break;
830
    case LONG_OPTION_THREADODDSUBFRAME:
831 832
      threads.odd=atoi(optarg);
      break;
833
    case LONG_OPTION_THREADEVENSUBFRAME:
834 835
      threads.even=atoi(optarg);
      break;
836
    case LONG_OPTION_DEMOD_SHIFT: {
837 838 839
      extern int16_t dlsch_demod_shift;
      dlsch_demod_shift = atof(optarg);
      break;
840
    }
841 842 843 844 845 846 847 848 849 850 851 852 853
#if T_TRACER
    case LONG_OPTION_T_PORT: {
      extern int T_port;
      if (optarg == NULL) abort();  /* should not happen */
      T_port = atoi(optarg);
      break;
    }

    case LONG_OPTION_T_NOWAIT: {
      extern int T_wait;
      T_wait = 0;
      break;
    }
854 855 856 857 858 859

    case LONG_OPTION_T_DONT_FORK: {
      extern int T_dont_fork;
      T_dont_fork = 1;
      break;
    }
860 861
#endif

862 863 864 865
    case 'A':
      timing_advance = atoi (optarg);
      break;

866
    case 'C':
867
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
868 869 870 871 872
	downlink_frequency[CC_id][0] = atof(optarg); // Use float to avoid issue with frequency over 2^31.
	downlink_frequency[CC_id][1] = downlink_frequency[CC_id][0];
	downlink_frequency[CC_id][2] = downlink_frequency[CC_id][0];
	downlink_frequency[CC_id][3] = downlink_frequency[CC_id][0];
	printf("Downlink for CC_id %d frequency set to %u\n", CC_id, downlink_frequency[CC_id][0]);
knopp's avatar
knopp committed
873
      }
874

875
      UE_scan=0;
876

877
      break;
878

Florian Kaltenberger's avatar
Florian Kaltenberger committed
879 880 881 882
    case 'a':
      chain_offset = atoi(optarg);
      break;

883 884 885 886
    case 'd':
#ifdef XFORMS
      do_forms=1;
      printf("Running with XFORMS!\n");
knopp's avatar
knopp committed
887
#endif
888
      break;
889

890 891 892
    case 'E':
      threequarter_fs=1;
      break;
893

894 895 896
    case 'K':
#if defined(ENABLE_ITTI)
      itti_dump_file = strdup(optarg);
897
#else
898
      printf("-K option is disabled when ENABLE_ITTI is not defined\n");
knopp's avatar
knopp committed
899
#endif
900
      break;
901

902 903 904
    case 'O':
      conf_config_file_name = optarg;
      break;
905

906 907 908
    case 'U':
      UE_flag = 1;
      break;
909

910 911 912
    case 'm':
      target_dl_mcs = atoi (optarg);
      break;
913

914 915 916
    case 't':
      target_ul_mcs = atoi (optarg);
      break;
917

918 919 920 921 922 923 924
    case 'W':
      opt_enabled=1;
      opt_type = OPT_WIRESHARK;
      strncpy(in_ip, "127.0.0.1", sizeof(in_ip));
      in_ip[sizeof(in_ip) - 1] = 0; // terminate string
      printf("Enabling OPT for wireshark for local interface");
      /*
925 926 927 928 929 930 931 932
	if (optarg == NULL){
	in_ip[0] =NULL;
	printf("Enabling OPT for wireshark for local interface");
	} else {
	strncpy(in_ip, optarg, sizeof(in_ip));
	in_ip[sizeof(in_ip) - 1] = 0; // terminate string
	printf("Enabling OPT for wireshark with %s \n",in_ip);
	}
933 934
      */
      break;
935

936
    case 'P':
937 938
      opt_type = OPT_PCAP;
      opt_enabled=1;
939 940

      if (optarg == NULL) {
941 942 943
	strncpy(in_path, "/tmp/oai_opt.pcap", sizeof(in_path));
	in_path[sizeof(in_path) - 1] = 0; // terminate string
	printf("Enabling OPT for PCAP with the following path /tmp/oai_opt.pcap");
944
      } else {
945 946 947
	strncpy(in_path, optarg, sizeof(in_path));
	in_path[sizeof(in_path) - 1] = 0; // terminate string
	printf("Enabling OPT for PCAP  with the following file %s \n",in_path);
948
      }
949 950 951

      break;

knopp's avatar
knopp committed
952 953 954
    case 'V':
      ouput_vcd = 1;
      break;
955

knopp's avatar
knopp committed
956
    case  'q':
knopp's avatar
knopp committed
957 958
      opp_enabled = 1;
      break;
959

knopp's avatar
knopp committed
960 961 962
    case  'R' :
      online_log_messages =1;
      break;
963

knopp's avatar
knopp committed
964
    case 'r':
965
      UE_scan = 0;
966

967
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
	switch(atoi(optarg)) {
	case 6:
	  frame_parms[CC_id]->N_RB_DL=6;
	  frame_parms[CC_id]->N_RB_UL=6;
	  break;

	case 25:
	  frame_parms[CC_id]->N_RB_DL=25;
	  frame_parms[CC_id]->N_RB_UL=25;
	  break;

	case 50:
	  frame_parms[CC_id]->N_RB_DL=50;
	  frame_parms[CC_id]->N_RB_UL=50;
	  break;

	case 100:
	  frame_parms[CC_id]->N_RB_DL=100;
	  frame_parms[CC_id]->N_RB_UL=100;
	  break;

	default:
	  printf("Unknown N_RB_DL %d, switching to 25\n",atoi(optarg));
	  break;
	}
knopp's avatar
knopp committed
993
      }
994

995
      break;
996

knopp's avatar
knopp committed
997
    case 's':
998
#if defined(OAI_USRP) || defined(CPRIGW)
knopp's avatar
knopp committed
999 1000

      clock_src = atoi(optarg);
1001

knopp's avatar
knopp committed
1002
      if (clock_src == 0) {
1003 1004
	//  char ref[128] = "internal";
	//strncpy(uhd_ref, ref, strlen(ref)+1);
1005
      } else if (clock_src == 1) {
1006 1007
	//char ref[128] = "external";
	//strncpy(uhd_ref, ref, strlen(ref)+1);
knopp's avatar
knopp committed
1008
      }
1009

knopp's avatar
knopp committed
1010 1011 1012 1013
#else
      printf("Note: -s not defined for ExpressMIMO2\n");
#endif
      break;
1014

1015
    case 'g':
knopp's avatar
knopp committed
1016
      glog_level=atoi(optarg); // value between 1 - 9
1017
      break;
1018

1019 1020 1021
    case 'G':
      glog_verbosity=atoi(optarg);// value from 0, 0x5, 0x15, 0x35, 0x75
      break;
1022

1023 1024 1025 1026 1027 1028 1029 1030
    case 'S':
      exit_missed_slots=0;
      printf("Skip exit for missed slots\n");
      break;

    case 'F':
      break;

1031
    case 'x':
1032 1033 1034
      printf("Transmission mode should be set in config file now\n");
      exit(-1);
      /*
1035
	transmission_mode = atoi(optarg);
1036

1037 1038 1039 1040
	if (transmission_mode > 7) {
	printf("Transmission mode %d not supported for the moment\n",transmission_mode);
	exit(-1);
	}
1041
      */
1042
      break;
1043

1044 1045 1046
    case 'T':
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) 
	frame_parms[CC_id]->frame_type = TDD;
1047
      break;
1048

1049 1050 1051 1052
    case 'h':
      help ();
      exit (-1);
       
knopp's avatar
knopp committed
1053
    default:
1054 1055
      help ();
      exit (-1);
knopp's avatar
knopp committed
1056
      break;
1057 1058
    }
  }
1059

knopp's avatar
knopp committed
1060 1061
  if (UE_flag == 0)
    AssertFatal(conf_config_file_name != NULL,"Please provide a configuration file\n");
1062

knopp's avatar
knopp committed
1063
  if ((UE_flag == 0) && (conf_config_file_name != NULL)) {
1064

1065

1066
    memset((void*)&RC,0,sizeof(RC));
1067

1068 1069 1070 1071 1072 1073 1074 1075 1076
    /* Read RC configuration file */
    RCConfig(conf_config_file_name);
    
    NB_eNB_INST = RC.nb_inst;
    NB_RU       = RC.nb_RU;

    printf("Read in %s : nb_inst %d, nb_ru %d\n",conf_config_file_name,NB_eNB_INST,NB_RU);

    /*    
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086
	  init_all_otg(0);
	  g_otg->seed = 0;
	  init_seeds(g_otg->seed);

	  for (k=0; k<enb_properties->properties[i]->num_otg_elements; k++) {
	  j=enb_properties->properties[i]->otg_ue_id[k]; // ue_id
	  g_otg->application_idx[i][j] = 1;
	  //g_otg->packet_gen_type=SUBSTRACT_STRING;
	  g_otg->background[i][j][0] =enb_properties->properties[i]->otg_bg_traffic[k];
	  g_otg->application_type[i][j][0] =enb_properties->properties[i]->otg_app_type[k];// BCBR; //MCBR, BCBR
1087
      
1088 1089 1090
	  printf("[OTG] configuring traffic type %d for  eNB %d UE %d (Background traffic is %s)\n",
	  g_otg->application_type[i][j][0], i, j,(g_otg->background[i][j][0]==1)?"Enabled":"Disabled");
	  }
1091
    
1092
	  init_predef_traffic(enb_properties->properties[i]->num_otg_elements, 1);
1093 1094 1095
    
    */
    
1096 1097 1098 1099 1100 1101 1102
  } else if (UE_flag == 1) {
    if (conf_config_file_name != NULL) {
      
      // Here the configuration file is the XER encoded UE capabilities
      // Read it in and store in asn1c data structures
      strcpy(uecap_xer,conf_config_file_name);
      uecap_xer_in=1;
1103

1104
    }
knopp's avatar
knopp committed
1105
  }
knopp's avatar
knopp committed
1106
}
1107
  
1108 1109 1110
#if T_TRACER
int T_wait = 1;       /* by default we wait for the tracer */
int T_port = 2021;    /* default port to listen to to wait for the tracer */
1111
int T_dont_fork = 0;  /* default is to fork, see 'T_init' to understand */