lte-softmodem.c 63.3 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) {
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
502
      len = dump_ue_stats (PHY_vars_UE_g[0][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 1074 1075 1076 1077
          
          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;             
          } else {
            (eth_params+j)->transp_preference       = ETH_UDP_MODE;	 
          }
          
1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
          (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; 
        }
1097 1098 1099
	
      }

1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
      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
1114 1115
      }

1116

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

      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");
1130
      }
1131

1132
      init_predef_traffic(enb_properties->properties[i]->num_otg_elements, 1);
1133 1134


1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
      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
1149 1150 1151 1152 1153 1154
# 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
1155 1156 1157
#if defined (ENABLE_SECURITY)
      osa_log_level                  = enb_properties->properties[i]->osa_log_level;
      osa_log_verbosity              = enb_properties->properties[i]->osa_log_verbosity;
1158
#endif
Florian Kaltenberger's avatar
Florian Kaltenberger committed
1159

Raymond Knopp's avatar
 
Raymond Knopp committed
1160
      // adjust the log
1161
      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
        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
1172
      } // CC_id
1173
    }// i
1174 1175 1176 1177 1178 1179 1180 1181
  } 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
1182
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1183
}
1184

1185 1186 1187 1188 1189
#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

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

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

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

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

1211 1212 1213
  PHY_VARS_UE *UE[MAX_NUM_CCs];

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

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

1219
  // det defaults
1220
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1221 1222
    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 */
1223
    frame_parms[CC_id]->frame_type          = FDD;
Raymond Knopp's avatar
 
Raymond Knopp committed
1224 1225
    frame_parms[CC_id]->tdd_config          = 3;
    frame_parms[CC_id]->tdd_config_S        = 0;
1226 1227
    frame_parms[CC_id]->N_RB_DL             = 100;
    frame_parms[CC_id]->N_RB_UL             = 100;
Raymond Knopp's avatar
 
Raymond Knopp committed
1228
    frame_parms[CC_id]->Ncp                 = NORMAL;
Raymond Knopp's avatar
 
Raymond Knopp committed
1229 1230
    frame_parms[CC_id]->Ncp_UL              = NORMAL;
    frame_parms[CC_id]->Nid_cell            = Nid_cell;
Raymond Knopp's avatar
 
Raymond Knopp committed
1231
    frame_parms[CC_id]->num_MBSFN_config    = 0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1232 1233 1234
    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
1235
  }
1236

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

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

1260 1261
  //randominit (0);
  set_taus_seed (0);
Raymond Knopp's avatar
 
Raymond Knopp committed
1262

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

1266 1267
    set_comp_log(HW,      LOG_DEBUG,  LOG_HIGH, 1);
    set_comp_log(PHY,     LOG_DEBUG,   LOG_HIGH, 1);
1268 1269 1270 1271 1272
    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);
1273
#if defined(ENABLE_ITTI)
1274
    set_comp_log(EMU,     LOG_INFO,   LOG_MED, 1);
1275
# if defined(ENABLE_USE_MME)
1276
    set_comp_log(NAS,     LOG_INFO,   LOG_HIGH, 1);
1277 1278
# endif
#endif
1279 1280
  } else {
    printf("configuring for eNB\n");
1281

1282 1283 1284 1285 1286 1287 1288 1289
    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);
1290
#if defined(ENABLE_ITTI)
1291
    set_comp_log(EMU,     LOG_INFO,   LOG_MED, 1);
1292
# if defined(ENABLE_USE_MME)
1293 1294 1295 1296
    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);
1297
# endif
1298
#if defined(ENABLE_SECURITY)
1299
    set_comp_log(OSA,    osa_log_level,   osa_log_verbosity, 1);
1300
#endif
1301
#endif
1302
#ifdef LOCALIZATION
1303 1304 1305 1306 1307 1308 1309 1310 1311
    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
1312
    }
1313
  }
1314

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

1322
  if (opp_enabled ==1){
1323
    reset_opp_meas();
1324 1325
  }
  cpuf=get_cpu_freq_GHz();
1326

1327
#if defined(ENABLE_ITTI)
1328

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

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

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

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

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

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

1366

Raymond Knopp's avatar
 
Raymond Knopp committed
1367 1368 1369
  check_clock();

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

1373 1374 1375 1376 1377 1378 1379 1380 1381
    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
1382 1383 1384 1385 1386 1387 1388 1389
    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;
