implemented S1 bearer status transfer

master
Francisco Paisana 4 years ago
parent db8af399f8
commit 5d1343fe75

@ -439,7 +439,7 @@ public:
const asn1::s1ap::sourceenb_to_targetenb_transparent_container_s& container,
srslte::byte_buffer_t& ho_cmd,
std::vector<asn1::fixed_octstring<4, true> >& admitted_erabs) = 0;
virtual void set_erab_status(uint16_t rnti, const asn1::s1ap::bearers_subject_to_status_transfer_item_s& erab) = 0;
virtual void set_erab_status(uint16_t rnti, const asn1::s1ap::bearers_subject_to_status_transfer_list_l& erabs) = 0;
};
// GTPU interface for PDCP

@ -92,7 +92,7 @@ public:
const asn1::s1ap::sourceenb_to_targetenb_transparent_container_s& container,
srslte::byte_buffer_t& ho_cmd,
std::vector<asn1::fixed_octstring<4, true> >& admitted_erabs) override;
void set_erab_status(uint16_t rnti, const asn1::s1ap::bearers_subject_to_status_transfer_item_s& erab) override;
void set_erab_status(uint16_t rnti, const asn1::s1ap::bearers_subject_to_status_transfer_list_l& erabs) override;
// rrc_interface_pdcp
void write_pdu(uint16_t rnti, uint32_t lcid, srslte::unique_byte_buffer_t pdu) override;

@ -117,6 +117,7 @@ public:
const asn1::s1ap::sourceenb_to_targetenb_transparent_container_s& container,
srslte::byte_buffer_t& ho_cmd,
std::vector<asn1::fixed_octstring<4, true> >& admitted_erabs);
void set_erab_status(const asn1::s1ap::bearers_subject_to_status_transfer_list_l& erabs);
private:
// Handover from source cell

@ -78,7 +78,6 @@ public:
bool setup_erabs(const asn1::s1ap::erab_to_be_setup_list_ctxt_su_req_l& e);
bool setup_erabs(const asn1::s1ap::erab_to_be_setup_list_bearer_su_req_l& e);
bool release_erabs();
void set_erab_status(const asn1::s1ap::bearers_subject_to_status_transfer_item_s& erab);
// handover
void handle_ho_preparation_complete(bool is_success, srslte::unique_byte_buffer_t container);

