lte-softmodem.c 63.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

Raymond Knopp's avatar
 
Raymond Knopp committed
28
*******************************************************************************/
29

30 31
/*! \file lte-enb.c
 * \brief Top-level threads for eNodeB
32
 * \author R. Knopp, F. Kaltenberger, Navid Nikaein
Raymond Knopp's avatar
 
Raymond Knopp committed
33 34 35
 * \date 2012
 * \version 0.1
 * \company Eurecom
36
 * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr
Raymond Knopp's avatar
 
Raymond Knopp committed
37 38 39
 * \note
 * \warning
 */
Raymond Knopp's avatar
 
Raymond Knopp committed
40
#define _GNU_SOURCE
41 42 43 44 45 46 47 48
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sched.h>
49
#include <linux/sched.h>
50 51 52
#include <signal.h>
#include <execinfo.h>
#include <getopt.h>
53
#include <sys/sysinfo.h>
54

55 56
#include "T.h"

57
#include "rt_wrapper.h"
58

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

61
#include "assertions.h"
62
#include "msc.h"
63 64

#include "PHY/types.h"
65

66
#include "PHY/defs.h"
67
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
Raymond Knopp's avatar
 
Raymond Knopp committed
68
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
69

Raymond Knopp's avatar
 
Raymond Knopp committed
70
#include "../../ARCH/COMMON/common_lib.h"
71
#include "../../ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
Raymond Knopp's avatar
 
Raymond Knopp committed
72

Raymond Knopp's avatar
 
Raymond Knopp committed
73
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
74 75 76 77 78 79 80 81 82

#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"
83
#include "LAYER2/MAC/proto.h"
84 85 86 87 88 89 90 91
#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"
Navid Nikaein's avatar
Navid Nikaein committed
92
#include "UTIL/OTG/otg_tx.h"
93
#include "UTIL/OTG/otg_externs.h"
94 95
#include "UTIL/MATH/oml.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
96
#include "UTIL/OPT/opt.h"
97
#include "enb_config.h"
Navid Nikaein's avatar
Navid Nikaein committed
98
//#include "PHY/TOOLS/time_meas.h"
99

Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
100 101 102 103
#ifndef OPENAIR2
#include "UTIL/OTG/otg_vars.h"
#endif

104 105
#if defined(ENABLE_ITTI)
# include "intertask_interface_init.h"
106
# include "create_tasks.h"
107 108
# if defined(ENABLE_USE_MME)
#   include "s1ap_eNB.h"
109
#ifdef PDCP_USE_NETLINK
110 111
#   include "SIMULATION/ETH_TRANSPORT/proto.h"
#endif
112
# endif
113 114
#endif

115 116 117
#ifdef XFORMS
#include "PHY/TOOLS/lte_phy_scope.h"
#include "stats.h"
118 119
#endif

120
// In lte-enb.c
121
extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
122
extern void init_eNB(eNB_func_t);
123
extern void stop_eNB(void);
124
extern void kill_eNB_proc(void);
125

126
// In lte-ue.c
127 128
extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
extern void fill_ue_band_info(void);
129 130
extern void init_UE(void);

131
#ifdef XFORMS
132
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
133
// at eNB 0, an UL scope for every UE
134
FD_lte_phy_scope_ue  *form_ue[NUMBER_OF_UE_MAX];
135
FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
136
FD_stats_form                  *form_stats=NULL,*form_stats_l2=NULL;
137
char title[255];
138
unsigned char                   scope_enb_num_ue = 2;
139 140
#endif //XFORMS

141

142

143 144


Raymond Knopp's avatar
 
Raymond Knopp committed
145

Raymond Knopp's avatar
 
Raymond Knopp committed
146 147
pthread_cond_t sync_cond;
pthread_mutex_t sync_mutex;
148
int sync_var=-1; //!< protected by mutex \ref sync_mutex.
149

150

151 152


153

154
#ifdef XFORMS
Raymond Knopp's avatar
 
Raymond Knopp committed
155
static pthread_t                forms_thread; //xforms
156
#endif
157

158 159
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]
Raymond Knopp's avatar
 
Raymond Knopp committed
160

161

162
#if defined(ENABLE_ITTI)
163 164
volatile int             start_eNB = 0;
volatile int             start_UE = 0;
165
#endif
166 167
volatile int                    oai_exit = 0;

168

169

Raymond Knopp's avatar
 
Raymond Knopp committed
170

171
static char                     UE_flag=0;
172 173
//static uint8_t                  eNB_id=0,UE_id=0;

174
static char                     threequarter_fs=0;
175

176
uint32_t                 downlink_frequency[MAX_NUM_CCs][4];
177
int32_t                  uplink_frequency_offset[MAX_NUM_CCs][4];
Lionel Gauthier's avatar
Lionel Gauthier committed
178

179
openair0_rf_map rf_map[MAX_NUM_CCs];
180

181
static char                    *conf_config_file_name = NULL;
182
#if defined(ENABLE_ITTI)
183
static char                    *itti_dump_file = NULL;
Raymond Knopp's avatar
 
Raymond Knopp committed
184 185
#endif

186
int UE_scan = 1;
187
int UE_scan_carrier = 0;
188 189
runmode_t mode = normal_txrx;

190 191
FILE *input_fd=NULL;

192

193 194
#if MAX_NUM_CCs == 1
rx_gain_t                rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}};
kortke's avatar
kortke committed
195 196
double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0}};
double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0}};
197 198 199 200
#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}};
Lionel Gauthier's avatar
Lionel Gauthier committed
201
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
202

203 204


Raymond Knopp's avatar
 
Raymond Knopp committed
205
double sample_rate=30.72e6;
206
double bw = 10.0e6;
207

208
static int                      tx_max_power[MAX_NUM_CCs]; /* =  {0,0}*/;
209

210 211
char   rf_config_file[1024];

Florian Kaltenberger's avatar
Florian Kaltenberger committed
212
int chain_offset=0;
213
int phy_test = 0;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
214

215

Raymond Knopp's avatar
 
Raymond Knopp committed
216 217 218
char ref[128] = "internal";
char channels[128] = "0";

219
int                      rx_input_level_dBm;
220
static int                      online_log_messages=0;
221
#ifdef XFORMS
222
extern int                      otg_enabled;
223
static char                     do_forms=0;
224
#else
225
int                             otg_enabled;
226
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
227
//int                             number_of_cards =   1;
228

229

Raymond Knopp's avatar
 
Raymond Knopp committed
230
static LTE_DL_FRAME_PARMS      *frame_parms[MAX_NUM_CCs];
231
eNB_func_t node_function=eNodeB_3GPP;
232

Florian Kaltenberger's avatar
Florian Kaltenberger committed
233
uint32_t target_dl_mcs = 28; //maximum allowed mcs
234
uint32_t target_ul_mcs = 20;
235
uint32_t timing_advance = 0;
236 237
uint8_t exit_missed_slots=1;
uint64_t num_missed_slots=0; // counter for the number of missed slots
238

Raymond Knopp's avatar
 
Raymond Knopp committed
239

240 241 242

extern void reset_opp_meas(void);
extern void print_opp_meas(void);
243
int transmission_mode=1;
Raymond Knopp's avatar
 
Raymond Knopp committed
244

245
int16_t           glog_level         = LOG_INFO;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
246
int16_t           glog_verbosity     = LOG_MED;
247
int16_t           hw_log_level       = LOG_INFO;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
248
int16_t           hw_log_verbosity   = LOG_MED;
249
int16_t           phy_log_level      = LOG_INFO;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
250
int16_t           phy_log_verbosity  = LOG_MED;
251
int16_t           mac_log_level      = LOG_INFO;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
252
int16_t           mac_log_verbosity  = LOG_MED;
253
int16_t           rlc_log_level      = LOG_INFO;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
254
int16_t           rlc_log_verbosity  = LOG_MED;
255
int16_t           pdcp_log_level     = LOG_INFO;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
256
int16_t           pdcp_log_verbosity = LOG_MED;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
257
int16_t           rrc_log_level      = LOG_INFO;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
258
int16_t           rrc_log_verbosity  = LOG_MED;
259 260 261
int16_t           opt_log_level      = LOG_INFO;
int16_t           opt_log_verbosity  = LOG_MED;

Lionel Gauthier's avatar
 
Lionel Gauthier committed
262 263 264 265 266 267
# 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
268 269 270
#if defined (ENABLE_SECURITY)
int16_t           osa_log_level      = LOG_INFO;
int16_t           osa_log_verbosity  = LOG_MED;
271
#endif
272

Raymond Knopp's avatar
 
Raymond Knopp committed
273 274 275

#ifdef ETHERNET
char *rrh_UE_ip = "127.0.0.1";
276
int rrh_UE_port = 51000;
Raymond Knopp's avatar
 
Raymond Knopp committed
277 278
#endif

279 280 281 282 283
/* flag set by eNB conf file to specify if the radio head is local or remote (default option is local) */
uint8_t local_remote_radio = BBU_LOCAL_RADIO_HEAD;
/* struct for ethernet specific parameters given in eNB conf file */
eth_params_t *eth_params;

284 285
openair0_config_t openair0_cfg[MAX_CARDS];

286 287 288
// Change to openair_global to handle UE
openair0_device openair0;

289 290
double cpuf;

Raymond Knopp's avatar
 
Raymond Knopp committed
291
char uecap_xer[1024],uecap_xer_in=0;
292 293


Raymond Knopp's avatar
 
Raymond Knopp committed
294