1390
    frame_parms[CC_id]->threequarter_fs = threequarter_fs;
1391 1392
    init_ul_hopping(frame_parms[CC_id]);
    init_frame_parms(frame_parms[CC_id],1);
1393 1394
    //   phy_init_top(frame_parms[CC_id]);
    phy_init_lte_top(frame_parms[CC_id]);
Raymond Knopp's avatar
 
Raymond Knopp committed
1395 1396 1397
  }


1398
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1399
    //init prach for openair1 test
1400
    frame_parms[CC_id]->prach_config_common.rootSequenceIndex=22;
Raymond Knopp's avatar
 
Raymond Knopp committed
1401
    frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1;
1402
    frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1403 1404 1405
    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
1406
    // N_ZC = (prach_fmt <4)?839:139;
Raymond Knopp's avatar
 
Raymond Knopp committed
1407
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1408 1409

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

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

    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1417 1418 1419 1420

      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]);
1421

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

1427
      if (UE[CC_id]->mac_enabled == 0) {  //set default UL parameters for testing mode
1428 1429 1430 1431 1432 1433 1434 1435 1436
	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
1437
      }
1438

1439
      UE[CC_id]->UE_scan = UE_scan;
1440
      UE[CC_id]->UE_scan_carrier = UE_scan_carrier;
1441 1442
      UE[CC_id]->mode    = mode;

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

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

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

Raymond Knopp's avatar
 
Raymond Knopp committed
1456
    }
1457

Raymond Knopp's avatar
 
Raymond Knopp committed
1458
    //  printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power));
1459 1460 1461 1462 1463 1464
  } 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++) {
1465
      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);
1466 1467
      PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id;

1468 1469
      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;
1470

1471
      if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { //set default parameters for testing mode
1472 1473 1474 1475 1476 1477 1478 1479 1480
	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;
	}
1481 1482
      }

1483 1484
      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,
1485
                        PHY_vars_eNB_g[0][CC_id]->X_u);
Raymond Knopp's avatar
 
Raymond Knopp committed
1486

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

1489
      PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0;
1490

1491
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1492 1493


1494 1495 1496 1497
    NB_eNB_INST=1;
    NB_INST=1;

  }
1498

1499 1500
  fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx);
  cpuf=get_cpu_freq_GHz();
1501

1502

Raymond Knopp's avatar
 
Raymond Knopp committed
1503
  dump_frame_parms(frame_parms[0]);
1504

1505 1506 1507
  for (card=0; card<MAX_CARDS; card++) {

    if(frame_parms[0]->N_RB_DL == 100) {
1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
      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;
      }
1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535
    } 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;
    }
1536 1537 1538 1539 1540 1541

    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;

1542
    
1543 1544 1545 1546 1547
    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;    
1548 1549
    } 
    
1550
    printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card,
1551 1552
           ((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
1553 1554
    openair0_cfg[card].Mod_id = 0;
#ifdef ETHERNET
1555 1556

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

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

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

1569 1570
    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));
1571 1572

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

Raymond Knopp's avatar
Raymond Knopp committed
1574 1575 1576 1577 1578 1579 1580 1581 1582 1583
      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;

1584 1585 1586 1587 1588 1589
      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]);
      
1590
      openair0_cfg[card].autocal[i] = 1;
1591
      openair0_cfg[card].tx_gain[i] = tx_gain[0][i];
1592
      if (UE_flag == 0) {
1593
	openair0_cfg[card].rx_gain[i] = PHY_vars_eNB_g[0][0]->rx_total_gain_dB;
1594 1595
      }
      else {
1596
	openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB;
1597
      }
1598 1599


Raymond Knopp's avatar
 
Raymond Knopp committed
1600
    }
1601

1602

Raymond Knopp's avatar
 
Raymond Knopp committed
1603
  }
1604

laurent's avatar
laurent committed
1605
#ifndef DEADLINE_SCHEDULER
1606

1607
  /* Currently we set affinity for UHD to CPU 0 for eNB/UE and only if number of CPUS >2 */
1608 1609 1610 1611 1612 1613
  
  cpu_set_t cpuset;
  int s;
  char cpu_affinity[1024];
  CPU_ZERO(&cpuset);
  #ifdef CPU_AFFINITY
1614
  if (get_nprocs() > 2)
1615
  {
1616 1617 1618 1619 1620 1621 1622
    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");
    }
