SRSENB: cleanup and mutex rearange

This commit is contained in:
Xavier Arteaga 2019-10-17 16:44:45 +02:00 committed by Andre Puschmann
parent 8e92baf401
commit f9a795e985
11 changed files with 124 additions and 152 deletions

View File

@ -35,8 +35,8 @@ class cc_worker
{ {
public: public:
cc_worker(); cc_worker();
~cc_worker();
void init(phy_common* phy, srslte::log* log_h, uint32_t cc_idx); void init(phy_common* phy, srslte::log* log_h, uint32_t cc_idx);
void stop();
void reset(); void reset();
cf_t* get_buffer_rx(uint32_t antenna_idx); cf_t* get_buffer_rx(uint32_t antenna_idx);
@ -133,6 +133,7 @@ private:
// Each worker keeps a local copy of the user database. Uses more memory but more efficient to manage concurrency // Each worker keeps a local copy of the user database. Uses more memory but more efficient to manage concurrency
std::map<uint16_t, ue*> ue_db; std::map<uint16_t, ue*> ue_db;
std::mutex mutex;
}; };
} // namespace srsenb } // namespace srsenb

View File

@ -60,9 +60,9 @@ public:
std::string get_type() { return "lte"; }; std::string get_type() { return "lte"; };
/* MAC->PHY interface */ /* MAC->PHY interface */
int add_rnti(uint16_t rnti, bool is_temporal = false); int add_rnti(uint16_t rnti, bool is_temporal = false) final;
void rem_rnti(uint16_t rnti); void rem_rnti(uint16_t rnti) final;
void set_mch_period_stop(uint32_t stop); void set_mch_period_stop(uint32_t stop) final;
/*RRC-PHY interface*/ /*RRC-PHY interface*/
void configure_mbsfn(asn1::rrc::sib_type2_s* sib2, asn1::rrc::sib_type13_r9_s* sib13, asn1::rrc::mcch_msg_s mcch); void configure_mbsfn(asn1::rrc::sib_type2_s* sib2, asn1::rrc::sib_type13_r9_s* sib13, asn1::rrc::mcch_msg_s mcch);

View File