295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
/*---------------------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 };

struct timespec clock_difftime(struct timespec start, struct timespec end)
{
    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;
}

Cedric Roux's avatar
Cedric Roux committed
313
void print_difftimes(void)
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
{
#ifdef DEBUG
    printf("difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec);
#else
    LOG_I(HW,"difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec);
#endif
}

void update_difftimes(struct timespec start, struct timespec end)
{
    struct timespec diff_time = { .tv_sec = 0, .tv_nsec = 0 };
    int             changed = 0;
    diff_time = clock_difftime(start, end);
    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; }
#if 1
    if (changed) print_difftimes();
#endif
}

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

336
unsigned int build_rflocal(int txi, int txq, int rxi, int rxq)
337
{
Raymond Knopp's avatar
 
Raymond Knopp committed
338
  return (txi + (txq<<6) + (rxi<<12) + (rxq<<18));
339 340 341
}
unsigned int build_rfdc(int dcoff_i_rxfe, int dcoff_q_rxfe)
{
Raymond Knopp's avatar
 
Raymond Knopp committed
342
  return (dcoff_i_rxfe + (dcoff_q_rxfe<<8));
343 344
}

345
#if !defined(ENABLE_ITTI)
346 347 348 349 350 351 352 353
void signal_handler(int sig)
{
  void *array[10];
  size_t size;

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

355 356 357 358
    // print out all the frames to stderr
    fprintf(stderr, "Error: signal %d:\n", sig);
    backtrace_symbols_fd(array, size, 2);
    exit(-1);
359 360
  } else {
    printf("trying to exit gracefully...\n");
361
    oai_exit = 1;
362 363
  }
}
364
#endif
365 366 367 368 369 370 371 372 373 374 375
#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");
376
  printf("  --rf-config-file Configuration file for front-end (e.g. LMS7002M)\n");
377 378 379 380
  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");
Raymond Knopp's avatar
 
Raymond Knopp committed
381 382
  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");
383
  printf("  --no-L2-connect bypass L2 and upper layers\n");
384 385 386 387
  printf("  --ue-rxgain set UE RX gain\n");
  printf("  --ue-txgain set UE TX gain\n");
  printf("  --ue-scan_carrier set UE to scan around carrier\n");
  printf("  --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n");
388 389 390
  printf("  --RCC run using NGFI RCC node function\n");
  printf("  --RRU run using NGFI RRU node function\n");
  printf("  --eNB run using 3GPP eNB node function\n");   
391
  printf("  -C Set the downlink frequency for all component carriers\n");
392 393 394
  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");
395
  printf("  -G Set the global log verbosity \n");
396 397 398 399 400
  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
401
  printf("  -r Set the PRB, valid values: 6, 25, 50, 100  \n");    
402 403
  printf("  -S Skip the missed slots/subframes \n");    
  printf("  -t Set the maximum uplink MCS\n");
404
  printf("  -T Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n");
405 406 407
  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");
408 409 410 411 412 413 414
  printf("  -x Set the transmission mode, valid options: 1 \n");
#if T_TRACER
  printf("  --T_port [port]    use given port\n");
  printf("  --T_nowait         don't wait for tracer, start immediately\n");
#endif
  printf(RESET);
  fflush(stdout);
415
}
416

417 418
void exit_fun(const char* s)
{
Raymond Knopp's avatar
Raymond Knopp committed
419 420
  int CC_id;

421
  if (s != NULL) {
422
    printf("%s %s() Exiting OAI softmodem: %s\n",__FILE__, __FUNCTION__, s);
423 424 425
  }

  oai_exit = 1;
Raymond Knopp's avatar
Raymond Knopp committed
426 427 428 429 430 431 432
  
  for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
    if (PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func)
      PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice);
    if (PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func)
      PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice);  
  }
433 434

#if defined(ENABLE_ITTI)
Florian Kaltenberger's avatar
Florian Kaltenberger committed
435
  sleep(1); //allow lte-softmodem threads to exit first
436
  itti_terminate_tasks (TASK_UNKNOWN);
437
#endif
438 439 440

}

441

442
#ifdef XFORMS
443

444 445
void reset_stats(FL_OBJECT *button, long arg)
{
446 447
  int i,j,k;
  PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[0][0];
448 449 450

  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
    for (k=0; k<8; k++) { //harq_processes
451 452 453 454
      for (j=0; j<phy_vars_eNB->dlsch[i][0]->Mlimit; j++) {
        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;
455
      }
456

457 458 459
      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;
460

461 462 463 464 465
      for (j=0; j<phy_vars_eNB->ulsch[i]->Mlimit; j++) {
        phy_vars_eNB->UE_stats[i].ulsch_decoding_attempts[k][j]=0;
        phy_vars_eNB->UE_stats[i].ulsch_decoding_attempts_last[k][j]=0;
        phy_vars_eNB->UE_stats[i].ulsch_round_errors[k][j]=0;
        phy_vars_eNB->UE_stats[i].ulsch_round_fer[k][j]=0;
466
      }
467
    }
468

469 470 471
    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;
472 473 474
  }
}

475 476
static void *scope_thread(void *arg)
{
Raymond Knopp's avatar
 
Raymond Knopp committed
477
  char stats_buffer[16384];
478
# ifdef ENABLE_XFORMS_WRITE_STATS
Raymond Knopp's avatar
 
Raymond Knopp committed
479
  FILE *UE_stats, *eNB_stats;
480
# endif
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
481
  int len = 0;
Raymond Knopp's avatar
 
Raymond Knopp committed
482
  struct sched_param sched_param;
483
  int UE_id, CC_id;
484
  int ue_cnt=0;
485

486
  sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
Raymond Knopp's avatar
 
Raymond Knopp committed
487
  sched_setscheduler(0, SCHED_FIFO,&sched_param);
488

Raymond Knopp's avatar
 
Raymond Knopp committed
489
  printf("Scope thread has priority %d\n",sched_param.sched_priority);
490

491
# ifdef ENABLE_XFORMS_WRITE_STATS
492 493

  if (UE_flag==1)
Raymond Knopp's avatar
 
Raymond Knopp committed
494
    UE_stats  = fopen("UE_stats.txt", "w");
495
  else
Raymond Knopp's avatar
 
Raymond Knopp committed
496
    eNB_stats = fopen("eNB_stats.txt", "w");
497

498
#endif
499

Raymond Knopp's avatar
 
Raymond Knopp committed
500 501
  while (!oai_exit) {
    if (UE_flag==1) {
502
      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
503 504 505
      //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);
506

507 508 509 510 511
      phy_scope_UE(form_ue[0],
                   PHY_vars_UE_g[0][0],
                   0,
                   0,7);

Raymond Knopp's avatar
 
Raymond Knopp committed
512
    } else {
513 514 515 516 517 518
      if (PHY_vars_eNB_g[0][0]->mac_enabled==1) {
	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);
      }
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
519
      len = dump_eNB_stats (PHY_vars_eNB_g[0][0], stats_buffer, 0);
520

Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
521
      if (MAX_NUM_CCs>1)
522 523
        len += dump_eNB_stats (PHY_vars_eNB_g[0][1], &stats_buffer[len], 0);

524 525 526
      //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);
527

528 529
      ue_cnt=0;
      for(UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
530
	for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
531
	  if ((PHY_vars_eNB_g[0][CC_id]->dlsch[UE_id][0]->rnti>0) && (ue_cnt<scope_enb_num_ue)) {
gauthier's avatar
gauthier committed
532
	    phy_scope_eNB(form_enb[CC_id][ue_cnt],
533 534 535 536
			  PHY_vars_eNB_g[0][CC_id],
			  UE_id);
	    ue_cnt++;
	  }
537
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
538
      }
539

540
    }
541

Raymond Knopp's avatar
 
Raymond Knopp committed
542
    //printf("doing forms\n");
Florian Kaltenberger's avatar
Florian Kaltenberger committed
543 544
    //usleep(100000); // 100 ms
    sleep(1);
Raymond Knopp's avatar
 
Raymond Knopp committed
545
  }
546

547
  //  printf("%s",stats_buffer);
548

549
# ifdef ENABLE_XFORMS_WRITE_STATS
550

551 552 553 554 555 556
  if (UE_flag==1) {
    if (UE_stats) {
      rewind (UE_stats);
      fwrite (stats_buffer, 1, len, UE_stats);
      fclose (UE_stats);
    }
557
  } else {
558 559 560 561 562 563
    if (eNB_stats) {
      rewind (eNB_stats);
      fwrite (stats_buffer, 1, len, eNB_stats);
      fclose (eNB_stats);
    }
  }
564

565
# endif
566

Raymond Knopp's avatar
 
Raymond Knopp committed
567
  pthread_exit((void*)arg);
568 569 570
}
#endif

571

572

573

Raymond Knopp's avatar
 
Raymond Knopp committed
574
#if defined(ENABLE_ITTI)
575
void *l2l1_task(void *arg)
576
{
Raymond Knopp's avatar
 
Raymond Knopp committed
577 578 579 580 581
  MessageDef *message_p = NULL;
  int         result;

  itti_set_task_real_time(TASK_L2L1);
  itti_mark_task_ready(TASK_L2L1);
582

Raymond Knopp's avatar
 
Raymond Knopp committed
583 584
  if (UE_flag == 0) {
    /* Wait for the initialize message */
585
    printf("Wait for the ITTI initialize message\n");
586 587 588 589 590
    do {
      if (message_p != NULL) {
        result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
        AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
591

592
      itti_receive_msg (TASK_L2L1, &message_p);
593

594 595 596 597 598 599
      switch (ITTI_MSG_ID(message_p)) {
      case INITIALIZE_MESSAGE:
        /* Start eNB thread */
        LOG_D(EMU, "L2L1 TASK received %s\n", ITTI_MSG_NAME(message_p));
        start_eNB = 1;
        break;
600

601 602 603 604 605
      case TERMINATE_MESSAGE:
        printf("received terminate message\n");
        oai_exit=1;
        itti_exit_task ();
        break;
606

607 608 609 610 611
      default:
        LOG_E(EMU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p));
        break;
      }
    } while (ITTI_MSG_ID(message_p) != INITIALIZE_MESSAGE);
612

613 614 615
    result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
    AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
  }
616

617 618 619
  do {
    // Wait for a message
    itti_receive_msg (TASK_L2L1, &message_p);
620

621 622 623 624 625
    switch (ITTI_MSG_ID(message_p)) {
    case TERMINATE_MESSAGE:
      oai_exit=1;
      itti_exit_task ();
      break;
Raymond Knopp's avatar
 
Raymond Knopp committed
626

627 628 629
    case ACTIVATE_MESSAGE:
      start_UE = 1;
      break;
630

631 632 633
    case DEACTIVATE_MESSAGE:
      start_UE = 0;
      break;
634

635 636 637
    case MESSAGE_TEST:
      LOG_I(EMU, "Received %s\n", ITTI_MSG_NAME(message_p));
      break;
638

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

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

648 649
  return NULL;
}
Raymond Knopp's avatar
 
Raymond Knopp committed
650
#endif
651

652

653

654

655 656
static void get_options (int argc, char **argv)
{
657 658 659
  int c;
  //  char                          line[1000];
  //  int                           l;
660
  int k,i;//,j,k;
661
#if defined(OAI_USRP) || defined(CPRIGW)
662
  int clock_src;
663
#endif
664
  int CC_id;
665 666


667 668

  const Enb_properties_array_t *enb_properties;
669

670 671
  enum long_option_e {
    LONG_OPTION_START = 0x100, /* Start after regular single char options */
672
    LONG_OPTION_RF_CONFIG_FILE,
673 674 675 676 677
    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,
678
    LONG_OPTION_NO_L2_CONNECT,
Raymond Knopp's avatar
 
Raymond Knopp committed
679
    LONG_OPTION_CALIB_PRACH_TX,
680 681
    LONG_OPTION_RXGAIN,
    LONG_OPTION_TXGAIN,
682
    LONG_OPTION_SCANCARRIER,
683 684
    LONG_OPTION_MAXPOWER,
    LONG_OPTION_DUMP_FRAME,
685
    LONG_OPTION_LOOPMEMORY,
686 687 688
    LONG_OPTION_PHYTEST,
    LONG_OPTION_RCC,
    LONG_OPTION_RRU,
689 690
    LONG_OPTION_ENB,
    LONG_OPTION_ENB_BBU
691
#if T_TRACER
692
    ,
693 694 695
    LONG_OPTION_T_PORT,
    LONG_OPTION_T_NOWAIT,
#endif
696
  };
697

698
  static const struct option long_options[] = {
699
    {"rf-config-file",required_argument,  NULL, LONG_OPTION_RF_CONFIG_FILE},
700 701 702 703 704 705
    {"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},
Raymond Knopp's avatar
 
Raymond Knopp committed
706 707 708 709
    {"calib-prach-tx",   no_argument,        NULL, LONG_OPTION_CALIB_PRACH_TX},
    {"ue-rxgain",   required_argument,  NULL, LONG_OPTION_RXGAIN},
    {"ue-txgain",   required_argument,  NULL, LONG_OPTION_TXGAIN},
    {"ue-scan-carrier",   no_argument,  NULL, LONG_OPTION_SCANCARRIER},
710
    {"ue-max-power",   required_argument,  NULL, LONG_OPTION_MAXPOWER},
711 712
    {"ue-dump-frame", no_argument, NULL, LONG_OPTION_DUMP_FRAME},
    {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY},
713
    {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST},
714 715 716
    {"RCC", no_argument, NULL, LONG_OPTION_RCC},
    {"RRU", no_argument, NULL, LONG_OPTION_RRU},
    {"eNB", no_argument, NULL, LONG_OPTION_ENB},
717
    {"BBU", no_argument, NULL, LONG_OPTION_ENB_BBU},
718 719 720 721
#if T_TRACER
    {"T_port",                 required_argument, 0, LONG_OPTION_T_PORT},
    {"T_nowait",               no_argument,       0, LONG_OPTION_T_NOWAIT},
#endif
722 723 724
    {NULL, 0, NULL, 0}
  };

725
  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) {
726
    switch (c) {
727
    case LONG_OPTION_RF_CONFIG_FILE:
728 729 730 731 732 733
      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 {
734 735 736 737
         printf("Configuration filename is too long\n");
         exit(-1);   
      }
      break;
738 739 740 741
    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];
742
      break;
743 744 745 746
    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;
747

748 749 750 751 752
    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;
753

754 755 756 757
    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);
Raymond Knopp's avatar
 
Raymond Knopp committed
758
      break;
759

760 761 762 763 764
    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;
765

766 767 768
    case LONG_OPTION_DEBUG_UE_PRACH:
      mode = debug_prach;
      break;
769

770 771 772
    case LONG_OPTION_NO_L2_CONNECT:
      mode = no_L2_connect;
      break;
773

Raymond Knopp's avatar
 
Raymond Knopp committed
774 775 776 777
    case LONG_OPTION_CALIB_PRACH_TX:
      mode = calib_prach_tx;
      break;

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

782
      break;
783

784 785 786
    case LONG_OPTION_TXGAIN:
      for (i=0; i<4; i++)
        tx_gain[0][i] = atof(optarg);
787

788
      break;
789

790 791 792 793 794
    case LONG_OPTION_SCANCARRIER:
      UE_scan_carrier=1;

      break;

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

801 802 803 804
    case LONG_OPTION_DUMP_FRAME:
      mode = rx_dump_frame;
      break;
      
805 806 807
    case LONG_OPTION_PHYTEST:
      phy_test = 1;
      break;
808 809 810 811 812 813 814 815 816 817 818 819

    case LONG_OPTION_RCC:
      node_function = NGFI_RCC_IF4;
      break;

    case LONG_OPTION_RRU:
      node_function = NGFI_RRU_IF4;
      break;

    case LONG_OPTION_ENB:
      node_function = eNodeB_3GPP;
      break;
820 821 822 823

    case LONG_OPTION_ENB_BBU:
      node_function = eNodeB_3GPP_BBU;
      break;
824
      
825 826 827 828 829 830 831 832 833 834 835 836 837 838 839
#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;
    }
#endif

840 841 842 843
    case 'A':
      timing_advance = atoi (optarg);
      break;

844
    case 'C':
845 846 847 848 849 850
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
        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]);
851
      }
852

853
      UE_scan=0;
854

855
      break;
856

Florian Kaltenberger's avatar
Florian Kaltenberger committed
857 858 859 860
    case 'a':
      chain_offset = atoi(optarg);
      break;

861 862 863 864
    case 'd':
#ifdef XFORMS
      do_forms=1;
      printf("Running with XFORMS!\n");
Raymond Knopp's avatar
 
Raymond Knopp committed
865
#endif
866
      break;
867 868 869 870
      
    case 'E':
      threequarter_fs=1;
      break;
871

872 873 874
    case 'K':
#if defined(ENABLE_ITTI)
      itti_dump_file = strdup(optarg);
875
#else
876
      printf("-K option is disabled when ENABLE_ITTI is not defined\n");
Raymond Knopp's avatar
 
Raymond Knopp committed
877
#endif
878
      break;
879

880 881 882
    case 'O':
      conf_config_file_name = optarg;
      break;
883

884 885 886
    case 'U':
      UE_flag = 1;
      break;
887

888 889 890
    case 'm':
      target_dl_mcs = atoi (optarg);
      break;
891

892 893 894
    case 't':
      target_ul_mcs = atoi (optarg);
      break;
895

896 897 898 899 900 901 902
    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");
      /*
903 904 905
      if (optarg == NULL){
      in_ip[0] =NULL;
      printf("Enabling OPT for wireshark for local interface");
906
      } else {
907 908 909
      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);
910 911 912
      }
      */
      break;
913

914
    case 'P':
915 916
      opt_type = OPT_PCAP;
      opt_enabled=1;
917 918 919 920 921

      if (optarg == NULL) {
        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");
922
      } else {
923 924 925
        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);
926
      }
927 928 929

      break;

Raymond Knopp's avatar
 
Raymond Knopp committed
930 931 932
    case 'V':
      ouput_vcd = 1;
      break;
933

Raymond Knopp's avatar
 
Raymond Knopp committed
934
    case  'q':
Raymond Knopp's avatar
 
Raymond Knopp committed
935 936
      opp_enabled = 1;
      break;
937

Raymond Knopp's avatar
 
Raymond Knopp committed
938 939 940
    case  'R' :
      online_log_messages =1;
      break;
941

Raymond Knopp's avatar
 
Raymond Knopp committed
942
    case 'r':
943
      UE_scan = 0;
944

945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
        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;
        }
Raymond Knopp's avatar
 
Raymond Knopp committed
971
      }
972

973
      break;
974

Raymond Knopp's avatar
 
Raymond Knopp committed
975
    case 's':
976
#if defined(OAI_USRP) || defined(CPRIGW)
Raymond Knopp's avatar
 
Raymond Knopp committed
977 978

      clock_src = atoi(optarg);
979

Raymond Knopp's avatar
 
