Commit ce6ff2e4 authored by aligungr's avatar aligungr

L3 RRC/NAS developments

parent c2dbba5d
......@@ -34,6 +34,9 @@ EProcRc NasMm::sendDeregistration(EDeregCause deregCause)
return EProcRc::CANCEL;
}
if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED)
return EProcRc::CANCEL;
m_logger->debug("Starting de-registration procedure due to [%s]", ToJson(deregCause).str().c_str());
updateProvidedGuti();
......@@ -56,7 +59,7 @@ EProcRc NasMm::sendDeregistration(EDeregCause deregCause)
auto rc = sendNasMessage(*request);
if (rc != EProcRc::OK)
return EProcRc::STAY;
return rc;
m_lastDeregistrationRequest = std::move(request);
m_lastDeregCause = deregCause;
......
......@@ -105,7 +105,7 @@ class NasMm
private: /* Registration */
void sendMobilityRegistration(ERegUpdateCause updateCause);
void sendInitialRegistration(EInitialRegCause regCause);
EProcRc sendInitialRegistration(EInitialRegCause regCause);
void receiveRegistrationAccept(const nas::RegistrationAccept &msg);
void receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg);
void receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg);
......
......@@ -105,12 +105,33 @@ void NasMm::invokeProcedures()
if (m_procCtl.deregistration)
{
EProcRc rc = sendDeregistration(*m_procCtl.deregistration);
if (rc != EProcRc::STAY)
if (rc == EProcRc::OK)
{
m_procCtl.deregistration = std::nullopt;
m_procCtl.initialRegistration = std::nullopt;
m_procCtl.mobilityRegistration = std::nullopt;
m_procCtl.serviceRequest = std::nullopt;
}
else if (rc == EProcRc::CANCEL)
{
m_procCtl.deregistration = std::nullopt;
}
return;
}
m_procCtl.initialRegistration = std::nullopt;
m_procCtl.mobilityRegistration = std::nullopt;
m_procCtl.serviceRequest = std::nullopt;
if (m_procCtl.initialRegistration)
{
EProcRc rc = sendInitialRegistration(*m_procCtl.initialRegistration);
if (rc == EProcRc::OK)
{
m_procCtl.initialRegistration = std::nullopt;
m_procCtl.mobilityRegistration = std::nullopt;
m_procCtl.serviceRequest = std::nullopt;
}
else if (rc == EProcRc::CANCEL)
{
m_procCtl.initialRegistration = std::nullopt;
}
return;
}
......
......@@ -15,14 +15,17 @@
namespace nr::ue
{
void NasMm::sendInitialRegistration(EInitialRegCause regCause)
EProcRc NasMm::sendInitialRegistration(EInitialRegCause regCause)
{
if (m_rmState != ERmState::RM_DEREGISTERED)
{
m_logger->warn("Registration could not be triggered. UE is not in RM-DEREGISTERED state.");
return;
return EProcRc::CANCEL;
}
if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED)
return EProcRc::STAY;
bool isEmergencyReg = regCause == EInitialRegCause::EMERGENCY_SERVICES;
// 5.5.1.2.7 Abnormal cases in the UE
......@@ -37,7 +40,7 @@ void NasMm::sendInitialRegistration(EInitialRegCause regCause)
if (!highPriority && regCause != EInitialRegCause::DUE_TO_DEREGISTRATION)
{
m_logger->debug("Initial registration canceled, T3346 is running");
return;
return EProcRc::STAY;
}
}
......@@ -51,9 +54,6 @@ void NasMm::sendInitialRegistration(EInitialRegCause regCause)
// initiates an initial registration procedure
m_usim->m_currentNsCtx = {};
// Switch MM state
switchMmState(EMmSubState::MM_REGISTERED_INITIATED_PS);
// Prepare requested NSSAI
bool isDefaultNssai{};
auto requestedNssai = makeRequestedNssai(isDefaultNssai);
......@@ -97,7 +97,13 @@ void NasMm::sendInitialRegistration(EInitialRegCause regCause)
}
// Send the message
sendNasMessage(*request);
auto rc = sendNasMessage(*request);
if (rc != EProcRc::OK)
return rc;
// Switch MM state
switchMmState(EMmSubState::MM_REGISTERED_INITIATED_PS);
m_lastRegistrationRequest = std::move(request);
m_lastRegWithoutNsc = m_usim->m_currentNsCtx == nullptr;
......@@ -105,6 +111,8 @@ void NasMm::sendInitialRegistration(EInitialRegCause regCause)
m_timers->t3510.start();
m_timers->t3502.stop();
m_timers->t3511.stop();
return EProcRc::OK;
}
void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause)
......@@ -625,7 +633,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg)
{
m_storage->forbiddenTaiListRoaming->add(tai);
m_storage->serviceAreaList->mutate([&tai](auto &value) {
nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai});
nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai});
});
}
}
......@@ -791,9 +799,8 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg
if (tai.hasValue())
{
m_storage->forbiddenTaiListRoaming->add(tai);
m_storage->serviceAreaList->mutate([&tai](auto &value) {
nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai});
});
m_storage->serviceAreaList->mutate(
[&tai](auto &value) { nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai}); });
}
}
......
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