Commit 30216be9 authored by aligungr's avatar aligungr

L3 RRC/NAS developments

parent c4b82c56
......@@ -165,7 +165,7 @@ void NasMm::performMmCycle()
/* Try to start procedures */
invokeProcedures();
/* Initial registration controls */
/* Registration related */
if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning())
initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE);
else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && hasEmergency())
......@@ -180,6 +180,16 @@ void NasMm::performMmCycle()
initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES);
}
if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE && hasEmergency())
{
// 5.2.3.2.3; f)
// "may perform de-registration locally and initiate a registration procedure for initial registration for
// emergency services even if timer T3346 is running"
// UE will try to send initial emergency registration after local de-registration
performLocalDeregistration();
}
/* Process TAI changes if any */
if (currentTai.hasValue() &&
!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai}))
......
......@@ -28,6 +28,10 @@ static nas::IEDeRegistrationType MakeDeRegistrationType(EDeregCause deregCause)
EProcRc NasMm::sendDeregistration(EDeregCause deregCause)
{
auto currentTai = m_base->shCtx.getCurrentTai();
if (!currentTai.hasValue())
return EProcRc::STAY;
if (m_rmState != ERmState::RM_REGISTERED)
{
m_logger->warn("De-registration could not be triggered. UE is already de-registered");
......@@ -37,6 +41,17 @@ EProcRc NasMm::sendDeregistration(EDeregCause deregCause)
if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED)
return EProcRc::CANCEL;
// 5.2.3.2.3 "shall not initiate de-registration procedure unless timer T3346 is running and the current TAI is part
// of the TAI list."
if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE)
{
if (!m_timers->t3346.isRunning() ||
!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai}))
{
return EProcRc::STAY;
}
}
m_logger->debug("Starting de-registration procedure due to [%s]", ToJson(deregCause).str().c_str());
updateProvidedGuti();
......@@ -330,9 +345,6 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi
void NasMm::performLocalDeregistration()
{
if (m_mmState == EMmState::MM_DEREGISTERED)
return;
m_logger->debug("Performing local de-registration");
m_timers->t3521.stop();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment