diff --git a/lib/include/srslte/interfaces/enb_interfaces.h b/lib/include/srslte/interfaces/enb_interfaces.h index f03b6514d..9b7e5c934 100644 --- a/lib/include/srslte/interfaces/enb_interfaces.h +++ b/lib/include/srslte/interfaces/enb_interfaces.h @@ -474,6 +474,7 @@ public: virtual void write_pdu(uint16_t rnti, srslte::unique_byte_buffer_t pdu) = 0; virtual bool user_exists(uint16_t rnti) = 0; + virtual void user_mod(uint16_t old_rnti, uint16_t new_rnti) = 0; virtual bool user_release(uint16_t rnti, asn1::s1ap::cause_radio_network_e cause_radio) = 0; virtual void ue_ctxt_setup_complete(uint16_t rnti, const asn1::s1ap::init_context_setup_resp_s& res) = 0; virtual void ue_erab_setup_complete(uint16_t rnti, const asn1::s1ap::erab_setup_resp_s& res) = 0; diff --git a/srsenb/hdr/stack/upper/s1ap.h b/srsenb/hdr/stack/upper/s1ap.h index 2cfdcfa01..80b5b1d70 100644 --- a/srsenb/hdr/stack/upper/s1ap.h +++ b/srsenb/hdr/stack/upper/s1ap.h @@ -71,6 +71,7 @@ public: uint8_t mmec) override; void write_pdu(uint16_t rnti, srslte::unique_byte_buffer_t pdu) override; bool user_exists(uint16_t rnti) override; + void user_mod(uint16_t old_rnti, uint16_t new_rnti) override; bool user_release(uint16_t rnti, asn1::s1ap::cause_radio_network_e cause_radio) override; void ue_ctxt_setup_complete(uint16_t rnti, const asn1::s1ap::init_context_setup_resp_s& res) override; void ue_erab_setup_complete(uint16_t rnti, const asn1::s1ap::erab_setup_resp_s& res) override; diff --git a/srsenb/src/stack/rrc/rrc_ue.cc b/srsenb/src/stack/rrc/rrc_ue.cc index 5331c4a5a..a2e37a324 100644 --- a/srsenb/src/stack/rrc/rrc_ue.cc +++ b/srsenb/src/stack/rrc/rrc_ue.cc @@ -346,8 +346,9 @@ void rrc::ue::handle_rrc_con_reest_req(rrc_conn_reest_request_s* msg) ue_security_cfg = parent->users[old_rnti]->ue_security_cfg; ue_security_cfg.regenerate_keys_handover(pcell_cfg->cell_cfg.pci, pcell_cfg->cell_cfg.dl_earfcn); - // Modify GTP-U tunnel + // Modify GTP-U tunnel and S1AP context parent->gtpu->mod_bearer_rnti(old_rnti, rnti); + parent->s1ap->user_mod(old_rnti, rnti); // Get PDCP entity state (required when using RLC AM) for (const auto& erab_pair : parent->users[old_rnti]->bearer_list.get_erabs()) { diff --git a/srsenb/src/stack/upper/s1ap.cc b/srsenb/src/stack/upper/s1ap.cc index 1ec932ca1..9d1b1062a 100644 --- a/srsenb/src/stack/upper/s1ap.cc +++ b/srsenb/src/stack/upper/s1ap.cc @@ -367,6 +367,20 @@ bool s1ap::user_exists(uint16_t rnti) return users.find_ue_rnti(rnti) != nullptr; } +void s1ap::user_mod(uint16_t old_rnti, uint16_t new_rnti) +{ + s1ap_log->info("Modifying user context. Old rnti: 0x%x, new rnti: 0x%x\n", old_rnti, new_rnti); + if (not user_exists(old_rnti)) { + s1ap_log->error("Old rnti does not exist, aborting.\n"); + return; + } + if (user_exists(new_rnti)) { + s1ap_log->error("New rnti already exists, aborting.\n"); + return; + } + users.find_ue_rnti(old_rnti)->ctxt.rnti = new_rnti; +} + void s1ap::ue_ctxt_setup_complete(uint16_t rnti, const asn1::s1ap::init_context_setup_resp_s& res) { ue* u = users.find_ue_rnti(rnti); diff --git a/srsenb/test/upper/test_helpers.h b/srsenb/test/upper/test_helpers.h index b9c8acc76..b69b3a0b1 100644 --- a/srsenb/test/upper/test_helpers.h +++ b/srsenb/test/upper/test_helpers.h @@ -104,6 +104,7 @@ public: } } } + void user_mod(uint16_t old_rnti, uint16_t new_rnti) override {} }; class pdcp_mobility_dummy : public pdcp_dummy