moved rach_detected to stack thread. Created a more friendly interface to enqueue tasks in stack

This commit is contained in:
Francisco Paisana 2020-03-03 16:25:04 +00:00
parent d10e950650
commit fed06138b9
8 changed files with 101 additions and 62 deletions

View File

@ -58,6 +58,24 @@ class multiqueue_handler
};
public:
class queue_handler
{
public:
queue_handler() = default;
queue_handler(multiqueue_handler<myobj>* parent_, int id) : parent(parent_), queue_id(id) {}
template <typename FwdRef>
void push(FwdRef&& value)
{
parent->push(queue_id, std::forward<FwdRef>(value));
}
bool try_push(const myobj& value) { return parent->try_push(queue_id, value); }
std::pair<bool, myobj> try_push(myobj&& value) { return parent->try_push(queue_id, std::move(value)); }
private:
multiqueue_handler<myobj>* parent = nullptr;
int queue_id = -1;
};
explicit multiqueue_handler(uint32_t capacity_ = std::numeric_limits<uint32_t>::max()) : capacity(capacity_) {}
~multiqueue_handler() { reset(); }
@ -214,6 +232,8 @@ public:
return is_queue_active_(qidx);
}
queue_handler get_queue_handler() { return {this, add_queue()}; }
private:
bool is_queue_active_(int qidx) const { return running and queues[qidx].active; }
@ -257,7 +277,7 @@ private:
std::unique_ptr<base_task> task_ptr;
};
using multiqueue_task_handler = multiqueue_handler<move_task_t>;
using task_multiqueue = multiqueue_handler<move_task_t>;
} // namespace srslte

View File

@ -26,6 +26,7 @@
#include "srslte/asn1/s1ap_asn1.h"
#include "srslte/common/common.h"
#include "srslte/common/interfaces_common.h"
#include "srslte/common/multiqueue.h"
#include "srslte/common/security.h"
#include "srslte/interfaces/rrc_interface_types.h"
#include "srslte/interfaces/sched_interface.h"
@ -98,8 +99,8 @@ public:
*/
typedef std::vector<ul_sched_t> ul_sched_list_t;
virtual int sr_detected(uint32_t tti, uint16_t rnti) = 0;
virtual int rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) = 0;
virtual int sr_detected(uint32_t tti, uint16_t rnti) = 0;
virtual void rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) = 0;
/**
* PHY callback for giving MAC the Rank Indicator information of a given RNTI for an eNb cell/carrier.
@ -476,6 +477,13 @@ typedef struct {
int link_failure_nof_err;
} mac_args_t;
class enb_task_interface_lte
{
public:
virtual srslte::timer_handler::unique_timer get_unique_timer() = 0;
virtual srslte::task_multiqueue::queue_handler get_task_queue() = 0;
};
class stack_interface_s1ap_lte
{
public:
@ -491,10 +499,8 @@ public:
};
// STACK interface for MAC
class stack_interface_mac_lte
class stack_interface_mac_lte : public enb_task_interface_lte
{
public:
virtual void process_pdus() = 0;
};
} // namespace srsenb

View File

@ -62,10 +62,10 @@ public:
bool get_metrics(stack_metrics_t* metrics) final;
/* PHY-MAC interface */
int sr_detected(uint32_t tti, uint16_t rnti) final { return mac.sr_detected(tti, rnti); }
int rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) final
int sr_detected(uint32_t tti, uint16_t rnti) final { return mac.sr_detected(tti, rnti); }
void rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) final
{
return mac.rach_detected(tti, primary_cc_idx, preamble_idx, time_adv);
mac.rach_detected(tti, primary_cc_idx, preamble_idx, time_adv);
}
int ri_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t ri_value) final
{
@ -113,7 +113,8 @@ public:
void add_gtpu_m1u_socket_handler(int fd) override;
/* Stack-MAC interface */
void process_pdus() override;
srslte::timer_handler::unique_timer get_unique_timer() final;
srslte::task_multiqueue::queue_handler get_task_queue() final;
private:
static const int STACK_MAIN_THREAD_PRIO = -1; // Use default high-priority below UHD
@ -158,8 +159,8 @@ private:
phy_interface_stack_lte* phy = nullptr;
// state
bool started = false;
srslte::multiqueue_task_handler pending_tasks;
bool started = false;
srslte::task_multiqueue pending_tasks;
int enb_queue_id = -1, sync_queue_id = -1, mme_queue_id = -1, gtpu_queue_id = -1, mac_queue_id = -1;
};

View File

