avoid sending UEContextReleaseRequest from Source eNB during S1 Handover.

This commit is contained in:
Francisco 2021-05-19 19:56:07 +01:00 committed by Ismael Gomez
parent f2a56c9139
commit b093576634
3 changed files with 26 additions and 23 deletions

View File

@ -60,7 +60,7 @@ detail::scope_exit<typename std::decay<Callable>::type> make_scope_exit(Callable
return detail::scope_exit<typename std::decay<Callable>::type>{std::forward<Callable>(callable)};
}
#define DEFER(FUNC) auto on_exit_call = make_scope_exit([&]() { FUNC })
#define DEFER(FUNC) auto on_exit_call##__LINE__ = srsran::make_scope_exit([&]() { FUNC })
} // namespace srsran

View File

@ -206,29 +206,25 @@ void rrc::ue::rlf_timer_expired(uint32_t timeout_id)
parent->logger.info("RLC RLF timer for rnti=0x%x expired after %d ms", rnti, rlc_rlf_timer.time_elapsed());
}
if (parent->s1ap->user_release(rnti, asn1::s1ap::cause_radio_network_opts::radio_conn_with_ue_lost)) {
con_release_result = procedure_result_code::radio_conn_with_ue_lost;
phy_ul_rlf_timer.stop();
phy_dl_rlf_timer.stop();
rlc_rlf_timer.stop();
} else {
if (rnti != SRSRAN_MRNTI) {
state = RRC_STATE_RELEASE_REQUEST;
if (parent->s1ap->user_release(rnti, asn1::s1ap::cause_radio_network_opts::radio_conn_with_ue_lost)) {
con_release_result = procedure_result_code::radio_conn_with_ue_lost;
} else if (rnti != SRSRAN_MRNTI) {
parent->rem_user(rnti);
}
}
state = RRC_STATE_RELEASE_REQUEST;
}
void rrc::ue::max_rlc_retx_reached()
{
if (parent) {
parent->logger.info("Max RLC retx reached for rnti=0x%x", rnti);
// Turn off DRB scheduling but give UE chance to start re-establishment
rlc_rlf_timer.run();
mac_ctrl.handle_max_retx();
}
}
void rrc::ue::set_activity_timeout(const activity_timeout_type_t type)

View File

@ -420,11 +420,7 @@ bool s1ap::user_release(uint16_t rnti, asn1::s1ap::cause_radio_network_e cause_r
cause_c cause;
cause.set_radio_network().value = cause_radio.value;
if (not u->send_uectxtreleaserequest(cause)) {
users.erase(u);
return false;
}
return true;
return u->send_uectxtreleaserequest(cause);
}
bool s1ap::user_exists(uint16_t rnti)
@ -1400,14 +1396,21 @@ 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->users.erase(this);
return false;
}
if (not ctxt.mme_ue_s1ap_id.has_value()) {
logger.error("Cannot send UE context release request without a MME-UE-S1AP-Id allocated.");
s1ap_ptr->users.erase(this);
return false;
}
if (ts1_reloc_overall.is_running()) {
logger.info("Not sending UEContextReleaseRequest for UE rnti=0x%x performing S1 Handover.", ctxt.rnti);
s1ap_ptr->users.erase(this);
return false;
}
release_requested = true;
s1ap_pdu_c tx_pdu;
tx_pdu.set_init_msg().load_info_obj(ASN1_S1AP_ID_UE_CONTEXT_RELEASE_REQUEST);
ue_context_release_request_ies_container& container =
@ -1418,7 +1421,11 @@ bool s1ap::ue::send_uectxtreleaserequest(const cause_c& cause)
// Cause
container.cause.value = cause;
return s1ap_ptr->sctp_send_s1ap_pdu(tx_pdu, ctxt.rnti, "UEContextReleaseRequest");
release_requested = s1ap_ptr->sctp_send_s1ap_pdu(tx_pdu, ctxt.rnti, "UEContextReleaseRequest");
if (not release_requested) {
s1ap_ptr->users.erase(this);
}
return release_requested;
}
bool s1ap::ue::send_uectxtreleasecomplete()