added latest mac nr updates

master
Francisco Paisana 5 years ago
parent cc52edf820
commit 3c2e3dbdbf

@ -101,6 +101,7 @@ public:
bool is_ulsch();
void init_tx(byte_buffer_t* buffer_, uint32_t pdu_len_, bool is_ulsch_ = false);
void init_rx(bool ulsch_ = false);
uint32_t add_sdu(const uint32_t lcid_, const uint8_t* payload_, const uint32_t len_);

@ -262,6 +262,15 @@ void mac_nr_sch_pdu::init_tx(byte_buffer_t* buffer_, uint32_t pdu_len_, bool uls
ulsch = ulsch_;
}
void mac_nr_sch_pdu::init_rx(bool ulsch_)
{
buffer = nullptr;
subpdus.clear();
pdu_len = 0;
remaining_len = 0;
ulsch = ulsch_;
}
uint32_t mac_nr_sch_pdu::size_header_sdu(const uint32_t lcid, const uint32_t nbytes)
{
if (ulsch && (lcid == mac_nr_sch_subpdu::CCCH_SIZE_48 || lcid == mac_nr_sch_subpdu::CCCH_SIZE_64)) {

@ -49,6 +49,7 @@ namespace srsenb {
class gnb_stack_nr final : public srsenb::enb_stack_base,
public stack_interface_phy_nr,
public stack_interface_mac,
public srsue::stack_interface_gw,
public srslte::task_handler_interface,
public srslte::thread
@ -67,6 +68,7 @@ public:
// PHY->MAC interface
int sf_indication(const uint32_t tti);
int rx_data_indication(rx_data_ind_t& grant);
// Temporary GW interface
void write_sdu(uint32_t lcid, srslte::unique_byte_buffer_t sdu, bool blocking);
@ -74,6 +76,9 @@ public:
bool switch_on();
void run_tti(uint32_t tti);
// MAC interface to trigger processing of received PDUs
void process_pdus() final;
// Task Handling interface
srslte::timer_handler::unique_timer get_unique_timer() final { return timers.get_unique_timer(); }
srslte::task_multiqueue::queue_handler make_task_queue() final { return pending_tasks.get_queue_handler(); }
@ -84,14 +89,14 @@ public:
private:
void run_thread() final;
void run_tti_impl();
void run_tti_impl(uint32_t tti);
// args
srsenb::stack_args_t args = {};
srslte::logger* logger = nullptr;
phy_interface_stack_nr* phy = nullptr;
// timers
/* Functions for MAC Timers */
srslte::timer_handler timers;
// derived
@ -113,7 +118,7 @@ private:
srslte::task_multiqueue pending_tasks;
std::vector<srslte::move_task_t> deferred_stack_tasks; ///< enqueues stack tasks from within. Avoids locking
srslte::task_thread_pool background_tasks; ///< Thread pool used for long, low-priority tasks
int sync_queue_id = -1, background_queue_id = -1;
int sync_queue_id = -1, ue_queue_id = -1, gw_queue_id = -1, mac_queue_id = -1, background_queue_id = -1;
};
} // namespace srsenb

@ -22,6 +22,7 @@
#ifndef SRSENB_MAC_NR_H
#define SRSENB_MAC_NR_H
#include "srslte/common/block_queue.h"
#include "srslte/common/logmap.h"
#include "srslte/common/mac_nr_pcap.h"
#include "srslte/mac/mac_nr_pdu.h"
@ -38,6 +39,7 @@ struct mac_nr_args_t {
// params for the dummy user
srsenb::sched_interface::sched_args_t sched;
uint16_t rnti;
uint32_t drb_lcid;
// Add args
std::string log_level;
@ -53,6 +55,7 @@ public:
int init(const mac_nr_args_t& args_,
phy_interface_stack_nr* phy,
stack_interface_mac* stack_,
rlc_interface_mac_nr* rlc_,
rrc_interface_mac_nr* rrc_);
void stop();
@ -69,16 +72,23 @@ public:
// Interface for PHY
int sf_indication(const uint32_t tti);
int rx_data_indication(stack_interface_phy_nr::rx_data_ind_t& grant);
void process_pdus();
private:
void get_dl_config(const uint32_t tti,
phy_interface_stack_nr::dl_config_request_t& config_request,
phy_interface_stack_nr::tx_request_t& tx_request);
// Interaction with PHY
phy_interface_stack_nr* phy_h = nullptr;
rlc_interface_mac_nr* rlc_h = nullptr;
rrc_interface_mac_nr* rrc_h = nullptr;
// PDU processing
int handle_pdu(srslte::unique_byte_buffer_t pdu);
// Interaction with other components
phy_interface_stack_nr* phy_h = nullptr;
stack_interface_mac* stack_h = nullptr;
rlc_interface_mac_nr* rlc_h = nullptr;
rrc_interface_mac_nr* rrc_h = nullptr;
std::unique_ptr<srslte::mac_nr_pcap> pcap = nullptr;
srslte::log_ref log_h;
@ -101,8 +111,12 @@ private:
// UE-specific buffer
srslte::mac_nr_sch_pdu ue_tx_pdu;
std::vector<srslte::unique_byte_buffer_t> ue_tx_buffer;
srslte::block_queue<srslte::unique_byte_buffer_t>
ue_rx_pdu_queue; ///< currently only DCH PDUs supported (add BCH, PCH, etc)
srslte::unique_byte_buffer_t ue_rlc_buffer;
srslte::mac_nr_sch_pdu ue_rx_pdu;
};
} // namespace srsenb