@ -470,15 +470,14 @@ uint16_t rrc::start_ho_ue_resource_alloc(const asn1::s1ap::ho_request_s&
return enb_mobility_cfg->start_ho_ue_resource_alloc(msg, container, ho_cmd, admitted_erabs);
}
void rrc::set_erab_status(uint16_t rnti, const asn1::s1ap::bearers_subject_to_status_transfer_item_s& erab)
void rrc::set_erab_status(uint16_t rnti, const asn1::s1ap::bearers_subject_to_status_transfer_list_l& erabs)
{
auto ue_it = users.find(rnti);
if (ue_it == users.end()) {
rrc_log->warning("rnti=0x%x does not exist\n", rnti);
return;
}
ue_it->second->set_erab_status(erab);
ue_it->second->mobility_handler->set_erab_status(erabs);
}
/*******************************************************************************

@ -824,6 +824,36 @@ bool rrc::ue::rrc_mobility::start_s1_tenb_ho(
return false;
}
void rrc::ue::rrc_mobility::set_erab_status(const asn1::s1ap::bearers_subject_to_status_transfer_list_l& erabs)
{
for (const auto& erab : erabs) {
const auto& erab_item = erab.value.bearers_subject_to_status_transfer_item();
auto erab_it = rrc_ue->bearer_list.get_erabs().find(erab_item.erab_id);
if (erab_it == rrc_ue->bearer_list.get_erabs().end()) {
rrc_log->warning("The E-RAB Id=%d is not recognized\n", erab_item.erab_id);
continue;
}
const auto& drbs = rrc_ue->bearer_list.get_pending_addmod_drbs();
uint8_t drbid = erab_item.erab_id - 4;
auto drb_it =
std::find_if(drbs.begin(), drbs.end(), [drbid](const drb_to_add_mod_s& drb) { return drb.drb_id == drbid; });
if (drb_it == drbs.end()) {
rrc_log->warning("The DRB id=%d does not exist\n", erab_item.erab_id - 4);
}
srslte::pdcp_lte_state_t drb_state{};
drb_state.tx_hfn = erab_item.dl_coun_tvalue.hfn;
drb_state.next_pdcp_tx_sn = erab_item.dl_coun_tvalue.pdcp_sn;
drb_state.rx_hfn = erab_item.ul_coun_tvalue.hfn;
drb_state.next_pdcp_rx_sn = erab_item.ul_coun_tvalue.pdcp_sn;
rrc_log->info("Setting lcid=%d PDCP state to {Tx SN: %d, Rx SN: %d}\n",
drb_it->lc_ch_id,
drb_state.next_pdcp_tx_sn,
drb_state.next_pdcp_rx_sn);
rrc_enb->pdcp->set_bearer_state(rrc_ue->rnti, drb_it->lc_ch_id, drb_state);
}
}
bool rrc::ue::rrc_mobility::update_ue_var_meas_cfg(const asn1::rrc::meas_cfg_s& source_meas_cfg,
uint32_t target_enb_cc_idx,
asn1::rrc::meas_cfg_s* diff_meas_cfg)
@ -1099,11 +1129,10 @@ void rrc::ue::rrc_mobility::s1_target_ho_st::enter(rrc_mobility* f, const ho_req
/* Prepare Handover Request Acknowledgment - Handover Command */
dl_dcch_msg_s dl_dcch_msg;
rrc_conn_recfg_r8_ies_s& recfg_r8 =
dl_dcch_msg.msg.set_c1().set_rrc_conn_recfg().crit_exts.set_c1().set_rrc_conn_recfg_r8();
// Fill fields common to all types of handover
f->fill_mobility_reconf_common(dl_dcch_msg, *target_cell->cell_common);
rrc_conn_recfg_r8_ies_s& recfg_r8 = dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8();
// Encode MeasConfig
var_meas_cfg_t current_var_meas = var_meas_cfg_t::make(ho_req.ho_prep_r8->as_cfg.source_meas_cfg);
@ -1117,10 +1146,9 @@ void rrc::ue::rrc_mobility::s1_target_ho_st::enter(rrc_mobility* f, const ho_req
f->rrc_ue->bearer_list.apply_rlc_bearer_updates(f->rrc_enb->rlc);
f->rrc_ue->ue_security_cfg.regenerate_keys_handover(target_cell_cfg.pci, target_cell_cfg.dl_earfcn);
// Update MAC
f->rrc_ue->mac_ctrl->handle_ho_prep(*ho_req.ho_prep_r8,
dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8());
f->rrc_ue->mac_ctrl->handle_ho_prep(*ho_req.ho_prep_r8, recfg_r8);
// Apply PHY updates
f->rrc_ue->apply_reconf_phy_config(dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8());
f->rrc_ue->apply_reconf_phy_config(recfg_r8);
/* Prepare Handover Command to be sent via S1AP */
ho_cmd_pdu = srslte::allocate_unique_buffer(*f->pool);

@ -978,8 +978,6 @@ void rrc::ue::notify_s1ap_ue_erab_setup_response(const asn1::s1ap::erab_to_be_se
parent->s1ap->ue_erab_setup_complete(rnti, res);
}
void rrc::ue::set_erab_status(const asn1::s1ap::bearers_subject_to_status_transfer_item_s& erab) {}
//! Helper method to access Cell configuration based on UE Carrier Index
cell_info_common* rrc::ue::get_ue_cc_cfg(uint32_t ue_cc_idx)
{
@ -1224,7 +1222,8 @@ void rrc::ue::fill_rrc_setup_rr_config_dedicated(asn1::rrc::rr_cfg_ded_s* rr_cfg
phy_cfg->ul_pwr_ctrl_ded.p0_ue_pusch = 0;
phy_cfg->ul_pwr_ctrl_ded.delta_mcs_enabled = ul_pwr_ctrl_ded_s::delta_mcs_enabled_e_::en0;
phy_cfg->ul_pwr_ctrl_ded.accumulation_enabled = true;
phy_cfg->ul_pwr_ctrl_ded.p0_ue_pucch = 0, phy_cfg->ul_pwr_ctrl_ded.psrs_offset = 3;
phy_cfg->ul_pwr_ctrl_ded.p0_ue_pucch = 0;
phy_cfg->ul_pwr_ctrl_ded.psrs_offset = 3;
// PDSCH
phy_cfg->pdsch_cfg_ded_present = true;

@ -929,11 +929,9 @@ bool s1ap::handle_mme_status_transfer(const asn1::s1ap::mme_status_transfer_s& m
return false;
}
for (const auto& bearer :
msg.protocol_ies.enb_status_transfer_transparent_container.value.bearers_subject_to_status_transfer_list) {
const auto& bearer_item = bearer.value.bearers_subject_to_status_transfer_item();
rrc->set_erab_status(u->ctxt.rnti, bearer_item);
}
rrc->set_erab_status(
u->ctxt.rnti,
msg.protocol_ies.enb_status_transfer_transparent_container.value.bearers_subject_to_status_transfer_list);
return true;
}

@ -500,6 +500,22 @@ int test_s1ap_tenb_mobility(mobility_test_params test_params)
TESTASSERT(recfg_r8.rr_cfg_ded.phys_cfg_ded.sched_request_cfg.setup().sr_cfg_idx == 15);
TESTASSERT(recfg_r8.rr_cfg_ded.phys_cfg_ded.sched_request_cfg.setup().sr_pucch_res_idx == 0);
// Receives MMEStatusTransfer
asn1::s1ap::bearers_subject_to_status_transfer_list_l bearers;
bearers.resize(1);
bearers[0].value.bearers_subject_to_status_transfer_item().erab_id = 5;
bearers[0].value.bearers_subject_to_status_transfer_item().dl_coun_tvalue.pdcp_sn = 100;
bearers[0].value.bearers_subject_to_status_transfer_item().dl_coun_tvalue.hfn = 3;
bearers[0].value.bearers_subject_to_status_transfer_item().ul_coun_tvalue.pdcp_sn = 120;
bearers[0].value.bearers_subject_to_status_transfer_item().ul_coun_tvalue.hfn = 4;
tester.rrc.set_erab_status(0x46, bearers);
TESTASSERT(tester.pdcp.last_state.rnti == 0x46);
TESTASSERT(tester.pdcp.last_state.lcid == 3);
TESTASSERT(tester.pdcp.last_state.state.next_pdcp_tx_sn == 100);
TESTASSERT(tester.pdcp.last_state.state.tx_hfn == 3);
TESTASSERT(tester.pdcp.last_state.state.next_pdcp_rx_sn == 120);
TESTASSERT(tester.pdcp.last_state.state.rx_hfn == 4);
// user PRACHs and sends C-RNTI CE
sched_interface::ue_cfg_t ue_cfg{};
ue_cfg.supported_cc_list.resize(1);

@ -115,6 +115,12 @@ public:
uint32_t lcid;
srslte::unique_byte_buffer_t sdu;
} last_sdu;
struct last_bearer_state {
uint16_t rnti;
uint32_t lcid;
srslte::pdcp_lte_state_t state;
} last_state;
std::map<uint16_t, std::map<uint32_t, srslte::pdcp_lte_state_t> > drb_states;
void write_sdu(uint16_t rnti, uint32_t lcid, srslte::unique_byte_buffer_t sdu) override
{
@ -122,6 +128,13 @@ public:
last_sdu.lcid = lcid;
last_sdu.sdu = std::move(sdu);
}
bool set_bearer_state(uint16_t rnti, uint32_t lcid, const srslte::pdcp_lte_state_t& state) override
{
last_state.rnti = rnti;
last_state.lcid = lcid;
last_state.state = state;
return true;
}
};
class rlc_mobility_dummy : public rlc_dummy

Loading…
Cancel
Save