@ -53,8 +53,8 @@ public:
void start_pcap(srslte::mac_pcap* pcap_);
/******** Interface from PHY (PHY -> MAC) ****************/
int sr_detected(uint32_t tti, uint16_t rnti) final;
int rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) final;
int sr_detected(uint32_t tti, uint16_t rnti) final;
void rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) final;
int ri_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t ri_value) override;
int pmi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t pmi_value) override;
@ -93,7 +93,7 @@ public:
bool process_pdus();
void get_metrics(mac_metrics_t metrics[ENB_METRICS_MAX_USERS]);
void get_metrics(mac_metrics_t metrics[ENB_METRICS_MAX_USERS]);
void
write_mcch(asn1::rrc::sib_type2_s* sib2, asn1::rrc::sib_type13_r9_s* sib13, asn1::rrc::mcch_msg_s* mcch) override;
@ -116,6 +116,9 @@ private:
srslte_cell_t cell = {};
mac_args_t args = {};
// derived from args
srslte::task_multiqueue::queue_handler stack_task_queue;
bool started = false;
/* Scheduler unit */
@ -139,23 +142,23 @@ private:
std::vector<srslte::rar_pdu> rar_pdu_msg;
srslte::byte_buffer_t rar_payload[sched_interface::MAX_RAR_LIST];
const static int NOF_BCCH_DLSCH_MSG = sched_interface::MAX_SIBS;
const static int NOF_BCCH_DLSCH_MSG = sched_interface::MAX_SIBS;
uint8_t bcch_dlsch_payload[sched_interface::MAX_SIB_PAYLOAD_LEN] = {};
const static int pcch_payload_buffer_len = 1024;
const static int pcch_payload_buffer_len = 1024;
uint8_t pcch_payload_buffer[pcch_payload_buffer_len] = {};
srslte_softbuffer_tx_t bcch_softbuffer_tx[NOF_BCCH_DLSCH_MSG] = {};
srslte_softbuffer_tx_t pcch_softbuffer_tx = {};
srslte_softbuffer_tx_t rar_softbuffer_tx = {};
const static int mcch_payload_len = 3000; // TODO FIND OUT MAX LENGTH
const static int mcch_payload_len = 3000; // TODO FIND OUT MAX LENGTH
int current_mcch_length = 0;
uint8_t mcch_payload_buffer[mcch_payload_len] = {};
asn1::rrc::mcch_msg_s mcch;
asn1::rrc::sib_type2_s sib2;
asn1::rrc::sib_type13_r9_s sib13;
const static int mtch_payload_len = 10000;
const static int mtch_payload_len = 10000;
uint8_t mtch_payload_buffer[mtch_payload_len] = {};
// pointer to MAC PCAP object

View File

@ -238,9 +238,14 @@ void enb_stack_lte::add_gtpu_m1u_socket_handler(int fd)
rx_sockets->add_socket_pdu_handler(fd, gtpu_m1u_handler);
}
void enb_stack_lte::process_pdus()
srslte::timer_handler::unique_timer enb_stack_lte::get_unique_timer()
{
pending_tasks.push(mac_queue_id, [this]() { mac.process_pdus(); });
return timers.get_unique_timer();
}
srslte::task_multiqueue::queue_handler enb_stack_lte::get_task_queue()
{
return pending_tasks.get_queue_handler();
}
} // namespace srsenb

View File