@ -35,8 +35,13 @@ gnb_stack_nr::gnb_stack_nr(srslte::logger* logger_) : logger(logger_), timers(12
m_gw.reset(new srsue::gw());
// m_gtpu.reset(new srsenb::gtpu());
ue_queue_id = pending_tasks.add_queue();
sync_queue_id = pending_tasks.add_queue();
gw_queue_id = pending_tasks.add_queue();
mac_queue_id = pending_tasks.add_queue();
background_queue_id = pending_tasks.add_queue();
background_tasks.start();
}
gnb_stack_nr::~gnb_stack_nr()
@ -74,7 +79,8 @@ int gnb_stack_nr::init(const srsenb::stack_args_t& args_, const rrc_nr_cfg_t& rr
mac_args.pcap = args.mac_pcap;
mac_args.sched = args.mac.sched;
mac_args.rnti = args.coreless.rnti;
m_mac->init(mac_args, phy, m_rlc.get(), m_rrc.get());
mac_args.drb_lcid = args.coreless.drb_lcid;
m_mac->init(mac_args, phy, this, m_rlc.get(), m_rrc.get());
m_rlc->init(m_pdcp.get(), m_rrc.get(), m_mac.get(), &timers);
@ -142,15 +148,20 @@ void gnb_stack_nr::run_thread()
void gnb_stack_nr::run_tti(uint32_t tti)
{
current_tti = tti;
pending_tasks.push(sync_queue_id, [this]() { run_tti_impl(); });
pending_tasks.push(sync_queue_id, [this, tti]() { run_tti_impl(tti); });
}
void gnb_stack_nr::run_tti_impl()
void gnb_stack_nr::run_tti_impl(uint32_t tti)
{
// m_ngap->run_tti();
timers.step_all();
}
void gnb_stack_nr::process_pdus()
{
pending_tasks.push(mac_queue_id, [this]() { m_mac->process_pdus(); });
}
/********************************************************
*
* Interface for upper layer timers
@ -169,6 +180,11 @@ int gnb_stack_nr::sf_indication(const uint32_t tti)
return m_mac->sf_indication(tti);
}
int gnb_stack_nr::rx_data_indication(rx_data_ind_t& grant)
{
return m_mac->rx_data_indication(grant);
}
// Temporary GW interface
void gnb_stack_nr::write_sdu(uint32_t lcid, srslte::unique_byte_buffer_t sdu, bool blocking)
{

@ -48,14 +48,16 @@ mac_nr::~mac_nr()
int mac_nr::init(const mac_nr_args_t& args_,
phy_interface_stack_nr* phy_,
stack_interface_mac* stack_,
rlc_interface_mac_nr* rlc_,
rrc_interface_mac_nr* rrc_)
{
args = args_;
phy_h = phy_;
rlc_h = rlc_;
rrc_h = rrc_;
phy_h = phy_;
stack_h = stack_;
rlc_h = rlc_;
rrc_h = rrc_;
log_h->set_level(args.log_level);
log_h->set_hex_limit(args.log_hex_limit);
@ -149,6 +151,11 @@ void mac_nr::get_dl_config(const uint32_t tti,
ue_tx_pdu.add_sdu(4, ue_rlc_buffer->msg, ue_rlc_buffer->N_bytes);
ue_tx_pdu.pack();
log_h->debug_hex(ue_tx_buffer.at(buffer_index)->msg,
ue_tx_buffer.at(buffer_index)->N_bytes,
"Generated MAC PDU (%d B)\n",
ue_tx_buffer.at(buffer_index)->N_bytes);
tx_request.pdus[tx_request.nof_pdus].data[0] = ue_tx_buffer.at(buffer_index)->msg;
tx_request.pdus[tx_request.nof_pdus].length = ue_tx_buffer.at(buffer_index)->N_bytes;
tx_request.pdus[tx_request.nof_pdus].index = tx_request.nof_pdus;
@ -188,6 +195,56 @@ int mac_nr::sf_indication(const uint32_t tti)
return SRSLTE_SUCCESS;
}
int mac_nr::rx_data_indication(stack_interface_phy_nr::rx_data_ind_t& rx_data)
{
// push received PDU on queue
if (rx_data.tb != nullptr) {
if (pcap) {
pcap->write_ul_crnti(rx_data.tb->msg, rx_data.tb->N_bytes, rx_data.rnti, true, rx_data.tti);
}
ue_rx_pdu_queue.push(std::move(rx_data.tb));
}
// inform stack that new PDUs may have been received
stack_h->process_pdus();
return SRSLTE_SUCCESS;
}
/**
* Called from the main stack thread to process received PDUs
*/
void mac_nr::process_pdus()
{
while (started and not ue_rx_pdu_queue.empty()) {
srslte::unique_byte_buffer_t pdu = ue_rx_pdu_queue.wait_pop();
/// TODO; delegate to demux class
handle_pdu(std::move(pdu));
}
}
int mac_nr::handle_pdu(srslte::unique_byte_buffer_t pdu)
{
log_h->info_hex(pdu->msg, pdu->N_bytes, "Handling MAC PDU (%d B)\n", pdu->N_bytes);
ue_rx_pdu.init_rx(true);
ue_rx_pdu.unpack(pdu->msg, pdu->N_bytes);
for (uint32_t i = 0; i < ue_rx_pdu.get_num_subpdus(); ++i) {
srslte::mac_nr_sch_subpdu subpdu = ue_rx_pdu.get_subpdu(i);
log_h->info("Handling subPDU %d/%d: lcid=%d, sdu_len=%d\n",
i,
ue_rx_pdu.get_num_subpdus(),
subpdu.get_lcid(),
subpdu.get_sdu_length());
if (subpdu.get_lcid() == args.drb_lcid) {
rlc_h->write_pdu(args.rnti, subpdu.get_lcid(), subpdu.get_sdu(), subpdu.get_sdu_length());
}
}
return SRSLTE_SUCCESS;
}
int mac_nr::cell_cfg(srsenb::sched_interface::cell_cfg_t* cell_cfg)
{
cfg = *cell_cfg;

Loading…
Cancel
Save