Raymond Knopp committed
980
      if (clock_src == 0) {
981 982 983 984 985
        //  char ref[128] = "internal";
        //strncpy(uhd_ref, ref, strlen(ref)+1);
      } else if (clock_src == 1) {
        //char ref[128] = "external";
        //strncpy(uhd_ref, ref, strlen(ref)+1);
Raymond Knopp's avatar
 
Raymond Knopp committed
986
      }
987

Raymond Knopp's avatar
 
Raymond Knopp committed
988 989 990 991
#else
      printf("Note: -s not defined for ExpressMIMO2\n");
#endif
      break;
992

993 994 995 996
    case 'S':
      exit_missed_slots=0;
      printf("Skip exit for missed slots\n");
      break;
997

998
    case 'g':
Raymond Knopp's avatar
 
Raymond Knopp committed
999
      glog_level=atoi(optarg); // value between 1 - 9
1000
      break;
1001 1002 1003

    case 'F':
      break;
1004

1005 1006 1007
    case 'G':
      glog_verbosity=atoi(optarg);// value from 0, 0x5, 0x15, 0x35, 0x75
      break;
1008

1009 1010
    case 'x':
      transmission_mode = atoi(optarg);
1011

1012 1013
      if (transmission_mode > 7) {
        printf("Transmission mode %d not supported for the moment\n",transmission_mode);
1014
        exit(-1);
1015
      }
1016
      break;
1017

1018 1019 1020
    case 'T':
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) 
	frame_parms[CC_id]->frame_type = TDD;
1021
      break;
1022

1023 1024 1025 1026
    case 'h':
      help ();
      exit (-1);
       
Raymond Knopp's avatar
 
Raymond Knopp committed
1027
    default:
1028 1029
      help ();
      exit (-1);
Raymond Knopp's avatar
 
Raymond Knopp committed
1030
      break;
1031 1032
    }
  }
1033

Raymond Knopp's avatar
 
Raymond Knopp committed
1034 1035
  if (UE_flag == 0)
    AssertFatal(conf_config_file_name != NULL,"Please provide a configuration file\n");
1036 1037


Raymond Knopp's avatar
 
Raymond Knopp committed
1038
  if ((UE_flag == 0) && (conf_config_file_name != NULL)) {
1039
    int i,j;
1040

Raymond Knopp's avatar
 
Raymond Knopp committed
1041
    NB_eNB_INST = 1;
1042

Raymond Knopp's avatar
 
Raymond Knopp committed
1043 1044
    /* Read eNB configuration file */
    enb_properties = enb_config_init(conf_config_file_name);
1045

Raymond Knopp's avatar
 
Raymond Knopp committed
1046
    AssertFatal (NB_eNB_INST <= enb_properties->number,
1047 1048
                 "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!",
                 conf_config_file_name, NB_eNB_INST, enb_properties->number);
1049

Raymond Knopp's avatar
 
Raymond Knopp committed
1050
    /* Update some simulation parameters */
1051
    for (i=0; i < enb_properties->number; i++) {
1052
      AssertFatal (MAX_NUM_CCs == enb_properties->properties[i]->nb_cc,
1053 1054
                   "lte-softmodem compiled with MAX_NUM_CCs=%d, but only %d CCs configured for eNB %d!",
                   MAX_NUM_CCs, enb_properties->properties[i]->nb_cc, i);
1055 1056
      eth_params = (eth_params_t*)malloc(enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t));
      memset(eth_params, 0, enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t));
1057

1058
      for (j=0; j<enb_properties->properties[i]->nb_rrh_gw; j++) {
1059 1060 1061 1062 1063 1064 1065 1066
        	
        if (enb_properties->properties[i]->rrh_gw_config[j].active == 1 ) {
          local_remote_radio = BBU_REMOTE_RADIO_HEAD;
          (eth_params+j)->local_if_name             = enb_properties->properties[i]->rrh_gw_if_name;
          (eth_params+j)->my_addr                   = enb_properties->properties[i]->rrh_gw_config[j].local_address;
          (eth_params+j)->my_port                   = enb_properties->properties[i]->rrh_gw_config[j].local_port;
          (eth_params+j)->remote_addr               = enb_properties->properties[i]->rrh_gw_config[j].remote_address;
          (eth_params+j)->remote_port               = enb_properties->properties[i]->rrh_gw_config[j].remote_port;
1067 1068 1069 1070 1071 1072 1073
          
          if (enb_properties->properties[i]->rrh_gw_config[j].raw == 1) {
            (eth_params+j)->transp_preference       = ETH_RAW_MODE; 
          } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif4 == 1) {
            (eth_params+j)->transp_preference       = ETH_RAW_IF4_MODE;             
          } else if (enb_properties->properties[i]->rrh_gw_config[j].udpif4 == 1) {
            (eth_params+j)->transp_preference       = ETH_UDP_IF4_MODE;             
1074 1075
          } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif5_mobipass == 1) {
            (eth_params+j)->transp_preference       = ETH_RAW_IF5_MOBIPASS;             
1076 1077 1078 1079
          } else {
            (eth_params+j)->transp_preference       = ETH_UDP_MODE;	 
          }
          
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
          (eth_params+j)->iq_txshift                = enb_properties->properties[i]->rrh_gw_config[j].iq_txshift;
          (eth_params+j)->tx_sample_advance         = enb_properties->properties[i]->rrh_gw_config[j].tx_sample_advance;
          (eth_params+j)->tx_scheduling_advance     = enb_properties->properties[i]->rrh_gw_config[j].tx_scheduling_advance;
          if (enb_properties->properties[i]->rrh_gw_config[j].exmimo == 1) {
            (eth_params+j)->rf_preference          = EXMIMO_DEV;
          } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_b200 == 1) {
            (eth_params+j)->rf_preference          = USRP_B200_DEV;
          } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_x300 == 1) {
            (eth_params+j)->rf_preference          = USRP_X300_DEV;
          } else if (enb_properties->properties[i]->rrh_gw_config[j].bladerf == 1) {
            (eth_params+j)->rf_preference          = BLADERF_DEV;
          } else if (enb_properties->properties[i]->rrh_gw_config[j].lmssdr == 1) {
            //(eth_params+j)->rf_preference          = LMSSDR_DEV;
          } else {
            (eth_params+j)->rf_preference          = 0;
          } 
        } else {
          local_remote_radio = BBU_LOCAL_RADIO_HEAD; 
        }
1099 1100 1101
	
      }

1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
        frame_parms[CC_id]->frame_type =       enb_properties->properties[i]->frame_type[CC_id];
        frame_parms[CC_id]->tdd_config =       enb_properties->properties[i]->tdd_config[CC_id];
        frame_parms[CC_id]->tdd_config_S =     enb_properties->properties[i]->tdd_config_s[CC_id];
        frame_parms[CC_id]->Ncp =              enb_properties->properties[i]->prefix_type[CC_id];

        //for (j=0; j < enb_properties->properties[i]->nb_cc; j++ ){
        frame_parms[CC_id]->Nid_cell            =  enb_properties->properties[i]->Nid_cell[CC_id];
        frame_parms[CC_id]->N_RB_DL             =  enb_properties->properties[i]->N_RB_DL[CC_id];
        frame_parms[CC_id]->N_RB_UL             =  enb_properties->properties[i]->N_RB_DL[CC_id];
        frame_parms[CC_id]->nb_antennas_tx      =  enb_properties->properties[i]->nb_antennas_tx[CC_id];
        frame_parms[CC_id]->nb_antennas_tx_eNB  =  enb_properties->properties[i]->nb_antennas_tx[CC_id];
        frame_parms[CC_id]->nb_antennas_rx      =  enb_properties->properties[i]->nb_antennas_rx[CC_id];
        //} // j
Raymond Knopp's avatar
 
Raymond Knopp committed
1116 1117
      }

1118

1119 1120 1121
      init_all_otg(0);
      g_otg->seed = 0;
      init_seeds(g_otg->seed);
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131

      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

        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");
1132
      }
1133

1134
      init_predef_traffic(enb_properties->properties[i]->num_otg_elements, 1);
1135 1136


1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150
      glog_level                     = enb_properties->properties[i]->glog_level;
      glog_verbosity                 = enb_properties->properties[i]->glog_verbosity;
      hw_log_level                   = enb_properties->properties[i]->hw_log_level;
      hw_log_verbosity               = enb_properties->properties[i]->hw_log_verbosity ;
      phy_log_level                  = enb_properties->properties[i]->phy_log_level;
      phy_log_verbosity              = enb_properties->properties[i]->phy_log_verbosity;
      mac_log_level                  = enb_properties->properties[i]->mac_log_level;
      mac_log_verbosity              = enb_properties->properties[i]->mac_log_verbosity;
      rlc_log_level                  = enb_properties->properties[i]->rlc_log_level;
      rlc_log_verbosity              = enb_properties->properties[i]->rlc_log_verbosity;
      pdcp_log_level                 = enb_properties->properties[i]->pdcp_log_level;
      pdcp_log_verbosity             = enb_properties->properties[i]->pdcp_log_verbosity;
      rrc_log_level                  = enb_properties->properties[i]->rrc_log_level;
      rrc_log_verbosity              = enb_properties->properties[i]->rrc_log_verbosity;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1151 1152 1153 1154 1155 1156
# if defined(ENABLE_USE_MME)
      gtpu_log_level                 = enb_properties->properties[i]->gtpu_log_level;
      gtpu_log_verbosity             = enb_properties->properties[i]->gtpu_log_verbosity;
      udp_log_level                  = enb_properties->properties[i]->udp_log_level;
      udp_log_verbosity              = enb_properties->properties[i]->udp_log_verbosity;