@ -68,21 +68,21 @@ public:
void worker_end(uint32_t tx_mutex_cnt, cf_t *buffer[SRSLTE_MAX_PORTS], uint32_t nof_samples, srslte_timestamp_t tx_time); void worker_end(uint32_t tx_mutex_cnt, cf_t *buffer[SRSLTE_MAX_PORTS], uint32_t nof_samples, srslte_timestamp_t tx_time);
// Common objects // Common objects
srslte_cell_t cell; srslte_cell_t cell = {};
phy_args_t params; phy_args_t params = {};
// Physical Uplink Config common // Physical Uplink Config common
srslte_ul_cfg_t ul_cfg_com; srslte_ul_cfg_t ul_cfg_com = {};
// Physical Downlink Config common // Physical Downlink Config common
srslte_dl_cfg_t dl_cfg_com; srslte_dl_cfg_t dl_cfg_com = {};
srslte::radio_interface_phy* radio; srslte::radio_interface_phy* radio = nullptr;
stack_interface_phy_lte* stack; stack_interface_phy_lte* stack = nullptr;
// Common objects for schedulign grants // Common objects for schedulign grants
stack_interface_phy_lte::ul_sched_t ul_grants[TTIMOD_SZ]; stack_interface_phy_lte::ul_sched_t ul_grants[TTIMOD_SZ] = {};
stack_interface_phy_lte::dl_sched_t dl_grants[TTIMOD_SZ]; stack_interface_phy_lte::dl_sched_t dl_grants[TTIMOD_SZ] = {};
// Map of pending ACKs for each user // Map of pending ACKs for each user
typedef struct { typedef struct {
@ -92,19 +92,19 @@ public:
class common_ue { class common_ue {
public: public:
pending_ack_t pending_ack; pending_ack_t pending_ack = {};
uint8_t ri; uint8_t ri = 0;
srslte_ra_tb_t last_tb[SRSLTE_MAX_HARQ_PROC]; srslte_ra_tb_t last_tb[SRSLTE_MAX_HARQ_PROC] = {};
}; };
std::map<uint16_t, common_ue> common_ue_db; std::map<uint16_t, common_ue> common_ue_db;
void ue_db_add_rnti(uint16_t rnti); void ue_db_add_rnti(uint16_t rnti);
void ue_db_rem_rnti(uint16_t rnti); void ue_db_rem_rnti(uint16_t rnti);
void ue_db_clear(uint32_t tti); void ue_db_clear(uint32_t tti);
void ue_db_set_ack_pending(uint32_t tti, uint16_t rnti, uint32_t tb_idx, uint32_t n_pdcch); void ue_db_set_ack_pending(uint32_t tti, uint16_t rnti, uint32_t tb_idx, uint32_t n_pdcch);
bool ue_db_is_ack_pending(uint32_t tti, uint16_t rnti, uint32_t tb_idx, uint32_t* last_n_pdcch = NULL); bool ue_db_is_ack_pending(uint32_t tti, uint16_t rnti, uint32_t tb_idx, uint32_t* last_n_pdcch = nullptr);
void ue_db_set_ri(uint16_t rnti, uint8_t ri); void ue_db_set_ri(uint16_t rnti, uint8_t ri);
uint8_t ue_db_get_ri(uint16_t rnti); uint8_t ue_db_get_ri(uint16_t rnti);
void ue_db_set_last_ul_tb(uint16_t rnti, uint32_t pid, srslte_ra_tb_t tb); void ue_db_set_last_ul_tb(uint16_t rnti, uint32_t pid, srslte_ra_tb_t tb);
@ -118,23 +118,22 @@ public:
private: private:
std::vector<sem_t> tx_sem; std::vector<sem_t> tx_sem;
bool is_first_tx; bool is_first_tx = false;
bool is_first_of_burst;
uint32_t nof_workers; uint32_t nof_workers = 0;
uint32_t max_workers; uint32_t max_workers = 0;
pthread_mutex_t user_mutex; pthread_mutex_t user_mutex = {};
bool have_mtch_stop; bool have_mtch_stop = false;
pthread_mutex_t mtch_mutex; pthread_mutex_t mtch_mutex = {};
pthread_cond_t mtch_cvar; pthread_cond_t mtch_cvar = {};
phy_interface_stack_lte::phy_cfg_mbsfn_t mbsfn; phy_interface_stack_lte::phy_cfg_mbsfn_t mbsfn;
bool sib13_configured; bool sib13_configured = false;
bool mcch_configured; bool mcch_configured = false;
uint8_t mch_table[40] = {}; uint8_t mch_table[40] = {};
uint8_t mcch_table[10] = {}; uint8_t mcch_table[10] = {};
uint32_t mch_period_stop; uint32_t mch_period_stop = 0;
uint8_t mch_sf_idx_lut[10] = {}; uint8_t mch_sf_idx_lut[10] = {};
bool is_mch_subframe(srslte_mbsfn_cfg_t* cfg, uint32_t phy_tti); bool is_mch_subframe(srslte_mbsfn_cfg_t* cfg, uint32_t phy_tti);
bool is_mcch_subframe(srslte_mbsfn_cfg_t* cfg, uint32_t phy_tti); bool is_mcch_subframe(srslte_mbsfn_cfg_t* cfg, uint32_t phy_tti);

View File

@ -43,8 +43,8 @@ public:
sf_cnt(0), sf_cnt(0),
thread("PRACH_WORKER") thread("PRACH_WORKER")
{ {
log_h = NULL; log_h = nullptr;
stack = NULL; stack = nullptr;
bzero(&prach, sizeof(srslte_prach_t)); bzero(&prach, sizeof(srslte_prach_t));
bzero(&prach_indices, sizeof(prach_indices)); bzero(&prach_indices, sizeof(prach_indices));
bzero(&prach_offsets, sizeof(prach_offsets)); bzero(&prach_offsets, sizeof(prach_offsets));
@ -75,36 +75,32 @@ private:
const static int sf_buffer_sz = 128*1024; const static int sf_buffer_sz = 128*1024;
class sf_buffer { class sf_buffer {
public: public:
sf_buffer() sf_buffer() = default;
{
nof_samples = 0;
tti = 0;
}
void reset() void reset()
{ {
nof_samples = 0; nof_samples = 0;
tti = 0; tti = 0;
} }
cf_t samples[sf_buffer_sz]; cf_t samples[sf_buffer_sz] = {};
uint32_t nof_samples; uint32_t nof_samples = 0;
uint32_t tti; uint32_t tti = 0;
#ifdef SRSLTE_BUFFER_POOL_LOG_ENABLED #ifdef SRSLTE_BUFFER_POOL_LOG_ENABLED
char debug_name[SRSLTE_BUFFER_POOL_LOG_NAME_LEN]; char debug_name[SRSLTE_BUFFER_POOL_LOG_NAME_LEN];
#endif /* SRSLTE_BUFFER_POOL_LOG_ENABLED */ #endif /* SRSLTE_BUFFER_POOL_LOG_ENABLED */
}; };
srslte::buffer_pool<sf_buffer> buffer_pool; srslte::buffer_pool<sf_buffer> buffer_pool;
srslte::block_queue<sf_buffer*> pending_buffers; srslte::block_queue<sf_buffer*> pending_buffers;
sf_buffer* current_buffer;
srslte::log* log_h; sf_buffer* current_buffer = nullptr;
stack_interface_phy_lte* stack; srslte::log* log_h = nullptr;
float max_prach_offset_us; stack_interface_phy_lte* stack = nullptr;
bool initiated; float max_prach_offset_us = 0.0f;
bool running; bool initiated = 0;
uint32_t nof_sf; bool running = false;
uint32_t sf_cnt; uint32_t nof_sf = 0;
uint32_t sf_cnt = 0;
void run_thread(); void run_thread() final;
int run_tti(sf_buffer *b); int run_tti(sf_buffer *b);

View File

@ -35,7 +35,7 @@ class sf_worker : public srslte::thread_pool::worker
{ {
public: public:
sf_worker() = default; sf_worker() = default;
~sf_worker() = default; ~sf_worker();
void init(phy_common* phy, srslte::log* log_h); void init(phy_common* phy, srslte::log* log_h);
void stop() final; void stop() final;
@ -65,7 +65,7 @@ private:
phy_common* phy = nullptr; phy_common* phy = nullptr;
bool initiated = false; bool initiated = false;
bool running = false; bool running = false;
bool is_worker_running = false; std::mutex work_mutex;
uint32_t tti_rx = 0, tti_tx_dl = 0, tti_tx_ul = 0; uint32_t tti_rx = 0, tti_tx_dl = 0, tti_tx_ul = 0;
uint32_t t_rx = 0, t_tx_dl = 0, t_tx_ul = 0; uint32_t t_rx = 0, t_tx_dl = 0, t_tx_ul = 0;
@ -74,13 +74,7 @@ private:
std::vector<std::unique_ptr<cc_worker> > cc_workers; std::vector<std::unique_ptr<cc_worker> > cc_workers;
srslte_dl_sf_cfg_t dl_sf = {};
srslte_ul_sf_cfg_t ul_sf = {};
srslte_softbuffer_tx_t temp_mbsfn_softbuffer = {}; srslte_softbuffer_tx_t temp_mbsfn_softbuffer = {};
// mutex to protect worker_imp() from configuration interface
std::mutex mutex;
}; };
} // namespace srsenb } // namespace srsenb

View File

@ -46,21 +46,20 @@ public:
void stop(); void stop();
private: private:
void run_thread(); void run_thread() final;
srslte::radio_interface_phy* radio_h; srslte::radio_interface_phy* radio_h = nullptr;
srslte::log *log_h; srslte::log* log_h = nullptr;
srslte::thread_pool *workers_pool; srslte::thread_pool* workers_pool = nullptr;
prach_worker* prach; prach_worker* prach = nullptr;
phy_common* worker_com; phy_common* worker_com = nullptr;
// Main system TTI counter // Main system TTI counter
uint32_t tti; uint32_t tti = 0;
uint32_t tx_worker_cnt; uint32_t tx_worker_cnt = 0;
uint32_t nof_workers; uint32_t nof_workers = 0;
bool running = false;
bool running;
}; };
} // namespace srsenb } // namespace srsenb

