Merge remote-tracking branch 'origin/develop' into ru_rau_enhancement
Conflicts: cmake_targets/build_oai openair1/PHY/LTE_TRANSPORT/prach.c openair1/PHY/LTE_TRANSPORT/pucch.c openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c openair1/SCHED/fapi_l1.c openair1/SCHED/phy_procedures_lte_eNb.c openair2/LAYER2/MAC/eNB_scheduler.c openair2/LAYER2/MAC/eNB_scheduler_RA.c openair2/LAYER2/MAC/eNB_scheduler_dlsch.c openair2/LAYER2/MAC/eNB_scheduler_primitives.c openair2/LAYER2/MAC/eNB_scheduler_ulsch.c targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp targets/RT/USER/lte-enb.c targets/RT/USER/lte-ru.c targets/RT/USER/lte-softmodem.h
This commit is contained in:
@@ -929,7 +929,7 @@ void calibrate_rf(openair0_device *device) {
|
||||
bladerf_set_loopback(brf->dev,BLADERF_LB_NONE);
|
||||
bladerf_set_gain(brf->dev, BLADERF_MODULE_RX, (unsigned int) device->openair0_cfg->rx_gain[0]-device->openair0_cfg[0].rx_gain_offset[0]);
|
||||
bladerf_set_gain(brf->dev, BLADERF_MODULE_TX, (unsigned int) device->openair0_cfg->tx_gain[0]);
|
||||
// write_output("blade_rf_test.m","rxs",calib_buff,RXDCLENGTH,1,1);
|
||||
// LOG_M("blade_rf_test.m","rxs",calib_buff,RXDCLENGTH,1,1);
|
||||
}
|
||||
|
||||
/*! \brief Initialize Openair BLADERF target. It returns 0 if OK
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
#include <netinet/ether.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include "vcd_signal_dumper.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
|
||||
#include "common_lib.h"
|
||||
#include "ethernet_lib.h"
|
||||
|
||||
@@ -135,12 +135,6 @@ struct em1_private_s {
|
||||
extern struct em1_private_s *em1_devices[MAX_EM1_DEVICES];
|
||||
|
||||
/* em1_drv.c */
|
||||
#if 0
|
||||
static int em1_open(struct inode *inode, struct file *file);
|
||||
static int em1_release(struct inode *inode, struct file *file);
|
||||
static int __init em1_init(void);
|
||||
static void __exit em1_cleanup(void);
|
||||
#endif
|
||||
int em1_user_op_enter(struct em1_private_s *pv, wait_queue_t *wait,
|
||||
wait_queue_head_t *wh, int busy_flag, int new_state);
|
||||
void em1_user_op_leave(struct em1_private_s *pv, wait_queue_t *wait,
|
||||
@@ -153,9 +147,6 @@ ssize_t em1_write(struct file *file, const char __user *buf, size_t size, loff_t
|
||||
ssize_t em1_read(struct file *file, char __user *buf, size_t size, loff_t *ppos);
|
||||
|
||||
/* em1_dev.c */
|
||||
#if 0
|
||||
static irqreturn_t irq_handler(int irq, void *dev_id);
|
||||
#endif
|
||||
int __devinit em1_probe(struct pci_dev *dev, const struct pci_device_id *id);
|
||||
void __devexit em1_remove(struct pci_dev *dev);
|
||||
|
||||
@@ -184,14 +175,6 @@ struct em1_ioctl_fifo_params {
|
||||
size_t count;
|
||||
};
|
||||
|
||||
#if 0
|
||||
static int em1_ioctl_fifo_write(struct em1_private_s *pv,
|
||||
struct em1_ioctl_fifo_params *p);
|
||||
static int em1_ioctl_fifo_read(struct em1_private_s *pv,
|
||||
struct em1_ioctl_fifo_params *p);
|
||||
static int em1_ioctl_alloc(struct em1_private_s *pv, void **buf);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* c-file-style: "linux"
|
||||
|
||||
@@ -40,9 +40,11 @@
|
||||
#include <fstream>
|
||||
#include <cmath>
|
||||
#include <time.h>
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common_lib.h"
|
||||
#include "assertions.h"
|
||||
#include <sys/sysinfo.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
#ifdef __SSE4_1__
|
||||
# include <smmintrin.h>
|
||||
@@ -274,6 +276,8 @@ static int sync_to_gps(openair0_device *device)
|
||||
#include "usrp_lib.h"
|
||||
static FILE *pFile = NULL;
|
||||
int mmapfd = 0;
|
||||
int iqfd = 0;
|
||||
int use_mmap = 1; // default is to use mmap
|
||||
struct stat sb;
|
||||
iqrec_t *ms_sample = NULL; // memory for all subframes
|
||||
unsigned int nb_samples = 0;
|
||||
@@ -376,6 +380,7 @@ static void trx_usrp_end(openair0_device *device) {
|
||||
s->tx_md.end_of_burst = true;
|
||||
s->tx_stream->send("", 0, s->tx_md);
|
||||
s->tx_md.end_of_burst = false;
|
||||
sleep(1);
|
||||
#if defined(USRP_REC_PLAY)
|
||||
}
|
||||
#endif
|
||||
@@ -405,13 +410,24 @@ static void trx_usrp_end(openair0_device *device) {
|
||||
}
|
||||
}
|
||||
if (u_sf_mode == 2) { // replay
|
||||
if (ms_sample != MAP_FAILED) {
|
||||
munmap(ms_sample, sb.st_size);
|
||||
ms_sample = NULL;
|
||||
}
|
||||
if (mmapfd != 0) {
|
||||
close(mmapfd);
|
||||
mmapfd = 0;
|
||||
if (use_mmap) {
|
||||
if (ms_sample != MAP_FAILED) {
|
||||
munmap(ms_sample, sb.st_size);
|
||||
ms_sample = NULL;
|
||||
}
|
||||
if (mmapfd != 0) {
|
||||
close(mmapfd);
|
||||
mmapfd = 0;
|
||||
}
|
||||
} else {
|
||||
if (ms_sample != NULL) {
|
||||
free(ms_sample);
|
||||
ms_sample = NULL;
|
||||
}
|
||||
if (iqfd != 0) {
|
||||
close(iqfd);
|
||||
iqfd = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -483,7 +499,11 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp,
|
||||
s->tx_md.start_of_burst = false;
|
||||
s->tx_md.end_of_burst = false;
|
||||
}
|
||||
|
||||
if(flags==10){ // fail safe mode
|
||||
s->tx_md.has_time_spec = false;
|
||||
s->tx_md.start_of_burst = false;
|
||||
s->tx_md.end_of_burst = true;
|
||||
}
|
||||
if (cc>1) {
|
||||
std::vector<void *> buff_ptrs;
|
||||
for (int i=0; i<cc; i++)
|
||||
@@ -614,15 +634,50 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
|
||||
return 0; // should make calling process exit
|
||||
}
|
||||
wrap_ts = wrap_count * (nb_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000));
|
||||
if (!use_mmap) {
|
||||
if (lseek(iqfd, 0, SEEK_SET) == 0) {
|
||||
std::cerr << "Seeking at the beginning of IQ file" << std::endl;
|
||||
} else {
|
||||
std::cerr << "Problem seeking at the beginning of IQ file" << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cur_samples < nb_samples) {
|
||||
*ptimestamp = (ms_sample[0].ts + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000))) + wrap_ts;
|
||||
if (cur_samples == 0) {
|
||||
std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts
|
||||
<< " ts=" << *ptimestamp << std::endl;
|
||||
if (use_mmap) {
|
||||
if (cur_samples < nb_samples) {
|
||||
*ptimestamp = (ms_sample[0].ts + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000))) + wrap_ts;
|
||||
if (cur_samples == 0) {
|
||||
std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts
|
||||
<< " ts=" << *ptimestamp << std::endl;
|
||||
}
|
||||
memcpy(buff[0], &ms_sample[cur_samples].samples[0], nsamps*4);
|
||||
cur_samples++;
|
||||
}
|
||||
} else {
|
||||
// read sample from file
|
||||
if (read(iqfd, ms_sample, sizeof(iqrec_t)) != sizeof(iqrec_t)) {
|
||||
std::cerr << "pb reading iqfile at index " << sizeof(iqrec_t)*cur_samples << std::endl;
|
||||
close(iqfd);
|
||||
free(ms_sample);
|
||||
ms_sample = NULL;
|
||||
iqfd = 0;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (cur_samples < nb_samples) {
|
||||
static int64_t ts0 = 0;
|
||||
if ((cur_samples == 0) && (wrap_count == 0)) {
|
||||
ts0 = ms_sample->ts;
|
||||
}
|
||||
*ptimestamp = ts0 + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000)) + wrap_ts;
|
||||
if (cur_samples == 0) {
|
||||
std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts
|
||||
<< " ts=" << *ptimestamp << std::endl;
|
||||
}
|
||||
memcpy(buff[0], &ms_sample->samples[0], nsamps*4);
|
||||
cur_samples++;
|
||||
// Prepare for next read
|
||||
off_t where = lseek(iqfd, cur_samples * sizeof(iqrec_t), SEEK_SET);
|
||||
}
|
||||
memcpy(buff[0], &ms_sample[cur_samples].samples[0], nsamps*4);
|
||||
cur_samples++;
|
||||
}
|
||||
struct timespec req;
|
||||
req.tv_sec = 0;
|
||||
@@ -1102,6 +1157,7 @@ extern "C" {
|
||||
int device_init(openair0_device* device, openair0_config_t *openair0_cfg) {
|
||||
#if defined(USRP_REC_PLAY)
|
||||
paramdef_t usrp_recplay_params[7];
|
||||
struct sysinfo systeminfo;
|
||||
// to check
|
||||
static int done = 0;
|
||||
if (done == 1) {
|
||||
@@ -1112,6 +1168,11 @@ extern "C" {
|
||||
device->is_init = 0;
|
||||
|
||||
// end to check
|
||||
// Use mmap for IQ files for systems with less than 6GB total RAM
|
||||
sysinfo(&systeminfo);
|
||||
if (systeminfo.totalram < 6144000000) {
|
||||
use_mmap = 0;
|
||||
}
|
||||
memset(usrp_recplay_params, 0, 7*sizeof(paramdef_t));
|
||||
memset(&u_sf_filename[0], 0, 1024);
|
||||
if (trx_usrp_recplay_config_init(usrp_recplay_params) != 0) {
|
||||
@@ -1151,7 +1212,8 @@ extern "C" {
|
||||
device->trx_set_freq_func = trx_usrp_set_freq;
|
||||
device->trx_set_gains_func = trx_usrp_set_gains;
|
||||
device->openair0_cfg = openair0_cfg;
|
||||
std::cerr << "USRP device initialized in subframes replay mode for " << u_sf_loops << " loops." << std::endl;
|
||||
std::cerr << "USRP device initialized in subframes replay mode for " << u_sf_loops << " loops. Use mmap="
|
||||
<< use_mmap << std::endl;
|
||||
} else {
|
||||
#endif
|
||||
uhd::set_thread_priority_safe(1.0);
|
||||
@@ -1501,35 +1563,62 @@ extern "C" {
|
||||
memset(ms_sample, 0, u_sf_max * BELL_LABS_IQ_BYTES_PER_SF);
|
||||
}
|
||||
if (u_sf_mode == 2) {
|
||||
// use mmap
|
||||
mmapfd = open(u_sf_filename, O_RDONLY | O_LARGEFILE);
|
||||
if (mmapfd != 0) {
|
||||
fstat(mmapfd, &sb);
|
||||
std::cerr << "Loading subframes using mmap() from " << u_sf_filename << " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl;
|
||||
ms_sample = (iqrec_t*) mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, mmapfd, 0);
|
||||
if (ms_sample != MAP_FAILED) {
|
||||
nb_samples = (sb.st_size / sizeof(iqrec_t));
|
||||
int aligned = (((unsigned long)ms_sample & 31) == 0)? 1:0;
|
||||
std::cerr<< "Loaded "<< nb_samples << " subframes." << std::endl;
|
||||
if (aligned == 0) {
|
||||
std::cerr<< "mmap address is not 32 bytes aligned, exiting." << std::endl;
|
||||
if (use_mmap) {
|
||||
// use mmap
|
||||
mmapfd = open(u_sf_filename, O_RDONLY | O_LARGEFILE);
|
||||
if (mmapfd != 0) {
|
||||
fstat(mmapfd, &sb);
|
||||
std::cerr << "Loading subframes using mmap() from " << u_sf_filename << " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl;
|
||||
ms_sample = (iqrec_t*) mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, mmapfd, 0);
|
||||
if (ms_sample != MAP_FAILED) {
|
||||
nb_samples = (sb.st_size / sizeof(iqrec_t));
|
||||
int aligned = (((unsigned long)ms_sample & 31) == 0)? 1:0;
|
||||
std::cerr<< "Loaded "<< nb_samples << " subframes." << std::endl;
|
||||
if (aligned == 0) {
|
||||
std::cerr<< "mmap address is not 32 bytes aligned, exiting." << std::endl;
|
||||
close(mmapfd);
|
||||
exit(-1);
|
||||
}
|
||||
} else {
|
||||
std::cerr << "Cannot mmap file, exiting." << std::endl;
|
||||
close(mmapfd);
|
||||
exit(-1);
|
||||
}
|
||||
} else {
|
||||
std::cerr << "Cannot mmap file, exiting." << std::endl;
|
||||
close(mmapfd);
|
||||
std::cerr << "Cannot open " << u_sf_filename << " , exiting." << std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
} else {
|
||||
iqfd = open(u_sf_filename, O_RDONLY | O_LARGEFILE);
|
||||
if (iqfd != 0) {
|
||||
fstat(iqfd, &sb);
|
||||
nb_samples = (sb.st_size / sizeof(iqrec_t));
|
||||
std::cerr << "Loading " << nb_samples << " subframes from " << u_sf_filename
|
||||
<< " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl;
|
||||
// allocate buffer for 1 sample at a time
|
||||
ms_sample = (iqrec_t*) malloc(sizeof(iqrec_t));
|
||||
if (ms_sample == NULL) {
|
||||
std::cerr<< "Memory allocation failed for individual subframe replay mode." << std::endl;
|
||||
close(iqfd);
|
||||
exit(-1);
|
||||
}
|
||||
memset(ms_sample, 0, sizeof(iqrec_t));
|
||||
// point at beginning of file
|
||||
if (lseek(iqfd, 0, SEEK_SET) == 0) {
|
||||
std::cerr << "Initial seek at beginning of the file" << std::endl;
|
||||
} else {
|
||||
std::cerr << "Problem initial seek at beginning of the file" << std::endl;
|
||||
}
|
||||
} else {
|
||||
std::cerr << "Cannot open " << u_sf_filename << " , exiting." << std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
LOG_E(PHY, "USRP context created");
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
}
|
||||
}
|
||||
/*@}*/
|
||||
|
||||
@@ -47,7 +47,7 @@ typedef struct {
|
||||
} iqrec_t;
|
||||
#define DEF_NB_SF 120000 // default nb of sf or ms to capture (2 minutes at 5MHz)
|
||||
#define DEF_SF_FILE "/home/nokia/iqfile" // default subframes file name
|
||||
#define DEF_SF_DELAY_READ 400 // default read delay µs (860=real)
|
||||
#define DEF_SF_DELAY_READ 700 // default read delay µs (860=real)
|
||||
#define DEF_SF_DELAY_WRITE 15 // default write delay µs (15=real)
|
||||
#define DEF_SF_NB_LOOP 5 // default nb loops
|
||||
|
||||
|
||||
@@ -182,16 +182,6 @@ static void get_sample_from_mobipass(queue_state_t *qstate, char *I, char *Q, ui
|
||||
struct mobipass_header *mh = NULL;
|
||||
uint32_t packet_timestamp = 0;
|
||||
|
||||
#if 0
|
||||
uint32_t old_start = qstate->from_mobipass.start;
|
||||
uint32_t old_len = qstate->from_mobipass.len;
|
||||
b = qstate->from_mobipass.buf[qstate->from_mobipass.start];
|
||||
mh = (struct mobipass_header *)(b+14);
|
||||
uint32_t old_pts = qstate->from_mobipass.len ? ntohl(mh->timestamp) : -1;
|
||||
b=NULL;
|
||||
mh=NULL;
|
||||
#endif
|
||||
|
||||
while (qstate->from_mobipass.len) {
|
||||
b = qstate->from_mobipass.buf[qstate->from_mobipass.start];
|
||||
mh = (struct mobipass_header *)(b+14);
|
||||
@@ -222,10 +212,6 @@ nodata:
|
||||
*Q = 0;
|
||||
|
||||
log_missed_sample(qstate, timestamp);
|
||||
|
||||
#if 0
|
||||
printf("no sample timestamp %u pt %u start %d old_start %d old_pt %u len %d old len %d\n", timestamp, packet_timestamp, qstate->from_mobipass.start, old_start, old_pts, qstate->from_mobipass.len, old_len);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* doesn't work with delay more than 1s */
|
||||
|
||||
@@ -4,6 +4,7 @@ To build the basic simulator:
|
||||
cd [openair top directory]
|
||||
. oaienv
|
||||
cd cmake_targets
|
||||
./build_oai -I -w USRP
|
||||
./build_oai --basic-simulator
|
||||
cd ../common/utils/T/tracer
|
||||
make
|
||||
@@ -20,14 +21,14 @@ In the other terminal, run:
|
||||
cd [openair top directory]
|
||||
cd cmake_targets/basic_simulator/enb
|
||||
export ENODEB=1
|
||||
sudo -E ./lte-softmodem -O [configuration file]
|
||||
sudo -E ./lte-softmodem -O [configuration file] --T_stdout 0
|
||||
[configuration file] is just a regular configuration file.
|
||||
The eNB needs an EPC.
|
||||
|
||||
To run the UE, open a terminal and run:
|
||||
cd [openair top directory]
|
||||
cd cmake_targets/basic_simulator/ue
|
||||
sudo ./lte-uesoftmodem -C 2680000000 -r 25
|
||||
sudo ./lte-uesoftmodem -C 2680000000 -r 25 --ue-rxgain 140
|
||||
Adapt the value of -r, it has to match the value N_RB_DL in the configuration
|
||||
file of the eNB. (Same for -C which should match the value downlink_frequency
|
||||
in the configuration file.)
|
||||
|
||||
@@ -225,14 +225,6 @@ int tcp_bridge_read(openair0_device *device, openair0_timestamp *timestamp, void
|
||||
|
||||
b = &t->b[t->bstart];
|
||||
|
||||
#if 0
|
||||
typedef struct {
|
||||
int32_t data[30720]; /* max 20MHz */
|
||||
unsigned long timestamp;
|
||||
int size;
|
||||
} input_buffer;
|
||||
#endif
|
||||
|
||||
if (b->timestamp != t->read_timestamp) abort();
|
||||
if (b->size != nsamps * 4) abort();
|
||||
|
||||
|
||||
@@ -4,13 +4,23 @@
|
||||
#if defined(CBMIMO1) || defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_LMSSDR)
|
||||
# define NUMBER_OF_eNB_MAX 1
|
||||
# define NUMBER_OF_RU_MAX 2
|
||||
# define NUMBER_OF_UE_MAX 16
|
||||
# define NUMBER_OF_CONNECTED_eNB_MAX 3
|
||||
# ifndef UE_EXPANSION
|
||||
# define NUMBER_OF_UE_MAX 16
|
||||
# define NUMBER_OF_CONNECTED_eNB_MAX 3
|
||||
# else
|
||||
# define NUMBER_OF_UE_MAX 256
|
||||
# define NUMBER_OF_CONNECTED_eNB_MAX 1
|
||||
# endif
|
||||
#else
|
||||
# define NUMBER_OF_eNB_MAX 7
|
||||
# define NUMBER_OF_RU_MAX 32
|
||||
# define NUMBER_OF_UE_MAX 20
|
||||
# define NUMBER_OF_CONNECTED_eNB_MAX 3
|
||||
# ifndef UE_EXPANSION
|
||||
# define NUMBER_OF_UE_MAX 20
|
||||
# define NUMBER_OF_CONNECTED_eNB_MAX 3
|
||||
# else
|
||||
# define NUMBER_OF_UE_MAX 256
|
||||
# define NUMBER_OF_CONNECTED_eNB_MAX 1
|
||||
# endif
|
||||
# if defined(STANDALONE) && STANDALONE==1
|
||||
# undef NUMBER_OF_eNB_MAX
|
||||
# undef NUMBER_OF_UE_MAX
|
||||
@@ -19,7 +29,6 @@
|
||||
# define NUMBER_OF_UE_MAX 3
|
||||
# define NUMBER_OF_RU_MAX 3
|
||||
# endif
|
||||
|
||||
# if defined(LARGE_SCALE) && LARGE_SCALE
|
||||
# undef NUMBER_OF_eNB_MAX
|
||||
# undef NUMBER_OF_UE_MAX
|
||||
|
||||
@@ -48,7 +48,7 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 1;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -16;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
|
||||
@@ -48,7 +48,7 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 1;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -16;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
|
||||
@@ -33,7 +33,7 @@ eNBs =
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2685000000L;
|
||||
downlink_frequency = 2680000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 100;
|
||||
@@ -52,7 +52,7 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 1;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
@@ -164,6 +164,8 @@ MACRLCs = (
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
puSch10xSnr = 200;
|
||||
puCch10xSnr = 200;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,273 @@
|
||||
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB-Eurecom-LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
tr_s_preference = "local_mac"
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "3GPP_eNODEB";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2685000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 115;
|
||||
pbch_repetition = "FALSE";
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -108;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
ue_TransmissionMode = 1;
|
||||
|
||||
//Parameters for SIB18
|
||||
rxPool_sc_CP_Len = "normal";
|
||||
rxPool_sc_Period = "sf40";
|
||||
rxPool_data_CP_Len = "normal";
|
||||
rxPool_ResourceConfig_prb_Num = 20;
|
||||
rxPool_ResourceConfig_prb_Start = 5;
|
||||
rxPool_ResourceConfig_prb_End = 44;
|
||||
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||
*/
|
||||
// Parameters for SIB19
|
||||
discRxPool_cp_Len = "normal"
|
||||
discRxPool_discPeriod = "rf32"
|
||||
discRxPool_numRetx = 1;
|
||||
discRxPool_numRepetition = 2;
|
||||
discRxPool_ResourceConfig_prb_Num = 5;
|
||||
discRxPool_ResourceConfig_prb_Start = 3;
|
||||
discRxPool_ResourceConfig_prb_End = 21;
|
||||
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.13.11";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "lo";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
phy_test_mode = 0;
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 1
|
||||
nb_rx = 1
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [7];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 125;
|
||||
eNB_instances = [0];
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_CONTROLLER :
|
||||
{
|
||||
FLEXRAN_ENABLED = "no";
|
||||
FLEXRAN_INTERFACE_NAME = "lo";
|
||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
||||
FLEXRAN_PORT = 2210;
|
||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||
FLEXRAN_AWAIT_RECONF = "no";
|
||||
};
|
||||
/*
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
*/
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="crit";
|
||||
global_log_verbosity ="crit";
|
||||
hw_log_level ="crit";
|
||||
hw_log_verbosity ="crit";
|
||||
phy_log_level ="crit";
|
||||
phy_log_verbosity ="crit";
|
||||
mac_log_level ="crit";
|
||||
mac_log_verbosity ="crit";
|
||||
rlc_log_level ="crit";
|
||||
rlc_log_verbosity ="crit";
|
||||
pdcp_log_level ="crit";
|
||||
pdcp_log_verbosity ="crit";
|
||||
rrc_log_level ="crit";
|
||||
rrc_log_verbosity ="crit";
|
||||
};
|
||||
|
||||
@@ -52,7 +52,7 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 1;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
|
||||
@@ -52,7 +52,7 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
@@ -198,7 +198,9 @@ MACRLCs = (
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
phy_test_mode = 1;
|
||||
phy_test_mode = 0;
|
||||
puSch10xSnr = 200;
|
||||
puCch10xSnr = 200;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "93";
|
||||
|
||||
tr_s_preference = "local_mac"
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "3GPP_eNODEB";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2685000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
pbch_repetition = "FALSE";
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONE";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -108;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
ue_TransmissionMode = 1;
|
||||
ue_multiple_max = 20;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 1
|
||||
nb_rx = 1
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [7];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 125;
|
||||
eNB_instances = [0];
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
|
||||
@@ -0,0 +1,215 @@
|
||||
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
# real_time choice in {hard, rt-preempt, no}
|
||||
real_time = "no";
|
||||
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB-Eurecom-LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "93";
|
||||
|
||||
tr_s_preference = "local_mac"
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "NGFI_RCC_IF4p5";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "TDD";
|
||||
tdd_config = 1;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 38;
|
||||
downlink_frequency = 2580000000L;
|
||||
uplink_frequency_offset = 0;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
pbch_repetition = "FALSE";
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -104;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -96;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -108;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "127.0.0.3";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "lo";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_if_name = "lo";
|
||||
remote_address = "127.0.0.2";
|
||||
local_address = "127.0.0.1";
|
||||
local_portc = 50000;
|
||||
remote_portc = 50000;
|
||||
local_portd = 50001;
|
||||
remote_portd = 50001;
|
||||
local_rf = "no"
|
||||
tr_preference = "udp_if4p5"
|
||||
nb_tx = 2
|
||||
nb_rx = 2
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
eNB_instances = [0];
|
||||
is_slave = "no";
|
||||
}
|
||||
);
|
||||
|
||||
log_config = {
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
@@ -54,7 +54,7 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pucch_n1_AN = 0;
|
||||
#pdsch_referenceSignalPower = -27;
|
||||
pdsch_referenceSignalPower = -30;
|
||||
pdsch_p_b = 0;
|
||||
|
||||
@@ -52,7 +52,7 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
|
||||
@@ -39,7 +39,7 @@ eNBs =
|
||||
downlink_frequency = 2685000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
N_RB_DL = 100;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
@@ -55,7 +55,7 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
|
||||
@@ -55,8 +55,8 @@ eNBs =
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -12;
|
||||
pucch_n1_AN = 0;
|
||||
pdsch_referenceSignalPower = -27;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
|
||||
@@ -11,8 +11,8 @@ RUs = (
|
||||
tr_preference = "udp_if4p5";
|
||||
nb_tx = 1;
|
||||
nb_rx = 1;
|
||||
max_pdschReferenceSignalPower = -15;
|
||||
max_rxgain = 120;
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 125;
|
||||
bands = [7,13];
|
||||
is_slave = "no";
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
RUs = (
|
||||
{
|
||||
local_if_name = "lo";
|
||||
remote_address = "127.0.0.1"
|
||||
local_address = "127.0.0.2";
|
||||
local_portc = 50000;
|
||||
remote_portc = 50000;
|
||||
local_portd = 50001;
|
||||
remote_portd = 50001;
|
||||
local_rf = "yes"
|
||||
tr_preference = "udp_if4p5";
|
||||
nb_tx = 1;
|
||||
nb_rx = 1;
|
||||
max_pdschReferenceSignalPower = -29;
|
||||
max_rxgain = 120;
|
||||
bands = [38];
|
||||
is_slave = "no";
|
||||
}
|
||||
);
|
||||
|
||||
log_config = {
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
|
||||
+1
-2
@@ -19,7 +19,7 @@ First, you must have all four openair SW directories, openair1, openair2, openai
|
||||
- libconfig++8-dev
|
||||
- libgtk-3-dev
|
||||
- libpgm-5.1 and libpgm-5.1-dev for distributed simulation with reliable multicast transmport
|
||||
- libxml2 and libxml2-dev and gccxml
|
||||
- libxml2 and libxml2-dev
|
||||
- libforms-bin libforms-dev
|
||||
- nettle-dev nettle-bin openssl libssl-dev
|
||||
- libatlas-base-dev and libatlas-headers (for Ubuntu 11.04, libatlas-dev instead of libatlas-headers)
|
||||
@@ -113,4 +113,3 @@ Please choose the web server that should be automatically configured to run phpM
|
||||
Web server to reconfigure automatically:
|
||||
[*] apache2
|
||||
[ ] lighttpd
|
||||
|
||||
+48
-86
@@ -68,11 +68,11 @@
|
||||
#include "LAYER2/MAC/mac_proto.h"
|
||||
#include "RRC/LTE/rrc_extern.h"
|
||||
#include "PHY_INTERFACE/phy_interface.h"
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "UTIL/OTG/otg_tx.h"
|
||||
#include "UTIL/OTG/otg_externs.h"
|
||||
#include "UTIL/MATH/oml.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
#include "enb_config.h"
|
||||
|
||||
@@ -217,13 +217,15 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
||||
#endif
|
||||
}
|
||||
|
||||
release_UE_in_freeList(eNB->Mod_id);
|
||||
|
||||
// UE-specific RX processing for subframe n
|
||||
if (nfapi_mode == 0 || nfapi_mode == 1) {
|
||||
phy_procedures_eNB_uespec_RX(eNB, proc);
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 1 );
|
||||
|
||||
if(get_nprocs() >= 8){
|
||||
if(!eNB->single_thread_flag && get_nprocs() >= 8){
|
||||
if(wait_on_condition(&proc[1].mutex_rxtx,&proc[1].cond_rxtx,&proc[1].pipe_ready,"wakeup_tx")<0) {
|
||||
LOG_E(PHY,"Frame %d, subframe %d: TX1 not ready\n",proc[1].frame_rx,proc[1].subframe_rx);
|
||||
return(-1);
|
||||
@@ -242,41 +244,32 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
||||
|
||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||
|
||||
/* this conflict resolution may be totally wrong, to be tested */
|
||||
/* CONFLICT RESOLUTION: BEGIN */
|
||||
|
||||
// *****************************************
|
||||
// TX processing for subframe n+sf_ahead
|
||||
// run PHY TX procedures the one after the other for all CCs to avoid race conditions
|
||||
// (may be relaxed in the future for performance reasons)
|
||||
// *****************************************
|
||||
//if (wait_CCs(proc)<0) return(-1);
|
||||
|
||||
|
||||
|
||||
if (oai_exit) return(-1);
|
||||
|
||||
LOG_D(PHY,"Calling eNB_procedures_TX for SFN.SF %d.%d\n",proc->frame_tx,proc->subframe_tx);
|
||||
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 0 );
|
||||
if(oai_exit) return(-1);
|
||||
if(get_nprocs() <= 4){
|
||||
if(eNB->single_thread_flag || get_nprocs() <= 4){
|
||||
#ifndef PHY_TX_THREAD
|
||||
phy_procedures_eNB_TX(eNB, proc, 1);
|
||||
#endif
|
||||
}
|
||||
/* CONFLICT RESOLUTION: what about this release_thread call, has it to be done? if yes, where? */
|
||||
//if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) return(-1);
|
||||
/* CONFLICT RESOLUTION: END */
|
||||
|
||||
stop_meas( &softmodem_stats_rxtx_sf );
|
||||
|
||||
LOG_D(PHY,"%s() Exit proc[rx:%d%d tx:%d%d]\n", __FUNCTION__, proc->frame_rx, proc->subframe_rx, proc->frame_tx, proc->subframe_tx);
|
||||
|
||||
#if 0
|
||||
LOG_D(PHY, "rxtx:%lld nfapi:%lld phy:%lld tx:%lld rx:%lld prach:%lld ofdm:%lld ",
|
||||
softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now,
|
||||
TICK_TO_US(eNB->phy_proc),
|
||||
TICK_TO_US(eNB->phy_proc_tx),
|
||||
TICK_TO_US(eNB->phy_proc_rx),
|
||||
TICK_TO_US(eNB->rx_prach),
|
||||
TICK_TO_US(eNB->ofdm_mod_stats),
|
||||
softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now);
|
||||
TICK_TO_US(eNB->ofdm_mod_stats)
|
||||
);
|
||||
LOG_D(PHY,
|
||||
"dlsch[enc:%lld mod:%lld scr:%lld rm:%lld t:%lld i:%lld] rx_dft:%lld ",
|
||||
TICK_TO_US(eNB->dlsch_encoding_stats),
|
||||
@@ -308,7 +301,6 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
||||
TICK_TO_US(eNB->ulsch_tc_intl1_stats),
|
||||
TICK_TO_US(eNB->ulsch_tc_intl2_stats)
|
||||
);
|
||||
#endif
|
||||
|
||||
return(0);
|
||||
}
|
||||
@@ -434,11 +426,13 @@ static void* eNB_thread_rxtx( void* param ) {
|
||||
exit_fun( "ERROR pthread_cond_signal" );
|
||||
}
|
||||
pthread_mutex_unlock( &proc->mutex_rxtx );
|
||||
if(get_nprocs() >= 8) wakeup_tx(eNB,eNB->proc.ru_proc);
|
||||
else
|
||||
{
|
||||
phy_procedures_eNB_TX(eNB, proc, 1);
|
||||
wakeup_txfh(proc,eNB->proc.ru_proc);
|
||||
if (nfapi_mode!=2){
|
||||
if(get_nprocs() >= 8) wakeup_tx(eNB,eNB->proc.ru_proc);
|
||||
else
|
||||
{
|
||||
phy_procedures_eNB_TX(eNB, proc, 1);
|
||||
wakeup_txfh(proc,eNB->proc.ru_proc);
|
||||
}
|
||||
}
|
||||
|
||||
} // while !oai_exit
|
||||
@@ -451,30 +445,6 @@ static void* eNB_thread_rxtx( void* param ) {
|
||||
return &eNB_thread_rxtx_status;
|
||||
}
|
||||
|
||||
|
||||
#if 0 //defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
|
||||
// Wait for eNB application initialization to be complete (eNB registration to MME)
|
||||
static void wait_system_ready (char *message, volatile int *start_flag) {
|
||||
|
||||
static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....",
|
||||
" ....", " ...", " ..", " .", " "};
|
||||
int i = 0;
|
||||
|
||||
while ((!oai_exit) && (*start_flag == 0)) {
|
||||
LOG_N(EMU, message, indicator[i]);
|
||||
fflush(stdout);
|
||||
i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0]));
|
||||
usleep(200000);
|
||||
}
|
||||
|
||||
LOG_D(EMU,"\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string,RU_t *ru)
|
||||
{
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
@@ -596,7 +566,7 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
||||
eNB_proc_t *proc=&eNB->proc;
|
||||
RU_proc_t *ru_proc=&ru->proc;
|
||||
|
||||
eNB_rxtx_proc_t *proc_rxtx0=&proc->proc_rxtx[0];//*proc_rxtx=&proc->proc_rxtx[proc->frame_rx&1];
|
||||
eNB_rxtx_proc_t *proc_rxtx0=&proc->proc_rxtx[0];
|
||||
//eNB_rxtx_proc_t *proc_rxtx1=&proc->proc_rxtx[1];
|
||||
|
||||
|
||||
@@ -804,6 +774,7 @@ void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief The prach receive thread of eNB.
|
||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
||||
@@ -891,7 +862,6 @@ extern void init_td_thread(PHY_VARS_eNB *);
|
||||
extern void init_te_thread(PHY_VARS_eNB *);
|
||||
extern void kill_td_thread(PHY_VARS_eNB *);
|
||||
extern void kill_te_thread(PHY_VARS_eNB *);
|
||||
//////////////////////////////////////need to modified////////////////*****
|
||||
|
||||
static void* process_stats_thread(void* param) {
|
||||
|
||||
@@ -900,20 +870,23 @@ static void* process_stats_thread(void* param) {
|
||||
wait_sync("process_stats_thread");
|
||||
|
||||
while (!oai_exit) {
|
||||
sleep(1);
|
||||
if (opp_enabled == 1) {
|
||||
if (eNB->td) print_meas(&eNB->ulsch_decoding_stats,"ulsch_decoding",NULL,NULL);
|
||||
if (eNB->te)
|
||||
{
|
||||
print_meas(&eNB->dlsch_turbo_encoding_preperation_stats,"dlsch_coding_crc",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_segmentation_stats,"dlsch_segmentation",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_encoding_stats,"dlsch_encoding",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_signal_stats,"coding_signal",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_main_stats,"coding_main",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_waiting_stats,"coding_wait",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_wakeup_stats0,"coding_worker_0",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_wakeup_stats1,"coding_worker_1",NULL,NULL);
|
||||
}
|
||||
sleep(1);
|
||||
if (opp_enabled == 1) {
|
||||
if (eNB->td) print_meas(&eNB->ulsch_decoding_stats,"ulsch_decoding",NULL,NULL);
|
||||
if (eNB->te)
|
||||
{
|
||||
print_meas(&eNB->dlsch_turbo_encoding_preperation_stats,"dlsch_coding_crc",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_segmentation_stats,"dlsch_segmentation",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_encoding_stats,"dlsch_encoding",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_signal_stats,"coding_signal",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_main_stats,"coding_main",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_stats,"turbo_encoding",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_interleaving_stats,"turbo_interleaving",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_rate_matching_stats,"turbo_rate_matching",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_waiting_stats,"coding_wait",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_wakeup_stats0,"coding_worker_0",NULL,NULL);
|
||||
print_meas(&eNB->dlsch_turbo_encoding_wakeup_stats1,"coding_worker_1",NULL,NULL);
|
||||
}
|
||||
print_meas(&eNB->dlsch_modulation_stats,"dlsch_modulation",NULL,NULL);
|
||||
}
|
||||
}
|
||||
@@ -994,30 +967,19 @@ void init_eNB_proc(int inst) {
|
||||
// attr_td = &proc->attr_td;
|
||||
// attr_te = &proc->attr_te;
|
||||
#endif
|
||||
//////////////////////////////////////need to modified////////////////*****
|
||||
|
||||
if(get_nprocs() > 2 && codingw)
|
||||
{
|
||||
init_te_thread(eNB);
|
||||
init_td_thread(eNB);
|
||||
}
|
||||
//////////////////////////////////////need to modified////////////////*****
|
||||
//pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc );
|
||||
|
||||
//pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc_rxtx );
|
||||
|
||||
|
||||
// Panos: Should we also include here the case where single_thread_flag = 1 ?
|
||||
if(nfapi_mode!=2){
|
||||
pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc );
|
||||
pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, tx_thread, proc);
|
||||
}
|
||||
|
||||
|
||||
LOG_I(PHY,"eNB->single_thread_flag:%d\n", eNB->single_thread_flag);
|
||||
|
||||
if (eNB->single_thread_flag==0) {
|
||||
pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, &proc_rxtx[0] );
|
||||
pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] );
|
||||
if (eNB->single_thread_flag==0 && nfapi_mode!=2) {
|
||||
pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc );
|
||||
pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, tx_thread, proc);
|
||||
}
|
||||
pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, eNB );
|
||||
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
@@ -1111,7 +1073,7 @@ void kill_eNB_proc(int inst) {
|
||||
pthread_join( proc->pthread_prach_br, (void**)&status );
|
||||
pthread_mutex_destroy( &proc->mutex_prach_br );
|
||||
pthread_cond_destroy( &proc->cond_prach_br );
|
||||
#endif
|
||||
#endif
|
||||
LOG_I(PHY, "Destroying UL_INFO mutex\n");
|
||||
pthread_mutex_destroy(&eNB->UL_INFO_mutex);
|
||||
for (i=0;i<2;i++) {
|
||||
@@ -1176,7 +1138,7 @@ void init_transport(PHY_VARS_eNB *eNB) {
|
||||
LOG_I(PHY, "Initialise transport\n");
|
||||
|
||||
for (i=0; i<NUMBER_OF_UE_MAX; i++) {
|
||||
LOG_I(PHY,"Allocating Transport Channel Buffers for DLSCH, UE %d\n",i);
|
||||
LOG_D(PHY,"Allocating Transport Channel Buffers for DLSCH, UE %d\n",i);
|
||||
for (j=0; j<2; j++) {
|
||||
eNB->dlsch[i][j] = new_eNB_dlsch(1,8,NSOFT,fp->N_RB_DL,0,fp);
|
||||
if (!eNB->dlsch[i][j]) {
|
||||
@@ -1189,7 +1151,7 @@ void init_transport(PHY_VARS_eNB *eNB) {
|
||||
}
|
||||
}
|
||||
|
||||
LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i);
|
||||
LOG_D(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i);
|
||||
eNB->ulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0);
|
||||
|
||||
if (!eNB->ulsch[1+i]) {
|
||||
|
||||
+443
-121
@@ -83,11 +83,11 @@
|
||||
#include "RRC/LTE/rrc_extern.h"
|
||||
#include "PHY_INTERFACE/phy_interface.h"
|
||||
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "UTIL/OTG/otg_tx.h"
|
||||
#include "UTIL/OTG/otg_externs.h"
|
||||
#include "UTIL/MATH/oml.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
#include "enb_config.h"
|
||||
//#include "PHY/TOOLS/time_meas.h"
|
||||
@@ -114,11 +114,13 @@ static int DEFENBS[] = {0};
|
||||
|
||||
#include "T.h"
|
||||
|
||||
#include "pdcp.h"
|
||||
|
||||
extern volatile int oai_exit;
|
||||
extern int emulate_rf;
|
||||
extern int numerology;
|
||||
extern int fepw;
|
||||
extern int single_thread_flag;
|
||||
|
||||
|
||||
extern void phy_init_RU(RU_t*);
|
||||
@@ -488,6 +490,19 @@ void fh_if4p5_north_out(RU_t *ru) {
|
||||
|
||||
}
|
||||
|
||||
/* add fail safe for late command */
|
||||
typedef enum {
|
||||
STATE_BURST_NORMAL = 0,
|
||||
STATE_BURST_TERMINATE = 1,
|
||||
STATE_BURST_STOP_1 = 2,
|
||||
STATE_BURST_STOP_2 = 3,
|
||||
STATE_BURST_RESTART = 4,
|
||||
} late_control_e;
|
||||
|
||||
volatile late_control_e late_control=STATE_BURST_NORMAL;
|
||||
|
||||
/* add fail safe for late command end */
|
||||
|
||||
static void* emulatedRF_thread(void* param) {
|
||||
RU_proc_t *proc = (RU_proc_t *) param;
|
||||
int microsec = 500; // length of time to sleep, in miliseconds
|
||||
@@ -508,6 +523,11 @@ static void* emulatedRF_thread(void* param) {
|
||||
wait_sync("emulatedRF_thread");
|
||||
while(!oai_exit){
|
||||
nanosleep(&req, (struct timespec *)NULL);
|
||||
if(proc->emulate_rf_busy )
|
||||
{
|
||||
LOG_E(PHY,"rf being delayed in emulated RF\n");
|
||||
}
|
||||
proc->emulate_rf_busy = 1;
|
||||
pthread_mutex_lock(&proc->mutex_emulateRF);
|
||||
++proc->instance_cnt_emulateRF;
|
||||
pthread_mutex_unlock(&proc->mutex_emulateRF);
|
||||
@@ -563,9 +583,12 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
|
||||
|
||||
proc->timestamp_rx = ts-ru->ts_offset;
|
||||
|
||||
//AssertFatal(rxs == fp->samples_per_tti,
|
||||
//"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs);
|
||||
if (rxs != fp->samples_per_tti) LOG_E(PHY, "rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs);
|
||||
// AssertFatal(rxs == fp->samples_per_tti,
|
||||
// "rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs);
|
||||
if(rxs != fp->samples_per_tti){
|
||||
LOG_E(PHY,"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs);
|
||||
late_control=STATE_BURST_TERMINATE;
|
||||
}
|
||||
|
||||
if (proc->first_rx == 1) {
|
||||
ru->ts_offset = proc->timestamp_rx;
|
||||
@@ -590,11 +613,19 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
|
||||
proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10;
|
||||
// synchronize first reception to frame 0 subframe 0
|
||||
|
||||
|
||||
if (ru->fh_north_asynch_in == NULL) {
|
||||
proc->timestamp_tx = proc->timestamp_rx+(sf_ahead*fp->samples_per_tti);
|
||||
proc->subframe_tx = (proc->subframe_rx+sf_ahead)%10;
|
||||
proc->frame_tx = (proc->subframe_rx>(9-sf_ahead)) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||
}
|
||||
#ifdef PHY_TX_THREAD
|
||||
proc->timestamp_phy_tx = proc->timestamp_rx+((sf_ahead-1)*fp->samples_per_tti);
|
||||
proc->subframe_phy_tx = (proc->subframe_rx+(sf_ahead-1))%10;
|
||||
proc->frame_phy_tx = (proc->subframe_rx>(9-(sf_ahead-1))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||
#else
|
||||
proc->timestamp_tx = proc->timestamp_rx+(sf_ahead*fp->samples_per_tti);
|
||||
proc->subframe_tx = (proc->subframe_rx+sf_ahead)%10;
|
||||
proc->frame_tx = (proc->subframe_rx>(9-sf_ahead)) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||
#endif
|
||||
}
|
||||
|
||||
LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, subframe %d\n",
|
||||
ru->idx,
|
||||
0,
|
||||
@@ -632,10 +663,14 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
|
||||
|
||||
if (rxs != fp->samples_per_tti)
|
||||
{
|
||||
//exit_fun( "problem receiving samples" );
|
||||
LOG_E(PHY, "problem receiving samples");
|
||||
}
|
||||
{
|
||||
#if defined(USRP_REC_PLAY)
|
||||
exit_fun("Exiting IQ record/playback");
|
||||
#else
|
||||
//exit_fun( "problem receiving samples" );
|
||||
LOG_E(PHY, "problem receiving samples");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -670,7 +705,7 @@ void tx_rf(RU_t *ru) {
|
||||
(prevSF_type == SF_UL) &&
|
||||
(nextSF_type == SF_DL)) {
|
||||
flags = 2; // start of burst
|
||||
sf_extension = ru->N_TA_offset<<1;
|
||||
sf_extension = ru->N_TA_offset;
|
||||
}
|
||||
|
||||
if ((fp->frame_type == TDD) &&
|
||||
@@ -678,15 +713,55 @@ void tx_rf(RU_t *ru) {
|
||||
(prevSF_type == SF_UL) &&
|
||||
(nextSF_type == SF_UL)) {
|
||||
flags = 4; // start of burst and end of burst (only one DL SF between two UL)
|
||||
sf_extension = ru->N_TA_offset<<1;
|
||||
sf_extension = ru->N_TA_offset;
|
||||
}
|
||||
|
||||
#if defined(__x86_64) || defined(__i386__)
|
||||
#ifdef __AVX2__
|
||||
sf_extension = (sf_extension)&0xfffffff8;
|
||||
#else
|
||||
sf_extension = (sf_extension)&0xfffffffc;
|
||||
#endif
|
||||
#elif defined(__arm__)
|
||||
sf_extension = (sf_extension)&0xfffffffc;
|
||||
#endif
|
||||
|
||||
for (i=0; i<ru->nb_tx; i++)
|
||||
txp[i] = (void*)&ru->common.txdata[i][(proc->subframe_tx*fp->samples_per_tti)-sf_extension];
|
||||
|
||||
/* add fail safe for late command */
|
||||
if(late_control!=STATE_BURST_NORMAL){//stop burst
|
||||
switch (late_control) {
|
||||
case STATE_BURST_TERMINATE:
|
||||
flags=10; // end of burst and no time spec
|
||||
late_control=STATE_BURST_STOP_1;
|
||||
break;
|
||||
|
||||
case STATE_BURST_STOP_1:
|
||||
flags=0; // no send
|
||||
late_control=STATE_BURST_STOP_2;
|
||||
return;//no send
|
||||
break;
|
||||
|
||||
case STATE_BURST_STOP_2:
|
||||
flags=0; // no send
|
||||
late_control=STATE_BURST_RESTART;
|
||||
return;//no send
|
||||
break;
|
||||
|
||||
case STATE_BURST_RESTART:
|
||||
flags=2; // start burst
|
||||
late_control=STATE_BURST_NORMAL;
|
||||
break;
|
||||
default:
|
||||
LOG_D(PHY,"[TXPATH] RU %d late_control %d not implemented\n",ru->idx, late_control);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* add fail safe for late command end */
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, proc->frame_tx );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_RU, proc->subframe_tx );
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance)&0xffffffff );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
// prepare tx buffer pointers
|
||||
@@ -703,8 +778,11 @@ void tx_rf(RU_t *ru) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
||||
|
||||
|
||||
AssertFatal(txs == siglen+sf_extension,"TX : Timeout (sent %d/%d)\n",txs, siglen);
|
||||
|
||||
// AssertFatal(txs == siglen+sf_extension,"TX : Timeout (sent %d/%d)\n",txs, siglen);
|
||||
if( (txs != siglen+sf_extension) && (late_control==STATE_BURST_NORMAL) ){ /* add fail safe for late command */
|
||||
late_control=STATE_BURST_TERMINATE;
|
||||
LOG_E(PHY,"TX : Timeout (sent %d/%d) state =%d\n",txs, siglen,late_control);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -782,7 +860,6 @@ void wakeup_slaves(RU_proc_t *proc) {
|
||||
wait.tv_nsec=5000000L;
|
||||
|
||||
for (i=0;i<proc->num_slaves;i++) {
|
||||
//printf("////////////////////calling for slave thrads\n");////////////////////////********
|
||||
RU_proc_t *slave_proc = proc->slave_proc[i];
|
||||
// wake up slave FH thread
|
||||
// lock the FH mutex and make sure the thread is ready
|
||||
@@ -1039,7 +1116,7 @@ void wakeup_eNBs(RU_t *ru) {
|
||||
|
||||
LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d (state %s)ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru_states[ru->state],ru->eNB_top);
|
||||
|
||||
if (ru->num_eNB==1 && ru->eNB_top!=0 && get_nprocs() <= 4) {
|
||||
if (ru->num_eNB==1 && ru->eNB_top!=0 && (get_nprocs() <= 4 || single_thread_flag)) {
|
||||
// call eNB function directly
|
||||
|
||||
char string[20];
|
||||
@@ -1112,6 +1189,7 @@ void wakeup_eNBs(RU_t *ru) {
|
||||
// LOG_D(PHY,"wakeup eNB top for for subframe %d\n", ru->proc.subframe_rx);
|
||||
// ru->eNB_top(eNB_list[0],ru->proc.frame_rx,ru->proc.subframe_rx,string);
|
||||
|
||||
ru->proc.emulate_rf_busy = 0;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1124,16 +1202,11 @@ void wakeup_eNBs(RU_t *ru) {
|
||||
LOG_D(PHY,"ru->wakeup_rxtx:%p\n", ru->wakeup_rxtx);
|
||||
eNB_list[i]->proc.ru_proc = &ru->proc;
|
||||
if (ru->wakeup_rxtx!=0 && ru->wakeup_rxtx(eNB_list[i],ru) < 0)
|
||||
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
LOG_E(PHY,"could not wakeup eNB rxtx process for subframe %d\n", ru->proc.subframe_rx);
|
||||
|
||||
LOG_E(PHY,"could not wakeup eNB rxtx process for subframe %d\n", ru->proc.subframe_rx);
|
||||
}
|
||||
}
|
||||
ru->proc.emulate_rf_busy = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1272,8 +1345,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
|
||||
cfg->tx_freq[i] = (double)fp->dl_CarrierFreq;
|
||||
cfg->rx_freq[i] = (double)fp->ul_CarrierFreq;
|
||||
|
||||
cfg->tx_gain[i] = ru->att_tx;
|
||||
cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx;
|
||||
cfg->tx_gain[i] = (double)ru->att_tx;
|
||||
cfg->rx_gain[i] = ru->max_rxgain-(double)ru->att_rx;
|
||||
|
||||
cfg->configFilename = rf_config_file;
|
||||
printf("channel %d, Setting tx_gain offset %f, rx_gain offset %f, tx_freq %f, rx_freq %f\n",
|
||||
@@ -1353,15 +1426,11 @@ static void* ru_stats_thread(void* param) {
|
||||
|
||||
RU_t *ru = (RU_t*)param;
|
||||
|
||||
PHY_VARS_eNB **eNB_list = ru->eNB_list;
|
||||
PHY_VARS_eNB *eNB=eNB_list[0];
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
|
||||
wait_sync("ru_stats_thread");
|
||||
|
||||
while (!oai_exit) {
|
||||
sleep(1);
|
||||
if (opp_enabled == 1 && fepw) {
|
||||
if (opp_enabled) {
|
||||
if (ru->feprx) print_meas(&ru->ofdm_demod_stats,"feprx",NULL,NULL);
|
||||
if (ru->feptx_ofdm) print_meas(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL);
|
||||
if (ru->fh_north_asynch_in) print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL);
|
||||
@@ -1375,6 +1444,12 @@ static void* ru_stats_thread(void* param) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
#ifdef PHY_TX_THREAD
|
||||
int first_phy_tx = 1;
|
||||
volatile int16_t phy_tx_txdataF_end;
|
||||
volatile int16_t phy_tx_end;
|
||||
#endif
|
||||
|
||||
static void* ru_thread_tx( void* param ) {
|
||||
RU_t *ru = (RU_t*)param;
|
||||
RU_proc_t *proc = &ru->proc;
|
||||
@@ -1389,6 +1464,7 @@ static void* ru_thread_tx( void* param ) {
|
||||
//wait_sync("ru_thread_tx");
|
||||
|
||||
wait_on_condition(&proc->mutex_FH1,&proc->cond_FH1,&proc->instance_cnt_FH1,"ru_thread_tx");
|
||||
|
||||
|
||||
printf( "ru_thread_tx ready\n");
|
||||
while (!oai_exit) {
|
||||
@@ -1450,6 +1526,9 @@ static void* ru_thread( void* param ) {
|
||||
// set default return value
|
||||
|
||||
ru_thread_status = 0;
|
||||
#if defined(PRE_SCD_THREAD)
|
||||
dlsch_ue_select_tbl_in_use = 1;
|
||||
#endif
|
||||
|
||||
thread_top_init("ru_thread",0,870000,1000000,1000000);
|
||||
|
||||
@@ -1566,28 +1645,36 @@ static void* ru_thread( void* param ) {
|
||||
subframe++;
|
||||
}
|
||||
|
||||
|
||||
// synchronization on input FH interface, acquire signals/data and block
|
||||
if (ru->stop_rf && ru->cmd == STOP_RU) {
|
||||
ru->stop_rf(ru);
|
||||
ru->state = RU_IDLE;
|
||||
ru->cmd = EMPTY;
|
||||
LOG_I(PHY,"RU %d rf device stopped\n",ru->idx);
|
||||
break;
|
||||
}
|
||||
else if (ru->cmd == STOP_RU) {
|
||||
ru->state = RU_IDLE;
|
||||
ru->cmd = EMPTY;
|
||||
LOG_I(PHY,"RU %d stopped\n",ru->idx);
|
||||
break;
|
||||
}
|
||||
if (oai_exit == 1) break;
|
||||
|
||||
LOG_D(PHY,"RU thread %d, frame %d, subframe %d \n",ru->idx, frame, subframe);
|
||||
if (ru->fh_south_in && ru->state == RU_RUN ) ru->fh_south_in(ru,&frame,&subframe);
|
||||
if (ru->fh_south_in) ru->fh_south_in(ru,&frame,&subframe);
|
||||
else AssertFatal(1==0, "No fronthaul interface at south port");
|
||||
|
||||
|
||||
#ifdef PHY_TX_THREAD
|
||||
if(first_phy_tx == 0)
|
||||
{
|
||||
phy_tx_end = 0;
|
||||
phy_tx_txdataF_end = 0;
|
||||
if(pthread_mutex_lock(&ru->proc.mutex_phy_tx) != 0){
|
||||
LOG_E( PHY, "[RU] ERROR pthread_mutex_lock for phy tx thread (IC %d)\n", ru->proc.instance_cnt_phy_tx);
|
||||
exit_fun( "error locking mutex_rxtx" );
|
||||
}
|
||||
if (ru->proc.instance_cnt_phy_tx==-1) {
|
||||
++ru->proc.instance_cnt_phy_tx;
|
||||
|
||||
// the thread can now be woken up
|
||||
AssertFatal(pthread_cond_signal(&ru->proc.cond_phy_tx) == 0, "ERROR pthread_cond_signal for phy_tx thread\n");
|
||||
}else{
|
||||
LOG_E(PHY,"phy tx thread busy, skipping\n");
|
||||
++ru->proc.instance_cnt_phy_tx;
|
||||
}
|
||||
pthread_mutex_unlock( &ru->proc.mutex_phy_tx );
|
||||
} else {
|
||||
phy_tx_end = 1;
|
||||
phy_tx_txdataF_end = 1;
|
||||
}
|
||||
first_phy_tx = 0;
|
||||
#endif
|
||||
|
||||
if (ru->stop_rf && ru->cmd == STOP_RU) {
|
||||
ru->stop_rf(ru);
|
||||
ru->state = RU_IDLE;
|
||||
@@ -1620,10 +1707,9 @@ static void* ru_thread( void* param ) {
|
||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),"Failed to send msg to RAU\n");
|
||||
resynch_done=1;
|
||||
}
|
||||
|
||||
wakeup_eNBs(ru);
|
||||
}
|
||||
|
||||
|
||||
else {
|
||||
|
||||
LOG_D(PHY,"RU thread %d, frame %d, subframe %d \n",
|
||||
@@ -1633,6 +1719,7 @@ static void* ru_thread( void* param ) {
|
||||
LOG_D(PHY,"Waking up prach for %d.%d\n",proc->frame_rx,proc->subframe_rx);
|
||||
wakeup_prach_ru(ru);
|
||||
}
|
||||
|
||||
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
else if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>1)) {
|
||||
wakeup_prach_ru_br(ru);
|
||||
@@ -1653,41 +1740,74 @@ static void* ru_thread( void* param ) {
|
||||
pthread_mutex_lock(&proc->mutex_eNBs);
|
||||
if (proc->instance_cnt_eNBs==0) proc->instance_cnt_eNBs--;
|
||||
pthread_mutex_unlock(&proc->mutex_eNBs);
|
||||
if (ru->num_eNB>0) {
|
||||
wakeup_eNBs(ru);
|
||||
|
||||
LOG_D(PHY,"RU %d: Waiting for eNB to complete\n",ru->idx);
|
||||
// wait until eNBs are finished subframe RX n and TX n+4
|
||||
sprintf(strname,"ru_thread %d (condeNBs)",ru->idx);
|
||||
wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,strname);
|
||||
LOG_D(PHY,"RU %d: continuing\n",ru->idx);
|
||||
}
|
||||
if(get_nprocs() <= 4){
|
||||
// do TX front-end processing if needed (precoding and/or IDFTs)
|
||||
if (ru->feptx_prec) ru->feptx_prec(ru);
|
||||
|
||||
// do OFDM if needed
|
||||
if ((ru->fh_north_asynch_in == NULL) && (ru->feptx_ofdm)) ru->feptx_ofdm(ru);
|
||||
|
||||
if(!emulate_rf){
|
||||
// do outgoing fronthaul (south) if needed
|
||||
if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru);
|
||||
LOG_D(PHY,"Calling fh_north_out\n");
|
||||
if (ru->fh_north_out) ru->fh_north_out(ru);
|
||||
}
|
||||
}
|
||||
}
|
||||
#if defined(PRE_SCD_THREAD)
|
||||
new_dlsch_ue_select_tbl_in_use = dlsch_ue_select_tbl_in_use;
|
||||
dlsch_ue_select_tbl_in_use = !dlsch_ue_select_tbl_in_use;
|
||||
memcpy(&pre_scd_eNB_UE_stats,&RC.mac[ru->eNB_list[0]->Mod_id]->UE_list.eNB_UE_stats, sizeof(eNB_UE_STATS)*MAX_NUM_CCs*NUMBER_OF_UE_MAX);
|
||||
memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_list.active, sizeof(boolean_t)*NUMBER_OF_UE_MAX);
|
||||
if (pthread_mutex_lock(&ru->proc.mutex_pre_scd)!= 0) {
|
||||
LOG_E( PHY, "[eNB] error locking proc mutex for eNB pre scd\n");
|
||||
exit_fun("error locking mutex_time");
|
||||
}
|
||||
|
||||
ru->proc.instance_pre_scd++;
|
||||
|
||||
if (ru->proc.instance_pre_scd == 0) {
|
||||
if (pthread_cond_signal(&ru->proc.cond_pre_scd) != 0) {
|
||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB pre scd\n" );
|
||||
exit_fun( "ERROR pthread_cond_signal cond_pre_scd" );
|
||||
}
|
||||
}else{
|
||||
LOG_E( PHY, "[eNB] frame %d subframe %d rxtx busy instance_pre_scd %d\n",
|
||||
frame,subframe,ru->proc.instance_pre_scd );
|
||||
}
|
||||
|
||||
if (pthread_mutex_unlock(&ru->proc.mutex_pre_scd)!= 0) {
|
||||
LOG_E( PHY, "[eNB] error unlocking mutex_pre_scd mutex for eNB pre scd\n");
|
||||
exit_fun("error unlocking mutex_pre_scd");
|
||||
}
|
||||
#endif
|
||||
|
||||
// wakeup all eNB processes waiting for this RU
|
||||
if (ru->num_eNB>0) wakeup_eNBs(ru);
|
||||
|
||||
#ifndef PHY_TX_THREAD
|
||||
if(get_nprocs() <= 4 || ru->num_eNB==0 || single_thread_flag){
|
||||
// do TX front-end processing if needed (precoding and/or IDFTs)
|
||||
if (ru->feptx_prec) ru->feptx_prec(ru);
|
||||
|
||||
// do OFDM if needed
|
||||
if ((ru->fh_north_asynch_in == NULL) && (ru->feptx_ofdm)) ru->feptx_ofdm(ru);
|
||||
if(!emulate_rf){
|
||||
// do outgoing fronthaul (south) if needed
|
||||
if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru);
|
||||
|
||||
if (ru->fh_north_out) ru->fh_north_out(ru);
|
||||
}
|
||||
proc->emulate_rf_busy = 0;
|
||||
}
|
||||
#else
|
||||
struct timespec time_req, time_rem;
|
||||
time_req.tv_sec = 0;
|
||||
time_req.tv_nsec = 10000;
|
||||
|
||||
while((!oai_exit)&&(phy_tx_end == 0)){
|
||||
nanosleep(&time_req,&time_rem);
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
} // while !oai_exit
|
||||
|
||||
|
||||
|
||||
printf( "Exiting ru_thread \n");
|
||||
|
||||
if (ru->stop_rf != NULL) {
|
||||
if (ru->stop_rf(ru) != 0)
|
||||
LOG_E(HW,"Could not stop the RF device\n");
|
||||
else LOG_I(PHY,"RU %d rf device stopped\n",ru->idx);
|
||||
if (!emulate_rf){
|
||||
if (ru->stop_rf != NULL) {
|
||||
if (ru->stop_rf(ru) != 0)
|
||||
LOG_E(HW,"Could not stop the RF device\n");
|
||||
else LOG_I(PHY,"RU %d rf device stopped\n",ru->idx);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -1729,6 +1849,7 @@ void *ru_thread_synch(void *arg) {
|
||||
LOG_I(PHY,"RU synch cnt %d: %d, val %d\n",cnt,sync_pos,peak_val);
|
||||
cnt++;
|
||||
if (sync_pos >= 0) {
|
||||
|
||||
LOG_I(PHY,"Estimated peak_val %d dB, avg %d => timing offset %d\n",ru->rx_offset,dB_fixed(peak_val),dB_fixed(ru->rx_offset));
|
||||
ru->in_synch = 1;
|
||||
|
||||
@@ -1745,6 +1866,168 @@ void *ru_thread_synch(void *arg) {
|
||||
|
||||
}
|
||||
|
||||
#if defined(PRE_SCD_THREAD)
|
||||
void* pre_scd_thread( void* param ){
|
||||
static int eNB_pre_scd_status;
|
||||
protocol_ctxt_t ctxt;
|
||||
int frame;
|
||||
int subframe;
|
||||
int min_rb_unit[MAX_NUM_CCs];
|
||||
int CC_id;
|
||||
int Mod_id;
|
||||
RU_t *ru = (RU_t*)param;
|
||||
Mod_id = ru->eNB_list[0]->Mod_id;
|
||||
|
||||
frame = 0;
|
||||
subframe = 4;
|
||||
thread_top_init("pre_scd_thread",0,870000,1000000,1000000);
|
||||
|
||||
while (!oai_exit) {
|
||||
if(oai_exit){
|
||||
break;
|
||||
}
|
||||
pthread_mutex_lock(&ru->proc.mutex_pre_scd );
|
||||
if (ru->proc.instance_pre_scd < 0) {
|
||||
pthread_cond_wait(&ru->proc.cond_pre_scd, &ru->proc.mutex_pre_scd);
|
||||
}
|
||||
pthread_mutex_unlock(&ru->proc.mutex_pre_scd);
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, Mod_id, ENB_FLAG_YES,
|
||||
NOT_A_RNTI, frame, subframe,Mod_id);
|
||||
pdcp_run(&ctxt);
|
||||
|
||||
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||
|
||||
rrc_rx_tx(&ctxt, CC_id);
|
||||
min_rb_unit[CC_id] = get_min_rb_unit(Mod_id, CC_id);
|
||||
}
|
||||
|
||||
pre_scd_nb_rbs_required(Mod_id, frame, subframe,min_rb_unit,pre_nb_rbs_required[new_dlsch_ue_select_tbl_in_use]);
|
||||
|
||||
if (subframe==9) {
|
||||
subframe=0;
|
||||
frame++;
|
||||
frame&=1023;
|
||||
} else {
|
||||
subframe++;
|
||||
}
|
||||
pthread_mutex_lock(&ru->proc.mutex_pre_scd );
|
||||
ru->proc.instance_pre_scd--;
|
||||
pthread_mutex_unlock(&ru->proc.mutex_pre_scd);
|
||||
}
|
||||
eNB_pre_scd_status = 0;
|
||||
return &eNB_pre_scd_status;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PHY_TX_THREAD
|
||||
/*!
|
||||
* \brief The phy tx thread of eNB.
|
||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||
*/
|
||||
static void* eNB_thread_phy_tx( void* param ) {
|
||||
static int eNB_thread_phy_tx_status;
|
||||
|
||||
|
||||
RU_t *ru = (RU_t*)param;
|
||||
RU_proc_t *proc = &ru->proc;
|
||||
PHY_VARS_eNB **eNB_list = ru->eNB_list;
|
||||
|
||||
eNB_rxtx_proc_t proc_rxtx;
|
||||
|
||||
// set default return value
|
||||
eNB_thread_phy_tx_status = 0;
|
||||
|
||||
thread_top_init("eNB_thread_phy_tx",1,500000L,1000000L,20000000L);
|
||||
|
||||
|
||||
while (!oai_exit) {
|
||||
|
||||
if (oai_exit) break;
|
||||
|
||||
|
||||
if (wait_on_condition(&proc->mutex_phy_tx,&proc->cond_phy_tx,&proc->instance_cnt_phy_tx,"eNB_phy_tx_thread") < 0) break;
|
||||
|
||||
LOG_D(PHY,"Running eNB phy tx procedures\n");
|
||||
if(ru->num_eNB == 1){
|
||||
proc_rxtx.subframe_tx = proc->subframe_phy_tx;
|
||||
proc_rxtx.frame_tx = proc->frame_phy_tx;
|
||||
phy_procedures_eNB_TX(eNB_list[0], &proc_rxtx, 1);
|
||||
phy_tx_txdataF_end = 1;
|
||||
if(pthread_mutex_lock(&ru->proc.mutex_rf_tx) != 0){
|
||||
LOG_E( PHY, "[RU] ERROR pthread_mutex_lock for rf tx thread (IC %d)\n", ru->proc.instance_cnt_rf_tx);
|
||||
exit_fun( "error locking mutex_rf_tx" );
|
||||
}
|
||||
if (ru->proc.instance_cnt_rf_tx==-1) {
|
||||
++ru->proc.instance_cnt_rf_tx;
|
||||
ru->proc.frame_tx = proc->frame_phy_tx;
|
||||
ru->proc.subframe_tx = proc->subframe_phy_tx;
|
||||
ru->proc.timestamp_tx = proc->timestamp_phy_tx;
|
||||
|
||||
// the thread can now be woken up
|
||||
AssertFatal(pthread_cond_signal(&ru->proc.cond_rf_tx) == 0, "ERROR pthread_cond_signal for rf_tx thread\n");
|
||||
}else{
|
||||
LOG_E(PHY,"rf tx thread busy, skipping\n");
|
||||
late_control=STATE_BURST_TERMINATE;
|
||||
}
|
||||
pthread_mutex_unlock( &ru->proc.mutex_rf_tx );
|
||||
}
|
||||
if (release_thread(&proc->mutex_phy_tx,&proc->instance_cnt_phy_tx,"eNB_thread_phy_tx") < 0) break;
|
||||
phy_tx_end = 1;
|
||||
}
|
||||
|
||||
LOG_I(PHY, "Exiting eNB thread PHY TX\n");
|
||||
|
||||
eNB_thread_phy_tx_status = 0;
|
||||
return &eNB_thread_phy_tx_status;
|
||||
}
|
||||
|
||||
|
||||
static void* rf_tx( void* param ) {
|
||||
static int rf_tx_status;
|
||||
|
||||
RU_t *ru = (RU_t*)param;
|
||||
RU_proc_t *proc = &ru->proc;
|
||||
|
||||
// set default return value
|
||||
rf_tx_status = 0;
|
||||
|
||||
thread_top_init("rf_tx",1,500000L,1000000L,20000000L);
|
||||
|
||||
while (!oai_exit) {
|
||||
|
||||
if (oai_exit) break;
|
||||
|
||||
|
||||
if (wait_on_condition(&proc->mutex_rf_tx,&proc->cond_rf_tx,&proc->instance_cnt_rf_tx,"rf_tx_thread") < 0) break;
|
||||
|
||||
LOG_D(PHY,"Running eNB rf tx procedures\n");
|
||||
if(ru->num_eNB == 1){
|
||||
// do TX front-end processing if needed (precoding and/or IDFTs)
|
||||
if (ru->feptx_prec) ru->feptx_prec(ru);
|
||||
// do OFDM if needed
|
||||
if ((ru->fh_north_asynch_in == NULL) && (ru->feptx_ofdm)) ru->feptx_ofdm(ru);
|
||||
if(!emulate_rf){
|
||||
// do outgoing fronthaul (south) if needed
|
||||
if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru);
|
||||
|
||||
if (ru->fh_north_out) ru->fh_north_out(ru);
|
||||
}
|
||||
}
|
||||
if (release_thread(&proc->mutex_rf_tx,&proc->instance_cnt_rf_tx,"rf_tx") < 0) break;
|
||||
if(proc->instance_cnt_rf_tx >= 0){
|
||||
late_control=STATE_BURST_TERMINATE;
|
||||
LOG_E(PHY,"detect rf tx busy change mode TX failsafe\n");
|
||||
}
|
||||
}
|
||||
|
||||
LOG_I(PHY, "Exiting rf TX\n");
|
||||
|
||||
rf_tx_status = 0;
|
||||
return &rf_tx_status;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
int start_if(struct RU_t_s *ru,struct PHY_VARS_eNB_s *eNB) {
|
||||
@@ -1768,6 +2051,8 @@ extern void feptx_ofdm_2thread(RU_t *ru);
|
||||
extern void feptx_prec(RU_t *ru);
|
||||
extern void init_fep_thread(RU_t *ru,pthread_attr_t *attr);
|
||||
extern void init_feptx_thread(RU_t *ru,pthread_attr_t *attr);
|
||||
extern void kill_fep_thread(RU_t *ru);
|
||||
extern void kill_feptx_thread(RU_t *ru);
|
||||
|
||||
extern void configure_ru(int idx,
|
||||
void *arg);
|
||||
@@ -1862,6 +2147,15 @@ void init_RU_proc(RU_t *ru) {
|
||||
pthread_cond_init( &proc->cond_prach_br, NULL);
|
||||
pthread_attr_init( &proc->attr_prach_br);
|
||||
#endif
|
||||
|
||||
#ifdef PHY_TX_THREAD
|
||||
proc->instance_cnt_phy_tx = -1;
|
||||
pthread_mutex_init( &proc->mutex_phy_tx, NULL);
|
||||
pthread_cond_init( &proc->cond_phy_tx, NULL);
|
||||
proc->instance_cnt_rf_tx = -1;
|
||||
pthread_mutex_init( &proc->mutex_rf_tx, NULL);
|
||||
pthread_cond_init( &proc->cond_rf_tx, NULL);
|
||||
#endif
|
||||
|
||||
#ifndef DEADLINE_SCHEDULER
|
||||
attr_FH = &proc->attr_FH;
|
||||
@@ -1880,9 +2174,26 @@ void init_RU_proc(RU_t *ru) {
|
||||
|
||||
|
||||
pthread_create( &proc->pthread_FH, attr_FH, ru_thread, (void*)ru );
|
||||
if (emulate_rf) pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
|
||||
|
||||
if (get_nprocs() > 4) pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
|
||||
#if defined(PRE_SCD_THREAD)
|
||||
proc->instance_pre_scd = -1;
|
||||
pthread_mutex_init( &proc->mutex_pre_scd, NULL);
|
||||
pthread_cond_init( &proc->cond_pre_scd, NULL);
|
||||
pthread_create(&proc->pthread_pre_scd, NULL, pre_scd_thread, (void*)ru);
|
||||
pthread_setname_np(proc->pthread_pre_scd, "pre_scd_thread");
|
||||
#endif
|
||||
|
||||
#ifdef PHY_TX_THREAD
|
||||
pthread_create( &proc->pthread_phy_tx, NULL, eNB_thread_phy_tx, (void*)ru );
|
||||
pthread_setname_np( proc->pthread_phy_tx, "phy_tx_thread" );
|
||||
pthread_create( &proc->pthread_rf_tx, NULL, rf_tx, (void*)ru );
|
||||
#endif
|
||||
|
||||
if(emulate_rf)
|
||||
pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
|
||||
|
||||
if (!single_thread_flag && get_nprocs() > 4)
|
||||
pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
|
||||
|
||||
|
||||
if (ru->function == NGFI_RRU_IF4p5) {
|
||||
@@ -1922,14 +2233,11 @@ void init_RU_proc(RU_t *ru) {
|
||||
}
|
||||
|
||||
if (get_nprocs()> 2 && fepw) {
|
||||
if (ru->feprx) init_fep_thread(ru,NULL);
|
||||
if (ru->feptx_ofdm) init_feptx_thread(ru,NULL);
|
||||
init_fep_thread(ru,NULL);
|
||||
init_feptx_thread(ru,NULL);
|
||||
}
|
||||
if (opp_enabled == 1) pthread_create(&ru->ru_stats_thread,NULL,ru_stats_thread,(void*)ru);
|
||||
|
||||
pthread_create( &proc->pthread_FH, attr_FH, ru_thread, (void*)ru );
|
||||
snprintf( name, sizeof(name), "ru_thread_FH %d", ru->idx );
|
||||
pthread_setname_np( proc->pthread_FH, name );
|
||||
|
||||
if (ru->function == eNodeB_3GPP) {
|
||||
usleep(10000);
|
||||
@@ -1946,6 +2254,13 @@ void kill_RU_proc(int inst)
|
||||
RU_t *ru = RC.ru[inst];
|
||||
RU_proc_t *proc = &ru->proc;
|
||||
|
||||
if (get_nprocs() > 2 && fepw) {
|
||||
LOG_D(PHY, "killing FEP thread\n");
|
||||
kill_fep_thread(ru);
|
||||
LOG_D(PHY, "killing FEP TX thread\n");
|
||||
kill_feptx_thread(ru);
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&proc->mutex_FH);
|
||||
proc->instance_cnt_FH = 0;
|
||||
pthread_cond_signal(&proc->cond_FH);
|
||||
@@ -1984,10 +2299,10 @@ void kill_RU_proc(int inst)
|
||||
pthread_cond_signal(&proc->cond_asynch_rxtx);
|
||||
pthread_mutex_unlock(&proc->mutex_asynch_rxtx);
|
||||
|
||||
LOG_D(PHY, "Joining pthread_FH\n");
|
||||
/*LOG_D(PHY, "Joining pthread_FH\n");
|
||||
pthread_join(proc->pthread_FH, NULL);
|
||||
LOG_D(PHY, "Joining pthread_FHTX\n");
|
||||
pthread_join(proc->pthread_FH1, NULL);
|
||||
pthread_join(proc->pthread_FH1, NULL);*/
|
||||
if (ru->function == NGFI_RRU_IF4p5) {
|
||||
LOG_D(PHY, "Joining pthread_prach\n");
|
||||
pthread_join(proc->pthread_prach, NULL);
|
||||
@@ -2007,28 +2322,6 @@ void kill_RU_proc(int inst)
|
||||
pthread_join(proc->pthread_asynch_rxtx, NULL);
|
||||
}
|
||||
}
|
||||
if (get_nprocs() > 2 && fepw) {
|
||||
if (ru->feprx) {
|
||||
pthread_mutex_lock(&proc->mutex_fep);
|
||||
proc->instance_cnt_fep = 0;
|
||||
pthread_mutex_unlock(&proc->mutex_fep);
|
||||
pthread_cond_signal(&proc->cond_fep);
|
||||
LOG_D(PHY, "Joining pthread_fep\n");
|
||||
pthread_join(proc->pthread_fep, NULL);
|
||||
pthread_mutex_destroy(&proc->mutex_fep);
|
||||
pthread_cond_destroy(&proc->cond_fep);
|
||||
}
|
||||
if (ru->feptx_ofdm) {
|
||||
pthread_mutex_lock(&proc->mutex_feptx);
|
||||
proc->instance_cnt_feptx = 0;
|
||||
pthread_mutex_unlock(&proc->mutex_feptx);
|
||||
pthread_cond_signal(&proc->cond_feptx);
|
||||
LOG_D(PHY, "Joining pthread_feptx\n");
|
||||
pthread_join(proc->pthread_feptx, NULL);
|
||||
pthread_mutex_destroy(&proc->mutex_feptx);
|
||||
pthread_cond_destroy(&proc->cond_feptx);
|
||||
}
|
||||
}
|
||||
if (opp_enabled) {
|
||||
LOG_D(PHY, "Joining ru_stats_thread\n");
|
||||
pthread_join(ru->ru_stats_thread, NULL);
|
||||
@@ -2067,8 +2360,6 @@ void kill_RU_proc(int inst)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void init_precoding_weights(PHY_VARS_eNB *eNB) {
|
||||
|
||||
int layer,ru_id,aa,re,ue,tb;
|
||||
@@ -2243,7 +2534,7 @@ void set_function_spec_param(RU_t *ru)
|
||||
} // switch on interface type
|
||||
}
|
||||
|
||||
extern void RCconfig_RU(void);
|
||||
//extern void RCconfig_RU(void);
|
||||
|
||||
void init_RU(char *rf_config_file, clock_source_t clock_source,clock_source_t time_source,int send_dmrssync) {
|
||||
|
||||
@@ -2326,6 +2617,37 @@ void init_RU(char *rf_config_file, clock_source_t clock_source,clock_source_t ti
|
||||
|
||||
|
||||
|
||||
void stop_ru(RU_t *ru) {
|
||||
|
||||
#if defined(PRE_SCD_THREAD) || defined(PHY_TX_THREAD)
|
||||
int *status;
|
||||
#endif
|
||||
printf("Stopping RU %p processing threads\n",(void*)ru);
|
||||
#if defined(PRE_SCD_THREAD)
|
||||
if(ru){
|
||||
ru->proc.instance_pre_scd = 0;
|
||||
pthread_cond_signal( &ru->proc.cond_pre_scd );
|
||||
pthread_join(ru->proc.pthread_pre_scd, (void**)&status );
|
||||
pthread_mutex_destroy(&ru->proc.mutex_pre_scd );
|
||||
pthread_cond_destroy(&ru->proc.cond_pre_scd );
|
||||
}
|
||||
#endif
|
||||
#ifdef PHY_TX_THREAD
|
||||
if(ru){
|
||||
ru->proc.instance_cnt_phy_tx = 0;
|
||||
pthread_cond_signal(&ru->proc.cond_phy_tx);
|
||||
pthread_join( ru->proc.pthread_phy_tx, (void**)&status );
|
||||
pthread_mutex_destroy( &ru->proc.mutex_phy_tx );
|
||||
pthread_cond_destroy( &ru->proc.cond_phy_tx );
|
||||
ru->proc.instance_cnt_rf_tx = 0;
|
||||
pthread_cond_signal(&ru->proc.cond_rf_tx);
|
||||
pthread_join( ru->proc.pthread_rf_tx, (void**)&status );
|
||||
pthread_mutex_destroy( &ru->proc.mutex_rf_tx );
|
||||
pthread_cond_destroy( &ru->proc.cond_rf_tx );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void stop_RU(int nb_ru)
|
||||
{
|
||||
for (int inst = 0; inst < nb_ru; inst++) {
|
||||
|
||||
@@ -34,9 +34,6 @@
|
||||
#define _GNU_SOURCE /* See feature_test_macros(7) */
|
||||
#include <sched.h>
|
||||
|
||||
|
||||
#include "T.h"
|
||||
|
||||
#include "rt_wrapper.h"
|
||||
|
||||
|
||||
@@ -72,11 +69,11 @@
|
||||
#include "PHY/TOOLS/smbv.h"
|
||||
unsigned short config_frames[4] = {2,9,11,13};
|
||||
#endif
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "UTIL/OTG/otg_tx.h"
|
||||
#include "UTIL/OTG/otg_externs.h"
|
||||
#include "UTIL/MATH/oml.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
#include "enb_config.h"
|
||||
//#include "PHY/TOOLS/time_meas.h"
|
||||
@@ -138,20 +135,17 @@ static int wait_for_sync = 0;
|
||||
static int send_dmrssync = 0;
|
||||
|
||||
unsigned int mmapped_dma=0;
|
||||
int single_thread_flag=1;
|
||||
int single_thread_flag = 0;
|
||||
|
||||
static int8_t threequarter_fs=0;
|
||||
|
||||
uint32_t downlink_frequency[MAX_NUM_CCs][4];
|
||||
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||
|
||||
|
||||
// This is a dummy declaration (dlsch_demodulation.c is no longer compiled for eNodeB)
|
||||
int16_t dlsch_demod_shift = 0;
|
||||
|
||||
#if defined(ENABLE_ITTI)
|
||||
static char *itti_dump_file = NULL;
|
||||
#endif
|
||||
|
||||
int UE_scan = 1;
|
||||
int UE_scan_carrier = 0;
|
||||
runmode_t mode = normal_txrx;
|
||||
@@ -342,10 +336,14 @@ void exit_fun(const char* s)
|
||||
if (RC.ru == NULL)
|
||||
exit(-1); // likely init not completed, prevent crash or hang, exit now...
|
||||
for (ru_id=0; ru_id<RC.nb_RU;ru_id++) {
|
||||
if (RC.ru[ru_id] && RC.ru[ru_id]->rfdevice.trx_end_func)
|
||||
if (RC.ru[ru_id] && RC.ru[ru_id]->rfdevice.trx_end_func) {
|
||||
RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice);
|
||||
if (RC.ru[ru_id] && RC.ru[ru_id]->ifdevice.trx_end_func)
|
||||
RC.ru[ru_id]->rfdevice.trx_end_func = NULL;
|
||||
}
|
||||
if (RC.ru[ru_id] && RC.ru[ru_id]->ifdevice.trx_end_func) {
|
||||
RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
|
||||
RC.ru[ru_id]->ifdevice.trx_end_func = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -523,12 +521,12 @@ static void get_options(void) {
|
||||
|
||||
|
||||
uint32_t online_log_messages;
|
||||
uint32_t glog_level, glog_verbosity;
|
||||
uint32_t glog_level ;
|
||||
uint32_t start_telnetsrv;
|
||||
|
||||
paramdef_t cmdline_params[] =CMDLINE_PARAMS_DESC ;
|
||||
paramdef_t cmdline_logparams[] =CMDLINE_LOGPARAMS_DESC ;
|
||||
|
||||
CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
|
||||
config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
|
||||
|
||||
if (strlen(in_path) > 0) {
|
||||
@@ -541,25 +539,20 @@ static void get_options(void) {
|
||||
opt_type = OPT_WIRESHARK;
|
||||
printf("Enabling OPT for wireshark for local interface");
|
||||
}
|
||||
|
||||
CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
|
||||
config_process_cmdline( cmdline_logparams,sizeof(cmdline_logparams)/sizeof(paramdef_t),NULL);
|
||||
|
||||
if(config_isparamset(cmdline_logparams,CMDLINE_ONLINELOG_IDX)) {
|
||||
set_glog_onlinelog(online_log_messages);
|
||||
}
|
||||
if(config_isparamset(cmdline_logparams,CMDLINE_GLOGLEVEL_IDX)) {
|
||||
set_glog(glog_level, -1);
|
||||
}
|
||||
if(config_isparamset(cmdline_logparams,CMDLINE_GLOGVERBO_IDX)) {
|
||||
set_glog(-1, glog_verbosity);
|
||||
set_glog(glog_level);
|
||||
}
|
||||
if (start_telnetsrv) {
|
||||
load_module_shlib("telnetsrv",NULL,0);
|
||||
}
|
||||
|
||||
#if T_TRACER
|
||||
paramdef_t cmdline_ttraceparams[] =CMDLINE_TTRACEPARAMS_DESC ;
|
||||
config_process_cmdline( cmdline_ttraceparams,sizeof(cmdline_ttraceparams)/sizeof(paramdef_t),NULL);
|
||||
#endif
|
||||
|
||||
|
||||
if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) {
|
||||
memset((void*)&RC,0,sizeof(RC));
|
||||
@@ -579,11 +572,6 @@ static void get_options(void) {
|
||||
}
|
||||
|
||||
|
||||
#if T_TRACER
|
||||
int T_nowait = 0; /* by default we wait for the tracer */
|
||||
int T_port = 2021; /* default port to listen to to wait for the tracer */
|
||||
int T_dont_fork = 0; /* default is to fork, see 'T_init' to understand */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -915,7 +903,16 @@ static void wait_nfapi_init(char *thread_name) {
|
||||
|
||||
pthread_mutex_unlock(&nfapi_sync_mutex);
|
||||
|
||||
/*
|
||||
* Raphael Defosseux: temporary workaround for CI
|
||||
* -- Repeating the message thrice to make sure
|
||||
* -- it is present during flush.
|
||||
*/
|
||||
printf( "NFAPI: got sync (%s)\n", thread_name);
|
||||
printf( "NFAPI: got sync (%s)\n", thread_name);
|
||||
printf( "NFAPI: got sync (%s)\n", thread_name);
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
int main( int argc, char **argv )
|
||||
@@ -935,10 +932,6 @@ int main( int argc, char **argv )
|
||||
exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
|
||||
}
|
||||
|
||||
#ifdef DEBUG_CONSOLE
|
||||
setvbuf(stdout, NULL, _IONBF, 0);
|
||||
setvbuf(stderr, NULL, _IONBF, 0);
|
||||
#endif
|
||||
|
||||
mode = normal_txrx;
|
||||
memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS);
|
||||
@@ -959,7 +952,7 @@ int main( int argc, char **argv )
|
||||
|
||||
|
||||
#if T_TRACER
|
||||
T_init(T_port, 1-T_nowait, T_dont_fork);
|
||||
T_Config_Init();
|
||||
#endif
|
||||
|
||||
|
||||
@@ -969,21 +962,15 @@ int main( int argc, char **argv )
|
||||
|
||||
printf("configuring for RAU/RRU\n");
|
||||
|
||||
|
||||
if (ouput_vcd) {
|
||||
VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_eNB.vcd");
|
||||
}
|
||||
|
||||
if (opp_enabled ==1) {
|
||||
reset_opp_meas();
|
||||
}
|
||||
cpuf=get_cpu_freq_GHz();
|
||||
|
||||
#if defined(ENABLE_ITTI)
|
||||
log_set_instance_type (LOG_INSTANCE_ENB);
|
||||
|
||||
printf("ITTI init\n");
|
||||
itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file);
|
||||
itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
|
||||
|
||||
// initialize mscgen log after ITTI
|
||||
MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX);
|
||||
@@ -1235,6 +1222,7 @@ int main( int argc, char **argv )
|
||||
|
||||
// connect the TX/RX buffers
|
||||
|
||||
sleep(1); /* wait for thread activation */
|
||||
|
||||
printf("Sending sync to all threads\n");
|
||||
|
||||
@@ -1286,6 +1274,10 @@ int main( int argc, char **argv )
|
||||
printf("stopping MODEM threads\n");
|
||||
|
||||
// cleanup
|
||||
for (ru_id=0;ru_id<RC.nb_RU;ru_id++) {
|
||||
stop_ru(RC.ru[ru_id]);
|
||||
}
|
||||
|
||||
stop_eNB(NB_eNB_INST);
|
||||
stop_RU(RC.nb_RU);
|
||||
/* release memory used by the RU/eNB threads (incomplete), after all
|
||||
@@ -1315,15 +1307,17 @@ int main( int argc, char **argv )
|
||||
|
||||
// *** Handle per CC_id openair0
|
||||
|
||||
for(ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
||||
if (RC.ru[ru_id]->rfdevice.trx_end_func)
|
||||
RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice);
|
||||
if (RC.ru[ru_id]->ifdevice.trx_end_func)
|
||||
RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
|
||||
|
||||
for(ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
||||
if (RC.ru[ru_id]->rfdevice.trx_end_func) {
|
||||
RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice);
|
||||
RC.ru[ru_id]->rfdevice.trx_end_func = NULL;
|
||||
}
|
||||
if (RC.ru[ru_id]->ifdevice.trx_end_func) {
|
||||
RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
|
||||
RC.ru[ru_id]->ifdevice.trx_end_func = NULL;
|
||||
}
|
||||
}
|
||||
if (ouput_vcd)
|
||||
VCD_SIGNAL_DUMPER_CLOSE();
|
||||
|
||||
if (opt_enabled == 1)
|
||||
terminate_opt();
|
||||
|
||||
@@ -87,7 +87,6 @@
|
||||
#define CONFIG_HLP_UE "Set the lte softmodem as a UE\n"
|
||||
#define CONFIG_HLP_L2MONW "Enable L2 wireshark messages on localhost \n"
|
||||
#define CONFIG_HLP_L2MONP "Enable L2 pcap messages on localhost \n"
|
||||
#define CONFIG_HLP_VCD "Enable VCD (generated file will is named openair_dump_eNB.vcd, read it with target/RT/USER/eNB.gtkw\n"
|
||||
#define CONFIG_HLP_TQFS "Apply three-quarter of sampling frequency, 23.04 Msps to reduce the data rate on USB/PCIe transfers (only valid for 20 MHz)\n"
|
||||
#define CONFIG_HLP_TPORT "tracer port\n"
|
||||
#define CONFIG_HLP_NOTWAIT "don't wait for tracer, start immediately\n"
|
||||
@@ -165,7 +164,7 @@
|
||||
{"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \
|
||||
{"external-clock", CONFIG_HLP_EXCCLK, PARAMFLAG_BOOL, uptr:&clock_source, defintval:0, TYPE_INT, 0}, \
|
||||
{"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&wait_for_sync, defintval:0, TYPE_INT, 0}, \
|
||||
{"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \
|
||||
{"single-thread-enable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:0, TYPE_INT, 0}, \
|
||||
{"threadIQ", NULL, 0, iptr:&(threads.iq), defintval:1, TYPE_INT, 0}, \
|
||||
{"threadOneSubframe", NULL, 0, iptr:&(threads.one), defintval:1, TYPE_INT, 0}, \
|
||||
{"threadTwoSubframe", NULL, 0, iptr:&(threads.two), defintval:1, TYPE_INT, 0}, \
|
||||
@@ -178,12 +177,10 @@
|
||||
{"a" , CONFIG_HLP_CHOFF, 0, iptr:&chain_offset, defintval:0, TYPE_INT, 0}, \
|
||||
{"d" , CONFIG_HLP_SOFTS, PARAMFLAG_BOOL, uptr:(uint32_t *)&do_forms, defintval:0, TYPE_INT8, 0}, \
|
||||
{"E" , CONFIG_HLP_TQFS, PARAMFLAG_BOOL, i8ptr:&threequarter_fs, defintval:0, TYPE_INT8, 0}, \
|
||||
{"K" , CONFIG_HLP_ITTIL, PARAMFLAG_NOFREE, strptr:&itti_dump_file, defstrval:"/tmp/itti.dump", TYPE_STRING, 0}, \
|
||||
{"m" , CONFIG_HLP_DLMCS, 0, uptr:&target_dl_mcs, defintval:0, TYPE_UINT, 0}, \
|
||||
{"t" , CONFIG_HLP_ULMCS, 0, uptr:&target_ul_mcs, defintval:0, TYPE_UINT, 0}, \
|
||||
{"W" , CONFIG_HLP_L2MONW, 0, strptr:(char **)&in_ip, defstrval:"127.0.0.1", TYPE_STRING, sizeof(in_ip)}, \
|
||||
{"P" , CONFIG_HLP_L2MONP, 0, strptr:(char **)&in_path, defstrval:"/tmp/oai_opt.pcap", TYPE_STRING, sizeof(in_path)}, \
|
||||
{"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&ouput_vcd, defintval:0, TYPE_INT, 0}, \
|
||||
{"q" , CONFIG_HLP_STMON, PARAMFLAG_BOOL, iptr:&opp_enabled, defintval:0, TYPE_INT, 0}, \
|
||||
{"S" , CONFIG_HLP_MSLOTS, PARAMFLAG_BOOL, u8ptr:&exit_missed_slots, defintval:1, TYPE_UINT8, 0}, \
|
||||
{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \
|
||||
@@ -197,7 +194,6 @@
|
||||
|
||||
#define CONFIG_HLP_FLOG "Enable online log \n"
|
||||
#define CONFIG_HLP_LOGL "Set the global log level, valide options: (9:trace, 8/7:debug, 6:info, 4:warn, 3:error)\n"
|
||||
#define CONFIG_HLP_LOGV "Set the global log verbosity \n"
|
||||
#define CONFIG_HLP_TELN "Start embedded telnet server \n"
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* command line parameters for LOG utility */
|
||||
@@ -206,28 +202,11 @@
|
||||
#define CMDLINE_LOGPARAMS_DESC { \
|
||||
{"R" , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \
|
||||
{"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \
|
||||
{"G" , CONFIG_HLP_LOGV, 0, uptr:&glog_verbosity, defintval:0, TYPE_UINT16, 0}, \
|
||||
{"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \
|
||||
}
|
||||
#define CMDLINE_ONLINELOG_IDX 0
|
||||
#define CMDLINE_GLOGLEVEL_IDX 1
|
||||
#define CMDLINE_GLOGVERBO_IDX 2
|
||||
#define CMDLINE_STARTTELN_IDX 3
|
||||
|
||||
|
||||
extern int T_port;
|
||||
extern int T_nowait;
|
||||
extern int T_dont_fork;
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* command line parameters for TTRACE utility */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define CMDLINE_TTRACEPARAMS_DESC { \
|
||||
{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:0, TYPE_INT, 0}, \
|
||||
{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \
|
||||
{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:1, TYPE_INT, 0}, \
|
||||
}
|
||||
#define CMDLINE_STARTTELN_IDX 2
|
||||
|
||||
|
||||
/***************************************************************************************************************************************/
|
||||
@@ -269,7 +248,9 @@ extern void stop_eNB(int);
|
||||
extern void kill_eNB_proc(int inst);
|
||||
|
||||
// In lte-ru.c
|
||||
|
||||
extern void init_RU(const char*,clock_source_t clock_source,clock_source_t time_source,int send_dmrssync);
|
||||
//extern void stop_ru(RU_t *ru);
|
||||
extern void init_RU_proc(RU_t *ru);
|
||||
extern void stop_RU(int nb_ru);
|
||||
extern void kill_RU_proc(int inst);
|
||||
@@ -279,7 +260,7 @@ extern void set_function_spec_param(RU_t *ru);
|
||||
extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg);
|
||||
extern void fill_ue_band_info(void);
|
||||
|
||||
extern void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction, int phy_test, int UE_scan, int UE_scan_carrier, runmode_t mode,int rxgain,int txpowermax, int nb_rx, int nb_tx);
|
||||
extern void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction, int phy_test, int UE_scan, int UE_scan_carrier, runmode_t mode,int rxgain,int txpowermax, LTE_DL_FRAME_PARMS *fp);
|
||||
extern void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_t *cpuset, char * name);
|
||||
|
||||
extern void reset_opp_meas(void);
|
||||
|
||||
+82
-422
@@ -52,11 +52,11 @@
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "UTIL/OTG/otg_tx.h"
|
||||
#include "UTIL/OTG/otg_externs.h"
|
||||
#include "UTIL/MATH/oml.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ void init_UE_threads(int);
|
||||
void init_UE_threads_stub(int);
|
||||
void init_UE_single_thread_stub(int);
|
||||
void *UE_thread(void *arg);
|
||||
void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction, int phy_test, int UE_scan, int UE_scan_carrier, runmode_t mode,int rxgain,int txpowermax,int nb_rx,int nb_tx);
|
||||
void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction, int phy_test, int UE_scan, int UE_scan_carrier, runmode_t mode,int rxgain,int txpowermax,LTE_DL_FRAME_PARMS *fp);
|
||||
void init_UE_stub(int nb_inst,int,int,char*);
|
||||
void init_UE_stub_single_thread(int nb_inst,int,int,char*);
|
||||
int init_timer_thread(void);
|
||||
@@ -172,20 +172,18 @@ PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
{
|
||||
|
||||
PHY_VARS_UE* ue;
|
||||
PHY_VARS_UE* ue = (PHY_VARS_UE *)malloc(sizeof(PHY_VARS_UE));
|
||||
memset(ue,0,sizeof(PHY_VARS_UE));
|
||||
|
||||
if (frame_parms!=(LTE_DL_FRAME_PARMS *)NULL) { // if we want to give initial frame parms, allocate the PHY_VARS_UE structure and put them in
|
||||
ue = (PHY_VARS_UE *)malloc(sizeof(PHY_VARS_UE));
|
||||
memset(ue,0,sizeof(PHY_VARS_UE));
|
||||
memcpy(&(ue->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS));
|
||||
}
|
||||
else ue = PHY_vars_UE_g[UE_id][0];
|
||||
|
||||
|
||||
ue->Mod_id = UE_id;
|
||||
ue->mac_enabled = 1;
|
||||
|
||||
// Panos: In phy_stub_UE (MAC-to-MAC) mode these init functions don't need to get called. Is this correct?
|
||||
// In phy_stub_UE (MAC-to-MAC) mode these init functions don't need to get called. Is this correct?
|
||||
if (nfapi_mode!=3)
|
||||
{
|
||||
// initialize all signal buffers
|
||||
@@ -238,11 +236,12 @@ void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_
|
||||
|
||||
}
|
||||
|
||||
void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction, int phy_test, int UE_scan, int UE_scan_carrier, runmode_t mode,int rxgain,int txpowermax,int nb_rx,int nb_tx) {
|
||||
void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction, int phy_test, int UE_scan, int UE_scan_carrier, runmode_t mode,int rxgain,int txpowermax,LTE_DL_FRAME_PARMS *fp0) {
|
||||
|
||||
PHY_VARS_UE *UE;
|
||||
int inst;
|
||||
int ret;
|
||||
LTE_DL_FRAME_PARMS *fp;
|
||||
|
||||
LOG_I(PHY,"UE : Calling Layer 2 for initialization\n");
|
||||
|
||||
@@ -256,20 +255,18 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
|
||||
if (PHY_vars_UE_g[inst]==NULL) PHY_vars_UE_g[inst] = (PHY_VARS_UE**)calloc(1+MAX_NUM_CCs,sizeof(PHY_VARS_UE*));
|
||||
LOG_I(PHY,"Allocating UE context %d\n",inst);
|
||||
|
||||
if (simL1flag == 0) PHY_vars_UE_g[inst][0] = init_ue_vars(NULL,inst,0);
|
||||
if (simL1flag == 0) PHY_vars_UE_g[inst][0] = init_ue_vars(fp0,inst,0);
|
||||
else {
|
||||
RC.ru[0]->frame_parms.nb_antennas_rx = nb_rx;
|
||||
RC.ru[0]->frame_parms.nb_antennas_tx = nb_tx;
|
||||
RC.ru[0]->frame_parms.frame_type = FDD;
|
||||
RC.ru[0]->frame_parms.tdd_config = 3;
|
||||
RC.ru[0]->frame_parms.tdd_config_S = 0;
|
||||
|
||||
// needed for memcopy below. these are not used in the RU, but needed for UE
|
||||
RC.ru[0]->frame_parms.nb_antennas_rx = fp0->nb_antennas_rx;
|
||||
RC.ru[0]->frame_parms.nb_antennas_tx = fp0->nb_antennas_tx;
|
||||
PHY_vars_UE_g[inst][0] = init_ue_vars(&RC.ru[0]->frame_parms,inst,0);
|
||||
}
|
||||
// turn off timing control loop in UE
|
||||
PHY_vars_UE_g[inst][0]->no_timing_correction = timing_correction;
|
||||
|
||||
UE = PHY_vars_UE_g[inst][0];
|
||||
fp = &UE->frame_parms;
|
||||
printf("PHY_vars_UE_g[0][0] = %p\n",UE);
|
||||
|
||||
if (phy_test==1)
|
||||
@@ -304,8 +301,37 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
|
||||
UE->rx_total_gain_dB = rxgain;
|
||||
UE->tx_power_max_dBm = txpowermax;
|
||||
|
||||
UE->frame_parms.nb_antennas_tx = nb_tx;
|
||||
UE->frame_parms.nb_antennas_rx = nb_rx;
|
||||
UE->frame_parms.nb_antennas_tx = fp0->nb_antennas_tx;
|
||||
UE->frame_parms.nb_antennas_rx = fp0->nb_antennas_rx;
|
||||
|
||||
if (fp->frame_type == TDD) {
|
||||
switch (fp->N_RB_DL) {
|
||||
|
||||
case 100:
|
||||
if (fp->threequarter_fs) UE->N_TA_offset = (624*3)/4;
|
||||
else UE->N_TA_offset = 624;
|
||||
break;
|
||||
case 75:
|
||||
UE->N_TA_offset = (624*3)/4;
|
||||
break;
|
||||
case 50:
|
||||
UE->N_TA_offset = 624/2;
|
||||
break;
|
||||
case 25:
|
||||
UE->N_TA_offset = 624/4;
|
||||
break;
|
||||
case 15:
|
||||
UE->N_TA_offset = 624/8;
|
||||
break;
|
||||
case 6:
|
||||
UE->N_TA_offset = 624/16;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0,"illegal N_RB_DL %d\n",fp->N_RB_DL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else UE->N_TA_offset = 0;
|
||||
|
||||
if (simL1flag == 1) init_ue_devices(UE);
|
||||
LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
|
||||
@@ -319,7 +345,7 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
|
||||
}
|
||||
UE->rfdevice.host_type = RAU_HOST;
|
||||
// UE->rfdevice.type = NONE_DEV;
|
||||
PHY_VARS_UE *UE = PHY_vars_UE_g[inst][0];
|
||||
|
||||
AssertFatal(0 == pthread_create(&UE->proc.pthread_ue,
|
||||
&UE->proc.attr_ue,
|
||||
UE_thread,
|
||||
@@ -329,7 +355,7 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
|
||||
printf("UE threads created by %ld\n", gettid());
|
||||
}
|
||||
|
||||
// Panos: Initiating all UEs within a single set of threads for PHY_STUB. Future extensions -> multiple
|
||||
// Initiating all UEs within a single set of threads for PHY_STUB. Future extensions -> multiple
|
||||
// set of threads for multiple UEs.
|
||||
void init_UE_stub_single_thread(int nb_inst,int eMBMS_active, int uecap_xer_in, char *emul_iface) {
|
||||
|
||||
@@ -409,7 +435,7 @@ void init_UE_stub(int nb_inst,int eMBMS_active, int uecap_xer_in, char *emul_ifa
|
||||
static void *UE_thread_synch(void *arg)
|
||||
{
|
||||
static int UE_thread_synch_retval;
|
||||
int i, hw_slot_offset;
|
||||
int i ;
|
||||
PHY_VARS_UE *UE = (PHY_VARS_UE*) arg;
|
||||
int current_band = 0;
|
||||
int current_offset = 0;
|
||||
@@ -547,9 +573,8 @@ static void *UE_thread_synch(void *arg)
|
||||
#endif
|
||||
if (initial_sync( UE, UE->mode ) == 0) {
|
||||
|
||||
hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_tti;
|
||||
LOG_I( HW, "Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n",
|
||||
hw_slot_offset,
|
||||
(UE->rx_offset<<1) / UE->frame_parms.samples_per_tti,
|
||||
freq_offset,
|
||||
UE->rx_total_gain_dB,
|
||||
downlink_frequency[0][0]+freq_offset,
|
||||
@@ -712,13 +737,23 @@ static void *UE_thread_synch(void *arg)
|
||||
* \param arg is a pointer to a \ref PHY_VARS_UE structure.
|
||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||
*/
|
||||
const char * get_connectionloss_errstr(int errcode) {
|
||||
switch (errcode) {
|
||||
case CONNECTION_LOST:
|
||||
return "RRC Connection lost, returning to PRACH";
|
||||
case PHY_RESYNCH:
|
||||
return "RRC Connection lost, trying to resynch";
|
||||
case RESYNCH:
|
||||
return "return to PRACH and perform a contention-free access";
|
||||
};
|
||||
return "UNKNOWN RETURN CODE";
|
||||
}
|
||||
|
||||
static void *UE_thread_rxn_txnp4(void *arg) {
|
||||
static __thread int UE_thread_rxtx_retval;
|
||||
struct rx_tx_thread_data *rtd = arg;
|
||||
UE_rxtx_proc_t *proc = rtd->proc;
|
||||
PHY_VARS_UE *UE = rtd->UE;
|
||||
int ret;
|
||||
|
||||
proc->instance_cnt_rxtx=-1;
|
||||
proc->subframe_rx=proc->sub_frame_start;
|
||||
@@ -791,7 +826,7 @@ static void *UE_thread_rxn_txnp4(void *arg) {
|
||||
#endif
|
||||
if (UE->mac_enabled==1) {
|
||||
|
||||
ret = ue_scheduler(UE->Mod_id,
|
||||
int ret = ue_scheduler(UE->Mod_id,
|
||||
proc->frame_rx,
|
||||
proc->subframe_rx,
|
||||
proc->frame_tx,
|
||||
@@ -800,22 +835,8 @@ static void *UE_thread_rxn_txnp4(void *arg) {
|
||||
0,
|
||||
0/*FIXME CC_id*/);
|
||||
if ( ret != CONNECTION_OK) {
|
||||
char *txt;
|
||||
switch (ret) {
|
||||
case CONNECTION_LOST:
|
||||
txt="RRC Connection lost, returning to PRACH";
|
||||
break;
|
||||
case PHY_RESYNCH:
|
||||
txt="RRC Connection lost, trying to resynch";
|
||||
break;
|
||||
case RESYNCH:
|
||||
txt="return to PRACH and perform a contention-free access";
|
||||
break;
|
||||
default:
|
||||
txt="UNKNOWN RETURN CODE";
|
||||
};
|
||||
LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u %s\n",
|
||||
UE->Mod_id, proc->frame_rx, proc->subframe_tx,txt );
|
||||
UE->Mod_id, proc->frame_rx, proc->subframe_tx,get_connectionloss_errstr(ret) );
|
||||
}
|
||||
}
|
||||
#if UE_TIMING_TRACE
|
||||
@@ -947,12 +968,7 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg) {
|
||||
|
||||
PHY_VARS_UE *UE; //= rtd->UE;
|
||||
int ret;
|
||||
// double t_diff;
|
||||
|
||||
char threadname[256];
|
||||
//sprintf(threadname,"UE_%d_proc", UE->Mod_id);
|
||||
|
||||
//proc->instance_cnt_rxtx=-1;
|
||||
|
||||
phy_stub_ticking->ticking_var = -1;
|
||||
proc->subframe_rx=proc->sub_frame_start;
|
||||
@@ -978,8 +994,6 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg) {
|
||||
LOG_E( MAC, "[SCHED][UE] error unlocking mutex for UE RXn_TXnp4\n" );
|
||||
exit_fun("nothing to add");
|
||||
}
|
||||
LOG_D(MAC," Panos-D [UE_phy_stub_thread_rxn_txnp4 1] Frame: %d, Subframe: %d \n" "\n" "\n", timer_frame, timer_subframe);
|
||||
|
||||
|
||||
proc->subframe_rx=timer_subframe;
|
||||
proc->frame_rx = timer_frame;
|
||||
@@ -990,14 +1004,14 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg) {
|
||||
|
||||
oai_subframe_ind(timer_frame, timer_subframe);
|
||||
|
||||
// Panos: Guessing that the next 4 lines are not needed for the phy_stub mode.
|
||||
//Guessing that the next 4 lines are not needed for the phy_stub mode.
|
||||
/*initRefTimes(t2);
|
||||
initRefTimes(t3);
|
||||
pickTime(current);
|
||||
updateTimes(proc->gotIQs, &t2, 10000, "Delay to wake up UE_Thread_Rx (case 2)");*/
|
||||
|
||||
|
||||
//Panos: Not sure whether we should put the memory allocation here and not sure how much memory
|
||||
// Not sure whether we should put the memory allocation here and not sure how much memory
|
||||
//we should allocate for each subframe cycle.
|
||||
UL_INFO = (UL_IND_t*)malloc(sizeof(UL_IND_t));
|
||||
|
||||
@@ -1026,15 +1040,13 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg) {
|
||||
(sf_type == SF_S)) {
|
||||
|
||||
if (UE->frame_parms.frame_type == TDD) {
|
||||
LOG_D(PHY, "%s,TDD%d,%s: calling UE_RX\n",
|
||||
threadname,
|
||||
LOG_D(PHY, "TDD%d,%s: calling UE_RX\n",
|
||||
UE->frame_parms.tdd_config,
|
||||
(sf_type==SF_DL? "SF_DL" :
|
||||
(sf_type==SF_UL? "SF_UL" :
|
||||
(sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE"))));
|
||||
} else {
|
||||
LOG_D(PHY, "%s,%s,%s: calling UE_RX\n",
|
||||
threadname,
|
||||
LOG_D(PHY, "%s,%s: calling UE_RX\n",
|
||||
(UE->frame_parms.frame_type==FDD? "FDD":
|
||||
(UE->frame_parms.frame_type==TDD? "TDD":"UNKNOWN_DUPLEX_MODE")),
|
||||
(sf_type==SF_DL? "SF_DL" :
|
||||
@@ -1075,22 +1087,8 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg) {
|
||||
0,
|
||||
0/*FIXME CC_id*/);
|
||||
if ( ret != CONNECTION_OK) {
|
||||
char *txt;
|
||||
switch (ret) {
|
||||
case CONNECTION_LOST:
|
||||
txt="RRC Connection lost, returning to PRACH";
|
||||
break;
|
||||
case PHY_RESYNCH:
|
||||
txt="RRC Connection lost, trying to resynch";
|
||||
break;
|
||||
case RESYNCH:
|
||||
txt="return to PRACH and perform a contention-free access";
|
||||
break;
|
||||
default:
|
||||
txt="UNKNOWN RETURN CODE";
|
||||
};
|
||||
LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u %s\n",
|
||||
UE->Mod_id, proc->frame_rx, proc->subframe_tx,txt );
|
||||
UE->Mod_id, proc->frame_rx, proc->subframe_tx,get_connectionloss_errstr(ret) );
|
||||
}
|
||||
}
|
||||
#if UE_TIMING_TRACE
|
||||
@@ -1129,7 +1127,7 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg) {
|
||||
//ue_prach_procedures(ue,proc,eNB_id,abstraction_flag,mode);
|
||||
}
|
||||
} // mode is PRACH
|
||||
// Panos: Substitute call to phy_procedures Tx with call to phy_stub functions in order to trigger
|
||||
// Substitute call to phy_procedures Tx with call to phy_stub functions in order to trigger
|
||||
// UE Tx procedures directly at the MAC layer, based on the received ul_config requests from the vnf (eNB).
|
||||
// Generate UL_indications which correspond to UL traffic.
|
||||
if(ul_config_req!=NULL){ //&& UE_mac_inst[Mod_id].ul_config_req->ul_config_request_body.ul_config_pdu_list != NULL){
|
||||
@@ -1257,19 +1255,11 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
||||
struct rx_tx_thread_data *rtd = arg;
|
||||
UE_rxtx_proc_t *proc = rtd->proc;
|
||||
PHY_VARS_UE *UE = rtd->UE;
|
||||
int ret;
|
||||
// double t_diff;
|
||||
|
||||
char threadname[256];
|
||||
sprintf(threadname,"UE_%d_proc", UE->Mod_id);
|
||||
|
||||
|
||||
//proc->instance_cnt_rxtx=-1;
|
||||
|
||||
phy_stub_ticking->ticking_var = -1;
|
||||
proc->subframe_rx=proc->sub_frame_start;
|
||||
|
||||
//PANOS: CAREFUL HERE!
|
||||
// CAREFUL HERE!
|
||||
wait_sync("UE_phy_stub_thread_rxn_txnp4");
|
||||
|
||||
while (!oai_exit) {
|
||||
@@ -1289,8 +1279,6 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
||||
LOG_E( MAC, "[SCHED][UE] error unlocking mutex for UE RXn_TXnp4\n" );
|
||||
exit_fun("nothing to add");
|
||||
}
|
||||
LOG_D(MAC," Panos-D [UE_phy_stub_thread_rxn_txnp4 1] Frame: %d, Subframe: %d \n" "\n" "\n", timer_frame, timer_subframe);
|
||||
|
||||
|
||||
proc->subframe_rx=timer_subframe;
|
||||
proc->frame_rx = timer_frame;
|
||||
@@ -1305,15 +1293,13 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
||||
(sf_type == SF_S)) {
|
||||
|
||||
if (UE->frame_parms.frame_type == TDD) {
|
||||
LOG_D(PHY, "%s,TDD%d,%s: calling UE_RX\n",
|
||||
threadname,
|
||||
LOG_D(PHY, "TDD%d,%s: calling UE_RX\n",
|
||||
UE->frame_parms.tdd_config,
|
||||
(sf_type==SF_DL? "SF_DL" :
|
||||
(sf_type==SF_UL? "SF_UL" :
|
||||
(sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE"))));
|
||||
} else {
|
||||
LOG_D(PHY, "%s,%s,%s: calling UE_RX\n",
|
||||
threadname,
|
||||
LOG_D(PHY, "%s,%s: calling UE_RX\n",
|
||||
(UE->frame_parms.frame_type==FDD? "FDD":
|
||||
(UE->frame_parms.frame_type==TDD? "TDD":"UNKNOWN_DUPLEX_MODE")),
|
||||
(sf_type==SF_DL? "SF_DL" :
|
||||
@@ -1333,7 +1319,6 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
||||
}
|
||||
//if(UE_mac_inst[Mod_id].hi_dci0_req!= NULL){
|
||||
if (hi_dci0_req!=NULL && hi_dci0_req->hi_dci0_request_body.hi_dci0_pdu_list!=NULL){
|
||||
LOG_I( MAC, "Panos-D: UE_phy_stub_thread_rxn_txnp4 after oai_subframe_ind 4 \n");
|
||||
hi_dci0_req_UE_MAC(hi_dci0_req, Mod_id);
|
||||
//if(UE_mac_inst[Mod_id].hi_dci0_req->hi_dci0_request_body.hi_dci0_pdu_list!=NULL){
|
||||
free(hi_dci0_req->hi_dci0_request_body.hi_dci0_pdu_list);
|
||||
@@ -1358,7 +1343,7 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
||||
#endif
|
||||
if (UE->mac_enabled==1) {
|
||||
|
||||
ret = ue_scheduler(UE->Mod_id,
|
||||
int ret = ue_scheduler(UE->Mod_id,
|
||||
proc->frame_rx,
|
||||
proc->subframe_rx,
|
||||
proc->frame_tx,
|
||||
@@ -1366,24 +1351,9 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
||||
subframe_select(&UE->frame_parms,proc->subframe_tx),
|
||||
0,
|
||||
0);
|
||||
if ( ret != CONNECTION_OK) {
|
||||
char *txt;
|
||||
switch (ret) {
|
||||
case CONNECTION_LOST:
|
||||
txt="RRC Connection lost, returning to PRACH";
|
||||
break;
|
||||
case PHY_RESYNCH:
|
||||
txt="RRC Connection lost, trying to resynch";
|
||||
break;
|
||||
case RESYNCH:
|
||||
txt="return to PRACH and perform a contention-free access";
|
||||
break;
|
||||
default:
|
||||
txt="UNKNOWN RETURN CODE";
|
||||
};
|
||||
if (ret != CONNECTION_OK)
|
||||
LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u %s\n",
|
||||
UE->Mod_id, proc->frame_rx, proc->subframe_tx,txt );
|
||||
}
|
||||
UE->Mod_id, proc->frame_rx, proc->subframe_tx,get_connectionloss_errstr(ret) );
|
||||
}
|
||||
#if UE_TIMING_TRACE
|
||||
stop_meas(&UE->generic_stat);
|
||||
@@ -1397,7 +1367,6 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
||||
if (UE->mode != loop_through_memory){
|
||||
|
||||
if ((UE_mac_inst[Mod_id].UE_mode[0] == PRACH) ) {
|
||||
//LOG_D(MAC, "Panos-D: UE_phy_stub_thread_rxn_txnp4 before RACH \n");
|
||||
|
||||
// check if we have PRACH opportunity
|
||||
|
||||
@@ -1412,7 +1381,7 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
||||
//ue_prach_procedures(ue,proc,eNB_id,abstraction_flag,mode);
|
||||
}
|
||||
} // mode is PRACH
|
||||
// Panos: Substitute call to phy_procedures Tx with call to phy_stub functions in order to trigger
|
||||
// Substitute call to phy_procedures Tx with call to phy_stub functions in order to trigger
|
||||
// UE Tx procedures directly at the MAC layer, based on the received ul_config requests from the vnf (eNB).
|
||||
// Generate UL_indications which correspond to UL traffic.
|
||||
if(ul_config_req!= NULL && ul_config_req->ul_config_request_body.ul_config_pdu_list != NULL){
|
||||
@@ -1805,12 +1774,12 @@ void init_UE_single_thread_stub(int nb_inst) {
|
||||
pthread_attr_init (&UE->proc.attr_ue);
|
||||
pthread_attr_setstacksize(&UE->proc.attr_ue,8192);//5*PTHREAD_STACK_MIN);
|
||||
|
||||
// Panos: Don't need synch for phy_stub mode
|
||||
// Don't need synch for phy_stub mode
|
||||
//pthread_mutex_init(&UE->proc.mutex_synch,NULL);
|
||||
//pthread_cond_init(&UE->proc.cond_synch,NULL);
|
||||
|
||||
// the threads are not yet active, therefore access is allowed without locking
|
||||
// Panos: In phy_stub_UE mode due to less heavy processing operations we don't need two threads
|
||||
// In phy_stub_UE mode due to less heavy processing operations we don't need two threads
|
||||
//int nb_threads=RX_NB_TH;
|
||||
int nb_threads=1;
|
||||
for (int i=0; i<nb_threads; i++) {
|
||||
@@ -1827,7 +1796,7 @@ void init_UE_single_thread_stub(int nb_inst) {
|
||||
pthread_create(&UE->proc.proc_rxtx[i].pthread_rxtx, NULL, UE_phy_stub_single_thread_rxn_txnp4, rtd);
|
||||
|
||||
}
|
||||
// Panos: Remove thread for UE_sync in phy_stub_UE mode.
|
||||
// Remove thread for UE_sync in phy_stub_UE mode.
|
||||
//pthread_create(&UE->proc.pthread_synch,NULL,UE_thread_synch,(void*)UE);
|
||||
}
|
||||
|
||||
@@ -1857,12 +1826,12 @@ void init_UE_threads_stub(int inst) {
|
||||
pthread_attr_init (&UE->proc.attr_ue);
|
||||
pthread_attr_setstacksize(&UE->proc.attr_ue,8192);//5*PTHREAD_STACK_MIN);
|
||||
|
||||
// Panos: Don't need synch for phy_stub mode
|
||||
// Don't need synch for phy_stub mode
|
||||
//pthread_mutex_init(&UE->proc.mutex_synch,NULL);
|
||||
//pthread_cond_init(&UE->proc.cond_synch,NULL);
|
||||
|
||||
// the threads are not yet active, therefore access is allowed without locking
|
||||
// Panos: In phy_stub_UE mode due to less heavy processing operations we don't need two threads
|
||||
// In phy_stub_UE mode due to less heavy processing operations we don't need two threads
|
||||
//int nb_threads=RX_NB_TH;
|
||||
int nb_threads=1;
|
||||
for (int i=0; i<nb_threads; i++) {
|
||||
@@ -1880,7 +1849,7 @@ void init_UE_threads_stub(int inst) {
|
||||
|
||||
|
||||
}
|
||||
// Panos: Remove thread for UE_sync in phy_stub_UE mode.
|
||||
// Remove thread for UE_sync in phy_stub_UE mode.
|
||||
//pthread_create(&UE->proc.pthread_synch,NULL,UE_thread_synch,(void*)UE);
|
||||
}
|
||||
|
||||
@@ -1921,10 +1890,8 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg)
|
||||
|
||||
int i, CC_id;
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
openair0_rf_map *rf_map;
|
||||
|
||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
rf_map = &phy_vars_ue[CC_id]->rf_map;
|
||||
|
||||
AssertFatal( phy_vars_ue[CC_id] !=0, "");
|
||||
frame_parms = &(phy_vars_ue[CC_id]->frame_parms);
|
||||
@@ -1935,7 +1902,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg)
|
||||
|
||||
for (i=0; i<frame_parms->nb_antennas_rx; i++) {
|
||||
LOG_I(PHY, "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",
|
||||
CC_id, i, downlink_frequency[CC_id][i], rf_map->card, rf_map->chain+i );
|
||||
CC_id, i, downlink_frequency[CC_id][i], phy_vars_ue[CC_id]->rf_map.card, (phy_vars_ue[CC_id]->rf_map.chain)+i );
|
||||
free( phy_vars_ue[CC_id]->common_vars.rxdata[i] );
|
||||
rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) );
|
||||
phy_vars_ue[CC_id]->common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD
|
||||
@@ -1943,7 +1910,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg)
|
||||
|
||||
for (i=0; i<frame_parms->nb_antennas_tx; i++) {
|
||||
LOG_I(PHY, "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",
|
||||
CC_id, i, downlink_frequency[CC_id][i], rf_map->card, rf_map->chain+i );
|
||||
CC_id, i, downlink_frequency[CC_id][i], phy_vars_ue[CC_id]->rf_map.card, (phy_vars_ue[CC_id]->rf_map.chain)+i );
|
||||
free( phy_vars_ue[CC_id]->common_vars.txdata[i] );
|
||||
txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) );
|
||||
phy_vars_ue[CC_id]->common_vars.txdata[i] = txdata[i];
|
||||
@@ -1960,168 +1927,6 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg)
|
||||
|
||||
|
||||
|
||||
/*static void* timer_thread( void* param ) {
|
||||
thread_top_init("timer_thread",1,870000L,1000000L,1000000L);
|
||||
timer_subframe =9;
|
||||
timer_frame =1023;
|
||||
//phy_stub_ticking = (SF_ticking*)malloc(sizeof(SF_ticking));
|
||||
phy_stub_ticking->ticking_var = -1;
|
||||
PHY_VARS_UE *UE;
|
||||
UE = PHY_vars_UE_g[0][0];
|
||||
double t_diff;
|
||||
int external_timer = 0;
|
||||
|
||||
|
||||
//struct timespec pselect_start;
|
||||
|
||||
|
||||
//struct timespec sf_duration;
|
||||
//sf_duration.tv_sec = 0;
|
||||
//sf_duration.tv_nsec = 1e6;
|
||||
|
||||
|
||||
wait_sync("timer_thread");
|
||||
|
||||
//pthread_mutex_init(&phy_stub_ticking->mutex_ticking,NULL);
|
||||
//pthread_cond_init(&phy_stub_ticking->cond_ticking,NULL);
|
||||
|
||||
// struct timespec start = {0};
|
||||
// struct timespec end = {0};
|
||||
//sleepValue.tv_nsec = 1000000;
|
||||
opp_enabled = 1;
|
||||
|
||||
// first check if we are receiving timing indications
|
||||
if(nfapi_mode==4) {
|
||||
usleep(10000);
|
||||
if (UE->instance_cnt_timer > 0) {
|
||||
external_timer = 1;
|
||||
int absSFm1 = ((emulator_absSF+10239)%10240);
|
||||
timer_frame = absSFm1/10;
|
||||
timer_subframe = absSFm1%10;
|
||||
pthread_mutex_lock(&UE->timer_mutex);
|
||||
UE->instance_cnt_timer = -1;
|
||||
pthread_mutex_unlock(&UE->timer_mutex);
|
||||
LOG_I(PHY,"Running with external timer\n");
|
||||
}
|
||||
else LOG_I(PHY,"Running with internal timer\n");
|
||||
}
|
||||
|
||||
struct timespec t_start;
|
||||
struct timespec t_now;
|
||||
struct timespec t_sleep;
|
||||
uint64_t T_0;
|
||||
uint64_t T_now;
|
||||
uint64_t T_next_SF;
|
||||
uint64_t T_sleep;
|
||||
uint64_t sf_cnt = 0; //Total Subframe counter
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &t_start);
|
||||
T_0 = (uint64_t) t_start.tv_sec*1000000000 + t_start.tv_nsec;
|
||||
LOG_I(MAC, "Panos-D: timer_thread(), T_0 value: %" PRId64 "\n", T_0);
|
||||
//printf("%" PRId64 "\n", t);
|
||||
|
||||
while (!oai_exit) {
|
||||
|
||||
// these are local subframe/frame counters to check that we are in synch with the fronthaul timing.
|
||||
// They are set on the first rx/tx in the underly FH routines.
|
||||
if (timer_subframe==9) {
|
||||
timer_subframe=0;
|
||||
timer_frame++;
|
||||
timer_frame&=1023;
|
||||
} else {
|
||||
timer_subframe++;
|
||||
}
|
||||
//printf("[timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe);
|
||||
//LOG_I(MAC," Panos-D [timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe);
|
||||
//AssertFatal( 0 == pthread_cond_signal(&phy_stub_ticking->cond_ticking), "");
|
||||
AssertFatal(pthread_mutex_lock(&phy_stub_ticking->mutex_ticking) ==0,"");
|
||||
phy_stub_ticking->ticking_var++;
|
||||
// This should probably be a call to pthread_cond_broadcast when we introduce support for multiple UEs (threads)
|
||||
if(phy_stub_ticking->ticking_var == 0){
|
||||
//AssertFatal(phy_stub_ticking->ticking_var == 0,"phy_stub_ticking->ticking_var = %d",
|
||||
//phy_stub_ticking->ticking_var);
|
||||
if (pthread_cond_signal(&phy_stub_ticking->cond_ticking) != 0) {
|
||||
//LOG_E( PHY, "[SCHED][UE %d] ERROR pthread_cond_signal for UE RX thread\n", UE->Mod_id);
|
||||
LOG_E( PHY, "timer_thread ERROR pthread_cond_signal for UE_thread\n");
|
||||
exit_fun("nothing to add");
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_I(MAC, "Panos-D: timer_thread() Timing problem! \n");
|
||||
|
||||
AssertFatal(pthread_mutex_unlock(&phy_stub_ticking->mutex_ticking) ==0,"");
|
||||
start_meas(&UE->timer_stats);
|
||||
|
||||
|
||||
//clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); // get initial time-stamp
|
||||
if (external_timer == 0) {
|
||||
sf_cnt++;
|
||||
T_next_SF = T_0 + sf_cnt*1000000;
|
||||
do{
|
||||
clock_gettime(CLOCK_MONOTONIC, &t_now);
|
||||
T_now =(uint64_t) t_now.tv_sec*1000000000 + t_now.tv_nsec;
|
||||
}while(T_now < T_next_SF);
|
||||
//usleep(1000);
|
||||
UE_tport_t pdu;
|
||||
pdu.header.packet_type = TTI_SYNC;
|
||||
pdu.header.absSF = (timer_frame*10)+timer_subframe;
|
||||
if (nfapi_mode!=3){
|
||||
multicast_link_write_sock(0,
|
||||
&pdu,
|
||||
sizeof(UE_tport_header_t));
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
wait_on_condition(&UE->timer_mutex,&UE->timer_cond,&UE->instance_cnt_timer,"timer_thread");
|
||||
release_thread(&UE->timer_mutex,&UE->instance_cnt_timer,"timer_thread");
|
||||
}
|
||||
//clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); // get final time-stamp
|
||||
|
||||
//double t_ns = (double)(end.tv_sec - start.tv_sec) * 1.0e9 +
|
||||
// (double)(end.tv_nsec - start.tv_nsec);
|
||||
//printf("Panos-D: [timer_thread] REAL TIME difference: %f", t_ns);
|
||||
|
||||
|
||||
stop_meas(&UE->timer_stats);
|
||||
t_diff = get_time_meas_us(&UE->timer_stats);
|
||||
|
||||
//printf("Panos-D: Absolute time: %lld, diff: %lld, diff_now: %lld \n",UE->timer_stats.p_time, UE->timer_stats.diff, UE->timer_stats.diff_now);
|
||||
//LOG_I(MAC,"[UE%d] Applying default macMainConfig\n",module_idP);
|
||||
//if (t_diff > 1100)
|
||||
|
||||
|
||||
// LOG_E(MAC," Panos-D Absolute time: %f\n", t_diff);
|
||||
//LOG_E(MAC," Panos-D Absolute time: %f\n", t_diff);
|
||||
|
||||
//printf("Panos-D: Absolute time: %f", t_diff);
|
||||
|
||||
|
||||
stop_meas(&UE->timer_stats);
|
||||
t_diff = get_time_meas_us(&UE->timer_stats);
|
||||
//printf("Panos-D: Absolute time: %lld, diff: %lld, diff_now: %lld \n",UE->timer_stats.p_time, UE->timer_stats.diff, UE->timer_stats.diff_now);
|
||||
//LOG_I(MAC,"[UE%d] Applying default macMainConfig\n",module_idP);
|
||||
//if (t_diff > 1100) LOG_E(MAC," Panos-D Absolute time: %f\n", t_diff);
|
||||
//printf("Panos-D: Absolute time: %f", t_diff);
|
||||
|
||||
//UE->proc.ticking_var++;
|
||||
// pthread_cond_signal() //Send signal to ue_thread()?
|
||||
// We also need to somehow pass the information of SFN/SF
|
||||
}
|
||||
free(phy_stub_ticking);
|
||||
pthread_cond_destroy(&phy_stub_ticking->cond_ticking);
|
||||
pthread_mutex_destroy(&phy_stub_ticking->mutex_ticking);
|
||||
return 0;
|
||||
|
||||
}*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Panos: This timer thread is used only in the phy_stub mode as an independent timer
|
||||
// which will be ticking and provide the SFN/SF values that will be used from the UE threads
|
||||
@@ -2252,151 +2057,6 @@ static void* timer_thread( void* param ) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*static void* timer_thread( void* param ) {
|
||||
thread_top_init("timer_thread",1,870000L,1000000L,1000000L);
|
||||
timer_subframe =9;
|
||||
timer_frame =1023;
|
||||
//phy_stub_ticking = (SF_ticking*)malloc(sizeof(SF_ticking));
|
||||
phy_stub_ticking->ticking_var = -1;
|
||||
PHY_VARS_UE *UE;
|
||||
UE = PHY_vars_UE_g[0][0];
|
||||
double t_diff;
|
||||
int external_timer = 0;
|
||||
|
||||
wait_sync("timer_thread");
|
||||
|
||||
//pthread_mutex_init(&phy_stub_ticking->mutex_ticking,NULL);
|
||||
//pthread_cond_init(&phy_stub_ticking->cond_ticking,NULL);
|
||||
|
||||
// struct timespec start = {0};
|
||||
// struct timespec end = {0};
|
||||
//sleepValue.tv_nsec = 1000000;
|
||||
opp_enabled = 1;
|
||||
|
||||
// first check if we are receiving timing indications
|
||||
if(nfapi_mode==4) {
|
||||
usleep(10000);
|
||||
if (UE->instance_cnt_timer > 0) {
|
||||
external_timer = 1;
|
||||
int absSFm1 = ((emulator_absSF+10239)%10240);
|
||||
timer_frame = absSFm1/10;
|
||||
timer_subframe = absSFm1%10;
|
||||
pthread_mutex_lock(&UE->timer_mutex);
|
||||
UE->instance_cnt_timer = -1;
|
||||
pthread_mutex_unlock(&UE->timer_mutex);
|
||||
LOG_I(PHY,"Running with external timer\n");
|
||||
}
|
||||
else LOG_I(PHY,"Running with internal timer\n");
|
||||
}
|
||||
|
||||
while (!oai_exit) {
|
||||
|
||||
// these are local subframe/frame counters to check that we are in synch with the fronthaul timing.
|
||||
// They are set on the first rx/tx in the underly FH routines.
|
||||
if (timer_subframe==9) {
|
||||
timer_subframe=0;
|
||||
timer_frame++;
|
||||
timer_frame&=1023;
|
||||
} else {
|
||||
timer_subframe++;
|
||||
}
|
||||
//printf("[timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe);
|
||||
//LOG_I(MAC," Panos-D [timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe);
|
||||
//AssertFatal( 0 == pthread_cond_signal(&phy_stub_ticking->cond_ticking), "");
|
||||
AssertFatal(pthread_mutex_lock(&phy_stub_ticking->mutex_ticking) ==0,"");
|
||||
phy_stub_ticking->ticking_var++;
|
||||
// This should probably be a call to pthread_cond_broadcast when we introduce support for multiple UEs (threads)
|
||||
if(phy_stub_ticking->ticking_var == 0){
|
||||
//AssertFatal(phy_stub_ticking->ticking_var == 0,"phy_stub_ticking->ticking_var = %d",
|
||||
// phy_stub_ticking->ticking_var);
|
||||
if (pthread_cond_signal(&phy_stub_ticking->cond_ticking) != 0) {
|
||||
//LOG_E( PHY, "[SCHED][UE %d] ERROR pthread_cond_signal for UE RX thread\n", UE->Mod_id);
|
||||
LOG_E( PHY, "timer_thread ERROR pthread_cond_signal for UE_thread\n");
|
||||
exit_fun("nothing to add");
|
||||
}
|
||||
}
|
||||
|
||||
AssertFatal(pthread_mutex_unlock(&phy_stub_ticking->mutex_ticking) ==0,"");
|
||||
start_meas(&UE->timer_stats);
|
||||
|
||||
|
||||
//clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); // get initial time-stamp
|
||||
if (external_timer == 0) {
|
||||
usleep(1000);
|
||||
UE_tport_t pdu;
|
||||
pdu.header.packet_type = TTI_SYNC;
|
||||
pdu.header.absSF = (timer_frame*10)+timer_subframe;
|
||||
multicast_link_write_sock(0,
|
||||
&pdu,
|
||||
sizeof(UE_tport_header_t));
|
||||
|
||||
}
|
||||
else {
|
||||
wait_on_condition(&UE->timer_mutex,&UE->timer_cond,&UE->instance_cnt_timer,"timer_thread");
|
||||
release_thread(&UE->timer_mutex,&UE->instance_cnt_timer,"timer_thread");
|
||||
}
|
||||
//clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); // get final time-stamp
|
||||
|
||||
//double t_ns = (double)(end.tv_sec - start.tv_sec) * 1.0e9 +
|
||||
// (double)(end.tv_nsec - start.tv_nsec);
|
||||
//printf("Panos-D: [timer_thread] REAL TIME difference: %f", t_ns);
|
||||
|
||||
|
||||
stop_meas(&UE->timer_stats);
|
||||
t_diff = get_time_meas_us(&UE->timer_stats);
|
||||
|
||||
//printf("Panos-D: Absolute time: %lld, diff: %lld, diff_now: %lld \n",UE->timer_stats.p_time, UE->timer_stats.diff, UE->timer_stats.diff_now);
|
||||
//LOG_I(MAC,"[UE%d] Applying default macMainConfig\n",module_idP);
|
||||
//if (t_diff > 1100)
|
||||
|
||||
|
||||
// LOG_E(MAC," Panos-D Absolute time: %f\n", t_diff);
|
||||
//LOG_E(MAC," Panos-D Absolute time: %f\n", t_diff);
|
||||
|
||||
//printf("Panos-D: Absolute time: %f", t_diff);
|
||||
|
||||
|
||||
stop_meas(&UE->timer_stats);
|
||||
t_diff = get_time_meas_us(&UE->timer_stats);
|
||||
//printf("Panos-D: Absolute time: %lld, diff: %lld, diff_now: %lld \n",UE->timer_stats.p_time, UE->timer_stats.diff, UE->timer_stats.diff_now);
|
||||
//LOG_I(MAC,"[UE%d] Applying default macMainConfig\n",module_idP);
|
||||
//if (t_diff > 1100) LOG_E(MAC," Panos-D Absolute time: %f\n", t_diff);
|
||||
//printf("Panos-D: Absolute time: %f", t_diff);
|
||||
|
||||
//UE->proc.ticking_var++;
|
||||
// pthread_cond_signal() //Send signal to ue_thread()?
|
||||
// We also need to somehow pass the information of SFN/SF
|
||||
}
|
||||
free(phy_stub_ticking);
|
||||
pthread_cond_destroy(&phy_stub_ticking->cond_ticking);
|
||||
pthread_mutex_destroy(&phy_stub_ticking->mutex_ticking);
|
||||
return 0;
|
||||
|
||||
}*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int init_timer_thread(void) {
|
||||
//PHY_VARS_UE *UE=PHY_vars_UE_g[0];
|
||||
PHY_VARS_UE *UE=PHY_vars_UE_g[0][0];
|
||||
|
||||
@@ -70,11 +70,11 @@
|
||||
#include "RRC/LTE/rrc_vars.h"
|
||||
#include "PHY_INTERFACE/phy_interface_vars.h"
|
||||
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "UTIL/OTG/otg_tx.h"
|
||||
#include "UTIL/OTG/otg_externs.h"
|
||||
#include "UTIL/MATH/oml.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
#include "enb_config.h"
|
||||
//#include "PHY/TOOLS/time_meas.h"
|
||||
@@ -149,10 +149,6 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||
|
||||
|
||||
|
||||
#if defined(ENABLE_ITTI)
|
||||
static char *itti_dump_file = NULL;
|
||||
#endif
|
||||
|
||||
int UE_scan = 1;
|
||||
int UE_scan_carrier = 0;
|
||||
int simL1flag = 0;
|
||||
@@ -331,6 +327,7 @@ void exit_fun(const char* s)
|
||||
{
|
||||
int CC_id;
|
||||
|
||||
logClean();
|
||||
if (s != NULL) {
|
||||
printf("%s %s() Exiting OAI softmodem: %s\n",__FILE__, __FUNCTION__, s);
|
||||
}
|
||||
@@ -338,8 +335,11 @@ void exit_fun(const char* s)
|
||||
oai_exit = 1;
|
||||
|
||||
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
if (PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func)
|
||||
PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][CC_id]->rfdevice);
|
||||
if (PHY_vars_UE_g)
|
||||
if (PHY_vars_UE_g[0])
|
||||
if (PHY_vars_UE_g[0][CC_id])
|
||||
if (PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func)
|
||||
PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][CC_id]->rfdevice);
|
||||
}
|
||||
|
||||
#if defined(ENABLE_ITTI)
|
||||
@@ -476,13 +476,14 @@ static void get_options(void) {
|
||||
char *loopfile=NULL;
|
||||
int dumpframe;
|
||||
uint32_t online_log_messages;
|
||||
uint32_t glog_level, glog_verbosity;
|
||||
uint32_t glog_level;
|
||||
uint32_t start_telnetsrv;
|
||||
|
||||
paramdef_t cmdline_params[] =CMDLINE_PARAMS_DESC ;
|
||||
paramdef_t cmdline_logparams[] =CMDLINE_LOGPARAMS_DESC ;
|
||||
|
||||
set_default_frame_parms(frame_parms);
|
||||
CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
|
||||
config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
|
||||
|
||||
if (strlen(in_path) > 0) {
|
||||
@@ -501,10 +502,7 @@ static void get_options(void) {
|
||||
set_glog_onlinelog(online_log_messages);
|
||||
}
|
||||
if(config_isparamset(cmdline_logparams,CMDLINE_GLOGLEVEL_IDX)) {
|
||||
set_glog(glog_level, -1);
|
||||
}
|
||||
if(config_isparamset(cmdline_logparams,CMDLINE_GLOGVERBO_IDX)) {
|
||||
set_glog(-1, glog_verbosity);
|
||||
set_glog(glog_level);
|
||||
}
|
||||
if (start_telnetsrv) {
|
||||
load_module_shlib("telnetsrv",NULL,0);
|
||||
@@ -515,6 +513,7 @@ static void get_options(void) {
|
||||
|
||||
|
||||
config_process_cmdline( cmdline_uemodeparams,sizeof(cmdline_uemodeparams)/sizeof(paramdef_t),NULL);
|
||||
CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
|
||||
config_process_cmdline( cmdline_ueparams,sizeof(cmdline_ueparams)/sizeof(paramdef_t),NULL);
|
||||
if (loopfile != NULL) {
|
||||
printf("Input file for hardware emulation: %s",loopfile);
|
||||
@@ -575,10 +574,6 @@ static void get_options(void) {
|
||||
tx_gain[0][CC_id] = tx_gain[0][0];
|
||||
}
|
||||
|
||||
#if T_TRACER
|
||||
paramdef_t cmdline_ttraceparams[] =CMDLINE_TTRACEPARAMS_DESC ;
|
||||
config_process_cmdline( cmdline_ttraceparams,sizeof(cmdline_ttraceparams)/sizeof(paramdef_t),NULL);
|
||||
#endif
|
||||
/*
|
||||
if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) && (!(CONFIG_ISFLAGSET(CONFIG_NOOOPT))) ) {
|
||||
// Here the configuration file is the XER encoded UE capabilities
|
||||
@@ -591,14 +586,6 @@ static void get_options(void) {
|
||||
}
|
||||
|
||||
|
||||
#if T_TRACER
|
||||
int T_nowait = 0; /* by default we wait for the tracer */
|
||||
int T_port = 2021; /* default port to listen to to wait for the tracer */
|
||||
int T_dont_fork = 0; /* default is to fork, see 'T_init' to understand */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
|
||||
|
||||
int CC_id;
|
||||
@@ -797,10 +784,6 @@ int main( int argc, char **argv )
|
||||
exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
|
||||
}
|
||||
|
||||
#ifdef DEBUG_CONSOLE
|
||||
setvbuf(stdout, NULL, _IONBF, 0);
|
||||
setvbuf(stderr, NULL, _IONBF, 0);
|
||||
#endif
|
||||
|
||||
|
||||
mode = normal_txrx;
|
||||
@@ -825,7 +808,7 @@ int main( int argc, char **argv )
|
||||
|
||||
printf("NFAPI_MODE value: %d \n", nfapi_mode);
|
||||
|
||||
// Panos: Not sure if the following is needed here
|
||||
// Not sure if the following is needed here
|
||||
/*if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
|
||||
if (UE_flag == 0) {
|
||||
fprintf(stderr,"Getting configuration failed\n");
|
||||
@@ -839,7 +822,7 @@ int main( int argc, char **argv )
|
||||
|
||||
|
||||
#if T_TRACER
|
||||
T_init(T_port, 1-T_nowait, T_dont_fork);
|
||||
T_Config_Init();
|
||||
#endif
|
||||
|
||||
|
||||
@@ -848,37 +831,31 @@ int main( int argc, char **argv )
|
||||
set_taus_seed (0);
|
||||
|
||||
|
||||
set_comp_log(HW, LOG_DEBUG, LOG_HIGH, 1);
|
||||
set_comp_log(PHY, LOG_INFO, LOG_HIGH, 1);
|
||||
set_comp_log(MAC, LOG_INFO, LOG_HIGH, 1);
|
||||
set_comp_log(RLC, LOG_INFO, LOG_HIGH | FLAG_THREAD, 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);
|
||||
set_log(HW, OAILOG_DEBUG, 1);
|
||||
set_log(PHY, OAILOG_INFO, 1);
|
||||
set_log(MAC, OAILOG_INFO, 1);
|
||||
set_log(RLC, OAILOG_INFO, 1);
|
||||
set_log(PDCP, OAILOG_INFO, 1);
|
||||
set_log(OTG, OAILOG_INFO, 1);
|
||||
set_log(RRC, OAILOG_INFO, 1);
|
||||
#if defined(ENABLE_ITTI)
|
||||
set_comp_log(SIM, LOG_INFO, LOG_MED, 1);
|
||||
set_log(SIM, OAILOG_INFO, 1);
|
||||
# if defined(ENABLE_USE_MME)
|
||||
set_comp_log(NAS, LOG_INFO, LOG_HIGH, 1);
|
||||
set_log(NAS, OAILOG_INFO, 1);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
if (ouput_vcd) {
|
||||
VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_UE.vcd");
|
||||
}
|
||||
|
||||
cpuf=get_cpu_freq_GHz();
|
||||
|
||||
#if defined(ENABLE_ITTI)
|
||||
|
||||
log_set_instance_type (LOG_INSTANCE_UE);
|
||||
|
||||
pthread_cond_init(&sync_cond,NULL);
|
||||
pthread_mutex_init(&sync_mutex, NULL);
|
||||
|
||||
#if defined(ENABLE_ITTI)
|
||||
|
||||
|
||||
|
||||
printf("ITTI init\n");
|
||||
itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file);
|
||||
itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
|
||||
|
||||
// initialize mscgen log after ITTI
|
||||
MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX);
|
||||
@@ -905,7 +882,7 @@ int main( int argc, char **argv )
|
||||
#endif
|
||||
|
||||
//TTN for D2D
|
||||
#ifdef Rel14
|
||||
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
printf ("RRC control socket\n");
|
||||
rrc_control_socket_init();
|
||||
printf ("PDCP PC5S socket\n");
|
||||
@@ -975,8 +952,7 @@ int main( int argc, char **argv )
|
||||
}
|
||||
else {
|
||||
init_UE(NB_UE_INST,eMBMS_active,uecap_xer_in,0,phy_test,UE_scan,UE_scan_carrier,mode,(int)rx_gain[0][0],tx_max_power[0],
|
||||
frame_parms[0]->nb_antennas_rx,
|
||||
frame_parms[0]->nb_antennas_tx);
|
||||
frame_parms[0]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1045,7 +1021,7 @@ int main( int argc, char **argv )
|
||||
printf("cannot create ITTI tasks\n");
|
||||
exit(-1); // need a softer mode
|
||||
}
|
||||
if(nfapi_mode==3){ //Panos: Here we should add another nfapi_mode for the case of Supervised LTE-D2D
|
||||
if(nfapi_mode==3){ // Here we should add another nfapi_mode for the case of Supervised LTE-D2D
|
||||
UE_config_stub_pnf();
|
||||
}
|
||||
printf("ITTI tasks created\n");
|
||||
@@ -1054,7 +1030,67 @@ int main( int argc, char **argv )
|
||||
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
|
||||
|
||||
|
||||
rt_sleep_ns(10*100000000ULL);
|
||||
|
||||
const char *nfapi_mode_str = "<UNKNOWN>";
|
||||
|
||||
switch(nfapi_mode)
|
||||
{
|
||||
case 0:
|
||||
nfapi_mode_str = "MONOLITHIC";
|
||||
break;
|
||||
case 1:
|
||||
nfapi_mode_str = "PNF";
|
||||
break;
|
||||
case 2:
|
||||
nfapi_mode_str = "VNF";
|
||||
break;
|
||||
case 3:
|
||||
nfapi_mode_str = "UE_STUB_PNF";
|
||||
break;
|
||||
case 4:
|
||||
nfapi_mode_str = "UE_STUB_OFFNET";
|
||||
break;
|
||||
default:
|
||||
nfapi_mode_str = "<UNKNOWN NFAPI MODE>";
|
||||
break;
|
||||
}
|
||||
printf("NFAPI MODE:%s\n", nfapi_mode_str);
|
||||
|
||||
|
||||
// connect the TX/RX buffers
|
||||
|
||||
|
||||
/*
|
||||
if(nfapi_mode!=3) {
|
||||
if (setup_ue_buffers(PHY_vars_UE_g[0],&openair0_cfg[0])!=0) {
|
||||
printf("Error setting up eNB buffer\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
if (input_fd) {
|
||||
printf("Reading in from file to antenna buffer %d\n",0);
|
||||
if (fread(PHY_vars_UE_g[0][0]->common_vars.rxdata[0],
|
||||
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");
|
||||
}
|
||||
//p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
|
||||
|
||||
|
||||
if (simL1flag==1) {
|
||||
init_ocm((double)snr_dB,0);
|
||||
PHY_vars_UE_g[0][0]->no_timing_correction = 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef XFORMS
|
||||
int UE_id;
|
||||
|
||||
@@ -1090,71 +1126,15 @@ int main( int argc, char **argv )
|
||||
|
||||
#endif
|
||||
|
||||
rt_sleep_ns(10*100000000ULL);
|
||||
printf("Sending sync to all threads (%p,%p,%p)\n",&sync_var,&sync_cond,&sync_mutex);
|
||||
|
||||
const char *nfapi_mode_str = "<UNKNOWN>";
|
||||
|
||||
switch(nfapi_mode)
|
||||
{
|
||||
case 0:
|
||||
nfapi_mode_str = "MONOLITHIC";
|
||||
break;
|
||||
case 1:
|
||||
nfapi_mode_str = "PNF";
|
||||
break;
|
||||
case 2:
|
||||
nfapi_mode_str = "VNF";
|
||||
break;
|
||||
case 3:
|
||||
nfapi_mode_str = "UE_STUB_PNF";
|
||||
break;
|
||||
case 4:
|
||||
nfapi_mode_str = "UE_STUB_OFFNET";
|
||||
break;
|
||||
default:
|
||||
nfapi_mode_str = "<UNKNOWN NFAPI MODE>";
|
||||
break;
|
||||
}
|
||||
printf("NFAPI MODE:%s\n", nfapi_mode_str);
|
||||
|
||||
|
||||
|
||||
|
||||
// connect the TX/RX buffers
|
||||
|
||||
|
||||
/*
|
||||
if(nfapi_mode!=3) {
|
||||
if (setup_ue_buffers(PHY_vars_UE_g[0],&openair0_cfg[0])!=0) {
|
||||
printf("Error setting up eNB buffer\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
if (input_fd) {
|
||||
printf("Reading in from file to antenna buffer %d\n",0);
|
||||
if (fread(PHY_vars_UE_g[0][0]->common_vars.rxdata[0],
|
||||
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");
|
||||
}
|
||||
//p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
|
||||
|
||||
if (simL1flag==1) {
|
||||
init_ocm((double)snr_dB,0);
|
||||
PHY_vars_UE_g[0][0]->no_timing_correction = 1;
|
||||
}
|
||||
|
||||
printf("Sending sync to all threads (%p,%p,%p)\n",&sync_var,&sync_mutex,&sync_cond);
|
||||
|
||||
pthread_mutex_lock(&sync_mutex);
|
||||
sync_var=0;
|
||||
pthread_cond_broadcast(&sync_cond);
|
||||
pthread_mutex_unlock(&sync_mutex);
|
||||
|
||||
printf("sync sent\n");
|
||||
/*
|
||||
printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
|
||||
end_configmodule();
|
||||
@@ -1204,9 +1184,6 @@ int main( int argc, char **argv )
|
||||
if (PHY_vars_UE_g[0][0]->rfdevice.trx_end_func)
|
||||
PHY_vars_UE_g[0][0]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][0]->rfdevice);
|
||||
|
||||
if (ouput_vcd)
|
||||
VCD_SIGNAL_DUMPER_CLOSE();
|
||||
|
||||
if (opt_enabled == 1)
|
||||
terminate_opt();
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
#include "common/ran_context.h"
|
||||
#include "PHY/defs_UE.h"
|
||||
#include "PHY/defs_eNB.h"
|
||||
#include "vcd_signal_dumper.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
|
||||
RAN_CONTEXT_t RC;
|
||||
extern PHY_VARS_UE ***PHY_vars_UE_g;
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
#include <getopt.h>
|
||||
#include <sys/sysinfo.h>
|
||||
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "common/utils/LOG/log_extern.h"
|
||||
#include "msc.h"
|
||||
|
||||
#define RTIME long long int
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
#include "UTIL/LOG/log_if.h"
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "RRC/LITE/vars.h"
|
||||
#include "RRC/LTE/vars.h"
|
||||
#include "PHY_INTERFACE/vars.h"
|
||||
#include "UTIL/OCG/OCG.h"
|
||||
#include "UTIL/AT_COMMANDS/parser.h"
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
#include "SCHED/vars.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
#include "RRC/LITE/vars.h"
|
||||
#include "RRC/LTE/vars.h"
|
||||
#include "PHY_INTERFACE/vars.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
#include "OCG_vars.h"
|
||||
|
||||
@@ -248,15 +248,12 @@ BOOL test_pdcp_data_req(void)
|
||||
* XXX mem_block_t doesn't hold buffer size, how do we keep the size
|
||||
* information if we pass mem_block_ts via a linked list?
|
||||
*/
|
||||
#if 0
|
||||
|
||||
if (pdcp_test_pdu_buffer_size == 0 || pdcp_test_pdu_buffer == NULL) {
|
||||
msg("[TEST] PDU created by pdcp_data_req() is invalid!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Serialize incoming mem_block_t into an unsigned character array
|
||||
* and add removed PDU to RX list in order to use it in the next test
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
#include "UTIL/LOG/log_if.h"
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "RRC/LITE/vars.h"
|
||||
#include "RRC/LTE/vars.h"
|
||||
#include "PHY_INTERFACE/vars.h"
|
||||
#include "UTIL/OCG/OCG.h"
|
||||
#include "LAYER2/PDCP_v10.1.0/pdcp.h"
|
||||
@@ -148,7 +148,7 @@ void pdcp_rlc_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct mac_dat
|
||||
data_indP->no_tb += 1;
|
||||
} else {
|
||||
printf("Out of memory error\n");
|
||||
exit(-1);
|
||||
// exit(-1);
|
||||
}
|
||||
} else {
|
||||
printf("[RLC-LOOP] DROPPING 1 TB\n");
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
#include "UTIL/LOG/log_if.h"
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "RRC/LITE/vars.h"
|
||||
#include "RRC/LTE/vars.h"
|
||||
#include "PHY_INTERFACE/vars.h"
|
||||
#include "UTIL/OCG/OCG.h"
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include "LAYER2/MAC/vars.h"
|
||||
#include "UTIL/LOG/log_if.h"
|
||||
#include "UTIL/LOG/log_extern.h"
|
||||
#include "RRC/LITE/vars.h"
|
||||
#include "RRC/LTE/vars.h"
|
||||
#include "PHY_INTERFACE/vars.h"
|
||||
#include "UTIL/OCG/OCG.h"
|
||||
|
||||
|
||||
+193
-191
@@ -23,7 +23,7 @@
|
||||
# brief
|
||||
# author Lionel Gauthier and Navid Nikaein
|
||||
# company Eurecom
|
||||
# email: lionel.gauthier@eurecom.fr and navid.nikaein@eurecom.fr
|
||||
# email: lionel.gauthier@eurecom.fr and navid.nikaein@eurecom.fr
|
||||
#
|
||||
#######################################
|
||||
# Helper Func
|
||||
@@ -42,30 +42,30 @@ declare UBUNTU_REL=`lsb_release -r | cut -f2`
|
||||
declare UBUNTU_REL_NAME=`lsb_release -cs`
|
||||
|
||||
set_build_from_makefile(){
|
||||
BUILD_FROM_MAKEFILE=$1
|
||||
BUILD_FROM_MAKEFILE=$1
|
||||
}
|
||||
|
||||
check_for_root_rights() {
|
||||
|
||||
|
||||
# if [[ $EUID -ne $ROOT_EUID ]]; then
|
||||
if [ $USER != "root" ]; then
|
||||
SUDO="sudo -E "
|
||||
echo "Run as a sudoers"
|
||||
echo "Run as a sudoers"
|
||||
return 1
|
||||
else
|
||||
echo "Run as a root"
|
||||
else
|
||||
echo "Run as a root"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
test_install_package() {
|
||||
# usage: test_install_package package_name
|
||||
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
dpkg -s "$1" > /dev/null 2>&1 && {
|
||||
echo "$1 is installed."
|
||||
echo "$1 is installed."
|
||||
} || {
|
||||
echo "$1 is not installed."
|
||||
echo "$1 is not installed."
|
||||
OAI_INSTALLED=0
|
||||
$SUDO apt-get install -y $@
|
||||
}
|
||||
@@ -73,13 +73,13 @@ test_install_package() {
|
||||
}
|
||||
|
||||
test_uninstall_package() {
|
||||
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
dpkg -s "$1" > /dev/null 2>&1 && {
|
||||
$SUDO apt-get remove --assume-yes $1
|
||||
echo "$1 is uninstalled."
|
||||
$SUDO apt-get remove --assume-yes $1
|
||||
echo "$1 is uninstalled."
|
||||
} || {
|
||||
echo "$1 is not installed."
|
||||
echo "$1 is not installed."
|
||||
}
|
||||
fi
|
||||
}
|
||||
@@ -97,8 +97,8 @@ check_for_machine_type(){
|
||||
else
|
||||
if [ ${MACHINE_TYPE} = "i686" ]; then
|
||||
return 32 # 32-bit stuff here
|
||||
else
|
||||
return -1
|
||||
else
|
||||
return -1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@@ -108,7 +108,7 @@ check_for_machine_type(){
|
||||
#####################################################
|
||||
|
||||
####################################################
|
||||
# 1. install the required packages
|
||||
# 1. install the required packages
|
||||
####################################################
|
||||
|
||||
make_certs(){
|
||||
@@ -118,32 +118,32 @@ make_certs(){
|
||||
mkdir -m 777 -p demoCA
|
||||
echo 01 > demoCA/serial
|
||||
touch demoCA/index.txt
|
||||
|
||||
|
||||
echo "creating the certificate"
|
||||
|
||||
|
||||
user=$(whoami)
|
||||
HOSTNAME=$(hostname -f)
|
||||
|
||||
echo "Creating certificate for user '$HOSTNAME'"
|
||||
|
||||
|
||||
# CA self certificate
|
||||
openssl req -new -batch -x509 -days 3650 -nodes -newkey rsa:1024 -out cacert.pem -keyout cakey.pem -subj /CN=eur/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM
|
||||
|
||||
|
||||
# openssl genrsa -out user.key.pem 1024
|
||||
openssl genrsa -out hss.key.pem 1024
|
||||
#openssl req -new -batch -out user.csr.pem -key user.key.pem -subj /CN=$HOSTNAME.eur/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM
|
||||
openssl req -new -batch -out hss.csr.pem -key hss.key.pem -subj /CN=hss.eur/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM
|
||||
openssl ca -cert cacert.pem -keyfile cakey.pem -in hss.csr.pem -out hss.cert.pem -outdir . -batch
|
||||
|
||||
|
||||
if [ ! -d /usr/local/etc/freeDiameter ]; then
|
||||
echo "Creating non existing directory: /usr/local/etc/freeDiameter/"
|
||||
$SUDO mkdir /usr/local/etc/freeDiameter/
|
||||
fi
|
||||
|
||||
|
||||
echo "Copying *.pem to /usr/local/etc/freeDiameter/"
|
||||
$SUDO cp *.pem /usr/local/etc/freeDiameter/
|
||||
mv *.pem bin/
|
||||
|
||||
|
||||
# openssl genrsa -out ubuntu.key.pem 1024
|
||||
# openssl req -new -batch -x509 -out ubuntu.csr.pem -key ubuntu.key.pem -subj /CN=ubuntu.localdomain/C=FR/ST=BdR/L=Aix/O=fD/OU=Tests
|
||||
# openssl ca -cert cacert.pem -keyfile cakey.pem -in ubuntu.csr.pem -out ubuntu.cert.pem -outdir . -batch
|
||||
@@ -151,25 +151,25 @@ make_certs(){
|
||||
}
|
||||
|
||||
check_install_nettle(){
|
||||
if [ ! -f ./.lock_oaibuild ]; then
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
if [ ! -f ./.lock_oaibuild ]; then
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
test_uninstall_package nettle-dev
|
||||
test_uninstall_package nettle-bin
|
||||
|
||||
|
||||
if [ ! -d /usr/local/src/ ]; then
|
||||
echo "/usr/local/src/ doesn't exist please create one"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
|
||||
if [ ! -w /usr/local/src/ ]; then
|
||||
echo "You don't have permissions to write to /usr/local/src/, installing as a sudoer"
|
||||
# exit -1
|
||||
fi
|
||||
|
||||
|
||||
cd /usr/local/src/
|
||||
|
||||
|
||||
echo "Downloading nettle archive"
|
||||
|
||||
|
||||
if [ -f nettle-2.5.tar.gz ]; then
|
||||
$SUDO rm -f nettle-2.5.tar.gz
|
||||
fi
|
||||
@@ -179,44 +179,44 @@ check_install_nettle(){
|
||||
if [ -d nettle-2.5 ]; then
|
||||
$SUDO rm -rf nettle-2.5/
|
||||
fi
|
||||
|
||||
|
||||
$SUDO wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
|
||||
$SUDO gunzip nettle-2.5.tar.gz
|
||||
|
||||
|
||||
$SUDO wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
|
||||
$SUDO gunzip nettle-2.5.tar.gz
|
||||
$SUDO echo "Uncompressing nettle archive"
|
||||
$SUDO tar -xf nettle-2.5.tar
|
||||
cd nettle-2.5/
|
||||
$SUDO ./configure --disable-openssl --enable-shared --prefix=/usr
|
||||
$SUDO ./configure --disable-openssl --enable-shared --prefix=/usr
|
||||
if [ $? -ne 0 ]; then
|
||||
exit -1
|
||||
fi
|
||||
echo "Compiling nettle"
|
||||
$SUDO make -j $NUM_CPU
|
||||
$SUDO make check
|
||||
$SUDO make install
|
||||
$SUDO make -j $NUM_CPU
|
||||
$SUDO make check
|
||||
$SUDO make install
|
||||
cd ../
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
check_install_freediamter(){
|
||||
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
|
||||
if [ ! -d /usr/local/src/ ]; then
|
||||
echo "/usr/local/src/ doesn't exist please create one"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
|
||||
if [ ! -w /usr/local/src/ ]; then
|
||||
echo "You don't have permissions to write to /usr/local/src/, installing as a sudoer"
|
||||
# exit -1
|
||||
fi
|
||||
|
||||
|
||||
cd /usr/local/src/
|
||||
|
||||
|
||||
echo "Downloading nettle archive"
|
||||
|
||||
|
||||
if [ -f nettle-2.5.tar.gz ]; then
|
||||
$SUDO rm -f nettle-2.5.tar.gz
|
||||
fi
|
||||
@@ -226,36 +226,36 @@ check_install_freediamter(){
|
||||
if [ -d nettle-2.5 ]; then
|
||||
$SUDO rm -rf nettle-2.5/
|
||||
fi
|
||||
|
||||
|
||||
$SUDO wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
|
||||
$SUDO gunzip nettle-2.5.tar.gz
|
||||
|
||||
|
||||
$SUDO wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
|
||||
$SUDO gunzip nettle-2.5.tar.gz
|
||||
$SUDO echo "Uncompressing nettle archive"
|
||||
$SUDO tar -xf nettle-2.5.tar
|
||||
cd nettle-2.5/
|
||||
$SUDO ./configure --disable-openssl --enable-shared --prefix=/usr
|
||||
$SUDO ./configure --disable-openssl --enable-shared --prefix=/usr
|
||||
if [ $? -ne 0 ]; then
|
||||
exit -1
|
||||
fi
|
||||
echo "Compiling nettle"
|
||||
$SUDO make -j $NUM_CPU
|
||||
$SUDO make check
|
||||
$SUDO make install
|
||||
$SUDO make -j $NUM_CPU
|
||||
$SUDO make check
|
||||
$SUDO make install
|
||||
cd ../
|
||||
fi
|
||||
|
||||
|
||||
echo "Downloading gnutls archive"
|
||||
|
||||
|
||||
if [ -f gnutls-3.1.23.tar.xz ]; then
|
||||
$SUDO rm -f gnutls-3.1.23.tar.xz
|
||||
fi
|
||||
if [ -d gnutls-3.1.23/ ]; then
|
||||
$SUDO rm -rf gnutls-3.1.23/
|
||||
fi
|
||||
|
||||
|
||||
test_uninstall_package libgnutls-dev
|
||||
|
||||
$SUDO wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz
|
||||
|
||||
$SUDO wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz
|
||||
$SUDO tar -xf gnutls-3.1.23.tar.xz
|
||||
echo "Uncompressing gnutls archive ($PWD)"
|
||||
cd gnutls-3.1.23/
|
||||
@@ -264,38 +264,38 @@ check_install_freediamter(){
|
||||
exit -1
|
||||
fi
|
||||
echo "Compiling gnutls"
|
||||
$SUDO make -j $NUM_CPU
|
||||
$SUDO make install
|
||||
$SUDO make -j $NUM_CPU
|
||||
$SUDO make install
|
||||
cd ../
|
||||
|
||||
|
||||
echo "Downloading freeDiameter archive"
|
||||
|
||||
|
||||
if [ -f 1.1.5.tar.gz ]; then
|
||||
$SUDO rm -f 1.1.5.tar.gz
|
||||
fi
|
||||
if [ -d freeDiameter-1.1.5/ ]; then
|
||||
$SUDO rm -rf freeDiameter-1.1.5/
|
||||
fi
|
||||
|
||||
$SUDO wget http://www.freediameter.net/hg/freeDiameter/archive/1.1.5.tar.gz
|
||||
$SUDO tar -xzf 1.1.5.tar.gz
|
||||
|
||||
$SUDO wget http://www.freediameter.net/hg/freeDiameter/archive/1.1.5.tar.gz
|
||||
$SUDO tar -xzf 1.1.5.tar.gz
|
||||
echo "Uncompressing freeDiameter archive"
|
||||
cd freeDiameter-1.1.5
|
||||
$SUDO patch -p1 < $OPENAIR3_DIR/S6A/freediameter/freediameter-1.1.5.patch
|
||||
$SUDO patch -p1 < $OPENAIR3_DIR/S6A/freediameter/freediameter-1.1.5.patch
|
||||
$SUDO mkdir build
|
||||
cd build
|
||||
$SUDO cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../
|
||||
$SUDO cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../
|
||||
if [ $? -ne 0 ]; then
|
||||
exit -1
|
||||
fi
|
||||
echo "Compiling freeDiameter"
|
||||
$SUDO make -j $NUM_CPU
|
||||
$SUDO make -j $NUM_CPU
|
||||
#make help
|
||||
$SUDO make test
|
||||
$SUDO sudo make install
|
||||
|
||||
$SUDO make test
|
||||
$SUDO sudo make install
|
||||
|
||||
# make_certs
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -339,7 +339,7 @@ check_hss_s6a_certificate() {
|
||||
then
|
||||
echo_success "HSS S6A: Found valid certificate in /usr/local/etc/freeDiameter"
|
||||
return 0
|
||||
else
|
||||
else
|
||||
echo_error "Bad hss hostname found in cert file: "$full_hostname " hostname is "`hostname`
|
||||
fi
|
||||
fi
|
||||
@@ -357,43 +357,43 @@ check_hss_s6a_certificate() {
|
||||
}
|
||||
|
||||
check_install_usrp_uhd_driver(){
|
||||
if [ ! -f /etc/apt/sources.list.d/ettus.list ] ; then
|
||||
if [ ! -f /etc/apt/sources.list.d/ettus.list ] ; then
|
||||
$SUDO bash -c 'echo "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/`lsb_release -cs` `lsb_release -cs` main" >> /etc/apt/sources.list.d/ettus.list'
|
||||
$SUDO apt-get update
|
||||
fi
|
||||
fi
|
||||
$SUDO apt-get install -t $UBUNTU_REL_NAME uhd
|
||||
test_install_package python
|
||||
test_install_package libboost-all-dev
|
||||
test_install_package python
|
||||
test_install_package libboost-all-dev
|
||||
test_install_package libusb-1.0-0-dev
|
||||
#test_install_package uhd
|
||||
}
|
||||
|
||||
check_install_oai_software() {
|
||||
|
||||
if [ ! -f ./.lock_oaibuild ]; then
|
||||
|
||||
if [ ! -f ./.lock_oaibuild ]; then
|
||||
$SUDO apt-get update
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
test_uninstall_package nettle-dev
|
||||
test_uninstall_package nettle-bin
|
||||
else
|
||||
else
|
||||
test_install_package nettle-dev
|
||||
test_install_package nettle-bin
|
||||
fi
|
||||
test_install_package autoconf
|
||||
test_install_package automake
|
||||
test_install_package bison
|
||||
fi
|
||||
test_install_package autoconf
|
||||
test_install_package automake
|
||||
test_install_package bison
|
||||
test_install_package build-essential
|
||||
test_install_package dialog
|
||||
test_install_package flex
|
||||
test_install_package flex
|
||||
test_install_package gawk
|
||||
test_install_package gcc
|
||||
test_install_package gdb
|
||||
test_install_package gdb
|
||||
test_install_package make
|
||||
test_install_package cmake
|
||||
test_install_package openssh-client
|
||||
test_install_package openssh-server
|
||||
sudo service ssh start
|
||||
test_install_package unzip
|
||||
test_install_package unzip
|
||||
test_install_package autoconf
|
||||
test_install_package automake
|
||||
test_install_package bison
|
||||
@@ -405,7 +405,7 @@ check_install_oai_software() {
|
||||
test_install_package gawk
|
||||
test_install_package gcc
|
||||
test_install_package gccxml
|
||||
test_install_package gdb
|
||||
test_install_package gdb
|
||||
test_install_package guile-2.0-dev
|
||||
test_install_package iperf
|
||||
test_install_package iproute
|
||||
@@ -414,6 +414,8 @@ check_install_oai_software() {
|
||||
test_install_package libatlas-dev
|
||||
test_install_package libblas3gf
|
||||
test_install_package libblas-dev
|
||||
test_install_package liblapack-dev
|
||||
test_install_package liblapack-dev
|
||||
# if [ $MACHINE_ARCH = 64 ]; then
|
||||
test_install_package libconfig8-dev
|
||||
# else
|
||||
@@ -436,7 +438,7 @@ check_install_oai_software() {
|
||||
test_install_package libxml2-dev
|
||||
# test_install_package linux-headers-`uname -r`
|
||||
test_install_package openssl
|
||||
test_install_package libssl-dev
|
||||
test_install_package libssl-dev
|
||||
test_install_package pkg-config
|
||||
test_install_package python-dev
|
||||
test_install_package python-pexpect
|
||||
@@ -445,90 +447,90 @@ check_install_oai_software() {
|
||||
test_install_package valgrind
|
||||
test_install_package doxygen
|
||||
test_install_package graphviz
|
||||
|
||||
|
||||
# test_install_package libboost-all-dev
|
||||
|
||||
if [ $OAI_INSTALLED = 1 ]; then
|
||||
|
||||
if [ $OAI_INSTALLED = 1 ]; then
|
||||
touch ./.lock_oaibuild
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
else
|
||||
echo_info "All the required packages installed: skip"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
check_install_hss_software() {
|
||||
if [ ! -f ./.lock_oaibuild ]; then
|
||||
if [ ! -f ./.lock_oaibuild ]; then
|
||||
$SUDO apt-get update
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
test_uninstall_package nettle-dev
|
||||
test_uninstall_package nettle-bin
|
||||
else
|
||||
else
|
||||
test_install_package nettle-dev
|
||||
test_install_package nettle-bin
|
||||
fi
|
||||
test_install_package autoconf
|
||||
test_install_package automake
|
||||
test_install_package bison
|
||||
fi
|
||||
test_install_package autoconf
|
||||
test_install_package automake
|
||||
test_install_package bison
|
||||
test_install_package build-essential
|
||||
test_install_package cmake
|
||||
test_install_package cmake-curses-gui
|
||||
test_install_package cmake-curses-gui
|
||||
test_install_package dialog
|
||||
test_install_package dkms
|
||||
test_install_package flex
|
||||
test_install_package flex
|
||||
test_install_package gawk
|
||||
test_install_package gcc
|
||||
test_install_package gdb
|
||||
test_install_package guile-2.0-dev
|
||||
test_install_package gdb
|
||||
test_install_package guile-2.0-dev
|
||||
test_install_package g++
|
||||
test_install_package libgmp-dev
|
||||
test_install_package libgcrypt11-dev
|
||||
test_install_package libidn11-dev
|
||||
test_install_package libidn2-0-dev
|
||||
test_install_package libmysqlclient-dev
|
||||
test_install_package libtasn1-3-dev
|
||||
test_install_package libsctp1
|
||||
test_install_package libsctp-dev
|
||||
test_install_package libxml2-dev
|
||||
# test_install_package linux-headers-`uname -r`
|
||||
test_install_package libgmp-dev
|
||||
test_install_package libgcrypt11-dev
|
||||
test_install_package libidn11-dev
|
||||
test_install_package libidn2-0-dev
|
||||
test_install_package libmysqlclient-dev
|
||||
test_install_package libtasn1-3-dev
|
||||
test_install_package libsctp1
|
||||
test_install_package libsctp-dev
|
||||
test_install_package libxml2-dev
|
||||
# test_install_package linux-headers-`uname -r`
|
||||
test_install_package make
|
||||
test_install_package mysql-client
|
||||
test_install_package mysql-server-core-5.5
|
||||
test_install_package mysql-client
|
||||
test_install_package mysql-server-core-5.5
|
||||
test_install_package mysql-server
|
||||
test_install_package openssh-client
|
||||
test_install_package openssh-server
|
||||
sudo service ssh start
|
||||
test_install_package phpmyadmin
|
||||
test_install_package python-dev
|
||||
test_install_package python-dev
|
||||
test_install_package sshfs
|
||||
test_install_package swig
|
||||
test_install_package unzip
|
||||
test_install_package swig
|
||||
test_install_package unzip
|
||||
# test_install_package nettle-bin
|
||||
# test_install_package nettle-dev
|
||||
test_install_package valgrind
|
||||
test_install_package valgrind
|
||||
|
||||
if [ $OAI_INSTALLED = 1 ]; then
|
||||
if [ $OAI_INSTALLED = 1 ]; then
|
||||
touch ./.lock_oaibuild
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
else
|
||||
echo_info "All the required packages installed: skip"
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
check_install_epc_software() {
|
||||
|
||||
if [ ! -f ./.lock_oaibuild ]; then
|
||||
if [ ! -f ./.lock_oaibuild ]; then
|
||||
$SUDO apt-get update
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
if [ $UBUNTU_REL = "12.04" ]; then
|
||||
test_uninstall_package nettle-dev
|
||||
test_uninstall_package nettle-bin
|
||||
else
|
||||
else
|
||||
test_install_package nettle-dev
|
||||
test_install_package nettle-bin
|
||||
fi
|
||||
fi
|
||||
test_install_package autoconf
|
||||
test_install_package automake
|
||||
test_install_package bison
|
||||
@@ -543,7 +545,7 @@ check_install_epc_software() {
|
||||
test_install_package gawk
|
||||
test_install_package gcc
|
||||
test_install_package gccxml
|
||||
test_install_package gdb
|
||||
test_install_package gdb
|
||||
test_install_package guile-2.0-dev
|
||||
test_install_package gtkwave
|
||||
test_install_package iperf
|
||||
@@ -573,7 +575,7 @@ check_install_epc_software() {
|
||||
test_install_package libsctp-dev
|
||||
test_install_package libssl-dev
|
||||
test_install_package libtasn1-3-dev
|
||||
test_install_package libtool
|
||||
test_install_package libtool
|
||||
test_install_package libxml2
|
||||
test_install_package libxml2-dev
|
||||
# test_install_package linux-headers-`uname -r`
|
||||
@@ -593,21 +595,21 @@ check_install_epc_software() {
|
||||
test_install_package unzip
|
||||
test_install_package valgrind
|
||||
test_install_package vlan
|
||||
|
||||
if [ $OAI_INSTALLED = 1 ]; then
|
||||
|
||||
if [ $OAI_INSTALLED = 1 ]; then
|
||||
touch ./.lock_oaibuild
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
else
|
||||
echo_info "All the required packages installed: skip"
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
check_install_asn1c(){
|
||||
|
||||
|
||||
test_command_install_script "asn1c" "$OPENAIR_TARGETS/SCRIPTS/install_asn1c_0.9.24.modified.bash $SUDO"
|
||||
|
||||
|
||||
# One mor check about version of asn1c
|
||||
ASN1C_COMPILER_REQUIRED_VERSION_MESSAGE="ASN.1 Compiler, v0.9.24"
|
||||
ASN1C_COMPILER_VERSION_MESSAGE=`asn1c -h 2>&1 | grep -i ASN\.1\ Compiler`
|
||||
@@ -624,15 +626,15 @@ check_install_asn1c(){
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
}
|
||||
|
||||
#################################################
|
||||
# 2. compile
|
||||
# 2. compile
|
||||
################################################
|
||||
compile_hss() {
|
||||
cd $OPENAIR3_DIR/OPENAIRHSS
|
||||
|
||||
|
||||
if [ "$1" -eq 1 ]; then
|
||||
echo_info "build a clean HSS"
|
||||
rm -rfv obj*
|
||||
@@ -642,14 +644,14 @@ compile_hss() {
|
||||
fi
|
||||
|
||||
OBJ_DIR=`find . -maxdepth 1 -type d -iname obj*`
|
||||
|
||||
|
||||
if [ ! -n "$OBJ_DIR" ]; then
|
||||
OBJ_DIR="objs"
|
||||
mkdir --verbose -m 777 ./$OBJ_DIR
|
||||
else
|
||||
OBJ_DIR=`basename $OBJ_DIR`
|
||||
fi
|
||||
|
||||
|
||||
if [ ! -f "$OBJ_DIR"/Makefile ]; then
|
||||
if [ ! -d m4 ]; then
|
||||
mkdir --verbose -m 777 m4
|
||||
@@ -661,7 +663,7 @@ compile_hss() {
|
||||
fi
|
||||
cd $OBJ_DIR
|
||||
echo_success "Invoking configure"
|
||||
../configure
|
||||
../configure
|
||||
if [ $? -ne 0 ]; then
|
||||
return 1
|
||||
fi
|
||||
@@ -675,7 +677,7 @@ compile_hss() {
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "Build failed, exiting"
|
||||
return 1
|
||||
else
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
@@ -705,11 +707,11 @@ compile_epc() {
|
||||
fi
|
||||
bash_exec "autoreconf -i -f"
|
||||
echo_success "Invoking autogen"
|
||||
bash_exec "libtoolize"
|
||||
bash_exec "libtoolize"
|
||||
bash_exec "./autogen.sh"
|
||||
cd ./$OBJ_DIR
|
||||
echo_success "Invoking configure"
|
||||
if [ $DEBUG -ne 0 ]; then
|
||||
if [ $DEBUG -ne 0 ]; then
|
||||
../configure --enable-debug --enable-standalone-epc --enable-gtp1u-in-kernel LDFLAGS=-L/usr/local/lib
|
||||
else
|
||||
../configure --enable-standalone-epc --enable-gtp1u-in-kernel LDFLAGS=-L/usr/local/lib
|
||||
@@ -727,30 +729,30 @@ compile_epc() {
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "Build failed, exiting"
|
||||
return 1
|
||||
else
|
||||
else
|
||||
cp -pf ./OAI_EPC/oai_epc $OPENAIR_TARGETS/bin
|
||||
fi
|
||||
else
|
||||
echo_error "Configure failed, exiting"
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
||||
cd $OPENAIR3_DIR/GTPV1-U/GTPUAH;
|
||||
make
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "Build GTPUAH module failed, exiting"
|
||||
return 1
|
||||
else
|
||||
else
|
||||
$SUDO cp -pfv ./Bin/libxt_*.so /lib/xtables
|
||||
$SUDO cp -pfv ./Bin/*.ko $OPENAIR_TARGETS/bin
|
||||
fi
|
||||
|
||||
|
||||
cd $OPENAIR3_DIR/GTPV1-U/GTPURH;
|
||||
make
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "Build GTPURH module failed, exiting"
|
||||
return 1
|
||||
else
|
||||
else
|
||||
$SUDO cp -pfv ./Bin/libxt_*.so /lib/xtables
|
||||
$SUDO cp -pfv ./Bin/*.ko $OPENAIR_TARGETS/bin
|
||||
fi
|
||||
@@ -777,15 +779,15 @@ compile_ltesoftmodem() {
|
||||
if [ $? -ne 0 ]; then
|
||||
# to locate easily compilation error in log file
|
||||
make $SOFTMODEM_DIRECTIVES
|
||||
fi
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
if [ ! -f ./lte-softmodem ]; then
|
||||
if [ ! -f ./lte-softmodem ]; then
|
||||
echo_error "Build lte-softmodem failed, returning"
|
||||
return 1
|
||||
else
|
||||
else
|
||||
cp -pf ./lte-softmodem $OPENAIR_TARGETS/bin
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
else
|
||||
cp -pf ./lte-softmodem $OPENAIR_TARGETS/bin
|
||||
return 0
|
||||
@@ -801,11 +803,11 @@ compile_oaisim() {
|
||||
if [ -f Makefile ]; then
|
||||
echo "Compiling for oaisim target ($OAISIM_DIRECTIVES)"
|
||||
make cleanall > /dev/null
|
||||
make -j $NUM_CPU $OAISIM_DIRECTIVES
|
||||
make -j $NUM_CPU $OAISIM_DIRECTIVES
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "Build oaisim failed, returning"
|
||||
return 1
|
||||
else
|
||||
else
|
||||
cp -pf ./oaisim $OPENAIR_TARGETS/bin
|
||||
return 0
|
||||
fi
|
||||
@@ -820,11 +822,11 @@ compile_unisim() {
|
||||
if [ -f Makefile ]; then
|
||||
echo "Compiling for UNISIM target ..."
|
||||
make cleanall
|
||||
make -j $NUM_CPU all
|
||||
make -j $NUM_CPU all
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "Build unisim failed, returning"
|
||||
return 1
|
||||
else
|
||||
else
|
||||
cp -pf ./dlsim $OPENAIR_TARGETS/bin
|
||||
cp -pf ./ulsim $OPENAIR_TARGETS/bin
|
||||
cp -pf ./pucchsim $OPENAIR_TARGETS/bin
|
||||
@@ -843,9 +845,9 @@ compile_unisim() {
|
||||
compile_nas_tools() {
|
||||
|
||||
export NVRAM_DIR=$OPENAIR_TARGETS/bin
|
||||
|
||||
|
||||
cd $NVRAM_DIR
|
||||
|
||||
|
||||
if [ ! -f /tmp/nas_cleaned ]; then
|
||||
echo_success "make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS/tools veryveryclean"
|
||||
make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS/tools veryveryclean
|
||||
@@ -963,11 +965,11 @@ check_for_nas_ue_executable() {
|
||||
###############################################
|
||||
|
||||
# arg1 is RT
|
||||
# arg2 is HW
|
||||
# arg2 is HW
|
||||
# arg3 is ENB_S1
|
||||
install_ltesoftmodem() {
|
||||
# RT
|
||||
if [ $1 = "RTAI" ]; then
|
||||
if [ $1 = "RTAI" ]; then
|
||||
if [ ! -f /tmp/init_rt_done.tmp ]; then
|
||||
echo_info " 8.1 Insert RTAI modules"
|
||||
$SUDO insmod /usr/realtime/modules/rtai_hal.ko > /dev/null 2>&1
|
||||
@@ -982,46 +984,46 @@ install_ltesoftmodem() {
|
||||
fi
|
||||
fi
|
||||
#HW
|
||||
if [ $2 = "EXMIMO" ]; then
|
||||
if [ $2 = "EXMIMO" ]; then
|
||||
echo_info " 8.2 [EXMIMO] creating RTAI fifos"
|
||||
for i in `seq 0 64`; do
|
||||
for i in `seq 0 64`; do
|
||||
have_rtfX=`ls /dev/ |grep -c rtf$i`;
|
||||
if [ "$have_rtfX" -eq 0 ] ; then
|
||||
$SUDO mknod -m 666 /dev/rtf$i c 150 $i;
|
||||
if [ "$have_rtfX" -eq 0 ] ; then
|
||||
$SUDO mknod -m 666 /dev/rtf$i c 150 $i;
|
||||
fi;
|
||||
done
|
||||
echo_info " 8.3 [EXMIMO] Build lte-softmodemdrivers"
|
||||
cd $OPENAIR_TARGETS/ARCH/EXMIMO/DRIVER/eurecom && make clean && make # || exit 1
|
||||
cd $OPENAIR_TARGETS/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT && make clean && make # || exit 1
|
||||
|
||||
|
||||
echo_info " 8.4 [EXMIMO] Setup RF card"
|
||||
cd $OPENAIR_TARGETS/RT/USER
|
||||
. ./init_exmimo2.sh
|
||||
else
|
||||
else
|
||||
if [ $2 = "USRP" ]; then
|
||||
echo_info " 8.2 [USRP] "
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
|
||||
# ENB_S1
|
||||
if [ $3 = 0 ]; then
|
||||
if [ $3 = 0 ]; then
|
||||
cd $OPENAIR2_DIR && make clean && make nasmesh_netlink.ko #|| exit 1
|
||||
cd $OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL && make clean && make # || exit 1
|
||||
fi
|
||||
|
||||
|
||||
}
|
||||
|
||||
# arg1 is ENB_S1 'boolean'
|
||||
install_oaisim() {
|
||||
if [ $1 = 0 ]; then
|
||||
if [ $1 = 0 ]; then
|
||||
cd $OPENAIR2_DIR && make clean && make nasmesh_netlink.ko #|| exit 1
|
||||
cd $OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL && make clean && make # || exit 1
|
||||
else
|
||||
compile_ue_ip_nw_driver
|
||||
install_nas_tools
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1041,7 +1043,7 @@ install_nas_tools() {
|
||||
}
|
||||
|
||||
install_nasmesh(){
|
||||
echo_success "LOAD NASMESH IP DRIVER FOR UE AND eNB"
|
||||
echo_success "LOAD NASMESH IP DRIVER FOR UE AND eNB"
|
||||
(cd $OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL && make clean && make)
|
||||
(cd $OPENAIR2_DIR && make clean && make nasmesh_netlink_address_fix.ko)
|
||||
$SUDO rmmod nasmesh
|
||||
@@ -1069,7 +1071,7 @@ create_hss_database(){
|
||||
fi
|
||||
|
||||
set_openair_env
|
||||
|
||||
|
||||
# removed %
|
||||
#Q1="GRANT ALL PRIVILEGES ON *.* TO '$3'@'%' IDENTIFIED BY '$4' WITH GRANT OPTION;"
|
||||
Q1="GRANT ALL PRIVILEGES ON *.* TO '$3'@'localhost' IDENTIFIED BY '$4' WITH GRANT OPTION;"
|
||||
@@ -1082,8 +1084,8 @@ create_hss_database(){
|
||||
else
|
||||
echo_success "$3 permissions succeeded"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
Q1="CREATE DATABASE IF NOT EXISTS ${BTICK}$5${BTICK};"
|
||||
SQL="${Q1}"
|
||||
$MYSQL -u $3 --password=$4 -e "$SQL"
|
||||
@@ -1093,12 +1095,12 @@ create_hss_database(){
|
||||
else
|
||||
echo_success "$5 creation succeeded"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
# test if tables have been created
|
||||
mysql -u $3 --password=$4 -e "desc $5.users" > /dev/null 2>&1
|
||||
|
||||
if [ $? -eq 1 ]; then
|
||||
|
||||
if [ $? -eq 1 ]; then
|
||||
$MYSQL -u $3 --password=$4 $5 < $OPENAIR3_DIR/OPENAIRHSS/db/oai_db.sql
|
||||
if [ $? -ne 0 ]; then
|
||||
echo_error "$5 tables creation failed"
|
||||
@@ -1107,7 +1109,7 @@ create_hss_database(){
|
||||
echo_success "$5 tables creation succeeded"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -1176,7 +1178,7 @@ print_help_perf(){
|
||||
|
||||
}
|
||||
###############################
|
||||
## echo and family
|
||||
## echo and family
|
||||
###############################
|
||||
black='\E[30m'
|
||||
red='\E[31m'
|
||||
@@ -1196,10 +1198,10 @@ cecho() # Color-echo
|
||||
local default_msg="No Message."
|
||||
message=${1:-$default_msg}
|
||||
color=${2:-$green}
|
||||
if [ $BUILD_FROM_MAKEFILE = 0 ]; then
|
||||
if [ $BUILD_FROM_MAKEFILE = 0 ]; then
|
||||
echo -e -n "$color$message$reset_color"
|
||||
echo
|
||||
else
|
||||
else
|
||||
echo "$message"
|
||||
fi
|
||||
return
|
||||
@@ -1304,7 +1306,7 @@ assert() {
|
||||
if [ -z "$2" ] ; then # Not enought parameters passed.
|
||||
return $E_PARAM_ERR
|
||||
fi
|
||||
|
||||
|
||||
lineno=$2
|
||||
if [ ! $1 ]; then
|
||||
echo_error "Assertion failed: \"$1\""
|
||||
|
||||
Reference in New Issue
Block a user