#endif
1157 1158 1159
#if defined (ENABLE_SECURITY)
      osa_log_level                  = enb_properties->properties[i]->osa_log_level;
      osa_log_verbosity              = enb_properties->properties[i]->osa_log_verbosity;
1160
#endif
Florian Kaltenberger's avatar
Florian Kaltenberger committed
1161

Raymond Knopp's avatar
 
Raymond Knopp committed
1162
      // adjust the log
1163
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1164 1165 1166 1167 1168 1169 1170 1171 1172 1173
        for (k = 0 ; k < 4; k++) {
          downlink_frequency[CC_id][k]      =       enb_properties->properties[i]->downlink_frequency[CC_id];
          uplink_frequency_offset[CC_id][k] =  enb_properties->properties[i]->uplink_frequency_offset[CC_id];
          rx_gain[CC_id][k]                 =  (double)enb_properties->properties[i]->rx_gain[CC_id];
          tx_gain[CC_id][k]                 =  (double)enb_properties->properties[i]->tx_gain[CC_id];
        }

        printf("Downlink frequency/ uplink offset of CC_id %d set to %ju/%d\n", CC_id,
               enb_properties->properties[i]->downlink_frequency[CC_id],
               enb_properties->properties[i]->uplink_frequency_offset[CC_id]);
Raymond Knopp's avatar
 
Raymond Knopp committed
1174
      } // CC_id
1175
    }// i
1176 1177 1178 1179 1180 1181 1182 1183
  } 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;
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1184
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1185
}
1186

1187 1188 1189 1190 1191
#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 */
#endif

1192 1193
int main( int argc, char **argv )
{
1194
  int i,aa,card=0;
1195
#if defined (XFORMS)
Raymond Knopp's avatar
 
Raymond Knopp committed
1196
  void *status;
1197
#endif
1198

Raymond Knopp's avatar
 
Raymond Knopp committed
1199
  int CC_id;
Raymond Knopp's avatar
 
Raymond Knopp committed
1200
  uint16_t Nid_cell = 0;
1201
  uint8_t  cooperation_flag=0,  abstraction_flag=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1202
  uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2;
1203

Raymond Knopp's avatar
 
Raymond Knopp committed
1204
#if defined (XFORMS)
1205 1206
  int ret;
#endif
1207

1208 1209 1210 1211 1212
#ifdef DEBUG_CONSOLE
  setvbuf(stdout, NULL, _IONBF, 0);
  setvbuf(stderr, NULL, _IONBF, 0);
#endif

1213 1214 1215
  PHY_VARS_UE *UE[MAX_NUM_CCs];

  mode = normal_txrx;
1216
  memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS);
1217

1218
  memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs);
Raymond Knopp's avatar
 
Raymond Knopp committed
1219
  set_latency_target();
1220

1221
  // det defaults
1222
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1223 1224
    frame_parms[CC_id] = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS));
    /* Set some default values that may be overwritten while reading options */
1225
    frame_parms[CC_id]->frame_type          = FDD;
Raymond Knopp's avatar
 
Raymond Knopp committed
1226 1227
    frame_parms[CC_id]->tdd_config          = 3;
    frame_parms[CC_id]->tdd_config_S        = 0;
1228 1229
    frame_parms[CC_id]->N_RB_DL             = 100;
    frame_parms[CC_id]->N_RB_UL             = 100;
Raymond Knopp's avatar
 
Raymond Knopp committed
1230
    frame_parms[CC_id]->Ncp                 = NORMAL;
Raymond Knopp's avatar
 
Raymond Knopp committed
1231 1232
    frame_parms[CC_id]->Ncp_UL              = NORMAL;
    frame_parms[CC_id]->Nid_cell            = Nid_cell;
Raymond Knopp's avatar
 
Raymond Knopp committed
1233
    frame_parms[CC_id]->num_MBSFN_config    = 0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1234 1235 1236
    frame_parms[CC_id]->nb_antennas_tx_eNB  = 1;
    frame_parms[CC_id]->nb_antennas_tx      = 1;
    frame_parms[CC_id]->nb_antennas_rx      = 1;
Raymond Knopp's avatar
 
Raymond Knopp committed
1237
  }
1238

1239 1240 1241 1242 1243
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
    downlink_frequency[CC_id][0] = 2680000000; // 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];
1244
    //printf("Downlink for CC_id %d frequency set to %u\n", CC_id, downlink_frequency[CC_id][0]);
1245
  }
1246 1247
  logInit();
 
1248
  rf_config_file[0]='\0';
1249
  get_options (argc, argv); //Command-line options
1250 1251 1252 1253
  if (rf_config_file[0] == '\0')
    openair0_cfg[0].configFilename = NULL;
  else
    openair0_cfg[0].configFilename = rf_config_file;
1254
  
1255 1256 1257 1258
#if T_TRACER
  T_init(T_port, T_wait);
#endif

1259
  // initialize the log (see log.h for details)
Florian Kaltenberger's avatar
Florian Kaltenberger committed
1260 1261
  set_glog(glog_level, glog_verbosity);

1262 1263
  //randominit (0);
  set_taus_seed (0);
Raymond Knopp's avatar
 
Raymond Knopp committed
1264

1265 1266
  if (UE_flag==1) {
    printf("configuring for UE\n");
1267

1268 1269
    set_comp_log(HW,      LOG_DEBUG,  LOG_HIGH, 1);
    set_comp_log(PHY,     LOG_DEBUG,   LOG_HIGH, 1);
1270 1271 1272 1273 1274
    set_comp_log(MAC,     LOG_INFO,   LOG_HIGH, 1);
    set_comp_log(RLC,     LOG_INFO,   LOG_HIGH, 1);
    set_comp_log(PDCP,    LOG_INFO,   LOG_HIGH, 1);
    set_comp_log(OTG,     LOG_INFO,   LOG_HIGH, 1);
    set_comp_log(RRC,     LOG_INFO,   LOG_HIGH, 1);
1275
#if defined(ENABLE_ITTI)
1276
    set_comp_log(EMU,     LOG_INFO,   LOG_MED, 1);
1277
# if defined(ENABLE_USE_MME)
1278
    set_comp_log(NAS,     LOG_INFO,   LOG_HIGH, 1);
1279 1280
# endif
#endif
1281 1282
  } else {
    printf("configuring for eNB\n");
1283

1284 1285 1286 1287 1288 1289 1290 1291
    set_comp_log(HW,      hw_log_level, hw_log_verbosity, 1);
    set_comp_log(PHY,     phy_log_level,   phy_log_verbosity, 1);
    if (opt_enabled == 1 )
      set_comp_log(OPT,   opt_log_level,      opt_log_verbosity, 1);
    set_comp_log(MAC,     mac_log_level,  mac_log_verbosity, 1);
    set_comp_log(RLC,     rlc_log_level,   rlc_log_verbosity, 1);
    set_comp_log(PDCP,    pdcp_log_level,  pdcp_log_verbosity, 1);
    set_comp_log(RRC,     rrc_log_level,  rrc_log_verbosity, 1);
1292
#if defined(ENABLE_ITTI)
1293
    set_comp_log(EMU,     LOG_INFO,   LOG_MED, 1);
1294
# if defined(ENABLE_USE_MME)
1295 1296 1297 1298
    set_comp_log(UDP_,    udp_log_level,   udp_log_verbosity, 1);
    set_comp_log(GTPU,    gtpu_log_level,   gtpu_log_verbosity, 1);
    set_comp_log(S1AP,    LOG_DEBUG,   LOG_HIGH, 1);
    set_comp_log(SCTP,    LOG_INFO,   LOG_HIGH, 1);
1299
# endif
1300
#if defined(ENABLE_SECURITY)
1301
    set_comp_log(OSA,    osa_log_level,   osa_log_verbosity, 1);
1302
#endif
1303
#endif
1304
#ifdef LOCALIZATION
1305 1306 1307 1308 1309 1310 1311 1312 1313
    set_comp_log(LOCALIZE, LOG_DEBUG, LOG_LOW, 1);
    set_component_filelog(LOCALIZE);
#endif
    set_comp_log(ENB_APP, LOG_INFO, LOG_HIGH, 1);
    set_comp_log(OTG,     LOG_INFO,   LOG_HIGH, 1);

    if (online_log_messages == 1) {
      set_component_filelog(RRC);
      set_component_filelog(PDCP);
Raymond Knopp's avatar
 
Raymond Knopp committed
1314
    }
1315
  }
1316

Raymond Knopp's avatar
 
Raymond Knopp committed
1317 1318
  if (ouput_vcd) {
    if (UE_flag==1)
1319
      VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_UE.vcd");
Raymond Knopp's avatar
 
Raymond Knopp committed
1320
    else
1321
      VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_eNB.vcd");
Raymond Knopp's avatar
 
Raymond Knopp committed
1322
  }
1323

1324
  if (opp_enabled ==1){
1325
    reset_opp_meas();
1326 1327
  }
  cpuf=get_cpu_freq_GHz();
1328

1329
#if defined(ENABLE_ITTI)
1330

Raymond Knopp's avatar
 
Raymond Knopp committed
1331 1332
  if (UE_flag == 1) {
    log_set_instance_type (LOG_INSTANCE_UE);
1333
  } else {
Raymond Knopp's avatar
 
Raymond Knopp committed
1334 1335
    log_set_instance_type (LOG_INSTANCE_ENB);
  }
1336

Raymond Knopp's avatar
 
Raymond Knopp committed
1337
  itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file);
1338
 
1339 1340
  // initialize mscgen log after ITTI
  MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX);