View File

@ -59,6 +59,27 @@ cc_worker::cc_worker()
reset(); reset();
} }
cc_worker::~cc_worker()
{
srslte_softbuffer_tx_free(&temp_mbsfn_softbuffer);
srslte_enb_dl_free(&enb_dl);
srslte_enb_ul_free(&enb_ul);
for (int p = 0; p < SRSLTE_MAX_PORTS; p++) {
if (signal_buffer_rx[p]) {
free(signal_buffer_rx[p]);
}
if (signal_buffer_tx[p]) {
free(signal_buffer_tx[p]);
}
}
// Delete all users
for (auto& it : ue_db) {
delete it.second;
}
}
#ifdef DEBUG_WRITE_FILE #ifdef DEBUG_WRITE_FILE
FILE* f; FILE* f;
#endif #endif
@ -132,25 +153,6 @@ void cc_worker::init(phy_common* phy_, srslte::log* log_h_, uint32_t cc_idx_)
#endif #endif
} }
void cc_worker::stop()
{
srslte_softbuffer_tx_free(&temp_mbsfn_softbuffer);
srslte_enb_dl_free(&enb_dl);
srslte_enb_ul_free(&enb_ul);
for (int p = 0; p < SRSLTE_MAX_PORTS; p++) {
if (signal_buffer_rx[p]) {
free(signal_buffer_rx[p]);
}
if (signal_buffer_tx[p]) {
free(signal_buffer_tx[p]);
}
}
// Delete all users
for (auto& it : ue_db) {
delete it.second;
}
}
void cc_worker::reset() void cc_worker::reset()
{ {
initiated = false; initiated = false;
@ -190,16 +192,19 @@ int cc_worker::add_rnti(uint16_t rnti, bool is_temporal)
} }
} }
mutex.lock();
// Create user unless already exists // Create user unless already exists
if (!ue_db.count(rnti)) { if (!ue_db.count(rnti)) {
ue_db[rnti] = new ue(rnti, phy); ue_db[rnti] = new ue(rnti, phy);
} }
mutex.unlock();
return SRSLTE_SUCCESS; return SRSLTE_SUCCESS;
} }
void cc_worker::rem_rnti(uint16_t rnti) void cc_worker::rem_rnti(uint16_t rnti)
{ {
std::lock_guard<std::mutex> lock(mutex);
if (ue_db.count(rnti)) { if (ue_db.count(rnti)) {
delete ue_db[rnti]; delete ue_db[rnti];
@ -228,11 +233,14 @@ void cc_worker::rem_rnti(uint16_t rnti)
uint32_t cc_worker::get_nof_rnti() uint32_t cc_worker::get_nof_rnti()
{ {
std::lock_guard<std::mutex> lock(mutex);
return ue_db.size(); return ue_db.size();
} }
void cc_worker::set_config_dedicated(uint16_t rnti, asn1::rrc::phys_cfg_ded_s* dedicated) void cc_worker::set_config_dedicated(uint16_t rnti, asn1::rrc::phys_cfg_ded_s* dedicated)
{ {
std::lock_guard<std::mutex> lock(mutex);
if (ue_db.count(rnti)) { if (ue_db.count(rnti)) {
if (dedicated->pusch_cfg_ded_present && dedicated->sched_request_cfg_present) { if (dedicated->pusch_cfg_ded_present && dedicated->sched_request_cfg_present) {
@ -311,6 +319,7 @@ void cc_worker::set_config_dedicated(uint16_t rnti, asn1::rrc::phys_cfg_ded_s* d
void cc_worker::work_ul(srslte_ul_sf_cfg_t* ul_sf_cfg, stack_interface_phy_lte::ul_sched_t* ul_grants) void cc_worker::work_ul(srslte_ul_sf_cfg_t* ul_sf_cfg, stack_interface_phy_lte::ul_sched_t* ul_grants)
{ {
std::lock_guard<std::mutex> lock(mutex);
ul_sf = *ul_sf_cfg; ul_sf = *ul_sf_cfg;
log_h->step(ul_sf.tti); log_h->step(ul_sf.tti);
@ -334,6 +343,7 @@ void cc_worker::work_dl(srslte_dl_sf_cfg_t* dl_sf_cfg,
stack_interface_phy_lte::ul_sched_t* ul_grants, stack_interface_phy_lte::ul_sched_t* ul_grants,
srslte_mbsfn_cfg_t* mbsfn_cfg) srslte_mbsfn_cfg_t* mbsfn_cfg)
{ {
std::lock_guard<std::mutex> lock(mutex);
dl_sf = *dl_sf_cfg; dl_sf = *dl_sf_cfg;
// Put base signals (references, PBCH, PCFICH and PSS/SSS) into the resource grid // Put base signals (references, PBCH, PCFICH and PSS/SSS) into the resource grid
@ -711,6 +721,7 @@ int cc_worker::encode_pdsch(stack_interface_phy_lte::dl_sched_grant_t* grants, u
/************ METRICS interface ********************/ /************ METRICS interface ********************/
uint32_t cc_worker::get_metrics(phy_metrics_t metrics[ENB_METRICS_MAX_USERS]) uint32_t cc_worker::get_metrics(phy_metrics_t metrics[ENB_METRICS_MAX_USERS])
{ {
std::lock_guard<std::mutex> lock(mutex);
uint32_t cnt = 0; uint32_t cnt = 0;
for (auto& iter : ue_db) { for (auto& iter : ue_db) {
ue* u = iter.second; ue* u = iter.second;

View File

@ -37,20 +37,12 @@ using namespace asn1::rrc;
namespace srsenb { namespace srsenb {
phy_common::phy_common(uint32_t max_workers) : tx_sem(max_workers) phy_common::phy_common(uint32_t max_workers_) : tx_sem(max_workers_)
{ {
this->nof_workers = nof_workers; nof_workers = max_workers_;
params.max_prach_offset_us = 20; params.max_prach_offset_us = 20;
radio = NULL;
stack = NULL;
is_first_tx = false;
is_first_of_burst = false;
have_mtch_stop = false; have_mtch_stop = false;
this->max_workers = max_workers; max_workers = max_workers_;
ZERO_OBJECT(ul_cfg_com);
ZERO_OBJECT(dl_cfg_com);
ZERO_OBJECT(ul_grants);
for (uint32_t i = 0; i < max_workers; i++) { for (uint32_t i = 0; i < max_workers; i++) {
sem_init(&tx_sem[i], 0, 0); // All semaphores start blocked sem_init(&tx_sem[i], 0, 0); // All semaphores start blocked
@ -64,9 +56,9 @@ phy_common::~phy_common()
} }
} }
void phy_common::set_nof_workers(uint32_t nof_workers) void phy_common::set_nof_workers(uint32_t nof_workers_)
{ {
this->nof_workers = nof_workers; nof_workers = nof_workers_;
} }
void phy_common::reset() void phy_common::reset()
@ -83,12 +75,11 @@ bool phy_common::init(const srslte_cell_t& cell_,
stack = stack_; stack = stack_;
cell = cell_; cell = cell_;
pthread_mutex_init(&user_mutex, NULL); pthread_mutex_init(&user_mutex, nullptr);
pthread_mutex_init(&mtch_mutex, NULL); pthread_mutex_init(&mtch_mutex, nullptr);
pthread_cond_init(&mtch_cvar, NULL); pthread_cond_init(&mtch_cvar, nullptr);
is_first_of_burst = true; is_first_tx = true;
is_first_tx = true;
reset(); reset();
return true; return true;
} }
@ -136,7 +127,7 @@ void phy_common::worker_end(uint32_t tti,
void phy_common::ue_db_clear(uint32_t tti) void phy_common::ue_db_clear(uint32_t tti)
{ {
for(std::map<uint16_t,common_ue>::iterator iter=common_ue_db.begin(); iter!=common_ue_db.end(); ++iter) { for (auto iter = common_ue_db.begin(); iter != common_ue_db.end(); ++iter) {
pending_ack_t *p = &((common_ue*)&iter->second)->pending_ack; pending_ack_t *p = &((common_ue*)&iter->second)->pending_ack;
for (uint32_t tb_idx = 0; tb_idx < SRSLTE_MAX_TB; tb_idx++) { for (uint32_t tb_idx = 0; tb_idx < SRSLTE_MAX_TB; tb_idx++) {
p->is_pending[TTIMOD(tti)][tb_idx] = false; p->is_pending[TTIMOD(tti)][tb_idx] = false;

View File

@ -62,7 +62,7 @@ void prach_worker::stop()
srslte_prach_free(&prach); srslte_prach_free(&prach);
running = false; running = false;
sf_buffer *s = NULL; sf_buffer* s = nullptr;
pending_buffers.push(s); pending_buffers.push(s);
wait_thread_finish(); wait_thread_finish();
} }

View File

@ -108,20 +108,9 @@ void sf_worker::init(phy_common* phy_, srslte::log* log_h_)
void sf_worker::stop() void sf_worker::stop()
{ {
std::lock_guard<std::mutex> lock(work_mutex);
running = false; running = false;
std::lock_guard<std::mutex> lg(mutex); srslte::thread_pool::worker::stop();
int cnt = 0;
while (is_worker_running && cnt < 100) {
usleep(1000);
cnt++;
}
if (!is_worker_running) {
srslte_softbuffer_tx_free(&temp_mbsfn_softbuffer);
} else {
log_h->console("Warning could not stop properly PHY\n");
}
} }
cf_t* sf_worker::get_buffer_rx(uint32_t cc_idx, uint32_t antenna_idx) cf_t* sf_worker::get_buffer_rx(uint32_t cc_idx, uint32_t antenna_idx)
@ -140,7 +129,7 @@ void sf_worker::set_time(uint32_t tti_, uint32_t tx_worker_cnt_, srslte_timestam
t_tx_ul = TTIMOD(tti_tx_ul); t_tx_ul = TTIMOD(tti_tx_ul);
tx_worker_cnt = tx_worker_cnt_; tx_worker_cnt = tx_worker_cnt_;
memcpy(&tx_time, &tx_time_, sizeof(srslte_timestamp_t)); srslte_timestamp_copy(&tx_time, &tx_time_);
for (auto& w : cc_workers) { for (auto& w : cc_workers) {
w->set_tti(tti_); w->set_tti(tti_);
@ -149,7 +138,6 @@ void sf_worker::set_time(uint32_t tti_, uint32_t tx_worker_cnt_, srslte_timestam
int sf_worker::add_rnti(uint16_t rnti, bool is_temporal) int sf_worker::add_rnti(uint16_t rnti, bool is_temporal)
{ {
std::lock_guard<std::mutex> lg(mutex);
for (auto& w : cc_workers) { for (auto& w : cc_workers) {
w->add_rnti(rnti, is_temporal); w->add_rnti(rnti, is_temporal);
} }
@ -158,7 +146,6 @@ int sf_worker::add_rnti(uint16_t rnti, bool is_temporal)
void sf_worker::rem_rnti(uint16_t rnti) void sf_worker::rem_rnti(uint16_t rnti)
{ {
std::lock_guard<std::mutex> lg(mutex);
for (auto& w : cc_workers) { for (auto& w : cc_workers) {
w->rem_rnti(rnti); w->rem_rnti(rnti);
} }
@ -171,7 +158,6 @@ uint32_t sf_worker::get_nof_rnti()
void sf_worker::set_config_dedicated(uint16_t rnti, asn1::rrc::phys_cfg_ded_s* dedicated) void sf_worker::set_config_dedicated(uint16_t rnti, asn1::rrc::phys_cfg_ded_s* dedicated)
{ {
std::lock_guard<std::mutex> lg(mutex);
for (auto& w : cc_workers) { for (auto& w : cc_workers) {
w->set_config_dedicated(rnti, dedicated); w->set_config_dedicated(rnti, dedicated);
} }
@ -179,13 +165,15 @@ void sf_worker::set_config_dedicated(uint16_t rnti, asn1::rrc::phys_cfg_ded_s* d
void sf_worker::work_imp() void sf_worker::work_imp()
{ {
std::lock_guard<std::mutex> lg(mutex); std::lock_guard<std::mutex> lock(work_mutex);
cf_t* signal_buffer_tx[SRSLTE_MAX_PORTS * SRSLTE_MAX_CARRIERS]; cf_t* signal_buffer_tx[SRSLTE_MAX_PORTS * SRSLTE_MAX_CARRIERS];
srslte_ul_sf_cfg_t ul_sf = {};
srslte_dl_sf_cfg_t dl_sf = {};
if (!running) { if (!running) {
return; return;
} }
is_worker_running = true;
srslte_mbsfn_cfg_t mbsfn_cfg; srslte_mbsfn_cfg_t mbsfn_cfg;
srslte_sf_t sf_type = phy->is_mbsfn_sf(&mbsfn_cfg, tti_tx_dl) ? SRSLTE_SF_MBSFN : SRSLTE_SF_NORM; srslte_sf_t sf_type = phy->is_mbsfn_sf(&mbsfn_cfg, tti_tx_dl) ? SRSLTE_SF_MBSFN : SRSLTE_SF_NORM;
@ -199,7 +187,6 @@ void sf_worker::work_imp()
Debug("Worker %d running\n", get_id()); Debug("Worker %d running\n", get_id());
// Configure UL subframe // Configure UL subframe
ZERO_OBJECT(ul_sf);
ul_sf.tti = tti_rx; ul_sf.tti = tti_rx;
// Process UL // Process UL
@ -212,29 +199,28 @@ void sf_worker::work_imp()
if (sf_type == SRSLTE_SF_NORM) { if (sf_type == SRSLTE_SF_NORM) {
if (stack->get_dl_sched(tti_tx_dl, &dl_grants[t_tx_dl]) < 0) { if (stack->get_dl_sched(tti_tx_dl, &dl_grants[t_tx_dl]) < 0) {
Error("Getting DL scheduling from MAC\n"); Error("Getting DL scheduling from MAC\n");
goto unlock; return;
} }
} else { } else {
dl_grants[t_tx_dl].cfi = mbsfn_cfg.non_mbsfn_region_length; dl_grants[t_tx_dl].cfi = mbsfn_cfg.non_mbsfn_region_length;
if (stack->get_mch_sched(tti_tx_dl, mbsfn_cfg.is_mcch, &dl_grants[t_tx_dl])) { if (stack->get_mch_sched(tti_tx_dl, mbsfn_cfg.is_mcch, &dl_grants[t_tx_dl])) {
Error("Getting MCH packets from MAC\n"); Error("Getting MCH packets from MAC\n");
goto unlock; return;
} }
} }
if (dl_grants[t_tx_dl].cfi < 1 || dl_grants[t_tx_dl].cfi > 3) { if (dl_grants[t_tx_dl].cfi < 1 || dl_grants[t_tx_dl].cfi > 3) {
Error("Invalid CFI=%d\n", dl_grants[t_tx_dl].cfi); Error("Invalid CFI=%d\n", dl_grants[t_tx_dl].cfi);
goto unlock; return;
} }
// Get UL scheduling for the TX TTI from MAC // Get UL scheduling for the TX TTI from MAC
if (stack->get_ul_sched(tti_tx_ul, &ul_grants[t_tx_ul]) < 0) { if (stack->get_ul_sched(tti_tx_ul, &ul_grants[t_tx_ul]) < 0) {
Error("Getting UL scheduling from MAC\n"); Error("Getting UL scheduling from MAC\n");
goto unlock; return;
} }
// Configure DL subframe // Configure DL subframe
ZERO_OBJECT(dl_sf);
dl_sf.tti = tti_tx_dl; dl_sf.tti = tti_tx_dl;
dl_sf.cfi = dl_grants[t_tx_dl].cfi; dl_sf.cfi = dl_grants[t_tx_dl].cfi;
dl_sf.sf_type = sf_type; dl_sf.sf_type = sf_type;
@ -255,8 +241,6 @@ void sf_worker::work_imp()
Debug("Sending to radio\n"); Debug("Sending to radio\n");
phy->worker_end(tx_worker_cnt, signal_buffer_tx, SRSLTE_SF_LEN_PRB(phy->cell.nof_prb), tx_time); phy->worker_end(tx_worker_cnt, signal_buffer_tx, SRSLTE_SF_LEN_PRB(phy->cell.nof_prb), tx_time);
is_worker_running = false;
#ifdef DEBUG_WRITE_FILE #ifdef DEBUG_WRITE_FILE
fwrite(signal_buffer_tx, SRSLTE_SF_LEN_PRB(phy->cell.nof_prb) * sizeof(cf_t), 1, f); fwrite(signal_buffer_tx, SRSLTE_SF_LEN_PRB(phy->cell.nof_prb) * sizeof(cf_t), 1, f);
#endif #endif
@ -275,10 +259,6 @@ void sf_worker::work_imp()
} }
#endif #endif
unlock:
if (is_worker_running) {
is_worker_running = false;
}
} }
/************ METRICS interface ********************/ /************ METRICS interface ********************/
@ -339,6 +319,11 @@ int sf_worker::read_pucch_d(cf_t* pdsch_d)
return cc_workers[0]->read_pucch_d(pdsch_d); return cc_workers[0]->read_pucch_d(pdsch_d);
} }
sf_worker::~sf_worker()
{
srslte_softbuffer_tx_free(&temp_mbsfn_softbuffer);
}
} // namespace srsenb } // namespace srsenb
/*********************************************************** /***********************************************************

View File

@ -38,14 +38,9 @@ using namespace std;
namespace srsenb { namespace srsenb {
txrx::txrx() : tx_worker_cnt(0), nof_workers(0), tti(0), thread("TXRX") txrx::txrx() : thread("TXRX")
{ {
running = false; /* Do nothing */
radio_h = NULL;
log_h = NULL;
workers_pool = NULL;
worker_com = NULL;
prach = NULL;
} }
bool txrx::init(srslte::radio_interface_phy* radio_h_, bool txrx::init(srslte::radio_interface_phy* radio_h_,
@ -78,11 +73,12 @@ void txrx::stop()
void txrx::run_thread() void txrx::run_thread()
{ {
sf_worker* worker = NULL; sf_worker* worker = nullptr;
cf_t *buffer[SRSLTE_MAX_PORTS] = {NULL}; cf_t* buffer[SRSLTE_MAX_PORTS] = {};
srslte_timestamp_t rx_time = {}, tx_time = {}; srslte_timestamp_t rx_time = {};
uint32_t sf_len = SRSLTE_SF_LEN_PRB(worker_com->cell.nof_prb); srslte_timestamp_t tx_time = {};
uint32_t sf_len = SRSLTE_SF_LEN_PRB(worker_com->cell.nof_prb);
float samp_rate = srslte_sampling_freq_hz(worker_com->cell.nof_prb); float samp_rate = srslte_sampling_freq_hz(worker_com->cell.nof_prb);
log_h->console("Setting Sampling frequency %.2f MHz\n", (float) samp_rate/1000000); log_h->console("Setting Sampling frequency %.2f MHz\n", (float) samp_rate/1000000);