Update S1AP RNTI context when doing Reestablishment (#1582)

This commit is contained in:
Ismael Gomez 2020-08-12 23:48:20 +02:00 committed by GitHub
parent 1253740da3
commit 382811e10e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 19 additions and 1 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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()) {

View File

@ -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);

View File

@ -104,6 +104,7 @@ public:
}
}
}
void user_mod(uint16_t old_rnti, uint16_t new_rnti) override {}
};
class pdcp_mobility_dummy : public pdcp_dummy