1341 1342
#endif
 
1343 1344
  if (opt_type != OPT_NONE) {
    radio_type_t radio_type;
1345

1346 1347
    if (frame_parms[0]->frame_type == FDD)
      radio_type = RADIO_TYPE_FDD;
1348
    else
1349
      radio_type = RADIO_TYPE_TDD;
1350

1351 1352 1353
    if (init_opt(in_path, in_ip, NULL, radio_type) == -1)
      LOG_E(OPT,"failed to run OPT \n");
  }
1354

1355
#ifdef PDCP_USE_NETLINK
Raymond Knopp's avatar
 
Raymond Knopp committed
1356
  netlink_init();
1357 1358 1359
#if defined(PDCP_USE_NETLINK_QUEUES)
  pdcp_netlink_init();
#endif
1360 1361
#endif

1362
#if !defined(ENABLE_ITTI)
Raymond Knopp's avatar
 
Raymond Knopp committed
1363 1364 1365
  // to make a graceful exit when ctrl-c is pressed
  signal(SIGSEGV, signal_handler);
  signal(SIGINT, signal_handler);
1366
#endif
1367

1368

Raymond Knopp's avatar
 
Raymond Knopp committed
1369 1370 1371
  check_clock();

  // init the parameters
1372
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1373
    frame_parms[CC_id]->nushift            = 0;
1374

1375 1376 1377 1378 1379 1380 1381 1382 1383
    if (UE_flag==0) {

    } else {
      //UE_flag==1
      frame_parms[CC_id]->nb_antennas_tx     = 1;
      frame_parms[CC_id]->nb_antennas_rx     = 1;
      frame_parms[CC_id]->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; //initial value overwritten by initial sync later
    }

Raymond Knopp's avatar
 
Raymond Knopp committed
1384 1385 1386 1387 1388 1389 1390 1391
    frame_parms[CC_id]->mode1_flag         = (transmission_mode == 1) ? 1 : 0;
    frame_parms[CC_id]->phich_config_common.phich_resource = oneSixth;
    frame_parms[CC_id]->phich_config_common.phich_duration = normal;
    // UL RS Config
    frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0
    frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 0;
    frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
    frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
1392
    frame_parms[CC_id]->threequarter_fs = threequarter_fs;
1393 1394
    init_ul_hopping(frame_parms[CC_id]);
    init_frame_parms(frame_parms[CC_id],1);
1395 1396
    //   phy_init_top(frame_parms[CC_id]);
    phy_init_lte_top(frame_parms[CC_id]);
Raymond Knopp's avatar
 
Raymond Knopp committed
1397 1398 1399
  }


1400
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1401
    //init prach for openair1 test
1402
    frame_parms[CC_id]->prach_config_common.rootSequenceIndex=22;
Raymond Knopp's avatar
 
Raymond Knopp committed
1403
    frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1;
1404
    frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1405 1406 1407
    frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.highSpeedFlag=0;
    frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
    // prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type);
Raymond Knopp's avatar
 
Raymond Knopp committed
1408
    // N_ZC = (prach_fmt <4)?839:139;
Raymond Knopp's avatar
 
Raymond Knopp committed
1409
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1410 1411

  if (UE_flag==1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1412 1413 1414
    NB_UE_INST=1;
    NB_INST=1;

Raymond Knopp's avatar
 
Raymond Knopp committed
1415 1416
    PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE**));
    PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_UE*)*MAX_NUM_CCs);
1417 1418

    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1419 1420 1421 1422

      PHY_vars_UE_g[0][CC_id] = init_lte_UE(frame_parms[CC_id], 0,abstraction_flag,transmission_mode);
      UE[CC_id] = PHY_vars_UE_g[0][CC_id];
      printf("PHY_vars_UE_g[0][%d] = %p\n",CC_id,UE[CC_id]);
1423

1424 1425 1426 1427
      if (phy_test==1)
	UE[CC_id]->mac_enabled = 0;
      else 
	UE[CC_id]->mac_enabled = 1;
1428

1429
      if (UE[CC_id]->mac_enabled == 0) {  //set default UL parameters for testing mode
1430 1431 1432 1433 1434 1435 1436 1437 1438
	for (i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) {
	  UE[CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
	  UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
	  UE[CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI;
	  
	  UE[CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = 0;
	  UE[CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(0%3);
	  UE[CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4;
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1439
      }
1440

1441
      UE[CC_id]->UE_scan = UE_scan;
1442
      UE[CC_id]->UE_scan_carrier = UE_scan_carrier;
1443 1444
      UE[CC_id]->mode    = mode;

1445 1446
      compute_prach_seq(&UE[CC_id]->frame_parms.prach_config_common,
                        UE[CC_id]->frame_parms.frame_type,
1447 1448
                        UE[CC_id]->X_u);

1449
      if (UE[CC_id]->mac_enabled == 1) 
1450
	UE[CC_id]->pdcch_vars[0]->crnti = 0x1234;
1451
      else
1452
	UE[CC_id]->pdcch_vars[0]->crnti = 0x1235;
1453 1454

      UE[CC_id]->rx_total_gain_dB =  (int)rx_gain[CC_id][0];
1455 1456
      UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id];
      UE[CC_id]->N_TA_offset = 0;
1457

Raymond Knopp's avatar
 
Raymond Knopp committed
1458
    }
1459

Raymond Knopp's avatar
 
Raymond Knopp committed
1460
    //  printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power));
1461 1462 1463 1464 1465 1466
  } else {
    //this is eNB
    PHY_vars_eNB_g = malloc(sizeof(PHY_VARS_eNB**));
    PHY_vars_eNB_g[0] = malloc(sizeof(PHY_VARS_eNB*));

    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1467
      PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms[CC_id],0,frame_parms[CC_id]->Nid_cell,cooperation_flag,transmission_mode,abstraction_flag);
1468 1469
      PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id;

1470 1471
      if (phy_test==1) PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0;
      else PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1;
1472

1473
      if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { //set default parameters for testing mode
1474 1475 1476 1477 1478 1479 1480 1481 1482
	for (i=0; i<NUMBER_OF_UE_MAX; i++) {
	  PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
	  PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
	  PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI;
	  
	  PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i;
	  PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3);
	  PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4;
	}
1483 1484
      }

1485 1486
      compute_prach_seq(&PHY_vars_eNB_g[0][CC_id]->frame_parms.prach_config_common,
                        PHY_vars_eNB_g[0][CC_id]->frame_parms.frame_type,
1487
                        PHY_vars_eNB_g[0][CC_id]->X_u);
Raymond Knopp's avatar
 
Raymond Knopp committed
1488

1489
      PHY_vars_eNB_g[0][CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0];
Raymond Knopp's avatar
 
Raymond Knopp committed
1490

1491
      PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0;
1492

1493
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1494 1495


1496 1497 1498 1499
    NB_eNB_INST=1;
    NB_INST=1;

  }
1500

1501 1502
  fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx);
  cpuf=get_cpu_freq_GHz();
1503

1504

Raymond Knopp's avatar
 
Raymond Knopp committed
1505
  dump_frame_parms(frame_parms[0]);
1506

1507 1508 1509
  for (card=0; card<MAX_CARDS; card++) {

    if(frame_parms[0]->N_RB_DL == 100) {
1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521
      if (frame_parms[0]->threequarter_fs) {
	openair0_cfg[card].sample_rate=23.04e6;
	openair0_cfg[card].samples_per_frame = 230400; 
	openair0_cfg[card].tx_bw = 10e6;
	openair0_cfg[card].rx_bw = 10e6;
      }
      else {
	openair0_cfg[card].sample_rate=30.72e6;
	openair0_cfg[card].samples_per_frame = 307200; 
	openair0_cfg[card].tx_bw = 10e6;
	openair0_cfg[card].rx_bw = 10e6;
      }
1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537
    } else if(frame_parms[0]->N_RB_DL == 50) {
      openair0_cfg[card].sample_rate=15.36e6;
      openair0_cfg[card].samples_per_frame = 153600;
      openair0_cfg[card].tx_bw = 5e6;
      openair0_cfg[card].rx_bw = 5e6;
    } else if (frame_parms[0]->N_RB_DL == 25) {
      openair0_cfg[card].sample_rate=7.68e6;
      openair0_cfg[card].samples_per_frame = 76800;
      openair0_cfg[card].tx_bw = 2.5e6;
      openair0_cfg[card].rx_bw = 2.5e6;
    } else if (frame_parms[0]->N_RB_DL == 6) {
      openair0_cfg[card].sample_rate=1.92e6;
      openair0_cfg[card].samples_per_frame = 19200;
      openair0_cfg[card].tx_bw = 1.5e6;
      openair0_cfg[card].rx_bw = 1.5e6;
    }
1538 1539 1540 1541 1542 1543

    if (frame_parms[0]->frame_type==TDD)
      openair0_cfg[card].duplex_mode = duplex_mode_TDD;
    else //FDD
      openair0_cfg[card].duplex_mode = duplex_mode_FDD;

1544
    
1545 1546 1547 1548 1549
    if (local_remote_radio == BBU_REMOTE_RADIO_HEAD) {      
      openair0_cfg[card].remote_addr    = eth_params->remote_addr;
      openair0_cfg[card].remote_port    = eth_params->remote_port;
      openair0_cfg[card].my_addr        = eth_params->my_addr;
      openair0_cfg[card].my_port        = eth_params->my_port;    
1550 1551
    } 
    
1552
    printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card,
1553 1554
           ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx),
           ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx));
Raymond Knopp's avatar
 