1623 1624 1625
    LOG_I(HW, "Setting the affinity of main function to CPU 0, for device library to use CPU 0 only!\n");
  }
  #endif
1626

1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641
  /* 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);
1642 1643
    }
  }
1644
  LOG_I(HW, "CPU Affinity of main() function is... %s\n", cpu_affinity);
1645
#endif
1646 1647 1648 1649
  
  openair0_cfg[0].log_level = glog_level;
  
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
1650 1651 1652 1653 1654 1655 1656 1657
    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;
    }
  
1658 1659 1660 1661 1662 1663 1664
    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;
  }
  
1665 1666 1667 1668 1669 1670
  /* 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;
1671 1672 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
  
  // 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) {    
    //}
  //}   
1698
    
1699
  int returns=-1;
1700 1701
    
  // Handle spatially distributed MIMO antenna ports   
1702
  // Load RF device and initialize
1703
  if (node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { 
1704 1705 1706 1707 1708 1709 1710 1711
    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);
        }
1712
      }
1713 1714
      else if (mode==loop_through_memory) {    
      }    
1715
    }
1716 1717 1718
  }  
  
  // Load transport protocol and initialize
1719
  if (node_function != eNodeB_3GPP) { 
1720 1721 1722 1723 1724 1725 1726 1727
    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);
        }
1728
      }
1729 1730
      else if (mode==loop_through_memory) {    
      }    
1731
    }
1732
  }
1733

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

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

winckel's avatar
winckel committed
1746
#if defined(ENABLE_ITTI)
1747

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

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

1756 1757 1758 1759 1760 1761 1762 1763
  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
1764

1765
  number_of_cards = 1;
1766

1767

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

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

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

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

1790
    printf("Setting UE buffer to all-RX\n");
1791

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

1799 1800
    if (input_fd) {
      printf("Reading in from file to antenna buffer %d\n",0);
1801
      if (fread(UE[0]->common_vars.rxdata[0],
1802 1803 1804 1805
	        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");
1806
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1807
    //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
1808
  } else {
1809 1810


1811

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

1817
    printf("Setting eNB buffer to all-RX\n");
1818

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

Raymond Knopp's avatar
 
Raymond Knopp committed
1828
  mlockall(MCL_CURRENT | MCL_FUTURE);
1829

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

#ifdef XFORMS
1834 1835
  int UE_id;

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

    if (UE_flag==0) {
1840
      form_stats_l2 = create_form_stats_form();
1841 1842 1843
      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");
1844 1845

      for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858
	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");
	  }
	}
1859
      }
1860
    } else {
1861 1862 1863 1864 1865 1866 1867
      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);

1868
      /*
Raymond Knopp's avatar
 
Raymond Knopp committed
1869
      if (openair_daq_vars.use_ia_receiver) {
1870 1871 1872 1873 1874
        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");
1875 1876 1877
	}*/
        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
1878 1879
    }

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

1882 1883
    if (ret == 0)
      pthread_setname_np( forms_thread, "xforms" );
1884

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

1888 1889
#endif

1890
  rt_sleep_ns(10*100000000ULL);
1891

1892

1893

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

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

1901

1902

1903

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

Raymond Knopp's avatar
 
Raymond Knopp committed
1910
#endif
1911

1912

1913
  printf("Sending sync to all threads\n");
1914

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

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

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

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

1933
#endif
1934

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

  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++) {
1952 1953 1954 1955
	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
1956
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1957
    }
1958 1959
  }

1960 1961
#endif

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

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

1970

Raymond Knopp's avatar
 
Raymond Knopp committed
1971 1972
  pthread_cond_destroy(&sync_cond);
  pthread_mutex_destroy(&sync_mutex);
1973

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

1978
  for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
Raymond Knopp committed
1979 1980 1981 1982
    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);  
1983
  }
1984

Raymond Knopp's avatar
 
Raymond Knopp committed
1985
  if (ouput_vcd)
1986
    VCD_SIGNAL_DUMPER_CLOSE();
1987

1988
  if (opt_enabled == 1)
1989
    terminate_opt();
1990

Raymond Knopp's avatar
 
Raymond Knopp committed
1991
  logClean();
1992

Raymond Knopp's avatar
 
Raymond Knopp committed
1993 1994
  return 0;
}
1995 1996


1997

1998

1999 2000 2001