mirror of https://github.com/PentHertz/srsLTE.git
avoid letting repeated s1ap::user_release calls to deem the user as in zombie state. Use timer instead to auto-remove user from s1ap if no response from mme arrives
This commit is contained in:
parent
e07ef0aa18
commit
41bc7e4810
|
@ -277,6 +277,7 @@ private:
|
||||||
bool release_requested = false;
|
bool release_requested = false;
|
||||||
srsran::unique_timer ts1_reloc_prep; ///< TS1_{RELOCprep} - max time for HO preparation
|
srsran::unique_timer ts1_reloc_prep; ///< TS1_{RELOCprep} - max time for HO preparation
|
||||||
srsran::unique_timer ts1_reloc_overall; ///< TS1_{RELOCOverall}
|
srsran::unique_timer ts1_reloc_overall; ///< TS1_{RELOCOverall}
|
||||||
|
srsran::unique_timer overall_procedure_timeout;
|
||||||
|
|
||||||
// Procedure state
|
// Procedure state
|
||||||
s1ap_proc_id_t current_state = s1ap_proc_id_t::nulltype;
|
s1ap_proc_id_t current_state = s1ap_proc_id_t::nulltype;
|
||||||
|
|
|
@ -1395,12 +1395,6 @@ bool s1ap::ue::send_ulnastransport(srsran::unique_byte_buffer_t pdu)
|
||||||
|
|
||||||
bool s1ap::ue::send_uectxtreleaserequest(const cause_c& cause)
|
bool s1ap::ue::send_uectxtreleaserequest(const cause_c& cause)
|
||||||
{
|
{
|
||||||
if (was_uectxtrelease_requested()) {
|
|
||||||
logger.warning("UE context for RNTI:0x%x is in zombie state. Releasing...", ctxt.rnti);
|
|
||||||
s1ap_ptr->rrc->release_ue(ctxt.rnti);
|
|
||||||
s1ap_ptr->users.erase(this);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (not ctxt.mme_ue_s1ap_id.has_value()) {
|
if (not ctxt.mme_ue_s1ap_id.has_value()) {
|
||||||
logger.error("Cannot send UE context release request without a MME-UE-S1AP-Id allocated.");
|
logger.error("Cannot send UE context release request without a MME-UE-S1AP-Id allocated.");
|
||||||
s1ap_ptr->rrc->release_ue(ctxt.rnti);
|
s1ap_ptr->rrc->release_ue(ctxt.rnti);
|
||||||
|
@ -1415,6 +1409,11 @@ bool s1ap::ue::send_uectxtreleaserequest(const cause_c& cause)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (was_uectxtrelease_requested()) {
|
||||||
|
// let timeout auto-remove user.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
s1ap_pdu_c tx_pdu;
|
s1ap_pdu_c tx_pdu;
|
||||||
tx_pdu.set_init_msg().load_info_obj(ASN1_S1AP_ID_UE_CONTEXT_RELEASE_REQUEST);
|
tx_pdu.set_init_msg().load_info_obj(ASN1_S1AP_ID_UE_CONTEXT_RELEASE_REQUEST);
|
||||||
ue_context_release_request_ies_container& container =
|
ue_context_release_request_ies_container& container =
|
||||||
|
@ -1429,12 +1428,21 @@ bool s1ap::ue::send_uectxtreleaserequest(const cause_c& cause)
|
||||||
if (not release_requested) {
|
if (not release_requested) {
|
||||||
s1ap_ptr->rrc->release_ue(ctxt.rnti);
|
s1ap_ptr->rrc->release_ue(ctxt.rnti);
|
||||||
s1ap_ptr->users.erase(this);
|
s1ap_ptr->users.erase(this);
|
||||||
|
} else {
|
||||||
|
overall_procedure_timeout.set(10000, [this](uint32_t tid) {
|
||||||
|
logger.warning("UE context for RNTI:0x%x is in zombie state. Releasing...", ctxt.rnti);
|
||||||
|
s1ap_ptr->rrc->release_ue(ctxt.rnti);
|
||||||
|
s1ap_ptr->users.erase(this);
|
||||||
|
});
|
||||||
|
overall_procedure_timeout.run();
|
||||||
}
|
}
|
||||||
return release_requested;
|
return release_requested;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool s1ap::ue::send_uectxtreleasecomplete()
|
bool s1ap::ue::send_uectxtreleasecomplete()
|
||||||
{
|
{
|
||||||
|
overall_procedure_timeout.stop();
|
||||||
|
|
||||||
s1ap_pdu_c tx_pdu;
|
s1ap_pdu_c tx_pdu;
|
||||||
tx_pdu.set_successful_outcome().load_info_obj(ASN1_S1AP_ID_UE_CONTEXT_RELEASE);
|
tx_pdu.set_successful_outcome().load_info_obj(ASN1_S1AP_ID_UE_CONTEXT_RELEASE);
|
||||||
auto& container = tx_pdu.successful_outcome().value.ue_context_release_complete().protocol_ies;
|
auto& container = tx_pdu.successful_outcome().value.ue_context_release_complete().protocol_ies;
|
||||||
|
@ -1964,6 +1972,8 @@ s1ap::ue::ue(s1ap* s1ap_ptr_) : s1ap_ptr(s1ap_ptr_), ho_prep_proc(this), logger(
|
||||||
// TS1RELOCOverall, the eNB shall request the MME to release the UE context.
|
// TS1RELOCOverall, the eNB shall request the MME to release the UE context.
|
||||||
s1ap_ptr->user_release(ctxt.rnti, asn1::s1ap::cause_radio_network_opts::ts1relocoverall_expiry);
|
s1ap_ptr->user_release(ctxt.rnti, asn1::s1ap::cause_radio_network_opts::ts1relocoverall_expiry);
|
||||||
});
|
});
|
||||||
|
overall_procedure_timeout = s1ap_ptr->task_sched.get_unique_timer();
|
||||||
|
overall_procedure_timeout.set(10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool s1ap::ue::send_ho_required(uint32_t target_eci,
|
bool s1ap::ue::send_ho_required(uint32_t target_eci,
|
||||||
|
|
Loading…
Reference in New Issue