Raymond Knopp committed
1555 1556
    openair0_cfg[card].Mod_id = 0;
#ifdef ETHERNET
1557 1558

    if (UE_flag) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1559
      printf("ETHERNET: Configuring UE ETH for %s:%d\n",rrh_UE_ip,rrh_UE_port);
1560
      openair0_cfg[card].remote_addr   = &rrh_UE_ip[0];
1561
      openair0_cfg[card].remote_port = rrh_UE_port;
1562 1563
    } 

1564
    openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
Raymond Knopp's avatar
 
Raymond Knopp committed
1565
#endif
1566

1567
    // in the case of the USRP, the following variables need to be initialized before the init
1568
    // since the USRP only supports one CC (for the moment), we initialize all the cards with first CC.
1569
    // in the case of EXMIMO2, these values are overwirtten in the function setup_eNB/UE_buffer
1570

1571 1572
    openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx));
    openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx));
1573 1574

    for (i=0; i<4; i++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1575

Raymond Knopp's avatar
Raymond Knopp committed
1576 1577 1578 1579 1580 1581 1582 1583 1584 1585
      if (i<openair0_cfg[card].tx_num_channels)
	openair0_cfg[card].tx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] : downlink_frequency[0][i]+uplink_frequency_offset[0][i];
      else
	openair0_cfg[card].tx_freq[i]=0.0;

      if (i<openair0_cfg[card].rx_num_channels)
	openair0_cfg[card].rx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] + uplink_frequency_offset[0][i] : downlink_frequency[0][i];
      else
	openair0_cfg[card].rx_freq[i]=0.0;

1586 1587 1588 1589 1590 1591
      printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n",
             card,i, openair0_cfg[card].tx_gain[i],
             openair0_cfg[card].rx_gain[i],
             openair0_cfg[card].tx_freq[i],
             openair0_cfg[card].rx_freq[i]);
      
1592
      openair0_cfg[card].autocal[i] = 1;
1593
      openair0_cfg[card].tx_gain[i] = tx_gain[0][i];
1594
      if (UE_flag == 0) {
1595
	openair0_cfg[card].rx_gain[i] = PHY_vars_eNB_g[0][0]->rx_total_gain_dB;
1596 1597
      }
      else {
1598
	openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB;
1599
      }
1600 1601


Raymond Knopp's avatar
 
Raymond Knopp committed
1602
    }
1603

1604

Raymond Knopp's avatar
 
Raymond Knopp committed
1605
  }
1606

laurent's avatar
laurent committed
1607
#ifndef DEADLINE_SCHEDULER
1608

1609
  /* Currently we set affinity for UHD to CPU 0 for eNB/UE and only if number of CPUS >2 */
1610 1611 1612 1613 1614 1615
  
  cpu_set_t cpuset;
  int s;
  char cpu_affinity[1024];
  CPU_ZERO(&cpuset);
  #ifdef CPU_AFFINITY
1616
  if (get_nprocs() > 2)
1617
  {
1618 1619 1620 1621 1622 1623 1624
    CPU_SET(0, &cpuset);
    s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
    if (s != 0)
    {
      perror( "pthread_setaffinity_np");
      exit_fun("Error setting processor affinity");
    }
1625 1626 1627
    LOG_I(HW, "Setting the affinity of main function to CPU 0, for device library to use CPU 0 only!\n");
  }
  #endif
1628

1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643
  /* Check the actual affinity mask assigned to the thread */
  s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
  if (s != 0)
  {
    perror( "pthread_getaffinity_np");
    exit_fun("Error getting processor affinity ");
  }
  memset(cpu_affinity, 0 , sizeof(cpu_affinity));
  for (int j = 0; j < CPU_SETSIZE; j++)
  {
    if (CPU_ISSET(j, &cpuset))
    {  
      char temp[1024];
      sprintf(temp, " CPU_%d ", j);    
      strcat(cpu_affinity, temp);
1644 1645
    }
  }
1646
  LOG_I(HW, "CPU Affinity of main() function is... %s\n", cpu_affinity);
1647
#endif
1648 1649 1650 1651
  
  openair0_cfg[0].log_level = glog_level;
  
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1652 1653 1654 1655 1656 1657 1658 1659
    if (node_function == NGFI_RRU_IF4) {
      PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = RRH_HOST;
      PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST;
    } else {
      PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = BBU_HOST;
      PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = BBU_HOST;
    }
  
1660 1661 1662 1663 1664 1665 1666
    PHY_vars_eNB_g[0][CC_id]->rfdevice.type = NONE_DEV;
    PHY_vars_eNB_g[0][CC_id]->rfdevice.transp_type = NONE_TP;
       
    PHY_vars_eNB_g[0][CC_id]->ifdevice.type = NONE_DEV;
    PHY_vars_eNB_g[0][CC_id]->ifdevice.transp_type = NONE_TP;
  }
  
1667 1668 1669 1670 1671 1672
  /* device host type is set*/
  openair0.host_type = BBU_HOST;
  /* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */
  openair0.type = NONE_DEV;
  /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */
  openair0.transp_type = NONE_TP;
1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699
  
  // Legacy BBU - RRH init  
  //int returns=-1;
  ///* BBU can have either a local or a remote radio head */  
  //if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active  - load library of radio head and initiate it
    //if (mode!=loop_through_memory) {
      //returns=openair0_device_load(&openair0, &openair0_cfg[0]);
      //printf("openair0_device_init returns %d\n",returns);
      //if (returns<0) {
	//printf("Exiting, cannot initialize device\n");
	//exit(-1);
      //}
    //}
    //else if (mode==loop_through_memory) {    
    //}
  //}  else { //remote radio head active - load library of transport protocol and initiate it 
    //if (mode!=loop_through_memory) {
      //returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params);
      //printf("openair0_transport_init returns %d\n",returns);
      //if (returns<0) { 
	//printf("Exiting, cannot initialize transport protocol\n");
	//exit(-1);
      //}
    //}
    //else if (mode==loop_through_memory) {    
    //}
  //}   
1700
    
1701
  int returns=-1;
1702 1703
    
  // Handle spatially distributed MIMO antenna ports   
1704
  // Load RF device and initialize