@ -70,6 +70,8 @@ bool mac::init(const mac_args_t& args_,
args = args_;
cell = *cell_;
stack_task_queue = stack->get_task_queue();
scheduler.init(rrc);
// Set default scheduler configuration
@ -323,7 +325,7 @@ int mac::crc_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t nof_byt
if (crc) {
Info("Pushing PDU rnti=%d, tti=%d, nof_bytes=%d\n", rnti, tti, nof_bytes);
ue_db[rnti]->push_pdu(tti, nof_bytes);
stack->process_pdus();
stack_task_queue.push([this]() { process_pdus(); });
} else {
ue_db[rnti]->deallocate_pdu(tti);
}
@ -410,7 +412,7 @@ int mac::sr_detected(uint32_t tti, uint16_t rnti)
return ret;
}
int mac::rach_detected(uint32_t tti, uint32_t enb_cc_idx, uint32_t preamble_idx, uint32_t time_adv)
void mac::rach_detected(uint32_t tti, uint32_t enb_cc_idx, uint32_t preamble_idx, uint32_t time_adv)
{
log_h->step(tti);
uint16_t rnti;
@ -426,50 +428,53 @@ int mac::rach_detected(uint32_t tti, uint32_t enb_cc_idx, uint32_t preamble_idx,
}
// Set PCAP if available
if (pcap) {
if (pcap != nullptr) {
ue_db[rnti]->start_pcap(pcap);
}
// Increase RNTI counter
last_rnti++;
if (last_rnti >= 60000) {
last_rnti = 70;
}
}
// Generate RAR data
sched_interface::dl_sched_rar_info_t rar_info = {};
rar_info.preamble_idx = preamble_idx;
rar_info.ta_cmd = time_adv;
rar_info.temp_crnti = rnti;
rar_info.msg3_size = 7;
rar_info.prach_tti = tti;
stack_task_queue.push([this, rnti, tti, enb_cc_idx, preamble_idx, time_adv]() {
// Generate RAR data
sched_interface::dl_sched_rar_info_t rar_info = {};
rar_info.preamble_idx = preamble_idx;
rar_info.ta_cmd = time_adv;
rar_info.temp_crnti = rnti;
rar_info.msg3_size = 7;
rar_info.prach_tti = tti;
// Add new user to the scheduler so that it can RX/TX SRB0
sched_interface::ue_cfg_t ue_cfg = {};
ue_cfg.supported_cc_list.emplace_back();
ue_cfg.supported_cc_list.back().active = true;
ue_cfg.supported_cc_list.back().enb_cc_idx = enb_cc_idx;
ue_cfg.ue_bearers[0].direction = srsenb::sched_interface::ue_bearer_cfg_t::BOTH;
ue_cfg.dl_cfg.tm = SRSLTE_TM1;
if (scheduler.ue_cfg(rnti, ue_cfg) != SRSLTE_SUCCESS) {
Error("Registering new user rnti=0x%x to SCHED\n", rnti);
return -1;
}
// Add new user to the scheduler so that it can RX/TX SRB0
sched_interface::ue_cfg_t ue_cfg = {};
ue_cfg.supported_cc_list.emplace_back();
ue_cfg.supported_cc_list.back().active = true;
ue_cfg.supported_cc_list.back().enb_cc_idx = enb_cc_idx;
ue_cfg.ue_bearers[0].direction = srsenb::sched_interface::ue_bearer_cfg_t::BOTH;
ue_cfg.dl_cfg.tm = SRSLTE_TM1;
if (scheduler.ue_cfg(rnti, ue_cfg) != SRSLTE_SUCCESS) {
Error("Registering new user rnti=0x%x to SCHED\n", rnti);
return;
}
// Register new user in RRC
rrc_h->add_user(rnti, ue_cfg);
// Register new user in RRC
rrc_h->add_user(rnti, ue_cfg);
// Add temporal rnti to the PHY
if (phy_h->add_rnti(rnti, enb_cc_idx, true)) {
Error("Registering temporal-rnti=0x%x to PHY\n", rnti);
}
// Add temporal rnti to the PHY
if (phy_h->add_rnti(rnti, enb_cc_idx, true) != SRSLTE_SUCCESS) {
Error("Registering temporal-rnti=0x%x to PHY\n", rnti);
return;
}
// Trigger scheduler RACH
scheduler.dl_rach_info(enb_cc_idx, rar_info);
// Trigger scheduler RACH
scheduler.dl_rach_info(enb_cc_idx, rar_info);
log_h->info("RACH: tti=%d, preamble=%d, offset=%d, temp_crnti=0x%x\n", tti, preamble_idx, time_adv, rnti);
log_h->console("RACH: tti=%d, preamble=%d, offset=%d, temp_crnti=0x%x\n", tti, preamble_idx, time_adv, rnti);
// Increase RNTI counter
last_rnti++;
if (last_rnti >= 60000) {
last_rnti = 70;
}
return 0;
log_h->info("RACH: tti=%d, preamble=%d, offset=%d, temp_crnti=0x%x\n", tti, preamble_idx, time_adv, rnti);
log_h->console("RACH: tti=%d, preamble=%d, offset=%d, temp_crnti=0x%x\n", tti, preamble_idx, time_adv, rnti);
});
}
int mac::get_dl_sched(uint32_t tti, dl_sched_list_t& dl_sched_res_list)

View File

@ -372,10 +372,9 @@ public:
return SRSLTE_SUCCESS;
}
int rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) override
void rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) override
{
notify_rach_detected();
return 0;
}
int ri_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t ri_value) override
{

View File

@ -168,8 +168,8 @@ private:
gw_interface_stack* gw = nullptr;
// Thread
static const int STACK_MAIN_THREAD_PRIO = -1; // Use default high-priority below UHD
srslte::multiqueue_task_handler pending_tasks;
static const int STACK_MAIN_THREAD_PRIO = -1; // Use default high-priority below UHD
srslte::task_multiqueue pending_tasks;
int sync_queue_id = -1, ue_queue_id = -1, gw_queue_id = -1, mac_queue_id = -1, background_queue_id = -1;
srslte::task_thread_pool background_tasks; ///< Thread pool used for long, low-priority tasks
};