mirror of https://github.com/PentHertz/srsLTE.git
enb,rrc: add skeleton code for new RRC internal interface for SgNB addition
This commit is contained in:
parent
fd7b9a0575
commit
8d443d79e5
|
@ -49,7 +49,8 @@ static const char rrc_state_text[RRC_STATE_N_ITEMS][100] = {"IDLE",
|
|||
class rrc final : public rrc_interface_pdcp,
|
||||
public rrc_interface_mac,
|
||||
public rrc_interface_rlc,
|
||||
public rrc_interface_s1ap
|
||||
public rrc_interface_s1ap,
|
||||
public rrc_eutra_interface_rrc_nr
|
||||
{
|
||||
public:
|
||||
explicit rrc(srsran::task_sched_handle task_sched_);
|
||||
|
@ -63,6 +64,15 @@ public:
|
|||
s1ap_interface_rrc* s1ap,
|
||||
gtpu_interface_rrc* gtpu);
|
||||
|
||||
int32_t init(const rrc_cfg_t& cfg_,
|
||||
phy_interface_rrc_lte* phy,
|
||||
mac_interface_rrc* mac,
|
||||
rlc_interface_rrc* rlc,
|
||||
pdcp_interface_rrc* pdcp,
|
||||
s1ap_interface_rrc* s1ap,
|
||||
gtpu_interface_rrc* gtpu,
|
||||
rrc_nr_interface_rrc* rrc_nr);
|
||||
|
||||
void stop();
|
||||
void get_metrics(rrc_metrics_t& m);
|
||||
void tti_clock();
|
||||
|
@ -115,6 +125,12 @@ public:
|
|||
|
||||
int notify_ue_erab_updates(uint16_t rnti, srsran::const_byte_span nas_pdu) override;
|
||||
|
||||
// rrc_eutra_interface_rrc_nr
|
||||
void sgnb_addition_ack(uint16_t rnti,
|
||||
const asn1::dyn_octstring& nr_secondary_cell_group_cfg_r15,
|
||||
const asn1::dyn_octstring& nr_radio_bearer_cfg1_r15) override;
|
||||
void sgnb_addition_reject(uint16_t rnti) override;
|
||||
|
||||
// rrc_interface_pdcp
|
||||
void write_pdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_t pdu) override;
|
||||
void notify_pdcp_integrity_error(uint16_t rnti, uint32_t lcid) override;
|
||||
|
@ -155,6 +171,7 @@ private:
|
|||
pdcp_interface_rrc* pdcp = nullptr;
|
||||
gtpu_interface_rrc* gtpu = nullptr;
|
||||
s1ap_interface_rrc* s1ap = nullptr;
|
||||
rrc_nr_interface_rrc* rrc_nr = nullptr;
|
||||
srslog::basic_logger& logger;
|
||||
|
||||
// derived params
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
/**
|
||||
*
|
||||
* \section COPYRIGHT
|
||||
*
|
||||
* Copyright 2013-2021 Software Radio Systems Limited
|
||||
*
|
||||
* By using this file, you agree to the terms and conditions set
|
||||
* forth in the LICENSE file which can be found at the top level of
|
||||
* the distribution.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SRSENB_RRC_ENDC_H
|
||||
#define SRSENB_RRC_ENDC_H
|
||||
|
||||
#include "rrc.h"
|
||||
#include "rrc_ue.h"
|
||||
#include "srsran/adt/fsm.h"
|
||||
#include <map>
|
||||
|
||||
namespace srsenb {
|
||||
|
||||
/**
|
||||
* @brief This procedure handles the secondary node (SgNB) addition for
|
||||
* EUTRA-NR Dual connectivity (ENDC)
|
||||
*
|
||||
*/
|
||||
|
||||
class rrc::ue::rrc_endc : public srsran::fsm_t<rrc::ue::rrc_endc>
|
||||
{
|
||||
public:
|
||||
// public events
|
||||
struct user_crnti_upd_ev {
|
||||
uint16_t crnti;
|
||||
uint16_t temp_crnti;
|
||||
};
|
||||
struct ho_cancel_ev {
|
||||
asn1::s1ap::cause_c cause;
|
||||
|
||||
ho_cancel_ev(const asn1::s1ap::cause_c& cause_) : cause(cause_) {}
|
||||
};
|
||||
|
||||
rrc_endc(srsenb::rrc::ue* outer_ue);
|
||||
|
||||
bool fill_conn_recfg(asn1::rrc::rrc_conn_recfg_r8_ies_s* conn_recfg);
|
||||
void handle_ue_meas_report(const asn1::rrc::meas_report_s& msg, srsran::unique_byte_buffer_t pdu);
|
||||
|
||||
void handle_sgnb_addition_ack(const asn1::dyn_octstring& nr_secondary_cell_group_cfg_r15,
|
||||
const asn1::dyn_octstring& nr_radio_bearer_cfg1_r15);
|
||||
void handle_sgnb_addition_reject();
|
||||
|
||||
private:
|
||||
// Send SgNB addition request to gNB
|
||||
bool start_sgnb_addition();
|
||||
|
||||
bool is_endc_activation_running() const { return not is_in_state<idle_st>(); }
|
||||
|
||||
rrc::ue* rrc_ue = nullptr;
|
||||
rrc* rrc_enb = nullptr;
|
||||
srslog::basic_logger& logger;
|
||||
|
||||
// vars
|
||||
asn1::rrc::rrc_conn_recfg_complete_s pending_recfg_complete;
|
||||
|
||||
// events
|
||||
struct sgnb_add_req_sent_ev {};
|
||||
struct sgnb_add_req_ack_ev {};
|
||||
struct sgnb_add_req_reject_ev {};
|
||||
struct prach_nr_received_ev {};
|
||||
|
||||
using recfg_complete_ev = asn1::rrc::rrc_conn_recfg_complete_s;
|
||||
using status_transfer_ev = asn1::s1ap::bearers_subject_to_status_transfer_list_l;
|
||||
|
||||
// states
|
||||
struct idle_st {};
|
||||
struct wait_sgnb_add_req_resp {};
|
||||
struct wait_recfg_comp {};
|
||||
struct wait_prach_nr {};
|
||||
|
||||
// FSM guards
|
||||
|
||||
// FSM transition handlers
|
||||
void handle_recfg_complete(wait_recfg_comp& s, const recfg_complete_ev& ev);
|
||||
void handle_sgnb_addition_request_sent(const sgnb_add_req_sent_ev& ev);
|
||||
|
||||
protected:
|
||||
// states
|
||||
state_list<idle_st, wait_sgnb_add_req_resp, wait_recfg_comp, wait_prach_nr> states{this,
|
||||
idle_st{},
|
||||
wait_sgnb_add_req_resp{},
|
||||
wait_recfg_comp{},
|
||||
wait_prach_nr{}};
|
||||
|
||||
// transitions
|
||||
using fsm = rrc_endc;
|
||||
// clang-format off
|
||||
using transitions = transition_table<
|
||||
// Start Target Event Action Guard
|
||||
// +-----------------------+-----------------------+------------------------+----------------------------+-------------------------+
|
||||
row< idle_st, wait_sgnb_add_req_resp, sgnb_add_req_sent_ev, nullptr >,
|
||||
// +-----------------------+-----------------------+------------------------+----------------------------+-------------------------+
|
||||
row< wait_sgnb_add_req_resp, wait_recfg_comp, sgnb_add_req_ack_ev >,
|
||||
row< wait_sgnb_add_req_resp, idle_st, sgnb_add_req_reject_ev >,
|
||||
row< wait_recfg_comp, idle_st, recfg_complete_ev, &fsm::handle_recfg_complete >
|
||||
// +----------------+-------------------+---------------------+----------------------------+-------------------------+
|
||||
>;
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
} // namespace srsenb
|
||||
|
||||
#endif // SRSENB_RRC_ENDC_H
|
|
@ -23,6 +23,7 @@
|
|||
#include "srsran/common/task_scheduler.h"
|
||||
#include "srsran/common/threads.h"
|
||||
#include "srsran/common/timeout.h"
|
||||
#include "srsran/interfaces/enb_rrc_interfaces.h"
|
||||
#include "srsran/interfaces/gnb_interfaces.h"
|
||||
#include "srsran/interfaces/gnb_ngap_interfaces.h"
|
||||
#include "srsran/interfaces/gnb_rrc_nr_interfaces.h"
|
||||
|
@ -60,18 +61,20 @@ struct rrc_nr_cfg_t {
|
|||
class rrc_nr final : public rrc_interface_pdcp_nr,
|
||||
public rrc_interface_mac_nr,
|
||||
public rrc_interface_rlc_nr,
|
||||
public rrc_interface_ngap_nr
|
||||
public rrc_interface_ngap_nr,
|
||||
public rrc_nr_interface_rrc
|
||||
{
|
||||
public:
|
||||
explicit rrc_nr(srsran::task_sched_handle task_sched_);
|
||||
|
||||
int32_t init(const rrc_nr_cfg_t& cfg,
|
||||
phy_interface_stack_nr* phy,
|
||||
mac_interface_rrc_nr* mac,
|
||||
rlc_interface_rrc_nr* rlc,
|
||||
pdcp_interface_rrc_nr* pdcp,
|
||||
ngap_interface_rrc_nr* ngap_,
|
||||
gtpu_interface_rrc_nr* gtpu);
|
||||
int32_t init(const rrc_nr_cfg_t& cfg,
|
||||
phy_interface_stack_nr* phy,
|
||||
mac_interface_rrc_nr* mac,
|
||||
rlc_interface_rrc_nr* rlc,
|
||||
pdcp_interface_rrc_nr* pdcp,
|
||||
ngap_interface_rrc_nr* ngap_,
|
||||
gtpu_interface_rrc_nr* gtpu,
|
||||
rrc_eutra_interface_rrc_nr* rrc_eutra_);
|
||||
|
||||
void stop();
|
||||
|
||||
|
@ -95,6 +98,10 @@ public:
|
|||
void write_pdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_t pdu) final;
|
||||
void notify_pdcp_integrity_error(uint16_t rnti, uint32_t lcid) final;
|
||||
|
||||
// Interface for EUTRA RRC
|
||||
int sgnb_addition_request(uint16_t rnti);
|
||||
int sgnb_reconfiguration_complete(uint16_t rnti, asn1::dyn_octstring reconfig_response);
|
||||
|
||||
class ue
|
||||
{
|
||||
public:
|
||||
|
@ -103,6 +110,8 @@ public:
|
|||
void send_connection_setup();
|
||||
void send_dl_ccch(asn1::rrc_nr::dl_ccch_msg_s* dl_dcch_msg);
|
||||
|
||||
int handle_sgnb_addition_request();
|
||||
|
||||
// getters
|
||||
bool is_connected() { return state == rrc_nr_state_t::RRC_CONNECTED; }
|
||||
bool is_idle() { return state == rrc_nr_state_t::RRC_IDLE; }
|
||||
|
@ -130,6 +139,7 @@ private:
|
|||
pdcp_interface_rrc_nr* pdcp = nullptr;
|
||||
gtpu_interface_rrc_nr* gtpu = nullptr;
|
||||
ngap_interface_rrc_nr* ngap = nullptr;
|
||||
rrc_eutra_interface_rrc_nr* rrc_eutra = nullptr;
|
||||
|
||||
// args
|
||||
srsran::task_sched_handle task_sched;
|
||||
|
|
|
@ -25,6 +25,7 @@ class rrc::ue
|
|||
{
|
||||
public:
|
||||
class rrc_mobility;
|
||||
class rrc_endc;
|
||||
enum activity_timeout_type_t {
|
||||
MSG3_RX_TIMEOUT = 0, ///< Msg3 has its own timeout to quickly remove fake UEs from random PRACHs
|
||||
UE_INACTIVITY_TIMEOUT, ///< UE inactivity timeout (usually bigger than reestablishment timeout)
|
||||
|
@ -108,6 +109,11 @@ public:
|
|||
bool handle_ue_ctxt_mod_req(const asn1::s1ap::ue_context_mod_request_s& msg);
|
||||
void handle_ue_info_resp(const asn1::rrc::ue_info_resp_r9_s& msg, srsran::unique_byte_buffer_t pdu);
|
||||
|
||||
// SgNB handler
|
||||
void handle_sgnb_addition_ack(const asn1::dyn_octstring& nr_secondary_cell_group_cfg_r15,
|
||||
const asn1::dyn_octstring& nr_radio_bearer_cfg1_r15);
|
||||
void handle_sgnb_addition_reject();
|
||||
|
||||
void set_bitrates(const asn1::s1ap::ue_aggregate_maximum_bitrate_s& rates);
|
||||
|
||||
/// Helper to check UE ERABs
|
||||
|
@ -154,6 +160,7 @@ public:
|
|||
|
||||
bool connect_notified = false;
|
||||
unique_rnti_ptr<rrc_mobility> mobility_handler;
|
||||
unique_rnti_ptr<rrc_endc> endc_handler;
|
||||
|
||||
bool is_csfb = false;
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ int enb_stack_lte::init(const stack_args_t& args_, const rrc_cfg_t& rrc_cfg_)
|
|||
}
|
||||
rlc.init(&pdcp, &rrc, &mac, task_sched.get_timer_handler());
|
||||
pdcp.init(&rlc, &rrc, >pu);
|
||||
if (rrc.init(rrc_cfg, phy, &mac, &rlc, &pdcp, &s1ap, >pu) != SRSRAN_SUCCESS) {
|
||||
if (rrc.init(rrc_cfg, phy, &mac, &rlc, &pdcp, &s1ap, >pu, &rrc_nr) != SRSRAN_SUCCESS) {
|
||||
stack_logger.error("Couldn't initialize RRC");
|
||||
return SRSRAN_ERROR;
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ int gnb_stack_nr::init(const srsenb::stack_args_t& args_, const rrc_nr_cfg_t& rr
|
|||
pdcp_args.log_hex_limit = args.log.pdcp_hex_limit;
|
||||
m_pdcp->init(pdcp_args, m_rlc.get(), m_rrc.get(), m_sdap.get());
|
||||
|
||||
m_rrc->init(rrc_cfg_, phy, m_mac.get(), m_rlc.get(), m_pdcp.get(), nullptr, nullptr);
|
||||
m_rrc->init(rrc_cfg_, phy, m_mac.get(), m_rlc.get(), m_pdcp.get(), nullptr, nullptr, nullptr);
|
||||
|
||||
m_sdap->init(m_pdcp.get(), nullptr, m_gw.get());
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
# the distribution.
|
||||
#
|
||||
|
||||
set(SOURCES rrc.cc rrc_ue.cc rrc_mobility.cc rrc_cell_cfg.cc rrc_bearer_cfg.cc mac_controller.cc ue_rr_cfg.cc ue_meas_cfg.cc)
|
||||
set(SOURCES rrc.cc rrc_ue.cc rrc_mobility.cc rrc_cell_cfg.cc rrc_bearer_cfg.cc mac_controller.cc ue_rr_cfg.cc ue_meas_cfg.cc rrc_endc.cc)
|
||||
add_library(srsenb_rrc STATIC ${SOURCES})
|
||||
|
||||
set(SOURCES rrc_nr.cc)
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "srsenb/hdr/stack/rrc/rrc.h"
|
||||
#include "srsenb/hdr/stack/rrc/rrc_cell_cfg.h"
|
||||
#include "srsenb/hdr/stack/rrc/rrc_endc.h"
|
||||
#include "srsenb/hdr/stack/rrc/rrc_mobility.h"
|
||||
#include "srsenb/hdr/stack/rrc/rrc_paging.h"
|
||||
#include "srsenb/hdr/stack/s1ap/s1ap.h"
|
||||
|
@ -45,12 +46,25 @@ int32_t rrc::init(const rrc_cfg_t& cfg_,
|
|||
s1ap_interface_rrc* s1ap_,
|
||||
gtpu_interface_rrc* gtpu_)
|
||||
{
|
||||
phy = phy_;
|
||||
mac = mac_;
|
||||
rlc = rlc_;
|
||||
pdcp = pdcp_;
|
||||
gtpu = gtpu_;
|
||||
s1ap = s1ap_;
|
||||
return init(cfg_, phy_, mac_, rlc_, pdcp_, s1ap_, gtpu_, nullptr);
|
||||
}
|
||||
|
||||
int32_t rrc::init(const rrc_cfg_t& cfg_,
|
||||
phy_interface_rrc_lte* phy_,
|
||||
mac_interface_rrc* mac_,
|
||||
rlc_interface_rrc* rlc_,
|
||||
pdcp_interface_rrc* pdcp_,
|
||||
s1ap_interface_rrc* s1ap_,
|
||||
gtpu_interface_rrc* gtpu_,
|
||||
rrc_nr_interface_rrc* rrc_nr_)
|
||||
{
|
||||
phy = phy_;
|
||||
mac = mac_;
|
||||
rlc = rlc_;
|
||||
pdcp = pdcp_;
|
||||
gtpu = gtpu_;
|
||||
s1ap = s1ap_;
|
||||
rrc_nr = rrc_nr_;
|
||||
|
||||
cfg = cfg_;
|
||||
|
||||
|
@ -528,6 +542,22 @@ void rrc::set_erab_status(uint16_t rnti, const asn1::s1ap::bearers_subject_to_st
|
|||
ue_it->second->mobility_handler->trigger(erabs);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
EN-DC/NSA helper functions
|
||||
*******************************************************************************/
|
||||
|
||||
void rrc::sgnb_addition_ack(uint16_t rnti,
|
||||
const asn1::dyn_octstring& nr_secondary_cell_group_cfg_r15,
|
||||
const asn1::dyn_octstring& nr_radio_bearer_cfg1_r15)
|
||||
{
|
||||
users.at(rnti)->endc_handler->handle_sgnb_addition_ack(nr_secondary_cell_group_cfg_r15, nr_radio_bearer_cfg1_r15);
|
||||
}
|
||||
|
||||
void rrc::sgnb_addition_reject(uint16_t rnti)
|
||||
{
|
||||
users.at(rnti)->endc_handler->handle_sgnb_addition_reject();
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
Private functions
|
||||
All private functions are not mutexed and must be called from a mutexed environment
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
/**
|
||||
*
|
||||
* \section COPYRIGHT
|
||||
*
|
||||
* Copyright 2013-2021 Software Radio Systems Limited
|
||||
*
|
||||
* By using this file, you agree to the terms and conditions set
|
||||
* forth in the LICENSE file which can be found at the top level of
|
||||
* the distribution.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "srsenb/hdr/stack/rrc/rrc_endc.h"
|
||||
|
||||
namespace srsenb {
|
||||
|
||||
#define Info(fmt, ...) logger.info("ENDC: " fmt, ##__VA_ARGS__)
|
||||
#define Error(fmt, ...) logger.error("ENDC: " fmt, ##__VA_ARGS__)
|
||||
#define Warning(fmt, ...) logger.warning("ENDC: " fmt, ##__VA_ARGS__)
|
||||
#define Debug(fmt, ...) logger.debug("ENDC: " fmt, ##__VA_ARGS__)
|
||||
|
||||
#define procInfo(fmt, ...) parent->logger.info("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||
#define procWarning(fmt, ...) parent->logger.warning("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||
#define procError(fmt, ...) parent->logger.error("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||
|
||||
using namespace asn1::rrc;
|
||||
|
||||
/*************************************************************************************************
|
||||
* rrc_endc class
|
||||
************************************************************************************************/
|
||||
|
||||
rrc::ue::rrc_endc::rrc_endc(rrc::ue* outer_ue) :
|
||||
base_t(outer_ue->parent->logger), rrc_ue(outer_ue), rrc_enb(outer_ue->parent), logger(outer_ue->parent->logger)
|
||||
{}
|
||||
|
||||
//! Method to add NR fields to a RRC Connection Reconfiguration Message
|
||||
bool rrc::ue::rrc_endc::fill_conn_recfg(asn1::rrc::rrc_conn_recfg_r8_ies_s* conn_recfg)
|
||||
{
|
||||
if (not is_endc_activation_running()) {
|
||||
// TODO: add measConfig related field to enable measurements on NR carrier
|
||||
return false;
|
||||
} else {
|
||||
// only add reconfigure EN-DC extension/release 15.10 field if ENDC activation is active
|
||||
conn_recfg->non_crit_ext_present = true;
|
||||
conn_recfg->non_crit_ext.non_crit_ext_present = true;
|
||||
conn_recfg->non_crit_ext.non_crit_ext.non_crit_ext_present = true;
|
||||
conn_recfg->non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext_present = true;
|
||||
conn_recfg->non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext_present = true;
|
||||
conn_recfg->non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext_present = true;
|
||||
conn_recfg->non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext_present =
|
||||
true;
|
||||
conn_recfg->non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext
|
||||
.non_crit_ext_present = true;
|
||||
rrc_conn_recfg_v1510_ies_s& reconf_v1510 = conn_recfg->non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext
|
||||
.non_crit_ext.non_crit_ext.non_crit_ext.non_crit_ext;
|
||||
reconf_v1510.nr_cfg_r15_present = true;
|
||||
reconf_v1510.sk_counter_r15_present = true;
|
||||
reconf_v1510.sk_counter_r15 = 0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//! Method called whenever the eNB receives a MeasReport from the UE
|
||||
void rrc::ue::rrc_endc::handle_ue_meas_report(const meas_report_s& msg, srsran::unique_byte_buffer_t pdu)
|
||||
{
|
||||
// Start EN-DC activation
|
||||
logger.info("Triggering SgNB addition");
|
||||
rrc_enb->rrc_nr->sgnb_addition_request(rrc_ue->rnti);
|
||||
}
|
||||
|
||||
void rrc::ue::rrc_endc::handle_sgnb_addition_ack(const asn1::dyn_octstring& nr_secondary_cell_group_cfg_r15,
|
||||
const asn1::dyn_octstring& nr_radio_bearer_cfg1_r15)
|
||||
{
|
||||
logger.info("Received SgNB addition acknowledgement for rnti=%d", rrc_ue->rnti);
|
||||
|
||||
// prepare reconfiguration message with NR fields
|
||||
srsran::unique_byte_buffer_t pdu = srsran::make_byte_buffer();
|
||||
if (pdu == nullptr) {
|
||||
logger.error("Couldn't allocate PDU in %s().", __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
// rrc_enb->send_connection_reconf(std::move(pdu));
|
||||
}
|
||||
|
||||
void rrc::ue::rrc_endc::handle_sgnb_addition_reject()
|
||||
{
|
||||
logger.error("Received SgNB addition reject for rnti=%d", rrc_ue->rnti);
|
||||
}
|
||||
|
||||
void rrc::ue::rrc_endc::handle_recfg_complete(wait_recfg_comp& s, const recfg_complete_ev& ev)
|
||||
{
|
||||
logger.info("User rnti=0x%x successfully enabled EN-DC", rrc_ue->rnti);
|
||||
}
|
||||
|
||||
} // namespace srsenb
|
|
@ -23,13 +23,14 @@ rrc_nr::rrc_nr(srsran::task_sched_handle task_sched_) :
|
|||
logger(srslog::fetch_basic_logger("RRC-NR")), task_sched(task_sched_)
|
||||
{}
|
||||
|
||||
int rrc_nr::init(const rrc_nr_cfg_t& cfg_,
|
||||
phy_interface_stack_nr* phy_,
|
||||
mac_interface_rrc_nr* mac_,
|
||||
rlc_interface_rrc_nr* rlc_,
|
||||
pdcp_interface_rrc_nr* pdcp_,
|
||||
ngap_interface_rrc_nr* ngap_,
|
||||
gtpu_interface_rrc_nr* gtpu_)
|
||||
int rrc_nr::init(const rrc_nr_cfg_t& cfg_,
|
||||
phy_interface_stack_nr* phy_,
|
||||
mac_interface_rrc_nr* mac_,
|
||||
rlc_interface_rrc_nr* rlc_,
|
||||
pdcp_interface_rrc_nr* pdcp_,
|
||||
ngap_interface_rrc_nr* ngap_,
|
||||
gtpu_interface_rrc_nr* gtpu_,
|
||||
rrc_eutra_interface_rrc_nr* rrc_eutra_)
|
||||
{
|
||||
phy = phy_;
|
||||
mac = mac_;
|
||||
|
@ -350,6 +351,23 @@ void rrc_nr::write_pdu(uint16_t rnti, uint32_t lcid, srsran::unique_byte_buffer_
|
|||
|
||||
void rrc_nr::notify_pdcp_integrity_error(uint16_t rnti, uint32_t lcid) {}
|
||||
|
||||
/*******************************************************************************
|
||||
Interface for EUTRA RRC
|
||||
*******************************************************************************/
|
||||
|
||||
int rrc_nr::sgnb_addition_request(uint16_t rnti)
|
||||
{
|
||||
// try to allocate new user
|
||||
task_sched.defer_task([]() {});
|
||||
|
||||
// return straight away
|
||||
return SRSRAN_SUCCESS;
|
||||
}
|
||||
int rrc_nr::sgnb_reconfiguration_complete(uint16_t rnti, asn1::dyn_octstring reconfig_response)
|
||||
{
|
||||
return SRSRAN_SUCCESS;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
UE class
|
||||
|
||||
|
@ -409,4 +427,27 @@ void rrc_nr::ue::send_dl_ccch(dl_ccch_msg_s* dl_ccch_msg)
|
|||
parent->rlc->write_sdu(rnti, (uint32_t)srsran::nr_srb::srb0, std::move(pdu));
|
||||
}
|
||||
|
||||
int rrc_nr::ue::handle_sgnb_addition_request()
|
||||
{
|
||||
// provide hard-coded NR configs
|
||||
asn1::dyn_octstring nr_config;
|
||||
|
||||
rrc_recfg_s reconfig;
|
||||
reconfig.rrc_transaction_id = ((transaction_id++) % 4u);
|
||||
rrc_recfg_ies_s& recfg_ies = reconfig.crit_exts.set_rrc_recfg();
|
||||
|
||||
recfg_ies.radio_bearer_cfg_present = true;
|
||||
recfg_ies.radio_bearer_cfg.drb_to_add_mod_list_present = true;
|
||||
recfg_ies.radio_bearer_cfg.drb_to_release_list.resize(1);
|
||||
// recfg_ies.radio_bearer_cfg.drb_to_release_list[0].set_eps_bearer_id(5);
|
||||
|
||||
// TODO: fill configs
|
||||
asn1::dyn_octstring nr_secondary_cell_group_cfg;
|
||||
asn1::dyn_octstring nr_radio_bearer_config;
|
||||
|
||||
parent->rrc_eutra->sgnb_addition_ack(rnti, nr_secondary_cell_group_cfg, nr_radio_bearer_config);
|
||||
|
||||
return SRSRAN_SUCCESS;
|
||||
}
|
||||
|
||||
} // namespace srsenb
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "srsenb/hdr/stack/rrc/rrc_ue.h"
|
||||
#include "srsenb/hdr/common/common_enb.h"
|
||||
#include "srsenb/hdr/stack/rrc/mac_controller.h"
|
||||
#include "srsenb/hdr/stack/rrc/rrc_endc.h"
|
||||
#include "srsenb/hdr/stack/rrc/rrc_mobility.h"
|
||||
#include "srsenb/hdr/stack/rrc/ue_rr_cfg.h"
|
||||
#include "srsran/asn1/rrc_utils.h"
|
||||
|
@ -78,6 +79,8 @@ int rrc::ue::init()
|
|||
}
|
||||
|
||||
mobility_handler = make_rnti_obj<rrc_mobility>(rnti, this);
|
||||
endc_handler = make_rnti_obj<rrc_endc>(rnti, this);
|
||||
|
||||
return SRSRAN_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -785,6 +788,10 @@ void rrc::ue::send_connection_reconf(srsran::unique_byte_buffer_t pdu,
|
|||
}
|
||||
}
|
||||
|
||||
if (endc_handler != nullptr) {
|
||||
endc_handler->fill_conn_recfg(&recfg_r8);
|
||||
}
|
||||
|
||||
// Reuse same PDU
|
||||
if (pdu != nullptr) {
|
||||
pdu->clear();
|
||||
|
@ -1141,6 +1148,18 @@ void rrc::ue::update_scells()
|
|||
parent->logger.info("SCells activated for rnti=0x%x", rnti);
|
||||
}
|
||||
|
||||
/// EN-DC helper
|
||||
void rrc::ue::handle_sgnb_addition_ack(const asn1::dyn_octstring& nr_secondary_cell_group_cfg_r15,
|
||||
const asn1::dyn_octstring& nr_radio_bearer_cfg1_r15)
|
||||
{
|
||||
endc_handler->handle_sgnb_addition_ack(nr_secondary_cell_group_cfg_r15, nr_radio_bearer_cfg1_r15);
|
||||
}
|
||||
|
||||
void rrc::ue::handle_sgnb_addition_reject()
|
||||
{
|
||||
endc_handler->handle_sgnb_addition_reject();
|
||||
}
|
||||
|
||||
/********************** HELPERS ***************************/
|
||||
|
||||
void rrc::ue::send_dl_ccch(dl_ccch_msg_s* dl_ccch_msg, std::string* octet_str)
|
||||
|
|
|
@ -47,7 +47,8 @@ int test_sib_generation()
|
|||
rrc_nr_cfg_t rrc_cfg = rrc_obj.update_default_cfg(default_cfg);
|
||||
auto& sched_elem = rrc_cfg.sib1.si_sched_info.sched_info_list[0];
|
||||
|
||||
TESTASSERT(rrc_obj.init(rrc_cfg, nullptr, &mac_obj, &rlc_obj, &pdcp_obj, nullptr, nullptr) == SRSRAN_SUCCESS);
|
||||
TESTASSERT(rrc_obj.init(rrc_cfg, nullptr, &mac_obj, &rlc_obj, &pdcp_obj, nullptr, nullptr, nullptr) ==
|
||||
SRSRAN_SUCCESS);
|
||||
|
||||
TESTASSERT(test_cell_cfg(mac_obj.cellcfgobj) == SRSRAN_SUCCESS);
|
||||
// TEMP tests
|
||||
|
@ -73,7 +74,8 @@ int test_rrc_setup()
|
|||
// set cfg
|
||||
rrc_nr_cfg_t default_cfg = {};
|
||||
rrc_nr_cfg_t rrc_cfg = rrc_obj.update_default_cfg(default_cfg);
|
||||
TESTASSERT(rrc_obj.init(rrc_cfg, nullptr, &mac_obj, &rlc_obj, &pdcp_obj, nullptr, nullptr) == SRSRAN_SUCCESS);
|
||||
TESTASSERT(rrc_obj.init(rrc_cfg, nullptr, &mac_obj, &rlc_obj, &pdcp_obj, nullptr, nullptr, nullptr) ==
|
||||
SRSRAN_SUCCESS);
|
||||
|
||||
for (uint32_t n = 0; n < 2; ++n) {
|
||||
uint32_t timeout = 5500;
|
||||
|
|
Loading…
Reference in New Issue