mirror of https://github.com/pvnis/srsRAN_4G.git
ue,rrc_nr: refactor reconfig procedure to own source file
preparation to add next proceduremaster
parent
ccd4334672
commit
7227f03314
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \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 "srsran/srslog/srslog.h"
|
||||||
|
#include "srsue/hdr/stack/rrc_nr/rrc_nr.h"
|
||||||
|
|
||||||
|
#ifndef SRSRAN_RRC_NR_PROCEDURES_H
|
||||||
|
#define SRSRAN_RRC_NR_PROCEDURES_H
|
||||||
|
|
||||||
|
namespace srsue {
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Procedures
|
||||||
|
*******************************/
|
||||||
|
|
||||||
|
class rrc_nr::connection_reconf_no_ho_proc
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit connection_reconf_no_ho_proc(rrc_nr* parent_);
|
||||||
|
srsran::proc_outcome_t init(const reconf_initiator_t initiator_,
|
||||||
|
const bool endc_release_and_add_r15,
|
||||||
|
const bool nr_secondary_cell_group_cfg_r15_present,
|
||||||
|
const asn1::dyn_octstring nr_secondary_cell_group_cfg_r15,
|
||||||
|
const bool sk_counter_r15_present,
|
||||||
|
const uint32_t sk_counter_r15,
|
||||||
|
const bool nr_radio_bearer_cfg1_r15_present,
|
||||||
|
const asn1::dyn_octstring nr_radio_bearer_cfg1_r15);
|
||||||
|
srsran::proc_outcome_t step() { return srsran::proc_outcome_t::yield; }
|
||||||
|
static const char* name() { return "NR Connection Reconfiguration"; }
|
||||||
|
srsran::proc_outcome_t react(const bool& config_complete);
|
||||||
|
void then(const srsran::proc_state_t& result);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// const
|
||||||
|
rrc_nr* rrc_ptr = nullptr;
|
||||||
|
reconf_initiator_t initiator;
|
||||||
|
asn1::rrc_nr::rrc_recfg_s rrc_recfg;
|
||||||
|
asn1::rrc_nr::cell_group_cfg_s cell_group_cfg;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace srsue
|
||||||
|
|
||||||
|
#endif // SRSRAN_RRC_NR_PROCEDURES_H
|
@ -0,0 +1,160 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \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 "srsue/hdr/stack/rrc_nr/rrc_nr_procedures.h"
|
||||||
|
#include "srsran/common/standard_streams.h"
|
||||||
|
|
||||||
|
#define Error(fmt, ...) rrc_ptr->logger.error("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||||
|
#define Warning(fmt, ...) rrc_ptr->logger.warning("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||||
|
#define Info(fmt, ...) rrc_ptr->logger.info("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||||
|
#define Debug(fmt, ...) rrc_ptr->logger.debug("Proc \"%s\" - " fmt, name(), ##__VA_ARGS__)
|
||||||
|
|
||||||
|
using namespace asn1::rrc_nr;
|
||||||
|
using namespace asn1;
|
||||||
|
using namespace srsran;
|
||||||
|
|
||||||
|
namespace srsue {
|
||||||
|
|
||||||
|
rrc_nr::connection_reconf_no_ho_proc::connection_reconf_no_ho_proc(rrc_nr* parent_) : rrc_ptr(parent_), initiator(nr) {}
|
||||||
|
|
||||||
|
proc_outcome_t rrc_nr::connection_reconf_no_ho_proc::init(const reconf_initiator_t initiator_,
|
||||||
|
const bool endc_release_and_add_r15,
|
||||||
|
const bool nr_secondary_cell_group_cfg_r15_present,
|
||||||
|
const asn1::dyn_octstring nr_secondary_cell_group_cfg_r15,
|
||||||
|
const bool sk_counter_r15_present,
|
||||||
|
const uint32_t sk_counter_r15,
|
||||||
|
const bool nr_radio_bearer_cfg1_r15_present,
|
||||||
|
const asn1::dyn_octstring nr_radio_bearer_cfg1_r15)
|
||||||
|
{
|
||||||
|
Info("Starting...");
|
||||||
|
initiator = initiator_;
|
||||||
|
|
||||||
|
rrc_recfg_s rrc_recfg;
|
||||||
|
cell_group_cfg_s cell_group_cfg;
|
||||||
|
radio_bearer_cfg_s radio_bearer_cfg;
|
||||||
|
asn1::SRSASN_CODE err;
|
||||||
|
|
||||||
|
if (nr_secondary_cell_group_cfg_r15_present) {
|
||||||
|
cbit_ref bref(nr_secondary_cell_group_cfg_r15.data(), nr_secondary_cell_group_cfg_r15.size());
|
||||||
|
err = rrc_recfg.unpack(bref);
|
||||||
|
if (err != asn1::SRSASN_SUCCESS) {
|
||||||
|
Error("Could not unpack NR reconfiguration message.");
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
rrc_ptr->log_rrc_message(
|
||||||
|
"RRC NR Reconfiguration", Rx, nr_secondary_cell_group_cfg_r15, rrc_recfg, "NR Secondary Cell Group Cfg R15");
|
||||||
|
#endif
|
||||||
|
if (rrc_recfg.crit_exts.type() != asn1::rrc_nr::rrc_recfg_s::crit_exts_c_::types::rrc_recfg) {
|
||||||
|
Error("Reconfiguration does not contain Secondary Cell Group Config");
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (not rrc_recfg.crit_exts.rrc_recfg().secondary_cell_group_present) {
|
||||||
|
Error("Reconfiguration does not contain Secondary Cell Group Config");
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
|
||||||
|
cbit_ref bref0(rrc_recfg.crit_exts.rrc_recfg().secondary_cell_group.data(),
|
||||||
|
rrc_recfg.crit_exts.rrc_recfg().secondary_cell_group.size());
|
||||||
|
|
||||||
|
err = cell_group_cfg.unpack(bref0);
|
||||||
|
if (err != asn1::SRSASN_SUCCESS) {
|
||||||
|
Error("Could not unpack cell group message message.");
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
rrc_ptr->log_rrc_message("RRC NR Reconfiguration",
|
||||||
|
Rx,
|
||||||
|
rrc_recfg.crit_exts.rrc_recfg().secondary_cell_group,
|
||||||
|
cell_group_cfg,
|
||||||
|
"Secondary Cell Group Config");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Info("Applying Cell Group Cfg");
|
||||||
|
if (!rrc_ptr->apply_cell_group_cfg(cell_group_cfg)) {
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sk_counter_r15_present) {
|
||||||
|
Info("Applying Cell Group Cfg");
|
||||||
|
if (!rrc_ptr->configure_sk_counter((uint16_t)sk_counter_r15)) {
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nr_radio_bearer_cfg1_r15_present) {
|
||||||
|
cbit_ref bref1(nr_radio_bearer_cfg1_r15.data(), nr_radio_bearer_cfg1_r15.size());
|
||||||
|
|
||||||
|
err = radio_bearer_cfg.unpack(bref1);
|
||||||
|
if (err != asn1::SRSASN_SUCCESS) {
|
||||||
|
Error("Could not unpack radio bearer config.");
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
rrc_ptr->log_rrc_message(
|
||||||
|
"RRC NR Reconfiguration", Rx, nr_radio_bearer_cfg1_r15, radio_bearer_cfg, "Radio Bearer Config R15");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Info("Applying Radio Bearer Cfg");
|
||||||
|
if (!rrc_ptr->apply_radio_bearer_cfg(radio_bearer_cfg)) {
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return proc_outcome_t::success;
|
||||||
|
}
|
||||||
|
|
||||||
|
proc_outcome_t rrc_nr::connection_reconf_no_ho_proc::react(const bool& config_complete)
|
||||||
|
{
|
||||||
|
if (not config_complete) {
|
||||||
|
Error("NR reconfiguration failed");
|
||||||
|
return proc_outcome_t::error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO phy ctrl
|
||||||
|
// in case there are scell to configure, wait for second phy configuration
|
||||||
|
// if (not rrc_ptr->phy_ctrl->is_config_pending()) {
|
||||||
|
// return proc_outcome_t::yield;
|
||||||
|
// }
|
||||||
|
|
||||||
|
Info("Reconfig NR return successful");
|
||||||
|
return proc_outcome_t::success;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rrc_nr::connection_reconf_no_ho_proc::then(const srsran::proc_state_t& result)
|
||||||
|
{
|
||||||
|
if (result.is_success()) {
|
||||||
|
Info("Finished %s successfully", name());
|
||||||
|
srsran::console("RRC NR reconfiguration successful.\n");
|
||||||
|
rrc_ptr->rrc_eutra->nr_rrc_con_reconfig_complete(true);
|
||||||
|
} else {
|
||||||
|
// 5.3.5.8.2 Inability to comply with RRCReconfiguration
|
||||||
|
switch (initiator) {
|
||||||
|
case reconf_initiator_t::mcg_srb1:
|
||||||
|
rrc_ptr->rrc_eutra->nr_notify_reconfiguration_failure();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Warning("Reconfiguration failure not implemented for initiator %d", initiator);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
srsran::console("RRC NR reconfiguration failed.\n");
|
||||||
|
Warning("Finished %s with failure", name());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace srsue
|
Loading…
Reference in New Issue