diff --git a/lib/include/srslte/interfaces/enb_interfaces.h b/lib/include/srslte/interfaces/enb_interfaces.h index a343af736..36bbb1097 100644 --- a/lib/include/srslte/interfaces/enb_interfaces.h +++ b/lib/include/srslte/interfaces/enb_interfaces.h @@ -373,6 +373,7 @@ public: virtual void enable_encryption(uint16_t rnti, uint32_t lcid) = 0; virtual bool get_bearer_state(uint16_t rnti, uint32_t lcid, srslte::pdcp_lte_state_t* state) = 0; virtual bool set_bearer_state(uint16_t rnti, uint32_t lcid, const srslte::pdcp_lte_state_t& state) = 0; + virtual void reestablish(uint16_t rnti) = 0; }; // PDCP interface for RLC diff --git a/srsenb/hdr/stack/upper/pdcp.h b/srsenb/hdr/stack/upper/pdcp.h index 4d8080974..4a84b4fac 100644 --- a/srsenb/hdr/stack/upper/pdcp.h +++ b/srsenb/hdr/stack/upper/pdcp.h @@ -54,6 +54,7 @@ public: void enable_encryption(uint16_t rnti, uint32_t lcid) override; bool get_bearer_state(uint16_t rnti, uint32_t lcid, srslte::pdcp_lte_state_t* state) override; bool set_bearer_state(uint16_t rnti, uint32_t lcid, const srslte::pdcp_lte_state_t& state) override; + void reestablish(uint16_t rnti) override; private: class user_interface_rlc : public srsue::rlc_interface_pdcp diff --git a/srsenb/src/stack/rrc/rrc_mobility.cc b/srsenb/src/stack/rrc/rrc_mobility.cc index 82e8e9296..6da16f098 100644 --- a/srsenb/src/stack/rrc/rrc_mobility.cc +++ b/srsenb/src/stack/rrc/rrc_mobility.cc @@ -1314,7 +1314,6 @@ void rrc::ue::rrc_mobility::intraenb_ho_st::enter(rrc_mobility* f, const ho_meas /* Freeze all DRBs. SRBs DL are needed for sending the HO Cmd */ for (const drb_to_add_mod_s& drb : f->rrc_ue->bearer_list.get_established_drbs()) { - f->rrc_enb->pdcp->del_bearer(f->rrc_ue->rnti, drb.drb_id + 2); f->rrc_enb->mac->bearer_ue_rem(f->rrc_ue->rnti, drb.drb_id + 2); } sched_interface::ue_bearer_cfg_t bcfg = {}; @@ -1342,8 +1341,7 @@ void rrc::ue::rrc_mobility::handle_crnti_ce(intraenb_ho_st& s, const user_crnti_ if (is_first_crnti_ce) { // Need to reset SNs of bearers. - rrc_enb->pdcp->rem_user(rrc_ue->rnti); - rrc_enb->pdcp->add_user(rrc_ue->rnti); + rrc_enb->pdcp->reestablish(rrc_ue->rnti); rrc_enb->rlc->reestablish(rrc_ue->rnti); // Change PCell in MAC/Scheduler diff --git a/srsenb/src/stack/upper/pdcp.cc b/srsenb/src/stack/upper/pdcp.cc index 44089b12c..4a12fc16f 100644 --- a/srsenb/src/stack/upper/pdcp.cc +++ b/srsenb/src/stack/upper/pdcp.cc @@ -135,6 +135,14 @@ bool pdcp::set_bearer_state(uint16_t rnti, uint32_t lcid, const srslte::pdcp_lte return users[rnti].pdcp->set_bearer_state(lcid, state); } +void pdcp::reestablish(uint16_t rnti) +{ + if (users.count(rnti) == 0) { + return; + } + users[rnti].pdcp->reestablish(); +} + void pdcp::write_pdu(uint16_t rnti, uint32_t lcid, srslte::unique_byte_buffer_t sdu) { if (users.count(rnti)) { diff --git a/srsenb/test/common/dummy_classes.h b/srsenb/test/common/dummy_classes.h index eafe90f55..5663f4df1 100644 --- a/srsenb/test/common/dummy_classes.h +++ b/srsenb/test/common/dummy_classes.h @@ -74,6 +74,7 @@ public: void enable_encryption(uint16_t rnti, uint32_t lcid) override {} bool get_bearer_state(uint16_t rnti, uint32_t lcid, srslte::pdcp_lte_state_t* state) override { return true; } bool set_bearer_state(uint16_t rnti, uint32_t lcid, const srslte::pdcp_lte_state_t& state) override { return true; } + void reestablish(uint16_t rnti) override {} }; class s1ap_dummy : public s1ap_interface_rrc