mirror of https://github.com/PentHertz/srsLTE.git
enb_stack_lte: use bearer manager class
* user common bearer manager in eNB * register/deregister bearers (LTE only so far * provide dummy stack class for RRC tests
This commit is contained in:
parent
3949a727a7
commit
b27d1d913e
|
@ -29,6 +29,7 @@
|
||||||
#include "upper/rlc.h"
|
#include "upper/rlc.h"
|
||||||
|
|
||||||
#include "enb_stack_base.h"
|
#include "enb_stack_base.h"
|
||||||
|
#include "srsran/common/bearer_manager.h"
|
||||||
#include "srsran/common/mac_pcap_net.h"
|
#include "srsran/common/mac_pcap_net.h"
|
||||||
#include "srsran/interfaces/enb_interfaces.h"
|
#include "srsran/interfaces/enb_interfaces.h"
|
||||||
#include "srsran/srslog/srslog.h"
|
#include "srsran/srslog/srslog.h"
|
||||||
|
@ -38,6 +39,7 @@ namespace srsenb {
|
||||||
class enb_stack_lte final : public enb_stack_base,
|
class enb_stack_lte final : public enb_stack_base,
|
||||||
public stack_interface_phy_lte,
|
public stack_interface_phy_lte,
|
||||||
public stack_interface_phy_nr,
|
public stack_interface_phy_nr,
|
||||||
|
public stack_interface_rrc,
|
||||||
public pdcp_interface_gtpu,
|
public pdcp_interface_gtpu,
|
||||||
public srsran::thread
|
public srsran::thread
|
||||||
{
|
{
|
||||||
|
@ -137,6 +139,11 @@ public:
|
||||||
void write_sdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_t sdu, int pdcp_sn = -1) override;
|
void write_sdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_t sdu, int pdcp_sn = -1) override;
|
||||||
std::map<uint32_t, srsran::unique_byte_buffer_t> get_buffered_pdus(uint16_t rnti, uint32_t lcid) override;
|
std::map<uint32_t, srsran::unique_byte_buffer_t> get_buffered_pdus(uint16_t rnti, uint32_t lcid) override;
|
||||||
|
|
||||||
|
// interface for bearer manager
|
||||||
|
void add_eps_bearer(uint16_t rnti, uint8_t eps_bearer_id, srsran::srsran_rat_t rat, uint32_t lcid) override;
|
||||||
|
void remove_eps_bearer(uint16_t rnti, uint8_t eps_bearer_id) override;
|
||||||
|
void reset_eps_bearers(uint16_t rnti) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const int STACK_MAIN_THREAD_PRIO = 4;
|
static const int STACK_MAIN_THREAD_PRIO = 4;
|
||||||
// thread loop
|
// thread loop
|
||||||
|
@ -184,6 +191,8 @@ private:
|
||||||
srsenb::pdcp pdcp_nr;
|
srsenb::pdcp pdcp_nr;
|
||||||
srsenb::rrc_nr rrc_nr;
|
srsenb::rrc_nr rrc_nr;
|
||||||
|
|
||||||
|
srsran::bearer_manager bearers; // helper to manage mapping between EPS and radio bearers
|
||||||
|
|
||||||
// RAT-specific interfaces
|
// RAT-specific interfaces
|
||||||
phy_interface_stack_lte* phy = nullptr;
|
phy_interface_stack_lte* phy = nullptr;
|
||||||
phy_interface_stack_nr* phy_nr = nullptr;
|
phy_interface_stack_nr* phy_nr = nullptr;
|
||||||
|
|
|
@ -53,7 +53,7 @@ class rrc final : public rrc_interface_pdcp,
|
||||||
public rrc_eutra_interface_rrc_nr
|
public rrc_eutra_interface_rrc_nr
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit rrc(srsran::task_sched_handle task_sched_);
|
explicit rrc(stack_interface_rrc* stack_, srsran::task_sched_handle task_sched_);
|
||||||
~rrc();
|
~rrc();
|
||||||
|
|
||||||
int32_t init(const rrc_cfg_t& cfg_,
|
int32_t init(const rrc_cfg_t& cfg_,
|
||||||
|
@ -166,6 +166,7 @@ public:
|
||||||
private:
|
private:
|
||||||
// args
|
// args
|
||||||
srsran::task_sched_handle task_sched;
|
srsran::task_sched_handle task_sched;
|
||||||
|
stack_interface_rrc* stack = nullptr;
|
||||||
phy_interface_rrc_lte* phy = nullptr;
|
phy_interface_rrc_lte* phy = nullptr;
|
||||||
mac_interface_rrc* mac = nullptr;
|
mac_interface_rrc* mac = nullptr;
|
||||||
rlc_interface_rrc* rlc = nullptr;
|
rlc_interface_rrc* rlc = nullptr;
|
||||||
|
|
|
@ -44,7 +44,7 @@ enb_stack_lte::enb_stack_lte(srslog::sink& log_sink) :
|
||||||
rlc_nr(rlc_nr_logger),
|
rlc_nr(rlc_nr_logger),
|
||||||
gtpu(&task_sched, gtpu_logger, &rx_sockets),
|
gtpu(&task_sched, gtpu_logger, &rx_sockets),
|
||||||
s1ap(&task_sched, s1ap_logger, &rx_sockets),
|
s1ap(&task_sched, s1ap_logger, &rx_sockets),
|
||||||
rrc(&task_sched),
|
rrc(this, &task_sched),
|
||||||
rrc_nr(&task_sched),
|
rrc_nr(&task_sched),
|
||||||
mac_pcap(),
|
mac_pcap(),
|
||||||
pending_stack_metrics(64)
|
pending_stack_metrics(64)
|
||||||
|
@ -278,17 +278,40 @@ void enb_stack_lte::run_thread()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void enb_stack_lte::write_sdu(uint16_t rnti,
|
void enb_stack_lte::write_sdu(uint16_t rnti, uint32_t eps_bearer_id, srsran::unique_byte_buffer_t sdu, int pdcp_sn)
|
||||||
uint32_t lcid /* to be replaced with eps_bearer_id */,
|
|
||||||
srsran::unique_byte_buffer_t sdu,
|
|
||||||
int pdcp_sn)
|
|
||||||
{
|
{
|
||||||
pdcp.write_sdu(rnti, lcid, std::move(sdu), pdcp_sn);
|
auto bearer = bearers.get_radio_bearer(rnti, eps_bearer_id);
|
||||||
|
auto task = [this, rnti, eps_bearer_id, bearer, pdcp_sn](srsran::unique_byte_buffer_t& sdu) {
|
||||||
|
// route SDU to PDCP entity
|
||||||
|
if (bearer.rat == srsran_rat_t::lte) {
|
||||||
|
pdcp.write_sdu(rnti, bearer.lcid, std::move(sdu), pdcp_sn);
|
||||||
|
} else if (bearer.rat == srsran_rat_t::nr) {
|
||||||
|
pdcp_nr.write_sdu(rnti, bearer.lcid, std::move(sdu), pdcp_sn);
|
||||||
|
} else {
|
||||||
|
stack_logger.warning("Can't deliver SDU for EPS bearer %d. Dropping it.", eps_bearer_id);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<uint32_t, srsran::unique_byte_buffer_t> enb_stack_lte::get_buffered_pdus(uint16_t rnti, uint32_t lcid)
|
std::map<uint32_t, srsran::unique_byte_buffer_t> enb_stack_lte::get_buffered_pdus(uint16_t rnti, uint32_t lcid)
|
||||||
{
|
{
|
||||||
|
// TODO: use eps_bearer_id as lookup too
|
||||||
return pdcp.get_buffered_pdus(rnti, lcid);
|
return pdcp.get_buffered_pdus(rnti, lcid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void enb_stack_lte::add_eps_bearer(uint16_t rnti, uint8_t eps_bearer_id, srsran::srsran_rat_t rat, uint32_t lcid)
|
||||||
|
{
|
||||||
|
bearers.add_eps_bearer(rnti, eps_bearer_id, rat, lcid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enb_stack_lte::remove_eps_bearer(uint16_t rnti, uint8_t eps_bearer_id)
|
||||||
|
{
|
||||||
|
bearers.remove_eps_bearer(rnti, eps_bearer_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enb_stack_lte::reset_eps_bearers(uint16_t rnti)
|
||||||
|
{
|
||||||
|
bearers.reset(rnti);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace srsenb
|
} // namespace srsenb
|
||||||
|
|
|
@ -32,8 +32,8 @@ using namespace asn1::rrc;
|
||||||
|
|
||||||
namespace srsenb {
|
namespace srsenb {
|
||||||
|
|
||||||
rrc::rrc(srsran::task_sched_handle task_sched_) :
|
rrc::rrc(stack_interface_rrc* stack_, srsran::task_sched_handle task_sched_) :
|
||||||
logger(srslog::fetch_basic_logger("RRC")), task_sched(task_sched_), rx_pdu_queue(128)
|
logger(srslog::fetch_basic_logger("RRC")), stack(stack_), task_sched(task_sched_), rx_pdu_queue(128)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
rrc::~rrc() {}
|
rrc::~rrc() {}
|
||||||
|
|
|
@ -1441,6 +1441,10 @@ void rrc::ue::apply_rlc_rb_updates(const rr_cfg_ded_s& pending_rr_cfg)
|
||||||
if (pending_rr_cfg.drb_to_release_list.size() > 0) {
|
if (pending_rr_cfg.drb_to_release_list.size() > 0) {
|
||||||
for (uint8_t drb_id : pending_rr_cfg.drb_to_release_list) {
|
for (uint8_t drb_id : pending_rr_cfg.drb_to_release_list) {
|
||||||
parent->rlc->del_bearer(rnti, drb_to_lcid((lte_drb)drb_id));
|
parent->rlc->del_bearer(rnti, drb_to_lcid((lte_drb)drb_id));
|
||||||
|
|
||||||
|
// deregister EPS bearer
|
||||||
|
uint8_t eps_bearer_id = 0; // FIXME: lookup EPS bearer ID for drb_id
|
||||||
|
parent->stack->remove_eps_bearer(rnti, eps_bearer_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const drb_to_add_mod_s& drb : pending_rr_cfg.drb_to_add_mod_list) {
|
for (const drb_to_add_mod_s& drb : pending_rr_cfg.drb_to_add_mod_list) {
|
||||||
|
@ -1454,6 +1458,9 @@ void rrc::ue::apply_rlc_rb_updates(const rr_cfg_ded_s& pending_rr_cfg)
|
||||||
rlc_cfg.am.max_retx_thresh = parent->cfg.qci_cfg.at(erab.qos_params.qci).enb_dl_max_retx_thres;
|
rlc_cfg.am.max_retx_thresh = parent->cfg.qci_cfg.at(erab.qos_params.qci).enb_dl_max_retx_thres;
|
||||||
}
|
}
|
||||||
parent->rlc->add_bearer(rnti, drb.lc_ch_id, rlc_cfg);
|
parent->rlc->add_bearer(rnti, drb.lc_ch_id, rlc_cfg);
|
||||||
|
|
||||||
|
// register EPS bearer over LTE PDCP
|
||||||
|
parent->stack->add_eps_bearer(rnti, drb.eps_bearer_id, srsran::srsran_rat_t::lte, drb.lc_ch_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,8 @@ int test_erab_setup(srsran::log_sink_spy& spy, bool qci_exists)
|
||||||
logger.set_hex_dump_max_size(1024);
|
logger.set_hex_dump_max_size(1024);
|
||||||
logger.set_level(srslog::basic_levels::info);
|
logger.set_level(srslog::basic_levels::info);
|
||||||
|
|
||||||
srsenb::rrc rrc{&task_sched};
|
test_dummies::enb_stack_dummy stack;
|
||||||
|
srsenb::rrc rrc{&stack, &task_sched};
|
||||||
mac_dummy mac;
|
mac_dummy mac;
|
||||||
rlc_dummy rlc;
|
rlc_dummy rlc;
|
||||||
test_dummies::pdcp_mobility_dummy pdcp;
|
test_dummies::pdcp_mobility_dummy pdcp;
|
||||||
|
|
|
@ -57,7 +57,7 @@ const char* to_string(test_event event)
|
||||||
|
|
||||||
struct mobility_tester {
|
struct mobility_tester {
|
||||||
explicit mobility_tester(const test_event& args_) :
|
explicit mobility_tester(const test_event& args_) :
|
||||||
args(args_), logger(srslog::fetch_basic_logger("RRC")), rrc(&task_sched)
|
args(args_), logger(srslog::fetch_basic_logger("RRC")), rrc(&stack, &task_sched)
|
||||||
{
|
{
|
||||||
logger.set_level(srslog::basic_levels::info);
|
logger.set_level(srslog::basic_levels::info);
|
||||||
logger.set_hex_dump_max_size(1024);
|
logger.set_hex_dump_max_size(1024);
|
||||||
|
@ -93,6 +93,7 @@ struct mobility_tester {
|
||||||
test_dummies::pdcp_mobility_dummy pdcp;
|
test_dummies::pdcp_mobility_dummy pdcp;
|
||||||
test_dummies::phy_mobility_dummy phy;
|
test_dummies::phy_mobility_dummy phy;
|
||||||
test_dummies::s1ap_mobility_dummy s1ap;
|
test_dummies::s1ap_mobility_dummy s1ap;
|
||||||
|
test_dummies::enb_stack_dummy stack;
|
||||||
gtpu_dummy gtpu;
|
gtpu_dummy gtpu;
|
||||||
|
|
||||||
void tic()
|
void tic()
|
||||||
|
|
|
@ -201,6 +201,13 @@ public:
|
||||||
phy_rrc_cfg_list_t last_cfg;
|
phy_rrc_cfg_list_t last_cfg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class enb_stack_dummy : public stack_interface_rrc
|
||||||
|
{
|
||||||
|
void add_eps_bearer(uint16_t rnti, uint8_t eps_bearer_id, srsran::srsran_rat_t rat, uint32_t lcid) {}
|
||||||
|
void remove_eps_bearer(uint16_t rnti, uint8_t eps_bearer_id) {}
|
||||||
|
void reset_eps_bearers(uint16_t rnti){};
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace test_dummies
|
} // namespace test_dummies
|
||||||
|
|
||||||
namespace test_helpers {
|
namespace test_helpers {
|
||||||
|
|
Loading…
Reference in New Issue