1705
  if (node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { 
1706 1707 1708 1709 1710 1711 1712 1713
    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {  
      if (mode!=loop_through_memory) {
        returns=openair0_device_load(&(PHY_vars_eNB_g[0][CC_id]->rfdevice), &openair0_cfg[0]);
        printf("openair0_device_init returns %d for CC_id %d\n",returns,CC_id);
        if (returns<0) {
	        printf("Exiting, cannot initialize device\n");
	        exit(-1);
        }
1714
      }
1715 1716
      else if (mode==loop_through_memory) {    
      }    
1717
    }
1718 1719 1720
  }  
  
  // Load transport protocol and initialize
1721
  if (node_function != eNodeB_3GPP) { 
1722 1723 1724 1725 1726 1727 1728 1729
    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {  
      if (mode!=loop_through_memory) {
        returns=openair0_transport_load(&(PHY_vars_eNB_g[0][CC_id]->ifdevice), &openair0_cfg[0], (eth_params+CC_id));
        printf("openair0_transport_init returns %d for CC_id %d\n",returns,CC_id);
        if (returns<0) {
	        printf("Exiting, cannot initialize transport protocol\n");
	        exit(-1);
        }
1730
      }
1731 1732
      else if (mode==loop_through_memory) {    
      }    
1733
    }
1734
  }
1735

1736
  printf("Done initializing RF and IF devices\n");
1737
  
1738 1739
  mac_xface = malloc(sizeof(MAC_xface));

Raymond Knopp's avatar
 
Raymond Knopp committed
1740
  int eMBMS_active=0;
1741
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1742
  l2_init(frame_parms[0],eMBMS_active,(uecap_xer_in==1)?uecap_xer:NULL,
1743 1744 1745
	  0,// cba_group_active
	  0); // HO flag
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1746
  mac_xface->macphy_exit = &exit_fun;
1747

winckel's avatar
winckel committed
1748
#if defined(ENABLE_ITTI)
1749

Raymond Knopp's avatar
 
Raymond Knopp committed
1750
  if (create_tasks(UE_flag ? 0 : 1, UE_flag ? 1 : 0) < 0) {
Florian Kaltenberger's avatar
Florian Kaltenberger committed
1751
    printf("cannot create ITTI tasks\n");
Raymond Knopp's avatar
 
Raymond Knopp committed
1752 1753
    exit(-1); // need a softer mode
  }
1754

Raymond Knopp's avatar
 
Raymond Knopp committed
1755
  printf("ITTI tasks created\n");
winckel's avatar
winckel committed
1756
#endif
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
1757

1758 1759 1760 1761 1762 1763 1764 1765
  if (phy_test==0) {
    if (UE_flag==1) {
      printf("Filling UE band info\n");
      fill_ue_band_info();
      mac_xface->dl_phy_sync_success (0, 0, 0, 1);
    } else
      mac_xface->mrbch_phy_sync_failure (0, 0, 0);
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1766

1767
  number_of_cards = 1;
1768

1769

1770
  for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Florian Kaltenberger's avatar
Florian Kaltenberger committed
1771
    rf_map[CC_id].card=0;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
1772
    rf_map[CC_id].chain=CC_id+chain_offset;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
1773
  }
1774

Raymond Knopp's avatar
 
Raymond Knopp committed
1775 1776
  // connect the TX/RX buffers
  if (UE_flag==1) {
1777 1778 1779 1780

    for (CC_id=0;CC_id<MAX_NUM_CCs; CC_id++) {

    
1781
#ifdef OAI_USRP
1782
      UE[CC_id]->hw_timing_advance = timing_advance;
1783
#else
1784
      UE[CC_id]->hw_timing_advance = 160;
1785
#endif
1786
    }
1787
    if (setup_ue_buffers(UE,&openair0_cfg[0],rf_map)!=0) {
1788 1789 1790
      printf("Error setting up eNB buffer\n");
      exit(-1);
    }
1791

1792
    printf("Setting UE buffer to all-RX\n");
1793

1794
    // Set LSBs for antenna switch (ExpressMIMO)
1795
    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1796
      for (i=0; i<frame_parms[CC_id]->samples_per_tti*10; i++)
1797
        for (aa=0; aa<frame_parms[CC_id]->nb_antennas_tx; aa++)
1798
          UE[CC_id]->common_vars.txdata[aa][i] = 0x00010001;
Raymond Knopp's avatar
 
Raymond Knopp committed
1799
    }
1800

1801 1802
    if (input_fd) {
      printf("Reading in from file to antenna buffer %d\n",0);
1803
      if (fread(UE[0]->common_vars.rxdata[0],
1804 1805 1806 1807
	        sizeof(int32_t),
	        frame_parms[0]->samples_per_tti*10,
	        input_fd) != frame_parms[0]->samples_per_tti*10)
        printf("error reading from file\n");
1808
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1809
    //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
1810
  } else {
1811 1812


1813

1814 1815 1816 1817
    if (setup_eNB_buffers(PHY_vars_eNB_g[0],&openair0_cfg[0],rf_map)!=0) {
      printf("Error setting up eNB buffer\n");
      exit(-1);
    }
1818

1819
    printf("Setting eNB buffer to all-RX\n");
1820

1821
    // Set LSBs for antenna switch (ExpressMIMO)
1822
    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1823
      PHY_vars_eNB_g[0][CC_id]->hw_timing_advance = 0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1824
      for (i=0; i<frame_parms[CC_id]->samples_per_tti*10; i++)
1825
        for (aa=0; aa<frame_parms[CC_id]->nb_antennas_tx; aa++)
1826
          PHY_vars_eNB_g[0][CC_id]->common_vars.txdata[0][aa][i] = 0x00010001;
Raymond Knopp's avatar
 
Raymond Knopp committed
1827
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1828
  }
1829

Raymond Knopp's avatar
 
Raymond Knopp committed
1830
  mlockall(MCL_CURRENT | MCL_FUTURE);
1831

Raymond Knopp's avatar
 
Raymond Knopp committed
1832 1833
  pthread_cond_init(&sync_cond,NULL);
  pthread_mutex_init(&sync_mutex, NULL);
1834 1835

#ifdef XFORMS
1836 1837
  int UE_id;

Raymond Knopp's avatar
 
Raymond Knopp committed
1838 1839
  if (do_forms==1) {
    fl_initialize (&argc, argv, NULL, 0, 0);
1840 1841

    if (UE_flag==0) {
1842
      form_stats_l2 = create_form_stats_form();
1843 1844 1845
      fl_show_form (form_stats_l2->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats");
      form_stats = create_form_stats_form();
      fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
1846 1847

      for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860
	for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
	  form_enb[CC_id][UE_id] = create_lte_phy_scope_enb();
	  sprintf (title, "LTE UL SCOPE eNB for CC_id %d, UE %d",CC_id,UE_id);
	  fl_show_form (form_enb[CC_id][UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);

	  if (otg_enabled) {
	    fl_set_button(form_enb[CC_id][UE_id]->button_0,1);
	    fl_set_object_label(form_enb[CC_id][UE_id]->button_0,"DL Traffic ON");
	  } else {
	    fl_set_button(form_enb[CC_id][UE_id]->button_0,0);
	    fl_set_object_label(form_enb[CC_id][UE_id]->button_0,"DL Traffic OFF");
	  }
	}
1861
      }
1862
    } else {
1863 1864 1865 1866 1867 1868 1869
      form_stats = create_form_stats_form();
      fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
      UE_id = 0;
      form_ue[UE_id] = create_lte_phy_scope_ue();
      sprintf (title, "LTE DL SCOPE UE");
      fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);

1870
      /*
Raymond Knopp's avatar
 
Raymond Knopp committed
1871
      if (openair_daq_vars.use_ia_receiver) {
1872 1873 1874 1875 1876
        fl_set_button(form_ue[UE_id]->button_0,1);
        fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON");
      } else {
        fl_set_button(form_ue[UE_id]->button_0,0);
        fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
1877 1878 1879
	}*/
        fl_set_button(form_ue[UE_id]->button_0,0);
        fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
Raymond Knopp's avatar
 
Raymond Knopp committed
1880 1881
    }

Raymond Knopp's avatar
 
Raymond Knopp committed
1882
    ret = pthread_create(&forms_thread, NULL, scope_thread, NULL);
1883

1884 1885
    if (ret == 0)
      pthread_setname_np( forms_thread, "xforms" );
1886

Raymond Knopp's avatar
 
Raymond Knopp committed
1887 1888
    printf("Scope thread created, ret=%d\n",ret);
  }
1889

1890 1891
#endif

1892
  rt_sleep_ns(10*100000000ULL);
1893

1894

1895

Raymond Knopp's avatar
 
Raymond Knopp committed
1896
  // start the main thread
1897
  if (UE_flag == 1) init_UE();
1898
  else init_eNB(node_function);
1899

Raymond Knopp's avatar
 
Raymond Knopp committed
1900
  // Sleep to allow all threads to setup
Raymond Knopp's avatar
 
Raymond Knopp committed
1901
  sleep(1);
Raymond Knopp's avatar
 
Raymond Knopp committed
1902

1903

1904

1905

1906
// *** Handle per CC_id openair0
Raymond Knopp's avatar
 
Raymond Knopp committed
1907
#ifndef USRP_DEBUG
1908
  if ((UE_flag==1) && (mode!=loop_through_memory))
navid's avatar
navid committed
1909 1910 1911
    if (openair0.trx_start_func(&openair0) != 0 ) 
      LOG_E(HW,"Could not start the device\n");

Raymond Knopp's avatar
 
Raymond Knopp committed
1912
#endif
1913

1914

1915
  printf("Sending sync to all threads\n");
1916

Raymond Knopp's avatar
 
Raymond Knopp committed
1917
  pthread_mutex_lock(&sync_mutex);
1918
  sync_var=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1919 1920
  pthread_cond_broadcast(&sync_cond);
  pthread_mutex_unlock(&sync_mutex);
1921

Raymond Knopp's avatar
 
Raymond Knopp committed
1922 1923 1924
  // wait for end of program
  printf("TYPE <CTRL-C> TO TERMINATE\n");
  //getchar();
1925 1926

#if defined(ENABLE_ITTI)
Raymond Knopp's avatar
 
Raymond Knopp committed
1927 1928
  printf("Entering ITTI signals handler\n");
  itti_wait_tasks_end();
1929
  oai_exit=1;
1930
#else
1931

Raymond Knopp's avatar
 
Raymond Knopp committed
1932
  while (oai_exit==0)
1933
    rt_sleep_ns(100000000ULL);
1934

1935
#endif
1936

Raymond Knopp's avatar
 
Raymond Knopp committed
1937
  // stop threads
1938
#ifdef XFORMS
Raymond Knopp's avatar
 
Raymond Knopp committed
1939
  printf("waiting for XFORMS thread\n");
1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953

  if (do_forms==1) {
    pthread_join(forms_thread,&status);
    fl_hide_form(form_stats->stats_form);
    fl_free_form(form_stats->stats_form);

    if (UE_flag==1) {
      fl_hide_form(form_ue[0]->lte_phy_scope_ue);
      fl_free_form(form_ue[0]->lte_phy_scope_ue);
    } else {
      fl_hide_form(form_stats_l2->stats_form);
      fl_free_form(form_stats_l2->stats_form);

      for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
1954 1955 1956 1957
	for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
	  fl_hide_form(form_enb[CC_id][UE_id]->lte_phy_scope_enb);
	  fl_free_form(form_enb[CC_id][UE_id]->lte_phy_scope_enb);
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1958
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1959
    }
1960 1961
  }

1962 1963
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1964
  printf("stopping MODEM threads\n");
1965

Raymond Knopp's avatar
 
Raymond Knopp committed
1966 1967
  // cleanup
  if (UE_flag == 1) {
1968
  } else {
1969
    stop_eNB();
Raymond Knopp's avatar
 
Raymond Knopp committed
1970
  }
1971

1972

Raymond Knopp's avatar
 
Raymond Knopp committed
1973 1974
  pthread_cond_destroy(&sync_cond);
  pthread_mutex_destroy(&sync_mutex);
1975

Raymond Knopp's avatar
Raymond Knopp committed
1976 1977 1978 1979
  // *** Handle per CC_id openair0
  if (UE_flag==1)
    openair0.trx_end_func(&openair0);

1980
  for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
Raymond Knopp committed
1981 1982 1983 1984
    if (PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func)
      PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice);  
    if (PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func)
      PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice);  
1985
  }
1986

Raymond Knopp's avatar
 
Raymond Knopp committed
1987
  if (ouput_vcd)
1988
    VCD_SIGNAL_DUMPER_CLOSE();
1989

1990
  if (opt_enabled == 1)
1991
    terminate_opt();
1992

Raymond Knopp's avatar
 
Raymond Knopp committed
1993
  logClean();
1994

Raymond Knopp's avatar
 
Raymond Knopp committed
1995 1996
  return 0;
}
1997 1998


1999

2000

2001 2002 2003