From 3acfc31e781bbf936cf1b34dd292f337a494eb18 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 17:09:24 +0300 Subject: [PATCH 001/311] network.cpp refactor --- src/utils/network.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/network.cpp b/src/utils/network.cpp index 8b9cd0c5e..efdcfb5d9 100644 --- a/src/utils/network.cpp +++ b/src/utils/network.cpp @@ -174,12 +174,12 @@ int Socket::receive(uint8_t *buffer, size_t bufferSize, int timeoutMs, InetAddre sockaddr_storage peerAddr{}; socklen_t peerAddrLen = sizeof(struct sockaddr_storage); - rc = recvfrom(fd, buffer, bufferSize, 0, (struct sockaddr *)&peerAddr, &peerAddrLen); - if (rc == -1) + auto r = recvfrom(fd, buffer, bufferSize, 0, (struct sockaddr *)&peerAddr, &peerAddrLen); + if (r == -1) throw LibError("recvfrom recv failed: ", errno); outAddress = InetAddress{peerAddr, peerAddrLen}; - return rc; + return static_cast(r); } return 0; From 9ec574718c7e3a0c75fae0b463c8760889b3b120 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 18:25:26 +0300 Subject: [PATCH 002/311] RLS improvements --- src/lib/rls/rls_pdu.hpp | 29 +++++++- src/ue/nts.hpp | 25 ++++++- src/ue/rls/udp_task.cpp | 149 ++++++++++++++++++++++++++++++++++++++++ src/ue/rls/udp_task.hpp | 63 +++++++++++++++++ src/utils/nts.hpp | 1 + 5 files changed, 263 insertions(+), 4 deletions(-) create mode 100644 src/ue/rls/udp_task.cpp create mode 100644 src/ue/rls/udp_task.hpp diff --git a/src/lib/rls/rls_pdu.hpp b/src/lib/rls/rls_pdu.hpp index f00064c88..e9b5d395e 100644 --- a/src/lib/rls/rls_pdu.hpp +++ b/src/lib/rls/rls_pdu.hpp @@ -21,9 +21,14 @@ namespace rls enum class EMessageType : uint8_t { RESERVED = 0, - CELL_INFO_REQUEST, - CELL_INFO_RESPONSE, - PDU_DELIVERY + + CELL_INFO_REQUEST = 1, + CELL_INFO_RESPONSE = 2, + + PDU_DELIVERY = 3, + + HEARTBEAT = 4, + HEARTBEAT_ACK = 5, }; enum class EPduType : uint8_t @@ -43,6 +48,24 @@ struct RlsMessage } }; +struct RlsHeartBeat : RlsMessage +{ + Vector3 simPos; + + explicit RlsHeartBeat(uint64_t sti) : RlsMessage(EMessageType::HEARTBEAT, sti) + { + } +}; + +struct RlsHeartBeatAck : RlsMessage +{ + int dbm{}; + + explicit RlsHeartBeatAck(uint64_t sti) : RlsMessage(EMessageType::HEARTBEAT_ACK, sti) + { + } +}; + struct RlsCellInfoRequest : RlsMessage { Vector3 simPos{}; diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 9e676b4f6..2c61cdcd8 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -10,10 +10,13 @@ #include "types.hpp" #include "ue.hpp" + +#include + #include #include +#include #include -#include #include #include #include @@ -239,6 +242,26 @@ struct NwUeRlsToApp : NtsMessage } }; +struct NwRlsToRls : NtsMessage +{ + enum PR + { + RECEIVE_RLS_MESSAGE, + SIGNAL_CHANGED, + } present; + + // SIGNAL_CHANGED + uint64_t sti{}; + int dbm{}; + + // RECEIVE_RLS_MESSAGE + std::unique_ptr msg{}; + + explicit NwRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) + { + } +}; + struct NwUeStatusUpdate : NtsMessage { static constexpr const int SESSION_ESTABLISHMENT = 1; diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp new file mode 100644 index 000000000..1c111895c --- /dev/null +++ b/src/ue/rls/udp_task.cpp @@ -0,0 +1,149 @@ +// +// Created by ali on 10.05.2021. +// + +#include "udp_task.hpp" + +#include +#include +#include + +#include +#include +#include + +static constexpr const int BUFFER_SIZE = 16384; +static constexpr const int LOOP_PERIOD = 1000; +static constexpr const int HEARTBEAT_THRESHOLD = 2000; + +namespace nr::ue +{ + +RlsUdpTask::RlsUdpTask(TaskBase *base, uint64_t sti, const std::vector &searchSpace) + : m_ctlTask{}, m_sti{sti}, m_searchSpace{}, m_cells{}, m_lastLoop{} +{ + m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-udp"); + + m_server = new udp::UdpServer(); + + for (auto &ip : searchSpace) + m_searchSpace.emplace_back(ip, cons::PortalPort); + + m_simPos = Vector3{}; +} + +void RlsUdpTask::onStart() +{ +} + +void RlsUdpTask::onLoop() +{ + auto current = utils::CurrentTimeMillis(); + if (current - m_lastLoop > LOOP_PERIOD) + { + m_lastLoop = current; + heartbeatCycle(current, m_simPos); + } + + uint8_t buffer[BUFFER_SIZE]; + InetAddress peerAddress; + + int size = m_server->Receive(buffer, BUFFER_SIZE, LOOP_PERIOD, peerAddress); + if (size > 0) + { + auto rlsMsg = rls::DecodeRlsMessage(OctetView{buffer, static_cast(size)}); + if (rlsMsg == nullptr) + m_logger->err("Unable to decode RLS message"); + else + receiveRlsPdu(peerAddress, std::move(rlsMsg)); + } +} + +void RlsUdpTask::onQuit() +{ + delete m_server; +} + +void RlsUdpTask::sendRlsPdu(const InetAddress &addr, const rls::RlsMessage &msg) +{ + OctetString stream; + rls::EncodeRlsMessage(msg, stream); + + m_server->Send(addr, stream.data(), static_cast(stream.length())); +} + +void RlsUdpTask::send(uint64_t sti, const rls::RlsMessage &msg) +{ + if (m_cells.count(sti)) + sendRlsPdu(m_cells[sti].address, msg); +} + +void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptr &&msg) +{ + if (msg->msgType == rls::EMessageType::HEARTBEAT_ACK) + { + int oldDbm = INT32_MIN; + if (m_cells.count(msg->sti)) + oldDbm = m_cells[msg->sti].dbm; + + m_cells[msg->sti].address = addr; + m_cells[msg->sti].lastSeen = utils::CurrentTimeMillis(); + + int newDbm = ((const rls::RlsHeartBeatAck &)msg).dbm; + m_cells[msg->sti].dbm = newDbm; + + if (oldDbm != newDbm) + onSignalChangeOrLost(msg->sti); + return; + } + + if (!m_cells.count(msg->sti)) + { + // if no HB-ACK received yet, and the message is not HB-ACK, then ignore the message + return; + } + + auto *w = new NwRlsToRls(NwRlsToRls::RECEIVE_RLS_MESSAGE); + w->msg = std::move(msg); + m_ctlTask->push(w); +} + +void RlsUdpTask::onSignalChangeOrLost(uint64_t sti) +{ + auto *w = new NwRlsToRls(NwRlsToRls::SIGNAL_CHANGED); + w->sti = sti; + w->dbm = m_cells.count(sti) ? m_cells[sti].dbm : INT32_MIN; + m_ctlTask->push(w); +} + +void RlsUdpTask::heartbeatCycle(uint64_t time, const Vector3 &simPos) +{ + std::set stiToRemove; + + for (auto &cell : m_cells) + { + auto delta = time - cell.second.lastSeen; + if (delta > HEARTBEAT_THRESHOLD) + stiToRemove.insert(cell.first); + } + + for (auto sti : stiToRemove) + m_cells.erase(sti); + + for (auto sti : stiToRemove) + onSignalChangeOrLost(sti); + + for (auto &addr : m_searchSpace) + { + rls::RlsHeartBeat msg{m_sti}; + msg.simPos = simPos; + sendRlsPdu(addr, msg); + } +} + +void RlsUdpTask::initialize(NtsTask *ctlTask) +{ + m_ctlTask = ctlTask; +} + +} // namespace nr::ue diff --git a/src/ue/rls/udp_task.hpp b/src/ue/rls/udp_task.hpp new file mode 100644 index 000000000..8ee004957 --- /dev/null +++ b/src/ue/rls/udp_task.hpp @@ -0,0 +1,63 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +namespace nr::ue +{ + +class RlsUdpTask : public NtsTask +{ + private: + struct CellInfo + { + InetAddress address; + int64_t lastSeen{}; + int dbm{}; + }; + + private: + std::unique_ptr m_logger; + NtsTask *m_ctlTask; + udp::UdpServer *m_server; + uint64_t m_sti; + std::vector m_searchSpace; + std::unordered_map m_cells; + int64_t m_lastLoop; + Vector3 m_simPos; + + public: + explicit RlsUdpTask(TaskBase *base, uint64_t sti, const std::vector &searchSpace); + ~RlsUdpTask() override = default; + + protected: + void onStart() override; + void onLoop() override; + void onQuit() override; + + private: + void sendRlsPdu(const InetAddress &addr, const rls::RlsMessage &msg); + void receiveRlsPdu(const InetAddress &addr, std::unique_ptr &&msg); + void onSignalChangeOrLost(uint64_t sti); + void heartbeatCycle(uint64_t time, const Vector3 &simPos); + + public: + void initialize(NtsTask *ctlTask); + void send(uint64_t sti, const rls::RlsMessage &msg); +}; + +} // namespace nr::ue diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 85bbbc211..1259e4008 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -54,6 +54,7 @@ enum class NtsMessageType UE_NAS_TO_NAS, UE_RLS_TO_RRC, UE_RLS_TO_APP, + UE_RLS_TO_RLS, UE_NAS_TO_APP, }; From 308666c05112f79768899982a156868331a2aff2 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 18:33:37 +0300 Subject: [PATCH 003/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 48 +++++++++++++++++++++++++++++++++++++++++ src/ue/rls/ctl_task.hpp | 39 +++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/ue/rls/ctl_task.cpp create mode 100644 src/ue/rls/ctl_task.hpp diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp new file mode 100644 index 000000000..ba0d37b3a --- /dev/null +++ b/src/ue/rls/ctl_task.cpp @@ -0,0 +1,48 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "ctl_task.hpp" + +namespace nr::ue +{ + +RlsControlTask::RlsControlTask(TaskBase *base) : m_udpTask{} +{ + m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-ctl"); +} + +void RlsControlTask::initialize(RlsUdpTask *udpTask) +{ + m_udpTask = udpTask; +} + +void RlsControlTask::onStart() +{ +} + +void RlsControlTask::onLoop() +{ + NtsMessage *msg = take(); + if (!msg) + return; + + switch (msg->msgType) + { + default: + m_logger->unhandledNts(msg); + break; + } + + delete msg; +} + +void RlsControlTask::onQuit() +{ +} + +} // namespace nr::ue diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp new file mode 100644 index 000000000..f0f16cb99 --- /dev/null +++ b/src/ue/rls/ctl_task.hpp @@ -0,0 +1,39 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#pragma once + +#include "udp_task.hpp" + +#include +#include +#include + +namespace nr::ue +{ + +class RlsControlTask : public NtsTask +{ + private: + std::unique_ptr m_logger; + RlsUdpTask *m_udpTask; + + public: + explicit RlsControlTask(TaskBase *base); + ~RlsControlTask() override = default; + + protected: + void onStart() override; + void onLoop() override; + void onQuit() override; + + public: + void initialize(RlsUdpTask *udpTask); +}; + +} // namespace nr::ue \ No newline at end of file From 557b47e66c23fbe97044b8b2f065e378f43c0403 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 21:20:01 +0300 Subject: [PATCH 004/311] RLS improvements --- src/lib/rls/rls_pdu.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/lib/rls/rls_pdu.cpp b/src/lib/rls/rls_pdu.cpp index 2940b4465..fa4adc7ff 100644 --- a/src/lib/rls/rls_pdu.cpp +++ b/src/lib/rls/rls_pdu.cpp @@ -123,6 +123,20 @@ std::unique_ptr DecodeRlsMessage(const OctetView &stream) res->payload = stream.readOctetString(stream.read4I()); return res; } + else if (msgType == EMessageType::HEARTBEAT) + { + auto res = std::make_unique(sti); + res->simPos.x = stream.read4I(); + res->simPos.y = stream.read4I(); + res->simPos.z = stream.read4I(); + return res; + } + else if (msgType == EMessageType::HEARTBEAT_ACK) + { + auto res = std::make_unique(sti); + res->dbm = stream.read4I(); + return res; + } return nullptr; } From a707dff41fed2b6bfbba41b30a5793bd1708fcd4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 21:21:15 +0300 Subject: [PATCH 005/311] RLS improvements --- src/lib/rls/rls_pdu.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lib/rls/rls_pdu.cpp b/src/lib/rls/rls_pdu.cpp index fa4adc7ff..8c412cb2a 100644 --- a/src/lib/rls/rls_pdu.cpp +++ b/src/lib/rls/rls_pdu.cpp @@ -79,6 +79,18 @@ void EncodeRlsMessage(const RlsMessage &msg, OctetString &stream) stream.appendOctet4(m.payload.length()); stream.append(m.payload); } + else if (msg.msgType == EMessageType::HEARTBEAT) + { + auto &m = (const RlsHeartBeat &)msg; + stream.appendOctet4(m.simPos.x); + stream.appendOctet4(m.simPos.y); + stream.appendOctet4(m.simPos.z); + } + else if (msg.msgType == EMessageType::HEARTBEAT_ACK) + { + auto &m = (const RlsHeartBeatAck &)msg; + stream.appendOctet4(m.dbm); + } } std::unique_ptr DecodeRlsMessage(const OctetView &stream) From d406b7ba23cd58751780ff079b580b260fb60971 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 21:36:01 +0300 Subject: [PATCH 006/311] RLS improvements --- src/gnb/rls/udp_task.cpp | 164 +++++++++++++++++++++++++++++++++++++++ src/gnb/rls/udp_task.hpp | 57 ++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 src/gnb/rls/udp_task.cpp create mode 100644 src/gnb/rls/udp_task.hpp diff --git a/src/gnb/rls/udp_task.cpp b/src/gnb/rls/udp_task.cpp new file mode 100644 index 000000000..01a11d87a --- /dev/null +++ b/src/gnb/rls/udp_task.cpp @@ -0,0 +1,164 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "udp_task.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include + +static constexpr const int BUFFER_SIZE = 16384; + +static constexpr const int LOOP_PERIOD = 1000; +static constexpr const int HEARTBEAT_THRESHOLD = 2000; + +static constexpr const int MIN_ALLOWED_DBM = -120; + +static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) +{ + int deltaX = myPos.x - uePos.x; + int deltaY = myPos.y - uePos.y; + int deltaZ = myPos.z - uePos.z; + + int distance = static_cast(std::sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ)); + if (distance == 0) + return -1; // 0 may be confusing for people + return -distance; +} + +namespace nr::gnb +{ + +RlsUdpTask::RlsUdpTask(TaskBase *base, uint64_t sti, Vector3 phyLocation) + : m_sti{sti}, m_phyLocation{phyLocation}, m_lastLoop{}, m_stiToUe{}, m_ueMap{} +{ + m_logger = base->logBase->makeUniqueLogger("rls"); + + try + { + m_server = new udp::UdpServer(base->config->portalIp, cons::PortalPort); + } + catch (const LibError &e) + { + m_logger->err("RLS failure [%s]", e.what()); + quit(); + return; + } +} + +void RlsUdpTask::onStart() +{ +} + +void RlsUdpTask::onLoop() +{ + auto current = utils::CurrentTimeMillis(); + if (current - m_lastLoop > LOOP_PERIOD) + { + m_lastLoop = current; + heartbeatCycle(current); + } + + uint8_t buffer[BUFFER_SIZE]; + InetAddress peerAddress; + + int size = m_server->Receive(buffer, BUFFER_SIZE, LOOP_PERIOD, peerAddress); + if (size > 0) + { + auto rlsMsg = rls::DecodeRlsMessage(OctetView{buffer, static_cast(size)}); + if (rlsMsg == nullptr) + m_logger->err("Unable to decode RLS message"); + else + receiveRlsPdu(peerAddress, std::move(rlsMsg)); + } +} + +void RlsUdpTask::onQuit() +{ + delete m_server; +} + +void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptr &&msg) +{ + if (msg->msgType == rls::EMessageType::HEARTBEAT) + { + int dbm = EstimateSimulatedDbm(m_phyLocation, ((const rls::RlsHeartBeat &)*msg).simPos); + if (dbm < MIN_ALLOWED_DBM) + { + // if the simulated signal strength is such low, then ignore this message + return; + } + + if (m_stiToUe.count(msg->sti)) + { + int ueId = m_stiToUe[msg->sti]; + m_ueMap[ueId].address = addr; + m_ueMap[ueId].lastSeen = utils::CurrentTimeMillis(); + } + else + { + int ueId = static_cast(m_stiToUe.size()) + 1; + + m_stiToUe[msg->sti] = ueId; + m_ueMap[ueId].address = addr; + m_ueMap[ueId].lastSeen = utils::CurrentTimeMillis(); + + // TODO notify upper layer new UE + } + + rls::RlsHeartBeatAck ack{m_sti}; + ack.dbm = dbm; + + sendRlsPdu(addr, ack); + return; + } + + // TODO notify upper layer new message +} + +void RlsUdpTask::sendRlsPdu(const InetAddress &addr, const rls::RlsMessage &msg) +{ + OctetString stream; + rls::EncodeRlsMessage(msg, stream); + + m_server->Send(addr, stream.data(), static_cast(stream.length())); +} + +void RlsUdpTask::heartbeatCycle(int64_t time) +{ + std::set lostUeId{}; + std::set lostSti{}; + + for (auto &item : m_ueMap) + { + if (time - item.second.lastSeen > HEARTBEAT_THRESHOLD) + { + lostUeId.insert(item.first); + lostSti.insert(item.second.sti); + } + } + + for (uint64_t sti : lostSti) + m_stiToUe.erase(sti); + + for (int ueId : lostUeId) + m_ueMap.erase(ueId); + + for (int ueId : lostUeId) + { + // TODO: notify upper layer + } +} + +} // namespace nr::gnb diff --git a/src/gnb/rls/udp_task.hpp b/src/gnb/rls/udp_task.hpp new file mode 100644 index 000000000..9926e2ff1 --- /dev/null +++ b/src/gnb/rls/udp_task.hpp @@ -0,0 +1,57 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +namespace nr::gnb +{ + +class RlsUdpTask : public NtsTask +{ + private: + struct UeInfo + { + uint64_t sti{}; + InetAddress address; + int64_t lastSeen{}; + }; + + private: + std::unique_ptr m_logger; + udp::UdpServer *m_server; + uint64_t m_sti; + Vector3 m_phyLocation; + int64_t m_lastLoop; + std::unordered_map m_stiToUe; + std::unordered_map m_ueMap; + + public: + explicit RlsUdpTask(TaskBase *base, uint64_t sti, Vector3 phyLocation); + ~RlsUdpTask() override = default; + + protected: + void onStart() override; + void onLoop() override; + void onQuit() override; + + private: + void receiveRlsPdu(const InetAddress &addr, std::unique_ptr &&msg); + void sendRlsPdu(const InetAddress &addr, const rls::RlsMessage &msg); + void heartbeatCycle(int64_t time); +}; + +} // namespace nr::gnb From 745de56c31cf5f90258af1e28ac73a6ae9d3d227 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 21:36:10 +0300 Subject: [PATCH 007/311] RLS improvements --- src/ue/rls/udp_task.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp index 1c111895c..1b9d31f94 100644 --- a/src/ue/rls/udp_task.cpp +++ b/src/ue/rls/udp_task.cpp @@ -89,7 +89,7 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptrsti].address = addr; m_cells[msg->sti].lastSeen = utils::CurrentTimeMillis(); - int newDbm = ((const rls::RlsHeartBeatAck &)msg).dbm; + int newDbm = ((const rls::RlsHeartBeatAck &)*msg).dbm; m_cells[msg->sti].dbm = newDbm; if (oldDbm != newDbm) From 02b8fffc3492d82fc374fb2df5635242534bc27d Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 21:54:40 +0300 Subject: [PATCH 008/311] RLS improvements --- src/ue/rls/udp_task.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp index 1b9d31f94..e04e53514 100644 --- a/src/ue/rls/udp_task.cpp +++ b/src/ue/rls/udp_task.cpp @@ -103,14 +103,14 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptrmsg = std::move(msg); m_ctlTask->push(w); } void RlsUdpTask::onSignalChangeOrLost(uint64_t sti) { - auto *w = new NwRlsToRls(NwRlsToRls::SIGNAL_CHANGED); + auto *w = new NwUeRlsToRls(NwUeRlsToRls::SIGNAL_CHANGED); w->sti = sti; w->dbm = m_cells.count(sti) ? m_cells[sti].dbm : INT32_MIN; m_ctlTask->push(w); From 5733441b56630767ea8a1043070c1c328fb94430 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 21:54:52 +0300 Subject: [PATCH 009/311] RLS improvements --- src/ue/nts.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 2c61cdcd8..2c83ad6f7 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -242,7 +242,7 @@ struct NwUeRlsToApp : NtsMessage } }; -struct NwRlsToRls : NtsMessage +struct NwUeRlsToRls : NtsMessage { enum PR { @@ -257,7 +257,7 @@ struct NwRlsToRls : NtsMessage // RECEIVE_RLS_MESSAGE std::unique_ptr msg{}; - explicit NwRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) + explicit NwUeRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) { } }; From 9f7ada016f0b8ed19955399fdec18379e7c238a8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 22:13:30 +0300 Subject: [PATCH 010/311] RLS improvements --- src/ue/rls/udp_task.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp index e04e53514..70361829c 100644 --- a/src/ue/rls/udp_task.cpp +++ b/src/ue/rls/udp_task.cpp @@ -14,7 +14,8 @@ static constexpr const int BUFFER_SIZE = 16384; static constexpr const int LOOP_PERIOD = 1000; -static constexpr const int HEARTBEAT_THRESHOLD = 2000; +static constexpr const int RECEIVE_TIMEOUT = 200; +static constexpr const int HEARTBEAT_THRESHOLD = 2000; // (LOOP_PERIOD + RECEIVE_TIMEOUT)'dan büyük olmalı namespace nr::ue { @@ -48,7 +49,7 @@ void RlsUdpTask::onLoop() uint8_t buffer[BUFFER_SIZE]; InetAddress peerAddress; - int size = m_server->Receive(buffer, BUFFER_SIZE, LOOP_PERIOD, peerAddress); + int size = m_server->Receive(buffer, BUFFER_SIZE, RECEIVE_TIMEOUT, peerAddress); if (size > 0) { auto rlsMsg = rls::DecodeRlsMessage(OctetView{buffer, static_cast(size)}); From 26e60c17d667f68cb438ccf08e64fc3e87610310 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 22:13:49 +0300 Subject: [PATCH 011/311] RLS improvements --- src/ue/rls/udp_task.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp index 70361829c..162697ab0 100644 --- a/src/ue/rls/udp_task.cpp +++ b/src/ue/rls/udp_task.cpp @@ -1,5 +1,9 @@ // -// Created by ali on 10.05.2021. +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. // #include "udp_task.hpp" From 6dede22427a1e4967809b53222a93381039ab275 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 22:19:46 +0300 Subject: [PATCH 012/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index ba0d37b3a..487858e58 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -33,6 +33,22 @@ void RlsControlTask::onLoop() switch (msg->msgType) { + case NtsMessageType::UE_RLS_TO_RLS: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwUeRlsToRls::SIGNAL_CHANGED: + // TODO + break; + case NwUeRlsToRls::RECEIVE_RLS_MESSAGE: + // TODO + break; + default: + m_logger->unhandledNts(msg); + break; + } + break; + } default: m_logger->unhandledNts(msg); break; From 9f8f38478c7ee5be5f5b223f2673976a07002493 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 22:22:17 +0300 Subject: [PATCH 013/311] RLS improvements --- src/gnb/rls/udp_task.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gnb/rls/udp_task.cpp b/src/gnb/rls/udp_task.cpp index 01a11d87a..50032193f 100644 --- a/src/gnb/rls/udp_task.cpp +++ b/src/gnb/rls/udp_task.cpp @@ -21,7 +21,8 @@ static constexpr const int BUFFER_SIZE = 16384; static constexpr const int LOOP_PERIOD = 1000; -static constexpr const int HEARTBEAT_THRESHOLD = 2000; +static constexpr const int RECEIVE_TIMEOUT = 200; +static constexpr const int HEARTBEAT_THRESHOLD = 2000; // (LOOP_PERIOD + RECEIVE_TIMEOUT)'dan büyük olmalı static constexpr const int MIN_ALLOWED_DBM = -120; @@ -73,7 +74,7 @@ void RlsUdpTask::onLoop() uint8_t buffer[BUFFER_SIZE]; InetAddress peerAddress; - int size = m_server->Receive(buffer, BUFFER_SIZE, LOOP_PERIOD, peerAddress); + int size = m_server->Receive(buffer, BUFFER_SIZE, RECEIVE_TIMEOUT, peerAddress); if (size > 0) { auto rlsMsg = rls::DecodeRlsMessage(OctetView{buffer, static_cast(size)}); From 79d9171ff3b9c0912e702f705a1c95861c409d2a Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 22:32:02 +0300 Subject: [PATCH 014/311] RLS improvements --- src/gnb/nts.hpp | 22 ++++++++++++++++++++++ src/gnb/rls/udp_task.cpp | 39 ++++++++++++++++++++++++++++++++++----- src/gnb/rls/udp_task.hpp | 6 ++++++ src/utils/nts.hpp | 1 + 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index cb3176bce..0b7c54fed 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -86,6 +87,27 @@ struct NwGnbGtpToRls : NtsMessage } }; +struct NwGnbRlsToRls : NtsMessage +{ + enum PR + { + SIGNAL_DETECTED, + SIGNAL_LOST, + RECEIVE_RLS_MESSAGE + } present; + + // SIGNAL_DETECTED + // SIGNAL_LOST + int ueId{}; + + // RECEIVE_RLS_MESSAGE + std::unique_ptr msg{}; + + explicit NwGnbRlsToRls(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RLS), present(present) + { + } +}; + struct NwGnbRrcToRls : NtsMessage { enum PR diff --git a/src/gnb/rls/udp_task.cpp b/src/gnb/rls/udp_task.cpp index 50032193f..ad99ff38d 100644 --- a/src/gnb/rls/udp_task.cpp +++ b/src/gnb/rls/udp_task.cpp @@ -42,7 +42,7 @@ namespace nr::gnb { RlsUdpTask::RlsUdpTask(TaskBase *base, uint64_t sti, Vector3 phyLocation) - : m_sti{sti}, m_phyLocation{phyLocation}, m_lastLoop{}, m_stiToUe{}, m_ueMap{} + : m_ctlTask{}, m_sti{sti}, m_phyLocation{phyLocation}, m_lastLoop{}, m_stiToUe{}, m_ueMap{}, m_newIdCounter{} { m_logger = base->logBase->makeUniqueLogger("rls"); @@ -109,13 +109,15 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptr(m_stiToUe.size()) + 1; + int ueId = ++m_newIdCounter; m_stiToUe[msg->sti] = ueId; m_ueMap[ueId].address = addr; m_ueMap[ueId].lastSeen = utils::CurrentTimeMillis(); - // TODO notify upper layer new UE + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_DETECTED); + w->ueId = ueId; + m_ctlTask->push(w); } rls::RlsHeartBeatAck ack{m_sti}; @@ -125,7 +127,16 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptrsti)) + { + // if no HB received yet, and the message is not HB, then ignore the message + return; + } + + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::RECEIVE_RLS_MESSAGE); + w->ueId = m_stiToUe[msg->sti]; + w->msg = std::move(msg); + m_ctlTask->push(w); } void RlsUdpTask::sendRlsPdu(const InetAddress &addr, const rls::RlsMessage &msg) @@ -158,8 +169,26 @@ void RlsUdpTask::heartbeatCycle(int64_t time) for (int ueId : lostUeId) { - // TODO: notify upper layer + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_LOST); + w->ueId = ueId; + m_ctlTask->push(w); + } +} + +void RlsUdpTask::initialize(NtsTask *ctlTask) +{ + m_ctlTask = ctlTask; +} + +void RlsUdpTask::send(int ueId, const rls::RlsMessage &msg) +{ + if (!m_ueMap.count(ueId)) + { + // ignore the message + return; } + + sendRlsPdu(m_ueMap[ueId].address, msg); } } // namespace nr::gnb diff --git a/src/gnb/rls/udp_task.hpp b/src/gnb/rls/udp_task.hpp index 9926e2ff1..5bcd41795 100644 --- a/src/gnb/rls/udp_task.hpp +++ b/src/gnb/rls/udp_task.hpp @@ -33,11 +33,13 @@ class RlsUdpTask : public NtsTask private: std::unique_ptr m_logger; udp::UdpServer *m_server; + NtsTask *m_ctlTask; uint64_t m_sti; Vector3 m_phyLocation; int64_t m_lastLoop; std::unordered_map m_stiToUe; std::unordered_map m_ueMap; + int m_newIdCounter; public: explicit RlsUdpTask(TaskBase *base, uint64_t sti, Vector3 phyLocation); @@ -52,6 +54,10 @@ class RlsUdpTask : public NtsTask void receiveRlsPdu(const InetAddress &addr, std::unique_ptr &&msg); void sendRlsPdu(const InetAddress &addr, const rls::RlsMessage &msg); void heartbeatCycle(int64_t time); + + public: + void initialize(NtsTask *ctlTask); + void send(int ueId, const rls::RlsMessage &msg); }; } // namespace nr::gnb diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 1259e4008..b3d29ddf1 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -39,6 +39,7 @@ enum class NtsMessageType GNB_RLS_TO_GTP, GNB_GTP_TO_RLS, GNB_RRC_TO_RLS, + GNB_RLS_TO_RLS, GNB_NGAP_TO_RRC, GNB_RRC_TO_NGAP, GNB_NGAP_TO_GTP, From 739be8b10753012724272e201586b02b16f9969b Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 10 May 2021 22:49:48 +0300 Subject: [PATCH 015/311] RLS improvements --- src/gnb/rls/ctl_task.cpp | 67 ++++++++++++++++++++++++++++++++++++++++ src/gnb/rls/ctl_task.hpp | 39 +++++++++++++++++++++++ src/gnb/rls/udp_task.cpp | 2 +- 3 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/gnb/rls/ctl_task.cpp create mode 100644 src/gnb/rls/ctl_task.hpp diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp new file mode 100644 index 000000000..2cd0196d0 --- /dev/null +++ b/src/gnb/rls/ctl_task.cpp @@ -0,0 +1,67 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "ctl_task.hpp" + +namespace nr::gnb +{ + +RlsControlTask::RlsControlTask(TaskBase *base) : m_udpTask{} +{ + m_logger = base->logBase->makeUniqueLogger("rls-ctl"); +} + +void RlsControlTask::initialize(RlsUdpTask *udpTask) +{ + m_udpTask = udpTask; +} + +void RlsControlTask::onStart() +{ +} + +void RlsControlTask::onLoop() +{ + NtsMessage *msg = take(); + if (!msg) + return; + + switch (msg->msgType) + { + case NtsMessageType::GNB_RLS_TO_RLS: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwGnbRlsToRls::SIGNAL_DETECTED: + // TODO + break; + case NwGnbRlsToRls::SIGNAL_LOST: + // TODO + break; + case NwGnbRlsToRls::RECEIVE_RLS_MESSAGE: + // TODO + break; + default: + m_logger->unhandledNts(msg); + break; + } + break; + } + default: + m_logger->unhandledNts(msg); + break; + } + + delete msg; +} + +void RlsControlTask::onQuit() +{ +} + +} // namespace nr::gnb diff --git a/src/gnb/rls/ctl_task.hpp b/src/gnb/rls/ctl_task.hpp new file mode 100644 index 000000000..91af26da4 --- /dev/null +++ b/src/gnb/rls/ctl_task.hpp @@ -0,0 +1,39 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#pragma once + +#include "udp_task.hpp" + +#include +#include +#include + +namespace nr::gnb +{ + +class RlsControlTask : public NtsTask +{ + private: + std::unique_ptr m_logger; + RlsUdpTask *m_udpTask; + + public: + explicit RlsControlTask(TaskBase *base); + ~RlsControlTask() override = default; + + protected: + void onStart() override; + void onLoop() override; + void onQuit() override; + + public: + void initialize(RlsUdpTask *udpTask); +}; + +} // namespace nr::ue \ No newline at end of file diff --git a/src/gnb/rls/udp_task.cpp b/src/gnb/rls/udp_task.cpp index ad99ff38d..c0b449808 100644 --- a/src/gnb/rls/udp_task.cpp +++ b/src/gnb/rls/udp_task.cpp @@ -44,7 +44,7 @@ namespace nr::gnb RlsUdpTask::RlsUdpTask(TaskBase *base, uint64_t sti, Vector3 phyLocation) : m_ctlTask{}, m_sti{sti}, m_phyLocation{phyLocation}, m_lastLoop{}, m_stiToUe{}, m_ueMap{}, m_newIdCounter{} { - m_logger = base->logBase->makeUniqueLogger("rls"); + m_logger = base->logBase->makeUniqueLogger("rls-udp"); try { From 14f9233e1a787a5185b273ac41696897cca1f145 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 20:33:15 +0300 Subject: [PATCH 016/311] RLS improvements --- src/ue/nts.hpp | 8 +++---- src/ue/rls/udp_task.cpp | 46 +++++++++++++++++++++++++++++------------ src/ue/rls/udp_task.hpp | 7 +++++-- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 2c83ad6f7..8c831ade7 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -250,13 +250,13 @@ struct NwUeRlsToRls : NtsMessage SIGNAL_CHANGED, } present; - // SIGNAL_CHANGED - uint64_t sti{}; - int dbm{}; - // RECEIVE_RLS_MESSAGE + int cellId{}; std::unique_ptr msg{}; + // SIGNAL_CHANGED + int dbm{}; + explicit NwUeRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) { } diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp index 162697ab0..527fcb7b8 100644 --- a/src/ue/rls/udp_task.cpp +++ b/src/ue/rls/udp_task.cpp @@ -25,7 +25,7 @@ namespace nr::ue { RlsUdpTask::RlsUdpTask(TaskBase *base, uint64_t sti, const std::vector &searchSpace) - : m_ctlTask{}, m_sti{sti}, m_searchSpace{}, m_cells{}, m_lastLoop{} + : m_ctlTask{}, m_sti{sti}, m_searchSpace{}, m_cells{}, m_cellIdToSti{}, m_lastLoop{}, m_cellIdCounter{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-udp"); @@ -77,16 +77,25 @@ void RlsUdpTask::sendRlsPdu(const InetAddress &addr, const rls::RlsMessage &msg) m_server->Send(addr, stream.data(), static_cast(stream.length())); } -void RlsUdpTask::send(uint64_t sti, const rls::RlsMessage &msg) +void RlsUdpTask::send(int cellId, const rls::RlsMessage &msg) { - if (m_cells.count(sti)) + if (m_cellIdToSti.count(cellId)) + { + auto sti = m_cellIdToSti[cellId]; sendRlsPdu(m_cells[sti].address, msg); + } } void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptr &&msg) { if (msg->msgType == rls::EMessageType::HEARTBEAT_ACK) { + if (!m_cells.count(msg->sti)) + { + m_cells[msg->sti].cellId = ++m_cellIdCounter; + m_cellIdToSti[m_cells[msg->sti].cellId] = msg->sti; + } + int oldDbm = INT32_MIN; if (m_cells.count(msg->sti)) oldDbm = m_cells[msg->sti].dbm; @@ -98,7 +107,7 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptrsti].dbm = newDbm; if (oldDbm != newDbm) - onSignalChangeOrLost(msg->sti); + onSignalChangeOrLost(m_cells[msg->sti].cellId); return; } @@ -109,34 +118,45 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptrcellId = m_cells[msg->sti].cellId; w->msg = std::move(msg); m_ctlTask->push(w); } -void RlsUdpTask::onSignalChangeOrLost(uint64_t sti) +void RlsUdpTask::onSignalChangeOrLost(int cellId) { + int dbm = INT32_MIN; + if (m_cellIdToSti.count(cellId)) + { + auto sti = m_cellIdToSti[cellId]; + dbm = m_cells[sti].dbm; + } + auto *w = new NwUeRlsToRls(NwUeRlsToRls::SIGNAL_CHANGED); - w->sti = sti; - w->dbm = m_cells.count(sti) ? m_cells[sti].dbm : INT32_MIN; + w->cellId = cellId; + w->dbm = dbm; m_ctlTask->push(w); } void RlsUdpTask::heartbeatCycle(uint64_t time, const Vector3 &simPos) { - std::set stiToRemove; + std::set> toRemove; for (auto &cell : m_cells) { auto delta = time - cell.second.lastSeen; if (delta > HEARTBEAT_THRESHOLD) - stiToRemove.insert(cell.first); + toRemove.insert({cell.first, cell.second.cellId}); } - for (auto sti : stiToRemove) - m_cells.erase(sti); + for (auto cell : toRemove) + { + m_cells.erase(cell.first); + m_cellIdToSti.erase(cell.second); + } - for (auto sti : stiToRemove) - onSignalChangeOrLost(sti); + for (auto cell : toRemove) + onSignalChangeOrLost(cell.second); for (auto &addr : m_searchSpace) { diff --git a/src/ue/rls/udp_task.hpp b/src/ue/rls/udp_task.hpp index 8ee004957..b33b8423c 100644 --- a/src/ue/rls/udp_task.hpp +++ b/src/ue/rls/udp_task.hpp @@ -28,6 +28,7 @@ class RlsUdpTask : public NtsTask InetAddress address; int64_t lastSeen{}; int dbm{}; + int cellId{}; }; private: @@ -37,8 +38,10 @@ class RlsUdpTask : public NtsTask uint64_t m_sti; std::vector m_searchSpace; std::unordered_map m_cells; + std::unordered_map m_cellIdToSti; int64_t m_lastLoop; Vector3 m_simPos; + int m_cellIdCounter; public: explicit RlsUdpTask(TaskBase *base, uint64_t sti, const std::vector &searchSpace); @@ -52,12 +55,12 @@ class RlsUdpTask : public NtsTask private: void sendRlsPdu(const InetAddress &addr, const rls::RlsMessage &msg); void receiveRlsPdu(const InetAddress &addr, std::unique_ptr &&msg); - void onSignalChangeOrLost(uint64_t sti); + void onSignalChangeOrLost(int cellId); void heartbeatCycle(uint64_t time, const Vector3 &simPos); public: void initialize(NtsTask *ctlTask); - void send(uint64_t sti, const rls::RlsMessage &msg); + void send(int cellId, const rls::RlsMessage &msg); }; } // namespace nr::ue From 4c9e98b5b69a8791f34b934e478a2883bafdef95 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 20:35:54 +0300 Subject: [PATCH 017/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 4 ++-- src/ue/rls/ctl_task.hpp | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 487858e58..c500a529f 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -38,10 +38,10 @@ void RlsControlTask::onLoop() switch (w->present) { case NwUeRlsToRls::SIGNAL_CHANGED: - // TODO + handleSignalChange(w->cellId, w->dbm); break; case NwUeRlsToRls::RECEIVE_RLS_MESSAGE: - // TODO + handleRlsMessage(w->cellId, *w->msg); break; default: m_logger->unhandledNts(msg); diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index f0f16cb99..e98ccde2a 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -34,6 +34,10 @@ class RlsControlTask : public NtsTask public: void initialize(RlsUdpTask *udpTask); + + private: /* NTS related handlers */ + void handleRlsMessage(int cellId, rls::RlsMessage &msg); + void handleSignalChange(int cellId, int dbm); }; } // namespace nr::ue \ No newline at end of file From 09e012d5ac08bc8db38780a37048f27c31ed3c2e Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 20:37:21 +0300 Subject: [PATCH 018/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index c500a529f..c2add4f47 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -61,4 +61,12 @@ void RlsControlTask::onQuit() { } +void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) +{ +} + +void RlsControlTask::handleSignalChange(int cellId, int dbm) +{ +} + } // namespace nr::ue From 22d92e5dde153e5220acba5568fb13aad57dc48a Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 20:44:58 +0300 Subject: [PATCH 019/311] RLS improvements --- src/ue/rls/ctl_task.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index e98ccde2a..2d67f6fac 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -10,6 +10,7 @@ #include "udp_task.hpp" +#include #include #include #include @@ -35,9 +36,11 @@ class RlsControlTask : public NtsTask public: void initialize(RlsUdpTask *udpTask); - private: /* NTS related handlers */ + private: /* Service Access Point */ void handleRlsMessage(int cellId, rls::RlsMessage &msg); void handleSignalChange(int cellId, int dbm); + void handleRrcDelivery(int cellId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data); + void handleDataDelivery(int cellId, int psi, OctetString &&data); }; } // namespace nr::ue \ No newline at end of file From 8dda13c77a58b9ed26ef9b61e14fcb59984e4ba1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 20:47:11 +0300 Subject: [PATCH 020/311] RLS improvements --- src/ue/nts.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 8c831ade7..8c32397a1 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -219,7 +219,7 @@ struct NwUeAppToRls : NtsMessage // DATA_PDU_DELIVERY int psi{}; - OctetString pdu{}; + OctetString pdu; explicit NwUeAppToRls(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_RLS), present(present) { From c16b6cac903d3d6220c7739f2785df9770bc240b Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 20:50:54 +0300 Subject: [PATCH 021/311] RLS improvements --- src/ue/nts.hpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 8c32397a1..c56a35813 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -248,15 +248,37 @@ struct NwUeRlsToRls : NtsMessage { RECEIVE_RLS_MESSAGE, SIGNAL_CHANGED, + UPLINK_DATA, + DOWNLINK_DATA, + UPLINK_RRC, + DOWNLINK_RRC, } present; // RECEIVE_RLS_MESSAGE + // UPLINK_RRC + // DOWNLINK_RRC int cellId{}; + + // RECEIVE_RLS_MESSAGE std::unique_ptr msg{}; // SIGNAL_CHANGED int dbm{}; + // UPLINK_DATA + // DOWNLINK_DATA + int psi{}; + + // UPLINK_DATA + // DOWNLINK_DATA + // UPLINK_RRC + // DOWNLINK_RRC + OctetString data; + + // UPLINK_RRC + // DOWNLINK_RRC + rrc::RrcChannel rrcChannel{}; + explicit NwUeRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) { } From fa549ca5edf54887e726ca3a50118c63edeab89c Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 20:53:46 +0300 Subject: [PATCH 022/311] RLS improvements --- src/ue/nts.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index c56a35813..bbf96ebd9 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -279,6 +279,9 @@ struct NwUeRlsToRls : NtsMessage // DOWNLINK_RRC rrc::RrcChannel rrcChannel{}; + // DOWNLINK_RRC + uint32_t pduId{}; + explicit NwUeRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) { } From 8e58ef2ce685ddeccf2057379ceab07da82dceae Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 20:53:54 +0300 Subject: [PATCH 023/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 6 ++++++ src/ue/rls/ctl_task.hpp | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index c2add4f47..e9e191401 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -43,6 +43,12 @@ void RlsControlTask::onLoop() case NwUeRlsToRls::RECEIVE_RLS_MESSAGE: handleRlsMessage(w->cellId, *w->msg); break; + case NwUeRlsToRls::UPLINK_DATA: + handleUplinkDataDelivery(w->cellId, w->psi, std::move(w->data)); + break; + case NwUeRlsToRls::UPLINK_RRC: + handleUplinkRrcDelivery(w->cellId, w->pduId, w->rrcChannel, std::move(w->data)); + break; default: m_logger->unhandledNts(msg); break; diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 2d67f6fac..61c1b1159 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -39,8 +39,8 @@ class RlsControlTask : public NtsTask private: /* Service Access Point */ void handleRlsMessage(int cellId, rls::RlsMessage &msg); void handleSignalChange(int cellId, int dbm); - void handleRrcDelivery(int cellId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data); - void handleDataDelivery(int cellId, int psi, OctetString &&data); + void handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data); + void handleUplinkDataDelivery(int cellId, int psi, OctetString &&data); }; } // namespace nr::ue \ No newline at end of file From a325feec664b1375ad4deafe28e4cbd3f7506a12 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 21:38:06 +0300 Subject: [PATCH 024/311] RLS improvements --- src/lib/rls/rls_pdu.hpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/lib/rls/rls_pdu.hpp b/src/lib/rls/rls_pdu.hpp index e9b5d395e..81663c61e 100644 --- a/src/lib/rls/rls_pdu.hpp +++ b/src/lib/rls/rls_pdu.hpp @@ -29,6 +29,9 @@ enum class EMessageType : uint8_t HEARTBEAT = 4, HEARTBEAT_ACK = 5, + + PDU_TRANSMISSION = 6, + PDU_TRANSMISSION_ACK = 7, }; enum class EPduType : uint8_t @@ -99,6 +102,27 @@ struct RlsPduDelivery : RlsMessage } }; +struct RlsPduTransmission : RlsMessage +{ + EPduType pduType{}; + OctetString pdu{}; + uint32_t payload{}; + uint32_t pduId{}; + + explicit RlsPduTransmission(uint64_t sti) : RlsMessage(EMessageType::PDU_TRANSMISSION, sti) + { + } +}; + +struct RlsPduTransmissionAck : RlsMessage +{ + std::vector sequences; + + explicit RlsPduTransmissionAck(uint64_t sti) : RlsMessage(EMessageType::PDU_TRANSMISSION_ACK, sti) + { + } +}; + void EncodeRlsMessage(const RlsMessage &msg, OctetString &stream); std::unique_ptr DecodeRlsMessage(const OctetView &stream); From c8a6ae48ca9c52d8b918fbed13aab16da2e7d473 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 21:40:50 +0300 Subject: [PATCH 025/311] RLS improvements --- src/lib/rls/rls_pdu.cpp | 15 +++++++++++++++ src/lib/rls/rls_pdu.hpp | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/lib/rls/rls_pdu.cpp b/src/lib/rls/rls_pdu.cpp index 8c412cb2a..7ba8b989d 100644 --- a/src/lib/rls/rls_pdu.cpp +++ b/src/lib/rls/rls_pdu.cpp @@ -91,6 +91,21 @@ void EncodeRlsMessage(const RlsMessage &msg, OctetString &stream) auto &m = (const RlsHeartBeatAck &)msg; stream.appendOctet4(m.dbm); } + else if (msg.msgType == EMessageType::PDU_TRANSMISSION) + { + auto &m = (const RlsPduTransmission &)msg; + stream.appendOctet(static_cast(m.pduType)); + stream.appendOctet4(m.pduId); + stream.appendOctet4(m.payload); + stream.append(m.pdu); + } + else if (msg.msgType == EMessageType::PDU_TRANSMISSION_ACK) + { + auto &m = (const RlsPduTransmissionAck &)msg; + stream.appendOctet4(static_cast(m.pduIds.size())); + for (auto pduId : m.pduIds) + stream.appendOctet4(pduId); + } } std::unique_ptr DecodeRlsMessage(const OctetView &stream) diff --git a/src/lib/rls/rls_pdu.hpp b/src/lib/rls/rls_pdu.hpp index 81663c61e..d97b7117a 100644 --- a/src/lib/rls/rls_pdu.hpp +++ b/src/lib/rls/rls_pdu.hpp @@ -105,9 +105,9 @@ struct RlsPduDelivery : RlsMessage struct RlsPduTransmission : RlsMessage { EPduType pduType{}; - OctetString pdu{}; - uint32_t payload{}; uint32_t pduId{}; + uint32_t payload{}; + OctetString pdu{}; explicit RlsPduTransmission(uint64_t sti) : RlsMessage(EMessageType::PDU_TRANSMISSION, sti) { @@ -116,7 +116,7 @@ struct RlsPduTransmission : RlsMessage struct RlsPduTransmissionAck : RlsMessage { - std::vector sequences; + std::vector pduIds; explicit RlsPduTransmissionAck(uint64_t sti) : RlsMessage(EMessageType::PDU_TRANSMISSION_ACK, sti) { From 4da7261dcfb01a7db1f0c6042c92e5bbe61358f7 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 21:45:49 +0300 Subject: [PATCH 026/311] RLS improvements --- src/lib/rls/rls_pdu.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/lib/rls/rls_pdu.cpp b/src/lib/rls/rls_pdu.cpp index 7ba8b989d..f3ffeb8ba 100644 --- a/src/lib/rls/rls_pdu.cpp +++ b/src/lib/rls/rls_pdu.cpp @@ -94,9 +94,10 @@ void EncodeRlsMessage(const RlsMessage &msg, OctetString &stream) else if (msg.msgType == EMessageType::PDU_TRANSMISSION) { auto &m = (const RlsPduTransmission &)msg; - stream.appendOctet(static_cast(m.pduType)); + stream.appendOctet(static_cast(m.pduType)); stream.appendOctet4(m.pduId); stream.appendOctet4(m.payload); + stream.appendOctet4(m.pdu.length()); stream.append(m.pdu); } else if (msg.msgType == EMessageType::PDU_TRANSMISSION_ACK) @@ -164,6 +165,24 @@ std::unique_ptr DecodeRlsMessage(const OctetView &stream) res->dbm = stream.read4I(); return res; } + else if (msgType == EMessageType::PDU_TRANSMISSION) + { + auto res = std::make_unique(sti); + res->pduType = static_cast((uint8_t)stream.read()); + res->pduId = stream.read4UI(); + res->payload = stream.read4UI(); + res->pdu = stream.readOctetString(stream.read4I()); + return res; + } + else if (msgType == EMessageType::PDU_TRANSMISSION_ACK) + { + auto res = std::make_unique(sti); + auto count = stream.read4UI(); + res->pduIds.reserve(count); + for (uint32_t i = 0; i < count; i++) + res->pduIds.push_back(stream.read4UI()); + return res; + } return nullptr; } From e796709d8e3100344f7ef85a9fb191638b360d04 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 21:46:29 +0300 Subject: [PATCH 027/311] RLS improvements --- src/ue/rls/ctl_task.hpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 61c1b1159..b51446bf9 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -20,12 +20,22 @@ namespace nr::ue class RlsControlTask : public NtsTask { + private: + struct PduInfo + { + OctetString pdu; + rrc::RrcChannel rrcChannel{}; + int64_t sentTime{}; + }; + private: std::unique_ptr m_logger; RlsUdpTask *m_udpTask; + std::unordered_map m_pduMap; + uint64_t m_sti; public: - explicit RlsControlTask(TaskBase *base); + explicit RlsControlTask(TaskBase *base, uint64_t sti); ~RlsControlTask() override = default; protected: From e8985cacbe918071c05e1e0a5d898cabebd473ce Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 21:47:23 +0300 Subject: [PATCH 028/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 87 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index e9e191401..a799f00a7 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -8,10 +8,14 @@ #include "ctl_task.hpp" +#include + +static constexpr const size_t MAX_PDU_COUNT = 128; + namespace nr::ue { -RlsControlTask::RlsControlTask(TaskBase *base) : m_udpTask{} +RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) : m_udpTask{}, m_pduMap{}, m_sti{sti} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-ctl"); } @@ -69,10 +73,91 @@ void RlsControlTask::onQuit() void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) { + if (msg.msgType == rls::EMessageType::PDU_TRANSMISSION_ACK) + { + auto &m = (rls::RlsPduTransmissionAck &)msg; + for (auto pduId : m.pduIds) + m_pduMap.erase(pduId); + } + else if (msg.msgType == rls::EMessageType::PDU_TRANSMISSION) + { + auto &m = (rls::RlsPduTransmission &)msg; + if (m.pduId != 0) + { + // TODO: Send ACK + } + + if (m.pduType == rls::EPduType::DATA) + { + // NOTE: Data packet may be received from a cell other than serving cell + // (This is not a problem for RRC, but for DATA), normally we should avoid this, no need for now. + (void)cellId; + + int psi = static_cast(m.payload); + + // TODO: send to upper layer [PSI, DATA] + } + else if (m.pduType == rls::EPduType::RRC) + { + auto rrcChannel = static_cast(m.payload); + + // TODO: send to upper layer [rrcChannel, DATA] + } + else + { + // TODO: log + } + } + else + { + // TODO: log + } } void RlsControlTask::handleSignalChange(int cellId, int dbm) { + // TODO transparently send to the RRC +} + +void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data) +{ + if (pduId != 0) + { + if (m_pduMap.count(pduId)) + { + // TODO: issue RLF + return; + } + + if (m_pduMap.size() > MAX_PDU_COUNT) + { + // TODO: issue RLF + return; + } + + m_pduMap[pduId].pdu = data.copy(); + m_pduMap[pduId].rrcChannel = channel; + m_pduMap[pduId].sentTime = utils::CurrentTimeMillis(); + } + + rls::RlsPduTransmission msg{m_sti}; + msg.pduType = rls::EPduType::RRC; + msg.pdu = std::move(data); + msg.payload = static_cast(channel); + msg.pduId = pduId; + + m_udpTask->send(cellId, msg); +} + +void RlsControlTask::handleUplinkDataDelivery(int cellId, int psi, OctetString &&data) +{ + rls::RlsPduTransmission msg{m_sti}; + msg.pduType = rls::EPduType::DATA; + msg.pdu = std::move(data); + msg.payload = static_cast(psi); + msg.pduId = 0; + + m_udpTask->send(cellId, msg); } } // namespace nr::ue From 5919f7d4c39b91f65970102670f9ea380d2ef8ae Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 21:49:47 +0300 Subject: [PATCH 029/311] RLS improvements --- src/ue/rls/ctl_task.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index b51446bf9..55d3a59a8 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -46,7 +46,7 @@ class RlsControlTask : public NtsTask public: void initialize(RlsUdpTask *udpTask); - private: /* Service Access Point */ + private: void handleRlsMessage(int cellId, rls::RlsMessage &msg); void handleSignalChange(int cellId, int dbm); void handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data); From d1b6856cb7238d25cd573ad014b5686a683fb5b8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 21:50:24 +0300 Subject: [PATCH 030/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index a799f00a7..e7bab9ab2 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -126,12 +126,16 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr if (m_pduMap.count(pduId)) { // TODO: issue RLF + + m_pduMap.clear(); return; } if (m_pduMap.size() > MAX_PDU_COUNT) { // TODO: issue RLF + + m_pduMap.clear(); return; } From 1b5c01d87a9ea7cc45991317dc7eb2ede754ac99 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:10:09 +0300 Subject: [PATCH 031/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 6 ++---- src/ue/rls/ctl_task.hpp | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index e7bab9ab2..32fae5a12 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -15,7 +15,7 @@ static constexpr const size_t MAX_PDU_COUNT = 128; namespace nr::ue { -RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) : m_udpTask{}, m_pduMap{}, m_sti{sti} +RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) : m_udpTask{}, m_pduMap{}, m_sti{sti}, m_pendingAck{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-ctl"); } @@ -83,9 +83,7 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) { auto &m = (rls::RlsPduTransmission &)msg; if (m.pduId != 0) - { - // TODO: Send ACK - } + m_pendingAck.push_back(m.pduId); if (m.pduType == rls::EPduType::DATA) { diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 55d3a59a8..249b77d4b 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -10,6 +10,9 @@ #include "udp_task.hpp" +#include +#include + #include #include #include @@ -33,6 +36,7 @@ class RlsControlTask : public NtsTask RlsUdpTask *m_udpTask; std::unordered_map m_pduMap; uint64_t m_sti; + std::vector m_pendingAck; public: explicit RlsControlTask(TaskBase *base, uint64_t sti); From 459965201b9cd401b8675d3cdc803f976d5a8206 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:18:08 +0300 Subject: [PATCH 032/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 47 ++++++++++++++++++++++++++++++++++++++++- src/ue/rls/ctl_task.hpp | 4 +++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 32fae5a12..084309d15 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -12,6 +12,12 @@ static constexpr const size_t MAX_PDU_COUNT = 128; +static constexpr const int TIMER_ID_ACK_CONTROL = 1; +static constexpr const int TIMER_ID_ACK_SEND = 2; + +static constexpr const int TIMER_PERIOD_ACK_CONTROL = 3000; +static constexpr const int TIMER_PERIOD_ACK_SEND = 2250; + namespace nr::ue { @@ -27,6 +33,8 @@ void RlsControlTask::initialize(RlsUdpTask *udpTask) void RlsControlTask::onStart() { + setTimer(TIMER_ID_ACK_CONTROL, TIMER_PERIOD_ACK_CONTROL); + setTimer(TIMER_ID_ACK_SEND, TIMER_PERIOD_ACK_SEND); } void RlsControlTask::onLoop() @@ -59,6 +67,20 @@ void RlsControlTask::onLoop() } break; } + case NtsMessageType::TIMER_EXPIRED: { + auto *w = dynamic_cast(msg); + if (w->timerId == TIMER_ID_ACK_CONTROL) + { + setTimer(TIMER_ID_ACK_CONTROL, TIMER_PERIOD_ACK_CONTROL); + onAckControlTimerExpired(); + } + else if (w->timerId == TIMER_ID_ACK_SEND) + { + setTimer(TIMER_ID_ACK_SEND, TIMER_PERIOD_ACK_SEND); + onAckSendTimerExpired(); + } + break; + } default: m_logger->unhandledNts(msg); break; @@ -83,7 +105,7 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) { auto &m = (rls::RlsPduTransmission &)msg; if (m.pduId != 0) - m_pendingAck.push_back(m.pduId); + m_pendingAck[m.pduId] = cellId; if (m.pduType == rls::EPduType::DATA) { @@ -162,4 +184,27 @@ void RlsControlTask::handleUplinkDataDelivery(int cellId, int psi, OctetString & m_udpTask->send(cellId, msg); } +void RlsControlTask::onAckControlTimerExpired() +{ + // TODO +} + +void RlsControlTask::onAckSendTimerExpired() +{ + std::unordered_map> ackData; + + for (auto &pendingAck : m_pendingAck) + ackData[pendingAck.second].push_back(pendingAck.first); + + m_pendingAck.clear(); + + for (auto &item : ackData) + { + rls::RlsPduTransmissionAck msg{m_sti}; + msg.pduIds = std::move(item.second); + + m_udpTask->send(item.first, msg); + } +} + } // namespace nr::ue diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 249b77d4b..2c0369d76 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -36,7 +36,7 @@ class RlsControlTask : public NtsTask RlsUdpTask *m_udpTask; std::unordered_map m_pduMap; uint64_t m_sti; - std::vector m_pendingAck; + std::unordered_map m_pendingAck; public: explicit RlsControlTask(TaskBase *base, uint64_t sti); @@ -55,6 +55,8 @@ class RlsControlTask : public NtsTask void handleSignalChange(int cellId, int dbm); void handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data); void handleUplinkDataDelivery(int cellId, int psi, OctetString &&data); + void onAckControlTimerExpired(); + void onAckSendTimerExpired(); }; } // namespace nr::ue \ No newline at end of file From e909991ecc33e367863c4a9640b15bcb3ad13e6a Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:19:34 +0300 Subject: [PATCH 033/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 10 +++------- src/ue/rls/ctl_task.hpp | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 084309d15..b827f26fd 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -105,7 +105,7 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) { auto &m = (rls::RlsPduTransmission &)msg; if (m.pduId != 0) - m_pendingAck[m.pduId] = cellId; + m_pendingAck[cellId].push_back(m.pduId); if (m.pduType == rls::EPduType::DATA) { @@ -191,14 +191,10 @@ void RlsControlTask::onAckControlTimerExpired() void RlsControlTask::onAckSendTimerExpired() { - std::unordered_map> ackData; - - for (auto &pendingAck : m_pendingAck) - ackData[pendingAck.second].push_back(pendingAck.first); - + auto copy = m_pendingAck; m_pendingAck.clear(); - for (auto &item : ackData) + for (auto &item : copy) { rls::RlsPduTransmissionAck msg{m_sti}; msg.pduIds = std::move(item.second); diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 2c0369d76..48a57e24e 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -36,7 +36,7 @@ class RlsControlTask : public NtsTask RlsUdpTask *m_udpTask; std::unordered_map m_pduMap; uint64_t m_sti; - std::unordered_map m_pendingAck; + std::unordered_map> m_pendingAck; public: explicit RlsControlTask(TaskBase *base, uint64_t sti); From c81d4a2fd82d1064e8febbdf01ce1b4c91fa74dc Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:23:45 +0300 Subject: [PATCH 034/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index b827f26fd..701ca4587 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -10,12 +10,13 @@ #include -static constexpr const size_t MAX_PDU_COUNT = 128; +static constexpr const size_t MAX_PDU_COUNT = 256; +static constexpr const int MAX_PDU_TTL = 3000; static constexpr const int TIMER_ID_ACK_CONTROL = 1; static constexpr const int TIMER_ID_ACK_SEND = 2; -static constexpr const int TIMER_PERIOD_ACK_CONTROL = 3000; +static constexpr const int TIMER_PERIOD_ACK_CONTROL = 1500; static constexpr const int TIMER_PERIOD_ACK_SEND = 2250; namespace nr::ue @@ -186,7 +187,20 @@ void RlsControlTask::handleUplinkDataDelivery(int cellId, int psi, OctetString & void RlsControlTask::onAckControlTimerExpired() { - // TODO + int64_t current = utils::CurrentTimeMillis(); + + std::vector transmissionFailures; + + for (auto &pdu : m_pduMap) + { + auto delta = current - pdu.second.sentTime; + if (delta > MAX_PDU_TTL) + transmissionFailures.push_back(std::move(pdu.second)); + } + + m_pduMap.clear(); + + // TODO: Notify transmisson failures } void RlsControlTask::onAckSendTimerExpired() From 1139725c1b95e3b7571effc567c297c79a579acf Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:27:04 +0300 Subject: [PATCH 035/311] RLS improvements --- src/lib/rls/rls_base.cpp | 15 +++++++++++++++ src/lib/rls/rls_base.hpp | 19 +++++++++++++++++++ src/ue/nts.hpp | 8 ++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/lib/rls/rls_base.cpp create mode 100644 src/lib/rls/rls_base.hpp diff --git a/src/lib/rls/rls_base.cpp b/src/lib/rls/rls_base.cpp new file mode 100644 index 000000000..f2a5ce76d --- /dev/null +++ b/src/lib/rls/rls_base.cpp @@ -0,0 +1,15 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "rls_base.hpp" + +namespace rls +{ + +} + diff --git a/src/lib/rls/rls_base.hpp b/src/lib/rls/rls_base.hpp new file mode 100644 index 000000000..72c35c912 --- /dev/null +++ b/src/lib/rls/rls_base.hpp @@ -0,0 +1,19 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "rls_pdu.hpp" + +namespace rls +{ + +enum class ERlfCause +{ + +}; + +} \ No newline at end of file diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index bbf96ebd9..65341b667 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -249,9 +249,10 @@ struct NwUeRlsToRls : NtsMessage RECEIVE_RLS_MESSAGE, SIGNAL_CHANGED, UPLINK_DATA, - DOWNLINK_DATA, UPLINK_RRC, + DOWNLINK_DATA, DOWNLINK_RRC, + RADIO_LINK_FAILURE, } present; // RECEIVE_RLS_MESSAGE @@ -282,6 +283,9 @@ struct NwUeRlsToRls : NtsMessage // DOWNLINK_RRC uint32_t pduId{}; + // RADIO_LINK_FAILURE + rls::ERlfCause rlfCause{}; + explicit NwUeRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) { } From 5805cdca3cec7a47d0f1595628856398dbbd9cb9 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:34:50 +0300 Subject: [PATCH 036/311] RLS improvements --- src/lib/rls/rls_base.hpp | 14 ++++++++++++-- src/ue/nts.hpp | 6 +++++- src/ue/rls/ctl_task.cpp | 28 ++++++++++++++++++++-------- src/ue/rls/ctl_task.hpp | 10 +--------- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/lib/rls/rls_base.hpp b/src/lib/rls/rls_base.hpp index 72c35c912..76b1470f5 100644 --- a/src/lib/rls/rls_base.hpp +++ b/src/lib/rls/rls_base.hpp @@ -8,12 +8,22 @@ #include "rls_pdu.hpp" +#include + namespace rls { -enum class ERlfCause +struct PduInfo { + OctetString pdu; + rrc::RrcChannel rrcChannel{}; + int64_t sentTime{}; +}; +enum class ERlfCause +{ + PDU_ID_EXISTS, + PDU_ID_FULL }; -} \ No newline at end of file +} // namespace rls \ No newline at end of file diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 65341b667..2f559d866 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -253,6 +253,7 @@ struct NwUeRlsToRls : NtsMessage DOWNLINK_DATA, DOWNLINK_RRC, RADIO_LINK_FAILURE, + TRANSMISSION_FAILURE, } present; // RECEIVE_RLS_MESSAGE @@ -280,12 +281,15 @@ struct NwUeRlsToRls : NtsMessage // DOWNLINK_RRC rrc::RrcChannel rrcChannel{}; - // DOWNLINK_RRC + // UPLINK_RRC uint32_t pduId{}; // RADIO_LINK_FAILURE rls::ERlfCause rlfCause{}; + // TRANSMISSION_FAILURE + std::vector pduList; + explicit NwUeRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) { } diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 701ca4587..d36c8ff1e 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -114,29 +114,35 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) // (This is not a problem for RRC, but for DATA), normally we should avoid this, no need for now. (void)cellId; - int psi = static_cast(m.payload); - + auto *w = new NwUeRlsToRls(NwUeRlsToRls::DOWNLINK_DATA); + w->psi = static_cast(m.payload); + w->data = std::move(m.pdu); // TODO: send to upper layer [PSI, DATA] } else if (m.pduType == rls::EPduType::RRC) { - auto rrcChannel = static_cast(m.payload); - + auto *w = new NwUeRlsToRls(NwUeRlsToRls::DOWNLINK_RRC); + w->cellId = cellId; + w->rrcChannel = static_cast(m.payload); + w->data = std::move(m.pdu); // TODO: send to upper layer [rrcChannel, DATA] } else { - // TODO: log + m_logger->err("Unhandled RLS PDU type"); } } else { - // TODO: log + m_logger->err("Unhandled RLS message type"); } } void RlsControlTask::handleSignalChange(int cellId, int dbm) { + auto *w = new NwUeRlsToRls(NwUeRlsToRls::SIGNAL_CHANGED); + w->cellId = cellId; + w->dbm = dbm; // TODO transparently send to the RRC } @@ -146,6 +152,8 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr { if (m_pduMap.count(pduId)) { + auto *w = new NwUeRlsToRls(NwUeRlsToRls::RADIO_LINK_FAILURE); + w->rlfCause = rls::ERlfCause::PDU_ID_EXISTS; // TODO: issue RLF m_pduMap.clear(); @@ -154,6 +162,8 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr if (m_pduMap.size() > MAX_PDU_COUNT) { + auto *w = new NwUeRlsToRls(NwUeRlsToRls::RADIO_LINK_FAILURE); + w->rlfCause = rls::ERlfCause::PDU_ID_FULL; // TODO: issue RLF m_pduMap.clear(); @@ -189,7 +199,7 @@ void RlsControlTask::onAckControlTimerExpired() { int64_t current = utils::CurrentTimeMillis(); - std::vector transmissionFailures; + std::vector transmissionFailures; for (auto &pdu : m_pduMap) { @@ -200,7 +210,9 @@ void RlsControlTask::onAckControlTimerExpired() m_pduMap.clear(); - // TODO: Notify transmisson failures + auto *w = new NwUeRlsToRls(NwUeRlsToRls::TRANSMISSION_FAILURE); + w->pduList = std::move(transmissionFailures); + // TODO: Notify transmission failures } void RlsControlTask::onAckSendTimerExpired() diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 48a57e24e..2c605a9ed 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -23,18 +23,10 @@ namespace nr::ue class RlsControlTask : public NtsTask { - private: - struct PduInfo - { - OctetString pdu; - rrc::RrcChannel rrcChannel{}; - int64_t sentTime{}; - }; - private: std::unique_ptr m_logger; RlsUdpTask *m_udpTask; - std::unordered_map m_pduMap; + std::unordered_map m_pduMap; uint64_t m_sti; std::unordered_map> m_pendingAck; From 066c2bfc32a89801e1b7c1a3ddcb84f9b9ec483b Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:38:22 +0300 Subject: [PATCH 037/311] RLS improvements --- src/ue/rls/ctl_task.cpp | 26 ++++++++++++++------------ src/ue/rls/ctl_task.hpp | 3 ++- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index d36c8ff1e..ac9f6430b 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -22,13 +22,15 @@ static constexpr const int TIMER_PERIOD_ACK_SEND = 2250; namespace nr::ue { -RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) : m_udpTask{}, m_pduMap{}, m_sti{sti}, m_pendingAck{} +RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) + : m_mainTask{}, m_udpTask{}, m_pduMap{}, m_sti{sti}, m_pendingAck{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-ctl"); } -void RlsControlTask::initialize(RlsUdpTask *udpTask) +void RlsControlTask::initialize(NtsTask *mainTask, RlsUdpTask *udpTask) { + m_mainTask = mainTask; m_udpTask = udpTask; } @@ -117,7 +119,7 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) auto *w = new NwUeRlsToRls(NwUeRlsToRls::DOWNLINK_DATA); w->psi = static_cast(m.payload); w->data = std::move(m.pdu); - // TODO: send to upper layer [PSI, DATA] + m_mainTask->push(w); } else if (m.pduType == rls::EPduType::RRC) { @@ -125,7 +127,7 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) w->cellId = cellId; w->rrcChannel = static_cast(m.payload); w->data = std::move(m.pdu); - // TODO: send to upper layer [rrcChannel, DATA] + m_mainTask->push(w); } else { @@ -143,7 +145,7 @@ void RlsControlTask::handleSignalChange(int cellId, int dbm) auto *w = new NwUeRlsToRls(NwUeRlsToRls::SIGNAL_CHANGED); w->cellId = cellId; w->dbm = dbm; - // TODO transparently send to the RRC + m_mainTask->push(w); } void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data) @@ -152,21 +154,21 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr { if (m_pduMap.count(pduId)) { + m_pduMap.clear(); + auto *w = new NwUeRlsToRls(NwUeRlsToRls::RADIO_LINK_FAILURE); w->rlfCause = rls::ERlfCause::PDU_ID_EXISTS; - // TODO: issue RLF - - m_pduMap.clear(); + m_mainTask->push(w); return; } if (m_pduMap.size() > MAX_PDU_COUNT) { + m_pduMap.clear(); + auto *w = new NwUeRlsToRls(NwUeRlsToRls::RADIO_LINK_FAILURE); w->rlfCause = rls::ERlfCause::PDU_ID_FULL; - // TODO: issue RLF - - m_pduMap.clear(); + m_mainTask->push(w); return; } @@ -212,7 +214,7 @@ void RlsControlTask::onAckControlTimerExpired() auto *w = new NwUeRlsToRls(NwUeRlsToRls::TRANSMISSION_FAILURE); w->pduList = std::move(transmissionFailures); - // TODO: Notify transmission failures + m_mainTask->push(w); } void RlsControlTask::onAckSendTimerExpired() diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 2c605a9ed..c75d7e6d5 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -25,6 +25,7 @@ class RlsControlTask : public NtsTask { private: std::unique_ptr m_logger; + NtsTask *m_mainTask; RlsUdpTask *m_udpTask; std::unordered_map m_pduMap; uint64_t m_sti; @@ -40,7 +41,7 @@ class RlsControlTask : public NtsTask void onQuit() override; public: - void initialize(RlsUdpTask *udpTask); + void initialize(NtsTask *mainTask, RlsUdpTask *udpTask); private: void handleRlsMessage(int cellId, rls::RlsMessage &msg); From d998bea37e5ac2f7fb0fc598a2924d85a90b9f8a Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:38:58 +0300 Subject: [PATCH 038/311] RLS improvements --- src/lib/rls/rls_pdu.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/rls/rls_pdu.hpp b/src/lib/rls/rls_pdu.hpp index d97b7117a..d9e71715c 100644 --- a/src/lib/rls/rls_pdu.hpp +++ b/src/lib/rls/rls_pdu.hpp @@ -22,10 +22,10 @@ enum class EMessageType : uint8_t { RESERVED = 0, - CELL_INFO_REQUEST = 1, - CELL_INFO_RESPONSE = 2, + CELL_INFO_REQUEST = 1, // TODO: deprecate + CELL_INFO_RESPONSE = 2, // TODO: deprecate - PDU_DELIVERY = 3, + PDU_DELIVERY = 3, // TODO: deprecate HEARTBEAT = 4, HEARTBEAT_ACK = 5, From a9f54d0259db09157bd2094599bd0fd3adb5a3fe Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:43:49 +0300 Subject: [PATCH 039/311] RLS improvements --- src/ue/nts.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 2f559d866..0ecdcdebe 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -259,6 +259,7 @@ struct NwUeRlsToRls : NtsMessage // RECEIVE_RLS_MESSAGE // UPLINK_RRC // DOWNLINK_RRC + // SIGNAL_CHANGED int cellId{}; // RECEIVE_RLS_MESSAGE From cc39964869540975567170d4516397e3c44b5d8e Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:47:23 +0300 Subject: [PATCH 040/311] RLS developments --- src/ue/rls/ctl_task.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index ac9f6430b..d6ab6b143 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -199,6 +199,9 @@ void RlsControlTask::handleUplinkDataDelivery(int cellId, int psi, OctetString & void RlsControlTask::onAckControlTimerExpired() { + if (m_pduMap.empty()) + return; + int64_t current = utils::CurrentTimeMillis(); std::vector transmissionFailures; From dbac9b2af28f9f139416296a1fd466cdb93b3847 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 22:54:14 +0300 Subject: [PATCH 041/311] RLS developments --- src/ue/nts.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 0ecdcdebe..ae01d680f 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -260,6 +260,7 @@ struct NwUeRlsToRls : NtsMessage // UPLINK_RRC // DOWNLINK_RRC // SIGNAL_CHANGED + // UPLINK_DATA int cellId{}; // RECEIVE_RLS_MESSAGE From acbfb38e19c1b6d2f67be65771176c9d6e65ac91 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 23:03:12 +0300 Subject: [PATCH 042/311] RLS developments --- src/ue/rls/ctl_task.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index d6ab6b143..b65d4e5af 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -199,9 +199,6 @@ void RlsControlTask::handleUplinkDataDelivery(int cellId, int psi, OctetString & void RlsControlTask::onAckControlTimerExpired() { - if (m_pduMap.empty()) - return; - int64_t current = utils::CurrentTimeMillis(); std::vector transmissionFailures; @@ -215,9 +212,12 @@ void RlsControlTask::onAckControlTimerExpired() m_pduMap.clear(); - auto *w = new NwUeRlsToRls(NwUeRlsToRls::TRANSMISSION_FAILURE); - w->pduList = std::move(transmissionFailures); - m_mainTask->push(w); + if (!transmissionFailures.empty()) + { + auto *w = new NwUeRlsToRls(NwUeRlsToRls::TRANSMISSION_FAILURE); + w->pduList = std::move(transmissionFailures); + m_mainTask->push(w); + } } void RlsControlTask::onAckSendTimerExpired() From f8029dd776eee3e17ac889cb56954cf300124829 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 11 May 2021 23:08:16 +0300 Subject: [PATCH 043/311] RLS developments --- src/ue/rls/ctl_task.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index b65d4e5af..f919f97c9 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -10,7 +10,7 @@ #include -static constexpr const size_t MAX_PDU_COUNT = 256; +static constexpr const size_t MAX_PDU_COUNT = 128; static constexpr const int MAX_PDU_TTL = 3000; static constexpr const int TIMER_ID_ACK_CONTROL = 1; From 9d3613863ebff8df559dad0989472af6f4d377eb Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 16:48:29 +0300 Subject: [PATCH 044/311] RLS developments --- src/ue/nts.hpp | 3 ++- src/ue/rls/ctl_task.cpp | 20 +++++++++++++------- src/ue/rls/ctl_task.hpp | 3 ++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index ae01d680f..ab538d7da 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -254,13 +254,14 @@ struct NwUeRlsToRls : NtsMessage DOWNLINK_RRC, RADIO_LINK_FAILURE, TRANSMISSION_FAILURE, + ASSIGN_SERVING_CELL, } present; // RECEIVE_RLS_MESSAGE // UPLINK_RRC // DOWNLINK_RRC // SIGNAL_CHANGED - // UPLINK_DATA + // ASSIGN_SERVING_CELL int cellId{}; // RECEIVE_RLS_MESSAGE diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index f919f97c9..47036f693 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -23,7 +23,7 @@ namespace nr::ue { RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) - : m_mainTask{}, m_udpTask{}, m_pduMap{}, m_sti{sti}, m_pendingAck{} + : m_mainTask{}, m_udpTask{}, m_pduMap{}, m_sti{sti}, m_pendingAck{}, m_servingCell{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-ctl"); } @@ -59,11 +59,14 @@ void RlsControlTask::onLoop() handleRlsMessage(w->cellId, *w->msg); break; case NwUeRlsToRls::UPLINK_DATA: - handleUplinkDataDelivery(w->cellId, w->psi, std::move(w->data)); + handleUplinkDataDelivery(w->psi, std::move(w->data)); break; case NwUeRlsToRls::UPLINK_RRC: handleUplinkRrcDelivery(w->cellId, w->pduId, w->rrcChannel, std::move(w->data)); break; + case NwUeRlsToRls::ASSIGN_SERVING_CELL: + m_servingCell = w->cellId; + break; default: m_logger->unhandledNts(msg); break; @@ -112,9 +115,12 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) if (m.pduType == rls::EPduType::DATA) { - // NOTE: Data packet may be received from a cell other than serving cell - // (This is not a problem for RRC, but for DATA), normally we should avoid this, no need for now. - (void)cellId; + if (cellId != m_servingCell) + { + // NOTE: Data packet may be received from a cell other than serving cell + // Ignore the packet if this is the case. Other cell can only send RRC, but not DATA + return; + } auto *w = new NwUeRlsToRls(NwUeRlsToRls::DOWNLINK_DATA); w->psi = static_cast(m.payload); @@ -186,7 +192,7 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr m_udpTask->send(cellId, msg); } -void RlsControlTask::handleUplinkDataDelivery(int cellId, int psi, OctetString &&data) +void RlsControlTask::handleUplinkDataDelivery(int psi, OctetString &&data) { rls::RlsPduTransmission msg{m_sti}; msg.pduType = rls::EPduType::DATA; @@ -194,7 +200,7 @@ void RlsControlTask::handleUplinkDataDelivery(int cellId, int psi, OctetString & msg.payload = static_cast(psi); msg.pduId = 0; - m_udpTask->send(cellId, msg); + m_udpTask->send(m_servingCell, msg); } void RlsControlTask::onAckControlTimerExpired() diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index c75d7e6d5..1ade5c1fe 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -30,6 +30,7 @@ class RlsControlTask : public NtsTask std::unordered_map m_pduMap; uint64_t m_sti; std::unordered_map> m_pendingAck; + int m_servingCell; public: explicit RlsControlTask(TaskBase *base, uint64_t sti); @@ -47,7 +48,7 @@ class RlsControlTask : public NtsTask void handleRlsMessage(int cellId, rls::RlsMessage &msg); void handleSignalChange(int cellId, int dbm); void handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data); - void handleUplinkDataDelivery(int cellId, int psi, OctetString &&data); + void handleUplinkDataDelivery(int psi, OctetString &&data); void onAckControlTimerExpired(); void onAckSendTimerExpired(); }; From fa7def73a8b313ed841fa09884fcee07df602d89 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 16:52:32 +0300 Subject: [PATCH 045/311] RLS developments --- src/gnb/nts.hpp | 17 ++++++++++++++++- src/gnb/rls/ctl_task.cpp | 6 ++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 0b7c54fed..ed03e18b8 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -93,16 +93,31 @@ struct NwGnbRlsToRls : NtsMessage { SIGNAL_DETECTED, SIGNAL_LOST, - RECEIVE_RLS_MESSAGE + RECEIVE_RLS_MESSAGE, + DOWNLINK_RRC, + DOWNLINK_DATA } present; // SIGNAL_DETECTED // SIGNAL_LOST + // DOWNLINK_RRC + // DOWNLINK_DATA int ueId{}; // RECEIVE_RLS_MESSAGE std::unique_ptr msg{}; + // DOWNLINK_DATA + int psi{}; + + // DOWNLINK_DATA + // DOWNLINK_RRC + OctetString data; + + // DOWNLINK_RRC + uint32_t pduId{}; + rrc::RrcChannel rrcChannel{}; + explicit NwGnbRlsToRls(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RLS), present(present) { } diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 2cd0196d0..0e3784ea2 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -46,6 +46,12 @@ void RlsControlTask::onLoop() case NwGnbRlsToRls::RECEIVE_RLS_MESSAGE: // TODO break; + case NwGnbRlsToRls::DOWNLINK_DATA: + // TODO + break; + case NwGnbRlsToRls::DOWNLINK_RRC: + // TODO + break; default: m_logger->unhandledNts(msg); break; From 26fc9fc60ba80f579a0b1e70393fa14656beec65 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 16:57:35 +0300 Subject: [PATCH 046/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 10 +++++----- src/gnb/rls/ctl_task.hpp | 9 ++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 0e3784ea2..21c1fc761 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -38,19 +38,19 @@ void RlsControlTask::onLoop() switch (w->present) { case NwGnbRlsToRls::SIGNAL_DETECTED: - // TODO + handleSignalDetected(w->ueId); break; case NwGnbRlsToRls::SIGNAL_LOST: - // TODO + handleSignalLost(w->ueId); break; case NwGnbRlsToRls::RECEIVE_RLS_MESSAGE: - // TODO + handleRlsMessage(w->ueId, *w->msg); break; case NwGnbRlsToRls::DOWNLINK_DATA: - // TODO + handleDownlinkDataDelivery(w->ueId, w->psi, std::move(w->data)); break; case NwGnbRlsToRls::DOWNLINK_RRC: - // TODO + handleDownlinkRrcDelivery(w->ueId, w->pduId, w->rrcChannel, std::move(w->data)); break; default: m_logger->unhandledNts(msg); diff --git a/src/gnb/rls/ctl_task.hpp b/src/gnb/rls/ctl_task.hpp index 91af26da4..f4a4860c4 100644 --- a/src/gnb/rls/ctl_task.hpp +++ b/src/gnb/rls/ctl_task.hpp @@ -34,6 +34,13 @@ class RlsControlTask : public NtsTask public: void initialize(RlsUdpTask *udpTask); + + private: + void handleSignalDetected(int ueId); + void handleSignalLost(int ueId); + void handleRlsMessage(int ueId, rls::RlsMessage &msg); + void handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data); + void handleDownlinkDataDelivery(int ueId, int psi, OctetString &&data); }; -} // namespace nr::ue \ No newline at end of file +} // namespace nr::gnb \ No newline at end of file From 15e20b1cbcf92b0a7be0db215eb1aa5ca5fbfbb9 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 16:59:48 +0300 Subject: [PATCH 047/311] RLS developments --- src/ue/rls/ctl_task.cpp | 2 +- src/ue/rls/ctl_task.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 47036f693..51b14b1b6 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -23,7 +23,7 @@ namespace nr::ue { RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) - : m_mainTask{}, m_udpTask{}, m_pduMap{}, m_sti{sti}, m_pendingAck{}, m_servingCell{} + : m_sti{sti}, m_servingCell{}, m_mainTask{}, m_udpTask{}, m_pduMap{}, m_pendingAck{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-ctl"); } diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 1ade5c1fe..32244a55f 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -25,12 +25,12 @@ class RlsControlTask : public NtsTask { private: std::unique_ptr m_logger; + uint64_t m_sti; + int m_servingCell; NtsTask *m_mainTask; RlsUdpTask *m_udpTask; std::unordered_map m_pduMap; - uint64_t m_sti; std::unordered_map> m_pendingAck; - int m_servingCell; public: explicit RlsControlTask(TaskBase *base, uint64_t sti); From c8c4f47cb3dfc961e3554c73104c9d0df6c3adbb Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:00:19 +0300 Subject: [PATCH 048/311] RLS developments --- src/gnb/nts.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index ed03e18b8..e5a47152c 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include From fb77d5bc88d5e24ddcfebc24e9bf2c4ca8475246 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:06:40 +0300 Subject: [PATCH 049/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 95 +++++++++++++++++++++++++++++++++++++++- src/gnb/rls/ctl_task.hpp | 5 ++- 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 21c1fc761..245cc9b49 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -8,10 +8,15 @@ #include "ctl_task.hpp" +#include + +static constexpr const size_t MAX_PDU_COUNT = 4096; +static constexpr const int MAX_PDU_TTL = 3000; + namespace nr::gnb { -RlsControlTask::RlsControlTask(TaskBase *base) : m_udpTask{} +RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) : m_sti{sti}, m_udpTask{}, m_pduMap{}, m_pendingAck{} { m_logger = base->logBase->makeUniqueLogger("rls-ctl"); } @@ -70,4 +75,92 @@ void RlsControlTask::onQuit() { } +void RlsControlTask::handleSignalDetected(int ueId) +{ + // TODO: tranparently notify upper layer +} + +void RlsControlTask::handleSignalLost(int ueId) +{ + // TODO: tranparently notify upper layer +} + +void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) +{ + if (msg.msgType == rls::EMessageType::PDU_TRANSMISSION_ACK) + { + auto &m = (rls::RlsPduTransmissionAck &)msg; + for (auto pduId : m.pduIds) + m_pduMap.erase(pduId); + } + else if (msg.msgType == rls::EMessageType::PDU_TRANSMISSION) + { + auto &m = (rls::RlsPduTransmission &)msg; + if (m.pduId != 0) + m_pendingAck[ueId].push_back(m.pduId); + + if (m.pduType == rls::EPduType::DATA) + { + // TODO: send to the upper layer + } + else if (m.pduType == rls::EPduType::RRC) + { + // TODO: send to the upper layer + } + else + { + m_logger->err("Unhandled RLS PDU type"); + } + } + else + { + m_logger->err("Unhandled RLS message type"); + } +} + +void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data) +{ + if (pduId != 0) + { + if (m_pduMap.count(pduId)) + { + m_pduMap.clear(); + + // TODO: Send RLF + return; + } + + if (m_pduMap.size() > MAX_PDU_COUNT) + { + m_pduMap.clear(); + + // TODO: Send RLF + return; + } + + m_pduMap[pduId].pdu = data.copy(); + m_pduMap[pduId].rrcChannel = channel; + m_pduMap[pduId].sentTime = utils::CurrentTimeMillis(); + } + + rls::RlsPduTransmission msg{m_sti}; + msg.pduType = rls::EPduType::RRC; + msg.pdu = std::move(data); + msg.payload = static_cast(channel); + msg.pduId = pduId; + + m_udpTask->send(ueId, msg); +} + +void RlsControlTask::handleDownlinkDataDelivery(int ueId, int psi, OctetString &&data) +{ + rls::RlsPduTransmission msg{m_sti}; + msg.pduType = rls::EPduType::DATA; + msg.pdu = std::move(data); + msg.payload = static_cast(psi); + msg.pduId = 0; + + m_udpTask->send(ueId, msg); +} + } // namespace nr::gnb diff --git a/src/gnb/rls/ctl_task.hpp b/src/gnb/rls/ctl_task.hpp index f4a4860c4..7f90798c5 100644 --- a/src/gnb/rls/ctl_task.hpp +++ b/src/gnb/rls/ctl_task.hpp @@ -21,10 +21,13 @@ class RlsControlTask : public NtsTask { private: std::unique_ptr m_logger; + uint64_t m_sti; RlsUdpTask *m_udpTask; + std::unordered_map m_pduMap; + std::unordered_map> m_pendingAck; public: - explicit RlsControlTask(TaskBase *base); + explicit RlsControlTask(TaskBase *base, uint64_t sti); ~RlsControlTask() override = default; protected: From 16dbe1adf332fc193e30f185e1e3e09eec3b7d63 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:07:39 +0300 Subject: [PATCH 050/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 22 ++++++++++++++++++++++ src/gnb/rls/ctl_task.hpp | 2 ++ 2 files changed, 24 insertions(+) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 245cc9b49..54b0f6426 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -13,6 +13,12 @@ static constexpr const size_t MAX_PDU_COUNT = 4096; static constexpr const int MAX_PDU_TTL = 3000; +static constexpr const int TIMER_ID_ACK_CONTROL = 1; +static constexpr const int TIMER_ID_ACK_SEND = 2; + +static constexpr const int TIMER_PERIOD_ACK_CONTROL = 1500; +static constexpr const int TIMER_PERIOD_ACK_SEND = 2250; + namespace nr::gnb { @@ -28,6 +34,8 @@ void RlsControlTask::initialize(RlsUdpTask *udpTask) void RlsControlTask::onStart() { + setTimer(TIMER_ID_ACK_CONTROL, TIMER_PERIOD_ACK_CONTROL); + setTimer(TIMER_ID_ACK_SEND, TIMER_PERIOD_ACK_SEND); } void RlsControlTask::onLoop() @@ -63,6 +71,20 @@ void RlsControlTask::onLoop() } break; } + case NtsMessageType::TIMER_EXPIRED: { + auto *w = dynamic_cast(msg); + if (w->timerId == TIMER_ID_ACK_CONTROL) + { + setTimer(TIMER_ID_ACK_CONTROL, TIMER_PERIOD_ACK_CONTROL); + onAckControlTimerExpired(); + } + else if (w->timerId == TIMER_ID_ACK_SEND) + { + setTimer(TIMER_ID_ACK_SEND, TIMER_PERIOD_ACK_SEND); + onAckSendTimerExpired(); + } + break; + } default: m_logger->unhandledNts(msg); break; diff --git a/src/gnb/rls/ctl_task.hpp b/src/gnb/rls/ctl_task.hpp index 7f90798c5..ad3a53bd3 100644 --- a/src/gnb/rls/ctl_task.hpp +++ b/src/gnb/rls/ctl_task.hpp @@ -44,6 +44,8 @@ class RlsControlTask : public NtsTask void handleRlsMessage(int ueId, rls::RlsMessage &msg); void handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data); void handleDownlinkDataDelivery(int ueId, int psi, OctetString &&data); + void onAckControlTimerExpired(); + void onAckSendTimerExpired(); }; } // namespace nr::gnb \ No newline at end of file From 279e91501dbb0823b3b96f4e902be13bdaf800d7 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:08:36 +0300 Subject: [PATCH 051/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 54b0f6426..4ae356b0b 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -185,4 +185,39 @@ void RlsControlTask::handleDownlinkDataDelivery(int ueId, int psi, OctetString & m_udpTask->send(ueId, msg); } +void RlsControlTask::onAckControlTimerExpired() +{ + int64_t current = utils::CurrentTimeMillis(); + + std::vector transmissionFailures; + + for (auto &pdu : m_pduMap) + { + auto delta = current - pdu.second.sentTime; + if (delta > MAX_PDU_TTL) + transmissionFailures.push_back(std::move(pdu.second)); + } + + m_pduMap.clear(); + + if (!transmissionFailures.empty()) + { + // TODO: send to upper layer + } +} + +void RlsControlTask::onAckSendTimerExpired() +{ + auto copy = m_pendingAck; + m_pendingAck.clear(); + + for (auto &item : copy) + { + rls::RlsPduTransmissionAck msg{m_sti}; + msg.pduIds = std::move(item.second); + + m_udpTask->send(item.first, msg); + } +} + } // namespace nr::gnb From e1e36f7633fa356283a780028bcd4948a2909bbb Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:16:05 +0300 Subject: [PATCH 052/311] RLS developments --- src/gnb/nts.hpp | 20 +++++++++++++++++++- src/gnb/rls/ctl_task.cpp | 30 ++++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index e5a47152c..2381a8ee9 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -95,29 +95,47 @@ struct NwGnbRlsToRls : NtsMessage SIGNAL_LOST, RECEIVE_RLS_MESSAGE, DOWNLINK_RRC, - DOWNLINK_DATA + DOWNLINK_DATA, + UPLINK_RRC, + UPLINK_DATA, + RADIO_LINK_FAILURE, + TRANSMISSION_FAILURE, } present; // SIGNAL_DETECTED // SIGNAL_LOST // DOWNLINK_RRC // DOWNLINK_DATA + // UPLINK_DATA + // UPLINK_RRC int ueId{}; // RECEIVE_RLS_MESSAGE std::unique_ptr msg{}; // DOWNLINK_DATA + // UPLINK_DATA int psi{}; // DOWNLINK_DATA // DOWNLINK_RRC + // UPLINK_DATA + // UPLINK_RRC OctetString data; // DOWNLINK_RRC uint32_t pduId{}; + + // DOWNLINK_RRC + // UPLINK_RRC rrc::RrcChannel rrcChannel{}; + // RADIO_LINK_FAILURE + rls::ERlfCause rlfCause{}; + + // TRANSMISSION_FAILURE + std::vector pduList; + explicit NwGnbRlsToRls(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RLS), present(present) { } diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 4ae356b0b..0aff8cd3a 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -99,12 +99,16 @@ void RlsControlTask::onQuit() void RlsControlTask::handleSignalDetected(int ueId) { - // TODO: tranparently notify upper layer + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_DETECTED); + w->ueId = ueId; + // TODO: push msg } void RlsControlTask::handleSignalLost(int ueId) { - // TODO: tranparently notify upper layer + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_LOST); + w->ueId = ueId; + // TODO: push msg } void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) @@ -123,11 +127,19 @@ void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) if (m.pduType == rls::EPduType::DATA) { - // TODO: send to the upper layer + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::UPLINK_DATA); + w->ueId = ueId; + w->psi = static_cast(m.payload); + w->data = std::move(m.pdu); + // TODO push msg } else if (m.pduType == rls::EPduType::RRC) { - // TODO: send to the upper layer + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::UPLINK_RRC); + w->ueId = ueId; + w->rrcChannel = static_cast(m.payload); + w->data = std::move(m.pdu); + // TODO push msg } else { @@ -148,7 +160,9 @@ void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::Rr { m_pduMap.clear(); - // TODO: Send RLF + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::RADIO_LINK_FAILURE); + w->rlfCause = rls::ERlfCause::PDU_ID_EXISTS; + // TODO: push msg return; } @@ -156,6 +170,8 @@ void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::Rr { m_pduMap.clear(); + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::RADIO_LINK_FAILURE); + w->rlfCause = rls::ERlfCause::PDU_ID_FULL; // TODO: Send RLF return; } @@ -202,7 +218,9 @@ void RlsControlTask::onAckControlTimerExpired() if (!transmissionFailures.empty()) { - // TODO: send to upper layer + auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::TRANSMISSION_FAILURE); + w->pduList = std::move(transmissionFailures); + // TODO: push msg } } From 9df51e4b9c4c45172156a1fe20e6ad0151a70fec Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:18:04 +0300 Subject: [PATCH 053/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 1 + src/lib/rls/rls_base.hpp | 1 + src/ue/rls/ctl_task.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 0aff8cd3a..e718811f0 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -176,6 +176,7 @@ void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::Rr return; } + m_pduMap[pduId].endPointId = ueId; m_pduMap[pduId].pdu = data.copy(); m_pduMap[pduId].rrcChannel = channel; m_pduMap[pduId].sentTime = utils::CurrentTimeMillis(); diff --git a/src/lib/rls/rls_base.hpp b/src/lib/rls/rls_base.hpp index 76b1470f5..afd28afd3 100644 --- a/src/lib/rls/rls_base.hpp +++ b/src/lib/rls/rls_base.hpp @@ -18,6 +18,7 @@ struct PduInfo OctetString pdu; rrc::RrcChannel rrcChannel{}; int64_t sentTime{}; + int endPointId{}; }; enum class ERlfCause diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 51b14b1b6..2aaa71b6f 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -178,6 +178,7 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr return; } + m_pduMap[pduId].endPointId = cellId; m_pduMap[pduId].pdu = data.copy(); m_pduMap[pduId].rrcChannel = channel; m_pduMap[pduId].sentTime = utils::CurrentTimeMillis(); From 5e2120d565d7fcf2517bf1eda7713dd6da363711 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:19:42 +0300 Subject: [PATCH 054/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 20 +++++++++++--------- src/gnb/rls/ctl_task.hpp | 3 ++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index e718811f0..f814d5f35 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -22,13 +22,15 @@ static constexpr const int TIMER_PERIOD_ACK_SEND = 2250; namespace nr::gnb { -RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) : m_sti{sti}, m_udpTask{}, m_pduMap{}, m_pendingAck{} +RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) + : m_sti{sti}, m_mainTask{}, m_udpTask{}, m_pduMap{}, m_pendingAck{} { m_logger = base->logBase->makeUniqueLogger("rls-ctl"); } -void RlsControlTask::initialize(RlsUdpTask *udpTask) +void RlsControlTask::initialize(NtsTask *mainTask, RlsUdpTask *udpTask) { + m_mainTask = mainTask; m_udpTask = udpTask; } @@ -101,14 +103,14 @@ void RlsControlTask::handleSignalDetected(int ueId) { auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_DETECTED); w->ueId = ueId; - // TODO: push msg + m_mainTask->push(w); } void RlsControlTask::handleSignalLost(int ueId) { auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_LOST); w->ueId = ueId; - // TODO: push msg + m_mainTask->push(w); } void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) @@ -131,7 +133,7 @@ void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) w->ueId = ueId; w->psi = static_cast(m.payload); w->data = std::move(m.pdu); - // TODO push msg + m_mainTask->push(w); } else if (m.pduType == rls::EPduType::RRC) { @@ -139,7 +141,7 @@ void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) w->ueId = ueId; w->rrcChannel = static_cast(m.payload); w->data = std::move(m.pdu); - // TODO push msg + m_mainTask->push(w); } else { @@ -162,7 +164,7 @@ void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::Rr auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::RADIO_LINK_FAILURE); w->rlfCause = rls::ERlfCause::PDU_ID_EXISTS; - // TODO: push msg + m_mainTask->push(w); return; } @@ -172,7 +174,7 @@ void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::Rr auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::RADIO_LINK_FAILURE); w->rlfCause = rls::ERlfCause::PDU_ID_FULL; - // TODO: Send RLF + m_mainTask->push(w); return; } @@ -221,7 +223,7 @@ void RlsControlTask::onAckControlTimerExpired() { auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::TRANSMISSION_FAILURE); w->pduList = std::move(transmissionFailures); - // TODO: push msg + m_mainTask->push(w); } } diff --git a/src/gnb/rls/ctl_task.hpp b/src/gnb/rls/ctl_task.hpp index ad3a53bd3..1f8a01096 100644 --- a/src/gnb/rls/ctl_task.hpp +++ b/src/gnb/rls/ctl_task.hpp @@ -22,6 +22,7 @@ class RlsControlTask : public NtsTask private: std::unique_ptr m_logger; uint64_t m_sti; + NtsTask *m_mainTask; RlsUdpTask *m_udpTask; std::unordered_map m_pduMap; std::unordered_map> m_pendingAck; @@ -36,7 +37,7 @@ class RlsControlTask : public NtsTask void onQuit() override; public: - void initialize(RlsUdpTask *udpTask); + void initialize(NtsTask *mainTask, RlsUdpTask *udpTask); private: void handleSignalDetected(int ueId); From d7c058095b8db6b15fd271da48a20cfb471c4453 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:35:00 +0300 Subject: [PATCH 055/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 7 ++++++- src/ue/rls/ctl_task.cpp | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index f814d5f35..33c5f6c5f 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -208,16 +208,21 @@ void RlsControlTask::onAckControlTimerExpired() { int64_t current = utils::CurrentTimeMillis(); + std::vector transmissionFailureIds; std::vector transmissionFailures; for (auto &pdu : m_pduMap) { auto delta = current - pdu.second.sentTime; if (delta > MAX_PDU_TTL) + { + transmissionFailureIds.push_back(pdu.first); transmissionFailures.push_back(std::move(pdu.second)); + } } - m_pduMap.clear(); + for (auto id : transmissionFailureIds) + m_pduMap.erase(id); if (!transmissionFailures.empty()) { diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 2aaa71b6f..74fb4e5a4 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -208,16 +208,21 @@ void RlsControlTask::onAckControlTimerExpired() { int64_t current = utils::CurrentTimeMillis(); + std::vector transmissionFailureIds; std::vector transmissionFailures; for (auto &pdu : m_pduMap) { auto delta = current - pdu.second.sentTime; if (delta > MAX_PDU_TTL) + { + transmissionFailureIds.push_back(pdu.first); transmissionFailures.push_back(std::move(pdu.second)); + } } - m_pduMap.clear(); + for (auto id : transmissionFailureIds) + m_pduMap.erase(id); if (!transmissionFailures.empty()) { From 165fcb56d07543b2d249c2af128c62091a936ca6 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 17:39:39 +0300 Subject: [PATCH 056/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 1 + src/lib/rls/rls_base.hpp | 1 + src/ue/rls/ctl_task.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 33c5f6c5f..d1f5cd765 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -179,6 +179,7 @@ void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::Rr } m_pduMap[pduId].endPointId = ueId; + m_pduMap[pduId].id = pduId; m_pduMap[pduId].pdu = data.copy(); m_pduMap[pduId].rrcChannel = channel; m_pduMap[pduId].sentTime = utils::CurrentTimeMillis(); diff --git a/src/lib/rls/rls_base.hpp b/src/lib/rls/rls_base.hpp index afd28afd3..e021922ac 100644 --- a/src/lib/rls/rls_base.hpp +++ b/src/lib/rls/rls_base.hpp @@ -15,6 +15,7 @@ namespace rls struct PduInfo { + uint32_t id{}; OctetString pdu; rrc::RrcChannel rrcChannel{}; int64_t sentTime{}; diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 74fb4e5a4..3ab11470f 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -179,6 +179,7 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr } m_pduMap[pduId].endPointId = cellId; + m_pduMap[pduId].id = pduId; m_pduMap[pduId].pdu = data.copy(); m_pduMap[pduId].rrcChannel = channel; m_pduMap[pduId].sentTime = utils::CurrentTimeMillis(); From 61e78baa2898c5452f7e272299cec9b42cd845cd Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 18:35:51 +0300 Subject: [PATCH 057/311] RLS developments --- src/gnb/rls/ctl_task.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index d1f5cd765..25db48996 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -240,6 +240,9 @@ void RlsControlTask::onAckSendTimerExpired() for (auto &item : copy) { + if (!item.second.empty()) + continue; + rls::RlsPduTransmissionAck msg{m_sti}; msg.pduIds = std::move(item.second); From 0fbbaa3364381a1970f637323b27a155a4f40d5e Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 12 May 2021 18:36:03 +0300 Subject: [PATCH 058/311] RLS developments --- src/ue/rls/ctl_task.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 3ab11470f..e333aebf9 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -240,6 +240,9 @@ void RlsControlTask::onAckSendTimerExpired() for (auto &item : copy) { + if (!item.second.empty()) + continue; + rls::RlsPduTransmissionAck msg{m_sti}; msg.pduIds = std::move(item.second); From a5e5c48b1ab15fe9d5bcae5c7023d4d51b542a42 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 11:49:54 +0300 Subject: [PATCH 059/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 28 ++++++++++++++++++++++++++++ src/gnb/rrc/task.cpp | 13 +++++++++++++ src/gnb/rrc/task.hpp | 4 ++++ 3 files changed, 45 insertions(+) create mode 100644 src/gnb/rrc/broadcast.cpp diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp new file mode 100644 index 000000000..e8eabc720 --- /dev/null +++ b/src/gnb/rrc/broadcast.cpp @@ -0,0 +1,28 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + + +#include "task.hpp" + +#include +#include + +namespace nr::gnb +{ + +void GnbRrcTask::onBroadcastTimerExpired() +{ + triggerSysInfoBroadcast(); +} + +void GnbRrcTask::triggerSysInfoBroadcast() +{ + // TODO +} + +} // namespace nr::gnb \ No newline at end of file diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index 1ef21ba3f..c3527b270 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -15,6 +15,9 @@ #include #include +static constexpr const int TIMER_ID_SI_BROADCAST = 1; +static constexpr const int TIMER_PERIOD_SI_BROADCAST = 5000; + namespace nr::gnb { @@ -25,6 +28,7 @@ GnbRrcTask::GnbRrcTask(TaskBase *base) : m_base{base}, m_ueCtx{}, m_tidCounter{} void GnbRrcTask::onStart() { + setTimer(TIMER_ID_SI_BROADCAST, TIMER_PERIOD_SI_BROADCAST); } void GnbRrcTask::onQuit() @@ -77,6 +81,15 @@ void GnbRrcTask::onLoop() } break; } + case NtsMessageType::TIMER_EXPIRED: { + auto *w = dynamic_cast(msg); + if (w->timerId == TIMER_ID_SI_BROADCAST) + { + setTimer(TIMER_ID_SI_BROADCAST, TIMER_PERIOD_SI_BROADCAST); + onBroadcastTimerExpired(); + } + break; + } default: m_logger->unhandledNts(msg); break; diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index acc3aaae3..176345c38 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -90,6 +90,10 @@ class GnbRrcTask : public NtsTask void receiveRrcMessage(int ueId, ASN_RRC_UL_CCCH_Message *msg); void receiveRrcMessage(int ueId, ASN_RRC_UL_CCCH1_Message *msg); void receiveRrcMessage(int ueId, ASN_RRC_UL_DCCH_Message *msg); + + /* System Information Broadcast related */ + void onBroadcastTimerExpired(); + void triggerSysInfoBroadcast(); }; } // namespace nr::gnb From 1aa16f4ce113bce9c54a1dcddbd6fd75d4919fec Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 11:50:11 +0300 Subject: [PATCH 060/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp index e8eabc720..6f7308d96 100644 --- a/src/gnb/rrc/broadcast.cpp +++ b/src/gnb/rrc/broadcast.cpp @@ -6,7 +6,6 @@ // and subject to the terms and conditions defined in LICENSE file. // - #include "task.hpp" #include From 19e140bda1a69f7ce59feaeb238dee8fd911b29c Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 11:59:39 +0300 Subject: [PATCH 061/311] RRC developments --- src/gnb/rls/handler.cpp | 91 --------------------------- src/gnb/rls/management.cpp | 75 ----------------------- src/gnb/rls/task.cpp | 90 ++++++++++----------------- src/gnb/rls/task.hpp | 26 +++----- src/gnb/rls/transport.cpp | 53 ---------------- src/lib/app/cli_cmd.cpp | 5 -- src/lib/app/cli_cmd.hpp | 1 - src/lib/rls/rls_pdu.cpp | 87 +------------------------- src/lib/rls/rls_pdu.hpp | 41 +------------ src/ue/app/cmd_handler.cpp | 26 -------- src/ue/rls/measurement.cpp | 122 ------------------------------------- src/ue/rls/task.cpp | 100 +++++++++--------------------- src/ue/rls/transport.cpp | 76 ----------------------- src/ue/ue.cpp | 2 +- 14 files changed, 74 insertions(+), 721 deletions(-) delete mode 100644 src/gnb/rls/handler.cpp delete mode 100644 src/gnb/rls/management.cpp delete mode 100644 src/gnb/rls/transport.cpp delete mode 100644 src/ue/rls/measurement.cpp delete mode 100644 src/ue/rls/transport.cpp diff --git a/src/gnb/rls/handler.cpp b/src/gnb/rls/handler.cpp deleted file mode 100644 index 527d2be9a..000000000 --- a/src/gnb/rls/handler.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// This file is a part of UERANSIM open source project. -// Copyright (c) 2021 ALİ GÜNGÖR. -// -// The software and all associated files are licensed under GPL-3.0 -// and subject to the terms and conditions defined in LICENSE file. -// - -#include "task.hpp" - -#include - -#include -#include - -static int MIN_ALLOWED_DBM = -120; - -static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) -{ - int deltaX = myPos.x - uePos.x; - int deltaY = myPos.y - uePos.y; - int deltaZ = myPos.z - uePos.z; - - int distance = static_cast(std::sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ)); - if (distance == 0) - return -1; // 0 may be confusing for people - return -distance; -} - -namespace nr::gnb -{ - -void GnbRlsTask::handleCellInfoRequest(int ueId, const rls::RlsCellInfoRequest &msg) -{ - int dbm = EstimateSimulatedDbm(m_base->config->phyLocation, msg.simPos); - if (dbm < MIN_ALLOWED_DBM) - { - // if the simulated signal strength is such low, then do not send a response to this message - return; - } - - rls::RlsCellInfoResponse resp{m_sti}; - resp.cellId.nci = m_base->config->nci; - resp.cellId.plmn = m_base->config->plmn; - resp.tac = m_base->config->tac; - resp.dbm = dbm; - resp.gnbName = m_base->config->name; - resp.linkIp = m_base->config->portalIp; - - sendRlsMessage(ueId, resp); -} - -void GnbRlsTask::handleUplinkPduDelivery(int ueId, rls::RlsPduDelivery &msg) -{ - if (msg.pduType == rls::EPduType::RRC) - { - auto *nw = new NwGnbRlsToRrc(NwGnbRlsToRrc::RRC_PDU_DELIVERY); - nw->ueId = ueId; - nw->channel = static_cast(msg.payload.get4I(0)); - nw->pdu = std::move(msg.pdu); - m_base->rrcTask->push(nw); - } - else if (msg.pduType == rls::EPduType::DATA) - { - auto *nw = new NwGnbRlsToGtp(NwGnbRlsToGtp::DATA_PDU_DELIVERY); - nw->ueId = ueId; - nw->psi = msg.payload.get4I(0); - nw->pdu = std::move(msg.pdu); - m_base->gtpTask->push(nw); - } -} - -void GnbRlsTask::handleDownlinkDelivery(int ueId, rls::EPduType pduType, OctetString &&pdu, OctetString &&payload) -{ - rls::RlsPduDelivery resp{m_sti}; - resp.pduType = pduType; - resp.pdu = std::move(pdu); - resp.payload = std::move(payload); - - if (ueId != 0) - { - sendRlsMessage(ueId, resp); - } - else - { - for (auto &ue : m_ueCtx) - sendRlsMessage(ue.first, resp); - } -} - -} // namespace nr::gnb diff --git a/src/gnb/rls/management.cpp b/src/gnb/rls/management.cpp deleted file mode 100644 index fd64fa772..000000000 --- a/src/gnb/rls/management.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// -// This file is a part of UERANSIM open source project. -// Copyright (c) 2021 ALİ GÜNGÖR. -// -// The software and all associated files are licensed under GPL-3.0 -// and subject to the terms and conditions defined in LICENSE file. -// - -#include "task.hpp" - -#include - -#include -#include - -static const int64_t LAST_SEEN_THRESHOLD = 3000; - -namespace nr::gnb -{ - -int GnbRlsTask::updateUeInfo(const InetAddress &addr, uint64_t sti) -{ - if (m_stiToUeId.count(sti)) - { - int ueId = m_stiToUeId[sti]; - auto &ctx = m_ueCtx[ueId]; - ctx->addr = addr; - ctx->lastSeen = utils::CurrentTimeMillis(); - return ueId; - } - else - { - int ueId = ++m_ueIdCounter; - m_stiToUeId[sti] = ueId; - auto ctx = std::make_unique(ueId); - ctx->sti = sti; - ctx->addr = addr; - ctx->lastSeen = utils::CurrentTimeMillis(); - m_ueCtx[ueId] = std::move(ctx); - - m_logger->debug("New UE signal detected, total [%d] UEs in coverage", static_cast(m_stiToUeId.size())); - return ueId; - } -} - -void GnbRlsTask::onPeriodicLostControl() -{ - int64_t current = utils::CurrentTimeMillis(); - - std::set lostUeId{}; - std::set lostSti{}; - - for (auto &item : m_ueCtx) - { - if (current - item.second->lastSeen > LAST_SEEN_THRESHOLD) - { - lostUeId.insert(item.second->ueId); - lostSti.insert(item.second->sti); - } - } - - for (uint64_t sti : lostSti) - m_stiToUeId.erase(sti); - for (int ueId : lostUeId) - { - m_ueCtx.erase(ueId); - m_logger->debug("Signal lost detected for UE[%d]", ueId); - - auto *w = new NwGnbRlsToRrc(NwGnbRlsToRrc::SIGNAL_LOST); - w->ueId = ueId; - m_base->rrcTask->push(w); - } -} - -} // namespace nr::gnb diff --git a/src/gnb/rls/task.cpp b/src/gnb/rls/task.cpp index dcb1e6eef..bc4445530 100644 --- a/src/gnb/rls/task.cpp +++ b/src/gnb/rls/task.cpp @@ -8,41 +8,27 @@ #include "task.hpp" -#include -#include -#include #include -#include -#include - -static const int TIMER_ID_LOST_CONTROL = 1; -static const int TIMER_PERIOD_LOST_CONTROL = 2000; namespace nr::gnb { -GnbRlsTask::GnbRlsTask(TaskBase *base) - : m_base{base}, m_udpTask{}, m_powerOn{}, m_ueCtx{}, m_stiToUeId{}, m_ueIdCounter{} +GnbRlsTask::GnbRlsTask(TaskBase *base) : m_base{base} { m_logger = m_base->logBase->makeUniqueLogger("rls"); m_sti = utils::Random64(); + + m_udpTask = new RlsUdpTask(base, m_sti, base->config->phyLocation); + m_ctlTask = new RlsControlTask(base, m_sti); + + m_udpTask->initialize(m_ctlTask); + m_ctlTask->initialize(this, m_udpTask); } void GnbRlsTask::onStart() { - try - { - m_udpTask = new udp::UdpServerTask(m_base->config->portalIp, cons::PortalPort, this); - m_udpTask->start(); - } - catch (const LibError &e) - { - m_logger->err("RLS failure [%s]", e.what()); - quit(); - return; - } - - setTimer(TIMER_ID_LOST_CONTROL, TIMER_PERIOD_LOST_CONTROL); + m_udpTask->start(); + m_ctlTask->start(); } void GnbRlsTask::onLoop() @@ -53,51 +39,38 @@ void GnbRlsTask::onLoop() switch (msg->msgType) { - case NtsMessageType::GNB_RRC_TO_RLS: { - auto *w = dynamic_cast(msg); + case NtsMessageType::GNB_RLS_TO_RLS: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbRrcToRls::RRC_PDU_DELIVERY: { - handleDownlinkDelivery(w->ueId, rls::EPduType::RRC, std::move(w->pdu), - OctetString::FromOctet4(static_cast(w->channel))); + case NwGnbRlsToRls::SIGNAL_DETECTED: { + m_logger->debug("new UE[%d] detected", w->ueId); break; } - case NwGnbRrcToRls::RADIO_POWER_ON: { - m_powerOn = true; + case NwGnbRlsToRls::SIGNAL_LOST: { + m_logger->debug("UE[%d] signal lost", w->ueId); break; } + case NwGnbRlsToRls::UPLINK_DATA: { + m_logger->debug("UPLINK_DATA ue[%d] psi[%d]", w->ueId, w->psi); + break; } - break; - } - case NtsMessageType::GNB_GTP_TO_RLS: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwGnbGtpToRls::DATA_PDU_DELIVERY: { - handleDownlinkDelivery(w->ueId, rls::EPduType::DATA, std::move(w->pdu), - OctetString::FromOctet4(static_cast(w->psi))); + case NwGnbRlsToRls::UPLINK_RRC: { + m_logger->debug("UPLINK_RRC ue[%d]", w->ueId); break; } + case NwGnbRlsToRls::RADIO_LINK_FAILURE: { + m_logger->debug("radio link failure [%d]", (int)w->rlfCause); + break; } - break; - } - case NtsMessageType::UDP_SERVER_RECEIVE: { - auto *w = dynamic_cast(msg); - auto rlsMsg = rls::DecodeRlsMessage(OctetView{w->packet}); - if (rlsMsg == nullptr) - { - m_logger->err("Unable to decode RLS message"); + case NwGnbRlsToRls::TRANSMISSION_FAILURE: { + m_logger->debug("transmission failure [%s]", ""); + break; + } + default: { + m_logger->unhandledNts(msg); break; } - receiveRlsMessage(w->fromAddress, *rlsMsg); - break; - } - case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); - if (w->timerId == TIMER_ID_LOST_CONTROL) - { - setTimer(TIMER_ID_LOST_CONTROL, TIMER_PERIOD_LOST_CONTROL); - onPeriodicLostControl(); } break; } @@ -111,9 +84,10 @@ void GnbRlsTask::onLoop() void GnbRlsTask::onQuit() { - if (m_udpTask != nullptr) - m_udpTask->quit(); + m_udpTask->quit(); + m_ctlTask->quit(); delete m_udpTask; + delete m_ctlTask; } } // namespace nr::gnb diff --git a/src/gnb/rls/task.hpp b/src/gnb/rls/task.hpp index 8ddaa14ce..969c89338 100644 --- a/src/gnb/rls/task.hpp +++ b/src/gnb/rls/task.hpp @@ -8,6 +8,9 @@ #pragma once +#include "ctl_task.hpp" +#include "udp_task.hpp" + #include #include #include @@ -28,13 +31,11 @@ class GnbRlsTask : public NtsTask private: TaskBase *m_base; std::unique_ptr m_logger; - udp::UdpServerTask *m_udpTask; - bool m_powerOn; + RlsUdpTask *m_udpTask; + RlsControlTask *m_ctlTask; + uint64_t m_sti; - std::unordered_map> m_ueCtx; - std::unordered_map m_stiToUeId; - int m_ueIdCounter; friend class GnbCmdHandler; @@ -46,19 +47,6 @@ class GnbRlsTask : public NtsTask void onStart() override; void onLoop() override; void onQuit() override; - - private: /* Transport */ - void receiveRlsMessage(const InetAddress &addr, rls::RlsMessage &msg); - void sendRlsMessage(int ueId, const rls::RlsMessage &msg); - - private: /* Handler */ - void handleCellInfoRequest(int ueId, const rls::RlsCellInfoRequest &msg); - void handleUplinkPduDelivery(int ueId, rls::RlsPduDelivery &msg); - void handleDownlinkDelivery(int ueId, rls::EPduType pduType, OctetString &&pdu, OctetString &&payload); - - private: /* UE Management */ - int updateUeInfo(const InetAddress &addr, uint64_t sti); - void onPeriodicLostControl(); }; -} // namespace nr::gnb \ No newline at end of file +} // namespace nr::gnb diff --git a/src/gnb/rls/transport.cpp b/src/gnb/rls/transport.cpp deleted file mode 100644 index 43eeaaa97..000000000 --- a/src/gnb/rls/transport.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// -// This file is a part of UERANSIM open source project. -// Copyright (c) 2021 ALİ GÜNGÖR. -// -// The software and all associated files are licensed under GPL-3.0 -// and subject to the terms and conditions defined in LICENSE file. -// - -#include "task.hpp" - -namespace nr::gnb -{ - -void GnbRlsTask::receiveRlsMessage(const InetAddress &addr, rls::RlsMessage &msg) -{ - if (!m_powerOn) - { - // ignore received RLS message - return; - } - - int ueId = updateUeInfo(addr, msg.sti); - - switch (msg.msgType) - { - case rls::EMessageType::CELL_INFO_REQUEST: { - handleCellInfoRequest(ueId, (const rls::RlsCellInfoRequest &)msg); - break; - } - case rls::EMessageType::PDU_DELIVERY: { - handleUplinkPduDelivery(ueId, (rls::RlsPduDelivery &)msg); - break; - } - default: - m_logger->err("Unhandled RLS message received with type[%d]", static_cast(msg.msgType)); - break; - } -} - -void GnbRlsTask::sendRlsMessage(int ueId, const rls::RlsMessage &msg) -{ - if (!m_ueCtx.count(ueId)) - { - m_logger->err("RLS message sending failure, UE[%d] not exists", ueId); - return; - } - - OctetString stream{}; - rls::EncodeRlsMessage(msg, stream); - m_udpTask->send(m_ueCtx[ueId]->addr, stream); -} - -} // namespace nr::gnb diff --git a/src/lib/app/cli_cmd.cpp b/src/lib/app/cli_cmd.cpp index af3fa28e4..0e9b01e20 100644 --- a/src/lib/app/cli_cmd.cpp +++ b/src/lib/app/cli_cmd.cpp @@ -164,7 +164,6 @@ static OrderedMap g_ueCmdEntries = { {"ps-release-all", {"Trigger PDU session release procedures for all active sessions", "", DefaultDesc, false}}, {"deregister", {"Perform a de-registration by the UE", "", DefaultDesc, true}}, - {"coverage", {"Show gNodeB cell coverage information", "", DefaultDesc, false}}, }; static std::unique_ptr GnbCliParseImpl(const std::string &subCmd, const opt::OptionsResult &options, @@ -316,10 +315,6 @@ static std::unique_ptr UeCliParseImpl(const std::string &subCmd, c } return cmd; } - else if (subCmd == "coverage") - { - return std::make_unique(UeCliCommand::COVERAGE); - } return nullptr; } diff --git a/src/lib/app/cli_cmd.hpp b/src/lib/app/cli_cmd.hpp index 94dbb6fdd..9eae2db1c 100644 --- a/src/lib/app/cli_cmd.hpp +++ b/src/lib/app/cli_cmd.hpp @@ -53,7 +53,6 @@ struct UeCliCommand PS_RELEASE, PS_RELEASE_ALL, DE_REGISTER, - COVERAGE, } present; // DE_REGISTER diff --git a/src/lib/rls/rls_pdu.cpp b/src/lib/rls/rls_pdu.cpp index f3ffeb8ba..cb4354467 100644 --- a/src/lib/rls/rls_pdu.cpp +++ b/src/lib/rls/rls_pdu.cpp @@ -13,36 +13,6 @@ namespace rls { -static void AppendPlmn(const Plmn &plmn, OctetString &stream) -{ - stream.appendOctet2(plmn.mcc); - stream.appendOctet2(plmn.mnc); - stream.appendOctet(plmn.isLongMnc ? 1 : 0); -} - -static void AppendGlobalNci(const GlobalNci &nci, OctetString &stream) -{ - AppendPlmn(nci.plmn, stream); - stream.appendOctet8(nci.nci); -} - -static Plmn DecodePlmn(const OctetView &stream) -{ - Plmn res{}; - res.mcc = stream.read2I(); - res.mnc = stream.read2I(); - res.isLongMnc = stream.readI() != 0; - return res; -} - -static GlobalNci DecodeGlobalNci(const OctetView &stream) -{ - GlobalNci res{}; - res.plmn = DecodePlmn(stream); - res.nci = stream.read8L(); - return res; -} - void EncodeRlsMessage(const RlsMessage &msg, OctetString &stream) { stream.appendOctet(0x03); // (Just for old RLS compatibility) @@ -52,34 +22,7 @@ void EncodeRlsMessage(const RlsMessage &msg, OctetString &stream) stream.appendOctet(cons::Patch); stream.appendOctet(static_cast(msg.msgType)); stream.appendOctet8(msg.sti); - if (msg.msgType == EMessageType::CELL_INFO_REQUEST) - { - auto &m = (const RlsCellInfoRequest &)msg; - stream.appendOctet4(m.simPos.x); - stream.appendOctet4(m.simPos.y); - stream.appendOctet4(m.simPos.z); - } - else if (msg.msgType == EMessageType::CELL_INFO_RESPONSE) - { - auto &m = (const RlsCellInfoResponse &)msg; - AppendGlobalNci(m.cellId, stream); - stream.appendOctet4(m.tac); - stream.appendOctet4(m.dbm); - stream.appendOctet4(static_cast(m.gnbName.size())); - stream.appendUtf8(m.gnbName); - stream.appendOctet4(static_cast(m.linkIp.size())); - stream.appendUtf8(m.linkIp); - } - else if (msg.msgType == EMessageType::PDU_DELIVERY) - { - auto &m = (const RlsPduDelivery &)msg; - stream.appendOctet(static_cast(m.pduType)); - stream.appendOctet4(m.pdu.length()); - stream.append(m.pdu); - stream.appendOctet4(m.payload.length()); - stream.append(m.payload); - } - else if (msg.msgType == EMessageType::HEARTBEAT) + if (msg.msgType == EMessageType::HEARTBEAT) { auto &m = (const RlsHeartBeat &)msg; stream.appendOctet4(m.simPos.x); @@ -125,33 +68,7 @@ std::unique_ptr DecodeRlsMessage(const OctetView &stream) auto msgType = static_cast(stream.readI()); uint64_t sti = stream.read8UL(); - if (msgType == EMessageType::CELL_INFO_REQUEST) - { - auto res = std::make_unique(sti); - res->simPos.x = stream.read4I(); - res->simPos.y = stream.read4I(); - res->simPos.z = stream.read4I(); - return res; - } - else if (msgType == EMessageType::CELL_INFO_RESPONSE) - { - auto res = std::make_unique(sti); - res->cellId = DecodeGlobalNci(stream); - res->tac = stream.read4I(); - res->dbm = stream.read4I(); - res->gnbName = stream.readUtf8String(stream.read4I()); - res->linkIp = stream.readUtf8String(stream.read4I()); - return res; - } - else if (msgType == EMessageType::PDU_DELIVERY) - { - auto res = std::make_unique(sti); - res->pduType = static_cast(stream.readI()); - res->pdu = stream.readOctetString(stream.read4I()); - res->payload = stream.readOctetString(stream.read4I()); - return res; - } - else if (msgType == EMessageType::HEARTBEAT) + if (msgType == EMessageType::HEARTBEAT) { auto res = std::make_unique(sti); res->simPos.x = stream.read4I(); diff --git a/src/lib/rls/rls_pdu.hpp b/src/lib/rls/rls_pdu.hpp index d9e71715c..c214976d5 100644 --- a/src/lib/rls/rls_pdu.hpp +++ b/src/lib/rls/rls_pdu.hpp @@ -22,14 +22,12 @@ enum class EMessageType : uint8_t { RESERVED = 0, - CELL_INFO_REQUEST = 1, // TODO: deprecate - CELL_INFO_RESPONSE = 2, // TODO: deprecate - - PDU_DELIVERY = 3, // TODO: deprecate + DEPRECATED1 = 1, + DEPRECATED2 = 2, + DEPRECATED3 = 3, HEARTBEAT = 4, HEARTBEAT_ACK = 5, - PDU_TRANSMISSION = 6, PDU_TRANSMISSION_ACK = 7, }; @@ -69,39 +67,6 @@ struct RlsHeartBeatAck : RlsMessage } }; -struct RlsCellInfoRequest : RlsMessage -{ - Vector3 simPos{}; - - explicit RlsCellInfoRequest(uint64_t sti) : RlsMessage(EMessageType::CELL_INFO_REQUEST, sti) - { - } -}; - -struct RlsCellInfoResponse : RlsMessage -{ - GlobalNci cellId{}; - int tac{}; - int dbm{}; - std::string gnbName{}; - std::string linkIp{}; - - explicit RlsCellInfoResponse(uint64_t sti) : RlsMessage(EMessageType::CELL_INFO_RESPONSE, sti) - { - } -}; - -struct RlsPduDelivery : RlsMessage -{ - EPduType pduType{}; - OctetString pdu{}; - OctetString payload{}; - - explicit RlsPduDelivery(uint64_t sti) : RlsMessage(EMessageType::PDU_DELIVERY, sti) - { - } -}; - struct RlsPduTransmission : RlsMessage { EPduType pduType{}; diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 5863d4fdd..79b99d340 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -114,8 +114,6 @@ void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) {"rm-state", ToJson(m_base->nasTask->mm->m_rmState)}, {"mm-state", ToJson(m_base->nasTask->mm->m_mmSubState)}, {"5u-state", ToJson(m_base->nasTask->mm->m_usim->m_uState)}, - {"camped-cell", - ::ToJson(m_base->rlsTask->m_servingCell.has_value() ? m_base->rlsTask->m_servingCell->gnbName : "")}, {"sim-inserted", m_base->nasTask->mm->m_usim->isValid()}, {"stored-suci", ToJson(m_base->nasTask->mm->m_usim->m_storedSuci)}, {"stored-guti", ToJson(m_base->nasTask->mm->m_usim->m_storedGuti)}, @@ -163,30 +161,6 @@ void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) sendResult(msg.address, "PDU session establishment procedure triggered"); break; } - case app::UeCliCommand::COVERAGE: { - auto &map = m_base->rlsTask->m_activeMeasurements; - if (map.empty()) - { - sendResult(msg.address, "No cell exists in the range"); - break; - } - - std::vector cellInfo{}; - for (auto &entry : map) - { - auto &measurement = entry.second; - cellInfo.push_back(Json::Obj({ - {"gnb", measurement.gnbName}, - {"plmn", ToJson(measurement.cellId.plmn)}, - {"nci", measurement.cellId.nci}, - {"tac", measurement.tac}, - {"signal", std::to_string(measurement.dbm) + "dBm [" + SignalDescription(measurement.dbm) + "]"}, - })); - } - - sendResult(msg.address, Json::Arr(cellInfo).dumpYaml()); - break; - } } } diff --git a/src/ue/rls/measurement.cpp b/src/ue/rls/measurement.cpp deleted file mode 100644 index 38a5e1f25..000000000 --- a/src/ue/rls/measurement.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// This file is a part of UERANSIM open source project. -// Copyright (c) 2021 ALİ GÜNGÖR. -// -// The software and all associated files are licensed under GPL-3.0 -// and subject to the terms and conditions defined in LICENSE file. -// - -#include "task.hpp" -#include -#include -#include - -namespace nr::ue -{ - -void UeRlsTask::onMeasurement() -{ - std::vector entered{}; - std::vector exited{}; - - // compare active and pending measurements - for (auto &m : m_activeMeasurements) - { - if (!m_pendingMeasurements.count(m.first)) - exited.push_back(m.first); - } - for (auto &m : m_pendingMeasurements) - { - if (!m_activeMeasurements.count(m.first)) - entered.push_back(m.first); - } - if (!entered.empty() || !exited.empty()) - onCoverageChange(entered, exited); - - // copy from pending to active measurements - m_activeMeasurements = m_pendingMeasurements; - // clear pending measurements - m_pendingMeasurements = {}; - - // Issue another cell info request for each address in the search space - for (auto &ip : m_cellSearchSpace) - { - rls::RlsCellInfoRequest req{m_sti}; - sendRlsMessage(ip, req); - } - - // Send PLMN search response to the RRC if it is requested - if (m_pendingPlmnResponse) - { - m_pendingPlmnResponse = false; - - std::vector measurements{}; - for (auto &m : m_activeMeasurements) - measurements.push_back(m.second); - - auto *w = new NwUeRlsToRrc(NwUeRlsToRrc::PLMN_SEARCH_RESPONSE); - w->measurements = std::move(measurements); - m_base->rrcTask->push(w); - } -} - -void UeRlsTask::receiveCellInfoResponse(const rls::RlsCellInfoResponse &msg) -{ - UeCellMeasurement meas{}; - meas.sti = msg.sti; - meas.cellId = msg.cellId; - meas.tac = msg.tac; - meas.dbm = msg.dbm; - meas.gnbName = msg.gnbName; - meas.linkIp = msg.linkIp; - - m_pendingMeasurements[meas.cellId] = meas; -} - -void UeRlsTask::onCoverageChange(const std::vector &entered, const std::vector &exited) -{ - m_logger->debug("Coverage change detected. [%d] cell entered, [%d] cell exited", static_cast(entered.size()), - static_cast(exited.size())); - - bool campedCellLost = m_servingCell.has_value() && std::any_of(exited.begin(), exited.end(), [this](auto &i) { - return i == m_servingCell->cellId; - }); - if (campedCellLost) - { - m_logger->warn("Signal lost from camped cell"); - m_servingCell = std::nullopt; - m_base->rrcTask->push(new NwUeRlsToRrc(NwUeRlsToRrc::RADIO_LINK_FAILURE)); - } -} - -void UeRlsTask::plmnSearchRequested() -{ - m_pendingPlmnResponse = true; -} - -void UeRlsTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) -{ - slowDownMeasurements(); - - if (!m_activeMeasurements.count(cellId)) - { - m_logger->err("Selected cell is no longer available for camping"); - return; - } - - auto &measurement = m_activeMeasurements[cellId]; - - m_servingCell = UeCellInfo{}; - m_servingCell->sti = measurement.sti; - m_servingCell->cellId = measurement.cellId; - m_servingCell->tac = measurement.tac; - m_servingCell->gnbName = measurement.gnbName; - m_servingCell->linkIp = measurement.linkIp; - m_servingCell->cellCategory = isSuitable ? ECellCategory::SUITABLE_CELL : ECellCategory::ACCEPTABLE_CELL; - - auto *w = new NwUeRlsToRrc(NwUeRlsToRrc::SERVING_CELL_CHANGE); - w->servingCell = *m_servingCell; - m_base->rrcTask->push(w); -} - -} // namespace nr::ue diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index a1de7d1ab..ed9c6c8de 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -7,45 +7,30 @@ // #include "task.hpp" -#include + #include #include -static constexpr const int TIMER_ID_MEASUREMENT = 1; -static constexpr const int TIMER_PERIOD_MEASUREMENT_MIN = 1; -static constexpr const int TIMER_PERIOD_MEASUREMENT_MAX = 2000; - -static constexpr const int TIMER_ID_RAPID_LAUNCH = 2; -static constexpr const int TIMER_PERIOD_RAPID_LAUNCH = 750; - namespace nr::ue { -UeRlsTask::UeRlsTask(TaskBase *base) - : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{}, - m_pendingPlmnResponse{}, m_measurementPeriod{TIMER_PERIOD_MEASUREMENT_MIN}, m_servingCell{} +UeRlsTask::UeRlsTask(TaskBase *base) : m_base{base} { m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "rls"); - for (auto &addr : m_base->config->gnbSearchList) - m_cellSearchSpace.emplace_back(addr, cons::PortalPort); - m_sti = utils::Random64(); + + m_udpTask = new RlsUdpTask(base, m_sti, base->config->gnbSearchList); + m_ctlTask = new RlsControlTask(base, m_sti); + + m_udpTask->initialize(m_ctlTask); + m_ctlTask->initialize(this, m_udpTask); } void UeRlsTask::onStart() { - m_udpTask = new udp::UdpServerTask(this); - - std::vector gnbSearchList{}; - for (auto &ip : m_base->config->gnbSearchList) - gnbSearchList.emplace_back(ip, cons::PortalPort); - m_udpTask->start(); - - setTimer(TIMER_ID_MEASUREMENT, m_measurementPeriod); - setTimer(TIMER_ID_RAPID_LAUNCH, TIMER_PERIOD_RAPID_LAUNCH); - onMeasurement(); + m_ctlTask->start(); } void UeRlsTask::onLoop() @@ -56,59 +41,35 @@ void UeRlsTask::onLoop() switch (msg->msgType) { - case NtsMessageType::UE_RRC_TO_RLS: { - auto *w = dynamic_cast(msg); + case NtsMessageType::UE_RLS_TO_RLS: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeRrcToRls::PLMN_SEARCH_REQUEST: - plmnSearchRequested(); - break; - case NwUeRrcToRls::CELL_SELECTION_COMMAND: - handleCellSelectionCommand(w->cellId, w->isSuitableCell); - break; - case NwUeRrcToRls::RRC_PDU_DELIVERY: - deliverUplinkPdu(rls::EPduType::RRC, std::move(w->pdu), - OctetString::FromOctet4(static_cast(w->channel))); - break; - case NwUeRrcToRls::RESET_STI: - m_sti = utils::Random64(); + case NwUeRlsToRls::SIGNAL_CHANGED: { + m_logger->debug("signal changed cellId[%d] dbm[%d]", w->cellId, w->dbm); break; } - break; - } - case NtsMessageType::UE_APP_TO_RLS: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwUeAppToRls::DATA_PDU_DELIVERY: { - deliverUplinkPdu(rls::EPduType::DATA, std::move(w->pdu), OctetString::FromOctet4(static_cast(w->psi))); + case NwUeRlsToRls::DOWNLINK_DATA: { + m_logger->debug("downlink data psi[%d]", w->psi); break; } + case NwUeRlsToRls::DOWNLINK_RRC: { + m_logger->debug("downlink rrc cellId[%d]", w->cellId); + break; } - break; - } - case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); - if (w->timerId == TIMER_ID_MEASUREMENT) - { - setTimer(TIMER_ID_MEASUREMENT, m_measurementPeriod); - onMeasurement(); + case NwUeRlsToRls::RADIO_LINK_FAILURE: { + m_logger->debug("radio link failure [%d]", (int)w->rlfCause); + break; } - else if (w->timerId == TIMER_ID_RAPID_LAUNCH) - { - slowDownMeasurements(); + case NwUeRlsToRls::TRANSMISSION_FAILURE: { + m_logger->debug("transmission failure [%d]", w->pduList.size()); + break; } - break; - } - case NtsMessageType::UDP_SERVER_RECEIVE: { - auto *w = dynamic_cast(msg); - auto rlsMsg = rls::DecodeRlsMessage(OctetView{w->packet}); - if (rlsMsg == nullptr) - { - m_logger->err("Unable to decode RLS message"); + default: { + m_logger->unhandledNts(msg); break; } - receiveRlsMessage(w->fromAddress, *rlsMsg); + } break; } default: @@ -122,12 +83,9 @@ void UeRlsTask::onLoop() void UeRlsTask::onQuit() { m_udpTask->quit(); + m_ctlTask->quit(); delete m_udpTask; -} - -void UeRlsTask::slowDownMeasurements() -{ - m_measurementPeriod = TIMER_PERIOD_MEASUREMENT_MAX; + delete m_ctlTask; } } // namespace nr::ue diff --git a/src/ue/rls/transport.cpp b/src/ue/rls/transport.cpp deleted file mode 100644 index 4fafa335b..000000000 --- a/src/ue/rls/transport.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// -// This file is a part of UERANSIM open source project. -// Copyright (c) 2021 ALİ GÜNGÖR. -// -// The software and all associated files are licensed under GPL-3.0 -// and subject to the terms and conditions defined in LICENSE file. -// - -#include "task.hpp" -#include -#include -#include -#include - -namespace nr::ue -{ - -void UeRlsTask::receiveRlsMessage(const InetAddress &address, rls::RlsMessage &msg) -{ - switch (msg.msgType) - { - case rls::EMessageType::CELL_INFO_RESPONSE: { - receiveCellInfoResponse((const rls::RlsCellInfoResponse &)msg); - break; - case rls::EMessageType::PDU_DELIVERY: { - deliverDownlinkPdu((rls::RlsPduDelivery &)msg); - break; - } - default: - m_logger->err("Unhandled RLS message type[%d]", static_cast(msg.msgType)); - break; - } - } -} - -void UeRlsTask::sendRlsMessage(const InetAddress &address, const rls::RlsMessage &msg) -{ - OctetString stream{}; - rls::EncodeRlsMessage(msg, stream); - m_udpTask->send(address, stream); -} - -void UeRlsTask::deliverUplinkPdu(rls::EPduType pduType, OctetString &&pdu, OctetString &&payload) -{ - if (!m_servingCell.has_value()) - { - m_logger->warn("RLS uplink delivery requested without a serving cell"); - return; - } - - rls::RlsPduDelivery msg{m_sti}; - msg.pduType = pduType; - msg.pdu = std::move(pdu); - msg.payload = std::move(payload); - sendRlsMessage(InetAddress{m_servingCell->linkIp, cons::PortalPort}, msg); -} - -void UeRlsTask::deliverDownlinkPdu(rls::RlsPduDelivery &msg) -{ - if (msg.pduType == rls::EPduType::RRC) - { - auto *nw = new NwUeRlsToRrc(NwUeRlsToRrc::RRC_PDU_DELIVERY); - nw->channel = static_cast(msg.payload.get4I(0)); - nw->pdu = std::move(msg.pdu); - m_base->rrcTask->push(nw); - } - else if (msg.pduType == rls::EPduType::DATA) - { - auto *nw = new NwUeRlsToApp(NwUeRlsToApp::DATA_PDU_DELIVERY); - nw->psi = msg.payload.get4I(0); - nw->pdu = std::move(msg.pdu); - m_base->appTask->push(nw); - } -} - -} // namespace nr::ue diff --git a/src/ue/ue.cpp b/src/ue/ue.cpp index 47fb14d53..8a84eddf3 100644 --- a/src/ue/ue.cpp +++ b/src/ue/ue.cpp @@ -10,8 +10,8 @@ #include "app/task.hpp" #include "nas/task.hpp" -#include "rrc/task.hpp" #include "rls/task.hpp" +#include "rrc/task.hpp" namespace nr::ue { From 80bf2caa08cb5ce8bbef8f78646479a10f761766 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 12:32:22 +0300 Subject: [PATCH 062/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 30 ++++++++++++++++++++++++++++- src/gnb/rrc/channel.cpp | 4 ++-- src/gnb/rrc/task.hpp | 5 ++++- src/ue/rls/task.hpp | 40 +++++++++++---------------------------- 4 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp index 6f7308d96..a92d3a4e6 100644 --- a/src/gnb/rrc/broadcast.cpp +++ b/src/gnb/rrc/broadcast.cpp @@ -9,11 +9,35 @@ #include "task.hpp" #include +#include #include +#include + namespace nr::gnb { +static ASN_RRC_BCCH_BCH_Message *ConstructMibMessage(bool barred, bool intraFreqReselectAllowed) +{ + auto *pdu = asn::New(); + pdu->message.present = ASN_RRC_BCCH_BCH_MessageType_PR_mib; + pdu->message.choice.mib = asn::New(); + + auto &mib = *pdu->message.choice.mib; + + asn::SetBitStringInt<6>(0, mib.systemFrameNumber); + mib.subCarrierSpacingCommon = ASN_RRC_MIB__subCarrierSpacingCommon_scs15or60; + mib.ssb_SubcarrierOffset = 0; + mib.dmrs_TypeA_Position = ASN_RRC_MIB__dmrs_TypeA_Position_pos2; + mib.cellBarred = barred ? ASN_RRC_MIB__cellBarred_barred : ASN_RRC_MIB__cellBarred_notBarred; + mib.intraFreqReselection = intraFreqReselectAllowed ? ASN_RRC_MIB__intraFreqReselection_allowed + : ASN_RRC_MIB__intraFreqReselection_notAllowed; + asn::SetBitStringInt<1>(0, mib.spare); + mib.pdcch_ConfigSIB1.controlResourceSetZero = 0; + mib.pdcch_ConfigSIB1.searchSpaceZero = 0; + return pdu; +} + void GnbRrcTask::onBroadcastTimerExpired() { triggerSysInfoBroadcast(); @@ -21,7 +45,11 @@ void GnbRrcTask::onBroadcastTimerExpired() void GnbRrcTask::triggerSysInfoBroadcast() { - // TODO + ASN_RRC_BCCH_BCH_Message *msg = ConstructMibMessage(m_isBarred, m_intraFreqReselectAllowed); + + sendRrcMessage(msg); + + asn::Free(asn_DEF_ASN_RRC_BCCH_BCH_Message, msg); } } // namespace nr::gnb \ No newline at end of file diff --git a/src/gnb/rrc/channel.cpp b/src/gnb/rrc/channel.cpp index cf6c0635c..fd1608930 100644 --- a/src/gnb/rrc/channel.cpp +++ b/src/gnb/rrc/channel.cpp @@ -65,7 +65,7 @@ void GnbRrcTask::handleUplinkRrc(int ueId, rrc::RrcChannel channel, const OctetS } } -void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg) +void GnbRrcTask::sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) { OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_BCCH_BCH_Message, msg); if (pdu.length() == 0) @@ -75,7 +75,7 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg) } auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); - w->ueId = ueId; + w->ueId = 0; w->channel = rrc::RrcChannel::BCCH_BCH; w->pdu = std::move(pdu); m_base->rlsTask->push(w); diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 176345c38..7b4bd0b77 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -46,6 +46,9 @@ class GnbRrcTask : public NtsTask std::unordered_map m_ueCtx; int m_tidCounter; + bool m_isBarred = false; + bool m_intraFreqReselectAllowed = false; + friend class GnbCmdHandler; public: @@ -79,7 +82,7 @@ class GnbRrcTask : public NtsTask void receiveRrcSetupComplete(int ueId, const ASN_RRC_RRCSetupComplete &msg); /* RRC channel send message */ - void sendRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg); + void sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg); void sendRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg); void sendRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg); void sendRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg); diff --git a/src/ue/rls/task.hpp b/src/ue/rls/task.hpp index 108d32410..99c4c3195 100644 --- a/src/ue/rls/task.hpp +++ b/src/ue/rls/task.hpp @@ -8,18 +8,22 @@ #pragma once -#include -#include -#include +#include "ctl_task.hpp" +#include "udp_task.hpp" + #include #include #include -#include #include +#include + +#include +#include +#include +#include #include #include #include -#include namespace nr::ue { @@ -29,16 +33,10 @@ class UeRlsTask : public NtsTask private: TaskBase *m_base; std::unique_ptr m_logger; - udp::UdpServerTask *m_udpTask; - - std::vector m_cellSearchSpace; - std::unordered_map m_pendingMeasurements; - std::unordered_map m_activeMeasurements; - bool m_pendingPlmnResponse; - int64_t m_measurementPeriod; uint64_t m_sti; - std::optional m_servingCell; + RlsUdpTask *m_udpTask; + RlsControlTask *m_ctlTask; friend class UeCmdHandler; @@ -50,22 +48,6 @@ class UeRlsTask : public NtsTask void onStart() override; void onLoop() override; void onQuit() override; - - private: /* Base */ - void slowDownMeasurements(); - - private: /* Transport */ - void receiveRlsMessage(const InetAddress &address, rls::RlsMessage &msg); - void sendRlsMessage(const InetAddress &address, const rls::RlsMessage &msg); - void deliverUplinkPdu(rls::EPduType pduType, OctetString &&pdu, OctetString &&payload); - void deliverDownlinkPdu(rls::RlsPduDelivery &msg); - - private: /* Measurement */ - void onMeasurement(); - void receiveCellInfoResponse(const rls::RlsCellInfoResponse &msg); - void onCoverageChange(const std::vector &entered, const std::vector &exited); - void plmnSearchRequested(); - void handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable); }; } // namespace nr::ue \ No newline at end of file From 8748cc21d3af84121e8883198e42b48e42e54572 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 12:44:11 +0300 Subject: [PATCH 063/311] RRC developments --- src/gnb/nts.hpp | 1 - src/gnb/rls/ctl_task.cpp | 7 +++++++ src/gnb/rls/task.cpp | 16 ++++++++++++++++ src/gnb/rls/udp_task.cpp | 7 +++++++ src/gnb/rrc/task.cpp | 5 +++-- src/gnb/rrc/task.hpp | 4 ++-- 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 2381a8ee9..7e2903f37 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -145,7 +145,6 @@ struct NwGnbRrcToRls : NtsMessage { enum PR { - RADIO_POWER_ON, RRC_PDU_DELIVERY, } present; diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 25db48996..8648c5a33 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -8,6 +8,7 @@ #include "ctl_task.hpp" +#include #include static constexpr const size_t MAX_PDU_COUNT = 4096; @@ -156,6 +157,12 @@ void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::RrcChannel channel, OctetString &&data) { + if (ueId == 0 && pduId != 0) + { + // PDU ID must be not set in case of broadcast + throw std::runtime_error(""); + } + if (pduId != 0) { if (m_pduMap.count(pduId)) diff --git a/src/gnb/rls/task.cpp b/src/gnb/rls/task.cpp index bc4445530..05f69b54c 100644 --- a/src/gnb/rls/task.cpp +++ b/src/gnb/rls/task.cpp @@ -74,6 +74,22 @@ void GnbRlsTask::onLoop() } break; } + case NtsMessageType::GNB_RRC_TO_RLS: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwGnbRrcToRls::RRC_PDU_DELIVERY: { + auto *m = new NwGnbRlsToRls(NwGnbRlsToRls::DOWNLINK_RRC); + m->ueId = w->ueId; + m->rrcChannel = w->channel; + m->pduId = 0; + m->data = std::move(w->pdu); + m_ctlTask->push(m); + break; + } + } + break; + } default: m_logger->unhandledNts(msg); break; diff --git a/src/gnb/rls/udp_task.cpp b/src/gnb/rls/udp_task.cpp index c0b449808..c55fe9f10 100644 --- a/src/gnb/rls/udp_task.cpp +++ b/src/gnb/rls/udp_task.cpp @@ -182,6 +182,13 @@ void RlsUdpTask::initialize(NtsTask *ctlTask) void RlsUdpTask::send(int ueId, const rls::RlsMessage &msg) { + if (ueId == 0) + { + for (auto &ue : m_ueMap) + send(ue.first, msg); + return; + } + if (!m_ueMap.count(ueId)) { // ignore the message diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index c3527b270..755462224 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -16,7 +16,7 @@ #include static constexpr const int TIMER_ID_SI_BROADCAST = 1; -static constexpr const int TIMER_PERIOD_SI_BROADCAST = 5000; +static constexpr const int TIMER_PERIOD_SI_BROADCAST = 10'000; namespace nr::gnb { @@ -64,7 +64,8 @@ void GnbRrcTask::onLoop() switch (w->present) { case NwGnbNgapToRrc::RADIO_POWER_ON: { - m_base->rlsTask->push(new NwGnbRrcToRls(NwGnbRrcToRls::RADIO_POWER_ON)); + m_isBarred = false; + triggerSysInfoBroadcast(); break; } case NwGnbNgapToRrc::NAS_DELIVERY: { diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 7b4bd0b77..8902d9369 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -46,8 +46,8 @@ class GnbRrcTask : public NtsTask std::unordered_map m_ueCtx; int m_tidCounter; - bool m_isBarred = false; - bool m_intraFreqReselectAllowed = false; + bool m_isBarred = true; + bool m_intraFreqReselectAllowed = true; friend class GnbCmdHandler; From af2e3ffadbe809e5caf721a6bef53513198db3c5 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 13:27:45 +0300 Subject: [PATCH 064/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 52 ++++++++++++++++++++++++++++++++++++--- src/gnb/rrc/channel.cpp | 4 +-- src/gnb/rrc/task.cpp | 1 + src/gnb/rrc/task.hpp | 4 ++- src/lib/asn/rrc.cpp | 51 ++++++++++++++++++++++++++++++++++++++ src/lib/asn/rrc.hpp | 21 ++++++++++++++++ 6 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 src/lib/asn/rrc.cpp create mode 100644 src/lib/asn/rrc.hpp diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp index a92d3a4e6..238967e24 100644 --- a/src/gnb/rrc/broadcast.cpp +++ b/src/gnb/rrc/broadcast.cpp @@ -9,10 +9,19 @@ #include "task.hpp" #include +#include #include #include +#include #include +#include +#include +#include +#include +#include +#include +#include namespace nr::gnb { @@ -38,6 +47,40 @@ static ASN_RRC_BCCH_BCH_Message *ConstructMibMessage(bool barred, bool intraFreq return pdu; } +static ASN_RRC_BCCH_DL_SCH_Message *ConstructSib1Message(bool cellReserved, int tac, int64_t nci, const Plmn &plmn) +{ + auto *pdu = asn::New(); + pdu->message.present = ASN_RRC_BCCH_DL_SCH_MessageType_PR_c1; + pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1); + pdu->message.choice.c1->present = ASN_RRC_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1; + pdu->message.choice.c1->choice.systemInformationBlockType1 = asn::New(); + + auto &sib1 = *pdu->message.choice.c1->choice.systemInformationBlockType1; + + if (cellReserved) + { + sib1.cellAccessRelatedInfo.cellReservedForOtherUse = + asn::NewFor(sib1.cellAccessRelatedInfo.cellReservedForOtherUse); + *sib1.cellAccessRelatedInfo.cellReservedForOtherUse = + ASN_RRC_CellAccessRelatedInfo__cellReservedForOtherUse_true; + } + + auto *plmnId = asn::rrc::NewPlmnId(plmn); + + auto *plmnInfo = asn::New(); + plmnInfo->cellReservedForOperatorUse = cellReserved + ? ASN_RRC_PLMN_IdentityInfo__cellReservedForOperatorUse_reserved + : ASN_RRC_PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved; + plmnInfo->trackingAreaCode = asn::NewFor(plmnInfo->trackingAreaCode); + asn::SetBitStringInt<24>(tac, *plmnInfo->trackingAreaCode); + asn::SetBitStringLong<36>(nci, plmnInfo->cellIdentity); + asn::SequenceAdd(plmnInfo->plmn_IdentityList, plmnId); + + asn::SequenceAdd(sib1.cellAccessRelatedInfo.plmn_IdentityList, plmnInfo); + + return pdu; +} + void GnbRrcTask::onBroadcastTimerExpired() { triggerSysInfoBroadcast(); @@ -45,11 +88,14 @@ void GnbRrcTask::onBroadcastTimerExpired() void GnbRrcTask::triggerSysInfoBroadcast() { - ASN_RRC_BCCH_BCH_Message *msg = ConstructMibMessage(m_isBarred, m_intraFreqReselectAllowed); + auto *mib = ConstructMibMessage(m_isBarred, m_intraFreqReselectAllowed); + auto *sib1 = ConstructSib1Message(m_cellReserved, m_config->tac, m_config->nci, m_config->plmn); - sendRrcMessage(msg); + sendRrcMessage(mib); + sendRrcMessage(sib1); - asn::Free(asn_DEF_ASN_RRC_BCCH_BCH_Message, msg); + asn::Free(asn_DEF_ASN_RRC_BCCH_BCH_Message, mib); + asn::Free(asn_DEF_ASN_RRC_BCCH_DL_SCH_Message, sib1); } } // namespace nr::gnb \ No newline at end of file diff --git a/src/gnb/rrc/channel.cpp b/src/gnb/rrc/channel.cpp index fd1608930..5851efc28 100644 --- a/src/gnb/rrc/channel.cpp +++ b/src/gnb/rrc/channel.cpp @@ -81,7 +81,7 @@ void GnbRrcTask::sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) m_base->rlsTask->push(w); } -void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg) +void GnbRrcTask::sendRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg) { OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_BCCH_DL_SCH_Message, msg); if (pdu.length() == 0) @@ -91,7 +91,7 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg) } auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); - w->ueId = ueId; + w->ueId = 0; w->channel = rrc::RrcChannel::BCCH_DL_SCH; w->pdu = std::move(pdu); m_base->rlsTask->push(w); diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index 755462224..c8a8fe0b2 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -24,6 +24,7 @@ namespace nr::gnb GnbRrcTask::GnbRrcTask(TaskBase *base) : m_base{base}, m_ueCtx{}, m_tidCounter{} { m_logger = base->logBase->makeUniqueLogger("rrc"); + m_config = m_base->config; } void GnbRrcTask::onStart() diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 8902d9369..38785fc6d 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -42,12 +42,14 @@ class GnbRrcTask : public NtsTask { private: TaskBase *m_base; + GnbConfig *m_config; std::unique_ptr m_logger; std::unordered_map m_ueCtx; int m_tidCounter; bool m_isBarred = true; bool m_intraFreqReselectAllowed = true; + bool m_cellReserved = false; friend class GnbCmdHandler; @@ -83,7 +85,7 @@ class GnbRrcTask : public NtsTask /* RRC channel send message */ void sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg); - void sendRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg); + void sendRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg); void sendRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg); void sendRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg); void sendRrcMessage(ASN_RRC_PCCH_Message *msg); diff --git a/src/lib/asn/rrc.cpp b/src/lib/asn/rrc.cpp new file mode 100644 index 000000000..b548d5c2e --- /dev/null +++ b/src/lib/asn/rrc.cpp @@ -0,0 +1,51 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "rrc.hpp" + +#include + +#include + +namespace asn::rrc +{ + +static int NthDigit(int number, int n) +{ + for (int i = 0; i < n; i++) + number /= 10; + return number % 10; +} + +void SetPlmnId(const Plmn &source, ASN_RRC_PLMN_Identity &target) +{ + int mncDigits = source.isLongMnc ? 3 : 2; + for (int i = 0; i < mncDigits; i++) + asn::SequenceAdd(target.mnc, NewMccMncDigit(NthDigit(source.mnc, mncDigits - i - 1))); + + target.mcc = asn::NewFor(target.mcc); + + for (int i = 0; i < 3; i++) + asn::SequenceAdd(*target.mcc, NewMccMncDigit(NthDigit(source.mcc, 2 - i))); +} + +ASN_RRC_PLMN_Identity *NewPlmnId(const Plmn &plmn) +{ + auto *value = asn::New(); + SetPlmnId(plmn, *value); + return value; +} + +ASN_RRC_MCC_MNC_Digit_t *NewMccMncDigit(int digit) +{ + auto *value = asn::New(); + *value = digit; + return value; +} + +} // namespace asn::rrc diff --git a/src/lib/asn/rrc.hpp b/src/lib/asn/rrc.hpp new file mode 100644 index 000000000..0b65b173d --- /dev/null +++ b/src/lib/asn/rrc.hpp @@ -0,0 +1,21 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include +#include + +namespace asn::rrc +{ + +void SetPlmnId(const Plmn &source, ASN_RRC_PLMN_Identity &target); + +ASN_RRC_PLMN_Identity *NewPlmnId(const Plmn &plmn); + +ASN_RRC_MCC_MNC_Digit_t *NewMccMncDigit(int digit); + +} // namespace asn::rrc From cd9b752f00020572bc8f80295167a590aa5f31db Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 13:39:50 +0300 Subject: [PATCH 065/311] RRC developments --- src/gnb/rls/udp_task.cpp | 2 +- src/ue/rls/udp_task.cpp | 2 +- src/ue/rls/udp_task.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gnb/rls/udp_task.cpp b/src/gnb/rls/udp_task.cpp index c55fe9f10..d47eba495 100644 --- a/src/gnb/rls/udp_task.cpp +++ b/src/gnb/rls/udp_task.cpp @@ -42,7 +42,7 @@ namespace nr::gnb { RlsUdpTask::RlsUdpTask(TaskBase *base, uint64_t sti, Vector3 phyLocation) - : m_ctlTask{}, m_sti{sti}, m_phyLocation{phyLocation}, m_lastLoop{}, m_stiToUe{}, m_ueMap{}, m_newIdCounter{} + : m_server{}, m_ctlTask{}, m_sti{sti}, m_phyLocation{phyLocation}, m_lastLoop{}, m_stiToUe{}, m_ueMap{}, m_newIdCounter{} { m_logger = base->logBase->makeUniqueLogger("rls-udp"); diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp index 527fcb7b8..e461fe9db 100644 --- a/src/ue/rls/udp_task.cpp +++ b/src/ue/rls/udp_task.cpp @@ -25,7 +25,7 @@ namespace nr::ue { RlsUdpTask::RlsUdpTask(TaskBase *base, uint64_t sti, const std::vector &searchSpace) - : m_ctlTask{}, m_sti{sti}, m_searchSpace{}, m_cells{}, m_cellIdToSti{}, m_lastLoop{}, m_cellIdCounter{} + : m_server{}, m_ctlTask{}, m_sti{sti}, m_searchSpace{}, m_cells{}, m_cellIdToSti{}, m_lastLoop{}, m_cellIdCounter{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-udp"); diff --git a/src/ue/rls/udp_task.hpp b/src/ue/rls/udp_task.hpp index b33b8423c..1bea38f36 100644 --- a/src/ue/rls/udp_task.hpp +++ b/src/ue/rls/udp_task.hpp @@ -33,8 +33,8 @@ class RlsUdpTask : public NtsTask private: std::unique_ptr m_logger; - NtsTask *m_ctlTask; udp::UdpServer *m_server; + NtsTask *m_ctlTask; uint64_t m_sti; std::vector m_searchSpace; std::unordered_map m_cells; From 9f460e5782c49a826e9e28adb8df20e0575e932f Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 13:40:24 +0300 Subject: [PATCH 066/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp index 238967e24..5b43fd281 100644 --- a/src/gnb/rrc/broadcast.cpp +++ b/src/gnb/rrc/broadcast.cpp @@ -65,8 +65,6 @@ static ASN_RRC_BCCH_DL_SCH_Message *ConstructSib1Message(bool cellReserved, int ASN_RRC_CellAccessRelatedInfo__cellReservedForOtherUse_true; } - auto *plmnId = asn::rrc::NewPlmnId(plmn); - auto *plmnInfo = asn::New(); plmnInfo->cellReservedForOperatorUse = cellReserved ? ASN_RRC_PLMN_IdentityInfo__cellReservedForOperatorUse_reserved @@ -74,8 +72,7 @@ static ASN_RRC_BCCH_DL_SCH_Message *ConstructSib1Message(bool cellReserved, int plmnInfo->trackingAreaCode = asn::NewFor(plmnInfo->trackingAreaCode); asn::SetBitStringInt<24>(tac, *plmnInfo->trackingAreaCode); asn::SetBitStringLong<36>(nci, plmnInfo->cellIdentity); - asn::SequenceAdd(plmnInfo->plmn_IdentityList, plmnId); - + asn::SequenceAdd(plmnInfo->plmn_IdentityList, asn::rrc::NewPlmnId(plmn)); asn::SequenceAdd(sib1.cellAccessRelatedInfo.plmn_IdentityList, plmnInfo); return pdu; From 09f4f5a99bed1136c10e34e184681d2e829e4c8c Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 13:48:04 +0300 Subject: [PATCH 067/311] RRC developments --- src/gnb/rrc/task.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 38785fc6d..fe6ff57b7 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -44,6 +44,7 @@ class GnbRrcTask : public NtsTask TaskBase *m_base; GnbConfig *m_config; std::unique_ptr m_logger; + std::unordered_map m_ueCtx; int m_tidCounter; From 563012bcb621b80ff39abb50b2fc80a6d9c4f2a1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 13 May 2021 13:48:34 +0300 Subject: [PATCH 068/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp index 5b43fd281..1595b8b3d 100644 --- a/src/gnb/rrc/broadcast.cpp +++ b/src/gnb/rrc/broadcast.cpp @@ -15,7 +15,6 @@ #include #include -#include #include #include #include From e0c66b8ab637a74365b5d54407969ae23e18d80b Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 01:54:08 +0300 Subject: [PATCH 069/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 32 +++++++++++++++++++++++++++++--- src/gnb/rrc/task.hpp | 1 + src/lib/asn/utils.hpp | 6 ++++++ src/utils/common_types.hpp | 25 ++++++++++++++++++------- 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp index 1595b8b3d..285b66f7c 100644 --- a/src/gnb/rrc/broadcast.cpp +++ b/src/gnb/rrc/broadcast.cpp @@ -20,7 +20,8 @@ #include #include #include -#include +#include +#include namespace nr::gnb { @@ -46,7 +47,8 @@ static ASN_RRC_BCCH_BCH_Message *ConstructMibMessage(bool barred, bool intraFreq return pdu; } -static ASN_RRC_BCCH_DL_SCH_Message *ConstructSib1Message(bool cellReserved, int tac, int64_t nci, const Plmn &plmn) +static ASN_RRC_BCCH_DL_SCH_Message *ConstructSib1Message(bool cellReserved, int tac, int64_t nci, const Plmn &plmn, + const UacAiBarringSet &aiBarringSet) { auto *pdu = asn::New(); pdu->message.present = ASN_RRC_BCCH_DL_SCH_MessageType_PR_c1; @@ -74,6 +76,30 @@ static ASN_RRC_BCCH_DL_SCH_Message *ConstructSib1Message(bool cellReserved, int asn::SequenceAdd(plmnInfo->plmn_IdentityList, asn::rrc::NewPlmnId(plmn)); asn::SequenceAdd(sib1.cellAccessRelatedInfo.plmn_IdentityList, plmnInfo); + asn::MakeNew(sib1.uac_BarringInfo); + + auto *info = asn::New(); + info->uac_BarringFactor = ASN_RRC_UAC_BarringInfoSet__uac_BarringFactor_p50; + info->uac_BarringTime = ASN_RRC_UAC_BarringInfoSet__uac_BarringTime_s4; + + asn::SetBitStringInt<7>(bits::Consequential8(false, aiBarringSet.ai1, aiBarringSet.ai2, aiBarringSet.ai11, + aiBarringSet.ai12, aiBarringSet.ai13, aiBarringSet.ai14, + aiBarringSet.ai15), + info->uac_BarringForAccessIdentity); + + asn::SequenceAdd(sib1.uac_BarringInfo->uac_BarringInfoSetList, info); + + asn::MakeNew(sib1.uac_BarringInfo->uac_BarringForCommon); + + for (size_t i = 0; i < 63; i++) + { + auto *item = asn::New(); + item->accessCategory = static_cast(i + 1); + item->uac_barringInfoSetIndex = 1; + + asn::SequenceAdd(*sib1.uac_BarringInfo->uac_BarringForCommon, item); + } + return pdu; } @@ -85,7 +111,7 @@ void GnbRrcTask::onBroadcastTimerExpired() void GnbRrcTask::triggerSysInfoBroadcast() { auto *mib = ConstructMibMessage(m_isBarred, m_intraFreqReselectAllowed); - auto *sib1 = ConstructSib1Message(m_cellReserved, m_config->tac, m_config->nci, m_config->plmn); + auto *sib1 = ConstructSib1Message(m_cellReserved, m_config->tac, m_config->nci, m_config->plmn, m_aiBarringSet); sendRrcMessage(mib); sendRrcMessage(sib1); diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index fe6ff57b7..fe10aef38 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -51,6 +51,7 @@ class GnbRrcTask : public NtsTask bool m_isBarred = true; bool m_intraFreqReselectAllowed = true; bool m_cellReserved = false; + UacAiBarringSet m_aiBarringSet = {}; friend class GnbCmdHandler; diff --git a/src/lib/asn/utils.hpp b/src/lib/asn/utils.hpp index 1e4a2fef5..459458d48 100644 --- a/src/lib/asn/utils.hpp +++ b/src/lib/asn/utils.hpp @@ -43,6 +43,12 @@ inline T *NewFor(T *p) return New::type>(); } +template +inline void MakeNew(T *&p) +{ + p = NewFor(p); +} + template inline void Free(asn_TYPE_descriptor_t &desc, T *ptr) { diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index f710f417b..e2c11c836 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -153,22 +153,22 @@ enum class ECellCategory struct UeCellMeasurement { - uint64_t sti{}; - GlobalNci cellId{}; + uint64_t sti{}; + GlobalNci cellId; int tac{}; int dbm{}; - std::string gnbName{}; - std::string linkIp{}; + std::string gnbName; + std::string linkIp; }; struct UeCellInfo { uint64_t sti{}; - GlobalNci cellId{}; + GlobalNci cellId; int tac{}; ECellCategory cellCategory{}; - std::string gnbName{}; - std::string linkIp{}; + std::string gnbName; + std::string linkIp; }; struct Vector3 @@ -184,6 +184,17 @@ struct Vector3 } }; +struct UacAiBarringSet +{ + bool ai1 = false; + bool ai2 = false; + bool ai11 = false; + bool ai12 = false; + bool ai13 = false; + bool ai14 = false; + bool ai15 = false; +}; + bool operator==(const SingleSlice &lhs, const SingleSlice &rhs); bool operator==(const Plmn &lhs, const Plmn &rhs); bool operator==(const GlobalNci &lhs, const GlobalNci &rhs); From aec9c13601130b1479f55f8c5873afdd4e6c9f6f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 01:55:59 +0300 Subject: [PATCH 070/311] RRC developments --- src/gnb/rrc/task.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index fe10aef38..7f9885456 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -49,9 +49,9 @@ class GnbRrcTask : public NtsTask int m_tidCounter; bool m_isBarred = true; - bool m_intraFreqReselectAllowed = true; bool m_cellReserved = false; UacAiBarringSet m_aiBarringSet = {}; + bool m_intraFreqReselectAllowed = true; friend class GnbCmdHandler; From 85da3bc49aa9910f73694fb6c8f36df227bd89c0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 13:41:24 +0300 Subject: [PATCH 071/311] RRC developments --- src/gnb/nts.hpp | 10 ++-------- src/gnb/rls/task.cpp | 5 ++++- src/gnb/rrc/rls_sap.cpp | 29 +++++++++++++++++++++++++++++ src/gnb/rrc/task.cpp | 13 +------------ src/gnb/rrc/task.hpp | 3 +++ 5 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 src/gnb/rrc/rls_sap.cpp diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 7e2903f37..efaa158cd 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -36,18 +36,12 @@ struct NwGnbRlsToRrc : NtsMessage { enum PR { - RRC_PDU_DELIVERY, - SIGNAL_LOST + SIGNAL_DETECTED, } present; - // RRC_PDU_DELIVERY - // SIGNAL_LOST + // SIGNAL_DETECTED int ueId{}; - // RRC_PDU_DELIVERY - rrc::RrcChannel channel{}; - OctetString pdu{}; - explicit NwGnbRlsToRrc(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RRC), present(present) { } diff --git a/src/gnb/rls/task.cpp b/src/gnb/rls/task.cpp index 05f69b54c..241e0f3bb 100644 --- a/src/gnb/rls/task.cpp +++ b/src/gnb/rls/task.cpp @@ -8,6 +8,7 @@ #include "task.hpp" +#include #include namespace nr::gnb @@ -44,7 +45,9 @@ void GnbRlsTask::onLoop() switch (w->present) { case NwGnbRlsToRls::SIGNAL_DETECTED: { - m_logger->debug("new UE[%d] detected", w->ueId); + auto *m = new NwGnbRlsToRrc(NwGnbRlsToRrc::SIGNAL_DETECTED); + m->ueId = w->ueId; + m_base->rrcTask->push(m); break; } case NwGnbRlsToRls::SIGNAL_LOST: { diff --git a/src/gnb/rrc/rls_sap.cpp b/src/gnb/rrc/rls_sap.cpp new file mode 100644 index 000000000..8d14aecf3 --- /dev/null +++ b/src/gnb/rrc/rls_sap.cpp @@ -0,0 +1,29 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" + +#include +#include + +namespace nr::gnb +{ + +void GnbRrcTask::handleRlsSapMessage(NwGnbRlsToRrc &msg) +{ + switch (msg.present) + { + case NwGnbRlsToRrc::SIGNAL_DETECTED: { + m_logger->info("UE[%d] new signal detected", msg.ueId); + triggerSysInfoBroadcast(); + break; + } + } +} + +} // namespace nr::gnb diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index c8a8fe0b2..7e4d2f11b 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -46,18 +46,7 @@ void GnbRrcTask::onLoop() switch (msg->msgType) { case NtsMessageType::GNB_RLS_TO_RRC: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwGnbRlsToRrc::RRC_PDU_DELIVERY: { - handleUplinkRrc(w->ueId, w->channel, w->pdu); - break; - } - case NwGnbRlsToRrc::SIGNAL_LOST: { - handleRadioLinkFailure(w->ueId); - break; - } - } + handleRlsSapMessage(*dynamic_cast(msg)); break; } case NtsMessageType::GNB_NGAP_TO_RRC: { diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 7f9885456..73db41929 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -101,6 +101,9 @@ class GnbRrcTask : public NtsTask /* System Information Broadcast related */ void onBroadcastTimerExpired(); void triggerSysInfoBroadcast(); + + /* RLS Service Access Point */ + void handleRlsSapMessage(NwGnbRlsToRrc &msg); }; } // namespace nr::gnb From 9684b8f5984049c38413b020362b85c0f6b85f08 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 13:54:25 +0300 Subject: [PATCH 072/311] RRC developments --- src/ue/nts.hpp | 16 ++++------------ src/ue/rls/task.cpp | 7 ++++++- src/ue/rrc/channel.cpp | 22 +++++++++++----------- src/ue/rrc/rls_sap.cpp | 30 ++++++++++++++++++++++++++++++ src/ue/rrc/task.cpp | 25 +------------------------ src/ue/rrc/task.hpp | 19 ++++++++++--------- 6 files changed, 62 insertions(+), 57 deletions(-) create mode 100644 src/ue/rrc/rls_sap.cpp diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index ab538d7da..ecb19e07f 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -144,21 +144,13 @@ struct NwUeRlsToRrc : NtsMessage { enum PR { - PLMN_SEARCH_RESPONSE, - SERVING_CELL_CHANGE, - RRC_PDU_DELIVERY, - RADIO_LINK_FAILURE + DOWNLINK_RRC_DELIVERY } present; - // PLMN_SEARCH_RESPONSE - std::vector measurements{}; - - // SERVING_CELL_CHANGE - UeCellInfo servingCell{}; - - // RRC_PDU_DELIVERY + // DOWNLINK_RRC_DELIVERY + int cellId{}; rrc::RrcChannel channel{}; - OctetString pdu{}; + OctetString pdu; explicit NwUeRlsToRrc(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RRC), present(present) { diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index ed9c6c8de..9a3373969 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -8,6 +8,7 @@ #include "task.hpp" +#include #include #include @@ -54,7 +55,11 @@ void UeRlsTask::onLoop() break; } case NwUeRlsToRls::DOWNLINK_RRC: { - m_logger->debug("downlink rrc cellId[%d]", w->cellId); + auto *m = new NwUeRlsToRrc(NwUeRlsToRrc::DOWNLINK_RRC_DELIVERY); + m->cellId = w->cellId; + m->channel = w->rrcChannel; + m->pdu = std::move(w->data); + m_base->rrcTask->push(m); break; } case NwUeRlsToRls::RADIO_LINK_FAILURE: { diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index 251f35786..c5fd471ee 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -19,7 +19,7 @@ namespace nr::ue { -void UeRrcTask::handleDownlinkRrc(rrc::RrcChannel channel, const OctetString &rrcPdu) +void UeRrcTask::handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &rrcPdu) { switch (channel) { @@ -28,7 +28,7 @@ void UeRrcTask::handleDownlinkRrc(rrc::RrcChannel channel, const OctetString &rr if (pdu == nullptr) m_logger->err("RRC BCCH-BCH PDU decoding failed."); else - receiveRrcMessage(pdu); + receiveRrcMessage(cellId, pdu); asn::Free(asn_DEF_ASN_RRC_BCCH_BCH_Message, pdu); break; } @@ -37,7 +37,7 @@ void UeRrcTask::handleDownlinkRrc(rrc::RrcChannel channel, const OctetString &rr if (pdu == nullptr) m_logger->err("RRC BCCH-DL-SCH PDU decoding failed."); else - receiveRrcMessage(pdu); + receiveRrcMessage(cellId, pdu); asn::Free(asn_DEF_ASN_RRC_BCCH_DL_SCH_Message, pdu); break; } @@ -46,7 +46,7 @@ void UeRrcTask::handleDownlinkRrc(rrc::RrcChannel channel, const OctetString &rr if (pdu == nullptr) m_logger->err("RRC DL-CCCH PDU decoding failed."); else - receiveRrcMessage(pdu); + receiveRrcMessage(cellId, pdu); asn::Free(asn_DEF_ASN_RRC_DL_CCCH_Message, pdu); break; } @@ -55,7 +55,7 @@ void UeRrcTask::handleDownlinkRrc(rrc::RrcChannel channel, const OctetString &rr if (pdu == nullptr) m_logger->err("RRC DL-DCCH PDU decoding failed."); else - receiveRrcMessage(pdu); + receiveRrcMessage(cellId, pdu); asn::Free(asn_DEF_ASN_RRC_DL_DCCH_Message, pdu); break; }; @@ -64,7 +64,7 @@ void UeRrcTask::handleDownlinkRrc(rrc::RrcChannel channel, const OctetString &rr if (pdu == nullptr) m_logger->err("RRC PCCH PDU decoding failed."); else - receiveRrcMessage(pdu); + receiveRrcMessage(cellId, pdu); asn::Free(asn_DEF_ASN_RRC_PCCH_Message, pdu); break; } @@ -135,17 +135,17 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) m_base->rlsTask->push(nw); } -void UeRrcTask::receiveRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int, ASN_RRC_BCCH_BCH_Message *msg) { // TODO } -void UeRrcTask::receiveRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int, ASN_RRC_BCCH_DL_SCH_Message *msg) { // TODO } -void UeRrcTask::receiveRrcMessage(ASN_RRC_DL_CCCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int, ASN_RRC_DL_CCCH_Message *msg) { if (msg->message.present != ASN_RRC_DL_CCCH_MessageType_PR_c1) return; @@ -164,7 +164,7 @@ void UeRrcTask::receiveRrcMessage(ASN_RRC_DL_CCCH_Message *msg) } } -void UeRrcTask::receiveRrcMessage(ASN_RRC_DL_DCCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int, ASN_RRC_DL_DCCH_Message *msg) { if (msg->message.present != ASN_RRC_DL_DCCH_MessageType_PR_c1) return; @@ -183,7 +183,7 @@ void UeRrcTask::receiveRrcMessage(ASN_RRC_DL_DCCH_Message *msg) } } -void UeRrcTask::receiveRrcMessage(ASN_RRC_PCCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int, ASN_RRC_PCCH_Message *msg) { if (msg->message.present != ASN_RRC_PCCH_MessageType_PR_c1) return; diff --git a/src/ue/rrc/rls_sap.cpp b/src/ue/rrc/rls_sap.cpp new file mode 100644 index 000000000..6879a853f --- /dev/null +++ b/src/ue/rrc/rls_sap.cpp @@ -0,0 +1,30 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" +#include +#include +#include +#include +#include + +namespace nr::ue +{ + +void UeRrcTask::handleRlsSapMessage(NwUeRlsToRrc &msg) +{ + switch (msg.present) + { + case NwUeRlsToRrc::DOWNLINK_RRC_DELIVERY: { + handleDownlinkRrc(msg.cellId, msg.channel, msg.pdu); + break; + } + } +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 1d10adb87..b9cf19c00 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -77,30 +77,7 @@ void UeRrcTask::onLoop() break; } case NtsMessageType::UE_RLS_TO_RRC: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwUeRlsToRrc::PLMN_SEARCH_RESPONSE: { - auto *wr = new NwUeRrcToNas(NwUeRrcToNas::PLMN_SEARCH_RESPONSE); - wr->measurements = std::move(w->measurements); - m_base->nasTask->push(wr); - break; - } - case NwUeRlsToRrc::SERVING_CELL_CHANGE: { - auto *wr = new NwUeRrcToNas(NwUeRrcToNas::SERVING_CELL_CHANGE); - wr->servingCell = w->servingCell; - m_base->nasTask->push(wr); - break; - } - case NwUeRlsToRrc::RRC_PDU_DELIVERY: { - handleDownlinkRrc(w->channel, w->pdu); - break; - } - case NwUeRlsToRrc::RADIO_LINK_FAILURE: { - handleRadioLinkFailure(); - break; - } - } + handleRlsSapMessage(*dynamic_cast(msg)); break; } default: diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 96c669d2a..ed7cf953a 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -66,7 +66,7 @@ class UeRrcTask : public NtsTask private: /* Handlers */ - void handleDownlinkRrc(rrc::RrcChannel channel, const OctetString &pdu); + void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu); void deliverInitialNas(OctetString &&nasPdu, long establishmentCause); void deliverUplinkNas(OctetString &&nasPdu); @@ -78,18 +78,19 @@ class UeRrcTask : public NtsTask void handleRadioLinkFailure(); - /* RRC channel send message */ + /* RRC send and receive message */ void sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg); void sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg); void sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg); void sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg); - - /* RRC channel receive message */ - void receiveRrcMessage(ASN_RRC_BCCH_BCH_Message *msg); - void receiveRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg); - void receiveRrcMessage(ASN_RRC_DL_CCCH_Message *msg); - void receiveRrcMessage(ASN_RRC_DL_DCCH_Message *msg); - void receiveRrcMessage(ASN_RRC_PCCH_Message *msg); + void receiveRrcMessage(int, ASN_RRC_BCCH_BCH_Message *msg); + void receiveRrcMessage(int, ASN_RRC_BCCH_DL_SCH_Message *msg); + void receiveRrcMessage(int, ASN_RRC_DL_CCCH_Message *msg); + void receiveRrcMessage(int, ASN_RRC_DL_DCCH_Message *msg); + void receiveRrcMessage(int, ASN_RRC_PCCH_Message *msg); + + /* RLS Service Access Point */ + void handleRlsSapMessage(NwUeRlsToRrc &msg); }; } // namespace nr::ue From b20f1af9ecaf2286e4c3fedc9b1ff8fba2b7b6c8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:03:11 +0300 Subject: [PATCH 073/311] RRC developments --- src/ue/nts.hpp | 9 ++++++++- src/ue/rls/task.cpp | 5 ++++- src/ue/rrc/rls_sap.cpp | 5 ++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index ecb19e07f..eabb19497 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -144,14 +144,21 @@ struct NwUeRlsToRrc : NtsMessage { enum PR { - DOWNLINK_RRC_DELIVERY + DOWNLINK_RRC_DELIVERY, + SIGNAL_CHANGED } present; // DOWNLINK_RRC_DELIVERY + // SIGNAL_CHANGED int cellId{}; + + // DOWNLINK_RRC_DELIVERY rrc::RrcChannel channel{}; OctetString pdu; + // SIGNAL_CHANGED + int dbm{}; + explicit NwUeRlsToRrc(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RRC), present(present) { } diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 9a3373969..05fc3ebf5 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -47,7 +47,10 @@ void UeRlsTask::onLoop() switch (w->present) { case NwUeRlsToRls::SIGNAL_CHANGED: { - m_logger->debug("signal changed cellId[%d] dbm[%d]", w->cellId, w->dbm); + auto *m = new NwUeRlsToRrc(NwUeRlsToRrc::SIGNAL_CHANGED); + m->cellId = w->cellId; + m->dbm = w->dbm; + m_base->rrcTask->push(m); break; } case NwUeRlsToRls::DOWNLINK_DATA: { diff --git a/src/ue/rrc/rls_sap.cpp b/src/ue/rrc/rls_sap.cpp index 6879a853f..727753cff 100644 --- a/src/ue/rrc/rls_sap.cpp +++ b/src/ue/rrc/rls_sap.cpp @@ -7,7 +7,6 @@ // #include "task.hpp" -#include #include #include #include @@ -20,6 +19,10 @@ void UeRrcTask::handleRlsSapMessage(NwUeRlsToRrc &msg) { switch (msg.present) { + case NwUeRlsToRrc::SIGNAL_CHANGED: { + // TODO + break; + } case NwUeRlsToRrc::DOWNLINK_RRC_DELIVERY: { handleDownlinkRrc(msg.cellId, msg.channel, msg.pdu); break; From c2cfdfe05d8f710528a45edf6ec2a39613835afc Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:06:10 +0300 Subject: [PATCH 074/311] RRC developments --- src/ue/rrc/cells.cpp | 22 ++++++++++++++++++++++ src/ue/rrc/rls_sap.cpp | 2 +- src/ue/rrc/task.hpp | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/ue/rrc/cells.cpp diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp new file mode 100644 index 000000000..0e40d8824 --- /dev/null +++ b/src/ue/rrc/cells.cpp @@ -0,0 +1,22 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" +#include +#include +#include + +namespace nr::ue +{ + +void UeRrcTask::handleCellSignalChange(int cellId, int dbm) +{ + // TODO +} + +} // namespace nr::ue diff --git a/src/ue/rrc/rls_sap.cpp b/src/ue/rrc/rls_sap.cpp index 727753cff..76c12bba6 100644 --- a/src/ue/rrc/rls_sap.cpp +++ b/src/ue/rrc/rls_sap.cpp @@ -20,7 +20,7 @@ void UeRrcTask::handleRlsSapMessage(NwUeRlsToRrc &msg) switch (msg.present) { case NwUeRlsToRrc::SIGNAL_CHANGED: { - // TODO + handleCellSignalChange(msg.cellId, msg.dbm); break; } case NwUeRlsToRrc::DOWNLINK_RRC_DELIVERY: { diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index ed7cf953a..3d63d526d 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -91,6 +91,9 @@ class UeRrcTask : public NtsTask /* RLS Service Access Point */ void handleRlsSapMessage(NwUeRlsToRrc &msg); + + /* Cell Management */ + void handleCellSignalChange(int cellId, int dbm); }; } // namespace nr::ue From 525599a41c8103a86f89b88b825d169882d41427 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:19:06 +0300 Subject: [PATCH 075/311] RRC developments --- src/ue/rrc/cells.cpp | 43 ++++++++++++++++++++++++++++++++++++++++-- src/ue/rrc/channel.cpp | 3 +++ src/ue/rrc/rls_sap.cpp | 1 - src/ue/rrc/task.hpp | 13 ++++++++++--- src/ue/types.hpp | 5 +++++ 5 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index 0e40d8824..be4257158 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -9,14 +9,53 @@ #include "task.hpp" #include #include -#include namespace nr::ue { void UeRrcTask::handleCellSignalChange(int cellId, int dbm) { - // TODO + bool considerLost = dbm < -120; + + if (!m_cellDesc.count(cellId)) + { + if (!considerLost) + notifyCellDetected(cellId, dbm); + } + else + { + if (considerLost) + notifyCellLost(cellId); + else + m_cellDesc[cellId].dbm = dbm; + } +} + +void UeRrcTask::notifyCellDetected(int cellId, int dbm) +{ + m_cellDesc[cellId] = {}; + m_cellDesc[cellId].dbm = dbm; + + m_logger->debug("New signal detected for cell[%d], total [%d] cells in coverage", cellId, + static_cast(m_cellDesc.size())); +} + +void UeRrcTask::notifyCellLost(int cellId) +{ + if (!m_cellDesc.count(cellId)) + return; + + m_cellDesc.erase(cellId); + + m_logger->debug("Signal lost for cell[%d], total [%d] cells in coverage", cellId, + static_cast(m_cellDesc.size())); + + // TODO: handle other operations +} + +bool UeRrcTask::hasSignalToCell(int cellId) +{ + return m_cellDesc.count(cellId); } } // namespace nr::ue diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index c5fd471ee..150503b8d 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -21,6 +21,9 @@ namespace nr::ue void UeRrcTask::handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &rrcPdu) { + if (!hasSignalToCell(cellId)) + return; + switch (channel) { case rrc::RrcChannel::BCCH_BCH: { diff --git a/src/ue/rrc/rls_sap.cpp b/src/ue/rrc/rls_sap.cpp index 76c12bba6..a87c64a55 100644 --- a/src/ue/rrc/rls_sap.cpp +++ b/src/ue/rrc/rls_sap.cpp @@ -10,7 +10,6 @@ #include #include #include -#include namespace nr::ue { diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 3d63d526d..b1c02bc6e 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -8,15 +8,17 @@ #pragma once -#include #include #include +#include +#include + #include #include -#include #include #include -#include + +#include extern "C" { @@ -53,6 +55,8 @@ class UeRrcTask : public NtsTask ASN_RRC_InitialUE_Identity_t m_initialId{}; OctetString m_initialNasPdu{}; + std::unordered_map m_cellDesc{}; + friend class UeCmdHandler; public: @@ -94,6 +98,9 @@ class UeRrcTask : public NtsTask /* Cell Management */ void handleCellSignalChange(int cellId, int dbm); + void notifyCellDetected(int cellId, int dbm); + void notifyCellLost(int cellId); + bool hasSignalToCell(int cellId); }; } // namespace nr::ue diff --git a/src/ue/types.hpp b/src/ue/types.hpp index e2ec62d24..cdf602a19 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -29,6 +29,11 @@ class UeRrcTask; class UeRlsTask; class UserEquipment; +struct UeCellDesc +{ + int dbm{}; +}; + struct SupportedAlgs { bool nia1 = true; From d2c20555202569ac1aeb125444f46f41729bc323 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:20:22 +0300 Subject: [PATCH 076/311] RRC developments --- src/ue/rrc/task.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index b1c02bc6e..b803263a5 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -82,7 +82,7 @@ class UeRrcTask : public NtsTask void handleRadioLinkFailure(); - /* RRC send and receive message */ + /* RRC Message Transmission and Receive */ void sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg); void sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg); void sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg); From 5186a13bb62dc7f8304a12ebaa83ecf33f376f28 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:20:37 +0300 Subject: [PATCH 077/311] RRC developments --- src/ue/rrc/task.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index b803263a5..462d140cb 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -87,11 +87,11 @@ class UeRrcTask : public NtsTask void sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg); void sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg); void sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg); - void receiveRrcMessage(int, ASN_RRC_BCCH_BCH_Message *msg); - void receiveRrcMessage(int, ASN_RRC_BCCH_DL_SCH_Message *msg); - void receiveRrcMessage(int, ASN_RRC_DL_CCCH_Message *msg); - void receiveRrcMessage(int, ASN_RRC_DL_DCCH_Message *msg); - void receiveRrcMessage(int, ASN_RRC_PCCH_Message *msg); + void receiveRrcMessage(int cellId, ASN_RRC_BCCH_BCH_Message *msg); + void receiveRrcMessage(int cellId, ASN_RRC_BCCH_DL_SCH_Message *msg); + void receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg); + void receiveRrcMessage(int cellId, ASN_RRC_DL_DCCH_Message *msg); + void receiveRrcMessage(int cellId, ASN_RRC_PCCH_Message *msg); /* RLS Service Access Point */ void handleRlsSapMessage(NwUeRlsToRrc &msg); From 3a2eb0d741f44cb7e172d7706fc01111ca75791a Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:24:04 +0300 Subject: [PATCH 078/311] RRC developments --- src/ue/rrc/channel.cpp | 3 ++- src/ue/rrc/sysinfo.cpp | 25 +++++++++++++++++++++++++ src/ue/rrc/task.hpp | 4 ++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/ue/rrc/sysinfo.cpp diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index 150503b8d..2b25d16fb 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -140,7 +140,8 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) void UeRrcTask::receiveRrcMessage(int, ASN_RRC_BCCH_BCH_Message *msg) { - // TODO + if (msg->message.present == ASN_RRC_BCCH_BCH_MessageType_PR_mib) + receiveMib(*msg->message.choice.mib); } void UeRrcTask::receiveRrcMessage(int, ASN_RRC_BCCH_DL_SCH_Message *msg) diff --git a/src/ue/rrc/sysinfo.cpp b/src/ue/rrc/sysinfo.cpp new file mode 100644 index 000000000..c84ce6a3b --- /dev/null +++ b/src/ue/rrc/sysinfo.cpp @@ -0,0 +1,25 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" + +#include +#include +#include +#include +#include + +namespace nr::ue +{ + +void UeRrcTask::receiveMib(const ASN_RRC_MIB &msg) +{ + // TODO +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 462d140cb..a030635b6 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -38,6 +38,7 @@ extern "C" struct ASN_RRC_RRCReject; struct ASN_RRC_RRCRelease; struct ASN_RRC_Paging; + struct ASN_RRC_MIB; } namespace nr::ue @@ -101,6 +102,9 @@ class UeRrcTask : public NtsTask void notifyCellDetected(int cellId, int dbm); void notifyCellLost(int cellId); bool hasSignalToCell(int cellId); + + /* System Information */ + void receiveMib(const ASN_RRC_MIB &msg); }; } // namespace nr::ue From 098e110d96727be2c74e2c1cf008ea3a03108a8a Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:29:31 +0300 Subject: [PATCH 079/311] RRC developments --- src/ue/rrc/channel.cpp | 12 ++++++------ src/ue/rrc/sysinfo.cpp | 9 +++++++-- src/ue/rrc/task.hpp | 2 +- src/ue/types.hpp | 2 ++ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index 2b25d16fb..e249f46aa 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -138,18 +138,18 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) m_base->rlsTask->push(nw); } -void UeRrcTask::receiveRrcMessage(int, ASN_RRC_BCCH_BCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_BCCH_BCH_Message *msg) { if (msg->message.present == ASN_RRC_BCCH_BCH_MessageType_PR_mib) - receiveMib(*msg->message.choice.mib); + receiveMib(cellId, *msg->message.choice.mib); } -void UeRrcTask::receiveRrcMessage(int, ASN_RRC_BCCH_DL_SCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_BCCH_DL_SCH_Message *msg) { // TODO } -void UeRrcTask::receiveRrcMessage(int, ASN_RRC_DL_CCCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg) { if (msg->message.present != ASN_RRC_DL_CCCH_MessageType_PR_c1) return; @@ -168,7 +168,7 @@ void UeRrcTask::receiveRrcMessage(int, ASN_RRC_DL_CCCH_Message *msg) } } -void UeRrcTask::receiveRrcMessage(int, ASN_RRC_DL_DCCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_DCCH_Message *msg) { if (msg->message.present != ASN_RRC_DL_DCCH_MessageType_PR_c1) return; @@ -187,7 +187,7 @@ void UeRrcTask::receiveRrcMessage(int, ASN_RRC_DL_DCCH_Message *msg) } } -void UeRrcTask::receiveRrcMessage(int, ASN_RRC_PCCH_Message *msg) +void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_PCCH_Message *msg) { if (msg->message.present != ASN_RRC_PCCH_MessageType_PR_c1) return; diff --git a/src/ue/rrc/sysinfo.cpp b/src/ue/rrc/sysinfo.cpp index c84ce6a3b..7c379c48e 100644 --- a/src/ue/rrc/sysinfo.cpp +++ b/src/ue/rrc/sysinfo.cpp @@ -14,12 +14,17 @@ #include #include +#include + namespace nr::ue { -void UeRrcTask::receiveMib(const ASN_RRC_MIB &msg) +void UeRrcTask::receiveMib(int cellId, const ASN_RRC_MIB &msg) { - // TODO + auto &desc = m_cellDesc[cellId]; + + desc.isBarred = msg.cellBarred == ASN_RRC_MIB__cellBarred_barred; + desc.isIntraFreqReselectAllowed = msg.intraFreqReselection == ASN_RRC_MIB__intraFreqReselection_allowed; } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index a030635b6..489fe9c65 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -104,7 +104,7 @@ class UeRrcTask : public NtsTask bool hasSignalToCell(int cellId); /* System Information */ - void receiveMib(const ASN_RRC_MIB &msg); + void receiveMib(int cellId, const ASN_RRC_MIB &msg); }; } // namespace nr::ue diff --git a/src/ue/types.hpp b/src/ue/types.hpp index cdf602a19..418888a3d 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -32,6 +32,8 @@ class UserEquipment; struct UeCellDesc { int dbm{}; + bool isBarred = true; + bool isIntraFreqReselectAllowed = true; }; struct SupportedAlgs From 27727cb3be60b1f810619c2a4406d1e063d541d4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:33:11 +0300 Subject: [PATCH 080/311] RRC developments --- src/ue/rrc/channel.cpp | 13 ++++++++++++- src/ue/rrc/sysinfo.cpp | 5 +++++ src/ue/rrc/task.hpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index e249f46aa..a09bd01a6 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -146,7 +146,18 @@ void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_BCCH_BCH_Message *msg) void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_BCCH_DL_SCH_Message *msg) { - // TODO + if (msg->message.present != ASN_RRC_BCCH_DL_SCH_MessageType_PR_c1) + return; + + auto &c1 = msg->message.choice.c1; + switch (c1->present) + { + case ASN_RRC_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1: + receiveSib1(cellId, *c1->choice.systemInformationBlockType1); + break; + default: + break; + } } void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg) diff --git a/src/ue/rrc/sysinfo.cpp b/src/ue/rrc/sysinfo.cpp index 7c379c48e..883454730 100644 --- a/src/ue/rrc/sysinfo.cpp +++ b/src/ue/rrc/sysinfo.cpp @@ -27,4 +27,9 @@ void UeRrcTask::receiveMib(int cellId, const ASN_RRC_MIB &msg) desc.isIntraFreqReselectAllowed = msg.intraFreqReselection == ASN_RRC_MIB__intraFreqReselection_allowed; } +void UeRrcTask::receiveSib1(int cellId, const ASN_RRC_SIB1 &msg) +{ + // TODO +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 489fe9c65..1e195d225 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -39,6 +39,7 @@ extern "C" struct ASN_RRC_RRCRelease; struct ASN_RRC_Paging; struct ASN_RRC_MIB; + struct ASN_RRC_SIB1; } namespace nr::ue @@ -105,6 +106,7 @@ class UeRrcTask : public NtsTask /* System Information */ void receiveMib(int cellId, const ASN_RRC_MIB &msg); + void receiveSib1(int cellId, const ASN_RRC_SIB1 &msg); }; } // namespace nr::ue From 5c09ed2bf62fb2bad873c0f3a952700f91048148 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 14:38:17 +0300 Subject: [PATCH 081/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 3 +-- src/ue/rrc/sysinfo.cpp | 7 ++++++- src/ue/types.hpp | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp index 285b66f7c..a464af615 100644 --- a/src/gnb/rrc/broadcast.cpp +++ b/src/gnb/rrc/broadcast.cpp @@ -60,8 +60,7 @@ static ASN_RRC_BCCH_DL_SCH_Message *ConstructSib1Message(bool cellReserved, int if (cellReserved) { - sib1.cellAccessRelatedInfo.cellReservedForOtherUse = - asn::NewFor(sib1.cellAccessRelatedInfo.cellReservedForOtherUse); + asn::MakeNew(sib1.cellAccessRelatedInfo.cellReservedForOtherUse); *sib1.cellAccessRelatedInfo.cellReservedForOtherUse = ASN_RRC_CellAccessRelatedInfo__cellReservedForOtherUse_true; } diff --git a/src/ue/rrc/sysinfo.cpp b/src/ue/rrc/sysinfo.cpp index 883454730..d35de1ae0 100644 --- a/src/ue/rrc/sysinfo.cpp +++ b/src/ue/rrc/sysinfo.cpp @@ -15,6 +15,7 @@ #include #include +#include namespace nr::ue { @@ -23,12 +24,16 @@ void UeRrcTask::receiveMib(int cellId, const ASN_RRC_MIB &msg) { auto &desc = m_cellDesc[cellId]; - desc.isBarred = msg.cellBarred == ASN_RRC_MIB__cellBarred_barred; + desc.isBarredByMib = msg.cellBarred == ASN_RRC_MIB__cellBarred_barred; desc.isIntraFreqReselectAllowed = msg.intraFreqReselection == ASN_RRC_MIB__intraFreqReselection_allowed; } void UeRrcTask::receiveSib1(int cellId, const ASN_RRC_SIB1 &msg) { + auto &desc = m_cellDesc[cellId]; + + desc.isReserved = msg.cellAccessRelatedInfo.cellReservedForOtherUse != nullptr; + // TODO } diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 418888a3d..8634ab433 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -32,8 +32,9 @@ class UserEquipment; struct UeCellDesc { int dbm{}; - bool isBarred = true; + bool isBarredByMib = true; bool isIntraFreqReselectAllowed = true; + bool isReserved = false; }; struct SupportedAlgs From 2dae5580581a4b03d57b124fab15842e3700a3e4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 15:59:57 +0300 Subject: [PATCH 082/311] RRC developments --- src/gnb/rrc/broadcast.cpp | 2 +- src/lib/asn/rrc.cpp | 26 ++++++++++++++++++++++++++ src/lib/asn/rrc.hpp | 5 ++++- src/ue/rrc/sysinfo.cpp | 34 ++++++++++++++++++++++++++++------ src/ue/types.hpp | 20 +++++++++++++++++--- 5 files changed, 76 insertions(+), 11 deletions(-) diff --git a/src/gnb/rrc/broadcast.cpp b/src/gnb/rrc/broadcast.cpp index a464af615..3a24d6804 100644 --- a/src/gnb/rrc/broadcast.cpp +++ b/src/gnb/rrc/broadcast.cpp @@ -69,7 +69,7 @@ static ASN_RRC_BCCH_DL_SCH_Message *ConstructSib1Message(bool cellReserved, int plmnInfo->cellReservedForOperatorUse = cellReserved ? ASN_RRC_PLMN_IdentityInfo__cellReservedForOperatorUse_reserved : ASN_RRC_PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved; - plmnInfo->trackingAreaCode = asn::NewFor(plmnInfo->trackingAreaCode); + asn::MakeNew(plmnInfo->trackingAreaCode); asn::SetBitStringInt<24>(tac, *plmnInfo->trackingAreaCode); asn::SetBitStringLong<36>(nci, plmnInfo->cellIdentity); asn::SequenceAdd(plmnInfo->plmn_IdentityList, asn::rrc::NewPlmnId(plmn)); diff --git a/src/lib/asn/rrc.cpp b/src/lib/asn/rrc.cpp index b548d5c2e..ec5ce653d 100644 --- a/src/lib/asn/rrc.cpp +++ b/src/lib/asn/rrc.cpp @@ -8,9 +8,13 @@ #include "rrc.hpp" +#include + #include +#include #include +#include namespace asn::rrc { @@ -48,4 +52,26 @@ ASN_RRC_MCC_MNC_Digit_t *NewMccMncDigit(int digit) return value; } +Plmn GetPlmnId(const ASN_RRC_PLMN_Identity &value) +{ + if (value.mcc == nullptr) + throw std::runtime_error(""); + + Plmn plmn; + + asn::ForeachItem(*value.mcc, [&plmn](auto &i) { + plmn.mcc *= 10; + plmn.mcc += static_cast(i); + }); + + asn::ForeachItem(value.mnc, [&plmn](auto &i) { + plmn.mnc *= 10; + plmn.mnc += static_cast(i); + }); + + plmn.isLongMnc = value.mnc.list.count == 3; + + return plmn; +} + } // namespace asn::rrc diff --git a/src/lib/asn/rrc.hpp b/src/lib/asn/rrc.hpp index 0b65b173d..a402030fb 100644 --- a/src/lib/asn/rrc.hpp +++ b/src/lib/asn/rrc.hpp @@ -6,9 +6,10 @@ // and subject to the terms and conditions defined in LICENSE file. // -#include #include +#include + namespace asn::rrc { @@ -18,4 +19,6 @@ ASN_RRC_PLMN_Identity *NewPlmnId(const Plmn &plmn); ASN_RRC_MCC_MNC_Digit_t *NewMccMncDigit(int digit); +Plmn GetPlmnId(const ASN_RRC_PLMN_Identity& value); + } // namespace asn::rrc diff --git a/src/ue/rrc/sysinfo.cpp b/src/ue/rrc/sysinfo.cpp index d35de1ae0..65392987d 100644 --- a/src/ue/rrc/sysinfo.cpp +++ b/src/ue/rrc/sysinfo.cpp @@ -8,14 +8,16 @@ #include "task.hpp" +#include #include #include #include -#include -#include #include +#include +#include #include +#include namespace nr::ue { @@ -24,17 +26,37 @@ void UeRrcTask::receiveMib(int cellId, const ASN_RRC_MIB &msg) { auto &desc = m_cellDesc[cellId]; - desc.isBarredByMib = msg.cellBarred == ASN_RRC_MIB__cellBarred_barred; - desc.isIntraFreqReselectAllowed = msg.intraFreqReselection == ASN_RRC_MIB__intraFreqReselection_allowed; + desc.mib.isBarred = msg.cellBarred == ASN_RRC_MIB__cellBarred_barred; + desc.mib.isIntraFreqReselectAllowed = msg.intraFreqReselection == ASN_RRC_MIB__intraFreqReselection_allowed; } void UeRrcTask::receiveSib1(int cellId, const ASN_RRC_SIB1 &msg) { auto &desc = m_cellDesc[cellId]; - desc.isReserved = msg.cellAccessRelatedInfo.cellReservedForOtherUse != nullptr; + desc.sib1.isReserved = msg.cellAccessRelatedInfo.cellReservedForOtherUse != nullptr; - // TODO + auto *plmnIdentityInfo = msg.cellAccessRelatedInfo.plmn_IdentityList.list.array[0]; + desc.sib1.nci = asn::GetBitStringLong<36>(plmnIdentityInfo->cellIdentity); + + desc.sib1.isReserved &= + plmnIdentityInfo->cellReservedForOperatorUse == ASN_RRC_PLMN_IdentityInfo__cellReservedForOperatorUse_reserved; + + desc.sib1.tac = asn::GetBitStringInt<24>(*plmnIdentityInfo->trackingAreaCode); + + auto plmnIdentity = plmnIdentityInfo->plmn_IdentityList.list.array[0]; + desc.sib1.plmn = asn::rrc::GetPlmnId(*plmnIdentity); + + auto *barringInfo = msg.uac_BarringInfo->uac_BarringInfoSetList.list.array[0]; + + int barringBits = asn::GetBitStringInt<7>(barringInfo->uac_BarringForAccessIdentity); + desc.sib1.aiBarringSet.ai15 = bits::BitAt<0>(barringBits); + desc.sib1.aiBarringSet.ai14 = bits::BitAt<1>(barringBits); + desc.sib1.aiBarringSet.ai13 = bits::BitAt<2>(barringBits); + desc.sib1.aiBarringSet.ai12 = bits::BitAt<3>(barringBits); + desc.sib1.aiBarringSet.ai11 = bits::BitAt<4>(barringBits); + desc.sib1.aiBarringSet.ai2 = bits::BitAt<5>(barringBits); + desc.sib1.aiBarringSet.ai1 = bits::BitAt<6>(barringBits); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 8634ab433..fc368f2b3 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -32,9 +32,23 @@ class UserEquipment; struct UeCellDesc { int dbm{}; - bool isBarredByMib = true; - bool isIntraFreqReselectAllowed = true; - bool isReserved = false; + + struct + { + bool hasMib = false; + bool isBarred = true; + bool isIntraFreqReselectAllowed = true; + } mib{}; + + struct + { + bool hasSib1 = false; + bool isReserved = false; + int64_t nci = 0; + int tac = 0; + Plmn plmn; + UacAiBarringSet aiBarringSet; + } sib1{}; }; struct SupportedAlgs From 9f53791bf3470c9db76cdf7cd4e0de6a740a159d Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 15 May 2021 16:02:53 +0300 Subject: [PATCH 083/311] RRC developments --- src/ue/rrc/channel.cpp | 15 --------------- src/ue/rrc/task.hpp | 1 - 2 files changed, 16 deletions(-) diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index a09bd01a6..ae97d86d3 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -78,21 +78,6 @@ void UeRrcTask::handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const Oct } } -void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) -{ - OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_BCCH_BCH_Message, msg); - if (pdu.length() == 0) - { - m_logger->err("RRC BCCH-BCH encoding failed."); - return; - } - - auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); - nw->channel = rrc::RrcChannel::BCCH_BCH; - nw->pdu = std::move(pdu); - m_base->rlsTask->push(nw); -} - void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg) { OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_UL_CCCH_Message, msg); diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 1e195d225..c0622511e 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -85,7 +85,6 @@ class UeRrcTask : public NtsTask void handleRadioLinkFailure(); /* RRC Message Transmission and Receive */ - void sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg); void sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg); void sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg); void sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg); From 5d3bd102771990048bedf66b2fd7d56c56cea975 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 12:38:33 +0300 Subject: [PATCH 084/311] RRC developments --- src/ue/nas/mm/base.cpp | 12 +--- src/ue/nas/mm/interface.cpp | 4 -- src/ue/nas/mm/mm.hpp | 3 - src/ue/nas/mm/radio.cpp | 133 ------------------------------------ src/ue/nts.hpp | 16 ----- src/ue/rrc/task.cpp | 11 --- 6 files changed, 1 insertion(+), 178 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 857cc91db..8fe625011 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -84,17 +84,7 @@ void NasMm::performMmCycle() m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH || m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE) { - int64_t current = utils::CurrentTimeMillis(); - int64_t backoff = (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || - m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) - ? -1 - : 1500; - - if (current - m_lastPlmnSearchTrigger > backoff) - { - m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::PLMN_SEARCH_REQUEST)); - m_lastPlmnSearchTrigger = current; - } + // TODO return; } diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index ba21beb84..4848fad37 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -23,10 +23,6 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) handleRrcConnectionSetup(); break; } - case NwUeRrcToNas::PLMN_SEARCH_RESPONSE: { - handlePlmnSearchResponse(msg.measurements); - break; - } case NwUeRrcToNas::NAS_DELIVERY: { OctetView buffer{msg.nasPdu}; auto nasMessage = nas::DecodeNasMessage(buffer); diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index e65b68ca5..615fa0428 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -48,8 +48,6 @@ class NasMm EDeregCause m_lastDeregCause{}; // Indicates the last service request cause EServiceReqCause m_lastServiceReqCause{}; - // Last time PLMN search is triggered - long m_lastPlmnSearchTrigger{}; // Registration attempt counter int m_regCounter{}; // Service request attempt counter @@ -154,7 +152,6 @@ class NasMm private: /* Radio */ void localReleaseConnection(); - void handlePlmnSearchResponse(const std::vector &measures); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); void handleServingCellChange(const UeCellInfo &servingCell); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 0472c7564..836afad6a 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -16,139 +16,6 @@ namespace nr::ue { -void NasMm::handlePlmnSearchResponse(const std::vector &measures) -{ - if (m_mmSubState != EMmSubState::MM_REGISTERED_PLMN_SEARCH && - m_mmSubState != EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE && - m_mmSubState != EMmSubState::MM_DEREGISTERED_PLMN_SEARCH && - m_mmSubState != EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) - { - m_logger->warn("PLMN search response received without being requested"); - return; - } - - if (measures.empty()) - { - if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) - { - m_logger->err("PLMN selection failure, no cell available"); - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE); - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH) - { - m_logger->err("PLMN selection failure, no cell available"); - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE); - return; - } - return; // otherwise it's one of the no-cell-available states, no need to print an error - } - - int listedAsForbiddenPlmn = 0; - int listedAsForbiddenTai = 0; - int listedAsForbiddenServiceAreaPlmn = 0; - int listedAsForbiddenServiceAreaTai = 0; - int unlistedPlmn = 0; - - std::vector suitable{}; - std::vector acceptable{}; - - for (auto &item : measures) - { - acceptable.push_back(item); - - if (nas::utils::PlmnListContains(m_usim->m_forbiddenPlmnList, item.cellId.plmn)) - { - listedAsForbiddenPlmn++; - continue; - } - if (nas::utils::TaiListContains( - m_usim->m_forbiddenTaiListRps, - nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(item.cellId.plmn), octet3{item.tac}}) || - nas::utils::TaiListContains( - m_usim->m_forbiddenTaiListRoaming, - nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(item.cellId.plmn), octet3{item.tac}})) - { - listedAsForbiddenTai++; - continue; - } - if (nas::utils::ServiceAreaListForbidsPlmn(m_usim->m_serviceAreaList, nas::utils::PlmnFrom(item.cellId.plmn))) - { - listedAsForbiddenServiceAreaPlmn++; - continue; - } - if (nas::utils::ServiceAreaListForbidsTai( - m_usim->m_serviceAreaList, - nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(item.cellId.plmn), octet3{item.tac}})) - { - listedAsForbiddenServiceAreaTai++; - continue; - } - - if (item.cellId.plmn == m_base->config->hplmn || item.cellId.plmn == m_usim->m_currentPlmn || - nas::utils::PlmnListContains(m_usim->m_equivalentPlmnList, item.cellId.plmn)) - { - suitable.push_back(item); - } - else - { - unlistedPlmn++; - continue; - } - } - - int totalForbidden = listedAsForbiddenPlmn + listedAsForbiddenTai + listedAsForbiddenServiceAreaPlmn + - listedAsForbiddenServiceAreaTai; - - auto logErrorSuitableAcceptable = [this, totalForbidden, unlistedPlmn]() { - m_logger->err("PLMN selection failure, no suitable or acceptable cell can be found"); - if (totalForbidden > 0 || unlistedPlmn > 0) - m_logger->err("[%d] cell was in forbidden list, [%d] was in unknown PLMN", totalForbidden, unlistedPlmn); - }; - - auto logWarningAcceptable = [this, totalForbidden, unlistedPlmn]() { - m_logger->warn("PLMN selection failure, no suitable cell can be found, an acceptable cell is selected instead"); - if (totalForbidden > 0 || unlistedPlmn > 0) - m_logger->warn("[%d] cell was in forbidden list, [%d] was in unknown PLMN", totalForbidden, unlistedPlmn); - }; - - if (!suitable.empty()) - { - std::stable_sort(suitable.begin(), suitable.end(), [](auto &x, auto &y) { return x.dbm >= y.dbm; }); - - auto *w = new NwUeNasToRrc(NwUeNasToRrc::CELL_SELECTION_COMMAND); - w->cellId = suitable[0].cellId; - w->isSuitableCell = true; - m_base->rrcTask->push(w); - } - else if (!acceptable.empty()) - { - std::stable_sort(acceptable.begin(), acceptable.end(), [](auto &x, auto &y) { return x.dbm >= y.dbm; }); - - logWarningAcceptable(); - - auto *w = new NwUeNasToRrc(NwUeNasToRrc::CELL_SELECTION_COMMAND); - w->cellId = acceptable[0].cellId; - w->isSuitableCell = false; - m_base->rrcTask->push(w); - } - else - { - if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) - { - logErrorSuitableAcceptable(); - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE); - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH) - { - logErrorSuitableAcceptable(); - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE); - return; - } - } -} - void NasMm::handleServingCellChange(const UeCellInfo &servingCell) { if (m_cmState == ECmState::CM_CONNECTED) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index eabb19497..7bbca4ef2 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -65,7 +65,6 @@ struct NwUeRrcToNas : NtsMessage enum PR { NAS_DELIVERY, - PLMN_SEARCH_RESPONSE, RRC_CONNECTION_SETUP, RRC_CONNECTION_RELEASE, RADIO_LINK_FAILURE, @@ -76,9 +75,6 @@ struct NwUeRrcToNas : NtsMessage // NAS_DELIVERY OctetString nasPdu{}; - // PLMN_SEARCH_RESPONSE - std::vector measurements{}; - // SERVING_CELL_CHANGE UeCellInfo servingCell{}; @@ -94,11 +90,9 @@ struct NwUeNasToRrc : NtsMessage { enum PR { - PLMN_SEARCH_REQUEST, LOCAL_RELEASE_CONNECTION, INITIAL_NAS_DELIVERY, UPLINK_NAS_DELIVERY, - CELL_SELECTION_COMMAND, } present; // INITIAL_NAS_DELIVERY @@ -108,10 +102,6 @@ struct NwUeNasToRrc : NtsMessage // INITIAL_NAS_DELIVERY long rrcEstablishmentCause{}; - // CELL_SELECTION_COMMAND - GlobalNci cellId{}; - bool isSuitableCell{}; // otherwise 'acceptable' - explicit NwUeNasToRrc(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RRC), present(present) { } @@ -121,16 +111,10 @@ struct NwUeRrcToRls : NtsMessage { enum PR { - PLMN_SEARCH_REQUEST, - CELL_SELECTION_COMMAND, RRC_PDU_DELIVERY, RESET_STI, } present; - // CELL_SELECTION_COMMAND - GlobalNci cellId{}; - bool isSuitableCell{}; // otherwise 'acceptable' - // RRC_PDU_DELIVERY rrc::RrcChannel channel{}; OctetString pdu{}; diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index b9cf19c00..3bd291850 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -48,10 +48,6 @@ void UeRrcTask::onLoop() auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeNasToRrc::PLMN_SEARCH_REQUEST: { - m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::PLMN_SEARCH_REQUEST)); - break; - } case NwUeNasToRrc::INITIAL_NAS_DELIVERY: { deliverInitialNas(std::move(w->nasPdu), w->rrcEstablishmentCause); break; @@ -66,13 +62,6 @@ void UeRrcTask::onLoop() m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::RESET_STI)); break; } - case NwUeNasToRrc::CELL_SELECTION_COMMAND: { - auto *wr = new NwUeRrcToRls(NwUeRrcToRls::CELL_SELECTION_COMMAND); - wr->cellId = w->cellId; - wr->isSuitableCell = w->isSuitableCell; - m_base->rlsTask->push(wr); - break; - } } break; } From 26a8e3d0dbddd11221f33f3c7e3aab0a1b3a6c64 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 13:20:57 +0300 Subject: [PATCH 085/311] RRC developments --- src/ue/rrc/cells.cpp | 9 +++++++++ src/ue/rrc/sysinfo.cpp | 4 ++++ src/ue/rrc/task.hpp | 1 + src/ue/types.hpp | 11 ++++++++++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index be4257158..ce5ceee8f 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -38,6 +38,8 @@ void UeRrcTask::notifyCellDetected(int cellId, int dbm) m_logger->debug("New signal detected for cell[%d], total [%d] cells in coverage", cellId, static_cast(m_cellDesc.size())); + + updateAvailablePlmns(); } void UeRrcTask::notifyCellLost(int cellId) @@ -50,6 +52,8 @@ void UeRrcTask::notifyCellLost(int cellId) m_logger->debug("Signal lost for cell[%d], total [%d] cells in coverage", cellId, static_cast(m_cellDesc.size())); + updateAvailablePlmns(); + // TODO: handle other operations } @@ -58,4 +62,9 @@ bool UeRrcTask::hasSignalToCell(int cellId) return m_cellDesc.count(cellId); } +void UeRrcTask::updateAvailablePlmns() +{ + // TODO +} + } // namespace nr::ue diff --git a/src/ue/rrc/sysinfo.cpp b/src/ue/rrc/sysinfo.cpp index 65392987d..003eb779c 100644 --- a/src/ue/rrc/sysinfo.cpp +++ b/src/ue/rrc/sysinfo.cpp @@ -28,6 +28,8 @@ void UeRrcTask::receiveMib(int cellId, const ASN_RRC_MIB &msg) desc.mib.isBarred = msg.cellBarred == ASN_RRC_MIB__cellBarred_barred; desc.mib.isIntraFreqReselectAllowed = msg.intraFreqReselection == ASN_RRC_MIB__intraFreqReselection_allowed; + + updateAvailablePlmns(); } void UeRrcTask::receiveSib1(int cellId, const ASN_RRC_SIB1 &msg) @@ -57,6 +59,8 @@ void UeRrcTask::receiveSib1(int cellId, const ASN_RRC_SIB1 &msg) desc.sib1.aiBarringSet.ai11 = bits::BitAt<4>(barringBits); desc.sib1.aiBarringSet.ai2 = bits::BitAt<5>(barringBits); desc.sib1.aiBarringSet.ai1 = bits::BitAt<6>(barringBits); + + updateAvailablePlmns(); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index c0622511e..f8739a80f 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -102,6 +102,7 @@ class UeRrcTask : public NtsTask void notifyCellDetected(int cellId, int dbm); void notifyCellLost(int cellId); bool hasSignalToCell(int cellId); + void updateAvailablePlmns(); /* System Information */ void receiveMib(int cellId, const ASN_RRC_MIB &msg); diff --git a/src/ue/types.hpp b/src/ue/types.hpp index fc368f2b3..87936d23c 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -9,11 +9,13 @@ #pragma once #include +#include +#include + #include #include #include #include -#include #include #include #include @@ -134,6 +136,11 @@ struct UeConfig } }; +struct UeSharedContext +{ + std::array, 16> availablePlmns{}; +}; + struct TaskBase { UserEquipment *ue{}; @@ -143,6 +150,8 @@ struct TaskBase app::INodeListener *nodeListener{}; NtsTask *cliCallbackTask{}; + UeSharedContext shCtx{}; + UeAppTask *appTask{}; NasTask *nasTask{}; UeRrcTask *rrcTask{}; From 6c831a70d764db258467d69664a341741d23b7fa Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 14:05:13 +0300 Subject: [PATCH 086/311] RRC developments --- src/ue/rrc/cells.cpp | 8 +++++++- src/ue/rrc/sysinfo.cpp | 4 ++++ src/ue/types.hpp | 4 +++- src/utils/locked.cpp | 9 +++++++++ src/utils/locked.hpp | 46 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/utils/locked.cpp create mode 100644 src/utils/locked.hpp diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index ce5ceee8f..a0a9f710e 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -7,6 +7,7 @@ // #include "task.hpp" + #include #include @@ -64,7 +65,12 @@ bool UeRrcTask::hasSignalToCell(int cellId) void UeRrcTask::updateAvailablePlmns() { - // TODO + m_base->shCtx.availablePlmns.mutate([this](std::unordered_set &value) { + value.clear(); + for (auto &cellDesc : m_cellDesc) + if (cellDesc.second.sib1.hasSib1) + value.insert(cellDesc.second.sib1.plmn); + }); } } // namespace nr::ue diff --git a/src/ue/rrc/sysinfo.cpp b/src/ue/rrc/sysinfo.cpp index 003eb779c..f90581ea9 100644 --- a/src/ue/rrc/sysinfo.cpp +++ b/src/ue/rrc/sysinfo.cpp @@ -29,6 +29,8 @@ void UeRrcTask::receiveMib(int cellId, const ASN_RRC_MIB &msg) desc.mib.isBarred = msg.cellBarred == ASN_RRC_MIB__cellBarred_barred; desc.mib.isIntraFreqReselectAllowed = msg.intraFreqReselection == ASN_RRC_MIB__intraFreqReselection_allowed; + desc.mib.hasMib = true; + updateAvailablePlmns(); } @@ -60,6 +62,8 @@ void UeRrcTask::receiveSib1(int cellId, const ASN_RRC_SIB1 &msg) desc.sib1.aiBarringSet.ai2 = bits::BitAt<5>(barringBits); desc.sib1.aiBarringSet.ai1 = bits::BitAt<6>(barringBits); + desc.sib1.hasSib1 = true; + updateAvailablePlmns(); } diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 87936d23c..7aa1f9490 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -138,7 +140,7 @@ struct UeConfig struct UeSharedContext { - std::array, 16> availablePlmns{}; + Locked> availablePlmns{}; }; struct TaskBase diff --git a/src/utils/locked.cpp b/src/utils/locked.cpp new file mode 100644 index 000000000..5d6ec14fa --- /dev/null +++ b/src/utils/locked.cpp @@ -0,0 +1,9 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "locked.hpp" \ No newline at end of file diff --git a/src/utils/locked.hpp b/src/utils/locked.hpp new file mode 100644 index 000000000..0a2739960 --- /dev/null +++ b/src/utils/locked.hpp @@ -0,0 +1,46 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include + +template +class Locked +{ + private: + T m_value; + std::recursive_mutex m_mutex; + + public: + Locked() : m_value{}, m_mutex{} + { + } + + explicit Locked(T value) : m_value{value}, m_mutex{} + { + } + + Locked(const T &) = delete; + Locked(T &&) = delete; + + Locked &operator=(const Locked &) = delete; + Locked &operator=(Locked &&) = delete; + + template + inline void access(Func fun) + { + // Şimdilik access ve mutate aynı, optimizasyon adına read-write lock kullanılabilir + mutate(fun); + } + + template + inline void mutate(Func fun) + { + std::lock_guard lk(m_mutex); + fun(m_value); + } +}; \ No newline at end of file From 75bfc1c2405e95404fa9513712935649002a5c2f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 14:16:56 +0300 Subject: [PATCH 087/311] RRC developments --- src/ue/nas/mm/base.cpp | 149 ++++++++++++++++++++++++++++++---------- src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/radio.cpp | 5 ++ 3 files changed, 117 insertions(+), 38 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 8fe625011..3b70560bf 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -50,48 +50,73 @@ void NasMm::performMmCycle() if (m_mmState == EMmState::MM_NULL) return; - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NA) + if (m_mmState == EMmState::MM_DEREGISTERED) { if (switchToECallInactivityIfNeeded()) return; - if (m_usim->isValid()) + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NA) { - if (m_usim->m_servingCell.has_value()) + if (m_usim->isValid()) { - auto cellCategory = m_usim->m_servingCell->cellCategory; - - if (cellCategory == ECellCategory::SUITABLE_CELL) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); - else if (cellCategory == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + if (m_usim->m_servingCell.has_value()) + { + auto cellCategory = m_usim->m_servingCell->cellCategory; + + if (cellCategory == ECellCategory::SUITABLE_CELL) + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + else if (cellCategory == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + else + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + } else + { switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + } } else { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_SUPI); } + return; } - else + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_SUPI); + if (!m_timers->t3346.isRunning()) + sendInitialRegistration(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); + return; + } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE) + { + return; + } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION) + { + return; + } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH) + { + performPlmnSelection(); + return; + } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_SUPI) + { + return; + } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) + { + performPlmnSelection(); + return; + } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ECALL_INACTIVE) + { + return; + } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_INITIAL_REGISTRATION_NEEDED) + { + return; } - } - - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || - m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE || - m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH || - m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE) - { - // TODO - return; - } - - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) - { - if (!m_timers->t3346.isRunning()) - sendInitialRegistration(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); return; } @@ -99,25 +124,73 @@ void NasMm::performMmCycle() { if (startECallInactivityIfNeeded()) return; - } - if (m_mmSubState == EMmSubState::MM_REGISTERED_NA) - { - if (m_usim->m_servingCell.has_value()) + if (m_mmSubState == EMmSubState::MM_REGISTERED_NA) { - auto cellCategory = m_usim->m_servingCell->cellCategory; + if (m_usim->m_servingCell.has_value()) + { + auto cellCategory = m_usim->m_servingCell->cellCategory; - if (cellCategory == ECellCategory::SUITABLE_CELL) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - else if (cellCategory == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + if (cellCategory == ECellCategory::SUITABLE_CELL) + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + else if (cellCategory == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + else + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); + } else + { switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); + } + + return; + } + else if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) + { + return; + } + else if (m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE) + { + return; + } + else if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) + { + return; + } + else if (m_mmSubState == EMmSubState::MM_REGISTERED_LIMITED_SERVICE) + { + return; } - else + else if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); + performPlmnSelection(); + return; + } + else if (m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE) + { + performPlmnSelection(); + return; + } + else if (m_mmSubState == EMmSubState::MM_REGISTERED_UPDATE_NEEDED) + { + return; } + return; + } + + if (m_mmState == EMmState::MM_REGISTERED_INITIATED) + { + return; + } + + if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) + { + return; + } + + if (m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) + { + return; } } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 615fa0428..981117a41 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -151,6 +151,7 @@ class NasMm void handleNetworkSlicingSubscriptionChange(); private: /* Radio */ + void performPlmnSelection(); void localReleaseConnection(); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 836afad6a..9eb464bbd 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -16,6 +16,11 @@ namespace nr::ue { +void NasMm::performPlmnSelection() +{ + // TODO +} + void NasMm::handleServingCellChange(const UeCellInfo &servingCell) { if (m_cmState == ECmState::CM_CONNECTED) From 5e0d35c6269af319d7cbdca1658c70ba8d60ad25 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 14:26:33 +0300 Subject: [PATCH 088/311] RRC developments --- src/ue/nas/mm/base.cpp | 40 ++-------------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 3b70560bf..edee351c5 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -57,28 +57,7 @@ void NasMm::performMmCycle() if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NA) { - if (m_usim->isValid()) - { - if (m_usim->m_servingCell.has_value()) - { - auto cellCategory = m_usim->m_servingCell->cellCategory; - - if (cellCategory == ECellCategory::SUITABLE_CELL) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); - else if (cellCategory == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - } - else - { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - } - } - else - { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_SUPI); - } + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); return; } else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) @@ -127,22 +106,7 @@ void NasMm::performMmCycle() if (m_mmSubState == EMmSubState::MM_REGISTERED_NA) { - if (m_usim->m_servingCell.has_value()) - { - auto cellCategory = m_usim->m_servingCell->cellCategory; - - if (cellCategory == ECellCategory::SUITABLE_CELL) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - else if (cellCategory == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); - } - else - { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); - } - + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); return; } else if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) From de27eb6883f3cacf9120ecf55a24ecf312a643cc Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 14:59:42 +0300 Subject: [PATCH 089/311] RRC developments --- src/ue/nas/mm/mm.hpp | 4 ++- src/ue/nas/mm/radio.cpp | 59 +++++++++++++++++++++++++++++++++++++- src/ue/types.hpp | 3 +- src/utils/common_types.cpp | 10 +++++++ src/utils/common_types.hpp | 3 ++ src/utils/locked.hpp | 14 +++++++++ 6 files changed, 90 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 981117a41..276b11e9b 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -57,9 +57,11 @@ class NasMm // Network feature support information nas::IE5gsNetworkFeatureSupport m_nwFeatureSupport{}; // Last time Service Request needed indication for Data - long m_lastTimeServiceReqNeededIndForData{}; + int64_t m_lastTimeServiceReqNeededIndForData{}; // Number of times the network failing the authentication check int m_nwConsecutiveAuthFailure{}; + // Last time PLMN search failure logged + int64_t m_lastTimePlmnSearchFailureLogged{}; friend class UeCmdHandler; diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 9eb464bbd..c99293160 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -7,18 +7,75 @@ // #include "mm.hpp" + #include + #include #include #include #include +#include namespace nr::ue { void NasMm::performPlmnSelection() { - // TODO + int64_t currentTime = utils::CurrentTimeMillis(); + + bool logFailures = currentTime - m_lastTimePlmnSearchFailureLogged >= 10'000; + + Plmn lastSelectedPlmn = m_base->shCtx.selectedPlmn.get(); + + std::unordered_set plmns = m_base->shCtx.availablePlmns.get(); + + if (!m_usim->isValid() || plmns.empty()) + { + if (logFailures) + { + if (!m_usim->isValid()) + m_logger->warn("No PLMN can be selected, USIM is invalid"); + else + m_logger->err("PLMN selection failure, no cells in coverage"); + m_lastTimePlmnSearchFailureLogged = currentTime; + } + + m_base->shCtx.selectedPlmn.set({}); + return; + } + + std::vector candidates; + + for (auto &plmn : plmns) + if (plmn == m_base->config->hplmn) + candidates.push_back(plmn); + + for (auto &plmn : plmns) + { + if (plmn == m_base->config->hplmn) + continue; + if (nas::utils::PlmnListContains(m_usim->m_forbiddenPlmnList, plmn)) + continue; + if (nas::utils::ServiceAreaListForbidsPlmn(m_usim->m_serviceAreaList, nas::utils::PlmnFrom(plmn))) + continue; + if (nas::utils::PlmnListContains(m_usim->m_equivalentPlmnList, plmn)) + candidates.push_back(plmn); + } + + Plmn selected = candidates.empty() ? Plmn{} : candidates[0]; + + if (!selected.hasValue()) + { + if (logFailures) + { + m_logger->err("No PLMN could be selected among [%d] PLMNs", static_cast(plmns.size())); + m_lastTimePlmnSearchFailureLogged = currentTime; + } + } + else if (lastSelectedPlmn != selected) + m_logger->info("Selected PLMN[%s]", ToJson(selected).str().c_str()); + + m_base->shCtx.selectedPlmn.set(selected); } void NasMm::handleServingCellChange(const UeCellInfo &servingCell) diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 7aa1f9490..4433edfe1 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -140,7 +140,8 @@ struct UeConfig struct UeSharedContext { - Locked> availablePlmns{}; + Locked> availablePlmns; + Locked selectedPlmn; }; struct TaskBase diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 3cfdace28..c88a00bef 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -96,6 +96,11 @@ bool operator==(const Plmn &lhs, const Plmn &rhs) return lhs.isLongMnc == rhs.isLongMnc; } +bool operator!=(const Plmn &lhs, const Plmn &rhs) +{ + return !(lhs == rhs); +} + bool operator==(const GlobalNci &lhs, const GlobalNci &rhs) { return lhs.plmn == rhs.plmn && lhs.nci == rhs.nci; @@ -123,3 +128,8 @@ std::size_t std::hash::operator()(const GlobalNci &v) const noexcept utils::HashCombine(h, v.nci); return h; } + +bool Plmn::hasValue() const +{ + return this->mcc != 0; +} diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index e2c11c836..81cf09d09 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -30,6 +30,8 @@ struct Plmn int mcc{}; int mnc{}; bool isLongMnc{}; + + [[nodiscard]] bool hasValue() const; }; struct SingleSlice @@ -197,6 +199,7 @@ struct UacAiBarringSet bool operator==(const SingleSlice &lhs, const SingleSlice &rhs); bool operator==(const Plmn &lhs, const Plmn &rhs); +bool operator!=(const Plmn &lhs, const Plmn &rhs); bool operator==(const GlobalNci &lhs, const GlobalNci &rhs); Json ToJson(const Supi &v); diff --git a/src/utils/locked.hpp b/src/utils/locked.hpp index 0a2739960..97d1cd278 100644 --- a/src/utils/locked.hpp +++ b/src/utils/locked.hpp @@ -24,6 +24,8 @@ class Locked { } + static_assert(!std::is_reference::value); + Locked(const T &) = delete; Locked(T &&) = delete; @@ -43,4 +45,16 @@ class Locked std::lock_guard lk(m_mutex); fun(m_value); } + + inline T get() + { + T copy{}; + access([©](auto &value) { copy = value; }); + return copy; + } + + inline void set(const T &value) + { + mutate([&value](auto &v) { v = value; }); + } }; \ No newline at end of file From fd503925e172b38ba9f4b271c30c42396ecb4e2f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 15:04:12 +0300 Subject: [PATCH 090/311] RRC developments --- src/ue/types.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ue/types.cpp b/src/ue/types.cpp index 303d4dfc1..6108c208e 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -73,7 +73,7 @@ Json ToJson(const EMmSubState &state) switch (state) { case EMmSubState::MM_NULL_NA: - return "MM-NULL-NA"; + return "MM-NULL"; case EMmSubState::MM_DEREGISTERED_NA: return "MM-DEREGISTERED/NA"; case EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE: @@ -93,7 +93,7 @@ Json ToJson(const EMmSubState &state) case EMmSubState::MM_DEREGISTERED_INITIAL_REGISTRATION_NEEDED: return "MM-DEREGISTERED/INITIAL-REGISTRATION-NEEDED"; case EMmSubState::MM_REGISTERED_INITIATED_NA: - return "MM-REGISTER-INITIATED/NA"; + return "MM-REGISTER-INITIATED"; case EMmSubState::MM_REGISTERED_NA: return "MM-REGISTERED/NA"; case EMmSubState::MM_REGISTERED_NORMAL_SERVICE: @@ -111,9 +111,9 @@ Json ToJson(const EMmSubState &state) case EMmSubState::MM_REGISTERED_UPDATE_NEEDED: return "MM-REGISTERED/UPDATE-NEEDED"; case EMmSubState::MM_DEREGISTERED_INITIATED_NA: - return "MM-DEREGISTER-INITIATED/NA"; + return "MM-DEREGISTER-INITIATED"; case EMmSubState::MM_SERVICE_REQUEST_INITIATED_NA: - return "MM-SERVICE-REQUEST-INITIATED/NA"; + return "MM-SERVICE-REQUEST-INITIATED"; default: return "?"; } From 2f54d450de6e0ba5787fcd39265319da00a3fa12 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 15:47:46 +0300 Subject: [PATCH 091/311] RRC developments --- src/ue/nas/mm/interface.cpp | 4 ++++ src/ue/nts.hpp | 1 + src/ue/rrc/cells.cpp | 2 ++ 3 files changed, 7 insertions(+) diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index 4848fad37..4c9003b87 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -46,6 +46,10 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) handlePaging(msg.pagingTmsi); break; } + case NwUeRrcToNas::NAS_NOTIFY: { + triggerMmCycle(); + break; + } } } diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 7bbca4ef2..ca1a4aa63 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -70,6 +70,7 @@ struct NwUeRrcToNas : NtsMessage RADIO_LINK_FAILURE, SERVING_CELL_CHANGE, PAGING, + NAS_NOTIFY, } present; // NAS_DELIVERY diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index a0a9f710e..42ce2e62a 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -71,6 +71,8 @@ void UeRrcTask::updateAvailablePlmns() if (cellDesc.second.sib1.hasSib1) value.insert(cellDesc.second.sib1.plmn); }); + + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::NAS_NOTIFY)); } } // namespace nr::ue From 99173249e443fe6311c764af9d6739269c792eed Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 15:59:17 +0300 Subject: [PATCH 092/311] RRC developments --- src/ue/nas/mm/radio.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index c99293160..220d5dd74 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -23,7 +23,20 @@ void NasMm::performPlmnSelection() { int64_t currentTime = utils::CurrentTimeMillis(); - bool logFailures = currentTime - m_lastTimePlmnSearchFailureLogged >= 10'000; + // If the state is PLMN_SEARCH instead of NO_CELL_AVAILABLE, then we log the errors more intensely. + int64_t loggingThreshold = m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || + m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH + ? 1'000LL + : 10'000LL; + + bool logFailures = currentTime - m_lastTimePlmnSearchFailureLogged >= loggingThreshold; + + // If the device just switched on, then no error logging for PLMN selection failures + if (m_lastTimePlmnSearchFailureLogged == 0) + { + m_lastTimePlmnSearchFailureLogged = currentTime; + logFailures = false; + } Plmn lastSelectedPlmn = m_base->shCtx.selectedPlmn.get(); @@ -44,16 +57,19 @@ void NasMm::performPlmnSelection() return; } + // Determine candidate PLMNs from the list. Candidates are in priority order std::vector candidates; + // Highest priority is for HPLMN, so just look for HPLMN first. for (auto &plmn : plmns) if (plmn == m_base->config->hplmn) candidates.push_back(plmn); + // Then again look for the all PLMNS for (auto &plmn : plmns) { if (plmn == m_base->config->hplmn) - continue; + continue; // If it's the HPLMN, it's already added above if (nas::utils::PlmnListContains(m_usim->m_forbiddenPlmnList, plmn)) continue; if (nas::utils::ServiceAreaListForbidsPlmn(m_usim->m_serviceAreaList, nas::utils::PlmnFrom(plmn))) From 0bcefde10a37549cae83426617099d23c8f12497 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 16 May 2021 16:56:34 +0300 Subject: [PATCH 093/311] RRC developments --- src/utils/locked.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/locked.hpp b/src/utils/locked.hpp index 97d1cd278..7aa762f35 100644 --- a/src/utils/locked.hpp +++ b/src/utils/locked.hpp @@ -33,14 +33,14 @@ class Locked Locked &operator=(Locked &&) = delete; template - inline void access(Func fun) + inline void access(Func&& fun) { // Şimdilik access ve mutate aynı, optimizasyon adına read-write lock kullanılabilir mutate(fun); } template - inline void mutate(Func fun) + inline void mutate(Func&& fun) { std::lock_guard lk(m_mutex); fun(m_value); From 510cbb6335852c04e5234956fb215fc274a16b70 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 00:00:13 +0300 Subject: [PATCH 094/311] RRC developments --- src/ue/rrc/state.cpp | 25 +++++++++++++++++++++++++ src/ue/rrc/task.cpp | 13 +++++++++++++ src/ue/rrc/task.hpp | 3 +++ 3 files changed, 41 insertions(+) create mode 100644 src/ue/rrc/state.cpp diff --git a/src/ue/rrc/state.cpp b/src/ue/rrc/state.cpp new file mode 100644 index 000000000..a060f9803 --- /dev/null +++ b/src/ue/rrc/state.cpp @@ -0,0 +1,25 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" + +#include +#include +#include +#include + +namespace nr::ue +{ + +void UeRrcTask::performCycle() +{ + // TODO +} + + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 3bd291850..2efb67e3c 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -17,6 +17,9 @@ #include #include +static constexpr const int TIMER_ID_MACHINE_CYCLE = 1; +static constexpr const int TIMER_PERIOD_MACHINE_CYCLE = 2500; + namespace nr::ue { @@ -29,6 +32,7 @@ UeRrcTask::UeRrcTask(TaskBase *base) : m_base{base} void UeRrcTask::onStart() { + setTimer(TIMER_ID_MACHINE_CYCLE, TIMER_PERIOD_MACHINE_CYCLE); } void UeRrcTask::onQuit() @@ -69,6 +73,15 @@ void UeRrcTask::onLoop() handleRlsSapMessage(*dynamic_cast(msg)); break; } + case NtsMessageType::TIMER_EXPIRED: { + auto *w = dynamic_cast(msg); + if (w->timerId == TIMER_ID_MACHINE_CYCLE) + { + setTimer(TIMER_ID_MACHINE_CYCLE, TIMER_PERIOD_MACHINE_CYCLE); + performCycle(); + } + break; + } default: m_logger->unhandledNts(msg); break; diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index f8739a80f..1bce44a0c 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -97,6 +97,9 @@ class UeRrcTask : public NtsTask /* RLS Service Access Point */ void handleRlsSapMessage(NwUeRlsToRrc &msg); + /* State Management */ + void performCycle(); + /* Cell Management */ void handleCellSignalChange(int cellId, int dbm); void notifyCellDetected(int cellId, int dbm); From 9dfe831fed39aa12f76379162f9241da760bdf65 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 00:51:52 +0300 Subject: [PATCH 095/311] RRC developments --- src/ue/rrc/idle.cpp | 124 +++++++++++++++++++++++++++++++++++++ src/ue/rrc/state.cpp | 13 +++- src/ue/rrc/task.hpp | 5 ++ src/ue/types.cpp | 5 ++ src/ue/types.hpp | 11 ++++ src/utils/common_types.hpp | 5 +- src/utils/locked.hpp | 17 ++++- 7 files changed, 173 insertions(+), 7 deletions(-) create mode 100644 src/ue/rrc/idle.cpp diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp new file mode 100644 index 000000000..3658ed0b5 --- /dev/null +++ b/src/ue/rrc/idle.cpp @@ -0,0 +1,124 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" + +#include + +#include +#include +#include +#include + +namespace nr::ue +{ + +void UeRrcTask::performCellSelection() +{ + if (m_state == ERrcState::RRC_CONNECTED) + return; + + if (!lookForSuitableCell()) + lookForAcceptableCell(); +} + +bool UeRrcTask::lookForSuitableCell() +{ + Plmn selectedPlmn = m_base->shCtx.selectedPlmn.get(); + if (!selectedPlmn.hasValue()) + return false; + + int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); + + int outOfPlmnCells = 0; + int sib1MissingCells = 0; + int barredCells = 0; + int reservedCells = 0; + + std::vector candidates; + + for (auto &item : m_cellDesc) + { + auto &cell = item.second; + + if (!cell.sib1.hasSib1) + { + sib1MissingCells++; + continue; + } + + if (cell.sib1.plmn != selectedPlmn) + { + outOfPlmnCells++; + continue; + } + + if (cell.mib.hasMib) + { + if (cell.mib.isBarred) + { + barredCells++; + continue; + } + } + + if (cell.sib1.isReserved) + { + reservedCells++; + continue; + } + + // TODO: Check TAI if forbidden by service area or forbidden list + // TODO: Do we need to check by access identity + + // It seems suitable + candidates.push_back(item.first); + } + + if (candidates.empty()) + { + m_logger->err("Cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, [%d] barred", + static_cast(m_cellDesc.size()), outOfPlmnCells, sib1MissingCells, reservedCells, + barredCells); + return false; + } + + // Order candidates by signal strength + std::sort(candidates.begin(), candidates.end(), [this](int a, int b) { + auto &cellA = m_cellDesc[a]; + auto &cellB = m_cellDesc[b]; + return cellB.dbm < cellA.dbm; + }); + + auto &selectedId = candidates[0]; + auto &selectedCell = m_cellDesc[selectedId]; + + CurrentCellInfo cellInfo; + cellInfo.cellId = selectedId; + cellInfo.plmn = selectedCell.sib1.plmn; + cellInfo.tac = selectedCell.sib1.tac; + cellInfo.category = ECellCategory::SUITABLE_CELL; + + m_base->shCtx.currentCell.set(cellInfo); + + if (lastCell != selectedId) + { + m_logger->info("Selected cell id[%d] category[SUITABLE]", selectedId); + // TODO: Notify RLS + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::NAS_NOTIFY)); + } + return true; +} + +bool UeRrcTask::lookForAcceptableCell() +{ + // TODO + return false; +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/state.cpp b/src/ue/rrc/state.cpp index a060f9803..049fa8bec 100644 --- a/src/ue/rrc/state.cpp +++ b/src/ue/rrc/state.cpp @@ -18,8 +18,17 @@ namespace nr::ue void UeRrcTask::performCycle() { - // TODO + if (m_state == ERrcState::RRC_CONNECTED) + { + } + else if (m_state == ERrcState::RRC_IDLE) + { + performCellSelection(); + } + else if (m_state == ERrcState::RRC_INACTIVE) + { + performCellSelection(); + } } - } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 1bce44a0c..a6401f2a3 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -100,6 +100,11 @@ class UeRrcTask : public NtsTask /* State Management */ void performCycle(); + /* Idle Mode Operations */ + void performCellSelection(); + bool lookForSuitableCell(); + bool lookForAcceptableCell(); + /* Cell Management */ void handleCellSignalChange(int cellId, int dbm); void notifyCellDetected(int cellId, int dbm); diff --git a/src/ue/types.cpp b/src/ue/types.cpp index 6108c208e..41b5808a2 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -274,4 +274,9 @@ Json ToJson(const EServiceReqCause &v) } } +bool CurrentCellInfo::hasValue() const +{ + return cellId != 0; +} + } // namespace nr::ue diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 4433edfe1..db28ce376 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -138,10 +138,21 @@ struct UeConfig } }; +struct CurrentCellInfo +{ + int cellId{}; + ECellCategory category{}; + Plmn plmn{}; + int tac{}; + + [[nodiscard]] bool hasValue() const; +}; + struct UeSharedContext { Locked> availablePlmns; Locked selectedPlmn; + Locked currentCell; }; struct TaskBase diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 81cf09d09..836fb2d1b 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -146,11 +146,10 @@ struct GlobalNci enum class ECellCategory { - UNDEFINED, - ACCEPTABLE_CELL, - SUITABLE_CELL, BARRED_CELL, RESERVED_CELL, + ACCEPTABLE_CELL, + SUITABLE_CELL, }; struct UeCellMeasurement diff --git a/src/utils/locked.hpp b/src/utils/locked.hpp index 7aa762f35..f7a341ce8 100644 --- a/src/utils/locked.hpp +++ b/src/utils/locked.hpp @@ -33,14 +33,14 @@ class Locked Locked &operator=(Locked &&) = delete; template - inline void access(Func&& fun) + inline void access(Func &&fun) { // Şimdilik access ve mutate aynı, optimizasyon adına read-write lock kullanılabilir mutate(fun); } template - inline void mutate(Func&& fun) + inline void mutate(Func &&fun) { std::lock_guard lk(m_mutex); fun(m_value); @@ -53,8 +53,21 @@ class Locked return copy; } + template + inline U get(Func &&fun) + { + U copy{}; + access([©, &fun](auto &value) { copy = fun(value); }); + return copy; + } + inline void set(const T &value) { mutate([&value](auto &v) { v = value; }); } + + inline void set(T &&value) + { + mutate([&value](auto &v) { v = std::move(value); }); + } }; \ No newline at end of file From bda839bcc70e3b828ca6725a57427e60e4368f3d Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 01:01:01 +0300 Subject: [PATCH 096/311] RRC developments --- src/ue/nas/mm/radio.cpp | 3 +++ src/ue/nts.hpp | 13 +++++++++ src/ue/rrc/idle.cpp | 2 -- src/ue/rrc/rls_sap.cpp | 32 ---------------------- src/ue/rrc/sap.cpp | 60 +++++++++++++++++++++++++++++++++++++++++ src/ue/rrc/state.cpp | 5 ++++ src/ue/rrc/task.cpp | 31 +++++++++------------ src/ue/rrc/task.hpp | 4 ++- src/utils/nts.hpp | 3 ++- 9 files changed, 99 insertions(+), 54 deletions(-) delete mode 100644 src/ue/rrc/rls_sap.cpp create mode 100644 src/ue/rrc/sap.cpp diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 220d5dd74..9c91510c4 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -89,7 +89,10 @@ void NasMm::performPlmnSelection() } } else if (lastSelectedPlmn != selected) + { m_logger->info("Selected PLMN[%s]", ToJson(selected).str().c_str()); + m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::RRC_NOTIFY)); + } m_base->shCtx.selectedPlmn.set(selected); } diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index ca1a4aa63..f2a1e759d 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -94,6 +94,7 @@ struct NwUeNasToRrc : NtsMessage LOCAL_RELEASE_CONNECTION, INITIAL_NAS_DELIVERY, UPLINK_NAS_DELIVERY, + RRC_NOTIFY, } present; // INITIAL_NAS_DELIVERY @@ -125,6 +126,18 @@ struct NwUeRrcToRls : NtsMessage } }; +struct NwUeRrcToRrc : NtsMessage +{ + enum PR + { + TRIGGER_CYCLE, + } present; + + explicit NwUeRrcToRrc(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_RRC), present(present) + { + } +}; + struct NwUeRlsToRrc : NtsMessage { enum PR diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index 3658ed0b5..88b029e9a 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -10,8 +10,6 @@ #include -#include -#include #include #include diff --git a/src/ue/rrc/rls_sap.cpp b/src/ue/rrc/rls_sap.cpp deleted file mode 100644 index a87c64a55..000000000 --- a/src/ue/rrc/rls_sap.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// -// This file is a part of UERANSIM open source project. -// Copyright (c) 2021 ALİ GÜNGÖR. -// -// The software and all associated files are licensed under GPL-3.0 -// and subject to the terms and conditions defined in LICENSE file. -// - -#include "task.hpp" -#include -#include -#include - -namespace nr::ue -{ - -void UeRrcTask::handleRlsSapMessage(NwUeRlsToRrc &msg) -{ - switch (msg.present) - { - case NwUeRlsToRrc::SIGNAL_CHANGED: { - handleCellSignalChange(msg.cellId, msg.dbm); - break; - } - case NwUeRlsToRrc::DOWNLINK_RRC_DELIVERY: { - handleDownlinkRrc(msg.cellId, msg.channel, msg.pdu); - break; - } - } -} - -} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/sap.cpp b/src/ue/rrc/sap.cpp new file mode 100644 index 000000000..9673e1a0a --- /dev/null +++ b/src/ue/rrc/sap.cpp @@ -0,0 +1,60 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" +#include +#include +#include + +namespace nr::ue +{ + +void UeRrcTask::handleRlsSapMessage(NwUeRlsToRrc &msg) +{ + switch (msg.present) + { + case NwUeRlsToRrc::SIGNAL_CHANGED: { + handleCellSignalChange(msg.cellId, msg.dbm); + break; + } + case NwUeRlsToRrc::DOWNLINK_RRC_DELIVERY: { + handleDownlinkRrc(msg.cellId, msg.channel, msg.pdu); + break; + } + } +} + +void UeRrcTask::handleNasSapMessage(NwUeNasToRrc &msg) +{ + switch (msg.present) + { + case NwUeNasToRrc::INITIAL_NAS_DELIVERY: { + // TODO + // deliverInitialNas(std::move(msg.nasPdu), msg.rrcEstablishmentCause); + break; + } + case NwUeNasToRrc::UPLINK_NAS_DELIVERY: { + // TODO + // deliverUplinkNas(std::move(msg.nasPdu)); + break; + } + case NwUeNasToRrc::LOCAL_RELEASE_CONNECTION: { + // TODO + // m_state = ERrcState::RRC_IDLE; + // m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); + // m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::RESET_STI)); + break; + } + case NwUeNasToRrc::RRC_NOTIFY: { + triggerCycle(); + break; + } + } +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/state.cpp b/src/ue/rrc/state.cpp index 049fa8bec..1ac14f772 100644 --- a/src/ue/rrc/state.cpp +++ b/src/ue/rrc/state.cpp @@ -16,6 +16,11 @@ namespace nr::ue { +void UeRrcTask::triggerCycle() +{ + push(new NwUeRrcToRrc(NwUeRrcToRrc::TRIGGER_CYCLE)); +} + void UeRrcTask::performCycle() { if (m_state == ERrcState::RRC_CONNECTED) diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 2efb67e3c..37e7fc22c 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -32,6 +32,8 @@ UeRrcTask::UeRrcTask(TaskBase *base) : m_base{base} void UeRrcTask::onStart() { + triggerCycle(); + setTimer(TIMER_ID_MACHINE_CYCLE, TIMER_PERIOD_MACHINE_CYCLE); } @@ -49,30 +51,23 @@ void UeRrcTask::onLoop() switch (msg->msgType) { case NtsMessageType::UE_NAS_TO_RRC: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwUeNasToRrc::INITIAL_NAS_DELIVERY: { - deliverInitialNas(std::move(w->nasPdu), w->rrcEstablishmentCause); - break; - } - case NwUeNasToRrc::UPLINK_NAS_DELIVERY: { - deliverUplinkNas(std::move(w->nasPdu)); - break; - } - case NwUeNasToRrc::LOCAL_RELEASE_CONNECTION: { - m_state = ERrcState::RRC_IDLE; - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); - m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::RESET_STI)); - break; - } - } + handleNasSapMessage(*dynamic_cast(msg)); break; } case NtsMessageType::UE_RLS_TO_RRC: { handleRlsSapMessage(*dynamic_cast(msg)); break; } + case NtsMessageType::UE_RRC_TO_RRC: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwUeRrcToRrc::TRIGGER_CYCLE: + performCycle(); + break; + } + break; + } case NtsMessageType::TIMER_EXPIRED: { auto *w = dynamic_cast(msg); if (w->timerId == TIMER_ID_MACHINE_CYCLE) diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index a6401f2a3..0fb3f935e 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -94,10 +94,12 @@ class UeRrcTask : public NtsTask void receiveRrcMessage(int cellId, ASN_RRC_DL_DCCH_Message *msg); void receiveRrcMessage(int cellId, ASN_RRC_PCCH_Message *msg); - /* RLS Service Access Point */ + /* Service Access Point */ void handleRlsSapMessage(NwUeRlsToRrc &msg); + void handleNasSapMessage(NwUeNasToRrc &msg); /* State Management */ + void triggerCycle(); void performCycle(); /* Idle Mode Operations */ diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index b3d29ddf1..bbcf667a6 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -51,7 +51,8 @@ enum class NtsMessageType UE_TUN_TO_APP, UE_RRC_TO_NAS, UE_NAS_TO_RRC, - UE_RRC_TO_RLS, + UE_RRC_TO_RLS, + UE_RRC_TO_RRC, UE_NAS_TO_NAS, UE_RLS_TO_RRC, UE_RLS_TO_APP, From fd30069735d9cc4eb58dd21e492511014d14f82c Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 01:18:52 +0300 Subject: [PATCH 097/311] RRC developments --- src/ue/nts.hpp | 9 +++++--- src/ue/rls/ctl_task.cpp | 2 +- src/ue/rls/task.cpp | 17 ++++++++++++++ src/ue/rrc/idle.cpp | 47 +++++++++++++++++++++++++------------- src/ue/rrc/task.hpp | 4 ++-- src/utils/common_types.cpp | 17 ++++++++++++++ src/utils/common_types.hpp | 1 + src/utils/locked.hpp | 4 ++-- 8 files changed, 77 insertions(+), 24 deletions(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index f2a1e759d..9b04f8732 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -113,10 +113,13 @@ struct NwUeRrcToRls : NtsMessage { enum PR { + ASSIGN_CURRENT_CELL, RRC_PDU_DELIVERY, - RESET_STI, } present; + // ASSIGN_CURRENT_CELL + int cellId{}; + // RRC_PDU_DELIVERY rrc::RrcChannel channel{}; OctetString pdu{}; @@ -251,14 +254,14 @@ struct NwUeRlsToRls : NtsMessage DOWNLINK_RRC, RADIO_LINK_FAILURE, TRANSMISSION_FAILURE, - ASSIGN_SERVING_CELL, + ASSIGN_CURRENT_CELL, } present; // RECEIVE_RLS_MESSAGE // UPLINK_RRC // DOWNLINK_RRC // SIGNAL_CHANGED - // ASSIGN_SERVING_CELL + // ASSIGN_CURRENT_CELL int cellId{}; // RECEIVE_RLS_MESSAGE diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index e333aebf9..a5856b736 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -64,7 +64,7 @@ void RlsControlTask::onLoop() case NwUeRlsToRls::UPLINK_RRC: handleUplinkRrcDelivery(w->cellId, w->pduId, w->rrcChannel, std::move(w->data)); break; - case NwUeRlsToRls::ASSIGN_SERVING_CELL: + case NwUeRlsToRls::ASSIGN_CURRENT_CELL: m_servingCell = w->cellId; break; default: diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 05fc3ebf5..6283ca7a8 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -80,6 +80,23 @@ void UeRlsTask::onLoop() } break; } + case NtsMessageType::UE_RRC_TO_RLS: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwUeRrcToRls::ASSIGN_CURRENT_CELL: { + auto *m = new NwUeRlsToRls(NwUeRlsToRls::ASSIGN_CURRENT_CELL); + m->cellId = w->cellId; + m_ctlTask->push(m); + break; + } + case NwUeRrcToRls::RRC_PDU_DELIVERY: { + break; + } + } + + break; + } default: m_logger->unhandledNts(msg); break; diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index 88b029e9a..4d45ccda0 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -12,6 +12,7 @@ #include #include +#include namespace nr::ue { @@ -21,18 +22,40 @@ void UeRrcTask::performCellSelection() if (m_state == ERrcState::RRC_CONNECTED) return; - if (!lookForSuitableCell()) - lookForAcceptableCell(); + int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); + + CurrentCellInfo cellInfo; + + if (!lookForSuitableCell(cellInfo)) + { + lookForAcceptableCell(cellInfo); + } + + int selectedCell = cellInfo.cellId; + + m_base->shCtx.currentCell.set(cellInfo); + + if (selectedCell != 0 && selectedCell != lastCell) + { + m_logger->info("Selected cell id[%d] category[%s]", selectedCell, ToJson(cellInfo.category).str().c_str()); + } + + if (selectedCell != lastCell) + { + auto *w = new NwUeRrcToRls(NwUeRrcToRls::ASSIGN_CURRENT_CELL); + w->cellId = selectedCell; + m_base->rlsTask->push(w); + + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::NAS_NOTIFY)); + } } -bool UeRrcTask::lookForSuitableCell() +bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo) { Plmn selectedPlmn = m_base->shCtx.selectedPlmn.get(); if (!selectedPlmn.hasValue()) return false; - int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); - int outOfPlmnCells = 0; int sib1MissingCells = 0; int barredCells = 0; @@ -72,7 +95,7 @@ bool UeRrcTask::lookForSuitableCell() } // TODO: Check TAI if forbidden by service area or forbidden list - // TODO: Do we need to check by access identity + // TODO: Do we need to check by access identity? // It seems suitable candidates.push_back(item.first); @@ -96,24 +119,16 @@ bool UeRrcTask::lookForSuitableCell() auto &selectedId = candidates[0]; auto &selectedCell = m_cellDesc[selectedId]; - CurrentCellInfo cellInfo; + cellInfo = {}; cellInfo.cellId = selectedId; cellInfo.plmn = selectedCell.sib1.plmn; cellInfo.tac = selectedCell.sib1.tac; cellInfo.category = ECellCategory::SUITABLE_CELL; - m_base->shCtx.currentCell.set(cellInfo); - - if (lastCell != selectedId) - { - m_logger->info("Selected cell id[%d] category[SUITABLE]", selectedId); - // TODO: Notify RLS - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::NAS_NOTIFY)); - } return true; } -bool UeRrcTask::lookForAcceptableCell() +bool UeRrcTask::lookForAcceptableCell(CurrentCellInfo &cellInfo) { // TODO return false; diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 0fb3f935e..517e0ed13 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -104,8 +104,8 @@ class UeRrcTask : public NtsTask /* Idle Mode Operations */ void performCellSelection(); - bool lookForSuitableCell(); - bool lookForAcceptableCell(); + bool lookForSuitableCell(CurrentCellInfo &cellInfo); + bool lookForAcceptableCell(CurrentCellInfo &cellInfo); /* Cell Management */ void handleCellSignalChange(int cellId, int dbm); diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index c88a00bef..253e0cdbc 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -76,6 +76,23 @@ Json ToJson(const EDeregCause &v) } } +Json ToJson(const ECellCategory &v) +{ + switch (v) + { + case ECellCategory::BARRED_CELL: + return "BARRED"; + case ECellCategory::RESERVED_CELL: + return "RESERVED"; + case ECellCategory::ACCEPTABLE_CELL: + return "ACCEPTABLE"; + case ECellCategory::SUITABLE_CELL: + return "SUITABLE"; + default: + return "?"; + } +} + bool operator==(const SingleSlice &lhs, const SingleSlice &rhs) { if ((int)lhs.sst != (int)rhs.sst) diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 836fb2d1b..599f78c0c 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -207,6 +207,7 @@ Json ToJson(const SingleSlice &v); Json ToJson(const NetworkSlice &v); Json ToJson(const PlmnSupport &v); Json ToJson(const EDeregCause &v); +Json ToJson(const ECellCategory &v); namespace std { diff --git a/src/utils/locked.hpp b/src/utils/locked.hpp index f7a341ce8..862cb7268 100644 --- a/src/utils/locked.hpp +++ b/src/utils/locked.hpp @@ -49,7 +49,7 @@ class Locked inline T get() { T copy{}; - access([©](auto &value) { copy = value; }); + access([©](const auto &value) { copy = value; }); return copy; } @@ -57,7 +57,7 @@ class Locked inline U get(Func &&fun) { U copy{}; - access([©, &fun](auto &value) { copy = fun(value); }); + access([©, &fun](const auto &value) { copy = fun(value); }); return copy; } From a7c632b83291f790c021dad5f5ec7305b497536e Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 01:32:58 +0300 Subject: [PATCH 098/311] RRC developments --- src/ue/rrc/idle.cpp | 115 +++++++++++++++++++++++++++++++++++--------- src/ue/rrc/task.hpp | 4 +- src/ue/types.hpp | 8 +++ 3 files changed, 102 insertions(+), 25 deletions(-) diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index 4d45ccda0..6d32e42bf 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -25,20 +25,31 @@ void UeRrcTask::performCellSelection() int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); CurrentCellInfo cellInfo; + CellSelectionReport report; - if (!lookForSuitableCell(cellInfo)) + if (!lookForSuitableCell(cellInfo, report)) { - lookForAcceptableCell(cellInfo); + m_logger->warn( + "Suitable cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, [%d] barred", + static_cast(m_cellDesc.size()), report.outOfPlmnCells, report.sib1MissingCells, report.reservedCells, + report.barredCells); + + report = {}; + + if (!lookForAcceptableCell(cellInfo, report)) + { + m_logger->warn("Acceptable cell selection failed in [%d] cells. [%d] no SI, [%d] reserved, [%d] barred", + static_cast(m_cellDesc.size()), report.sib1MissingCells, report.reservedCells, + report.barredCells); + m_logger->err("Cell selection failure, no suitable or acceptable cell found"); + } } int selectedCell = cellInfo.cellId; - m_base->shCtx.currentCell.set(cellInfo); if (selectedCell != 0 && selectedCell != lastCell) - { m_logger->info("Selected cell id[%d] category[%s]", selectedCell, ToJson(cellInfo.category).str().c_str()); - } if (selectedCell != lastCell) { @@ -50,17 +61,12 @@ void UeRrcTask::performCellSelection() } } -bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo) +bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo, CellSelectionReport &report) { Plmn selectedPlmn = m_base->shCtx.selectedPlmn.get(); if (!selectedPlmn.hasValue()) return false; - int outOfPlmnCells = 0; - int sib1MissingCells = 0; - int barredCells = 0; - int reservedCells = 0; - std::vector candidates; for (auto &item : m_cellDesc) @@ -69,13 +75,13 @@ bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo) if (!cell.sib1.hasSib1) { - sib1MissingCells++; + report.sib1MissingCells++; continue; } if (cell.sib1.plmn != selectedPlmn) { - outOfPlmnCells++; + report.outOfPlmnCells++; continue; } @@ -83,14 +89,14 @@ bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo) { if (cell.mib.isBarred) { - barredCells++; + report.barredCells++; continue; } } if (cell.sib1.isReserved) { - reservedCells++; + report.reservedCells++; continue; } @@ -102,12 +108,7 @@ bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo) } if (candidates.empty()) - { - m_logger->err("Cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, [%d] barred", - static_cast(m_cellDesc.size()), outOfPlmnCells, sib1MissingCells, reservedCells, - barredCells); return false; - } // Order candidates by signal strength std::sort(candidates.begin(), candidates.end(), [this](int a, int b) { @@ -128,10 +129,78 @@ bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo) return true; } -bool UeRrcTask::lookForAcceptableCell(CurrentCellInfo &cellInfo) +bool UeRrcTask::lookForAcceptableCell(CurrentCellInfo &cellInfo, CellSelectionReport &report) { - // TODO - return false; + std::vector candidates; + + for (auto &item : m_cellDesc) + { + auto &cell = item.second; + + if (!cell.sib1.hasSib1) + { + report.sib1MissingCells++; + continue; + } + + if (cell.mib.hasMib) + { + if (cell.mib.isBarred) + { + report.barredCells++; + continue; + } + } + + if (cell.sib1.isReserved) + { + report.reservedCells++; + continue; + } + + // TODO: Check TAI if forbidden by service area or forbidden list + // TODO: Do we need to check by access identity? + + // It seems acceptable + candidates.push_back(item.first); + } + + if (candidates.empty()) + return false; + + // Order candidates by signal strength first + std::sort(candidates.begin(), candidates.end(), [this](int a, int b) { + auto &cellA = m_cellDesc[a]; + auto &cellB = m_cellDesc[b]; + return cellB.dbm < cellA.dbm; + }); + + // Then order candidates by PLMN priority if we have a selected PLMN + Plmn selectedPlmn = m_base->shCtx.selectedPlmn.get(); + if (selectedPlmn.hasValue()) + { + // Using stable-sort here + std::stable_sort(candidates.begin(), candidates.end(), [this, &selectedPlmn](int a, int b) { + auto &cellA = m_cellDesc[a]; + auto &cellB = m_cellDesc[b]; + + bool matchesA = cellA.sib1.hasSib1 && cellA.sib1.plmn == selectedPlmn; + bool matchesB = cellB.sib1.hasSib1 && cellB.sib1.plmn == selectedPlmn; + + return matchesB < matchesA; + }); + } + + auto &selectedId = candidates[0]; + auto &selectedCell = m_cellDesc[selectedId]; + + cellInfo = {}; + cellInfo.cellId = selectedId; + cellInfo.plmn = selectedCell.sib1.plmn; + cellInfo.tac = selectedCell.sib1.tac; + cellInfo.category = ECellCategory::ACCEPTABLE_CELL; + + return true; } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 517e0ed13..5ac940bae 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -104,8 +104,8 @@ class UeRrcTask : public NtsTask /* Idle Mode Operations */ void performCellSelection(); - bool lookForSuitableCell(CurrentCellInfo &cellInfo); - bool lookForAcceptableCell(CurrentCellInfo &cellInfo); + bool lookForSuitableCell(CurrentCellInfo &cellInfo, CellSelectionReport &report); + bool lookForAcceptableCell(CurrentCellInfo &cellInfo, CellSelectionReport &report); /* Cell Management */ void handleCellSignalChange(int cellId, int dbm); diff --git a/src/ue/types.hpp b/src/ue/types.hpp index db28ce376..11126e531 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -138,6 +138,14 @@ struct UeConfig } }; +struct CellSelectionReport +{ + int outOfPlmnCells{}; + int sib1MissingCells{}; + int reservedCells{}; + int barredCells{}; +}; + struct CurrentCellInfo { int cellId{}; From ff47264a87ae5859bc83fe177c7970d07d498104 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 01:38:02 +0300 Subject: [PATCH 099/311] RRC developments --- src/ue/rrc/idle.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index 6d32e42bf..cf310a190 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -29,18 +29,33 @@ void UeRrcTask::performCellSelection() if (!lookForSuitableCell(cellInfo, report)) { - m_logger->warn( - "Suitable cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, [%d] barred", - static_cast(m_cellDesc.size()), report.outOfPlmnCells, report.sib1MissingCells, report.reservedCells, - report.barredCells); + if (!m_cellDesc.empty()) + { + m_logger->warn("Suitable cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, " + "[%d] barred", + static_cast(m_cellDesc.size()), report.outOfPlmnCells, report.sib1MissingCells, + report.reservedCells, report.barredCells); + } + else + { + m_logger->warn("Suitable cell selection failed, no cell is in coverage"); + } report = {}; if (!lookForAcceptableCell(cellInfo, report)) { - m_logger->warn("Acceptable cell selection failed in [%d] cells. [%d] no SI, [%d] reserved, [%d] barred", - static_cast(m_cellDesc.size()), report.sib1MissingCells, report.reservedCells, - report.barredCells); + if (!m_cellDesc.empty()) + { + m_logger->warn("Acceptable cell selection failed in [%d] cells. [%d] no SI, [%d] reserved, [%d] barred", + static_cast(m_cellDesc.size()), report.sib1MissingCells, report.reservedCells, + report.barredCells); + } + else + { + m_logger->warn("Acceptable cell selection failed, no cell is in coverage"); + } + m_logger->err("Cell selection failure, no suitable or acceptable cell found"); } } From 32b69e8df303defe307cbcfb441bfae364e5fc40 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 01:54:05 +0300 Subject: [PATCH 100/311] RRC developments --- src/ue/nas/mm/radio.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 9c91510c4..94d66aeb1 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -95,6 +95,36 @@ void NasMm::performPlmnSelection() } m_base->shCtx.selectedPlmn.set(selected); + + // Check if the RRC selected some cell + bool cellSelected{}; + ECellCategory cellCategory{}; + + m_base->shCtx.currentCell.access([&cellSelected, &cellCategory](auto &value) { + if (value.cellId != 0) + { + cellSelected = true; + cellCategory = value.category; + } + }); + + if (cellSelected) + { + if (cellCategory == ECellCategory::SUITABLE_CELL) + { + if (m_mmState == EMmState::MM_REGISTERED) + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + else + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + } + else + { + if (m_mmState == EMmState::MM_REGISTERED) + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + else + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + } + } } void NasMm::handleServingCellChange(const UeCellInfo &servingCell) From 3ad54047267e46786bcfda416c6d368e0536ce4a Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 01:58:59 +0300 Subject: [PATCH 101/311] RRC developments --- src/ue/rrc/task.hpp | 6 +++--- src/utils/locked.hpp | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 5ac940bae..d0d8daaff 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -90,9 +90,9 @@ class UeRrcTask : public NtsTask void sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg); void receiveRrcMessage(int cellId, ASN_RRC_BCCH_BCH_Message *msg); void receiveRrcMessage(int cellId, ASN_RRC_BCCH_DL_SCH_Message *msg); - void receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg); - void receiveRrcMessage(int cellId, ASN_RRC_DL_DCCH_Message *msg); - void receiveRrcMessage(int cellId, ASN_RRC_PCCH_Message *msg); + void receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg); // TODO + void receiveRrcMessage(int cellId, ASN_RRC_DL_DCCH_Message *msg); // .. + void receiveRrcMessage(int cellId, ASN_RRC_PCCH_Message *msg); // Broadcast vs için camped olmayanları ignore /* Service Access Point */ void handleRlsSapMessage(NwUeRlsToRrc &msg); diff --git a/src/utils/locked.hpp b/src/utils/locked.hpp index 862cb7268..b3bc93bd4 100644 --- a/src/utils/locked.hpp +++ b/src/utils/locked.hpp @@ -36,12 +36,16 @@ class Locked inline void access(Func &&fun) { // Şimdilik access ve mutate aynı, optimizasyon adına read-write lock kullanılabilir - mutate(fun); + + std::lock_guard lk(m_mutex); + fun((const T &)m_value); } template inline void mutate(Func &&fun) { + // Şimdilik access ve mutate aynı, optimizasyon adına read-write lock kullanılabilir + std::lock_guard lk(m_mutex); fun(m_value); } From c8b02d5a2b10e813bbddd9a941fa90cb9aef471d Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 08:09:46 +0300 Subject: [PATCH 102/311] RRC developments --- src/lib/nas/storage.cpp | 14 ++++++++++++++ src/lib/nas/storage.hpp | 12 ++++++++++++ src/ue/nas/mm/dereg.cpp | 4 ++++ src/ue/nas/mm/mm.hpp | 2 ++ 4 files changed, 32 insertions(+) create mode 100644 src/lib/nas/storage.cpp create mode 100644 src/lib/nas/storage.hpp diff --git a/src/lib/nas/storage.cpp b/src/lib/nas/storage.cpp new file mode 100644 index 000000000..6712838d6 --- /dev/null +++ b/src/lib/nas/storage.cpp @@ -0,0 +1,14 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "storage.hpp" + +namespace nas +{ + +} \ No newline at end of file diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp new file mode 100644 index 000000000..322b1bf5f --- /dev/null +++ b/src/lib/nas/storage.hpp @@ -0,0 +1,12 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +namespace nas +{ + +} \ No newline at end of file diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 81b5aa599..d71e23e8b 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -65,9 +65,13 @@ void NasMm::sendDeregistration(EDeregCause deregCause) // TODO: Bu ikisinin burada olması gerektiğinden emin değilim if (deregCause == EDeregCause::SWITCH_OFF) + { + onSwitchOff(); m_base->appTask->push(new NwUeNasToApp(NwUeNasToApp::PERFORM_SWITCH_OFF)); + } else if (deregCause == EDeregCause::USIM_REMOVAL) { + onSimRemoval(); m_logger->info("SIM card has been invalidated"); m_usim->invalidate(); } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 276b11e9b..b20923226 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -82,6 +82,8 @@ class NasMm void onSwitchRmState(ERmState oldState, ERmState newState); void onSwitchCmState(ECmState oldState, ECmState newState); void onSwitchUState(E5UState oldState, E5UState newState); + void onSimRemoval(); + void onSwitchOff(); private: /* Messaging */ void sendNasMessage(const nas::PlainMmMessage &msg); From 1a4531c10802f188708788349a799f39b67b4281 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 08:10:32 +0300 Subject: [PATCH 103/311] RRC developments --- src/ue/nas/mm/base.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index edee351c5..e7498a0d5 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -322,4 +322,12 @@ void NasMm::onSwitchUState(E5UState oldState, E5UState newState) { } +void NasMm::onSimRemoval() +{ +} + +void NasMm::onSwitchOff() +{ +} + } // namespace nr::ue From 03d6cc66cf7e4bd1ad46bee33a34a8afdfa81c59 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 08:45:36 +0300 Subject: [PATCH 104/311] RRC developments --- src/lib/nas/storage.hpp | 128 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 1 deletion(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 322b1bf5f..035ed6528 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -6,7 +6,133 @@ // and subject to the terms and conditions defined in LICENSE file. // +#include +#include + +#include + namespace nas { -} \ No newline at end of file +/* + * - Items are unique, if already exists, deletes the previous one + * - List have fixed size, if capacity is full, oldest item is deleted + * - Automatically cleared after specified period + */ +template +class NasListT1 +{ + private: + const size_t m_sizeLimit; + const int64_t m_autoClearingPeriod; + + std::vector m_data; + size_t m_size; + int64_t m_lastAutoCleared; + + public: + NasListT1(size_t sizeLimit, int64_t autoClearingPeriod) + : m_sizeLimit{sizeLimit}, m_autoClearingPeriod{autoClearingPeriod}, m_data{sizeLimit}, m_size{}, + m_lastAutoCleared{utils::CurrentTimeMillis()} + { + } + + public: + void add(const T &item) + { + autoClearIfNecessary(); + remove(item); + makeSlotForNewItem(); + + m_data[m_size] = item; + m_size++; + } + + void add(T &&item) + { + autoClearIfNecessary(); + remove(item); + makeSlotForNewItem(); + + m_data[m_size] = std::move(item); + m_size++; + } + + bool contains(const T &item) + { + autoClearIfNecessary(); + + for (size_t i = 0; i < m_size; i++) + if (m_data[i] == item) + return true; + return false; + } + + void remove(const T &item) + { + autoClearIfNecessary(); + + size_t index = ~0u; + for (size_t i = 0; i < m_size; i++) + { + if (m_data[i] == item) + { + index = i; + break; + } + } + + if (index != ~0u) + removeAt(index); + } + + template + void forEach(Functor &&fun) + { + autoClearIfNecessary(); + + for (size_t i = 0; i < m_size; i++) + fun(m_data[i]); + } + + void clear() + { + autoClearIfNecessary(); + + m_data.clear(); + m_size = 0; + } + + [[nodiscard]] size_t size() const + { + autoClearIfNecessary(); + + return m_data.size(); + } + + private: + void autoClearIfNecessary() + { + int64_t currentTime = utils::CurrentTimeMillis(); + if (currentTime - m_lastAutoCleared >= m_autoClearingPeriod) + { + m_lastAutoCleared = currentTime; + clear(); + } + } + + void makeSlotForNewItem() + { + if (m_size >= m_sizeLimit) + removeAt(0); + } + + void removeAt(size_t index) + { + for (size_t i = index; i < m_size; ++i) + m_data[i] = i + 1 < m_sizeLimit ? m_data[i + 1] : T{}; + m_size--; + } +}; + +} // namespace nas From 8078dd5fb026a3b0a8858f93671b6508fc28d8e4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 08:55:52 +0300 Subject: [PATCH 105/311] RRC developments --- src/ue/nas/storage.cpp | 24 ++++++++++++++++++++++++ src/ue/nas/storage.hpp | 25 +++++++++++++++++++++++++ src/utils/common_types.cpp | 20 ++++++++++++++++++++ src/utils/common_types.hpp | 15 ++++++++++++++- 4 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/ue/nas/storage.cpp create mode 100644 src/ue/nas/storage.hpp diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp new file mode 100644 index 000000000..7e908215d --- /dev/null +++ b/src/ue/nas/storage.cpp @@ -0,0 +1,24 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "storage.hpp" + +static constexpr const size_t FORBIDDEN_TAI_LIST_SIZE = 40; +static constexpr const int64_t FORBIDDEN_TAI_CLEAR_PERIOD = 1000ll * 60ll * 60ll * 12ll; + +namespace nr::ue +{ + +MmStorage::MmStorage() + : m_forbiddenTaiListRoaming{FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD}, m_forbiddenTaiListRps{ + FORBIDDEN_TAI_LIST_SIZE, + FORBIDDEN_TAI_CLEAR_PERIOD} +{ +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp new file mode 100644 index 000000000..e9332bfb0 --- /dev/null +++ b/src/ue/nas/storage.hpp @@ -0,0 +1,25 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include +#include + +namespace nr::ue +{ + +class MmStorage +{ + public: + nas::NasListT1 m_forbiddenTaiListRoaming; + nas::NasListT1 m_forbiddenTaiListRps; + + public: + MmStorage(); +}; + +} // namespace nr::ue diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 253e0cdbc..4ac6af16d 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -104,6 +104,11 @@ bool operator==(const SingleSlice &lhs, const SingleSlice &rhs) return ((int)*lhs.sd) == ((int)*rhs.sd); } +bool operator!=(const SingleSlice &lhs, const SingleSlice &rhs) +{ + return !(lhs == rhs); +} + bool operator==(const Plmn &lhs, const Plmn &rhs) { if (lhs.mcc != rhs.mcc) @@ -123,6 +128,21 @@ bool operator==(const GlobalNci &lhs, const GlobalNci &rhs) return lhs.plmn == rhs.plmn && lhs.nci == rhs.nci; } +bool operator!=(const GlobalNci &lhs, const GlobalNci &rhs) +{ + return !(lhs == rhs); +} + +bool operator==(const Tai &lhs, const Tai &rhs) +{ + return lhs.plmn == rhs.plmn && lhs.tac == rhs.tac; +} + +bool operator!=(const Tai &lhs, const Tai &rhs) +{ + return !(lhs == rhs); +} + void NetworkSlice::addIfNotExists(const SingleSlice &slice) { if (!std::any_of(slices.begin(), slices.end(), [&slice](auto &s) { return s == slice; })) diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 599f78c0c..1f4fe0819 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -34,6 +34,12 @@ struct Plmn [[nodiscard]] bool hasValue() const; }; +struct Tai +{ + Plmn plmn; + int tac{}; +}; + struct SingleSlice { octet sst{}; @@ -196,10 +202,17 @@ struct UacAiBarringSet bool ai15 = false; }; -bool operator==(const SingleSlice &lhs, const SingleSlice &rhs); bool operator==(const Plmn &lhs, const Plmn &rhs); bool operator!=(const Plmn &lhs, const Plmn &rhs); + +bool operator==(const Tai &lhs, const Tai &rhs); +bool operator!=(const Tai &lhs, const Tai &rhs); + +bool operator==(const SingleSlice &lhs, const SingleSlice &rhs); +bool operator!=(const SingleSlice &lhs, const SingleSlice &rhs); + bool operator==(const GlobalNci &lhs, const GlobalNci &rhs); +bool operator!=(const GlobalNci &lhs, const GlobalNci &rhs); Json ToJson(const Supi &v); Json ToJson(const Plmn &v); From b0ff6730f1a54c2a161aab3f5ce1b5f9563f9b5c Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 08:59:38 +0300 Subject: [PATCH 106/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 4 ++-- src/ue/nas/mm/base.cpp | 2 +- src/ue/nas/mm/mm.hpp | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 035ed6528..4d27b1744 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -33,7 +33,7 @@ class NasListT1 public: NasListT1(size_t sizeLimit, int64_t autoClearingPeriod) : m_sizeLimit{sizeLimit}, m_autoClearingPeriod{autoClearingPeriod}, m_data{sizeLimit}, m_size{}, - m_lastAutoCleared{utils::CurrentTimeMillis()} + m_lastAutoCleared{::utils::CurrentTimeMillis()} { } @@ -113,7 +113,7 @@ class NasListT1 private: void autoClearIfNecessary() { - int64_t currentTime = utils::CurrentTimeMillis(); + int64_t currentTime = ::utils::CurrentTimeMillis(); if (currentTime - m_lastAutoCleared >= m_autoClearingPeriod) { m_lastAutoCleared = currentTime; diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index e7498a0d5..410ef92df 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -18,7 +18,7 @@ namespace nr::ue { -NasMm::NasMm(TaskBase *base, UeTimers *timers) : m_base{base}, m_timers{timers}, m_sm{nullptr} +NasMm::NasMm(TaskBase *base, UeTimers *timers) : m_base{base}, m_timers{timers}, m_sm{}, m_usim{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "nas"); diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index b20923226..d8fc26013 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -29,7 +30,8 @@ class NasMm UeTimers *m_timers; std::unique_ptr m_logger; NasSm *m_sm; - Usim *m_usim{}; + Usim *m_usim; + MmStorage m_storage; ERmState m_rmState; ECmState m_cmState; From db31bdadee68b6d0834fb44fa5c209112246bed6 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 09:11:21 +0300 Subject: [PATCH 107/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 42 ++++++++++++++++++++++++++++++++++++-- src/ue/nas/mm/dereg.cpp | 8 +++++++- src/ue/nas/mm/register.cpp | 16 +++++++++++++-- src/ue/nas/mm/service.cpp | 17 +++++++++++++-- src/ue/nas/usim/usim.hpp | 2 -- 5 files changed, 76 insertions(+), 9 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 4d27b1744..2ae90f6f0 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -18,6 +18,7 @@ namespace nas * - Items are unique, if already exists, deletes the previous one * - List have fixed size, if capacity is full, oldest item is deleted * - Automatically cleared after specified period + * - Can be asked if it has a changes after the last one */ template class NasListT1 @@ -29,17 +30,20 @@ class NasListT1 std::vector m_data; size_t m_size; int64_t m_lastAutoCleared; + int64_t m_lastChange; + int64_t m_lastChangeQueried; public: NasListT1(size_t sizeLimit, int64_t autoClearingPeriod) : m_sizeLimit{sizeLimit}, m_autoClearingPeriod{autoClearingPeriod}, m_data{sizeLimit}, m_size{}, - m_lastAutoCleared{::utils::CurrentTimeMillis()} + m_lastAutoCleared{::utils::CurrentTimeMillis()}, m_lastChange{}, m_lastChangeQueried{} { } public: void add(const T &item) { + touch(); autoClearIfNecessary(); remove(item); makeSlotForNewItem(); @@ -50,6 +54,7 @@ class NasListT1 void add(T &&item) { + touch(); autoClearIfNecessary(); remove(item); makeSlotForNewItem(); @@ -70,6 +75,7 @@ class NasListT1 void remove(const T &item) { + touch(); autoClearIfNecessary(); size_t index = ~0u; @@ -91,13 +97,28 @@ class NasListT1 { autoClearIfNecessary(); + for (size_t i = 0; i < m_size; i++) + fun((const T &)m_data[i]); + } + + template + void mutateForEach(Functor &&fun) + { + touch(); + + autoClearIfNecessary(); + for (size_t i = 0; i < m_size; i++) fun(m_data[i]); } void clear() { - autoClearIfNecessary(); + touch(); + + int64_t currentTime = ::utils::CurrentTimeMillis(); + if (currentTime - m_lastAutoCleared >= m_autoClearingPeriod) + m_lastAutoCleared = currentTime; m_data.clear(); m_size = 0; @@ -110,6 +131,16 @@ class NasListT1 return m_data.size(); } + bool hasChange() + { + if (m_lastChangeQueried == 0 || m_lastChangeQueried != m_lastChange) + { + m_lastChangeQueried = m_lastChange; + return true; + } + return false; + } + private: void autoClearIfNecessary() { @@ -129,10 +160,17 @@ class NasListT1 void removeAt(size_t index) { + touch(); + for (size_t i = index; i < m_size; ++i) m_data[i] = i + 1 < m_sizeLimit ? m_data[i + 1] : T{}; m_size--; } + + void touch() + { + m_lastChange = utils::CurrentTimeMillis(); + } }; } // namespace nas diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index d71e23e8b..0c3ab4ccf 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -247,7 +247,13 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi if (cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRoaming, *m_usim->m_currentTai); + Tai tai; + tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; + tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; + tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; + tai.tac = (int)m_usim->m_currentTai->tac; + + m_storage.m_forbiddenTaiListRoaming.add(tai); } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 443723fda..a0dae43e9 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -563,7 +563,13 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRoaming, *m_usim->m_currentTai); + Tai tai; + tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; + tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; + tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; + tai.tac = (int)m_usim->m_currentTai->tac; + + m_storage.m_forbiddenTaiListRoaming.add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) @@ -721,7 +727,13 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRoaming, *m_usim->m_currentTai); + Tai tai; + tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; + tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; + tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; + tai.tac = (int)m_usim->m_currentTai->tac; + + m_storage.m_forbiddenTaiListRoaming.add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 2774dce3e..830a9f720 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -310,12 +310,25 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::TA_NOT_ALLOWED) { - nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRps, *m_usim->m_currentTai); + Tai tai; + tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; + tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; + tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; + tai.tac = (int)m_usim->m_currentTai->tac; + + m_storage.m_forbiddenTaiListRps.add(tai); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRoaming, *m_usim->m_currentTai); + Tai tai; + tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; + tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; + tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; + tai.tac = (int)m_usim->m_currentTai->tac; + + m_storage.m_forbiddenTaiListRoaming.add(tai); + nas::utils::RemoveFromTaiList(m_usim->m_taiList, *m_usim->m_currentTai); } diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 9d1987e05..ffec2b06d 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -40,8 +40,6 @@ class Usim std::optional m_currentTai{}; std::optional m_lastVisitedRegisteredTai{}; nas::IE5gsTrackingAreaIdentityList m_taiList{}; - nas::IE5gsTrackingAreaIdentityList m_forbiddenTaiListRoaming{}; // 5GS forbidden TAs for roaming - nas::IE5gsTrackingAreaIdentityList m_forbiddenTaiListRps{}; // 5GS forbidden TAs for regional provision of service nas::IEPlmnList m_equivalentPlmnList{}; nas::IEPlmnList m_forbiddenPlmnList{}; nas::IEServiceAreaList m_serviceAreaList{}; From 0d8eed32e4e9deef769c3772487075e1b082c889 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 09:24:19 +0300 Subject: [PATCH 108/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 2ae90f6f0..8976c5624 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -43,39 +43,30 @@ class NasListT1 public: void add(const T &item) { - touch(); autoClearIfNecessary(); remove(item); makeSlotForNewItem(); m_data[m_size] = item; m_size++; + + touch(); } void add(T &&item) { - touch(); autoClearIfNecessary(); remove(item); makeSlotForNewItem(); m_data[m_size] = std::move(item); m_size++; - } - - bool contains(const T &item) - { - autoClearIfNecessary(); - for (size_t i = 0; i < m_size; i++) - if (m_data[i] == item) - return true; - return false; + touch(); } void remove(const T &item) { - touch(); autoClearIfNecessary(); size_t index = ~0u; @@ -92,6 +83,16 @@ class NasListT1 removeAt(index); } + bool contains(const T &item) + { + autoClearIfNecessary(); + + for (size_t i = 0; i < m_size; i++) + if (m_data[i] == item) + return true; + return false; + } + template void forEach(Functor &&fun) { @@ -104,24 +105,24 @@ class NasListT1 template void mutateForEach(Functor &&fun) { - touch(); - autoClearIfNecessary(); for (size_t i = 0; i < m_size; i++) fun(m_data[i]); + + touch(); } void clear() { - touch(); - int64_t currentTime = ::utils::CurrentTimeMillis(); if (currentTime - m_lastAutoCleared >= m_autoClearingPeriod) m_lastAutoCleared = currentTime; m_data.clear(); m_size = 0; + + touch(); } [[nodiscard]] size_t size() const From 7b3fbc851626e288d8891289d4b6eb7ae9ae0e37 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 09:24:58 +0300 Subject: [PATCH 109/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 8976c5624..7c4372c45 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -18,7 +18,6 @@ namespace nas * - Items are unique, if already exists, deletes the previous one * - List have fixed size, if capacity is full, oldest item is deleted * - Automatically cleared after specified period - * - Can be asked if it has a changes after the last one */ template class NasListT1 @@ -30,13 +29,11 @@ class NasListT1 std::vector m_data; size_t m_size; int64_t m_lastAutoCleared; - int64_t m_lastChange; - int64_t m_lastChangeQueried; public: NasListT1(size_t sizeLimit, int64_t autoClearingPeriod) : m_sizeLimit{sizeLimit}, m_autoClearingPeriod{autoClearingPeriod}, m_data{sizeLimit}, m_size{}, - m_lastAutoCleared{::utils::CurrentTimeMillis()}, m_lastChange{}, m_lastChangeQueried{} + m_lastAutoCleared{::utils::CurrentTimeMillis()} { } @@ -132,16 +129,6 @@ class NasListT1 return m_data.size(); } - bool hasChange() - { - if (m_lastChangeQueried == 0 || m_lastChangeQueried != m_lastChange) - { - m_lastChangeQueried = m_lastChange; - return true; - } - return false; - } - private: void autoClearIfNecessary() { @@ -170,7 +157,6 @@ class NasListT1 void touch() { - m_lastChange = utils::CurrentTimeMillis(); } }; From 3c6590c5bab2125363e5566c22a8a205a6c5d199 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 09:26:04 +0300 Subject: [PATCH 110/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 7c4372c45..ed4bacd7f 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -18,6 +18,7 @@ namespace nas * - Items are unique, if already exists, deletes the previous one * - List have fixed size, if capacity is full, oldest item is deleted * - Automatically cleared after specified period + * - The list is NOT thread safe */ template class NasListT1 From 55e8b4a13b2604357b86c5a6c5bf4ac98a283743 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 09:34:55 +0300 Subject: [PATCH 111/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 10 +++++++++- src/ue/nas/mm/dereg.cpp | 2 +- src/ue/nas/mm/register.cpp | 4 ++-- src/ue/nas/mm/service.cpp | 4 ++-- src/ue/nas/storage.cpp | 7 ++++--- src/ue/nas/storage.hpp | 4 ++-- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index ed4bacd7f..259c5bcca 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -7,6 +7,8 @@ // #include +#include +#include #include #include @@ -23,16 +25,20 @@ namespace nas template class NasListT1 { + public: + using backup_functor_type = std::function &buffer, size_t size)>; + private: const size_t m_sizeLimit; const int64_t m_autoClearingPeriod; + const std::optional m_backupFunctor; std::vector m_data; size_t m_size; int64_t m_lastAutoCleared; public: - NasListT1(size_t sizeLimit, int64_t autoClearingPeriod) + NasListT1(size_t sizeLimit, int64_t autoClearingPeriod, std::optional backupFunctor) : m_sizeLimit{sizeLimit}, m_autoClearingPeriod{autoClearingPeriod}, m_data{sizeLimit}, m_size{}, m_lastAutoCleared{::utils::CurrentTimeMillis()} { @@ -158,6 +164,8 @@ class NasListT1 void touch() { + if (m_backupFunctor) + (*m_backupFunctor)(m_data, m_size); } }; diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 0c3ab4ccf..5a4a29116 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -253,7 +253,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRoaming.add(tai); + m_storage.m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index a0dae43e9..5bcbba2bf 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -569,7 +569,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRoaming.add(tai); + m_storage.m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) @@ -733,7 +733,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRoaming.add(tai); + m_storage.m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 830a9f720..71ec16ba9 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -316,7 +316,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRps.add(tai); + m_storage.m_forbiddenTaiListRps->add(tai); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) @@ -327,7 +327,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRoaming.add(tai); + m_storage.m_forbiddenTaiListRoaming->add(tai); nas::utils::RemoveFromTaiList(m_usim->m_taiList, *m_usim->m_currentTai); } diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 7e908215d..9e126000b 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -15,10 +15,11 @@ namespace nr::ue { MmStorage::MmStorage() - : m_forbiddenTaiListRoaming{FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD}, m_forbiddenTaiListRps{ - FORBIDDEN_TAI_LIST_SIZE, - FORBIDDEN_TAI_CLEAR_PERIOD} { + m_forbiddenTaiListRoaming = + std::make_unique>(FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, std::nullopt); + m_forbiddenTaiListRps = + std::make_unique>(FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, std::nullopt); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index e9332bfb0..9a0fff296 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -15,8 +15,8 @@ namespace nr::ue class MmStorage { public: - nas::NasListT1 m_forbiddenTaiListRoaming; - nas::NasListT1 m_forbiddenTaiListRps; + std::unique_ptr> m_forbiddenTaiListRoaming; + std::unique_ptr> m_forbiddenTaiListRps; public: MmStorage(); From bed3766bba0d82763bc24c02e686c957e4dfcd8a Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 09:35:28 +0300 Subject: [PATCH 112/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 259c5bcca..57d46aaa5 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -26,7 +26,7 @@ template class NasListT1 { public: - using backup_functor_type = std::function &buffer, size_t size)>; + using backup_functor_type = std::function &buffer, size_t count)>; private: const size_t m_sizeLimit; From 4fe5f4733acd77a2ae9361a62bc5dc0626d0f256 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 10:30:04 +0300 Subject: [PATCH 113/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 ++ src/ue/nas/mm/dereg.cpp | 2 +- src/ue/nas/mm/mm.hpp | 2 +- src/ue/nas/mm/register.cpp | 4 ++-- src/ue/nas/mm/service.cpp | 4 ++-- src/ue/nas/storage.cpp | 2 +- src/ue/nas/storage.hpp | 6 +++++- 7 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 410ef92df..52422e21e 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -26,6 +26,8 @@ NasMm::NasMm(TaskBase *base, UeTimers *timers) : m_base{base}, m_timers{timers}, m_cmState = ECmState::CM_IDLE; m_mmState = EMmState::MM_DEREGISTERED; m_mmSubState = EMmSubState::MM_DEREGISTERED_NA; + + m_storage = new MmStorage(m_base); } void NasMm::onStart(NasSm *sm, Usim *usim) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 5a4a29116..0c4e33e64 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -253,7 +253,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRoaming->add(tai); + m_storage->m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index d8fc26013..0c2ee739b 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -31,7 +31,7 @@ class NasMm std::unique_ptr m_logger; NasSm *m_sm; Usim *m_usim; - MmStorage m_storage; + MmStorage* m_storage; ERmState m_rmState; ECmState m_cmState; diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 5bcbba2bf..252cebf22 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -569,7 +569,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRoaming->add(tai); + m_storage->m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) @@ -733,7 +733,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRoaming->add(tai); + m_storage->m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 71ec16ba9..8e51254bf 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -316,7 +316,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRps->add(tai); + m_storage->m_forbiddenTaiListRps->add(tai); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) @@ -327,7 +327,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; tai.tac = (int)m_usim->m_currentTai->tac; - m_storage.m_forbiddenTaiListRoaming->add(tai); + m_storage->m_forbiddenTaiListRoaming->add(tai); nas::utils::RemoveFromTaiList(m_usim->m_taiList, *m_usim->m_currentTai); } diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 9e126000b..eae5db104 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -14,7 +14,7 @@ static constexpr const int64_t FORBIDDEN_TAI_CLEAR_PERIOD = 1000ll * 60ll * 60ll namespace nr::ue { -MmStorage::MmStorage() +MmStorage::MmStorage(TaskBase *base) : m_base{base} { m_forbiddenTaiListRoaming = std::make_unique>(FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, std::nullopt); diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 9a0fff296..6431242e2 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -8,18 +8,22 @@ #include #include +#include namespace nr::ue { class MmStorage { + private: + TaskBase *m_base; + public: std::unique_ptr> m_forbiddenTaiListRoaming; std::unique_ptr> m_forbiddenTaiListRps; public: - MmStorage(); + explicit MmStorage(TaskBase *base); }; } // namespace nr::ue From 93cd83c704f3c309ee1f2f4d251f6b4a6f582184 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 10:43:13 +0300 Subject: [PATCH 114/311] L3 RRC/NAS developments --- src/ue/nas/storage.cpp | 22 ++++++++++++++++++---- src/ue/types.hpp | 3 +++ src/utils/common_types.cpp | 12 ++++++++++++ src/utils/common_types.hpp | 6 +++++- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index eae5db104..0e4fbeecc 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -11,15 +11,29 @@ static constexpr const size_t FORBIDDEN_TAI_LIST_SIZE = 40; static constexpr const int64_t FORBIDDEN_TAI_CLEAR_PERIOD = 1000ll * 60ll * 60ll * 12ll; +static void BackupTaiListInSharedCtx(const std::vector &buffer, size_t count, Locked> &target) +{ + target.mutate([count, &buffer](auto &value) { + value.clear(); + for (size_t i = 0; i < count; i++) + value.push_back(buffer[i]); + }); +} + namespace nr::ue { MmStorage::MmStorage(TaskBase *base) : m_base{base} { - m_forbiddenTaiListRoaming = - std::make_unique>(FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, std::nullopt); - m_forbiddenTaiListRps = - std::make_unique>(FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, std::nullopt); + m_forbiddenTaiListRoaming = std::make_unique>( + FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { + BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRoaming); + }); + + m_forbiddenTaiListRps = std::make_unique>( + FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { + BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRps); + }); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 11126e531..349b007fd 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -161,6 +162,8 @@ struct UeSharedContext Locked> availablePlmns; Locked selectedPlmn; Locked currentCell; + Locked> forbiddenTaiRoaming; + Locked> forbiddenTaiRps; }; struct TaskBase diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 4ac6af16d..6d03bf51b 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -170,3 +170,15 @@ bool Plmn::hasValue() const { return this->mcc != 0; } + +Tai::Tai() : plmn{}, tac{} +{ +} + +Tai::Tai(const Plmn &plmn, int tac) : plmn{plmn}, tac{tac} +{ +} + +Tai::Tai(int mcc, int mnc, bool longMnc, int tac) : plmn{mcc, mnc, longMnc}, tac{tac} +{ +} diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 1f4fe0819..bd1839a2e 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -37,7 +37,11 @@ struct Plmn struct Tai { Plmn plmn; - int tac{}; + int tac; + + Tai(); + Tai(const Plmn& plmn, int tac); + Tai(int mcc, int mnc, bool longMnc, int tac); }; struct SingleSlice From 417bbc14257fb07a07768c2039f353d5ee64ec52 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 10:50:45 +0300 Subject: [PATCH 115/311] L3 RRC/NAS developments --- src/ue/rrc/idle.cpp | 51 ++++++++++++++++++++++++++++++++++++++------- src/ue/types.hpp | 1 + 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index cf310a190..dae1e92e1 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -32,9 +32,9 @@ void UeRrcTask::performCellSelection() if (!m_cellDesc.empty()) { m_logger->warn("Suitable cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, " - "[%d] barred", + "[%d] barred, ftai [%d]", static_cast(m_cellDesc.size()), report.outOfPlmnCells, report.sib1MissingCells, - report.reservedCells, report.barredCells); + report.reservedCells, report.barredCells, report.forbiddenTaiCells); } else { @@ -47,9 +47,10 @@ void UeRrcTask::performCellSelection() { if (!m_cellDesc.empty()) { - m_logger->warn("Acceptable cell selection failed in [%d] cells. [%d] no SI, [%d] reserved, [%d] barred", - static_cast(m_cellDesc.size()), report.sib1MissingCells, report.reservedCells, - report.barredCells); + m_logger->warn( + "Acceptable cell selection failed in [%d] cells. [%d] no SI, [%d] reserved, [%d] barred, ftai [%d]", + static_cast(m_cellDesc.size()), report.sib1MissingCells, report.reservedCells, + report.barredCells, report.forbiddenTaiCells); } else { @@ -115,7 +116,25 @@ bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo, CellSelectionRepo continue; } - // TODO: Check TAI if forbidden by service area or forbidden list + Tai tai{cell.sib1.plmn, cell.sib1.tac}; + + if (m_base->shCtx.forbiddenTaiRoaming.get([&tai](auto &item) { + return std::any_of(item.begin(), item.end(), [&tai](auto &element) { return element == tai; }); + })) + { + report.forbiddenTaiCells++; + continue; + } + + if (m_base->shCtx.forbiddenTaiRps.get([&tai](auto &item) { + return std::any_of(item.begin(), item.end(), [&tai](auto &element) { return element == tai; }); + })) + { + report.forbiddenTaiCells++; + continue; + } + + // TODO: Check TAI if forbidden by service area // TODO: Do we need to check by access identity? // It seems suitable @@ -173,7 +192,25 @@ bool UeRrcTask::lookForAcceptableCell(CurrentCellInfo &cellInfo, CellSelectionRe continue; } - // TODO: Check TAI if forbidden by service area or forbidden list + Tai tai{cell.sib1.plmn, cell.sib1.tac}; + + if (m_base->shCtx.forbiddenTaiRoaming.get([&tai](auto &item) { + return std::any_of(item.begin(), item.end(), [&tai](auto &element) { return element == tai; }); + })) + { + report.forbiddenTaiCells++; + continue; + } + + if (m_base->shCtx.forbiddenTaiRps.get([&tai](auto &item) { + return std::any_of(item.begin(), item.end(), [&tai](auto &element) { return element == tai; }); + })) + { + report.forbiddenTaiCells++; + continue; + } + + // TODO: Check TAI if forbidden by service area // TODO: Do we need to check by access identity? // It seems acceptable diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 349b007fd..a7a04be13 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -145,6 +145,7 @@ struct CellSelectionReport int sib1MissingCells{}; int reservedCells{}; int barredCells{}; + int forbiddenTaiCells{}; }; struct CurrentCellInfo From 0ed121e79d04caf52156327faa5561595566778b Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 10:53:44 +0300 Subject: [PATCH 116/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 4 ++-- src/ue/nas/storage.cpp | 4 ++-- src/ue/nas/storage.hpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 57d46aaa5..a74371839 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -23,7 +23,7 @@ namespace nas * - The list is NOT thread safe */ template -class NasListT1 +class NasList { public: using backup_functor_type = std::function &buffer, size_t count)>; @@ -38,7 +38,7 @@ class NasListT1 int64_t m_lastAutoCleared; public: - NasListT1(size_t sizeLimit, int64_t autoClearingPeriod, std::optional backupFunctor) + NasList(size_t sizeLimit, int64_t autoClearingPeriod, std::optional backupFunctor) : m_sizeLimit{sizeLimit}, m_autoClearingPeriod{autoClearingPeriod}, m_data{sizeLimit}, m_size{}, m_lastAutoCleared{::utils::CurrentTimeMillis()} { diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 0e4fbeecc..042969f90 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -25,12 +25,12 @@ namespace nr::ue MmStorage::MmStorage(TaskBase *base) : m_base{base} { - m_forbiddenTaiListRoaming = std::make_unique>( + m_forbiddenTaiListRoaming = std::make_unique>( FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRoaming); }); - m_forbiddenTaiListRps = std::make_unique>( + m_forbiddenTaiListRps = std::make_unique>( FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRps); }); diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 6431242e2..77d0bb7ef 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -19,8 +19,8 @@ class MmStorage TaskBase *m_base; public: - std::unique_ptr> m_forbiddenTaiListRoaming; - std::unique_ptr> m_forbiddenTaiListRps; + std::unique_ptr> m_forbiddenTaiListRoaming; + std::unique_ptr> m_forbiddenTaiListRps; public: explicit MmStorage(TaskBase *base); From 027d89d679fc5ac0b92ac98974723eb0858d3651 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 10:56:57 +0300 Subject: [PATCH 117/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index a74371839..0aa879f5b 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -39,11 +39,14 @@ class NasList public: NasList(size_t sizeLimit, int64_t autoClearingPeriod, std::optional backupFunctor) - : m_sizeLimit{sizeLimit}, m_autoClearingPeriod{autoClearingPeriod}, m_data{sizeLimit}, m_size{}, - m_lastAutoCleared{::utils::CurrentTimeMillis()} + : m_sizeLimit{sizeLimit}, m_autoClearingPeriod{autoClearingPeriod}, + m_backupFunctor{backupFunctor}, m_data{sizeLimit}, m_size{}, m_lastAutoCleared{::utils::CurrentTimeMillis()} { } + NasList(const NasList &) = delete; + NasList(NasList &&) = delete; + public: void add(const T &item) { From feaeffb84752338bec9c5b1bdcc83d5e3cb26a90 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 11:12:42 +0300 Subject: [PATCH 118/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 93 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 0aa879f5b..6cf5885d1 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -16,6 +17,8 @@ namespace nas { +// TODO: Periodun sonuna geldiğinde erişilmezse, (autoClearIfNecessary çağrılmazsa) delete yapılmaz backup çalışmaz + /* * - Items are unique, if already exists, deletes the previous one * - List have fixed size, if capacity is full, oldest item is deleted @@ -142,6 +145,9 @@ class NasList private: void autoClearIfNecessary() { + if (m_autoClearingPeriod <= 0) + return; + int64_t currentTime = ::utils::CurrentTimeMillis(); if (currentTime - m_lastAutoCleared >= m_autoClearingPeriod) { @@ -158,11 +164,11 @@ class NasList void removeAt(size_t index) { - touch(); - for (size_t i = index; i < m_size; ++i) m_data[i] = i + 1 < m_sizeLimit ? m_data[i + 1] : T{}; m_size--; + + touch(); } void touch() @@ -172,4 +178,87 @@ class NasList } }; +template +class NasSlot +{ + public: + using backup_functor_type = std::function; + + private: + const int64_t m_autoClearingPeriod; + const std::optional m_backupFunctor; + + T m_value; + int64_t m_lastAutoCleared; + + static_assert(!std::is_reference::value); + + public: + NasSlot(int64_t autoClearingPeriod, std::optional backupFunctor) + : m_autoClearingPeriod{autoClearingPeriod}, m_backupFunctor{backupFunctor}, m_value{}, + m_lastAutoCleared{::utils::CurrentTimeMillis()} + { + } + + T get() + { + autoClearIfNecessary(); + + return m_value; + } + + void set(const T &value) + { + autoClearIfNecessary(); + + m_value = value; + touch(); + } + + void set(T &&value) + { + autoClearIfNecessary(); + + m_value = std::move(value); + touch(); + } + + template + void access(Functor fun) + { + autoClearIfNecessary(); + + fun((const T &)m_value); + } + + template + void mutate(Functor fun) + { + autoClearIfNecessary(); + + fun((T &)m_value); + touch(); + } + + private: + void autoClearIfNecessary() + { + if (m_autoClearingPeriod <= 0) + return; + + int64_t currentTime = ::utils::CurrentTimeMillis(); + if (currentTime - m_lastAutoCleared >= m_autoClearingPeriod) + { + m_lastAutoCleared = currentTime; + m_value = {}; + } + } + + void touch() + { + if (m_backupFunctor) + (*m_backupFunctor)(m_value); + } +}; + } // namespace nas From d3c6d99ccd3353e695db6897f6cf63d9cfca24bb Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 14:34:47 +0300 Subject: [PATCH 119/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 2 +- src/ue/nas/mm/access.cpp | 4 ++-- src/ue/nas/mm/config.cpp | 2 +- src/ue/nas/mm/radio.cpp | 2 +- src/ue/nas/mm/register.cpp | 4 ++-- src/ue/nas/storage.cpp | 2 ++ src/ue/nas/storage.hpp | 1 + src/ue/nas/usim/usim.hpp | 1 - 8 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 6cf5885d1..6c3767380 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -200,7 +200,7 @@ class NasSlot { } - T get() + const T &get() { autoClearIfNecessary(); diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index cb313331a..3eb1b20bd 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -52,13 +52,13 @@ bool NasMm::isInNonAllowedArea() auto &plmn = *m_usim->m_currentPlmn; - if (nas::utils::ServiceAreaListForbidsPlmn(m_usim->m_serviceAreaList, nas::utils::PlmnFrom(plmn))) + if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->m_serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) return true; if (m_usim->m_servingCell.has_value()) { if (nas::utils::ServiceAreaListForbidsTai( - m_usim->m_serviceAreaList, + m_storage->m_serviceAreaList->get(), nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(plmn), octet3{m_usim->m_servingCell->tac}})) return true; } diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index ada775a52..ae816347d 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -59,7 +59,7 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms if (msg.serviceAreaList.has_value()) { hasNewConfig = true; - m_usim->m_serviceAreaList = *msg.serviceAreaList; + m_storage->m_serviceAreaList->set(*msg.serviceAreaList); } // "If the UE receives new NITZ information in the CONFIGURATION UPDATE COMMAND message, the UE considers the new diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 94d66aeb1..d022a83b6 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -72,7 +72,7 @@ void NasMm::performPlmnSelection() continue; // If it's the HPLMN, it's already added above if (nas::utils::PlmnListContains(m_usim->m_forbiddenPlmnList, plmn)) continue; - if (nas::utils::ServiceAreaListForbidsPlmn(m_usim->m_serviceAreaList, nas::utils::PlmnFrom(plmn))) + if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->m_serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) continue; if (nas::utils::PlmnListContains(m_usim->m_equivalentPlmnList, plmn)) candidates.push_back(plmn); diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 252cebf22..7c5e13b6a 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -232,7 +232,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) // Store the TAI list as a registration area m_usim->m_taiList = msg.taiList.value_or(nas::IE5gsTrackingAreaIdentityList{}); // Store the service area list - m_usim->m_serviceAreaList = msg.serviceAreaList.value_or(nas::IEServiceAreaList{}); + m_storage->m_serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); // Store the E-PLMN list and .. m_usim->m_equivalentPlmnList = msg.equivalentPLMNs.value_or(nas::IEPlmnList{}); @@ -355,7 +355,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg nas::utils::AddToPlmnList(m_usim->m_equivalentPlmnList, nas::utils::PlmnFrom(*m_usim->m_currentPlmn)); // Store the service area list - m_usim->m_serviceAreaList = msg.serviceAreaList.value_or(nas::IEServiceAreaList{}); + m_storage->m_serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); // "Upon receipt of the REGISTRATION ACCEPT message, the UE shall reset the registration attempt counter and service // request attempt counter, enter state 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED." diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 042969f90..02f4c641e 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -34,6 +34,8 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRps); }); + + m_serviceAreaList = std::make_unique>(0, std::nullopt); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 77d0bb7ef..a30ec0015 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -21,6 +21,7 @@ class MmStorage public: std::unique_ptr> m_forbiddenTaiListRoaming; std::unique_ptr> m_forbiddenTaiListRps; + std::unique_ptr> m_serviceAreaList; public: explicit MmStorage(TaskBase *base); diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index ffec2b06d..81e5dc039 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -42,7 +42,6 @@ class Usim nas::IE5gsTrackingAreaIdentityList m_taiList{}; nas::IEPlmnList m_equivalentPlmnList{}; nas::IEPlmnList m_forbiddenPlmnList{}; - nas::IEServiceAreaList m_serviceAreaList{}; // Security related std::unique_ptr m_currentNsCtx{}; From 250f5738e4db82c3a1fc653b6d6e544482d54f72 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 14:38:30 +0300 Subject: [PATCH 120/311] L3 RRC/NAS developments --- src/ue/rrc/idle.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index dae1e92e1..7f813f984 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -134,9 +134,6 @@ bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo, CellSelectionRepo continue; } - // TODO: Check TAI if forbidden by service area - // TODO: Do we need to check by access identity? - // It seems suitable candidates.push_back(item.first); } @@ -210,9 +207,6 @@ bool UeRrcTask::lookForAcceptableCell(CurrentCellInfo &cellInfo, CellSelectionRe continue; } - // TODO: Check TAI if forbidden by service area - // TODO: Do we need to check by access identity? - // It seems acceptable candidates.push_back(item.first); } From 31f770865b15a21bb93c6e442537a203a6421618 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 15:49:25 +0300 Subject: [PATCH 121/311] L3 RRC/NAS developments --- src/ue/rrc/idle.cpp | 36 +++++++++++++++++++++++++----------- src/ue/rrc/task.cpp | 2 ++ src/ue/rrc/task.hpp | 5 +++-- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index 7f813f984..cc08a8844 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -22,28 +22,42 @@ void UeRrcTask::performCellSelection() if (m_state == ERrcState::RRC_CONNECTED) return; + if (utils::CurrentTimeMillis() - m_startedTime <= 1000LL && m_cellDesc.empty()) + return; + int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); CurrentCellInfo cellInfo; CellSelectionReport report; - if (!lookForSuitableCell(cellInfo, report)) + bool cellFound = false; + if (m_base->shCtx.selectedPlmn.get().hasValue()) { - if (!m_cellDesc.empty()) - { - m_logger->warn("Suitable cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, " - "[%d] barred, ftai [%d]", - static_cast(m_cellDesc.size()), report.outOfPlmnCells, report.sib1MissingCells, - report.reservedCells, report.barredCells, report.forbiddenTaiCells); - } - else + cellFound = lookForSuitableCell(cellInfo, report); + if (!cellFound) { - m_logger->warn("Suitable cell selection failed, no cell is in coverage"); + if (!m_cellDesc.empty()) + { + m_logger->warn( + "Suitable cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, " + "[%d] barred, ftai [%d]", + static_cast(m_cellDesc.size()), report.outOfPlmnCells, report.sib1MissingCells, + report.reservedCells, report.barredCells, report.forbiddenTaiCells); + } + else + { + m_logger->warn("Suitable cell selection failed, no cell is in coverage"); + } } + } + if (!cellFound) + { report = {}; - if (!lookForAcceptableCell(cellInfo, report)) + cellFound = lookForAcceptableCell(cellInfo, report); + + if (!cellFound) { if (!m_cellDesc.empty()) { diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 37e7fc22c..ecf99d24d 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -27,6 +27,8 @@ UeRrcTask::UeRrcTask(TaskBase *base) : m_base{base} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rrc"); + m_startedTime = utils::CurrentTimeMillis(); + m_state = ERrcState::RRC_IDLE; } diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index d0d8daaff..5df193abd 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -50,14 +50,15 @@ class UeRrcTask : public NtsTask private: TaskBase *m_base; std::unique_ptr m_logger; - + int64_t m_startedTime; ERrcState m_state; + std::unordered_map m_cellDesc{}; + ERrcLastSetupRequest m_lastSetupReq{}; ASN_RRC_InitialUE_Identity_t m_initialId{}; OctetString m_initialNasPdu{}; - std::unordered_map m_cellDesc{}; friend class UeCmdHandler; From effbacb29eb1ea8976e1577ad8e8328368eb23ac Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 16:02:38 +0300 Subject: [PATCH 122/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 ++ src/ue/nas/mm/mm.hpp | 2 ++ src/ue/nas/mm/radio.cpp | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 52422e21e..348ffb5b0 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -183,6 +183,8 @@ void NasMm::switchMmState(EMmState state, EMmSubState subState) m_mmState = state; m_mmSubState = subState; + m_lastTimeMmStateChange = utils::CurrentTimeMillis(); + onSwitchMmState(oldState, m_mmState, oldSubState, m_mmSubState); if (m_base->nodeListener) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 0c2ee739b..9eea042ad 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -64,6 +64,8 @@ class NasMm int m_nwConsecutiveAuthFailure{}; // Last time PLMN search failure logged int64_t m_lastTimePlmnSearchFailureLogged{}; + // Last time MM state changed + int64_t m_lastTimeMmStateChange{}; friend class UeCmdHandler; diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index d022a83b6..d78080718 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -23,10 +23,25 @@ void NasMm::performPlmnSelection() { int64_t currentTime = utils::CurrentTimeMillis(); + // After some timeout in PLMN_SEARCH states, NO_CELL_AVAILABLE state is selected + if (currentTime - m_lastTimeMmStateChange >= 5'000LL) + { + if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) + { + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE); + return; + } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH) + { + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE); + return; + } + } + // If the state is PLMN_SEARCH instead of NO_CELL_AVAILABLE, then we log the errors more intensely. int64_t loggingThreshold = m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH - ? 1'000LL + ? 2'000LL : 10'000LL; bool logFailures = currentTime - m_lastTimePlmnSearchFailureLogged >= loggingThreshold; From 6416362c0464c56a32643d1077f946ea45d720e7 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 16:03:28 +0300 Subject: [PATCH 123/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index d78080718..0f01f4405 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -42,7 +42,7 @@ void NasMm::performPlmnSelection() int64_t loggingThreshold = m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH ? 2'000LL - : 10'000LL; + : 15'000LL; bool logFailures = currentTime - m_lastTimePlmnSearchFailureLogged >= loggingThreshold; From 4391f92ceae5934e76be18f44da06ff26cd0e7d2 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 16:26:54 +0300 Subject: [PATCH 124/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 2 +- src/ue/rrc/idle.cpp | 58 +++++++++++++++++++++++++---------------- src/ue/rrc/task.hpp | 1 + 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 0f01f4405..ee5e6eb6b 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -42,7 +42,7 @@ void NasMm::performPlmnSelection() int64_t loggingThreshold = m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH ? 2'000LL - : 15'000LL; + : 30'000LL; bool logFailures = currentTime - m_lastTimePlmnSearchFailureLogged >= loggingThreshold; diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index cc08a8844..e67fdb91e 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -22,11 +22,15 @@ void UeRrcTask::performCellSelection() if (m_state == ERrcState::RRC_CONNECTED) return; - if (utils::CurrentTimeMillis() - m_startedTime <= 1000LL && m_cellDesc.empty()) + int64_t currentTime = utils::CurrentTimeMillis(); + + if (currentTime - m_startedTime <= 1000LL && m_cellDesc.empty()) return; int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); + bool shouldLogErrors = lastCell != 0 || (currentTime - m_lastTimePlmnSearchFailureLogged >= 30'000LL); + CurrentCellInfo cellInfo; CellSelectionReport report; @@ -36,17 +40,22 @@ void UeRrcTask::performCellSelection() cellFound = lookForSuitableCell(cellInfo, report); if (!cellFound) { - if (!m_cellDesc.empty()) - { - m_logger->warn( - "Suitable cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, " - "[%d] barred, ftai [%d]", - static_cast(m_cellDesc.size()), report.outOfPlmnCells, report.sib1MissingCells, - report.reservedCells, report.barredCells, report.forbiddenTaiCells); - } - else + if (shouldLogErrors) { - m_logger->warn("Suitable cell selection failed, no cell is in coverage"); + if (!m_cellDesc.empty()) + { + m_logger->warn( + "Suitable cell selection failed in [%d] cells. [%d] out of PLMN, [%d] no SI, [%d] reserved, " + "[%d] barred, ftai [%d]", + static_cast(m_cellDesc.size()), report.outOfPlmnCells, report.sib1MissingCells, + report.reservedCells, report.barredCells, report.forbiddenTaiCells); + } + else + { + m_logger->warn("Suitable cell selection failed, no cell is in coverage"); + } + + m_lastTimePlmnSearchFailureLogged = currentTime; } } } @@ -59,19 +68,24 @@ void UeRrcTask::performCellSelection() if (!cellFound) { - if (!m_cellDesc.empty()) + if (shouldLogErrors) { - m_logger->warn( - "Acceptable cell selection failed in [%d] cells. [%d] no SI, [%d] reserved, [%d] barred, ftai [%d]", - static_cast(m_cellDesc.size()), report.sib1MissingCells, report.reservedCells, - report.barredCells, report.forbiddenTaiCells); + if (!m_cellDesc.empty()) + { + m_logger->warn("Acceptable cell selection failed in [%d] cells. [%d] no SI, [%d] reserved, [%d] " + "barred, ftai [%d]", + static_cast(m_cellDesc.size()), report.sib1MissingCells, report.reservedCells, + report.barredCells, report.forbiddenTaiCells); + } + else + { + m_logger->warn("Acceptable cell selection failed, no cell is in coverage"); + } + + m_logger->err("Cell selection failure, no suitable or acceptable cell found"); + + m_lastTimePlmnSearchFailureLogged = currentTime; } - else - { - m_logger->warn("Acceptable cell selection failed, no cell is in coverage"); - } - - m_logger->err("Cell selection failure, no suitable or acceptable cell found"); } } diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 5df193abd..9d88f6050 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -59,6 +59,7 @@ class UeRrcTask : public NtsTask ASN_RRC_InitialUE_Identity_t m_initialId{}; OctetString m_initialNasPdu{}; + int64_t m_lastTimePlmnSearchFailureLogged{}; friend class UeCmdHandler; From 0f99f8c4401ee4760aea17b7228ad30293eea9db Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 17 May 2021 16:30:09 +0300 Subject: [PATCH 125/311] L3 RRC/NAS developments --- src/ue/rrc/cells.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index 42ce2e62a..a80ba4872 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -53,9 +53,9 @@ void UeRrcTask::notifyCellLost(int cellId) m_logger->debug("Signal lost for cell[%d], total [%d] cells in coverage", cellId, static_cast(m_cellDesc.size())); - updateAvailablePlmns(); - // TODO: handle other operations + + updateAvailablePlmns(); } bool UeRrcTask::hasSignalToCell(int cellId) From 755898a7ff0d689fc409258306321201ad4c299a Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 16:34:24 +0300 Subject: [PATCH 126/311] L3 RRC/NAS developments --- src/ue/nas/mm/auth.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index 0ccbf471e..67f38b71e 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -520,8 +520,14 @@ bool NasMm::networkFailingTheAuthCheck(bool hasChance) // END m_logger->err("Network failing the authentication check"); - localReleaseConnection(); - // TODO: treat the active cell as barred + + if (m_cmState == ECmState::CM_CONNECTED) + { + localReleaseConnection(); + // TODO: treat the active cell as barred + } + + m_timers->t3520.stop(); return true; } From 5fbd15a9cd44a3d52310162109719060f09cb003 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 18:03:02 +0300 Subject: [PATCH 127/311] L3 RRC/NAS developments --- src/ue/nas/mm/messaging.cpp | 19 ++++-------------- src/ue/nts.hpp | 8 ++------ src/ue/rrc/cells.cpp | 5 +++++ src/ue/rrc/channel.cpp | 38 +++++++++++++++++++++--------------- src/ue/rrc/handler.cpp | 4 ++-- src/ue/rrc/nas.cpp | 39 +++++++++++++++++++++++++++++++++++++ src/ue/rrc/sap.cpp | 8 +------- src/ue/rrc/task.hpp | 14 ++++++++----- 8 files changed, 84 insertions(+), 51 deletions(-) create mode 100644 src/ue/rrc/nas.cpp diff --git a/src/ue/nas/mm/messaging.cpp b/src/ue/nas/mm/messaging.cpp index a6078e6ec..7027323a5 100644 --- a/src/ue/nas/mm/messaging.cpp +++ b/src/ue/nas/mm/messaging.cpp @@ -13,8 +13,6 @@ #include #include -#include - namespace nr::ue { @@ -168,19 +166,10 @@ void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) } } - if (m_cmState == ECmState::CM_IDLE) - { - auto *nw = new NwUeNasToRrc(NwUeNasToRrc::INITIAL_NAS_DELIVERY); - nw->nasPdu = std::move(pdu); - nw->rrcEstablishmentCause = ASN_RRC_EstablishmentCause_mo_Data; - m_base->rrcTask->push(nw); - } - else - { - auto *nw = new NwUeNasToRrc(NwUeNasToRrc::UPLINK_NAS_DELIVERY); - nw->nasPdu = std::move(pdu); - m_base->rrcTask->push(nw); - } + auto *nw = new NwUeNasToRrc(NwUeNasToRrc::UPLINK_NAS_DELIVERY); + nw->pduId = 0; + nw->nasPdu = std::move(pdu); + m_base->rrcTask->push(nw); } void NasMm::receiveNasMessage(const nas::NasMessage &msg) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 9b04f8732..a72c98b50 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -92,17 +92,13 @@ struct NwUeNasToRrc : NtsMessage enum PR { LOCAL_RELEASE_CONNECTION, - INITIAL_NAS_DELIVERY, UPLINK_NAS_DELIVERY, RRC_NOTIFY, } present; - // INITIAL_NAS_DELIVERY // UPLINK_NAS_DELIVERY - OctetString nasPdu{}; - - // INITIAL_NAS_DELIVERY - long rrcEstablishmentCause{}; + uint32_t pduId{}; + OctetString nasPdu; explicit NwUeNasToRrc(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RRC), present(present) { diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index a80ba4872..80dcf8cff 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -63,6 +63,11 @@ bool UeRrcTask::hasSignalToCell(int cellId) return m_cellDesc.count(cellId); } +bool UeRrcTask::isActiveCell(int cellId) +{ + return m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }) == cellId; +} + void UeRrcTask::updateAvailablePlmns() { m_base->shCtx.availablePlmns.mutate([this](std::unordered_set &value) { diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index ae97d86d3..b640f71bc 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -54,21 +54,27 @@ void UeRrcTask::handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const Oct break; } case rrc::RrcChannel::DL_DCCH: { - auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_DL_DCCH_Message, rrcPdu); - if (pdu == nullptr) - m_logger->err("RRC DL-DCCH PDU decoding failed."); - else - receiveRrcMessage(cellId, pdu); - asn::Free(asn_DEF_ASN_RRC_DL_DCCH_Message, pdu); + if (isActiveCell(cellId)) + { + auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_DL_DCCH_Message, rrcPdu); + if (pdu == nullptr) + m_logger->err("RRC DL-DCCH PDU decoding failed."); + else + receiveRrcMessage(pdu); + asn::Free(asn_DEF_ASN_RRC_DL_DCCH_Message, pdu); + } break; }; case rrc::RrcChannel::PCCH: { - auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_PCCH_Message, rrcPdu); - if (pdu == nullptr) - m_logger->err("RRC PCCH PDU decoding failed."); - else - receiveRrcMessage(cellId, pdu); - asn::Free(asn_DEF_ASN_RRC_PCCH_Message, pdu); + if (isActiveCell(cellId)) + { + auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_PCCH_Message, rrcPdu); + if (pdu == nullptr) + m_logger->err("RRC PCCH PDU decoding failed."); + else + receiveRrcMessage(pdu); + asn::Free(asn_DEF_ASN_RRC_PCCH_Message, pdu); + } break; } case rrc::RrcChannel::UL_CCCH: @@ -78,7 +84,7 @@ void UeRrcTask::handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const Oct } } -void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg) +void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH_Message *msg) { OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_UL_CCCH_Message, msg); if (pdu.length() == 0) @@ -93,7 +99,7 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg) m_base->rlsTask->push(nw); } -void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg) +void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH1_Message *msg) { OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_UL_CCCH1_Message, msg); if (pdu.length() == 0) @@ -164,7 +170,7 @@ void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg) } } -void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_DCCH_Message *msg) +void UeRrcTask::receiveRrcMessage(ASN_RRC_DL_DCCH_Message *msg) { if (msg->message.present != ASN_RRC_DL_DCCH_MessageType_PR_c1) return; @@ -183,7 +189,7 @@ void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_DCCH_Message *msg) } } -void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_PCCH_Message *msg) +void UeRrcTask::receiveRrcMessage(ASN_RRC_PCCH_Message *msg) { if (msg->message.present != ASN_RRC_PCCH_MessageType_PR_c1) return; diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index c54a3eb7d..9b5fc1523 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -34,7 +34,7 @@ namespace nr::ue void UeRrcTask::deliverInitialNas(OctetString &&nasPdu, long establishmentCause) { - if (m_state != ERrcState::RRC_IDLE) + /*if (m_state != ERrcState::RRC_IDLE) { m_logger->warn("Initial NAS delivery while not in RRC_IDLE, treating as uplink delivery"); deliverUplinkNas(std::move(nasPdu)); @@ -60,7 +60,7 @@ void UeRrcTask::deliverInitialNas(OctetString &&nasPdu, long establishmentCause) m_initialNasPdu = std::move(nasPdu); m_lastSetupReq = ERrcLastSetupRequest::SETUP_REQUEST; - sendRrcMessage(pdu); + sendRrcMessage(pdu);*/ } void UeRrcTask::deliverUplinkNas(OctetString &&nasPdu) diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp new file mode 100644 index 000000000..95837fa78 --- /dev/null +++ b/src/ue/rrc/nas.cpp @@ -0,0 +1,39 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" +#include +#include +#include + +namespace nr::ue +{ + +void UeRrcTask::deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu) +{ + if (!m_base->shCtx.currentCell.get([](auto &value) { return value.hasValue(); })) + { + m_logger->err("Uplink NAS delivery failed. No cell is active"); + return; + } + + if (m_state == ERrcState::RRC_CONNECTED) + { + + } + else if (m_state == ERrcState::RRC_INACTIVE) + { + + } + else if (m_state == ERrcState::RRC_IDLE) + { + + } +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/sap.cpp b/src/ue/rrc/sap.cpp index 9673e1a0a..f2a443196 100644 --- a/src/ue/rrc/sap.cpp +++ b/src/ue/rrc/sap.cpp @@ -33,14 +33,8 @@ void UeRrcTask::handleNasSapMessage(NwUeNasToRrc &msg) { switch (msg.present) { - case NwUeNasToRrc::INITIAL_NAS_DELIVERY: { - // TODO - // deliverInitialNas(std::move(msg.nasPdu), msg.rrcEstablishmentCause); - break; - } case NwUeNasToRrc::UPLINK_NAS_DELIVERY: { - // TODO - // deliverUplinkNas(std::move(msg.nasPdu)); + deliverUplinkNas(msg.pduId, std::move(msg.nasPdu)); break; } case NwUeNasToRrc::LOCAL_RELEASE_CONNECTION: { diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 9d88f6050..3cd016efc 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -87,14 +87,14 @@ class UeRrcTask : public NtsTask void handleRadioLinkFailure(); /* RRC Message Transmission and Receive */ - void sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg); - void sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg); + void sendRrcMessage(int cellId, ASN_RRC_UL_CCCH_Message *msg); + void sendRrcMessage(int cellId, ASN_RRC_UL_CCCH1_Message *msg); void sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg); void receiveRrcMessage(int cellId, ASN_RRC_BCCH_BCH_Message *msg); void receiveRrcMessage(int cellId, ASN_RRC_BCCH_DL_SCH_Message *msg); - void receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg); // TODO - void receiveRrcMessage(int cellId, ASN_RRC_DL_DCCH_Message *msg); // .. - void receiveRrcMessage(int cellId, ASN_RRC_PCCH_Message *msg); // Broadcast vs için camped olmayanları ignore + void receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg); + void receiveRrcMessage(ASN_RRC_DL_DCCH_Message *msg); + void receiveRrcMessage(ASN_RRC_PCCH_Message *msg); /* Service Access Point */ void handleRlsSapMessage(NwUeRlsToRrc &msg); @@ -114,11 +114,15 @@ class UeRrcTask : public NtsTask void notifyCellDetected(int cellId, int dbm); void notifyCellLost(int cellId); bool hasSignalToCell(int cellId); + bool isActiveCell(int cellId); void updateAvailablePlmns(); /* System Information */ void receiveMib(int cellId, const ASN_RRC_MIB &msg); void receiveSib1(int cellId, const ASN_RRC_SIB1 &msg); + + /* NAS Transport */ + void deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu); }; } // namespace nr::ue From bcf1af2df76b3615e33c47f1e5576813d57e4838 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 18:03:49 +0300 Subject: [PATCH 128/311] L3 RRC/NAS developments --- src/ue/rrc/nas.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp index 95837fa78..474760907 100644 --- a/src/ue/rrc/nas.cpp +++ b/src/ue/rrc/nas.cpp @@ -24,15 +24,15 @@ void UeRrcTask::deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu) if (m_state == ERrcState::RRC_CONNECTED) { - + // TODO } else if (m_state == ERrcState::RRC_INACTIVE) { - + // TODO } else if (m_state == ERrcState::RRC_IDLE) { - + // TODO } } From 7953b27f4ca9068be6fc24e3dc0d51fb341e791b Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 18:44:39 +0300 Subject: [PATCH 129/311] L3 RRC/NAS developments --- src/ue/nts.hpp | 1 + src/ue/rls/task.cpp | 6 ++++ src/ue/rrc/channel.cpp | 2 ++ src/ue/rrc/connection.cpp | 58 +++++++++++++++++++++++++++++++++++++++ src/ue/rrc/handler.cpp | 31 --------------------- src/ue/rrc/nas.cpp | 3 +- src/ue/rrc/sap.cpp | 1 + src/ue/rrc/task.hpp | 4 ++- 8 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 src/ue/rrc/connection.cpp diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index a72c98b50..a171eb9f2 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -118,6 +118,7 @@ struct NwUeRrcToRls : NtsMessage // RRC_PDU_DELIVERY rrc::RrcChannel channel{}; + uint32_t pduId{}; OctetString pdu{}; explicit NwUeRrcToRls(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_RLS), present(present) diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 6283ca7a8..36f42636c 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -91,6 +91,12 @@ void UeRlsTask::onLoop() break; } case NwUeRrcToRls::RRC_PDU_DELIVERY: { + auto *m = new NwUeRlsToRls(NwUeRlsToRls::UPLINK_RRC); + m->cellId = w->cellId; + m->rrcChannel = w->channel; + m->pduId = w->pduId; + m->data = std::move(w->pdu); + m_ctlTask->push(m); break; } } diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index b640f71bc..1d5b41445 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -94,6 +94,7 @@ void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH_Message *msg) } auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); + nw->cellId = cellId; nw->channel = rrc::RrcChannel::UL_CCCH; nw->pdu = std::move(pdu); m_base->rlsTask->push(nw); @@ -109,6 +110,7 @@ void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH1_Message *msg) } auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); + nw->cellId = cellId; nw->channel = rrc::RrcChannel::UL_CCCH1; nw->pdu = std::move(pdu); m_base->rlsTask->push(nw); diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp new file mode 100644 index 000000000..08e258eae --- /dev/null +++ b/src/ue/rrc/connection.cpp @@ -0,0 +1,58 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" + +#include +#include +#include + +#include +#include + +namespace nr::ue +{ + +static ASN_RRC_UL_CCCH_Message *ConstructSetupRequest(ASN_RRC_InitialUE_Identity_t initialUeId, + ASN_RRC_EstablishmentCause_t establishmentCause) +{ + auto *pdu = asn::New(); + pdu->message.present = ASN_RRC_UL_CCCH_MessageType_PR_c1; + pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1); + pdu->message.choice.c1->present = ASN_RRC_UL_CCCH_MessageType__c1_PR_rrcSetupRequest; + + auto &r = pdu->message.choice.c1->choice.rrcSetupRequest = asn::New(); + asn::DeepCopy(asn_DEF_ASN_RRC_InitialUE_Identity, initialUeId, &r->rrcSetupRequest.ue_Identity); + r->rrcSetupRequest.establishmentCause = establishmentCause; + asn::SetSpareBits<1>(r->rrcSetupRequest.spare); + + return pdu; +} + +void UeRrcTask::startConnectionSetup(OctetString &&nasPdu) +{ + // TODO: if it's already in progress + + if (m_initialId.present == ASN_RRC_InitialUE_Identity_PR_NOTHING) + { + m_initialId.present = ASN_RRC_InitialUE_Identity_PR_randomValue; + asn::SetBitStringLong<39>(static_cast(utils::Random64()), m_initialId.choice.randomValue); + } + + m_initialNasPdu = std::move(nasPdu); + + int activeCell = m_base->shCtx.currentCell.get([](auto &item) { return item.cellId; }); + + m_logger->debug("Sending RRC Setup Request"); + + auto *rrcSetupRequest = ConstructSetupRequest(m_initialId, ASN_RRC_EstablishmentCause_mo_Data); + sendRrcMessage(activeCell, rrcSetupRequest); + asn::Free(asn_DEF_ASN_RRC_UL_CCCH_Message, rrcSetupRequest); +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index 9b5fc1523..5233f3e47 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -32,37 +32,6 @@ namespace nr::ue { -void UeRrcTask::deliverInitialNas(OctetString &&nasPdu, long establishmentCause) -{ - /*if (m_state != ERrcState::RRC_IDLE) - { - m_logger->warn("Initial NAS delivery while not in RRC_IDLE, treating as uplink delivery"); - deliverUplinkNas(std::move(nasPdu)); - return; - } - - m_logger->debug("Sending RRC Setup Request"); - - auto *pdu = asn::New(); - pdu->message.present = ASN_RRC_UL_CCCH_MessageType_PR_c1; - pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1); - pdu->message.choice.c1->present = ASN_RRC_UL_CCCH_MessageType__c1_PR_rrcSetupRequest; - - m_initialId.present = ASN_RRC_InitialUE_Identity_PR_randomValue; - asn::SetBitStringLong<39>(utils::Random64(), m_initialId.choice.randomValue); - - auto &r = pdu->message.choice.c1->choice.rrcSetupRequest = asn::New(); - r->rrcSetupRequest.establishmentCause = establishmentCause; - asn::SetSpareBits<1>(r->rrcSetupRequest.spare); - asn::DeepCopy(asn_DEF_ASN_RRC_InitialUE_Identity, m_initialId, &r->rrcSetupRequest.ue_Identity); - - // TODO: Start T300 - - m_initialNasPdu = std::move(nasPdu); - m_lastSetupReq = ERrcLastSetupRequest::SETUP_REQUEST; - sendRrcMessage(pdu);*/ -} - void UeRrcTask::deliverUplinkNas(OctetString &&nasPdu) { auto *pdu = asn::New(); diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp index 474760907..7143d45d7 100644 --- a/src/ue/rrc/nas.cpp +++ b/src/ue/rrc/nas.cpp @@ -7,6 +7,7 @@ // #include "task.hpp" + #include #include #include @@ -32,7 +33,7 @@ void UeRrcTask::deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu) } else if (m_state == ERrcState::RRC_IDLE) { - // TODO + startConnectionSetup(std::move(nasPdu)); } } diff --git a/src/ue/rrc/sap.cpp b/src/ue/rrc/sap.cpp index f2a443196..2b3d1107c 100644 --- a/src/ue/rrc/sap.cpp +++ b/src/ue/rrc/sap.cpp @@ -7,6 +7,7 @@ // #include "task.hpp" + #include #include #include diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 3cd016efc..e7aa1784b 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -75,7 +75,6 @@ class UeRrcTask : public NtsTask private: /* Handlers */ void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu); - void deliverInitialNas(OctetString &&nasPdu, long establishmentCause); void deliverUplinkNas(OctetString &&nasPdu); void receiveRrcSetup(const ASN_RRC_RRCSetup &msg); @@ -123,6 +122,9 @@ class UeRrcTask : public NtsTask /* NAS Transport */ void deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu); + + /* Connection Control */ + void startConnectionSetup(OctetString &&nasPdu); }; } // namespace nr::ue From fd8b3c17e411848babb51ecea10d9a7c5f49a2d3 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 18:47:37 +0300 Subject: [PATCH 130/311] L3 RRC/NAS developments --- src/gnb/rrc/{rls_sap.cpp => sap.cpp} | 0 src/gnb/rrc/task.hpp | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/gnb/rrc/{rls_sap.cpp => sap.cpp} (100%) diff --git a/src/gnb/rrc/rls_sap.cpp b/src/gnb/rrc/sap.cpp similarity index 100% rename from src/gnb/rrc/rls_sap.cpp rename to src/gnb/rrc/sap.cpp diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 73db41929..95a416d69 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -102,7 +102,7 @@ class GnbRrcTask : public NtsTask void onBroadcastTimerExpired(); void triggerSysInfoBroadcast(); - /* RLS Service Access Point */ + /* Service Access Point */ void handleRlsSapMessage(NwGnbRlsToRrc &msg); }; From d76512226ab6e98b3d4f450e55f832c8de2a0364 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 19:18:54 +0300 Subject: [PATCH 131/311] L3 RRC/NAS developments --- src/gnb/nts.hpp | 6 ++++ src/gnb/rls/task.cpp | 6 +++- src/gnb/rrc/handler.cpp | 70 -------------------------------------- src/gnb/rrc/management.cpp | 25 -------------- src/gnb/rrc/sap.cpp | 6 +++- src/gnb/rrc/task.hpp | 14 +++++--- src/gnb/rrc/ues.cpp | 42 +++++++++++++++++++++++ 7 files changed, 67 insertions(+), 102 deletions(-) create mode 100644 src/gnb/rrc/ues.cpp diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index efaa158cd..caee7b2e9 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -37,11 +37,17 @@ struct NwGnbRlsToRrc : NtsMessage enum PR { SIGNAL_DETECTED, + UPLINK_RRC, } present; // SIGNAL_DETECTED + // UPLINK_RRC int ueId{}; + // UPLINK_RRC + OctetString data; + rrc::RrcChannel rrcChannel{}; + explicit NwGnbRlsToRrc(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RRC), present(present) { } diff --git a/src/gnb/rls/task.cpp b/src/gnb/rls/task.cpp index 241e0f3bb..6c3f67c27 100644 --- a/src/gnb/rls/task.cpp +++ b/src/gnb/rls/task.cpp @@ -59,7 +59,11 @@ void GnbRlsTask::onLoop() break; } case NwGnbRlsToRls::UPLINK_RRC: { - m_logger->debug("UPLINK_RRC ue[%d]", w->ueId); + auto *m = new NwGnbRlsToRrc(NwGnbRlsToRrc::UPLINK_RRC); + m->ueId = w->ueId; + m->rrcChannel = w->rrcChannel; + m->data = std::move(w->data); + m_base->rrcTask->push(m); break; } case NwGnbRlsToRls::RADIO_LINK_FAILURE: { diff --git a/src/gnb/rrc/handler.cpp b/src/gnb/rrc/handler.cpp index 300e7b15c..afd913647 100644 --- a/src/gnb/rrc/handler.cpp +++ b/src/gnb/rrc/handler.cpp @@ -72,76 +72,6 @@ void GnbRrcTask::receiveUplinkInformationTransfer(int ueId, const ASN_RRC_ULInfo ueId, asn::GetOctetString(*msg.criticalExtensions.choice.ulInformationTransfer->dedicatedNAS_Message)); } -void GnbRrcTask::receiveRrcSetupRequest(int ueId, const ASN_RRC_RRCSetupRequest &msg) -{ - auto *ue = tryFindUe(ueId); - if (ue) - { - m_logger->warn("Discarding RRC Setup Request, UE context already exists"); - return; - } - - if (msg.rrcSetupRequest.ue_Identity.present == ASN_RRC_InitialUE_Identity_PR_ng_5G_S_TMSI_Part1) - { - m_logger->err("RRC Setup Request with TMSI not implemented yet"); - return; - } - - if (msg.rrcSetupRequest.ue_Identity.present != ASN_RRC_InitialUE_Identity_PR_randomValue) - { - m_logger->err("Bad message"); - return; - } - - int64_t initialRandomId = asn::GetBitStringLong<39>(msg.rrcSetupRequest.ue_Identity.choice.randomValue); - if (tryFindByInitialRandomId(initialRandomId) != nullptr) - { - m_logger->err("Initial random ID conflict [%ld], discarding RRC Setup Request", initialRandomId); - return; - } - - ue = createUe(ueId); - ue->initialRandomId = initialRandomId; - ue->establishmentCause = msg.rrcSetupRequest.establishmentCause; - - // Prepare RRC Setup - auto *pdu = asn::New(); - pdu->message.present = ASN_RRC_DL_CCCH_MessageType_PR_c1; - pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1); - pdu->message.choice.c1->present = ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcSetup; - auto &rrcSetup = pdu->message.choice.c1->choice.rrcSetup = asn::New(); - rrcSetup->rrc_TransactionIdentifier = getNextTid(); - rrcSetup->criticalExtensions.present = ASN_RRC_RRCSetup__criticalExtensions_PR_rrcSetup; - auto &rrcSetupIEs = rrcSetup->criticalExtensions.choice.rrcSetup = asn::New(); - - ASN_RRC_CellGroupConfig masterCellGroup{}; - masterCellGroup.cellGroupId = 0; - - asn::SetOctetString(rrcSetupIEs->masterCellGroup, - rrc::encode::EncodeS(asn_DEF_ASN_RRC_CellGroupConfig, &masterCellGroup)); - - m_logger->info("RRC Setup for UE[%d]", ueId); - sendRrcMessage(ueId, pdu); -} - -void GnbRrcTask::receiveRrcSetupComplete(int ueId, const ASN_RRC_RRCSetupComplete &msg) -{ - if (msg.criticalExtensions.present != ASN_RRC_RRCSetupComplete__criticalExtensions_PR_rrcSetupComplete) - return; - - auto *ue = findUe(ueId); - if (!ue) - return; - - auto setupComplete = msg.criticalExtensions.choice.rrcSetupComplete; - - auto *w = new NwGnbRrcToNgap(NwGnbRrcToNgap::INITIAL_NAS_DELIVERY); - w->ueId = ueId; - w->pdu = asn::GetOctetString(setupComplete->dedicatedNAS_Message); - w->rrcEstablishmentCause = ue->establishmentCause; - m_base->ngapTask->push(w); -} - void GnbRrcTask::releaseConnection(int ueId) { m_logger->info("Releasing RRC connection for UE[%d]", ueId); diff --git a/src/gnb/rrc/management.cpp b/src/gnb/rrc/management.cpp index 7740317e1..d6765725c 100644 --- a/src/gnb/rrc/management.cpp +++ b/src/gnb/rrc/management.cpp @@ -11,31 +11,6 @@ namespace nr::gnb { -RrcUeContext *GnbRrcTask::tryFindUe(int id) -{ - if (m_ueCtx.count(id)) - return m_ueCtx[id]; - return nullptr; -} - -RrcUeContext *GnbRrcTask::findUe(int id) -{ - auto *ue = tryFindUe(id); - if (ue == nullptr) - { - m_logger->err("UE context with ID[%d] not found", id); - return ue; - } - return ue; -} - -RrcUeContext *GnbRrcTask::createUe(int id) -{ - auto *ctx = new RrcUeContext(id); - m_ueCtx[id] = ctx; - return ctx; -} - RrcUeContext *GnbRrcTask::tryFindByInitialRandomId(int64_t id) { if (id == -1) diff --git a/src/gnb/rrc/sap.cpp b/src/gnb/rrc/sap.cpp index 8d14aecf3..435e226ef 100644 --- a/src/gnb/rrc/sap.cpp +++ b/src/gnb/rrc/sap.cpp @@ -19,10 +19,14 @@ void GnbRrcTask::handleRlsSapMessage(NwGnbRlsToRrc &msg) switch (msg.present) { case NwGnbRlsToRrc::SIGNAL_DETECTED: { - m_logger->info("UE[%d] new signal detected", msg.ueId); + m_logger->debug("UE[%d] new signal detected", msg.ueId); triggerSysInfoBroadcast(); break; } + case NwGnbRlsToRrc::UPLINK_RRC: { + handleUplinkRrc(msg.ueId, msg.rrcChannel, msg.data); + break; + } } } diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 95a416d69..5dd91bcfd 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -66,9 +66,6 @@ class GnbRrcTask : public NtsTask private: /* Management */ - RrcUeContext *tryFindUe(int id); - RrcUeContext *findUe(int id); - RrcUeContext *createUe(int id); RrcUeContext *tryFindByInitialRandomId(int64_t id); int getNextTid(); @@ -82,8 +79,6 @@ class GnbRrcTask : public NtsTask const asn::Unique &taiList); void receiveUplinkInformationTransfer(int ueId, const ASN_RRC_ULInformationTransfer &msg); - void receiveRrcSetupRequest(int ueId, const ASN_RRC_RRCSetupRequest &msg); - void receiveRrcSetupComplete(int ueId, const ASN_RRC_RRCSetupComplete &msg); /* RRC channel send message */ void sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg); @@ -104,6 +99,15 @@ class GnbRrcTask : public NtsTask /* Service Access Point */ void handleRlsSapMessage(NwGnbRlsToRrc &msg); + + /* UE Management */ + RrcUeContext *createUe(int id); + RrcUeContext *tryFindUe(int id); + RrcUeContext *findUe(int id); + + /* Connection Control */ + void receiveRrcSetupRequest(int ueId, const ASN_RRC_RRCSetupRequest &msg); + void receiveRrcSetupComplete(int ueId, const ASN_RRC_RRCSetupComplete &msg); }; } // namespace nr::gnb diff --git a/src/gnb/rrc/ues.cpp b/src/gnb/rrc/ues.cpp new file mode 100644 index 000000000..18a530c53 --- /dev/null +++ b/src/gnb/rrc/ues.cpp @@ -0,0 +1,42 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" + +#include +#include + +namespace nr::gnb +{ + +RrcUeContext *GnbRrcTask::createUe(int id) +{ + auto *ctx = new RrcUeContext(id); + m_ueCtx[id] = ctx; + return ctx; +} + +RrcUeContext *GnbRrcTask::tryFindUe(int id) +{ + if (m_ueCtx.count(id)) + return m_ueCtx[id]; + return nullptr; +} + +RrcUeContext *GnbRrcTask::findUe(int id) +{ + auto *ue = tryFindUe(id); + if (ue == nullptr) + { + m_logger->err("UE context with ID[%d] not found", id); + return ue; + } + return ue; +} + +} // namespace nr::gnb From 7fceda7f94d139af61f2f0f460eba01079d4edb8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 19:21:19 +0300 Subject: [PATCH 132/311] L3 RRC/NAS developments --- src/gnb/rrc/connection.cpp | 110 +++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/gnb/rrc/connection.cpp diff --git a/src/gnb/rrc/connection.cpp b/src/gnb/rrc/connection.cpp new file mode 100644 index 000000000..cedfa6992 --- /dev/null +++ b/src/gnb/rrc/connection.cpp @@ -0,0 +1,110 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace nr::gnb +{ + +void GnbRrcTask::receiveRrcSetupRequest(int ueId, const ASN_RRC_RRCSetupRequest &msg) +{ + auto *ue = tryFindUe(ueId); + if (ue) + { + // TODO: handle this more properly + m_logger->warn("Discarding RRC Setup Request, UE context already exists"); + return; + } + + if (msg.rrcSetupRequest.ue_Identity.present == ASN_RRC_InitialUE_Identity_PR_ng_5G_S_TMSI_Part1) + { + m_logger->err("RRC Setup Request with TMSI not implemented yet"); + return; + } + + if (msg.rrcSetupRequest.ue_Identity.present != ASN_RRC_InitialUE_Identity_PR_randomValue) + { + m_logger->err("Bad constructed RRC message ignored"); + return; + } + + int64_t initialRandomId = asn::GetBitStringLong<39>(msg.rrcSetupRequest.ue_Identity.choice.randomValue); + if (tryFindByInitialRandomId(initialRandomId) != nullptr) + { + m_logger->err("Initial random ID conflict [%ld], discarding RRC Setup Request", initialRandomId); + return; + } + + ue = createUe(ueId); + ue->initialRandomId = initialRandomId; + ue->establishmentCause = msg.rrcSetupRequest.establishmentCause; + + // Prepare RRC Setup + auto *pdu = asn::New(); + pdu->message.present = ASN_RRC_DL_CCCH_MessageType_PR_c1; + pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1); + pdu->message.choice.c1->present = ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcSetup; + auto &rrcSetup = pdu->message.choice.c1->choice.rrcSetup = asn::New(); + rrcSetup->rrc_TransactionIdentifier = getNextTid(); + rrcSetup->criticalExtensions.present = ASN_RRC_RRCSetup__criticalExtensions_PR_rrcSetup; + auto &rrcSetupIEs = rrcSetup->criticalExtensions.choice.rrcSetup = asn::New(); + + ASN_RRC_CellGroupConfig masterCellGroup{}; + masterCellGroup.cellGroupId = 0; + + asn::SetOctetString(rrcSetupIEs->masterCellGroup, + rrc::encode::EncodeS(asn_DEF_ASN_RRC_CellGroupConfig, &masterCellGroup)); + + m_logger->info("RRC Setup for UE[%d]", ueId); + sendRrcMessage(ueId, pdu); +} + +void GnbRrcTask::receiveRrcSetupComplete(int ueId, const ASN_RRC_RRCSetupComplete &msg) +{ + auto *ue = findUe(ueId); + if (!ue) + return; + + auto setupComplete = msg.criticalExtensions.choice.rrcSetupComplete; + + auto *w = new NwGnbRrcToNgap(NwGnbRrcToNgap::INITIAL_NAS_DELIVERY); + w->ueId = ueId; + w->pdu = asn::GetOctetString(setupComplete->dedicatedNAS_Message); + w->rrcEstablishmentCause = ue->establishmentCause; + m_base->ngapTask->push(w); +} + +} // namespace nr::gnb From f0072a0aca52681ade8a81d779feb0b687b88f84 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 20:09:30 +0300 Subject: [PATCH 133/311] L3 RRC/NAS developments --- src/ue/rrc/channel.cpp | 4 ++-- src/ue/rrc/connection.cpp | 47 ++++++++++++++++++++++++++++++++++++++- src/ue/rrc/handler.cpp | 35 ----------------------------- src/ue/rrc/state.cpp | 14 ++++++++++++ src/ue/rrc/task.hpp | 8 +++---- src/ue/types.cpp | 15 +++++++++++++ src/ue/types.hpp | 1 + 7 files changed, 82 insertions(+), 42 deletions(-) diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index 1d5b41445..6207a05fe 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -162,10 +162,10 @@ void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_DL_CCCH_Message *msg) switch (c1->present) { case ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcReject: - receiveRrcReject(*c1->choice.rrcReject); + receiveRrcReject(cellId, *c1->choice.rrcReject); break; case ASN_RRC_DL_CCCH_MessageType__c1_PR_rrcSetup: - receiveRrcSetup(*c1->choice.rrcSetup); + receiveRrcSetup(cellId, *c1->choice.rrcSetup); break; default: break; diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp index 08e258eae..1786697f7 100644 --- a/src/ue/rrc/connection.cpp +++ b/src/ue/rrc/connection.cpp @@ -12,6 +12,10 @@ #include #include +#include +#include +#include +#include #include #include @@ -55,4 +59,45 @@ void UeRrcTask::startConnectionSetup(OctetString &&nasPdu) asn::Free(asn_DEF_ASN_RRC_UL_CCCH_Message, rrcSetupRequest); } -} // namespace nr::ue \ No newline at end of file +void UeRrcTask::receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg) +{ + if (!isActiveCell(cellId)) + return; + + if (m_lastSetupReq != ERrcLastSetupRequest::SETUP_REQUEST) + { + // TODO + return; + } + + auto *pdu = asn::New(); + pdu->message.present = ASN_RRC_UL_DCCH_MessageType_PR_c1; + pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1); + pdu->message.choice.c1->present = ASN_RRC_UL_DCCH_MessageType__c1_PR_rrcSetupComplete; + + auto &setupComplete = pdu->message.choice.c1->choice.rrcSetupComplete = asn::New(); + setupComplete->rrc_TransactionIdentifier = msg.rrc_TransactionIdentifier; + setupComplete->criticalExtensions.present = ASN_RRC_RRCSetupComplete__criticalExtensions_PR_rrcSetupComplete; + + auto &ies = setupComplete->criticalExtensions.choice.rrcSetupComplete = asn::New(); + ies->selectedPLMN_Identity = 1; + asn::SetOctetString(ies->dedicatedNAS_Message, m_initialNasPdu); + + m_initialNasPdu = {}; + sendRrcMessage(pdu); + + m_logger->info("RRC connection established"); + switchState(ERrcState::RRC_CONNECTED); + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_SETUP)); +} + +void UeRrcTask::receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg) +{ + if (!isActiveCell(cellId)) + return; + + // TODO + m_logger->err("RRC Reject received"); +} + +} // namespace nr::ue diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index 5233f3e47..9204517f2 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -51,41 +51,6 @@ void UeRrcTask::deliverUplinkNas(OctetString &&nasPdu) sendRrcMessage(pdu); } -void UeRrcTask::receiveRrcSetup(const ASN_RRC_RRCSetup &msg) -{ - if (m_lastSetupReq != ERrcLastSetupRequest::SETUP_REQUEST) - { - // TODO - return; - } - - m_state = ERrcState::RRC_CONNECTED; - - auto *pdu = asn::New(); - pdu->message.present = ASN_RRC_UL_DCCH_MessageType_PR_c1; - pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1); - pdu->message.choice.c1->present = ASN_RRC_UL_DCCH_MessageType__c1_PR_rrcSetupComplete; - auto &setupComplete = pdu->message.choice.c1->choice.rrcSetupComplete = asn::New(); - setupComplete->rrc_TransactionIdentifier = msg.rrc_TransactionIdentifier; - setupComplete->criticalExtensions.present = ASN_RRC_RRCSetupComplete__criticalExtensions_PR_rrcSetupComplete; - auto &ies = setupComplete->criticalExtensions.choice.rrcSetupComplete = asn::New(); - ies->selectedPLMN_Identity = 1; - asn::SetOctetString(ies->dedicatedNAS_Message, m_initialNasPdu); - m_initialNasPdu = {}; - - m_logger->info("RRC connection established"); - - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_SETUP)); - - sendRrcMessage(pdu); -} - -void UeRrcTask::receiveRrcReject(const ASN_RRC_RRCReject &msg) -{ - // TODO - m_logger->err("RRC Reject received"); -} - void UeRrcTask::receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg) { OctetString nasPdu = diff --git a/src/ue/rrc/state.cpp b/src/ue/rrc/state.cpp index 1ac14f772..df3be6c23 100644 --- a/src/ue/rrc/state.cpp +++ b/src/ue/rrc/state.cpp @@ -36,4 +36,18 @@ void UeRrcTask::performCycle() } } +void UeRrcTask::switchState(ERrcState state) +{ + ERrcState oldState = m_state; + m_state = state; + + m_logger->info("UE switches to state [%s]", ToJson(state).str().c_str()); + onSwitchState(oldState, state); +} + +void UeRrcTask::onSwitchState(ERrcState oldState, ERrcState newState) +{ + +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index e7aa1784b..8d018e0e4 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -76,13 +76,9 @@ class UeRrcTask : public NtsTask /* Handlers */ void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu); void deliverUplinkNas(OctetString &&nasPdu); - - void receiveRrcSetup(const ASN_RRC_RRCSetup &msg); - void receiveRrcReject(const ASN_RRC_RRCReject &msg); void receiveRrcRelease(const ASN_RRC_RRCRelease &msg); void receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg); void receivePaging(const ASN_RRC_Paging &msg); - void handleRadioLinkFailure(); /* RRC Message Transmission and Receive */ @@ -102,6 +98,8 @@ class UeRrcTask : public NtsTask /* State Management */ void triggerCycle(); void performCycle(); + void switchState(ERrcState state); + void onSwitchState(ERrcState oldState, ERrcState newState); /* Idle Mode Operations */ void performCellSelection(); @@ -125,6 +123,8 @@ class UeRrcTask : public NtsTask /* Connection Control */ void startConnectionSetup(OctetString &&nasPdu); + void receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg); + void receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg); }; } // namespace nr::ue diff --git a/src/ue/types.cpp b/src/ue/types.cpp index 41b5808a2..e1c4f3e57 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -68,6 +68,21 @@ Json ToJson(const EMmState &state) } } +Json ToJson(const ERrcState &state) +{ + switch (state) + { + case ERrcState::RRC_IDLE: + return "RRC-IDLE"; + case ERrcState::RRC_CONNECTED: + return "RRC-CONNECTED"; + case ERrcState::RRC_INACTIVE: + return "RRC-INACTIVE"; + default: + return "?"; + } +} + Json ToJson(const EMmSubState &state) { switch (state) diff --git a/src/ue/types.hpp b/src/ue/types.hpp index a7a04be13..ad1e09dc9 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -547,5 +547,6 @@ Json ToJson(const ERegUpdateCause &v); Json ToJson(const EPsState &v); Json ToJson(const UePduSessionInfo &v); Json ToJson(const EServiceReqCause &v); +Json ToJson(const ERrcState &v); } // namespace nr::ue From 3cccea9f587d79ebb0b04693d5f9de8d7da66961 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 18 May 2021 20:12:10 +0300 Subject: [PATCH 134/311] L3 RRC/NAS developments --- src/lib/app/monitor.hpp | 1 + src/ue/rrc/state.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib/app/monitor.hpp b/src/lib/app/monitor.hpp index d8d599df9..848fefd4c 100644 --- a/src/lib/app/monitor.hpp +++ b/src/lib/app/monitor.hpp @@ -36,6 +36,7 @@ enum class StateType RM, CM, U5, + RRC }; class INodeListener diff --git a/src/ue/rrc/state.cpp b/src/ue/rrc/state.cpp index df3be6c23..bcde6b035 100644 --- a/src/ue/rrc/state.cpp +++ b/src/ue/rrc/state.cpp @@ -42,12 +42,18 @@ void UeRrcTask::switchState(ERrcState state) m_state = state; m_logger->info("UE switches to state [%s]", ToJson(state).str().c_str()); + + if (m_base->nodeListener) + { + m_base->nodeListener->onSwitch(app::NodeType::UE, m_base->config->getNodeName(), app::StateType::RRC, + ToJson(oldState).str(), ToJson(state).str()); + } + onSwitchState(oldState, state); } void UeRrcTask::onSwitchState(ERrcState oldState, ERrcState newState) { - } } // namespace nr::ue \ No newline at end of file From f267bee9569f94b426ca74c62ed0e5e3f34de420 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 19 May 2021 13:28:04 +0300 Subject: [PATCH 135/311] L3 RRC/NAS developments --- src/ue/nas/mm/auth.cpp | 2 ++ src/ue/rrc/channel.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index 67f38b71e..a5e0aed02 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -16,6 +16,8 @@ namespace nr::ue void NasMm::receiveAuthenticationRequest(const nas::AuthenticationRequest &msg) { + m_logger->debug("Authentication Request received."); + if (!m_usim->isValid()) { m_logger->warn("Authentication request is ignored. USIM is invalid"); diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index 6207a05fe..d1330a776 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -126,6 +126,7 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) } auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); + nw->cellId = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); nw->channel = rrc::RrcChannel::UL_DCCH; nw->pdu = std::move(pdu); m_base->rlsTask->push(nw); From 07ed4cbfeb2a89e65b976a75f73d3a7d93bbbf66 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 19 May 2021 13:48:31 +0300 Subject: [PATCH 136/311] L3 RRC/NAS developments --- src/ue/nas/mm/messaging.cpp | 2 +- src/ue/rrc/handler.cpp | 19 ------------------- src/ue/rrc/nas.cpp | 32 ++++++++++++++++++++++++++------ src/ue/rrc/task.hpp | 1 - 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/ue/nas/mm/messaging.cpp b/src/ue/nas/mm/messaging.cpp index 7027323a5..8ef0c9e1b 100644 --- a/src/ue/nas/mm/messaging.cpp +++ b/src/ue/nas/mm/messaging.cpp @@ -123,7 +123,7 @@ void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) if (msg.messageType == nas::EMessageType::REGISTRATION_REQUEST || msg.messageType == nas::EMessageType::SERVICE_REQUEST) { - if (HasNonCleartext(msg)) + if (HasNonCleartext(msg) && m_cmState == ECmState::CM_IDLE) { OctetString originalPdu; nas::EncodeNasMessage(msg, originalPdu); diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index 9204517f2..ce14afa5e 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -32,25 +32,6 @@ namespace nr::ue { -void UeRrcTask::deliverUplinkNas(OctetString &&nasPdu) -{ - auto *pdu = asn::New(); - pdu->message.present = ASN_RRC_UL_DCCH_MessageType_PR_c1; - pdu->message.choice.c1 = - asn::New(); - pdu->message.choice.c1->present = ASN_RRC_UL_DCCH_MessageType__c1_PR_ulInformationTransfer; - pdu->message.choice.c1->choice.ulInformationTransfer = asn::New(); - - auto &c1 = pdu->message.choice.c1->choice.ulInformationTransfer->criticalExtensions; - c1.present = ASN_RRC_ULInformationTransfer__criticalExtensions_PR_ulInformationTransfer; - c1.choice.ulInformationTransfer = asn::New(); - c1.choice.ulInformationTransfer->dedicatedNAS_Message = asn::New(); - - asn::SetOctetString(*c1.choice.ulInformationTransfer->dedicatedNAS_Message, nasPdu); - - sendRrcMessage(pdu); -} - void UeRrcTask::receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg) { OctetString nasPdu = diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp index 7143d45d7..a43e1260d 100644 --- a/src/ue/rrc/nas.cpp +++ b/src/ue/rrc/nas.cpp @@ -12,6 +12,9 @@ #include #include +#include +#include + namespace nr::ue { @@ -23,18 +26,35 @@ void UeRrcTask::deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu) return; } - if (m_state == ERrcState::RRC_CONNECTED) + if (nasPdu.length() == 0) + return; + + if (m_state == ERrcState::RRC_IDLE) { - // TODO + startConnectionSetup(std::move(nasPdu)); + return; } else if (m_state == ERrcState::RRC_INACTIVE) { // TODO + return; } - else if (m_state == ERrcState::RRC_IDLE) - { - startConnectionSetup(std::move(nasPdu)); - } + + auto *pdu = asn::New(); + pdu->message.present = ASN_RRC_UL_DCCH_MessageType_PR_c1; + pdu->message.choice.c1 = + asn::New(); + pdu->message.choice.c1->present = ASN_RRC_UL_DCCH_MessageType__c1_PR_ulInformationTransfer; + pdu->message.choice.c1->choice.ulInformationTransfer = asn::New(); + + auto &c1 = pdu->message.choice.c1->choice.ulInformationTransfer->criticalExtensions; + c1.present = ASN_RRC_ULInformationTransfer__criticalExtensions_PR_ulInformationTransfer; + c1.choice.ulInformationTransfer = asn::New(); + c1.choice.ulInformationTransfer->dedicatedNAS_Message = asn::New(); + + asn::SetOctetString(*c1.choice.ulInformationTransfer->dedicatedNAS_Message, nasPdu); + + sendRrcMessage(pdu); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 8d018e0e4..a2515d0ec 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -75,7 +75,6 @@ class UeRrcTask : public NtsTask private: /* Handlers */ void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu); - void deliverUplinkNas(OctetString &&nasPdu); void receiveRrcRelease(const ASN_RRC_RRCRelease &msg); void receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg); void receivePaging(const ASN_RRC_Paging &msg); From 96407574ea4b5a83637de2f0f12bd442c094cbd1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 19 May 2021 14:16:09 +0300 Subject: [PATCH 137/311] L3 RRC/NAS developments --- src/ue/nas/mm/access.cpp | 7 ++++--- src/ue/nas/mm/auth.cpp | 20 ++++++++++---------- src/ue/nas/mm/dereg.cpp | 3 ++- src/ue/nas/mm/radio.cpp | 2 -- src/ue/nas/mm/register.cpp | 8 ++++---- src/ue/nas/mm/service.cpp | 2 +- src/ue/nas/usim/usim.hpp | 1 - src/ue/types.cpp | 5 +++++ src/ue/types.hpp | 4 +++- 9 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index 3eb1b20bd..788cd1505 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -47,10 +47,11 @@ bool NasMm::isInNonAllowedArea() { if (!m_usim->isValid()) return false; - if (!m_usim->m_currentPlmn.has_value()) - return false; - auto &plmn = *m_usim->m_currentPlmn; + auto plmn = m_base->shCtx.getCurrentPlmn(); + + if (!plmn.hasValue()) + return false; if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->m_serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) return true; diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index a5e0aed02..bd95cab47 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -16,7 +16,7 @@ namespace nr::ue void NasMm::receiveAuthenticationRequest(const nas::AuthenticationRequest &msg) { - m_logger->debug("Authentication Request received."); + m_logger->debug("Authentication Request received"); if (!m_usim->isValid()) { @@ -111,7 +111,7 @@ void NasMm::receiveAuthenticationRequestEap(const nas::AuthenticationRequest &ms return; } - auto snn = keys::ConstructServingNetworkName(*m_usim->m_currentPlmn); + auto snn = keys::ConstructServingNetworkName(m_base->shCtx.getCurrentPlmn()); if (receivedEap.attributes.getKdfInput() != OctetString::FromAscii(snn)) { @@ -196,7 +196,7 @@ void NasMm::receiveAuthenticationRequestEap(const nas::AuthenticationRequest &ms m_usim->m_nonCurrentNsCtx->keys.kAusf = keys::CalculateKAusfFor5gAka(milenage.ck, milenage.ik, snn, sqnXorAk); m_usim->m_nonCurrentNsCtx->keys.abba = msg.abba.rawData.copy(); - keys::DeriveKeysSeafAmf(*m_base->config, *m_usim->m_currentPlmn, *m_usim->m_nonCurrentNsCtx); + keys::DeriveKeysSeafAmf(*m_base->config, m_base->shCtx.getCurrentPlmn(), *m_usim->m_nonCurrentNsCtx); // Send response m_nwConsecutiveAuthFailure = 0; @@ -346,7 +346,7 @@ void NasMm::receiveAuthenticationRequest5gAka(const nas::AuthenticationRequest & auto milenage = calculateMilenage(m_usim->m_sqnMng->getSqn(), rand, false); auto ckIk = OctetString::Concat(milenage.ck, milenage.ik); auto sqnXorAk = OctetString::Xor(m_usim->m_sqnMng->getSqn(), milenage.ak); - auto snn = keys::ConstructServingNetworkName(*m_usim->m_currentPlmn); + auto snn = keys::ConstructServingNetworkName(m_base->shCtx.getCurrentPlmn()); // Store the relevant parameters m_usim->m_rand = rand.copy(); @@ -359,7 +359,7 @@ void NasMm::receiveAuthenticationRequest5gAka(const nas::AuthenticationRequest & m_usim->m_nonCurrentNsCtx->keys.kAusf = keys::CalculateKAusfFor5gAka(milenage.ck, milenage.ik, snn, sqnXorAk); m_usim->m_nonCurrentNsCtx->keys.abba = msg.abba.rawData.copy(); - keys::DeriveKeysSeafAmf(*m_base->config, *m_usim->m_currentPlmn, *m_usim->m_nonCurrentNsCtx); + keys::DeriveKeysSeafAmf(*m_base->config, m_base->shCtx.getCurrentPlmn(), *m_usim->m_nonCurrentNsCtx); // Send response m_nwConsecutiveAuthFailure = 0; @@ -413,7 +413,7 @@ void NasMm::receiveAuthenticationResult(const nas::AuthenticationResult &msg) void NasMm::receiveAuthenticationReject(const nas::AuthenticationReject &msg) { - m_logger->err("Authentication Reject received."); + m_logger->err("Authentication Reject received"); // The RAND and RES* values stored in the ME shall be deleted and timer T3516, if running, shall be stopped m_usim->m_rand = {}; @@ -524,10 +524,10 @@ bool NasMm::networkFailingTheAuthCheck(bool hasChance) m_logger->err("Network failing the authentication check"); if (m_cmState == ECmState::CM_CONNECTED) - { - localReleaseConnection(); - // TODO: treat the active cell as barred - } + { + localReleaseConnection(); + // TODO: treat the active cell as barred + } m_timers->t3520.stop(); return true; diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 0c4e33e64..2e5d65ac3 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -241,7 +241,8 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi if (cause == nas::EMmCause::PLMN_NOT_ALLOWED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(*m_usim->m_currentPlmn)); + nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, + nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); } if (cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index ee5e6eb6b..eb24a6941 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -175,7 +175,6 @@ void NasMm::handleServingCellChange(const UeCellInfo &servingCell) resetRegAttemptCounter(); m_usim->m_servingCell = servingCell; - m_usim->m_currentPlmn = servingCell.cellId.plmn; m_usim->m_currentTai = nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(servingCell.cellId.plmn), octet3{servingCell.tac}}; } @@ -198,7 +197,6 @@ void NasMm::handleRadioLinkFailure() } m_usim->m_servingCell = std::nullopt; - m_usim->m_currentPlmn = std::nullopt; m_usim->m_currentTai = std::nullopt; handleRrcConnectionRelease(); diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 7c5e13b6a..8a5a2bcaa 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -246,7 +246,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) }); } // .. in addition, the UE shall add to the stored list the PLMN code of the registered PLMN that sent the list - nas::utils::AddToPlmnList(m_usim->m_equivalentPlmnList, nas::utils::PlmnFrom(*m_usim->m_currentPlmn)); + nas::utils::AddToPlmnList(m_usim->m_equivalentPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); // Upon receipt of the REGISTRATION ACCEPT message, the UE shall reset the registration attempt counter, enter state // 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED. @@ -352,7 +352,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg }); } // .. in addition, the UE shall add to the stored list the PLMN code of the registered PLMN that sent the list - nas::utils::AddToPlmnList(m_usim->m_equivalentPlmnList, nas::utils::PlmnFrom(*m_usim->m_currentPlmn)); + nas::utils::AddToPlmnList(m_usim->m_equivalentPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); // Store the service area list m_storage->m_serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); @@ -574,7 +574,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(*m_usim->m_currentPlmn)); + nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); } if (cause == nas::EMmCause::CONGESTION) @@ -738,7 +738,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(*m_usim->m_currentPlmn)); + nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); } if (cause == nas::EMmCause::CONGESTION) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 8e51254bf..28056078d 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -305,7 +305,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(*m_usim->m_currentPlmn)); + nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); } if (cause == nas::EMmCause::TA_NOT_ALLOWED) diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 81e5dc039..35eaace9a 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -36,7 +36,6 @@ class Usim // Plmn related std::optional m_servingCell{}; - std::optional m_currentPlmn{}; std::optional m_currentTai{}; std::optional m_lastVisitedRegisteredTai{}; nas::IE5gsTrackingAreaIdentityList m_taiList{}; diff --git a/src/ue/types.cpp b/src/ue/types.cpp index e1c4f3e57..d35ce7fc4 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -294,4 +294,9 @@ bool CurrentCellInfo::hasValue() const return cellId != 0; } +Plmn UeSharedContext::getCurrentPlmn() +{ + return currentCell.get([](auto &value) { return value.plmn; }); +} + } // namespace nr::ue diff --git a/src/ue/types.hpp b/src/ue/types.hpp index ad1e09dc9..5211b9d83 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include #include #include @@ -165,6 +165,8 @@ struct UeSharedContext Locked currentCell; Locked> forbiddenTaiRoaming; Locked> forbiddenTaiRps; + + Plmn getCurrentPlmn(); }; struct TaskBase From b971397be8c5a048161146fff19c9db979d3608d Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 19 May 2021 14:17:15 +0300 Subject: [PATCH 138/311] L3 RRC/NAS developments --- src/ue/rrc/nas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp index a43e1260d..589be978b 100644 --- a/src/ue/rrc/nas.cpp +++ b/src/ue/rrc/nas.cpp @@ -22,7 +22,7 @@ void UeRrcTask::deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu) { if (!m_base->shCtx.currentCell.get([](auto &value) { return value.hasValue(); })) { - m_logger->err("Uplink NAS delivery failed. No cell is active"); + m_logger->err("Uplink NAS delivery failed. No active cell"); return; } From f64410e895ad87875699500434ae31c8f2387efe Mon Sep 17 00:00:00 2001 From: aligungr Date: Wed, 19 May 2021 14:47:11 +0300 Subject: [PATCH 139/311] L3 RRC/NAS developments --- src/ue/rrc/connection.cpp | 7 +++++++ src/ue/rrc/handler.cpp | 17 ----------------- src/ue/rrc/nas.cpp | 12 ++++++++++++ src/ue/rrc/task.hpp | 9 +++++---- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp index 1786697f7..f86140264 100644 --- a/src/ue/rrc/connection.cpp +++ b/src/ue/rrc/connection.cpp @@ -100,4 +100,11 @@ void UeRrcTask::receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg) m_logger->err("RRC Reject received"); } +void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) +{ + m_logger->debug("RRC Release received"); + m_state = ERrcState::RRC_IDLE; + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); +} + } // namespace nr::ue diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index ce14afa5e..d87c897b6 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -32,23 +32,6 @@ namespace nr::ue { -void UeRrcTask::receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg) -{ - OctetString nasPdu = - asn::GetOctetString(*msg.criticalExtensions.choice.dlInformationTransfer->dedicatedNAS_Message); - - auto *nw = new NwUeRrcToNas(NwUeRrcToNas::NAS_DELIVERY); - nw->nasPdu = std::move(nasPdu); - m_base->nasTask->push(nw); -} - -void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) -{ - m_logger->debug("RRC Release received"); - m_state = ERrcState::RRC_IDLE; - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); -} - void UeRrcTask::receivePaging(const ASN_RRC_Paging &msg) { std::vector tmsiIds{}; diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp index 589be978b..662f50961 100644 --- a/src/ue/rrc/nas.cpp +++ b/src/ue/rrc/nas.cpp @@ -12,6 +12,8 @@ #include #include +#include +#include #include #include @@ -57,4 +59,14 @@ void UeRrcTask::deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu) sendRrcMessage(pdu); } +void UeRrcTask::receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg) +{ + OctetString nasPdu = + asn::GetOctetString(*msg.criticalExtensions.choice.dlInformationTransfer->dedicatedNAS_Message); + + auto *nw = new NwUeRrcToNas(NwUeRrcToNas::NAS_DELIVERY); + nw->nasPdu = std::move(nasPdu); + m_base->nasTask->push(nw); +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index a2515d0ec..a39bf6c55 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -74,13 +74,11 @@ class UeRrcTask : public NtsTask private: /* Handlers */ - void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu); - void receiveRrcRelease(const ASN_RRC_RRCRelease &msg); - void receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg); void receivePaging(const ASN_RRC_Paging &msg); void handleRadioLinkFailure(); /* RRC Message Transmission and Receive */ + void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu); void sendRrcMessage(int cellId, ASN_RRC_UL_CCCH_Message *msg); void sendRrcMessage(int cellId, ASN_RRC_UL_CCCH1_Message *msg); void sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg); @@ -113,17 +111,20 @@ class UeRrcTask : public NtsTask bool isActiveCell(int cellId); void updateAvailablePlmns(); - /* System Information */ + /* System Information and Broadcast */ void receiveMib(int cellId, const ASN_RRC_MIB &msg); void receiveSib1(int cellId, const ASN_RRC_SIB1 &msg); /* NAS Transport */ void deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu); + void receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg); /* Connection Control */ void startConnectionSetup(OctetString &&nasPdu); void receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg); void receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg); + void receiveRrcRelease(const ASN_RRC_RRCRelease &msg); + }; } // namespace nr::ue From a90b92e577532686b365f0f23f9b7dd8534bbd9f Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 14:57:30 +0300 Subject: [PATCH 140/311] L3 RRC/NAS developments --- src/ue/nas/mm/service.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 28056078d..ff8a8f142 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -373,12 +373,6 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); - - setN1Capability(false); - } - - if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) - { setN1Capability(false); } From 7a81bd411159d9feac746ebfccddb6e9ae9dbdfb Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 15:11:28 +0300 Subject: [PATCH 141/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 348ffb5b0..ceedc2f0f 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -267,6 +267,15 @@ void NasMm::onSwitchMmState(EMmState oldState, EMmState newState, EMmSubState ol m_usim->m_resStar = {}; m_timers->t3516.stop(); } + + // If NAS layer starts PLMN SEARCH in CM-CONNECTED, we switch to CM-IDLE. Because PLMN search is an idle + // operation and RRC expects it in RRC-IDLE state. (This may happen in for example initial registration reject with + // switch to PLMN search state) + if (m_cmState == ECmState::CM_CONNECTED && (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || + m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH)) + { + localReleaseConnection(); + } } void NasMm::onSwitchRmState(ERmState oldState, ERmState newState) From da91fa0b3786b59523e6a62414c8d9f2402ada3e Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 19:06:13 +0300 Subject: [PATCH 142/311] L3 RRC/NAS developments --- src/ue/nas/mm/access.cpp | 13 +++++-------- src/ue/nas/mm/interface.cpp | 4 ---- src/ue/nas/mm/mm.hpp | 1 - src/ue/nas/mm/radio.cpp | 5 ++--- src/ue/nas/usim/usim.hpp | 1 - src/ue/nts.hpp | 4 ---- src/utils/common_types.hpp | 20 -------------------- 7 files changed, 7 insertions(+), 41 deletions(-) diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index 788cd1505..95cfc3e46 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -49,20 +49,17 @@ bool NasMm::isInNonAllowedArea() return false; auto plmn = m_base->shCtx.getCurrentPlmn(); - if (!plmn.hasValue()) return false; if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->m_serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) return true; - if (m_usim->m_servingCell.has_value()) - { - if (nas::utils::ServiceAreaListForbidsTai( - m_storage->m_serviceAreaList->get(), - nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(plmn), octet3{m_usim->m_servingCell->tac}})) - return true; - } + int tac = m_base->shCtx.currentCell.get([](auto &value) { return value.tac; }); + + if (nas::utils::ServiceAreaListForbidsTai(m_storage->m_serviceAreaList->get(), + nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(plmn), octet3{tac}})) + return true; return false; } diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index 4c9003b87..27e1573a0 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -38,10 +38,6 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) handleRadioLinkFailure(); break; } - case NwUeRrcToNas::SERVING_CELL_CHANGE: { - handleServingCellChange(msg.servingCell); - break; - } case NwUeRrcToNas::PAGING: { handlePaging(msg.pagingTmsi); break; diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 9eea042ad..36ddf4a15 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -163,7 +163,6 @@ class NasMm void localReleaseConnection(); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); - void handleServingCellChange(const UeCellInfo &servingCell); void handleRadioLinkFailure(); void handlePaging(const std::vector &tmsiIds); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index eb24a6941..33d57c554 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -142,7 +142,7 @@ void NasMm::performPlmnSelection() } } -void NasMm::handleServingCellChange(const UeCellInfo &servingCell) +/*void NasMm::handleServingCellChange(const UeCellInfo &servingCell) { if (m_cmState == ECmState::CM_CONNECTED) { @@ -177,7 +177,7 @@ void NasMm::handleServingCellChange(const UeCellInfo &servingCell) m_usim->m_servingCell = servingCell; m_usim->m_currentTai = nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(servingCell.cellId.plmn), octet3{servingCell.tac}}; -} +}*/ void NasMm::handleRrcConnectionSetup() { @@ -196,7 +196,6 @@ void NasMm::handleRadioLinkFailure() m_logger->err("Radio link failure detected"); } - m_usim->m_servingCell = std::nullopt; m_usim->m_currentTai = std::nullopt; handleRrcConnectionRelease(); diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 35eaace9a..f77953d17 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -35,7 +35,6 @@ class Usim nas::IE5gsMobileIdentity m_storedGuti{}; // Plmn related - std::optional m_servingCell{}; std::optional m_currentTai{}; std::optional m_lastVisitedRegisteredTai{}; nas::IE5gsTrackingAreaIdentityList m_taiList{}; diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index a171eb9f2..3b794d2db 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -68,7 +68,6 @@ struct NwUeRrcToNas : NtsMessage RRC_CONNECTION_SETUP, RRC_CONNECTION_RELEASE, RADIO_LINK_FAILURE, - SERVING_CELL_CHANGE, PAGING, NAS_NOTIFY, } present; @@ -76,9 +75,6 @@ struct NwUeRrcToNas : NtsMessage // NAS_DELIVERY OctetString nasPdu{}; - // SERVING_CELL_CHANGE - UeCellInfo servingCell{}; - // PAGING std::vector pagingTmsi{}; diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index bd1839a2e..ef6df1f47 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -162,26 +162,6 @@ enum class ECellCategory SUITABLE_CELL, }; -struct UeCellMeasurement -{ - uint64_t sti{}; - GlobalNci cellId; - int tac{}; - int dbm{}; - std::string gnbName; - std::string linkIp; -}; - -struct UeCellInfo -{ - uint64_t sti{}; - GlobalNci cellId; - int tac{}; - ECellCategory cellCategory{}; - std::string gnbName; - std::string linkIp; -}; - struct Vector3 { int x{}; From 8eb13e647f13d4472bf1415d5ff6c5f2368348f8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 19:23:38 +0300 Subject: [PATCH 143/311] L3 RRC/NAS developments --- src/lib/nas/values.cpp | 5 +++++ src/lib/nas/values.hpp | 2 ++ src/ue/nas/mm/register.cpp | 8 ++++---- src/ue/types.cpp | 10 ++++++++++ src/ue/types.hpp | 1 + 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/lib/nas/values.cpp b/src/lib/nas/values.cpp index 88a7806ea..56508dd00 100644 --- a/src/lib/nas/values.cpp +++ b/src/lib/nas/values.cpp @@ -149,6 +149,11 @@ VTrackingAreaIdentity::VTrackingAreaIdentity(const VPlmn &plmn, const octet3 &ta { } +VTrackingAreaIdentity::VTrackingAreaIdentity(const Tai &tai) + : plmn(tai.plmn.mcc, tai.plmn.mnc, tai.plmn.isLongMnc), tac(tai.tac) +{ +} + void VTime::Encode(const VTime &value, OctetString &stream) { stream.appendOctet(value.year); diff --git a/src/lib/nas/values.hpp b/src/lib/nas/values.hpp index a07bf71a7..089ba0771 100644 --- a/src/lib/nas/values.hpp +++ b/src/lib/nas/values.hpp @@ -15,6 +15,7 @@ #include #include +#include namespace nas { @@ -73,6 +74,7 @@ struct VTrackingAreaIdentity octet3 tac; VTrackingAreaIdentity(const VPlmn &plmn, const octet3 &tac); + explicit VTrackingAreaIdentity(const Tai &tai); static void Encode(const VTrackingAreaIdentity &value, OctetString &stream); static VTrackingAreaIdentity Decode(const OctetView &stream); diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 8a5a2bcaa..a7c6bf783 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -574,7 +574,8 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); + nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, + nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); } if (cause == nas::EMmCause::CONGESTION) @@ -838,9 +839,8 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) // "If the registration attempt counter is less than 5:" if (m_regCounter < 5) { - bool includedInTaiList = nas::utils::TaiListContains( - m_usim->m_taiList, nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(m_usim->m_servingCell->cellId.plmn), - octet3{m_usim->m_servingCell->tac}}); + auto tai = m_base->shCtx.getCurrentTai(); + bool includedInTaiList = nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{tai}); // "If the TAI of the current serving cell is not included in the TAI list or the 5GS update status is different // to 5U1 UPDATED" diff --git a/src/ue/types.cpp b/src/ue/types.cpp index d35ce7fc4..60077570f 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -299,4 +299,14 @@ Plmn UeSharedContext::getCurrentPlmn() return currentCell.get([](auto &value) { return value.plmn; }); } +Tai UeSharedContext::getCurrentTai() +{ + Tai tai; + currentCell.access([&tai](auto &value) { + tai.plmn = value.plmn; + tai.tac = value.tac; + }); + return tai; +} + } // namespace nr::ue diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 5211b9d83..88998efd8 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -167,6 +167,7 @@ struct UeSharedContext Locked> forbiddenTaiRps; Plmn getCurrentPlmn(); + Tai getCurrentTai(); }; struct TaskBase From 2342f910d2bf0ba45e75ec7e264427cd0dcd88ee Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 19:35:37 +0300 Subject: [PATCH 144/311] L3 RRC/NAS developments --- src/ue/nas/mm/auth.cpp | 2 +- src/ue/nas/mm/base.cpp | 56 +++++++++++++++++++++++++++++++------ src/ue/nas/mm/dereg.cpp | 22 +++++++-------- src/ue/nas/mm/ecall.cpp | 2 +- src/ue/nas/mm/mm.hpp | 2 +- src/ue/nas/mm/radio.cpp | 16 +++++------ src/ue/nas/mm/register.cpp | 42 ++++++++++++++-------------- src/ue/nas/mm/service.cpp | 24 ++++++++-------- src/ue/nas/mm/timer.cpp | 8 +++--- src/ue/nas/mm/transport.cpp | 2 +- src/ue/types.cpp | 16 +++++------ src/ue/types.hpp | 12 ++++---- 12 files changed, 121 insertions(+), 83 deletions(-) diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index bd95cab47..ed5433312 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -446,7 +446,7 @@ void NasMm::receiveAuthenticationReject(const nas::AuthenticationReject &msg) m_timers->t3519.stop(); m_timers->t3521.stop(); // .. and enter state 5GMM-DEREGISTERED. - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } void NasMm::receiveEapSuccessMessage(const eap::Eap &eap) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index ceedc2f0f..906d7ae9d 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -18,6 +18,42 @@ namespace nr::ue { +static EMmState GetMmStateFromSubState(EMmSubState subState) +{ + switch (subState) + { + case EMmSubState::MM_NULL_PS: + return EMmState::MM_NULL; + case EMmSubState::MM_DEREGISTERED_PS: + case EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE: + case EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE: + case EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION: + case EMmSubState::MM_DEREGISTERED_PLMN_SEARCH: + case EMmSubState::MM_DEREGISTERED_NO_SUPI: + case EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE: + case EMmSubState::MM_DEREGISTERED_ECALL_INACTIVE: + case EMmSubState::MM_DEREGISTERED_INITIAL_REGISTRATION_NEEDED: + return EMmState::MM_DEREGISTERED; + case EMmSubState::MM_REGISTERED_INITIATED_PS: + return EMmState::MM_REGISTERED_INITIATED; + case EMmSubState::MM_REGISTERED_PS: + case EMmSubState::MM_REGISTERED_NORMAL_SERVICE: + case EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE: + case EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE: + case EMmSubState::MM_REGISTERED_LIMITED_SERVICE: + case EMmSubState::MM_REGISTERED_PLMN_SEARCH: + case EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE: + case EMmSubState::MM_REGISTERED_UPDATE_NEEDED: + return EMmState::MM_REGISTERED; + case EMmSubState::MM_DEREGISTERED_INITIATED_PS: + return EMmState::MM_DEREGISTERED_INITIATED; + case EMmSubState::MM_SERVICE_REQUEST_INITIATED_PS: + return EMmState::MM_SERVICE_REQUEST_INITIATED; + } + + std::terminate(); +} + NasMm::NasMm(TaskBase *base, UeTimers *timers) : m_base{base}, m_timers{timers}, m_sm{}, m_usim{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "nas"); @@ -25,7 +61,7 @@ NasMm::NasMm(TaskBase *base, UeTimers *timers) : m_base{base}, m_timers{timers}, m_rmState = ERmState::RM_DEREGISTERED; m_cmState = ECmState::CM_IDLE; m_mmState = EMmState::MM_DEREGISTERED; - m_mmSubState = EMmSubState::MM_DEREGISTERED_NA; + m_mmSubState = EMmSubState::MM_DEREGISTERED_PS; m_storage = new MmStorage(m_base); } @@ -57,9 +93,9 @@ void NasMm::performMmCycle() if (switchToECallInactivityIfNeeded()) return; - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NA) + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PS) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); return; } else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) @@ -106,9 +142,9 @@ void NasMm::performMmCycle() if (startECallInactivityIfNeeded()) return; - if (m_mmSubState == EMmSubState::MM_REGISTERED_NA) + if (m_mmSubState == EMmSubState::MM_REGISTERED_PS) { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); return; } else if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) @@ -160,8 +196,10 @@ void NasMm::performMmCycle() } } -void NasMm::switchMmState(EMmState state, EMmSubState subState) +void NasMm::switchMmState(EMmSubState subState) { + EMmState state = GetMmStateFromSubState(subState); + ERmState oldRmState = m_rmState; if (state == EMmState::MM_DEREGISTERED || state == EMmState::MM_REGISTERED_INITIATED) m_rmState = ERmState::RM_DEREGISTERED; @@ -298,7 +336,7 @@ void NasMm::onSwitchCmState(ECmState oldState, ECmState newState) if (regType == nas::ERegistrationType::INITIAL_REGISTRATION || regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); switchUState(E5UState::U2_NOT_UPDATED); handleAbnormalInitialRegFailure(regType); @@ -315,12 +353,12 @@ void NasMm::onSwitchCmState(ECmState oldState, ECmState newState) // if the de-registration procedure was performed due to disabling of 5GS services, the UE shall enter the // 5GMM-NULL state; if (m_lastDeregCause == EDeregCause::DISABLE_5G) - switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); + switchMmState(EMmSubState::MM_NULL_PS); // if the de-registration type "normal de-registration" was requested for reasons other than disabling of // 5GS services, the UE shall enter the 5GMM-DEREGISTERED state. else if (m_lastDeregistrationRequest->deRegistrationType.switchOff == nas::ESwitchOff::NORMAL_DE_REGISTRATION) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } // If the UE enters the 5GMM-IDLE, the RAND and RES* values stored diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 2e5d65ac3..4d4efc2d3 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -79,10 +79,10 @@ void NasMm::sendDeregistration(EDeregCause deregCause) m_sm->localReleaseAllSessions(); if (m_lastDeregistrationRequest->deRegistrationType.switchOff == nas::ESwitchOff::NORMAL_DE_REGISTRATION) - switchMmState(EMmState::MM_DEREGISTERED_INITIATED, EMmSubState::MM_DEREGISTERED_INITIATED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_INITIATED_PS); else { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } } @@ -90,7 +90,7 @@ void NasMm::receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOrigina { m_logger->debug("De-registration accept received"); - if (m_mmSubState != EMmSubState::MM_DEREGISTERED_INITIATED_NA) + if (m_mmState != EMmState::MM_DEREGISTERED_INITIATED) { m_logger->warn("De-registration accept message ignored. UE is not in MM_DEREGISTERED_INITIATED"); sendMmStatus(nas::EMmCause::MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE); @@ -105,9 +105,9 @@ void NasMm::receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOrigina m_sm->localReleaseAllSessions(); if (m_lastDeregCause == EDeregCause::DISABLE_5G) - switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); + switchMmState(EMmSubState::MM_NULL_PS); else - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); m_logger->info("De-registration is successful"); } @@ -203,7 +203,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi m_usim->m_nonCurrentNsCtx = {}; switchUState(E5UState::U2_NOT_UPDATED); m_timers->t3502.start(); - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); }; // "If the de-registration type indicates "re-registration not required", the UE shall take the actions depending on @@ -258,19 +258,19 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); if (cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); if (cause == nas::EMmCause::CONGESTION) { m_timers->t3346.stop(); switchUState(E5UState::U2_NOT_UPDATED); - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); + switchMmState(EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); if (msg.t3346Value.has_value() && nas::utils::HasValue(*msg.t3346Value)) m_timers->t3346.start(*msg.t3346Value); @@ -278,7 +278,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { - switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); + switchMmState(EMmSubState::MM_NULL_PS); setN1Capability(false); } diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index b1e870199..f72dd7fcb 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -95,7 +95,7 @@ bool NasMm::switchToECallInactivityIfNeeded() m_usim->m_nonCurrentNsCtx = {}; // Perform item d) in 5.5.3 - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_ECALL_INACTIVE); + switchMmState(EMmSubState::MM_DEREGISTERED_ECALL_INACTIVE); return true; } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 36ddf4a15..43db468fa 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -79,7 +79,7 @@ class NasMm private: /* Base */ void triggerMmCycle(); void performMmCycle(); - void switchMmState(EMmState state, EMmSubState subState); + void switchMmState(EMmSubState subState); void switchCmState(ECmState state); void switchUState(E5UState state); void onSwitchMmState(EMmState oldState, EMmState newState, EMmSubState oldSubState, EMmSubState newSubSate); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 33d57c554..9d527d7c9 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -28,12 +28,12 @@ void NasMm::performPlmnSelection() { if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE); + switchMmState(EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE); return; } else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE); + switchMmState(EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE); return; } } @@ -128,16 +128,16 @@ void NasMm::performPlmnSelection() if (cellCategory == ECellCategory::SUITABLE_CELL) { if (m_mmState == EMmState::MM_REGISTERED) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); else - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); } else { if (m_mmState == EMmState::MM_REGISTERED) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); else - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); } } } @@ -201,9 +201,9 @@ void NasMm::handleRadioLinkFailure() handleRrcConnectionRelease(); if (m_mmState == EMmState::MM_REGISTERED) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + switchMmState(EMmSubState::MM_REGISTERED_PS); else if (m_mmState == EMmState::MM_DEREGISTERED) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } void NasMm::localReleaseConnection() diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index a7c6bf783..73227f7ee 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -51,7 +51,7 @@ void NasMm::sendInitialRegistration(EInitialRegCause regCause) m_usim->m_currentNsCtx = {}; // Switch MM state - switchMmState(EMmState::MM_REGISTERED_INITIATED, EMmSubState::MM_REGISTERED_INITIATED_NA); + switchMmState(EMmSubState::MM_REGISTERED_INITIATED_PS); // Prepare requested NSSAI bool isDefaultNssai{}; @@ -140,7 +140,7 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) ToJson(updateCause).str().c_str()); // Switch state - switchMmState(EMmState::MM_REGISTERED_INITIATED, EMmSubState::MM_REGISTERED_INITIATED_NA); + switchMmState(EMmSubState::MM_REGISTERED_INITIATED_PS); // Prepare FOR pending field nas::EFollowOnRequest followOn = nas::EFollowOnRequest::FOR_PENDING; @@ -251,7 +251,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) // Upon receipt of the REGISTRATION ACCEPT message, the UE shall reset the registration attempt counter, enter state // 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED. resetRegAttemptCounter(); - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); switchUState(E5UState::U1_UPDATED); // If the REGISTRATION ACCEPT message included a T3512 value IE, the UE shall use the value in the T3512 value IE as @@ -361,7 +361,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg // request attempt counter, enter state 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED." resetRegAttemptCounter(); m_serCounter = 0; - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); switchUState(E5UState::U1_UPDATED); // "If the ACCEPT message included a T3512 value IE, the UE shall use the value in T3512 value IE as @@ -528,24 +528,24 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } if (cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); } if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { - switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); + switchMmState(EMmSubState::MM_NULL_PS); setN1Capability(false); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::TA_NOT_ALLOWED || @@ -583,7 +583,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (msg.t3346value.has_value() && nas::utils::HasValue(*msg.t3346value)) { switchUState(E5UState::U2_NOT_UPDATED); - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); + switchMmState(EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); m_timers->t3346.stop(); if (msg.sht != nas::ESecurityHeaderType::NOT_PROTECTED) @@ -609,7 +609,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) else if (regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) { if (cause == nas::EMmCause::PEI_NOT_ACCEPTED) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_SUPI); + switchMmState(EMmSubState::MM_DEREGISTERED_NO_SUPI); else { // Spec says that upper layers should be informed as well, for additional action for emergency @@ -688,29 +688,29 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED || cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } if (cause == nas::EMmCause::IMPLICITY_DEREGISTERED) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); } if (cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); } if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { - switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); + switchMmState(EMmSubState::MM_NULL_PS); setN1Capability(false); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::TA_NOT_ALLOWED || @@ -749,7 +749,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg if (!hasEmergency()) { switchUState(E5UState::U2_NOT_UPDATED); - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); + switchMmState(EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); } m_timers->t3346.stop(); @@ -803,7 +803,7 @@ void NasMm::handleAbnormalInitialRegFailure(nas::ERegistrationType regType) if (!hasEmergency()) { m_timers->t3511.start(); - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); + switchMmState(EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); } } else @@ -823,7 +823,7 @@ void NasMm::handleAbnormalInitialRegFailure(nas::ERegistrationType regType) // 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION or optionally to 5GMM-DEREGISTERED.PLMN-SEARCH in order to perform // a PLMN selection according to 3GPP TS 23.122 [5]. switchUState(E5UState::U2_NOT_UPDATED); - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); + switchMmState(EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); } } @@ -851,7 +851,7 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) // procedure is triggered again" m_timers->t3511.start(); // todo switchUState(E5UState::U2_NOT_UPDATED); - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE); + switchMmState(EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE); } // "If the TAI of the current serving cell is included in the TAI list, the 5GS update status is equal to 5U1 @@ -860,7 +860,7 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) if (includedInTaiList && m_usim->m_uState == E5UState::U1_UPDATED) { // "The UE shall keep the 5GS update status to 5U1 UPDATED and enter state 5GMM-REGISTERED.NORMAL-SERVICE." - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); // "The UE shall start timer T3511" m_timers->t3511.start(); } @@ -874,7 +874,7 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) // "The UE shall delete the list of equivalent PLMNs and shall change to state // 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE UPDATE" m_usim->m_equivalentPlmnList = {}; - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE); + switchMmState(EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE); } } diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index ff8a8f142..9c9715fc4 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -159,7 +159,7 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) m_lastServiceRequest = std::move(request); m_lastServiceReqCause = reqCause; m_timers->t3517.start(); - switchMmState(EMmState::MM_SERVICE_REQUEST_INITIATED, EMmSubState::MM_SERVICE_REQUEST_INITIATED_NA); + switchMmState(EMmSubState::MM_SERVICE_REQUEST_INITIATED_PS); } void NasMm::receiveServiceAccept(const nas::ServiceAccept &msg) @@ -176,7 +176,7 @@ void NasMm::receiveServiceAccept(const nas::ServiceAccept &msg) m_logger->info("Service Accept received"); m_serCounter = 0; m_timers->t3517.stop(); - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + switchMmState(EMmSubState::MM_REGISTERED_PS); } else { @@ -245,7 +245,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) auto handleAbnormalCase = [this]() { m_logger->debug("Handling Service Reject abnormal case"); - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + switchMmState(EMmSubState::MM_REGISTERED_PS); m_timers->t3517.stop(); }; @@ -342,37 +342,37 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED || cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } if (cause == nas::EMmCause::IMPLICITY_DEREGISTERED) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); } if (cause == nas::EMmCause::TA_NOT_ALLOWED) { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA) { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); } if (cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); } if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { - switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); + switchMmState(EMmSubState::MM_NULL_PS); setN1Capability(false); } @@ -394,7 +394,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) { if (!hasEmergency()) { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + switchMmState(EMmSubState::MM_REGISTERED_PS); m_timers->t3517.stop(); } @@ -414,7 +414,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::RESTRICTED_SERVICE_AREA) { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); + switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); if (m_lastServiceRequest->serviceType.serviceType != nas::EServiceType::ELEVATED_SIGNALLING) sendMobilityRegistration(ERegUpdateCause::RESTRICTED_SERVICE_AREA); diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index 9b94cbda9..13ae468b6 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -53,7 +53,7 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) // The UE shall abort the registration procedure for initial registration and the NAS signalling // connection, if any, shall be released locally if the initial registration request is not for // emergency services.. - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); switchUState(E5UState::U2_NOT_UPDATED); if (m_lastRegistrationRequest->registrationType.registrationType != @@ -95,7 +95,7 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) { logExpired(); - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + switchMmState(EMmSubState::MM_REGISTERED_PS); if (m_cmState == ECmState::CM_IDLE && m_lastServiceReqCause != EServiceReqCause::EMERGENCY_FALLBACK) { @@ -129,10 +129,10 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) m_logger->debug("De-registration aborted"); if (m_lastDeregCause == EDeregCause::DISABLE_5G) - switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); + switchMmState(EMmSubState::MM_NULL_PS); else if (m_lastDeregistrationRequest->deRegistrationType.switchOff == nas::ESwitchOff::NORMAL_DE_REGISTRATION) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } } else diff --git a/src/ue/nas/mm/transport.cpp b/src/ue/nas/mm/transport.cpp index 633a021e3..e75442ca8 100644 --- a/src/ue/nas/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -82,7 +82,7 @@ void NasMm::receiveDlNasTransport(const nas::DlNasTransport &msg) case nas::EMmCause::RESTRICTED_SERVICE_AREA: { if (m_rmState == ERmState::RM_REGISTERED) { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); + switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); sendMobilityRegistration(ERegUpdateCause::RESTRICTED_SERVICE_AREA); } m_sm->receiveForwardingFailure(smMessage, msg.mmCause->value, std::nullopt); diff --git a/src/ue/types.cpp b/src/ue/types.cpp index 60077570f..c62a70eab 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -87,10 +87,10 @@ Json ToJson(const EMmSubState &state) { switch (state) { - case EMmSubState::MM_NULL_NA: + case EMmSubState::MM_NULL_PS: return "MM-NULL"; - case EMmSubState::MM_DEREGISTERED_NA: - return "MM-DEREGISTERED/NA"; + case EMmSubState::MM_DEREGISTERED_PS: + return "MM-DEREGISTERED/PS"; case EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE: return "MM-DEREGISTERED/NORMAL-SERVICE"; case EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE: @@ -107,10 +107,10 @@ Json ToJson(const EMmSubState &state) return "MM-DEREGISTERED/ECALL-INACTIVE"; case EMmSubState::MM_DEREGISTERED_INITIAL_REGISTRATION_NEEDED: return "MM-DEREGISTERED/INITIAL-REGISTRATION-NEEDED"; - case EMmSubState::MM_REGISTERED_INITIATED_NA: + case EMmSubState::MM_REGISTERED_INITIATED_PS: return "MM-REGISTER-INITIATED"; - case EMmSubState::MM_REGISTERED_NA: - return "MM-REGISTERED/NA"; + case EMmSubState::MM_REGISTERED_PS: + return "MM-REGISTERED/PS"; case EMmSubState::MM_REGISTERED_NORMAL_SERVICE: return "MM-REGISTERED/NORMAL-SERVICE"; case EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE: @@ -125,9 +125,9 @@ Json ToJson(const EMmSubState &state) return "MM-REGISTERED/NO-CELL-AVAILABLE"; case EMmSubState::MM_REGISTERED_UPDATE_NEEDED: return "MM-REGISTERED/UPDATE-NEEDED"; - case EMmSubState::MM_DEREGISTERED_INITIATED_NA: + case EMmSubState::MM_DEREGISTERED_INITIATED_PS: return "MM-DEREGISTER-INITIATED"; - case EMmSubState::MM_SERVICE_REQUEST_INITIATED_NA: + case EMmSubState::MM_SERVICE_REQUEST_INITIATED_PS: return "MM-SERVICE-REQUEST-INITIATED"; default: return "?"; diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 88998efd8..96535b25a 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -259,9 +259,9 @@ enum class EMmState enum class EMmSubState { - MM_NULL_NA, + MM_NULL_PS, - MM_DEREGISTERED_NA, + MM_DEREGISTERED_PS, MM_DEREGISTERED_NORMAL_SERVICE, MM_DEREGISTERED_LIMITED_SERVICE, MM_DEREGISTERED_ATTEMPTING_REGISTRATION, @@ -271,9 +271,9 @@ enum class EMmSubState MM_DEREGISTERED_ECALL_INACTIVE, MM_DEREGISTERED_INITIAL_REGISTRATION_NEEDED, - MM_REGISTERED_INITIATED_NA, + MM_REGISTERED_INITIATED_PS, - MM_REGISTERED_NA, + MM_REGISTERED_PS, MM_REGISTERED_NORMAL_SERVICE, MM_REGISTERED_NON_ALLOWED_SERVICE, MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE, @@ -282,9 +282,9 @@ enum class EMmSubState MM_REGISTERED_NO_CELL_AVAILABLE, MM_REGISTERED_UPDATE_NEEDED, - MM_DEREGISTERED_INITIATED_NA, + MM_DEREGISTERED_INITIATED_PS, - MM_SERVICE_REQUEST_INITIATED_NA + MM_SERVICE_REQUEST_INITIATED_PS }; enum class EPsState From 2dbbcd5965529a9a9577072d7ec79a7b89dcca7b Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 19:36:23 +0300 Subject: [PATCH 145/311] L3 RRC/NAS developments --- tools/rls-wireshark-dissector.lua | 208 +++++++++++++----------------- 1 file changed, 92 insertions(+), 116 deletions(-) diff --git a/tools/rls-wireshark-dissector.lua b/tools/rls-wireshark-dissector.lua index 9b1109db1..2f2f8560b 100644 --- a/tools/rls-wireshark-dissector.lua +++ b/tools/rls-wireshark-dissector.lua @@ -1,138 +1,114 @@ --[[ +-- -- Dissector for Radio Link Simulation Protocol --- (used by UERANSIM ). +-- (UERANSIM project ). -- -- CC0-1.0 2021 - Louis Royer () +-- --]] ---[[ --- ProtoFields ---]] -local rls_protocol = Proto("RLS", "Radio Link Simulation Protocol") -local version_major = ProtoField.uint8("rls.version_major", "RLS Version Major", base.DEC) -local version_minor = ProtoField.uint8("rls.version_minor", "RLS Version Minor", base.DEC) -local version_patch = ProtoField.uint8("rls.version_patch", "RLS Version Patch", base.DEC) +local rlsProtocol = Proto("RLS", "UERANSIM Radio Link Simulation (RLS) Protocol") +local fields = rlsProtocol.fields -local message_type_name = { - [0] = "Reserved", - [1] = "Cell Info Request", - [2] = "Cell Info Response", - [3] = "PDU Delivery" +local msgTypeNames = { + [0] = "[Reserved]", + [1] = "[Reserved]", + [2] = "[Reserved]", + [3] = "[Reserved]", + [4] = "Heartbeat", + [5] = "Heartbeat ACK", + [6] = "PDU Transmission", + [7] = "PDU Transmission ACK", } -local message_type = ProtoField.uint8("rls.message_type", "RLS Message Type", base.DEC, message_type_name) -local sti = ProtoField.uint64("rls.sti", "RLS Temporary Identifier", base.HEX) - --- For cell Info Request -local sim_pos_x = ProtoField.uint32("rls.sim_pos_x", "RLS Position X", base.DEC) -local sim_pos_y = ProtoField.uint32("rls.sim_pos_y", "RLS Position Y", base.DEC) -local sim_pos_z = ProtoField.uint32("rls.sim_pos_z", "RLS Position Z", base.DEC) +local pduTypeNames = { + [0] = "[Reserved]", + [1] = "RRC", + [2] = "Data" +} --- For cell Info Response -local mcc = ProtoField.uint16("rls.mcc", "MCC", base.DEC) -local mnc = ProtoField.uint16("rls.mnc", "MNC", base.DEC) -local long_mnc = ProtoField.bool("rls.long_mnc", "MNC is 3-digit", base.BOOL) -local nci = ProtoField.uint64("rls.nci", "NR Cell Identity", base.HEX) -local tac = ProtoField.uint32("rls.tac", "Tracking Area Code", base.DEC) -local dbm = ProtoField.int32("rls.dbm", "RLS Signal Strength (dBm)", base.DEC) -local gnb_name = ProtoField.string("rls.gnb_name", "gNB Name") -local link_ip = ProtoField.string("rls.link_ip", "gNB Link IP") +local rrcMsgTypeNames = { + [0] = "BCCH-BCH", + [1] = "BCCH-DL-SCH", + [2] = "DL-CCCH", + [3] = "DL-DCCH", + [4] = "PCCH", + [5] = "UL-CCCH", + [6] = "UL-CCCH1", + [7] = "UL-DCCH", +} --- For PDU Delivery -local pdu_type_name = { - [0] = "Reserved", - [1] = "RRC", - [2] = "Data" +local nrRrcDissectors = { + [0] = "nr-rrc.bcch.bch", + [1] = "nr-rrc.bcch.dl.sch", + [2] = "nr-rrc.dl.ccch", + [3] = "nr-rrc.dl.dcch", + [4] = "nr-rrc.pcch", + [5] = "nr-rrc.ul.ccch", + [6] = "nr-rrc.ul.ccch1", + [7] = "nr-rrc.ul.dcch", } -local pdu_type = ProtoField.uint8("rls.pdu_type", "RLS PDU Type", base.DEC, pdu_type_name) +fields.Version = ProtoField.string("rls.version", "Version") +fields.MsgType = ProtoField.uint8("rls.message_type", "Message Type", base.DEC, msgTypeNames) +fields.Sti = ProtoField.uint64("rls.sti", "Sender Node Temporary ID", base.DEC) +fields.PduType = ProtoField.uint8("rls.pdu_type", "PDU Type", base.DEC, pduTypeNames) +fields.PduId = ProtoField.uint32("rls.pdu_id", "PDU ID", base.DEC) +fields.RrcMsgType = ProtoField.uint32("rls.rrc_message_type", "RRC Message Type", base.DEC, rrcMsgTypeNames) +fields.PduLength = ProtoField.uint32("rls.pdu_length", "PDU Length", base.DEC) +fields.PduSessionId = ProtoField.uint32("rls.pdu_session_id", "PDU Session ID", base.DEC) +fields.AcknowledgeItem = ProtoField.uint32("rls.ack_item", "PDU ID") +fields.Dbm = ProtoField.int32("rls.dbm", "RLS Signal Strength (dBm)", base.DEC) +fields.PosX = ProtoField.uint32("rls.pos_x", "RLS Position X", base.DEC) +fields.PosY = ProtoField.uint32("rls.pos_y", "RLS Position Y", base.DEC) +fields.PosZ = ProtoField.uint32("rls.pos_z", "RLS Position Z", base.DEC) -local rrc_channel_name = { - [0] = "BCCH-BCH", - [1] = "BCCH-DL-SCH", - [2] = "DL-CCCH", - [3] = "DL-DCCH", - [4] = "PCCH", - [5] = "UL-CCCH", - [6] = "UL-CCCH1", - [7] = "UL-DCCH", -} +function rlsProtocol.dissector(buffer, pinfo, tree) + if buffer:len() == 0 then return end + if buffer(0, 1):uint() ~= 0x03 then return end -local rrc_channel_dissector = { - [0] = "nr-rrc.bcch.bch", - [1] = "nr-rrc.bcch.dl.sch", - [2] = "nr-rrc.dl.ccch", - [3] = "nr-rrc.dl.dcch", - [4] = "nr-rrc.pcch", - [5] = "nr-rrc.ul.ccch", - [6] = "nr-rrc.ul.ccch1", - [7] = "nr-rrc.ul.dcch", -} + pinfo.cols.protocol = rlsProtocol.name -local rrc_channel = ProtoField.uint32("rls.rrc_channel", "RRC Channel", base.DEC, rrc_channel_name) -local session_id = ProtoField.uint32("rls.session_id", "PDU Session ID", base.DEC) + local versionNumber = buffer(1, 1):uint() .. "." .. buffer(2, 1):uint() .. "." .. buffer(3, 1):uint() + local subtree = tree:add(rlsProtocol, buffer(), "UERANSIM Radio Link Simulation (RLS) protocol") ---[[ --- Dissector definition ---]] -rls_protocol.fields = { - version_major, version_minor, version_patch, message_type, sti, - sim_pos_x, sim_pos_y, sim_pos_z, - mcc, mnc, long_mnc, nci, tac, dbm, gnb_name, link_ip, - pdu_type, rrc_channel, session_id, -} + subtree:add(fields.Version, buffer(1, 3), versionNumber) + subtree:add(fields.MsgType, buffer(4, 1)) + local msgType = buffer(4, 1):uint() -function rls_protocol.dissector(buffer, pinfo, tree) - local length = buffer:len() - if length == 0 then return end - if buffer(0,1):uint() ~= 0x03 then return end + pinfo.cols.info = msgTypeNames[msgType] + subtree:add(fields.Sti, buffer(5, 8)) - pinfo.cols.protocol = rls_protocol.name - local version_number = buffer(1,1):uint().."." - ..buffer(2,1):uint().."." - ..buffer(3,1):uint() - local subtree = tree:add(rls_protocol, buffer(), "RLS Protocol Version "..version_number) - local version = subtree:add(rls_protocol, buffer(2,3), "Version: "..version_number) - version:add(version_major, buffer(1,1)) - version:add(version_minor, buffer(2,1)) - version:add(version_patch, buffer(3,1)) - subtree:add(message_type, buffer(4,1)) - local msg_type = buffer(4,1):uint() - if msg_type <=0 or msg_type > 3 then return end - pinfo.cols.info = message_type_name[msg_type] - subtree:append_text(" - "..message_type_name[msg_type]) - subtree:add(sti, buffer(5,8)) - if msg_type == 1 then -- Cell Info Request - subtree:add(sim_pos_x, buffer(13,4)) - subtree:add(sim_pos_y, buffer(17,4)) - subtree:add(sim_pos_z, buffer(21,4)) - elseif msg_type == 2 then -- Cell Info Response - subtree:add(mcc, buffer(13,2)) - local mnc_tree = subtree:add(rls_protocol, buffer(15,3), "MNC: "..tostring(buffer(15,2):uint())) - mnc_tree:add(mnc, buffer(15,2)) - mnc_tree:add(long_mnc, buffer(17,1)) - subtree:add(nci, buffer(18,8)) - subtree:add(tac, buffer(26,4)) - subtree:add(dbm, buffer(30,4)) - local gnb_name_len = buffer(34,4):uint() - subtree:add(gnb_name, buffer(38,gnb_name_len)) - local link_ip_size = buffer(38+gnb_name_len,4):uint() - subtree:add(link_ip, buffer(42+gnb_name_len,link_ip_size)) - elseif msg_type == 3 then -- PDU Delivery - subtree:add(pdu_type, buffer(13,1)) - local pdu_type_value = buffer(13,1):uint() - local pdu_len = buffer(14,4):uint() - local payload_len = buffer(18+pdu_len,4):uint() - if pdu_type_value == 1 then -- RRC - subtree:add(rrc_channel, buffer(22+pdu_len,payload_len)) - local channel = buffer(22+pdu_len,payload_len):uint() - Dissector.get(rrc_channel_dissector[channel]):call(buffer(18,pdu_len):tvb(), pinfo, tree) - elseif pdu_type_value == 2 then -- DATA - subtree:add(session_id, buffer(22+pdu_len,payload_len)) - Dissector.get("ip"):call(buffer(18,pdu_len):tvb(), pinfo, tree) - end - end + if msgType == 4 then -- Heartbeat + subtree:add(fields.PosX, buffer(13,4)) + subtree:add(fields.PosY, buffer(17,4)) + subtree:add(fields.PosZ, buffer(21,4)) + elseif msgType == 5 then -- Heartbeat ACK + subtree:add(fields.Dbm, buffer(13,4)) + elseif msgType == 6 then -- PDU Transmission + local pduType = buffer(13, 1):uint() + subtree:add(fields.PduType, buffer(13, 1)) + subtree:add(fields.PduId, buffer(14, 4)) + if pduType == 1 then -- RRC PDU + local rrcMsgType = buffer(18, 4):uint() + local pduLength = buffer(22, 4):uint() + subtree:add(fields.RrcMsgType, buffer(18, 4)) + subtree:add(fields.PduLength, buffer(22, 4)) + Dissector.get(nrRrcDissectors[rrcMsgType]):call(buffer(26, pduLength):tvb(), pinfo, tree) + elseif (pduType == 2) then -- Data PDU + subtree:add(fields.PduSessionId, buffer(18, 4)) + local pduLength = buffer(22, 4):uint() + subtree:add(fields.PduLength, buffer(22, 4)) + Dissector.get("ip"):call(buffer(26, pduLength):tvb(), pinfo, tree) + end + elseif msgType == 7 then -- PDU Transmission ACK + local ackCount = buffer(13, 4):uint() + local ackArray = subtree:add(rlsProtocol, buffer(13, 4), "Acknowledge List (" .. ackCount .. ")") + for i = 1,ackCount,1 do + ackArray:add(fields.AcknowledgeItem, buffer(17 + (i - 1) * 4, 4)) + end + end end local udp_port = DissectorTable.get("udp.port") -udp_port:add(4997, rls_protocol) +udp_port:add(4997, rlsProtocol) From 9cc4615fd241dc24610ce6f5a85ffaa6214ff60d Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 19:47:20 +0300 Subject: [PATCH 146/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 10 +++------- src/ue/nas/mm/interface.cpp | 4 ++++ src/ue/nas/mm/mm.hpp | 3 ++- src/ue/nas/mm/radio.cpp | 15 +++++++++++++-- src/ue/nas/mm/register.cpp | 20 ++++++-------------- src/ue/nas/mm/service.cpp | 27 ++++++++++----------------- src/ue/nas/usim/usim.hpp | 1 - src/ue/nts.hpp | 8 ++++++-- src/ue/rrc/idle.cpp | 11 +++++++---- src/utils/common_types.cpp | 5 +++++ src/utils/common_types.hpp | 2 ++ 11 files changed, 58 insertions(+), 48 deletions(-) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 4d4efc2d3..e7bb9b25f 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -248,13 +248,9 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi if (cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - Tai tai; - tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; - tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; - tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; - tai.tac = (int)m_usim->m_currentTai->tac; - - m_storage->m_forbiddenTaiListRoaming->add(tai); + Tai tai = m_base->shCtx.getCurrentTai(); + if (tai.hasValue()) + m_storage->m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index 27e1573a0..7b059ab5a 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -46,6 +46,10 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) triggerMmCycle(); break; } + case NwUeRrcToNas::ACTIVE_CELL_CHANGED: { + handleActiveCellChange(msg.lastTai); + break; + } } } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 43db468fa..ae19dfb0f 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -31,7 +31,7 @@ class NasMm std::unique_ptr m_logger; NasSm *m_sm; Usim *m_usim; - MmStorage* m_storage; + MmStorage *m_storage; ERmState m_rmState; ECmState m_cmState; @@ -161,6 +161,7 @@ class NasMm private: /* Radio */ void performPlmnSelection(); void localReleaseConnection(); + void handleActiveCellChange(const Tai &lastTai); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); void handleRadioLinkFailure(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 9d527d7c9..6796e94e9 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -142,6 +142,19 @@ void NasMm::performPlmnSelection() } } +void NasMm::handleActiveCellChange(const Tai &lastTai) +{ + if (m_cmState == ECmState::CM_CONNECTED) + { + // TODO + m_logger->err("Serving cell change in CM-CONNECTED"); + return; + } + + Tai currentTai = m_base->shCtx.getCurrentTai(); + +} + /*void NasMm::handleServingCellChange(const UeCellInfo &servingCell) { if (m_cmState == ECmState::CM_CONNECTED) @@ -196,8 +209,6 @@ void NasMm::handleRadioLinkFailure() m_logger->err("Radio link failure detected"); } - m_usim->m_currentTai = std::nullopt; - handleRrcConnectionRelease(); if (m_mmState == EMmState::MM_REGISTERED) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 73227f7ee..c8b9544cb 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -563,13 +563,9 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - Tai tai; - tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; - tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; - tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; - tai.tac = (int)m_usim->m_currentTai->tac; - - m_storage->m_forbiddenTaiListRoaming->add(tai); + Tai tai = m_base->shCtx.getCurrentTai(); + if (tai.hasValue()) + m_storage->m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) @@ -728,13 +724,9 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - Tai tai; - tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; - tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; - tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; - tai.tac = (int)m_usim->m_currentTai->tac; - - m_storage->m_forbiddenTaiListRoaming->add(tai); + Tai tai = m_base->shCtx.getCurrentTai(); + if (tai.hasValue()) + m_storage->m_forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 9c9715fc4..a9cd5ef54 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -34,7 +34,7 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) m_logger->err("Service Request canceled, UE not in 5U1 UPDATED state"); return; } - if (!nas::utils::TaiListContains(m_usim->m_taiList, *m_usim->m_currentTai)) + if (!nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{m_base->shCtx.getCurrentTai()})) { m_logger->err("Service Request canceled, current TAI is not in the TAI list"); return; @@ -310,26 +310,19 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::TA_NOT_ALLOWED) { - Tai tai; - tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; - tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; - tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; - tai.tac = (int)m_usim->m_currentTai->tac; - - m_storage->m_forbiddenTaiListRps->add(tai); + Tai tai = m_base->shCtx.getCurrentTai(); + if (tai.hasValue()) + m_storage->m_forbiddenTaiListRps->add(tai); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - Tai tai; - tai.plmn.mcc = m_usim->m_currentTai->plmn.mcc; - tai.plmn.mnc = m_usim->m_currentTai->plmn.mnc; - tai.plmn.isLongMnc = m_usim->m_currentTai->plmn.isLongMnc; - tai.tac = (int)m_usim->m_currentTai->tac; - - m_storage->m_forbiddenTaiListRoaming->add(tai); - - nas::utils::RemoveFromTaiList(m_usim->m_taiList, *m_usim->m_currentTai); + Tai tai = m_base->shCtx.getCurrentTai(); + if (tai.hasValue()) + { + m_storage->m_forbiddenTaiListRoaming->add(tai); + nas::utils::RemoveFromTaiList(m_usim->m_taiList, nas::VTrackingAreaIdentity{tai}); + } } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index f77953d17..a1ba66cd6 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -35,7 +35,6 @@ class Usim nas::IE5gsMobileIdentity m_storedGuti{}; // Plmn related - std::optional m_currentTai{}; std::optional m_lastVisitedRegisteredTai{}; nas::IE5gsTrackingAreaIdentityList m_taiList{}; nas::IEPlmnList m_equivalentPlmnList{}; diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 3b794d2db..d2817757c 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -70,13 +70,17 @@ struct NwUeRrcToNas : NtsMessage RADIO_LINK_FAILURE, PAGING, NAS_NOTIFY, + ACTIVE_CELL_CHANGED } present; // NAS_DELIVERY - OctetString nasPdu{}; + OctetString nasPdu; // PAGING - std::vector pagingTmsi{}; + std::vector pagingTmsi; + + // ACTIVE_CELL_CHANGED + Tai lastTai; explicit NwUeRrcToNas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_NAS), present(present) { diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index e67fdb91e..26811b4d2 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -28,6 +28,7 @@ void UeRrcTask::performCellSelection() return; int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); + Tai lastTai = m_base->shCtx.getCurrentTai(); bool shouldLogErrors = lastCell != 0 || (currentTime - m_lastTimePlmnSearchFailureLogged >= 30'000LL); @@ -97,11 +98,13 @@ void UeRrcTask::performCellSelection() if (selectedCell != lastCell) { - auto *w = new NwUeRrcToRls(NwUeRrcToRls::ASSIGN_CURRENT_CELL); - w->cellId = selectedCell; - m_base->rlsTask->push(w); + auto *w1 = new NwUeRrcToRls(NwUeRrcToRls::ASSIGN_CURRENT_CELL); + w1->cellId = selectedCell; + m_base->rlsTask->push(w1); - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::NAS_NOTIFY)); + auto w2 = new NwUeRrcToNas(NwUeRrcToNas::ACTIVE_CELL_CHANGED); + w2->lastTai = lastTai; + m_base->nasTask->push(w2); } } diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 6d03bf51b..f2535322c 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -182,3 +182,8 @@ Tai::Tai(const Plmn &plmn, int tac) : plmn{plmn}, tac{tac} Tai::Tai(int mcc, int mnc, bool longMnc, int tac) : plmn{mcc, mnc, longMnc}, tac{tac} { } + +bool Tai::hasValue() const +{ + return plmn.hasValue(); +} diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index ef6df1f47..19637d27b 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -42,6 +42,8 @@ struct Tai Tai(); Tai(const Plmn& plmn, int tac); Tai(int mcc, int mnc, bool longMnc, int tac); + + [[nodiscard]] bool hasValue() const; }; struct SingleSlice From c5bb895bc8fc5463528ce017bf997e5d4ab95a6b Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 20:10:21 +0300 Subject: [PATCH 147/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 85 ++++++++++++++++++++++++----------------- src/ue/nas/sm/base.cpp | 2 +- src/ue/rrc/idle.cpp | 3 +- 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 6796e94e9..8bad86390 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -105,7 +105,7 @@ void NasMm::performPlmnSelection() } else if (lastSelectedPlmn != selected) { - m_logger->info("Selected PLMN[%s]", ToJson(selected).str().c_str()); + m_logger->info("Selected plmn[%s]", ToJson(selected).str().c_str()); m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::RRC_NOTIFY)); } @@ -151,46 +151,60 @@ void NasMm::handleActiveCellChange(const Tai &lastTai) return; } - Tai currentTai = m_base->shCtx.getCurrentTai(); + auto currentCell = m_base->shCtx.currentCell.get(); + Tai currentTai = Tai{currentCell.plmn, currentCell.tac}; -} - -/*void NasMm::handleServingCellChange(const UeCellInfo &servingCell) -{ - if (m_cmState == ECmState::CM_CONNECTED) + if (m_mmState == EMmState::MM_REGISTERED) { - m_logger->err("Serving cell change in CM-CONNECTED"); - return; - } + if (currentCell.cellId == 0) + { + if (m_mmSubState != EMmSubState::MM_REGISTERED_PLMN_SEARCH && + m_mmSubState != EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE) + { + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); + } + } + else + { + if (currentCell.category == ECellCategory::SUITABLE_CELL) + switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + else if (currentCell.category == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + else + switchMmState(EMmSubState::MM_REGISTERED_PS); - if (servingCell.cellCategory != ECellCategory::ACCEPTABLE_CELL && - servingCell.cellCategory != ECellCategory::SUITABLE_CELL) - { - m_logger->err("Serving cell change with unhandled cell category"); - return; + if (!nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + sendMobilityRegistration(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); + } } - - m_logger->info("Serving cell determined [%s]", servingCell.gnbName.c_str()); - - if (m_mmState == EMmState::MM_REGISTERED || m_mmState == EMmState::MM_DEREGISTERED) + else if (m_mmState == EMmState::MM_DEREGISTERED) { - bool isSuitable = servingCell.cellCategory == ECellCategory::SUITABLE_CELL; - - if (m_mmState == EMmState::MM_REGISTERED) - switchMmState(EMmState::MM_REGISTERED, isSuitable ? EMmSubState::MM_REGISTERED_NORMAL_SERVICE - : EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + if (currentCell.cellId == 0) + { + if (m_mmSubState != EMmSubState::MM_DEREGISTERED_PLMN_SEARCH && + m_mmSubState != EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) + { + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + } + } else - switchMmState(EMmState::MM_DEREGISTERED, isSuitable ? EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE - : EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + { + if (currentCell.category == ECellCategory::SUITABLE_CELL) + switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + else if (currentCell.category == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + else + switchMmState(EMmSubState::MM_DEREGISTERED_PS); + } } - // todo: else, other states abnormal case - - resetRegAttemptCounter(); - - m_usim->m_servingCell = servingCell; - m_usim->m_currentTai = - nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(servingCell.cellId.plmn), octet3{servingCell.tac}}; -}*/ + else if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED || + m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) + { + // This should never happen + m_logger->err("Active cell change in [CM-IDLE] state while MM specific procedure is ongoing"); + localReleaseConnection(); + } +} void NasMm::handleRrcConnectionSetup() { @@ -219,6 +233,9 @@ void NasMm::handleRadioLinkFailure() void NasMm::localReleaseConnection() { + if (m_cmState == ECmState::CM_IDLE) + return; + m_logger->info("Performing local release of NAS connection"); m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::LOCAL_RELEASE_CONNECTION)); diff --git a/src/ue/nas/sm/base.cpp b/src/ue/nas/sm/base.cpp index 6850756d1..5aec6c937 100644 --- a/src/ue/nas/sm/base.cpp +++ b/src/ue/nas/sm/base.cpp @@ -37,7 +37,7 @@ void NasSm::establishInitialSessions() return; } - m_logger->info("Initial PDU sessions are establishing [%d#]", m_base->config->initSessions.size()); + m_logger->debug("Initial PDU sessions are establishing [%d#]", m_base->config->initSessions.size()); for (auto &sess : m_base->config->initSessions) sendEstablishmentRequest(sess); diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index 26811b4d2..7b391f65c 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -94,7 +94,8 @@ void UeRrcTask::performCellSelection() m_base->shCtx.currentCell.set(cellInfo); if (selectedCell != 0 && selectedCell != lastCell) - m_logger->info("Selected cell id[%d] category[%s]", selectedCell, ToJson(cellInfo.category).str().c_str()); + m_logger->info("Selected cell plmn[%s] tac[%d] category[%s]", ToJson(cellInfo.plmn).str().c_str(), cellInfo.tac, + ToJson(cellInfo.category).str().c_str()); if (selectedCell != lastCell) { From 509824ae87560850d8bb2ada9c8b28b74a5fb7f1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 20:14:03 +0300 Subject: [PATCH 148/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 8bad86390..fe3e93a2f 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -202,7 +202,7 @@ void NasMm::handleActiveCellChange(const Tai &lastTai) { // This should never happen m_logger->err("Active cell change in [CM-IDLE] state while MM specific procedure is ongoing"); - localReleaseConnection(); + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } } From 9be407e975f97f3579c92cbe00284ae4aaf3f561 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 20:32:36 +0300 Subject: [PATCH 149/311] L3 RRC/NAS developments --- src/lib/nas/ie3.cpp | 5 +++++ src/lib/nas/ie3.hpp | 1 + src/lib/nas/storage.hpp | 5 +++++ src/ue/nas/mm/access.cpp | 4 ++-- src/ue/nas/mm/auth.cpp | 2 +- src/ue/nas/mm/config.cpp | 2 +- src/ue/nas/mm/dereg.cpp | 6 +++--- src/ue/nas/mm/ecall.cpp | 2 +- src/ue/nas/mm/radio.cpp | 7 ++++++- src/ue/nas/mm/register.cpp | 22 +++++++++++++--------- src/ue/nas/mm/service.cpp | 6 +++--- src/ue/nas/storage.cpp | 8 +++++--- src/ue/nas/storage.hpp | 7 ++++--- src/ue/nas/usim/usim.hpp | 1 - 14 files changed, 50 insertions(+), 28 deletions(-) diff --git a/src/lib/nas/ie3.cpp b/src/lib/nas/ie3.cpp index 75897087e..0d7360a07 100644 --- a/src/lib/nas/ie3.cpp +++ b/src/lib/nas/ie3.cpp @@ -32,6 +32,11 @@ IE5gsTrackingAreaIdentity::IE5gsTrackingAreaIdentity(int mcc, int mnc, bool isLo { } +IE5gsTrackingAreaIdentity::IE5gsTrackingAreaIdentity(const Tai &tai) + : mcc(tai.plmn.mcc), mnc(tai.plmn.mnc), isLongMnc(tai.plmn.isLongMnc), trackingAreaCode(tai.tac) +{ +} + IE5gsTrackingAreaIdentity IE5gsTrackingAreaIdentity::Decode(const OctetView &stream) { auto plmn = VPlmn::Decode(stream); diff --git a/src/lib/nas/ie3.hpp b/src/lib/nas/ie3.hpp index 19885d2a6..7aa9982ad 100644 --- a/src/lib/nas/ie3.hpp +++ b/src/lib/nas/ie3.hpp @@ -34,6 +34,7 @@ struct IE5gsTrackingAreaIdentity : InformationElement3 IE5gsTrackingAreaIdentity() = default; IE5gsTrackingAreaIdentity(int mcc, int mnc, bool isLongMnc, const octet3 &trackingAreaCode); + explicit IE5gsTrackingAreaIdentity(const Tai &tai); static IE5gsTrackingAreaIdentity Decode(const OctetView &stream); static void Encode(const IE5gsTrackingAreaIdentity &ie, OctetString &stream); diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index 6c3767380..b434496c7 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -207,6 +207,11 @@ class NasSlot return m_value; } + void clear() + { + set(T{}); + } + void set(const T &value) { autoClearIfNecessary(); diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index 95cfc3e46..5248595c2 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -52,12 +52,12 @@ bool NasMm::isInNonAllowedArea() if (!plmn.hasValue()) return false; - if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->m_serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) + if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) return true; int tac = m_base->shCtx.currentCell.get([](auto &value) { return value.tac; }); - if (nas::utils::ServiceAreaListForbidsTai(m_storage->m_serviceAreaList->get(), + if (nas::utils::ServiceAreaListForbidsTai(m_storage->serviceAreaList->get(), nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(plmn), octet3{tac}})) return true; diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index ed5433312..24bb98251 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -433,7 +433,7 @@ void NasMm::receiveAuthenticationReject(const nas::AuthenticationReject &msg) // Delete the stored 5G-GUTI, TAI list, last visited registered TAI and ngKSI. The USIM shall be considered invalid // until switching off the UE or the UICC containing the USIM is removed m_usim->m_storedGuti = {}; - m_usim->m_lastVisitedRegisteredTai = {}; + m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index ae816347d..31371aef2 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -59,7 +59,7 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms if (msg.serviceAreaList.has_value()) { hasNewConfig = true; - m_storage->m_serviceAreaList->set(*msg.serviceAreaList); + m_storage->serviceAreaList->set(*msg.serviceAreaList); } // "If the UE receives new NITZ information in the CONFIGURATION UPDATE COMMAND message, the UE considers the new diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index e7bb9b25f..2f20eb969 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -197,7 +197,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi // TS 23.122 [5]; otherwise the UE shall enter the state 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION." m_usim->m_storedGuti = {}; m_usim->m_taiList = {}; - m_usim->m_lastVisitedRegisteredTai = {}; + m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; @@ -219,7 +219,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi { switchUState(E5UState::U3_ROAMING_NOT_ALLOWED); m_usim->m_storedGuti = {}; - m_usim->m_lastVisitedRegisteredTai = {}; + m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; @@ -250,7 +250,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) - m_storage->m_forbiddenTaiListRoaming->add(tai); + m_storage->forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index f72dd7fcb..5942fb2fa 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -89,7 +89,7 @@ bool NasMm::switchToECallInactivityIfNeeded() // Perform item c) in 5.5.3 m_usim->m_storedGuti = {}; m_usim->m_taiList = {}; - m_usim->m_lastVisitedRegisteredTai = {}; + m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index fe3e93a2f..31d45a0ab 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -87,7 +87,7 @@ void NasMm::performPlmnSelection() continue; // If it's the HPLMN, it's already added above if (nas::utils::PlmnListContains(m_usim->m_forbiddenPlmnList, plmn)) continue; - if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->m_serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) + if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) continue; if (nas::utils::PlmnListContains(m_usim->m_equivalentPlmnList, plmn)) candidates.push_back(plmn); @@ -175,6 +175,8 @@ void NasMm::handleActiveCellChange(const Tai &lastTai) if (!nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) sendMobilityRegistration(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); + else + m_storage->lastVisitedRegisteredTai->set(currentTai); } } else if (m_mmState == EMmState::MM_DEREGISTERED) @@ -195,6 +197,9 @@ void NasMm::handleActiveCellChange(const Tai &lastTai) switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); else switchMmState(EMmSubState::MM_DEREGISTERED_PS); + + if (nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + m_storage->lastVisitedRegisteredTai->set(currentTai); } } else if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED || diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index c8b9544cb..b2dfb9b61 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -80,7 +80,9 @@ void NasMm::sendInitialRegistration(EInitialRegCause regCause) // Assign other fields request->mobileIdentity = getOrGeneratePreferredId(); - request->lastVisitedRegisteredTai = m_usim->m_lastVisitedRegisteredTai; + if (m_storage->lastVisitedRegisteredTai->get().hasValue()) + request->lastVisitedRegisteredTai = + nas::IE5gsTrackingAreaIdentity{m_storage->lastVisitedRegisteredTai->get()}; if (!requestedNssai.slices.empty()) request->requestedNSSAI = nas::utils::NssaiFrom(requestedNssai); request->ueSecurityCapability = createSecurityCapabilityIe(); @@ -173,7 +175,9 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) } // Assign other fields - request->lastVisitedRegisteredTai = m_usim->m_lastVisitedRegisteredTai; + if (m_storage->lastVisitedRegisteredTai->get().hasValue()) + request->lastVisitedRegisteredTai = + nas::IE5gsTrackingAreaIdentity{m_storage->lastVisitedRegisteredTai->get()}; request->mobileIdentity = getOrGeneratePreferredId(); if (!requestedNssai.slices.empty()) request->requestedNSSAI = nas::utils::NssaiFrom(requestedNssai); @@ -232,7 +236,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) // Store the TAI list as a registration area m_usim->m_taiList = msg.taiList.value_or(nas::IE5gsTrackingAreaIdentityList{}); // Store the service area list - m_storage->m_serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); + m_storage->serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); // Store the E-PLMN list and .. m_usim->m_equivalentPlmnList = msg.equivalentPLMNs.value_or(nas::IEPlmnList{}); @@ -355,7 +359,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg nas::utils::AddToPlmnList(m_usim->m_equivalentPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); // Store the service area list - m_storage->m_serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); + m_storage->serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); // "Upon receipt of the REGISTRATION ACCEPT message, the UE shall reset the registration attempt counter and service // request attempt counter, enter state 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED." @@ -513,7 +517,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA || cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { m_usim->m_storedGuti = {}; - m_usim->m_lastVisitedRegisteredTai = {}; + m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; @@ -565,7 +569,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) - m_storage->m_forbiddenTaiListRoaming->add(tai); + m_storage->forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) @@ -662,7 +666,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK) { m_usim->m_storedGuti = {}; - m_usim->m_lastVisitedRegisteredTai = {}; + m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; @@ -726,7 +730,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) - m_storage->m_forbiddenTaiListRoaming->add(tai); + m_storage->forbiddenTaiListRoaming->add(tai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) @@ -803,7 +807,7 @@ void NasMm::handleAbnormalInitialRegFailure(nas::ERegistrationType regType) // The UE shall delete 5G-GUTI, TAI list, last visited TAI, list of equivalent PLMNs and ngKSI, .. m_usim->m_storedGuti = {}; m_usim->m_taiList = {}; - m_usim->m_lastVisitedRegisteredTai = {}; + m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index a9cd5ef54..be0a01cba 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -287,7 +287,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { m_usim->m_storedGuti = {}; - m_usim->m_lastVisitedRegisteredTai = {}; + m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; @@ -312,7 +312,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) - m_storage->m_forbiddenTaiListRps->add(tai); + m_storage->forbiddenTaiListRps->add(tai); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) @@ -320,7 +320,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) { - m_storage->m_forbiddenTaiListRoaming->add(tai); + m_storage->forbiddenTaiListRoaming->add(tai); nas::utils::RemoveFromTaiList(m_usim->m_taiList, nas::VTrackingAreaIdentity{tai}); } } diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 02f4c641e..485f1551d 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -25,17 +25,19 @@ namespace nr::ue MmStorage::MmStorage(TaskBase *base) : m_base{base} { - m_forbiddenTaiListRoaming = std::make_unique>( + forbiddenTaiListRoaming = std::make_unique>( FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRoaming); }); - m_forbiddenTaiListRps = std::make_unique>( + forbiddenTaiListRps = std::make_unique>( FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRps); }); - m_serviceAreaList = std::make_unique>(0, std::nullopt); + serviceAreaList = std::make_unique>(0, std::nullopt); + + lastVisitedRegisteredTai = std::make_unique>(0, std::nullopt); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index a30ec0015..5931df99a 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -19,9 +19,10 @@ class MmStorage TaskBase *m_base; public: - std::unique_ptr> m_forbiddenTaiListRoaming; - std::unique_ptr> m_forbiddenTaiListRps; - std::unique_ptr> m_serviceAreaList; + std::unique_ptr> forbiddenTaiListRoaming; + std::unique_ptr> forbiddenTaiListRps; + std::unique_ptr> serviceAreaList; + std::unique_ptr> lastVisitedRegisteredTai; public: explicit MmStorage(TaskBase *base); diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index a1ba66cd6..bcd45a6c9 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -35,7 +35,6 @@ class Usim nas::IE5gsMobileIdentity m_storedGuti{}; // Plmn related - std::optional m_lastVisitedRegisteredTai{}; nas::IE5gsTrackingAreaIdentityList m_taiList{}; nas::IEPlmnList m_equivalentPlmnList{}; nas::IEPlmnList m_forbiddenPlmnList{}; From 08e7344aa49612b5b822b862f4e926993bf9be06 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 20:47:02 +0300 Subject: [PATCH 150/311] L3 RRC/NAS developments --- src/ue/nas/mm/config.cpp | 5 +++++ src/ue/nas/mm/register.cpp | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index 31371aef2..b944ae8e8 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -50,6 +50,11 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms { hasNewConfig = true; m_usim->m_taiList = *msg.taiList; + + Tai currentTai = m_base->shCtx.getCurrentTai(); + if (currentTai.hasValue() && + nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + m_storage->lastVisitedRegisteredTai->set(currentTai); } // "If the UE receives a new service area list in the CONFIGURATION UPDATE COMMAND message, the UE shall consider diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index b2dfb9b61..07d89da4a 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -235,6 +235,11 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) { // Store the TAI list as a registration area m_usim->m_taiList = msg.taiList.value_or(nas::IE5gsTrackingAreaIdentityList{}); + Tai currentTai = m_base->shCtx.getCurrentTai(); + if (currentTai.hasValue() && + nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + m_storage->lastVisitedRegisteredTai->set(currentTai); + // Store the service area list m_storage->serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); @@ -342,8 +347,15 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg // "The UE, upon receiving a REGISTRATION ACCEPT message, shall delete its old TAI list and store the received TAI // list. If there is no TAI list received, the UE shall consider the old TAI list as valid." if (msg.taiList.has_value()) + { m_usim->m_taiList = *msg.taiList; + Tai currentTai = m_base->shCtx.getCurrentTai(); + if (currentTai.hasValue() && + nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + m_storage->lastVisitedRegisteredTai->set(currentTai); + } + // Store the E-PLMN list and .. m_usim->m_equivalentPlmnList = msg.equivalentPLMNs.value_or(nas::IEPlmnList{}); // .. if the initial registration procedure is not for emergency services, the UE shall remove from the list any From 9f66734282602d820c696e19e811b1f57f3fc2b7 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 20:49:46 +0300 Subject: [PATCH 151/311] L3 RRC/NAS developments --- src/ue/nas/mm/interface.cpp | 2 +- src/ue/nas/mm/mm.hpp | 2 +- src/ue/nas/mm/radio.cpp | 2 +- src/ue/nts.hpp | 3 --- src/ue/rrc/idle.cpp | 2 -- 5 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index 7b059ab5a..a1ae167e1 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -47,7 +47,7 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) break; } case NwUeRrcToNas::ACTIVE_CELL_CHANGED: { - handleActiveCellChange(msg.lastTai); + handleActiveCellChange(); break; } } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index ae19dfb0f..2c53d3766 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -161,7 +161,7 @@ class NasMm private: /* Radio */ void performPlmnSelection(); void localReleaseConnection(); - void handleActiveCellChange(const Tai &lastTai); + void handleActiveCellChange(); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); void handleRadioLinkFailure(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 31d45a0ab..77453aefb 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -142,7 +142,7 @@ void NasMm::performPlmnSelection() } } -void NasMm::handleActiveCellChange(const Tai &lastTai) +void NasMm::handleActiveCellChange() { if (m_cmState == ECmState::CM_CONNECTED) { diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index d2817757c..294e6be59 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -79,9 +79,6 @@ struct NwUeRrcToNas : NtsMessage // PAGING std::vector pagingTmsi; - // ACTIVE_CELL_CHANGED - Tai lastTai; - explicit NwUeRrcToNas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_NAS), present(present) { } diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index 7b391f65c..8a02509af 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -28,7 +28,6 @@ void UeRrcTask::performCellSelection() return; int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); - Tai lastTai = m_base->shCtx.getCurrentTai(); bool shouldLogErrors = lastCell != 0 || (currentTime - m_lastTimePlmnSearchFailureLogged >= 30'000LL); @@ -104,7 +103,6 @@ void UeRrcTask::performCellSelection() m_base->rlsTask->push(w1); auto w2 = new NwUeRrcToNas(NwUeRrcToNas::ACTIVE_CELL_CHANGED); - w2->lastTai = lastTai; m_base->nasTask->push(w2); } } From dc57e4103e70b1eac14fb32f8b004cc9f6ca4590 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 21 May 2021 20:52:26 +0300 Subject: [PATCH 152/311] L3 RRC/NAS developments --- src/ue/rrc/idle.cpp | 6 +++--- src/ue/rrc/task.hpp | 4 ++-- src/ue/types.cpp | 2 +- src/ue/types.hpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index 8a02509af..a9eb9bb5d 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -31,7 +31,7 @@ void UeRrcTask::performCellSelection() bool shouldLogErrors = lastCell != 0 || (currentTime - m_lastTimePlmnSearchFailureLogged >= 30'000LL); - CurrentCellInfo cellInfo; + ActiveCellInfo cellInfo; CellSelectionReport report; bool cellFound = false; @@ -107,7 +107,7 @@ void UeRrcTask::performCellSelection() } } -bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo, CellSelectionReport &report) +bool UeRrcTask::lookForSuitableCell(ActiveCellInfo &cellInfo, CellSelectionReport &report) { Plmn selectedPlmn = m_base->shCtx.selectedPlmn.get(); if (!selectedPlmn.hasValue()) @@ -190,7 +190,7 @@ bool UeRrcTask::lookForSuitableCell(CurrentCellInfo &cellInfo, CellSelectionRepo return true; } -bool UeRrcTask::lookForAcceptableCell(CurrentCellInfo &cellInfo, CellSelectionReport &report) +bool UeRrcTask::lookForAcceptableCell(ActiveCellInfo &cellInfo, CellSelectionReport &report) { std::vector candidates; diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index a39bf6c55..7a502f857 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -100,8 +100,8 @@ class UeRrcTask : public NtsTask /* Idle Mode Operations */ void performCellSelection(); - bool lookForSuitableCell(CurrentCellInfo &cellInfo, CellSelectionReport &report); - bool lookForAcceptableCell(CurrentCellInfo &cellInfo, CellSelectionReport &report); + bool lookForSuitableCell(ActiveCellInfo &cellInfo, CellSelectionReport &report); + bool lookForAcceptableCell(ActiveCellInfo &cellInfo, CellSelectionReport &report); /* Cell Management */ void handleCellSignalChange(int cellId, int dbm); diff --git a/src/ue/types.cpp b/src/ue/types.cpp index c62a70eab..fa0d7d583 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -289,7 +289,7 @@ Json ToJson(const EServiceReqCause &v) } } -bool CurrentCellInfo::hasValue() const +bool ActiveCellInfo::hasValue() const { return cellId != 0; } diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 96535b25a..406417c2a 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -148,7 +148,7 @@ struct CellSelectionReport int forbiddenTaiCells{}; }; -struct CurrentCellInfo +struct ActiveCellInfo { int cellId{}; ECellCategory category{}; @@ -162,7 +162,7 @@ struct UeSharedContext { Locked> availablePlmns; Locked selectedPlmn; - Locked currentCell; + Locked currentCell; Locked> forbiddenTaiRoaming; Locked> forbiddenTaiRps; From 7ad237ca8348f70c3733a85f259bf65ecc4f17bc Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 00:12:38 +0300 Subject: [PATCH 153/311] L3 RRC/NAS developments --- src/utils/light_sync.cpp | 9 ++++++ src/utils/light_sync.hpp | 64 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/utils/light_sync.cpp create mode 100644 src/utils/light_sync.hpp diff --git a/src/utils/light_sync.cpp b/src/utils/light_sync.cpp new file mode 100644 index 000000000..da2972944 --- /dev/null +++ b/src/utils/light_sync.cpp @@ -0,0 +1,9 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "light_sync.hpp" diff --git a/src/utils/light_sync.hpp b/src/utils/light_sync.hpp new file mode 100644 index 000000000..a9f03fa3e --- /dev/null +++ b/src/utils/light_sync.hpp @@ -0,0 +1,64 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "common.hpp" + +#include +#include +#include + +template +class LightSync +{ + const int m_validForMs; + const int64_t m_validUntil; + const std::unique_ptr m_input; + std::atomic_bool m_processed; + std::shared_ptr m_output; + + public: + LightSync(int validForMs, std::unique_ptr &&input) + : m_validForMs{validForMs}, m_validUntil{utils::CurrentTimeMillis() + static_cast(validForMs)}, + m_input{std::move(input)}, m_processed{}, m_output{} + { + if (validForMs >= 2000) + throw std::runtime_error("LightSync timeout is too large"); + } + + const TInput &getInput() + { + return *m_input; + } + + bool isValid() + { + return utils::CurrentTimeMillis() <= m_validUntil; + } + + // Only producer can call at most once + void notifyProcessed(std::unique_ptr &&output) + { + if (m_processed) + throw std::runtime_error("LightSync processed more than once"); + m_output = std::move(output); + m_processed = true; + } + + // Only consumer can call at most once + std::shared_ptr waitForProcess() + { + while (true) + { + if (!isValid()) + return nullptr; + + if (m_processed) + return m_output; + } + } +}; \ No newline at end of file From 0792a7da55c03dfef60dd5b9f470defef5d0bae8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 00:14:08 +0300 Subject: [PATCH 154/311] L3 RRC/NAS developments --- src/utils/light_sync.hpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/utils/light_sync.hpp b/src/utils/light_sync.hpp index a9f03fa3e..4ca8a51e3 100644 --- a/src/utils/light_sync.hpp +++ b/src/utils/light_sync.hpp @@ -15,7 +15,6 @@ template class LightSync { - const int m_validForMs; const int64_t m_validUntil; const std::unique_ptr m_input; std::atomic_bool m_processed; @@ -23,10 +22,10 @@ class LightSync public: LightSync(int validForMs, std::unique_ptr &&input) - : m_validForMs{validForMs}, m_validUntil{utils::CurrentTimeMillis() + static_cast(validForMs)}, - m_input{std::move(input)}, m_processed{}, m_output{} + : m_validUntil{utils::CurrentTimeMillis() + static_cast(validForMs)}, m_input{std::move(input)}, + m_processed{}, m_output{} { - if (validForMs >= 2000) + if (validForMs >= 2500) throw std::runtime_error("LightSync timeout is too large"); } From 173b501c79ab138f5c0544f41799a38d8269a310 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 00:45:44 +0300 Subject: [PATCH 155/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 9 +++------ src/utils/light_sync.hpp | 34 ++++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 07d89da4a..928221906 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -81,8 +81,7 @@ void NasMm::sendInitialRegistration(EInitialRegCause regCause) // Assign other fields request->mobileIdentity = getOrGeneratePreferredId(); if (m_storage->lastVisitedRegisteredTai->get().hasValue()) - request->lastVisitedRegisteredTai = - nas::IE5gsTrackingAreaIdentity{m_storage->lastVisitedRegisteredTai->get()}; + request->lastVisitedRegisteredTai = nas::IE5gsTrackingAreaIdentity{m_storage->lastVisitedRegisteredTai->get()}; if (!requestedNssai.slices.empty()) request->requestedNSSAI = nas::utils::NssaiFrom(requestedNssai); request->ueSecurityCapability = createSecurityCapabilityIe(); @@ -176,8 +175,7 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) // Assign other fields if (m_storage->lastVisitedRegisteredTai->get().hasValue()) - request->lastVisitedRegisteredTai = - nas::IE5gsTrackingAreaIdentity{m_storage->lastVisitedRegisteredTai->get()}; + request->lastVisitedRegisteredTai = nas::IE5gsTrackingAreaIdentity{m_storage->lastVisitedRegisteredTai->get()}; request->mobileIdentity = getOrGeneratePreferredId(); if (!requestedNssai.slices.empty()) request->requestedNSSAI = nas::utils::NssaiFrom(requestedNssai); @@ -236,8 +234,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) // Store the TAI list as a registration area m_usim->m_taiList = msg.taiList.value_or(nas::IE5gsTrackingAreaIdentityList{}); Tai currentTai = m_base->shCtx.getCurrentTai(); - if (currentTai.hasValue() && - nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + if (currentTai.hasValue() && nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) m_storage->lastVisitedRegisteredTai->set(currentTai); // Store the service area list diff --git a/src/utils/light_sync.hpp b/src/utils/light_sync.hpp index 4ca8a51e3..837df20e1 100644 --- a/src/utils/light_sync.hpp +++ b/src/utils/light_sync.hpp @@ -15,28 +15,40 @@ template class LightSync { - const int64_t m_validUntil; + private: + const int64_t m_validUntilForProducer; + const int64_t m_validUntilForConsumer; const std::unique_ptr m_input; std::atomic_bool m_processed; std::shared_ptr m_output; public: - LightSync(int validForMs, std::unique_ptr &&input) - : m_validUntil{utils::CurrentTimeMillis() + static_cast(validForMs)}, m_input{std::move(input)}, - m_processed{}, m_output{} + LightSync(int validForMs, int estimatedProcessMs, std::unique_ptr &&input) + : m_validUntilForProducer{utils::CurrentTimeMillis() + static_cast(validForMs)}, + m_validUntilForConsumer{utils::CurrentTimeMillis() + static_cast(validForMs + estimatedProcessMs)}, + m_input{std::move(input)}, m_processed{}, m_output{} { if (validForMs >= 2500) throw std::runtime_error("LightSync timeout is too large"); + if (estimatedProcessMs >= 50) + throw std::runtime_error("LightSync estimated process time is too large"); } - const TInput &getInput() + private: + bool isExpiredForConsumer() + { + return utils::CurrentTimeMillis() > m_validUntilForConsumer; + } + + public: + const TInput &input() { return *m_input; } - bool isValid() + bool isExpiredForProducer() { - return utils::CurrentTimeMillis() <= m_validUntil; + return utils::CurrentTimeMillis() > m_validUntilForProducer; } // Only producer can call at most once @@ -53,11 +65,17 @@ class LightSync { while (true) { - if (!isValid()) + if (isExpiredForConsumer()) return nullptr; if (m_processed) return m_output; } } + + static std::shared_ptr> MakeShared(int validForMs, int estimatedProcessMs, + std::unique_ptr &&input) + { + return std::make_shared>(validForMs, estimatedProcessMs, std::move(input)); + } }; \ No newline at end of file From 838a734c977f764473e049f6482ffed61cd38d08 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 16:43:54 +0300 Subject: [PATCH 156/311] L3 RRC/NAS developments --- src/ue/nas/mm/interface.cpp | 4 ++++ src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/radio.cpp | 5 +++++ src/ue/nts.hpp | 3 ++- src/ue/rrc/connection.cpp | 2 +- 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index a1ae167e1..b35c593e8 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -50,6 +50,10 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) handleActiveCellChange(); break; } + case NwUeRrcToNas::RRC_ESTABLISHMENT_FAILURE: { + handleRrcEstablishmentFailure(); + break; + } } } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 2c53d3766..0db7841d0 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -164,6 +164,7 @@ class NasMm void handleActiveCellChange(); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); + void handleRrcEstablishmentFailure(); void handleRadioLinkFailure(); void handlePaging(const std::vector &tmsiIds); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 77453aefb..8d581a8f4 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -221,6 +221,11 @@ void NasMm::handleRrcConnectionRelease() switchCmState(ECmState::CM_IDLE); } +void NasMm::handleRrcEstablishmentFailure() +{ + +} + void NasMm::handleRadioLinkFailure() { if (m_cmState == ECmState::CM_CONNECTED) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 294e6be59..fcfdf4613 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -64,12 +64,13 @@ struct NwUeRrcToNas : NtsMessage { enum PR { + NAS_NOTIFY, NAS_DELIVERY, RRC_CONNECTION_SETUP, RRC_CONNECTION_RELEASE, + RRC_ESTABLISHMENT_FAILURE, RADIO_LINK_FAILURE, PAGING, - NAS_NOTIFY, ACTIVE_CELL_CHANGED } present; diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp index f86140264..b9b96ab43 100644 --- a/src/ue/rrc/connection.cpp +++ b/src/ue/rrc/connection.cpp @@ -96,8 +96,8 @@ void UeRrcTask::receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg) if (!isActiveCell(cellId)) return; - // TODO m_logger->err("RRC Reject received"); + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_ESTABLISHMENT_FAILURE)); } void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) From d86f7060d3150134ce1d7d3c08049112829d485e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 16:49:54 +0300 Subject: [PATCH 157/311] L3 RRC/NAS developments --- src/ue/nts.hpp | 6 +++++- src/ue/rls/task.cpp | 4 +++- src/ue/rrc/connection.cpp | 6 ++++++ src/ue/rrc/sap.cpp | 4 ++++ src/ue/rrc/task.cpp | 6 ------ src/ue/rrc/task.hpp | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index fcfdf4613..5063266e8 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -141,7 +141,8 @@ struct NwUeRlsToRrc : NtsMessage enum PR { DOWNLINK_RRC_DELIVERY, - SIGNAL_CHANGED + SIGNAL_CHANGED, + RADIO_LINK_FAILURE } present; // DOWNLINK_RRC_DELIVERY @@ -155,6 +156,9 @@ struct NwUeRlsToRrc : NtsMessage // SIGNAL_CHANGED int dbm{}; + // RADIO_LINK_FAILURE + rls::ERlfCause rlfCause{}; + explicit NwUeRlsToRrc(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RRC), present(present) { } diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 36f42636c..8bec4210b 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -66,7 +66,9 @@ void UeRlsTask::onLoop() break; } case NwUeRlsToRls::RADIO_LINK_FAILURE: { - m_logger->debug("radio link failure [%d]", (int)w->rlfCause); + auto *m = new NwUeRlsToRrc(NwUeRlsToRrc::RADIO_LINK_FAILURE); + m->rlfCause = w->rlfCause; + m_base->rrcTask->push(m); break; } case NwUeRlsToRls::TRANSMISSION_FAILURE: { diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp index b9b96ab43..f04ff1484 100644 --- a/src/ue/rrc/connection.cpp +++ b/src/ue/rrc/connection.cpp @@ -107,4 +107,10 @@ void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); } +void UeRrcTask::handleRadioLinkFailure(rls::ERlfCause cause) +{ + m_state = ERrcState::RRC_IDLE; + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RADIO_LINK_FAILURE)); +} + } // namespace nr::ue diff --git a/src/ue/rrc/sap.cpp b/src/ue/rrc/sap.cpp index 2b3d1107c..94c5d5e42 100644 --- a/src/ue/rrc/sap.cpp +++ b/src/ue/rrc/sap.cpp @@ -27,6 +27,10 @@ void UeRrcTask::handleRlsSapMessage(NwUeRlsToRrc &msg) handleDownlinkRrc(msg.cellId, msg.channel, msg.pdu); break; } + case NwUeRlsToRrc::RADIO_LINK_FAILURE: { + handleRadioLinkFailure(msg.rlfCause); + break; + } } } diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index ecf99d24d..b586c1518 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -87,10 +87,4 @@ void UeRrcTask::onLoop() delete msg; } -void UeRrcTask::handleRadioLinkFailure() -{ - m_state = ERrcState::RRC_IDLE; - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RADIO_LINK_FAILURE)); -} - } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 7a502f857..9ae23b9b8 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -75,7 +75,6 @@ class UeRrcTask : public NtsTask private: /* Handlers */ void receivePaging(const ASN_RRC_Paging &msg); - void handleRadioLinkFailure(); /* RRC Message Transmission and Receive */ void handleDownlinkRrc(int cellId, rrc::RrcChannel channel, const OctetString &pdu); @@ -124,6 +123,7 @@ class UeRrcTask : public NtsTask void receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg); void receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg); void receiveRrcRelease(const ASN_RRC_RRCRelease &msg); + void handleRadioLinkFailure(rls::ERlfCause cause); }; From 02c62f1a3fc914c975ccf23a0751efef1bd9d847 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 16:59:09 +0300 Subject: [PATCH 158/311] L3 RRC/NAS developments --- src/ue/rrc/connection.cpp | 6 ------ src/ue/rrc/failures.cpp | 29 +++++++++++++++++++++++++++++ src/ue/rrc/task.hpp | 4 +++- 3 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 src/ue/rrc/failures.cpp diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp index f04ff1484..b9b96ab43 100644 --- a/src/ue/rrc/connection.cpp +++ b/src/ue/rrc/connection.cpp @@ -107,10 +107,4 @@ void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); } -void UeRrcTask::handleRadioLinkFailure(rls::ERlfCause cause) -{ - m_state = ERrcState::RRC_IDLE; - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RADIO_LINK_FAILURE)); -} - } // namespace nr::ue diff --git a/src/ue/rrc/failures.cpp b/src/ue/rrc/failures.cpp new file mode 100644 index 000000000..3536f71ea --- /dev/null +++ b/src/ue/rrc/failures.cpp @@ -0,0 +1,29 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "task.hpp" + +#include +#include +#include + +namespace nr::ue +{ + +void UeRrcTask::declareRadioLinkFailure(rls::ERlfCause cause) +{ + handleRadioLinkFailure(cause); +} + +void UeRrcTask::handleRadioLinkFailure(rls::ERlfCause cause) +{ + m_state = ERrcState::RRC_IDLE; + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RADIO_LINK_FAILURE)); +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 9ae23b9b8..77a65c8fb 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -123,8 +123,10 @@ class UeRrcTask : public NtsTask void receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg); void receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg); void receiveRrcRelease(const ASN_RRC_RRCRelease &msg); - void handleRadioLinkFailure(rls::ERlfCause cause); + /* Failures */ + void declareRadioLinkFailure(rls::ERlfCause cause); + void handleRadioLinkFailure(rls::ERlfCause cause); }; } // namespace nr::ue From 8397d4e109560fb7530b44eef6aef7edd114d1ec Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 17:05:52 +0300 Subject: [PATCH 159/311] L3 RRC/NAS developments --- src/ue/rrc/connection.cpp | 27 +++++++++++++++++++++++---- src/ue/rrc/nas.cpp | 2 +- src/ue/rrc/task.hpp | 3 ++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp index b9b96ab43..96ab21a3a 100644 --- a/src/ue/rrc/connection.cpp +++ b/src/ue/rrc/connection.cpp @@ -38,8 +38,23 @@ static ASN_RRC_UL_CCCH_Message *ConstructSetupRequest(ASN_RRC_InitialUE_Identity return pdu; } -void UeRrcTask::startConnectionSetup(OctetString &&nasPdu) +void UeRrcTask::startConnectionEstablishment(OctetString &&nasPdu) { + if (m_state != ERrcState::RRC_IDLE) + { + m_logger->err("RRC establishment could not start, UE not in RRC-IDLE state"); + handleEstablishmentFailure(); + return; + } + + int activeCell = m_base->shCtx.currentCell.get([](auto &item) { return item.cellId; }); + if (activeCell == 0) + { + m_logger->err("RRC establishment could not start, no active cell"); + handleEstablishmentFailure(); + return; + } + // TODO: if it's already in progress if (m_initialId.present == ASN_RRC_InitialUE_Identity_PR_NOTHING) @@ -50,8 +65,6 @@ void UeRrcTask::startConnectionSetup(OctetString &&nasPdu) m_initialNasPdu = std::move(nasPdu); - int activeCell = m_base->shCtx.currentCell.get([](auto &item) { return item.cellId; }); - m_logger->debug("Sending RRC Setup Request"); auto *rrcSetupRequest = ConstructSetupRequest(m_initialId, ASN_RRC_EstablishmentCause_mo_Data); @@ -97,7 +110,8 @@ void UeRrcTask::receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg) return; m_logger->err("RRC Reject received"); - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_ESTABLISHMENT_FAILURE)); + + handleEstablishmentFailure(); } void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) @@ -107,4 +121,9 @@ void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); } +void UeRrcTask::handleEstablishmentFailure() +{ + m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_ESTABLISHMENT_FAILURE)); +} + } // namespace nr::ue diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp index 662f50961..c7619946b 100644 --- a/src/ue/rrc/nas.cpp +++ b/src/ue/rrc/nas.cpp @@ -33,7 +33,7 @@ void UeRrcTask::deliverUplinkNas(uint32_t pduId, OctetString &&nasPdu) if (m_state == ERrcState::RRC_IDLE) { - startConnectionSetup(std::move(nasPdu)); + startConnectionEstablishment(std::move(nasPdu)); return; } else if (m_state == ERrcState::RRC_INACTIVE) diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 77a65c8fb..d769548e7 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -119,7 +119,8 @@ class UeRrcTask : public NtsTask void receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTransfer &msg); /* Connection Control */ - void startConnectionSetup(OctetString &&nasPdu); + void startConnectionEstablishment(OctetString &&nasPdu); + void handleEstablishmentFailure(); void receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg); void receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg); void receiveRrcRelease(const ASN_RRC_RRCRelease &msg); From 629a07ad53f6150c3f3794c7187cb41c55cf9688 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 17:15:37 +0300 Subject: [PATCH 160/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 +- src/ue/nas/mm/mm.hpp | 4 ++-- src/ue/nas/sm/base.cpp | 2 +- src/ue/nas/sm/sm.hpp | 4 ++-- src/ue/nas/task.hpp | 2 +- src/ue/types.cpp | 4 ++-- src/ue/types.hpp | 6 +++--- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 906d7ae9d..1e4aea6ed 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -54,7 +54,7 @@ static EMmState GetMmStateFromSubState(EMmSubState subState) std::terminate(); } -NasMm::NasMm(TaskBase *base, UeTimers *timers) : m_base{base}, m_timers{timers}, m_sm{}, m_usim{} +NasMm::NasMm(TaskBase *base, NasTimers *timers) : m_base{base}, m_timers{timers}, m_sm{}, m_usim{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "nas"); diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 0db7841d0..ede279102 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -27,7 +27,7 @@ class NasMm { private: TaskBase *m_base; - UeTimers *m_timers; + NasTimers *m_timers; std::unique_ptr m_logger; NasSm *m_sm; Usim *m_usim; @@ -70,7 +70,7 @@ class NasMm friend class UeCmdHandler; public: - NasMm(TaskBase *base, UeTimers *timers); + NasMm(TaskBase *base, NasTimers *timers); public: /* Base */ void onStart(NasSm *sm, Usim *usim); diff --git a/src/ue/nas/sm/base.cpp b/src/ue/nas/sm/base.cpp index 5aec6c937..20c5f6d84 100644 --- a/src/ue/nas/sm/base.cpp +++ b/src/ue/nas/sm/base.cpp @@ -11,7 +11,7 @@ namespace nr::ue { -NasSm::NasSm(TaskBase *base, UeTimers *timers) : m_base(base), m_timers(timers), m_mm(nullptr) +NasSm::NasSm(TaskBase *base, NasTimers *timers) : m_base(base), m_timers(timers), m_mm(nullptr) { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "nas"); diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index 00127973b..0d6b5b72c 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -25,7 +25,7 @@ class NasSm { private: TaskBase *m_base; - UeTimers *m_timers; + NasTimers *m_timers; std::unique_ptr m_logger; NasMm *m_mm; @@ -35,7 +35,7 @@ class NasSm friend class UeCmdHandler; public: - NasSm(TaskBase *base, UeTimers *timers); + NasSm(TaskBase *base, NasTimers *timers); public: /* Base */ diff --git a/src/ue/nas/task.hpp b/src/ue/nas/task.hpp index 285a2ef29..df2fc588b 100644 --- a/src/ue/nas/task.hpp +++ b/src/ue/nas/task.hpp @@ -27,7 +27,7 @@ class NasTask : public NtsTask TaskBase *base; std::unique_ptr logger; - UeTimers timers; + NasTimers timers; NasMm *mm; NasSm *sm; Usim *usim; diff --git a/src/ue/types.cpp b/src/ue/types.cpp index fa0d7d583..c89d13462 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -12,7 +12,7 @@ namespace nr::ue { -UeTimers::UeTimers() +NasTimers::NasTimers() : t3346(3346, true, INT32_MAX), t3396(3396, false, INT32_MAX), t3444(3444, true, 12 * 60 * 60), t3445(3445, true, 12 * 60 * 60), t3502(3502, true, 12 * 60), t3510(3510, true, 15), t3511(3511, true, 10), t3512(3512, true, 54 * 60), t3516(3516, true, 30), t3517(3517, true, 15), t3519(3519, true, 60), @@ -144,7 +144,7 @@ Json ToJson(const UeConfig &v) }); } -Json ToJson(const UeTimers &v) +Json ToJson(const NasTimers &v) { return Json::Obj({ {"T3346", ToJson(v.t3346)}, diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 406417c2a..d2fd18a6e 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -187,7 +187,7 @@ struct TaskBase UeRlsTask *rlsTask{}; }; -struct UeTimers +struct NasTimers { nas::NasTimer t3346; /* MM - ... */ nas::NasTimer t3396; /* SM - ... */ @@ -210,7 +210,7 @@ struct UeTimers nas::NasTimer t3584; /* SM - ... */ nas::NasTimer t3585; /* SM - ... */ - UeTimers(); + NasTimers(); }; enum class ERmState @@ -545,7 +545,7 @@ Json ToJson(const EMmState &state); Json ToJson(const EMmSubState &state); Json ToJson(const E5UState &state); Json ToJson(const UeConfig &v); -Json ToJson(const UeTimers &v); +Json ToJson(const NasTimers &v); Json ToJson(const ERegUpdateCause &v); Json ToJson(const EPsState &v); Json ToJson(const UePduSessionInfo &v); From c0d05ab6ab9788a5b9c4fa1471a55652271a90e8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 17:20:31 +0300 Subject: [PATCH 161/311] L3 RRC/NAS developments --- src/ue/nas/mm/mm.hpp | 3 +-- src/ue/nas/mm/timer.cpp | 2 +- src/ue/nas/sm/sm.hpp | 5 ++-- src/ue/nas/sm/timer.cpp | 12 +++++----- src/ue/nas/task.cpp | 2 +- src/ue/nas/task.hpp | 1 - src/ue/nts.hpp | 3 +-- src/{lib/nas => ue}/timer.cpp | 33 +++++++++++-------------- src/{lib/nas => ue}/timer.hpp | 18 +++++--------- src/ue/types.hpp | 45 ++++++++++++++++++----------------- 10 files changed, 55 insertions(+), 69 deletions(-) rename src/{lib/nas => ue}/timer.cpp (81%) rename src/{lib/nas => ue}/timer.hpp (74%) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index ede279102..355381e5a 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -10,7 +10,6 @@ #include #include -#include #include #include #include @@ -179,7 +178,7 @@ class NasMm bool switchToECallInactivityIfNeeded(); private: /* Timer */ - void onTimerExpire(nas::NasTimer &timer); + void onTimerExpire(UeTimer &timer); public: /* Interface */ diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index 13ae468b6..9560ccc32 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -16,7 +16,7 @@ namespace nr::ue { -void NasMm::onTimerExpire(nas::NasTimer &timer) +void NasMm::onTimerExpire(UeTimer &timer) { auto logExpired = [this, &timer]() { m_logger->debug("NAS timer[%d] expired [%d]", timer.getCode(), timer.getExpiryCount()); diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index 0d6b5b72c..8fb997194 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -84,8 +83,8 @@ class NasSm void receiveReleaseCommand(const nas::PduSessionReleaseCommand &msg); /* Timer */ - std::unique_ptr newTransactionTimer(int code); - void onTimerExpire(nas::NasTimer &timer); + std::unique_ptr newTransactionTimer(int code); + void onTimerExpire(UeTimer &timer); void onTransactionTimerExpire(int pti); /* Procedure */ diff --git a/src/ue/nas/sm/timer.cpp b/src/ue/nas/sm/timer.cpp index 3043cbb8d..80b2dcc90 100644 --- a/src/ue/nas/sm/timer.cpp +++ b/src/ue/nas/sm/timer.cpp @@ -16,20 +16,20 @@ namespace nr::ue { -std::unique_ptr NasSm::newTransactionTimer(int code) +std::unique_ptr NasSm::newTransactionTimer(int code) { - std::unique_ptr timer; + std::unique_ptr timer; switch (code) { case 3580: - timer = std::make_unique(3580, false, 16); + timer = std::make_unique(3580, false, 16); break; case 3581: - timer = std::make_unique(3581, false, 16); + timer = std::make_unique(3581, false, 16); break; case 3582: - timer = std::make_unique(3582, false, 16); + timer = std::make_unique(3582, false, 16); break; default: m_logger->err("Bad SM transaction timer code"); @@ -40,7 +40,7 @@ std::unique_ptr NasSm::newTransactionTimer(int code) return timer; } -void NasSm::onTimerExpire(nas::NasTimer &timer) +void NasSm::onTimerExpire(UeTimer &timer) { } diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index 302beb8a4..d298750d5 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -122,7 +122,7 @@ void NasTask::onLoop() void NasTask::performTick() { - auto sendExpireMsg = [this](nas::NasTimer *timer) { + auto sendExpireMsg = [this](UeTimer *timer) { auto *nw = new NwUeNasToNas(NwUeNasToNas::NAS_TIMER_EXPIRE); nw->timer = timer; push(nw); diff --git a/src/ue/nas/task.hpp b/src/ue/nas/task.hpp index df2fc588b..99906b369 100644 --- a/src/ue/nas/task.hpp +++ b/src/ue/nas/task.hpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 5063266e8..597fa2793 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -14,7 +14,6 @@ #include #include -#include #include #include #include @@ -174,7 +173,7 @@ struct NwUeNasToNas : NtsMessage } present; // NAS_TIMER_EXPIRE - nas::NasTimer *timer{}; + UeTimer *timer{}; explicit NwUeNasToNas(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_NAS), present(present) { diff --git a/src/lib/nas/timer.cpp b/src/ue/timer.cpp similarity index 81% rename from src/lib/nas/timer.cpp rename to src/ue/timer.cpp index 894873163..ee68d137c 100644 --- a/src/lib/nas/timer.cpp +++ b/src/ue/timer.cpp @@ -12,31 +12,28 @@ #include -namespace nas -{ - -NasTimer::NasTimer(int timerCode, bool isMmTimer, int defaultInterval) +UeTimer::UeTimer(int timerCode, bool isMmTimer, int defaultInterval) : m_code(timerCode), m_isMm(isMmTimer), m_interval(defaultInterval), m_startMillis(0), m_isRunning(false), m_expiryCount(0), m_lastDebugPrintMs(0) { } -bool NasTimer::isRunning() const +bool UeTimer::isRunning() const { return m_isRunning; } -int NasTimer::getCode() const +int UeTimer::getCode() const { return m_code; } -bool NasTimer::isMmTimer() const +bool UeTimer::isMmTimer() const { return m_isMm; } -void NasTimer::start(bool clearExpiryCount) +void UeTimer::start(bool clearExpiryCount) { if (clearExpiryCount) resetExpiryCount(); @@ -44,7 +41,7 @@ void NasTimer::start(bool clearExpiryCount) m_isRunning = true; } -void NasTimer::start(const nas::IEGprsTimer2 &v, bool clearExpiryCount) +void UeTimer::start(const nas::IEGprsTimer2 &v, bool clearExpiryCount) { if (clearExpiryCount) resetExpiryCount(); @@ -53,7 +50,7 @@ void NasTimer::start(const nas::IEGprsTimer2 &v, bool clearExpiryCount) m_isRunning = true; } -void NasTimer::start(const nas::IEGprsTimer3 &v, bool clearExpiryCount) +void UeTimer::start(const nas::IEGprsTimer3 &v, bool clearExpiryCount) { if (clearExpiryCount) resetExpiryCount(); @@ -81,7 +78,7 @@ void NasTimer::start(const nas::IEGprsTimer3 &v, bool clearExpiryCount) m_isRunning = true; } -void NasTimer::stop(bool clearExpiryCount) +void UeTimer::stop(bool clearExpiryCount) { if (clearExpiryCount) resetExpiryCount(); @@ -93,7 +90,7 @@ void NasTimer::stop(bool clearExpiryCount) } } -bool NasTimer::performTick() +bool UeTimer::performTick() { if (m_isRunning) { @@ -114,12 +111,12 @@ bool NasTimer::performTick() return false; } -int NasTimer::getInterval() const +int UeTimer::getInterval() const { return m_interval; } -int NasTimer::getRemaining() const +int UeTimer::getRemaining() const { if (!m_isRunning) return 0; @@ -128,17 +125,17 @@ int NasTimer::getRemaining() const return std::max(m_interval - elapsed, 0); } -void NasTimer::resetExpiryCount() +void UeTimer::resetExpiryCount() { m_expiryCount = 0; } -int NasTimer::getExpiryCount() const +int UeTimer::getExpiryCount() const { return m_expiryCount; } -Json ToJson(const NasTimer &v) +Json ToJson(const UeTimer &v) { std::stringstream ss{}; if (v.isRunning()) @@ -148,5 +145,3 @@ Json ToJson(const NasTimer &v) return ss.str(); } - -} // namespace nas diff --git a/src/lib/nas/timer.hpp b/src/ue/timer.hpp similarity index 74% rename from src/lib/nas/timer.hpp rename to src/ue/timer.hpp index b49cb1727..1454cd4bb 100644 --- a/src/lib/nas/timer.hpp +++ b/src/ue/timer.hpp @@ -8,14 +8,10 @@ #pragma once -#include "ie4.hpp" - +#include #include -namespace nas -{ - -class NasTimer +class UeTimer { private: const int m_code; @@ -29,12 +25,12 @@ class NasTimer long m_lastDebugPrintMs; public: - NasTimer(int timerCode, bool isMmTimer, int defaultInterval); + UeTimer(int timerCode, bool isMmTimer, int defaultInterval); public: void start(bool clearExpiryCount = true); - void start(const IEGprsTimer2 &v, bool clearExpiryCount = true); - void start(const IEGprsTimer3 &v, bool clearExpiryCount = true); + void start(const nas::IEGprsTimer2 &v, bool clearExpiryCount = true); + void start(const nas::IEGprsTimer3 &v, bool clearExpiryCount = true); void stop(bool clearExpiryCount = true); void resetExpiryCount(); bool performTick(); @@ -46,6 +42,4 @@ class NasTimer [[nodiscard]] int getExpiryCount() const; }; -Json ToJson(const NasTimer &v); - -} // namespace nas \ No newline at end of file +Json ToJson(const UeTimer &v); diff --git a/src/ue/types.hpp b/src/ue/types.hpp index d2fd18a6e..72a311590 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -8,6 +8,8 @@ #pragma once +#include "timer.hpp" + #include #include #include @@ -17,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -189,26 +190,26 @@ struct TaskBase struct NasTimers { - nas::NasTimer t3346; /* MM - ... */ - nas::NasTimer t3396; /* SM - ... */ - - nas::NasTimer t3444; /* MM - ... */ - nas::NasTimer t3445; /* MM - ... */ - - nas::NasTimer t3502; /* MM - Initiation of the registration procedure, if still required */ - nas::NasTimer t3510; /* MM - Registration Request transmission timer */ - nas::NasTimer t3511; /* MM - Retransmission of the REGISTRATION REQUEST, if still required */ - nas::NasTimer t3512; /* MM - Periodic registration update timer */ - nas::NasTimer t3516; /* MM - 5G AKA - RAND and RES* storing timer */ - nas::NasTimer t3517; /* MM - Service Request transmission timer */ - nas::NasTimer t3519; /* MM - Transmission with fresh SUCI timer */ - nas::NasTimer t3520; /* MM - ... */ - nas::NasTimer t3521; /* MM - De-registration transmission timer for not switch off */ - nas::NasTimer t3525; /* MM - ... */ - nas::NasTimer t3540; /* MM - ... */ - - nas::NasTimer t3584; /* SM - ... */ - nas::NasTimer t3585; /* SM - ... */ + UeTimer t3346; /* MM - ... */ + UeTimer t3396; /* SM - ... */ + + UeTimer t3444; /* MM - ... */ + UeTimer t3445; /* MM - ... */ + + UeTimer t3502; /* MM - Initiation of the registration procedure, if still required */ + UeTimer t3510; /* MM - Registration Request transmission timer */ + UeTimer t3511; /* MM - Retransmission of the REGISTRATION REQUEST, if still required */ + UeTimer t3512; /* MM - Periodic registration update timer */ + UeTimer t3516; /* MM - 5G AKA - RAND and RES* storing timer */ + UeTimer t3517; /* MM - Service Request transmission timer */ + UeTimer t3519; /* MM - Transmission with fresh SUCI timer */ + UeTimer t3520; /* MM - ... */ + UeTimer t3521; /* MM - De-registration transmission timer for not switch off */ + UeTimer t3525; /* MM - ... */ + UeTimer t3540; /* MM - ... */ + + UeTimer t3584; /* SM - ... */ + UeTimer t3585; /* SM - ... */ NasTimers(); }; @@ -333,7 +334,7 @@ struct ProcedureTransaction static constexpr const int MAX_ID = 254; EPtState state{}; - std::unique_ptr timer{}; + std::unique_ptr timer{}; std::unique_ptr message{}; int psi{}; }; From 750d561319adca79522b61fd9545b791f70fd5fb Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 17:43:25 +0300 Subject: [PATCH 162/311] L3 RRC/NAS developments --- src/ue/rrc/connection.cpp | 2 -- src/ue/rrc/task.cpp | 2 +- src/ue/rrc/task.hpp | 9 +++++++-- src/ue/types.cpp | 4 ++++ src/ue/types.hpp | 7 +++++++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp index 96ab21a3a..3dd89895c 100644 --- a/src/ue/rrc/connection.cpp +++ b/src/ue/rrc/connection.cpp @@ -55,8 +55,6 @@ void UeRrcTask::startConnectionEstablishment(OctetString &&nasPdu) return; } - // TODO: if it's already in progress - if (m_initialId.present == ASN_RRC_InitialUE_Identity_PR_NOTHING) { m_initialId.present = ASN_RRC_InitialUE_Identity_PR_randomValue; diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index b586c1518..366ae3865 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -23,7 +23,7 @@ static constexpr const int TIMER_PERIOD_MACHINE_CYCLE = 2500; namespace nr::ue { -UeRrcTask::UeRrcTask(TaskBase *base) : m_base{base} +UeRrcTask::UeRrcTask(TaskBase *base) : m_base{base}, m_timers{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rrc"); diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index d769548e7..e3b93aec6 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -50,17 +50,22 @@ class UeRrcTask : public NtsTask private: TaskBase *m_base; std::unique_ptr m_logger; + int64_t m_startedTime; ERrcState m_state; + RrcTimers m_timers; + + /* Cell and PLMN related */ std::unordered_map m_cellDesc{}; + int64_t m_lastTimePlmnSearchFailureLogged{}; + /* Procedure related */ ERrcLastSetupRequest m_lastSetupReq{}; + /* Establishment procedure related */ ASN_RRC_InitialUE_Identity_t m_initialId{}; OctetString m_initialNasPdu{}; - int64_t m_lastTimePlmnSearchFailureLogged{}; - friend class UeCmdHandler; public: diff --git a/src/ue/types.cpp b/src/ue/types.cpp index c89d13462..eb6babdd5 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -309,4 +309,8 @@ Tai UeSharedContext::getCurrentTai() return tai; } +RrcTimers::RrcTimers() : t300(300, false, 1) +{ +} + } // namespace nr::ue diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 72a311590..019427716 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -188,6 +188,13 @@ struct TaskBase UeRlsTask *rlsTask{}; }; +struct RrcTimers +{ + UeTimer t300; + + RrcTimers(); +}; + struct NasTimers { UeTimer t3346; /* MM - ... */ From 8fc768a4bb5e5814a5c95c6c123094ca18708eb2 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 17:49:50 +0300 Subject: [PATCH 163/311] L3 RRC/NAS developments --- src/lib/rls/rls_base.hpp | 3 ++- src/ue/rrc/cells.cpp | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/lib/rls/rls_base.hpp b/src/lib/rls/rls_base.hpp index e021922ac..bb8cbb5e0 100644 --- a/src/lib/rls/rls_base.hpp +++ b/src/lib/rls/rls_base.hpp @@ -25,7 +25,8 @@ struct PduInfo enum class ERlfCause { PDU_ID_EXISTS, - PDU_ID_FULL + PDU_ID_FULL, + SIGNAL_LOST_TO_CONNECTED_CELL }; } // namespace rls \ No newline at end of file diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index 80dcf8cff..cc38cd18f 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -48,12 +48,22 @@ void UeRrcTask::notifyCellLost(int cellId) if (!m_cellDesc.count(cellId)) return; + bool isActiveCell = false; + m_base->shCtx.currentCell.mutate([&isActiveCell, cellId](auto &value) { + if (value.cellId == cellId) + { + value = {}; + isActiveCell = true; + } + }); + m_cellDesc.erase(cellId); m_logger->debug("Signal lost for cell[%d], total [%d] cells in coverage", cellId, static_cast(m_cellDesc.size())); - // TODO: handle other operations + if (isActiveCell && m_state != ERrcState::RRC_IDLE) + declareRadioLinkFailure(rls::ERlfCause::SIGNAL_LOST_TO_CONNECTED_CELL); updateAvailablePlmns(); } From 1ddb80324bbcba4407c30285caa393d9acfa8e22 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 18:19:28 +0300 Subject: [PATCH 164/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 2f20eb969..5034cdfbb 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -245,8 +245,14 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); } - if (cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || - cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) + if (cause == nas::EMmCause::TA_NOT_ALLOWED) + { + Tai tai = m_base->shCtx.getCurrentTai(); + if (tai.hasValue()) + m_storage->forbiddenTaiListRps->add(tai); + } + + if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) From f4816086a829be66fb43a79a29df85310f4ec4ed Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 18:22:18 +0300 Subject: [PATCH 165/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 928221906..d2b9b3c74 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -110,7 +110,7 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) { if (m_rmState == ERmState::RM_DEREGISTERED) { - m_logger->warn("Registration updating could not be triggered. UE is in RM-DEREGISTERED state."); + m_logger->warn("Mobility updating could not be triggered. UE is in RM-DEREGISTERED state."); return; } @@ -122,7 +122,7 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) isHighPriority() || hasEmergency() || updateCause == ERegUpdateCause::CONFIGURATION_UPDATE; if (!allowed) { - m_logger->debug("Registration updating canceled, T3346 is running"); + m_logger->debug("Mobility updating updating canceled, T3346 is running"); return; } } From 360d0e478173046d01a94ae945046f46a72de879 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 18:37:09 +0300 Subject: [PATCH 166/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 43 +++++++++++++++++++++++++++++++++++++++-- src/ue/nas/mm/ecall.cpp | 3 +++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 1e4aea6ed..067b38969 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -95,7 +95,28 @@ void NasMm::performMmCycle() if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PS) { - switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + if (m_cmState == ECmState::CM_IDLE) + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + else + { + auto cell = m_base->shCtx.currentCell.get(); + if (cell.hasValue()) + { + if (!m_usim->isValid()) + switchMmState(EMmSubState::MM_DEREGISTERED_NO_SUPI); + else if (cell.category == ECellCategory::SUITABLE_CELL) + switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + else if (cell.category == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + else + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + } + else + { + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + } + } + return; return; } else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) @@ -144,7 +165,25 @@ void NasMm::performMmCycle() if (m_mmSubState == EMmSubState::MM_REGISTERED_PS) { - switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); + if (m_cmState == ECmState::CM_IDLE) + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); + else + { + auto cell = m_base->shCtx.currentCell.get(); + if (cell.hasValue()) + { + if (cell.category == ECellCategory::SUITABLE_CELL) + switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + else if (cell.category == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + else + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); + } + else + { + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); + } + } return; } else if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index 5942fb2fa..2ad05bfa3 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -73,6 +73,9 @@ bool NasMm::startECallInactivityIfNeeded() bool NasMm::switchToECallInactivityIfNeeded() { + if (!m_usim->isValid()) + return false; + if (!m_usim->m_isECallOnly) return false; From 90f9633f5cad996e926a343cae55bfdb394e0044 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 18:37:25 +0300 Subject: [PATCH 167/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 067b38969..eac609f7b 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -117,7 +117,6 @@ void NasMm::performMmCycle() } } return; - return; } else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) { From f6aba39963c7f52012b4d9edb53377d0de0352cc Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 18:47:58 +0300 Subject: [PATCH 168/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 4 ++-- src/ue/nas/mm/auth.cpp | 2 +- src/ue/nas/mm/config.cpp | 4 ++-- src/ue/nas/mm/dereg.cpp | 6 +++--- src/ue/nas/mm/ecall.cpp | 2 +- src/ue/nas/mm/identity.cpp | 19 ++++++++++--------- src/ue/nas/mm/radio.cpp | 10 +++++----- src/ue/nas/mm/register.cpp | 12 ++++++------ src/ue/nas/mm/service.cpp | 4 ++-- src/ue/nas/mm/timer.cpp | 2 +- src/ue/nas/storage.cpp | 8 ++++++-- src/ue/nas/storage.hpp | 6 +++++- src/ue/nas/usim/usim.hpp | 4 ---- 13 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 79b99d340..85b034ae5 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -115,8 +115,8 @@ void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) {"mm-state", ToJson(m_base->nasTask->mm->m_mmSubState)}, {"5u-state", ToJson(m_base->nasTask->mm->m_usim->m_uState)}, {"sim-inserted", m_base->nasTask->mm->m_usim->isValid()}, - {"stored-suci", ToJson(m_base->nasTask->mm->m_usim->m_storedSuci)}, - {"stored-guti", ToJson(m_base->nasTask->mm->m_usim->m_storedGuti)}, + {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, + {"stored-guti", ToJson(m_base->nasTask->mm->m_storage->storedGuti->get())}, {"has-emergency", ::ToJson(m_base->nasTask->mm->hasEmergency())}, {"pdu-sessions", Json::Arr(std::move(pduSessions))}, }); diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index 24bb98251..13545be86 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -432,7 +432,7 @@ void NasMm::receiveAuthenticationReject(const nas::AuthenticationReject &msg) switchUState(E5UState::U3_ROAMING_NOT_ALLOWED); // Delete the stored 5G-GUTI, TAI list, last visited registered TAI and ngKSI. The USIM shall be considered invalid // until switching off the UE or the UICC containing the USIM is removed - m_usim->m_storedGuti = {}; + m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index b944ae8e8..62e6b094f 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -39,8 +39,8 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms if (msg.guti.has_value() && msg.guti->type == nas::EIdentityType::GUTI) { hasNewConfig = true; - m_usim->m_storedSuci = {}; - m_usim->m_storedGuti = *msg.guti; + m_storage->storedSuci->clear(); + m_storage->storedGuti->set(*msg.guti); m_timers->t3519.stop(); } diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 5034cdfbb..a3f961282 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -100,7 +100,7 @@ void NasMm::receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOrigina m_timers->t3521.stop(); m_timers->t3519.stop(); - m_usim->m_storedSuci = {}; + m_storage->storedSuci->clear(); m_sm->localReleaseAllSessions(); @@ -195,7 +195,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi // set the 5GS update status to 5U2 NOT UPDATED and shall start timer T3502. A UE not supporting S1 mode may // enter the state 5GMM-DEREGISTERED.PLMN-SEARCH in order to perform a PLMN selection according to 3GPP // TS 23.122 [5]; otherwise the UE shall enter the state 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION." - m_usim->m_storedGuti = {}; + m_storage->storedGuti->clear(); m_usim->m_taiList = {}; m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; @@ -218,7 +218,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA || cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { switchUState(E5UState::U3_ROAMING_NOT_ALLOWED); - m_usim->m_storedGuti = {}; + m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index 2ad05bfa3..ca740991f 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -90,7 +90,7 @@ bool NasMm::switchToECallInactivityIfNeeded() return false; // Perform item c) in 5.5.3 - m_usim->m_storedGuti = {}; + m_storage->storedGuti->clear(); m_usim->m_taiList = {}; m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; diff --git a/src/ue/nas/mm/identity.cpp b/src/ue/nas/mm/identity.cpp index 7e470d6b9..d95393e9e 100644 --- a/src/ue/nas/mm/identity.cpp +++ b/src/ue/nas/mm/identity.cpp @@ -33,12 +33,12 @@ void NasMm::receiveIdentityRequest(const nas::IdentityRequest &msg) } else if (msg.identityType.value == nas::EIdentityType::GUTI) { - resp.mobileIdentity = m_usim->m_storedGuti; + resp.mobileIdentity = m_storage->storedGuti->get(); } else if (msg.identityType.value == nas::EIdentityType::TMSI) { // TMSI is already a part of GUTI - resp.mobileIdentity = m_usim->m_storedGuti; + resp.mobileIdentity = m_storage->storedGuti->get(); if (resp.mobileIdentity.type != nas::EIdentityType::NO_IDENTITY) { resp.mobileIdentity.type = nas::EIdentityType::TMSI; @@ -57,15 +57,16 @@ void NasMm::receiveIdentityRequest(const nas::IdentityRequest &msg) nas::IE5gsMobileIdentity NasMm::getOrGenerateSuci() { - if (m_timers->t3519.isRunning() && m_usim->m_storedSuci.type != nas::EIdentityType::NO_IDENTITY) - return m_usim->m_storedSuci; + if (m_timers->t3519.isRunning() && m_storage->storedSuci->get().type != nas::EIdentityType::NO_IDENTITY) + return m_storage->storedSuci->get(); + + m_storage->storedSuci->set(generateSuci()); - m_usim->m_storedSuci = generateSuci(); m_timers->t3519.start(); - if (m_usim->m_storedSuci.type == nas::EIdentityType::NO_IDENTITY) + if (m_storage->storedSuci->get().type == nas::EIdentityType::NO_IDENTITY) return {}; - return m_usim->m_storedSuci; + return m_storage->storedSuci->get(); } nas::IE5gsMobileIdentity NasMm::generateSuci() @@ -99,8 +100,8 @@ nas::IE5gsMobileIdentity NasMm::generateSuci() nas::IE5gsMobileIdentity NasMm::getOrGeneratePreferredId() { - if (m_usim->m_storedGuti.type != nas::EIdentityType::NO_IDENTITY) - return m_usim->m_storedGuti; + if (m_storage->storedGuti->get().type != nas::EIdentityType::NO_IDENTITY) + return m_storage->storedGuti->get(); auto suci = getOrGenerateSuci(); if (suci.type != nas::EIdentityType::NO_IDENTITY) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 8d581a8f4..d8e0059da 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -223,7 +223,6 @@ void NasMm::handleRrcConnectionRelease() void NasMm::handleRrcEstablishmentFailure() { - } void NasMm::handleRadioLinkFailure() @@ -253,14 +252,15 @@ void NasMm::localReleaseConnection() void NasMm::handlePaging(const std::vector &tmsiIds) { - if (m_usim->m_storedGuti.type == nas::EIdentityType::NO_IDENTITY) + auto guti = m_storage->storedGuti->get(); + + if (guti.type == nas::EIdentityType::NO_IDENTITY) return; bool tmsiMatches = false; for (auto &tmsi : tmsiIds) { - if (tmsi.amfSetId == m_usim->m_storedGuti.gutiOrTmsi.amfSetId && - tmsi.amfPointer == m_usim->m_storedGuti.gutiOrTmsi.amfPointer && - tmsi.tmsi == m_usim->m_storedGuti.gutiOrTmsi.tmsi) + if (tmsi.amfSetId == guti.gutiOrTmsi.amfSetId && tmsi.amfPointer == guti.gutiOrTmsi.amfPointer && + tmsi.tmsi == guti.gutiOrTmsi.tmsi) { tmsiMatches = true; break; diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index d2b9b3c74..ca1589237 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -274,7 +274,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) { if (msg.mobileIdentity->type == nas::EIdentityType::GUTI) { - m_usim->m_storedGuti = *msg.mobileIdentity; + m_storage->storedGuti->set(*msg.mobileIdentity); m_timers->t3519.stop(); sendComplete = true; } @@ -392,7 +392,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg { if (msg.mobileIdentity->type == nas::EIdentityType::GUTI) { - m_usim->m_storedGuti = *msg.mobileIdentity; + m_storage->storedGuti->set(*msg.mobileIdentity); m_timers->t3519.stop(); sendComplete = true; } @@ -525,7 +525,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA || cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { - m_usim->m_storedGuti = {}; + m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; @@ -674,7 +674,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA || cause == nas::EMmCause::N1_MODE_NOT_ALLOWED || cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK) { - m_usim->m_storedGuti = {}; + m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; @@ -814,7 +814,7 @@ void NasMm::handleAbnormalInitialRegFailure(nas::ERegistrationType regType) else { // The UE shall delete 5G-GUTI, TAI list, last visited TAI, list of equivalent PLMNs and ngKSI, .. - m_usim->m_storedGuti = {}; + m_storage->storedGuti->clear(); m_usim->m_taiList = {}; m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; @@ -889,7 +889,7 @@ void NasMm::resetRegAttemptCounter() // the UE shall stop timer T3519 if running, and delete any stored SUCI" m_regCounter = 0; m_timers->t3519.stop(); - m_usim->m_storedSuci = {}; + m_storage->storedSuci->clear(); // TODO: Registration attempt counter shall be reset for these cases as well (not implemented yet) // - the UE is powered on; diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index be0a01cba..375982e94 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -142,7 +142,7 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) } // Assign TMSI (TMSI is a part of GUTI) - request->tmsi = m_usim->m_storedGuti; + request->tmsi = m_storage->storedGuti->get(); if (request->tmsi.type != nas::EIdentityType::NO_IDENTITY) { request->tmsi.type = nas::EIdentityType::TMSI; @@ -286,7 +286,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { - m_usim->m_storedGuti = {}; + m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_taiList = {}; m_usim->m_currentNsCtx = {}; diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index 9560ccc32..4eedb8192 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -111,7 +111,7 @@ void NasMm::onTimerExpire(UeTimer &timer) break; } case 3519: { - m_usim->m_storedSuci = {}; + m_storage->storedSuci->clear(); break; } case 3520: { diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 485f1551d..d303b39c2 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -25,6 +25,12 @@ namespace nr::ue MmStorage::MmStorage(TaskBase *base) : m_base{base} { + storedSuci = std::make_unique>(0, std::nullopt); + + storedGuti = std::make_unique>(0, std::nullopt); + + lastVisitedRegisteredTai = std::make_unique>(0, std::nullopt); + forbiddenTaiListRoaming = std::make_unique>( FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRoaming); @@ -36,8 +42,6 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} }); serviceAreaList = std::make_unique>(0, std::nullopt); - - lastVisitedRegisteredTai = std::make_unique>(0, std::nullopt); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 5931df99a..853b4385e 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -19,10 +19,14 @@ class MmStorage TaskBase *m_base; public: + std::unique_ptr> storedSuci; + std::unique_ptr> storedGuti; + + std::unique_ptr> lastVisitedRegisteredTai; std::unique_ptr> forbiddenTaiListRoaming; std::unique_ptr> forbiddenTaiListRps; + std::unique_ptr> serviceAreaList; - std::unique_ptr> lastVisitedRegisteredTai; public: explicit MmStorage(TaskBase *base); diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index bcd45a6c9..b7cd07da0 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -30,10 +30,6 @@ class Usim // State related E5UState m_uState{}; - // Identity related - nas::IE5gsMobileIdentity m_storedSuci{}; - nas::IE5gsMobileIdentity m_storedGuti{}; - // Plmn related nas::IE5gsTrackingAreaIdentityList m_taiList{}; nas::IEPlmnList m_equivalentPlmnList{}; From 5f51d36f7e0eff30c9cf4cc6f595da3d5ae08e92 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 18:51:01 +0300 Subject: [PATCH 169/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index ca1589237..c0e333c5c 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -274,6 +274,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) { if (msg.mobileIdentity->type == nas::EIdentityType::GUTI) { + m_storage->storedSuci->clear(); m_storage->storedGuti->set(*msg.mobileIdentity); m_timers->t3519.stop(); sendComplete = true; @@ -392,6 +393,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg { if (msg.mobileIdentity->type == nas::EIdentityType::GUTI) { + m_storage->storedSuci->clear(); m_storage->storedGuti->set(*msg.mobileIdentity); m_timers->t3519.stop(); sendComplete = true; From f7e87387e539f8b7d748ea490a1283cfd4ce7b25 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 19:00:49 +0300 Subject: [PATCH 170/311] L3 RRC/NAS developments --- src/ue/nas/mm/auth.cpp | 2 +- src/ue/nas/mm/config.cpp | 6 +++--- src/ue/nas/mm/dereg.cpp | 4 ++-- src/ue/nas/mm/ecall.cpp | 2 +- src/ue/nas/mm/radio.cpp | 4 ++-- src/ue/nas/mm/register.cpp | 19 ++++++++++--------- src/ue/nas/mm/service.cpp | 8 +++++--- src/ue/nas/storage.cpp | 2 ++ src/ue/nas/storage.hpp | 1 + src/ue/nas/usim/usim.hpp | 1 - 10 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index 13545be86..8855aee22 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -434,7 +434,7 @@ void NasMm::receiveAuthenticationReject(const nas::AuthenticationReject &msg) // until switching off the UE or the UICC containing the USIM is removed m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); - m_usim->m_taiList = {}; + m_storage->taiList->clear(); m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; m_usim->invalidate(); diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index 62e6b094f..d4fcf28e8 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -49,11 +49,11 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms if (msg.taiList.has_value()) { hasNewConfig = true; - m_usim->m_taiList = *msg.taiList; + + m_storage->taiList->set(*msg.taiList); Tai currentTai = m_base->shCtx.getCurrentTai(); - if (currentTai.hasValue() && - nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + if (currentTai.hasValue() && nas::utils::TaiListContains(*msg.taiList, nas::VTrackingAreaIdentity{currentTai})) m_storage->lastVisitedRegisteredTai->set(currentTai); } diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index a3f961282..414592f68 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -196,7 +196,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi // enter the state 5GMM-DEREGISTERED.PLMN-SEARCH in order to perform a PLMN selection according to 3GPP // TS 23.122 [5]; otherwise the UE shall enter the state 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION." m_storage->storedGuti->clear(); - m_usim->m_taiList = {}; + m_storage->taiList->clear(); m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; m_usim->m_currentNsCtx = {}; @@ -220,7 +220,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi switchUState(E5UState::U3_ROAMING_NOT_ALLOWED); m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); - m_usim->m_taiList = {}; + m_storage->taiList->clear(); m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; } diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index ca740991f..d54b433bd 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -91,7 +91,7 @@ bool NasMm::switchToECallInactivityIfNeeded() // Perform item c) in 5.5.3 m_storage->storedGuti->clear(); - m_usim->m_taiList = {}; + m_storage->taiList->clear(); m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; m_usim->m_currentNsCtx = {}; diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index d8e0059da..8c4749d05 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -173,7 +173,7 @@ void NasMm::handleActiveCellChange() else switchMmState(EMmSubState::MM_REGISTERED_PS); - if (!nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + if (!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) sendMobilityRegistration(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); else m_storage->lastVisitedRegisteredTai->set(currentTai); @@ -198,7 +198,7 @@ void NasMm::handleActiveCellChange() else switchMmState(EMmSubState::MM_DEREGISTERED_PS); - if (nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + if (nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) m_storage->lastVisitedRegisteredTai->set(currentTai); } } diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index c0e333c5c..67658b366 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -232,9 +232,10 @@ void NasMm::receiveRegistrationAccept(const nas::RegistrationAccept &msg) void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) { // Store the TAI list as a registration area - m_usim->m_taiList = msg.taiList.value_or(nas::IE5gsTrackingAreaIdentityList{}); + m_storage->taiList->set(msg.taiList.value_or(nas::IE5gsTrackingAreaIdentityList{})); Tai currentTai = m_base->shCtx.getCurrentTai(); - if (currentTai.hasValue() && nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + if (currentTai.hasValue() && + nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) m_storage->lastVisitedRegisteredTai->set(currentTai); // Store the service area list @@ -346,11 +347,10 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg // list. If there is no TAI list received, the UE shall consider the old TAI list as valid." if (msg.taiList.has_value()) { - m_usim->m_taiList = *msg.taiList; + m_storage->taiList->set(*msg.taiList); Tai currentTai = m_base->shCtx.getCurrentTai(); - if (currentTai.hasValue() && - nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{currentTai})) + if (currentTai.hasValue() && nas::utils::TaiListContains(*msg.taiList, nas::VTrackingAreaIdentity{currentTai})) m_storage->lastVisitedRegisteredTai->set(currentTai); } @@ -529,7 +529,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) { m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); - m_usim->m_taiList = {}; + m_storage->taiList->clear(); m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; } @@ -678,7 +678,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg { m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); - m_usim->m_taiList = {}; + m_storage->taiList->clear(); m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; } @@ -817,7 +817,7 @@ void NasMm::handleAbnormalInitialRegFailure(nas::ERegistrationType regType) { // The UE shall delete 5G-GUTI, TAI list, last visited TAI, list of equivalent PLMNs and ngKSI, .. m_storage->storedGuti->clear(); - m_usim->m_taiList = {}; + m_storage->taiList->clear(); m_storage->lastVisitedRegisteredTai->clear(); m_usim->m_equivalentPlmnList = {}; m_usim->m_currentNsCtx = {}; @@ -847,7 +847,8 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) if (m_regCounter < 5) { auto tai = m_base->shCtx.getCurrentTai(); - bool includedInTaiList = nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{tai}); + bool includedInTaiList = + nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{tai}); // "If the TAI of the current serving cell is not included in the TAI list or the 5GS update status is different // to 5U1 UPDATED" diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 375982e94..4a7c40cb9 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -34,7 +34,8 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) m_logger->err("Service Request canceled, UE not in 5U1 UPDATED state"); return; } - if (!nas::utils::TaiListContains(m_usim->m_taiList, nas::VTrackingAreaIdentity{m_base->shCtx.getCurrentTai()})) + if (!nas::utils::TaiListContains(m_storage->taiList->get(), + nas::VTrackingAreaIdentity{m_base->shCtx.getCurrentTai()})) { m_logger->err("Service Request canceled, current TAI is not in the TAI list"); return; @@ -288,7 +289,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) { m_storage->storedGuti->clear(); m_storage->lastVisitedRegisteredTai->clear(); - m_usim->m_taiList = {}; + m_storage->taiList->clear(); m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; } @@ -321,7 +322,8 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (tai.hasValue()) { m_storage->forbiddenTaiListRoaming->add(tai); - nas::utils::RemoveFromTaiList(m_usim->m_taiList, nas::VTrackingAreaIdentity{tai}); + m_storage->taiList->mutate( + [&tai](auto &value) { nas::utils::RemoveFromTaiList(value, nas::VTrackingAreaIdentity{tai}); }); } } diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index d303b39c2..6d80127f0 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -29,6 +29,8 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} storedGuti = std::make_unique>(0, std::nullopt); + taiList = std::make_unique>(0, std::nullopt); + lastVisitedRegisteredTai = std::make_unique>(0, std::nullopt); forbiddenTaiListRoaming = std::make_unique>( diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 853b4385e..00f5b56a0 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -22,6 +22,7 @@ class MmStorage std::unique_ptr> storedSuci; std::unique_ptr> storedGuti; + std::unique_ptr> taiList; std::unique_ptr> lastVisitedRegisteredTai; std::unique_ptr> forbiddenTaiListRoaming; std::unique_ptr> forbiddenTaiListRps; diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index b7cd07da0..9b3d9ae84 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -31,7 +31,6 @@ class Usim E5UState m_uState{}; // Plmn related - nas::IE5gsTrackingAreaIdentityList m_taiList{}; nas::IEPlmnList m_equivalentPlmnList{}; nas::IEPlmnList m_forbiddenPlmnList{}; From 9f77bdd5d34736f8930a772695b02529fcc2c1c3 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 19:02:12 +0300 Subject: [PATCH 171/311] L3 RRC/NAS developments --- src/ue/nas/mm/config.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index d4fcf28e8..54a4262b3 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -58,9 +58,8 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms } // "If the UE receives a new service area list in the CONFIGURATION UPDATE COMMAND message, the UE shall consider - // the - // new service area list as valid and the old service area list as invalid; otherwise, the UE shall consider the - // old service area list, if any, as valid." + // the new service area list as valid and the old service area list as invalid; otherwise, the UE shall consider + // the old service area list, if any, as valid." if (msg.serviceAreaList.has_value()) { hasNewConfig = true; From 84906d4cb48d350603836333b0fc69a5b1cdbb65 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 19:09:19 +0300 Subject: [PATCH 172/311] L3 RRC/NAS developments --- src/lib/nas/utils.cpp | 20 ++++++++++++++++++++ src/lib/nas/utils.hpp | 2 ++ src/ue/nas/mm/config.cpp | 19 ++++++++++++++----- src/ue/nas/mm/register.cpp | 15 ++++++++++++++- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/lib/nas/utils.cpp b/src/lib/nas/utils.cpp index d69eca31b..619dcbc73 100644 --- a/src/lib/nas/utils.cpp +++ b/src/lib/nas/utils.cpp @@ -434,4 +434,24 @@ void RemoveFromTaiList(IE5gsTrackingAreaIdentityList &list, const VTrackingAreaI list.list.end()); } +int TaiListSize(const IE5gsTrackingAreaIdentityList &list) +{ + int size = 0; + for (auto &item : list.list) + size += TaiListSize(item); + return size; +} + +int TaiListSize(const VPartialTrackingAreaIdentityList &list) +{ + size_t size = 0; + if (list.list00.has_value()) + size += list.list00->tacs.size(); + if (list.list01.has_value()) + size++; + if (list.list10.has_value()) + size += list.list10->tais.size(); + return static_cast(size); +} + } // namespace nas::utils diff --git a/src/lib/nas/utils.hpp b/src/lib/nas/utils.hpp index 4262ce560..1ea6a7cb0 100644 --- a/src/lib/nas/utils.hpp +++ b/src/lib/nas/utils.hpp @@ -31,6 +31,8 @@ bool PlmnListContains(const IEPlmnList &list, VPlmn item); bool PlmnListContains(const IEPlmnList &list, Plmn item); bool TaiListContains(const nas::IE5gsTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai); bool TaiListContains(const nas::VPartialTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai); +int TaiListSize(const nas::VPartialTrackingAreaIdentityList &list); +int TaiListSize(const nas::IE5gsTrackingAreaIdentityList &list); bool ServiceAreaListForbidsPlmn(const nas::IEServiceAreaList &list, const VPlmn &plmn); bool ServiceAreaListForbidsTai(const nas::IEServiceAreaList &list, const VTrackingAreaIdentity &tai); bool ServiceAreaListForbidsPlmn(const nas::VPartialServiceAreaList &list, const VPlmn &plmn); diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index 54a4262b3..f2cbed690 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -48,13 +48,22 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms // list as valid and the old TAI list as invalid; otherwise, the UE shall consider the old TAI list as valid." if (msg.taiList.has_value()) { - hasNewConfig = true; + if (nas::utils::TaiListSize(*msg.taiList) == 0) + { + m_logger->err("Invalid TAI list size"); + sendMmStatus(nas::EMmCause::SEMANTICALLY_INCORRECT_MESSAGE); + } + else + { + hasNewConfig = true; - m_storage->taiList->set(*msg.taiList); + m_storage->taiList->set(*msg.taiList); - Tai currentTai = m_base->shCtx.getCurrentTai(); - if (currentTai.hasValue() && nas::utils::TaiListContains(*msg.taiList, nas::VTrackingAreaIdentity{currentTai})) - m_storage->lastVisitedRegisteredTai->set(currentTai); + Tai currentTai = m_base->shCtx.getCurrentTai(); + if (currentTai.hasValue() && + nas::utils::TaiListContains(*msg.taiList, nas::VTrackingAreaIdentity{currentTai})) + m_storage->lastVisitedRegisteredTai->set(currentTai); + } } // "If the UE receives a new service area list in the CONFIGURATION UPDATE COMMAND message, the UE shall consider diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 67658b366..350571495 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -232,6 +232,12 @@ void NasMm::receiveRegistrationAccept(const nas::RegistrationAccept &msg) void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) { // Store the TAI list as a registration area + if (msg.taiList.has_value() && nas::utils::TaiListSize(*msg.taiList) == 0) + { + m_logger->err("Invalid TAI list size"); + sendMmStatus(nas::EMmCause::SEMANTICALLY_INCORRECT_MESSAGE); + return; + } m_storage->taiList->set(msg.taiList.value_or(nas::IE5gsTrackingAreaIdentityList{})); Tai currentTai = m_base->shCtx.getCurrentTai(); if (currentTai.hasValue() && @@ -347,6 +353,13 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg // list. If there is no TAI list received, the UE shall consider the old TAI list as valid." if (msg.taiList.has_value()) { + if (nas::utils::TaiListSize(*msg.taiList) == 0) + { + m_logger->err("Invalid TAI list size"); + sendMmStatus(nas::EMmCause::SEMANTICALLY_INCORRECT_MESSAGE); + return; + } + m_storage->taiList->set(*msg.taiList); Tai currentTai = m_base->shCtx.getCurrentTai(); @@ -441,7 +454,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg if (msg.networkFeatureSupport.has_value()) m_nwFeatureSupport = *msg.networkFeatureSupport; - // The service request attempt counter shall be reset when registration procedure for mobility and periodic + // The service request attempt counter shall be reset when registration procedure for mobility and periodic // registration update is successfully completed m_serCounter = 0; From 637e4a58e4e0a1e9011ea7ebf0d53ebd6692c24c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 20:02:07 +0300 Subject: [PATCH 173/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 35 +++++++++++++++++++++++++---------- src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/timer.cpp | 16 ++++++++++++++-- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index eac609f7b..37967d2c2 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -321,9 +321,9 @@ void NasMm::switchUState(E5UState state) void NasMm::onSwitchMmState(EMmState oldState, EMmState newState, EMmSubState oldSubState, EMmSubState newSubSate) { - // The UE shall mark the 5G NAS security context on the USIM or in the non-volatile memory as invalid when the UE + // "The UE shall mark the 5G NAS security context on the USIM or in the non-volatile memory as invalid when the UE // initiates an initial registration procedure as described in subclause 5.5.1.2 or when the UE leaves state - // 5GMM-DEREGISTERED for any other state except 5GMM-NULL. + // 5GMM-DEREGISTERED for any other state except 5GMM-NULL." if (oldState == EMmState::MM_DEREGISTERED && newState != EMmState::MM_DEREGISTERED && newState != EMmState::MM_NULL) { if (m_usim->m_currentNsCtx || m_usim->m_nonCurrentNsCtx) @@ -335,8 +335,8 @@ void NasMm::onSwitchMmState(EMmState oldState, EMmState newState, EMmSubState ol } } - // If the UE enters the 5GMM state 5GMM-DEREGISTERED or 5GMM-NULL, - // The RAND and RES* values stored in the ME shall be deleted and timer T3516, if running, shall be stopped + // "If the UE enters the 5GMM state 5GMM-DEREGISTERED or 5GMM-NULL, + // The RAND and RES* values stored in the ME shall be deleted and timer T3516, if running, shall be stopped" if (newState == EMmState::MM_DEREGISTERED || newState == EMmState::MM_NULL) { m_usim->m_rand = {}; @@ -352,6 +352,10 @@ void NasMm::onSwitchMmState(EMmState oldState, EMmState newState, EMmSubState ol { localReleaseConnection(); } + + // "Timer T3512 is stopped when the UE enters ... the 5GMM-DEREGISTERED state over 3GPP access" + if (newState == EMmState::MM_DEREGISTERED) + m_timers->t3512.stop(); } void NasMm::onSwitchRmState(ERmState oldState, ERmState newState) @@ -387,23 +391,34 @@ void NasMm::onSwitchCmState(ECmState oldState, ECmState newState) // 5.5.2.2.6 Abnormal cases in the UE (in de-registration) else if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) { - // The de-registration procedure shall be aborted and the UE proceeds as follows: + // "The de-registration procedure shall be aborted and the UE proceeds as follows: // if the de-registration procedure was performed due to disabling of 5GS services, the UE shall enter the - // 5GMM-NULL state; + // 5GMM-NULL state;" if (m_lastDeregCause == EDeregCause::DISABLE_5G) switchMmState(EMmSubState::MM_NULL_PS); - // if the de-registration type "normal de-registration" was requested for reasons other than disabling of - // 5GS services, the UE shall enter the 5GMM-DEREGISTERED state. + // "if the de-registration type "normal de-registration" was requested for reasons other than disabling of + // 5GS services, the UE shall enter the 5GMM-DEREGISTERED state." else if (m_lastDeregistrationRequest->deRegistrationType.switchOff == nas::ESwitchOff::NORMAL_DE_REGISTRATION) switchMmState(EMmSubState::MM_DEREGISTERED_PS); } - // If the UE enters the 5GMM-IDLE, the RAND and RES* values stored - // in the ME shall be deleted and timer T3516, if running, shall be stopped + // "If the UE enters the 5GMM-IDLE, the RAND and RES* values stored in the ME shall be deleted and timer T3516, + // if running, shall be stopped" m_usim->m_rand = {}; m_usim->m_resStar = {}; m_timers->t3516.stop(); + + // "Timer T3512 is reset and started with its initial value, when the UE changes from 5GMM-CONNECTED over 3GPP + // access to 5GMM-IDLE mode over 3GPP access" + m_timers->t3512.start(); + } + + if (oldState == ECmState::CM_IDLE && newState == ECmState::CM_CONNECTED) + { + // "Timer T3512 is stopped when the UE enters 5GMM-CONNECTED mode over 3GPP access or the 5GMM-DEREGISTERED + // state over 3GPP access" + m_timers->t3512.stop(); } } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 355381e5a..7caa149c8 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -138,6 +138,7 @@ class NasMm private: /* De-registration */ void receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOriginating &msg); void receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTerminated &msg); + void performLocalDeregistration(); private: /* Configuration */ void receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &msg); diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index 4eedb8192..b022ba53b 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -78,10 +78,22 @@ void NasMm::onTimerExpire(UeTimer &timer) break; } case 3512: { - if (m_mmState == EMmState::MM_REGISTERED && m_cmState == ECmState::CM_CONNECTED) + if (m_mmState == EMmState::MM_REGISTERED) { logExpired(); - sendMobilityRegistration(ERegUpdateCause::T3512_EXPIRY); + + if (m_registeredForEmergency) + performLocalDeregistration(); + else + { + if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) + sendMobilityRegistration(ERegUpdateCause::T3512_EXPIRY); + else + { + // TODO: "the periodic registration update procedure is delayed until the UE returns to + // 5GMM-REGISTERED.NORMAL-SERVICE over 3GPP access." See 5.3.7 + } + } } break; } From d3578ca47f5b616c5df49fe888f0a3b658bb1527 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 20:04:43 +0300 Subject: [PATCH 174/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 414592f68..911930149 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -312,4 +312,21 @@ 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(); + m_timers->t3519.stop(); + + m_storage->storedSuci->clear(); + + m_sm->localReleaseAllSessions(); + + switchMmState(EMmSubState::MM_DEREGISTERED_PS); +} + } // namespace nr::ue From 6818bd98c332e43a639d1d6e11afb8d53022b8a8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 20:19:05 +0300 Subject: [PATCH 175/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 4 ++++ src/ue/nas/storage.cpp | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 37967d2c2..bbff6ca0c 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -428,10 +428,14 @@ void NasMm::onSwitchUState(E5UState oldState, E5UState newState) void NasMm::onSimRemoval() { + m_storage->forbiddenTaiListRoaming->clear(); + m_storage->forbiddenTaiListRps->clear(); } void NasMm::onSwitchOff() { + m_storage->forbiddenTaiListRoaming->clear(); + m_storage->forbiddenTaiListRps->clear(); } } // namespace nr::ue diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 6d80127f0..2db72b0c4 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -29,8 +29,6 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} storedGuti = std::make_unique>(0, std::nullopt); - taiList = std::make_unique>(0, std::nullopt); - lastVisitedRegisteredTai = std::make_unique>(0, std::nullopt); forbiddenTaiListRoaming = std::make_unique>( @@ -44,6 +42,8 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} }); serviceAreaList = std::make_unique>(0, std::nullopt); + + taiList = std::make_unique>(0, std::nullopt); } } // namespace nr::ue \ No newline at end of file From 9d841446441712055a701d4090bdb563b85b5b3b Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 20:34:31 +0300 Subject: [PATCH 176/311] L3 RRC/NAS developments --- src/lib/nas/utils.cpp | 47 ++++++++++++++++++++++++++++++++++++++ src/lib/nas/utils.hpp | 4 ++++ src/ue/nas/mm/config.cpp | 38 ++++++++++++++++++++++++++++++ src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/register.cpp | 3 +++ src/utils/common_types.cpp | 8 +++++++ src/utils/common_types.hpp | 6 +++++ 7 files changed, 107 insertions(+) diff --git a/src/lib/nas/utils.cpp b/src/lib/nas/utils.cpp index 619dcbc73..c13cc6fd8 100644 --- a/src/lib/nas/utils.cpp +++ b/src/lib/nas/utils.cpp @@ -454,4 +454,51 @@ int TaiListSize(const VPartialTrackingAreaIdentityList &list) return static_cast(size); } +bool ServiceAreaListAllowsPlmn(const IEServiceAreaList &list, const VPlmn &plmn) +{ + return std::any_of(list.list.begin(), list.list.end(), + [&plmn](auto &item) { return ServiceAreaListAllowsPlmn(item, plmn); }); +} + +bool ServiceAreaListAllowsTai(const IEServiceAreaList &list, const VTrackingAreaIdentity &tai) +{ + return std::any_of(list.list.begin(), list.list.end(), + [&tai](auto &item) { return ServiceAreaListAllowsTai(item, tai); }); +} + +bool ServiceAreaListAllowsPlmn(const VPartialServiceAreaList &list, const VPlmn &plmn) +{ + if (list.present == 3) + { + if (list.list11->allowedType == EAllowedType::IN_THE_ALLOWED_AREA && DeepEqualsV(list.list11->plmn, plmn)) + return true; + } + return false; +} + +bool ServiceAreaListAllowsTai(const VPartialServiceAreaList &list, const VTrackingAreaIdentity &tai) +{ + if (list.present == 0) + { + if (list.list00->allowedType == EAllowedType::IN_THE_ALLOWED_AREA && DeepEqualsV(list.list00->plmn, tai.plmn) && + std::any_of(list.list00->tacs.begin(), list.list00->tacs.end(), + [&tai](auto &i) { return (int)i == (int)tai.tac; })) + return true; + } + else if (list.present == 1) + { + if (list.list01->allowedType == EAllowedType::IN_THE_ALLOWED_AREA && DeepEqualsV(list.list01->plmn, tai.plmn) && + (int)list.list01->tac == (int)tai.tac) + return true; + } + else if (list.present == 2) + { + if (list.list10->allowedType == EAllowedType::IN_THE_ALLOWED_AREA && + std::any_of(list.list10->tais.begin(), list.list10->tais.end(), + [tai](auto &i) { return DeepEqualsV(i, tai); })) + return true; + } + return false; +} + } // namespace nas::utils diff --git a/src/lib/nas/utils.hpp b/src/lib/nas/utils.hpp index 1ea6a7cb0..666930097 100644 --- a/src/lib/nas/utils.hpp +++ b/src/lib/nas/utils.hpp @@ -37,6 +37,10 @@ bool ServiceAreaListForbidsPlmn(const nas::IEServiceAreaList &list, const VPlmn bool ServiceAreaListForbidsTai(const nas::IEServiceAreaList &list, const VTrackingAreaIdentity &tai); bool ServiceAreaListForbidsPlmn(const nas::VPartialServiceAreaList &list, const VPlmn &plmn); bool ServiceAreaListForbidsTai(const nas::VPartialServiceAreaList &list, const VTrackingAreaIdentity &tai); +bool ServiceAreaListAllowsPlmn(const nas::IEServiceAreaList &list, const VPlmn &plmn); +bool ServiceAreaListAllowsTai(const nas::IEServiceAreaList &list, const VTrackingAreaIdentity &tai); +bool ServiceAreaListAllowsPlmn(const nas::VPartialServiceAreaList &list, const VPlmn &plmn); +bool ServiceAreaListAllowsTai(const nas::VPartialServiceAreaList &list, const VTrackingAreaIdentity &tai); const char *EnumToString(ERegistrationType v); const char *EnumToString(EMmCause v); diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index f2cbed690..089e8e84a 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -8,6 +8,8 @@ #include "mm.hpp" +#include + #include #include @@ -16,6 +18,8 @@ namespace nr::ue void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &msg) { + m_logger->debug("Configuration Update Command received"); + // Abnormal case: 5.4.4.5, c) Generic UE configuration update and de-registration procedure collision if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) { @@ -58,6 +62,7 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms hasNewConfig = true; m_storage->taiList->set(*msg.taiList); + updateForbiddenTaiListsForAllowedIndications(); Tai currentTai = m_base->shCtx.getCurrentTai(); if (currentTai.hasValue() && @@ -73,6 +78,7 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms { hasNewConfig = true; m_storage->serviceAreaList->set(*msg.serviceAreaList); + updateForbiddenTaiListsForAllowedIndications(); } // "If the UE receives new NITZ information in the CONFIGURATION UPDATE COMMAND message, the UE considers the new @@ -199,4 +205,36 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms } } +void NasMm::updateForbiddenTaiListsForAllowedIndications() +{ + // "A tracking area shall be removed from the list of "5GS forbidden tracking areas for roaming", as well as the + // list of "5GS forbidden tracking areas for regional provision of service", if the UE receives the tracking area in + // the TAI list or the Service area list of "allowed tracking areas" in REGISTRATION ACCEPT message or a + // CONFIGURATION UPDATE COMMAND message. The UE shall not remove the tracking area from "5GS forbidden tracking + // areas for roaming" or "5GS forbidden tracking areas for regional provision of service" if the UE is registered + // for emergency services" + + std::unordered_set taiSet; + + m_storage->forbiddenTaiListRoaming->forEach([&taiSet, this](auto &value) { + if (nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{value})) + taiSet.insert(value); + if (nas::utils::ServiceAreaListAllowsTai(m_storage->serviceAreaList->get(), nas::VTrackingAreaIdentity{value})) + taiSet.insert(value); + }); + + m_storage->forbiddenTaiListRps->forEach([&taiSet, this](auto &value) { + if (nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{value})) + taiSet.insert(value); + if (nas::utils::ServiceAreaListAllowsTai(m_storage->serviceAreaList->get(), nas::VTrackingAreaIdentity{value})) + taiSet.insert(value); + }); + + for (auto &tai : taiSet) + { + m_storage->forbiddenTaiListRoaming->remove(tai); + m_storage->forbiddenTaiListRps->remove(tai); + } +} + } // namespace nr::ue diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 7caa149c8..6703e7438 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -142,6 +142,7 @@ class NasMm private: /* Configuration */ void receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &msg); + void updateForbiddenTaiListsForAllowedIndications(); private: /* Identity */ void receiveIdentityRequest(const nas::IdentityRequest &msg); diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 350571495..bcdddee85 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -247,6 +247,8 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) // Store the service area list m_storage->serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); + updateForbiddenTaiListsForAllowedIndications(); + // Store the E-PLMN list and .. m_usim->m_equivalentPlmnList = msg.equivalentPLMNs.value_or(nas::IEPlmnList{}); // .. if the initial registration procedure is not for emergency services, the UE shall remove from the list any @@ -383,6 +385,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg // Store the service area list m_storage->serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); + updateForbiddenTaiListsForAllowedIndications(); // "Upon receipt of the REGISTRATION ACCEPT message, the UE shall reset the registration attempt counter and service // request attempt counter, enter state 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED." diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index f2535322c..ef6f20852 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -166,6 +166,14 @@ std::size_t std::hash::operator()(const GlobalNci &v) const noexcept return h; } +std::size_t std::hash::operator()(const Tai &v) const noexcept +{ + std::size_t h = 0; + utils::HashCombine(h, v.plmn); + utils::HashCombine(h, v.tac); + return h; +} + bool Plmn::hasValue() const { return this->mcc != 0; diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 19637d27b..555ae3e31 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -217,6 +217,12 @@ struct hash std::size_t operator()(const Plmn &v) const noexcept; }; +template <> +struct hash +{ + std::size_t operator()(const Tai &v) const noexcept; +}; + template <> struct hash { From a40bb41e3c828fda484503bc2055f4bdc9ae1ed6 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 20:46:25 +0300 Subject: [PATCH 177/311] L3 RRC/NAS developments --- src/lib/nas/utils.cpp | 9 +++++++++ src/lib/nas/utils.hpp | 1 + src/ue/nas/mm/dereg.cpp | 4 ++-- src/ue/nas/mm/ecall.cpp | 2 +- src/ue/nas/mm/radio.cpp | 2 +- src/ue/nas/mm/register.cpp | 34 ++++++++++++++++++---------------- src/ue/nas/mm/service.cpp | 2 +- src/ue/nas/storage.cpp | 9 ++++----- src/ue/nas/storage.hpp | 2 ++ src/ue/nas/usim/usim.hpp | 1 - 10 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/lib/nas/utils.cpp b/src/lib/nas/utils.cpp index c13cc6fd8..e6e2f05d1 100644 --- a/src/lib/nas/utils.cpp +++ b/src/lib/nas/utils.cpp @@ -501,4 +501,13 @@ bool ServiceAreaListAllowsTai(const VPartialServiceAreaList &list, const VTracki return false; } +Plmn PlmnFrom(const VPlmn &plmn) +{ + Plmn res; + res.mcc = plmn.mcc; + res.mnc = plmn.mnc; + res.isLongMnc = plmn.isLongMnc; + return res; +} + } // namespace nas::utils diff --git a/src/lib/nas/utils.hpp b/src/lib/nas/utils.hpp index 666930097..6ae4a7b62 100644 --- a/src/lib/nas/utils.hpp +++ b/src/lib/nas/utils.hpp @@ -17,6 +17,7 @@ IESNssai SNssaiFrom(const SingleSlice &v); IENssai NssaiFrom(const NetworkSlice &v); IEDnn DnnFromApn(const std::string &apn); VPlmn PlmnFrom(const Plmn &plmn); +Plmn PlmnFrom(const VPlmn &plmn); NetworkSlice NssaiTo(const IENssai &v); SingleSlice SNssaiTo(const IESNssai &v); diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 911930149..f3038a279 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -198,7 +198,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi m_storage->storedGuti->clear(); m_storage->taiList->clear(); m_storage->lastVisitedRegisteredTai->clear(); - m_usim->m_equivalentPlmnList = {}; + m_storage->equivalentPlmnList->clear(); m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; switchUState(E5UState::U2_NOT_UPDATED); @@ -232,7 +232,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED || cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA) - m_usim->m_equivalentPlmnList = {}; + m_storage->equivalentPlmnList->clear(); if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::TA_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA || diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index d54b433bd..6ba2b6053 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -93,7 +93,7 @@ bool NasMm::switchToECallInactivityIfNeeded() m_storage->storedGuti->clear(); m_storage->taiList->clear(); m_storage->lastVisitedRegisteredTai->clear(); - m_usim->m_equivalentPlmnList = {}; + m_storage->equivalentPlmnList->clear(); m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 8c4749d05..914309e3b 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -89,7 +89,7 @@ void NasMm::performPlmnSelection() continue; if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) continue; - if (nas::utils::PlmnListContains(m_usim->m_equivalentPlmnList, plmn)) + if (m_storage->equivalentPlmnList->contains(plmn)) candidates.push_back(plmn); } diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index bcdddee85..d4c991279 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -250,18 +250,19 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) updateForbiddenTaiListsForAllowedIndications(); // Store the E-PLMN list and .. - m_usim->m_equivalentPlmnList = msg.equivalentPLMNs.value_or(nas::IEPlmnList{}); + m_storage->equivalentPlmnList->clear(); + if (msg.equivalentPLMNs.has_value()) + for (auto &item : msg.equivalentPLMNs->plmns) + m_storage->equivalentPlmnList->add(nas::utils::PlmnFrom(item)); // .. if the initial registration procedure is not for emergency services, the UE shall remove from the list any // PLMN code that is already in the list of "forbidden PLMNs". .. if (!hasEmergency()) { - utils::EraseWhere(m_usim->m_equivalentPlmnList.plmns, [this](auto &plmn) { - return std::any_of(m_usim->m_forbiddenPlmnList.plmns.begin(), m_usim->m_forbiddenPlmnList.plmns.end(), - [&plmn](auto &forbidden) { return nas::utils::DeepEqualsV(plmn, forbidden); }); - }); + for (auto &forbiddenPlmn : m_usim->m_forbiddenPlmnList.plmns) + m_storage->equivalentPlmnList->remove(nas::utils::PlmnFrom(forbiddenPlmn)); } // .. in addition, the UE shall add to the stored list the PLMN code of the registered PLMN that sent the list - nas::utils::AddToPlmnList(m_usim->m_equivalentPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); + m_storage->equivalentPlmnList->add(m_base->shCtx.getCurrentPlmn()); // Upon receipt of the REGISTRATION ACCEPT message, the UE shall reset the registration attempt counter, enter state // 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED. @@ -370,18 +371,19 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg } // Store the E-PLMN list and .. - m_usim->m_equivalentPlmnList = msg.equivalentPLMNs.value_or(nas::IEPlmnList{}); + m_storage->equivalentPlmnList->clear(); + if (msg.equivalentPLMNs.has_value()) + for (auto &item : msg.equivalentPLMNs->plmns) + m_storage->equivalentPlmnList->add(nas::utils::PlmnFrom(item)); // .. if the initial registration procedure is not for emergency services, the UE shall remove from the list any // PLMN code that is already in the list of "forbidden PLMNs". .. if (!hasEmergency()) { - utils::EraseWhere(m_usim->m_equivalentPlmnList.plmns, [this](auto &plmn) { - return std::any_of(m_usim->m_forbiddenPlmnList.plmns.begin(), m_usim->m_forbiddenPlmnList.plmns.end(), - [&plmn](auto &forbidden) { return nas::utils::DeepEqualsV(plmn, forbidden); }); - }); + for (auto &forbiddenPlmn : m_usim->m_forbiddenPlmnList.plmns) + m_storage->equivalentPlmnList->remove(nas::utils::PlmnFrom(forbiddenPlmn)); } // .. in addition, the UE shall add to the stored list the PLMN code of the registered PLMN that sent the list - nas::utils::AddToPlmnList(m_usim->m_equivalentPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); + m_storage->equivalentPlmnList->add(m_base->shCtx.getCurrentPlmn()); // Store the service area list m_storage->serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); @@ -589,7 +591,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA) { - m_usim->m_equivalentPlmnList = {}; + m_storage->equivalentPlmnList->clear(); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) @@ -750,7 +752,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA) { - m_usim->m_equivalentPlmnList = {}; + m_storage->equivalentPlmnList->clear(); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) @@ -835,7 +837,7 @@ void NasMm::handleAbnormalInitialRegFailure(nas::ERegistrationType regType) m_storage->storedGuti->clear(); m_storage->taiList->clear(); m_storage->lastVisitedRegisteredTai->clear(); - m_usim->m_equivalentPlmnList = {}; + m_storage->equivalentPlmnList->clear(); m_usim->m_currentNsCtx = {}; m_usim->m_nonCurrentNsCtx = {}; @@ -897,7 +899,7 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) // "The UE shall delete the list of equivalent PLMNs and shall change to state // 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE UPDATE" - m_usim->m_equivalentPlmnList = {}; + m_storage->equivalentPlmnList->clear(); switchMmState(EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE); } } diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 4a7c40cb9..ffb2f1de4 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -301,7 +301,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED) { - m_usim->m_equivalentPlmnList = {}; + m_storage->equivalentPlmnList->clear(); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 2db72b0c4..8df528576 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -8,9 +8,6 @@ #include "storage.hpp" -static constexpr const size_t FORBIDDEN_TAI_LIST_SIZE = 40; -static constexpr const int64_t FORBIDDEN_TAI_CLEAR_PERIOD = 1000ll * 60ll * 60ll * 12ll; - static void BackupTaiListInSharedCtx(const std::vector &buffer, size_t count, Locked> &target) { target.mutate([count, &buffer](auto &value) { @@ -32,18 +29,20 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} lastVisitedRegisteredTai = std::make_unique>(0, std::nullopt); forbiddenTaiListRoaming = std::make_unique>( - FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { + 40, (1000ll * 60ll * 60ll * 12ll), [this](const std::vector &buffer, size_t count) { BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRoaming); }); forbiddenTaiListRps = std::make_unique>( - FORBIDDEN_TAI_LIST_SIZE, FORBIDDEN_TAI_CLEAR_PERIOD, [this](const std::vector &buffer, size_t count) { + 40, (1000ll * 60ll * 60ll * 12ll), [this](const std::vector &buffer, size_t count) { BackupTaiListInSharedCtx(buffer, count, m_base->shCtx.forbiddenTaiRps); }); serviceAreaList = std::make_unique>(0, std::nullopt); taiList = std::make_unique>(0, std::nullopt); + + equivalentPlmnList = std::make_unique>(16, 0, std::nullopt); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 00f5b56a0..5995fdb29 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -22,6 +22,8 @@ class MmStorage std::unique_ptr> storedSuci; std::unique_ptr> storedGuti; + std::unique_ptr> equivalentPlmnList; + std::unique_ptr> taiList; std::unique_ptr> lastVisitedRegisteredTai; std::unique_ptr> forbiddenTaiListRoaming; diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 9b3d9ae84..74dc6830b 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -31,7 +31,6 @@ class Usim E5UState m_uState{}; // Plmn related - nas::IEPlmnList m_equivalentPlmnList{}; nas::IEPlmnList m_forbiddenPlmnList{}; // Security related From 95e2f034ed82273ffa1b641150aa12f3d1e9c294 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 20:49:38 +0300 Subject: [PATCH 178/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 9 +++++++++ src/ue/nas/mm/mm.hpp | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index bbff6ca0c..0cf72e1a8 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -360,6 +360,13 @@ void NasMm::onSwitchMmState(EMmState oldState, EMmState newState, EMmSubState ol void NasMm::onSwitchRmState(ERmState oldState, ERmState newState) { + if (oldState == ERmState::RM_REGISTERED && newState == ERmState::RM_REGISTERED) + { + // "The UE shall delete (List of equivalent PLMNs) ... when the UE registered for emergency services + // enters the state 5GMM-DEREGISTERED" + if (m_registeredForEmergency) + m_storage->equivalentPlmnList->clear(); + } } void NasMm::onSwitchCmState(ECmState oldState, ECmState newState) @@ -428,6 +435,8 @@ void NasMm::onSwitchUState(E5UState oldState, E5UState newState) void NasMm::onSimRemoval() { + m_storage->equivalentPlmnList->clear(); + m_storage->forbiddenTaiListRoaming->clear(); m_storage->forbiddenTaiListRps->clear(); } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 6703e7438..810915ea0 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -53,7 +53,7 @@ class NasMm int m_regCounter{}; // Service request attempt counter int m_serCounter{}; - // Indicates registered for emergency services (Only meaningful in RM-REGISTERED state) + // Indicates registered for emergency services (Only meaningful in RM-REGISTERED state, or implies the last one) bool m_registeredForEmergency{}; // Network feature support information nas::IE5gsNetworkFeatureSupport m_nwFeatureSupport{}; From dc8bebb8511f48028eddf828e00151803f3288b4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 21:05:14 +0300 Subject: [PATCH 179/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 3 +-- src/ue/nas/mm/radio.cpp | 2 +- src/ue/nas/mm/register.cpp | 13 ++++++------- src/ue/nas/mm/service.cpp | 2 +- src/ue/nas/storage.cpp | 2 ++ src/ue/nas/storage.hpp | 1 + src/ue/nas/usim/usim.hpp | 3 --- 7 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index f3038a279..8ccc2d040 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -241,8 +241,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi if (cause == nas::EMmCause::PLMN_NOT_ALLOWED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, - nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); + m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); } if (cause == nas::EMmCause::TA_NOT_ALLOWED) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 914309e3b..34f219111 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -85,7 +85,7 @@ void NasMm::performPlmnSelection() { if (plmn == m_base->config->hplmn) continue; // If it's the HPLMN, it's already added above - if (nas::utils::PlmnListContains(m_usim->m_forbiddenPlmnList, plmn)) + if (m_storage->forbiddenPlmnList->contains(plmn)) continue; if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) continue; diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index d4c991279..9b9a4c4bb 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -258,8 +258,8 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) // PLMN code that is already in the list of "forbidden PLMNs". .. if (!hasEmergency()) { - for (auto &forbiddenPlmn : m_usim->m_forbiddenPlmnList.plmns) - m_storage->equivalentPlmnList->remove(nas::utils::PlmnFrom(forbiddenPlmn)); + m_storage->forbiddenPlmnList->forEach( + [this](auto &forbiddenPlmn) { m_storage->equivalentPlmnList->remove(forbiddenPlmn); }); } // .. in addition, the UE shall add to the stored list the PLMN code of the registered PLMN that sent the list m_storage->equivalentPlmnList->add(m_base->shCtx.getCurrentPlmn()); @@ -379,8 +379,8 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg // PLMN code that is already in the list of "forbidden PLMNs". .. if (!hasEmergency()) { - for (auto &forbiddenPlmn : m_usim->m_forbiddenPlmnList.plmns) - m_storage->equivalentPlmnList->remove(nas::utils::PlmnFrom(forbiddenPlmn)); + m_storage->forbiddenPlmnList->forEach( + [this](auto &forbiddenPlmn) { m_storage->equivalentPlmnList->remove(forbiddenPlmn); }); } // .. in addition, the UE shall add to the stored list the PLMN code of the registered PLMN that sent the list m_storage->equivalentPlmnList->add(m_base->shCtx.getCurrentPlmn()); @@ -603,8 +603,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, - nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); + m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); } if (cause == nas::EMmCause::CONGESTION) @@ -764,7 +763,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); + m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); } if (cause == nas::EMmCause::CONGESTION) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index ffb2f1de4..178ed1998 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -306,7 +306,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(m_base->shCtx.getCurrentPlmn())); + m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); } if (cause == nas::EMmCause::TA_NOT_ALLOWED) diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 8df528576..118deb456 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -43,6 +43,8 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} taiList = std::make_unique>(0, std::nullopt); equivalentPlmnList = std::make_unique>(16, 0, std::nullopt); + + forbiddenPlmnList = std::make_unique>(16, 0, std::nullopt); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 5995fdb29..626fd644a 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -23,6 +23,7 @@ class MmStorage std::unique_ptr> storedGuti; std::unique_ptr> equivalentPlmnList; + std::unique_ptr> forbiddenPlmnList; std::unique_ptr> taiList; std::unique_ptr> lastVisitedRegisteredTai; diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 74dc6830b..43cca13d5 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -30,9 +30,6 @@ class Usim // State related E5UState m_uState{}; - // Plmn related - nas::IEPlmnList m_forbiddenPlmnList{}; - // Security related std::unique_ptr m_currentNsCtx{}; std::unique_ptr m_nonCurrentNsCtx{}; From d67a3c524b8773647a8c34bdc8bed9d59a1f5de1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 21:15:43 +0300 Subject: [PATCH 180/311] L3 RRC/NAS developments --- src/ue/nas/mm/access.cpp | 11 ++++++----- src/ue/nas/mm/auth.cpp | 16 ++++++++++++---- src/ue/nas/mm/dereg.cpp | 4 +++- src/ue/nas/mm/register.cpp | 32 ++++++++++++++++++++++---------- src/ue/nas/mm/service.cpp | 13 ++++++++++--- 5 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index 5248595c2..8912d9e9d 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -48,19 +48,20 @@ bool NasMm::isInNonAllowedArea() if (!m_usim->isValid()) return false; - auto plmn = m_base->shCtx.getCurrentPlmn(); - if (!plmn.hasValue()) + auto currentCell = m_base->shCtx.currentCell.get(); + if (!currentCell.hasValue()) return false; + auto plmn = currentCell.plmn; if (nas::utils::ServiceAreaListForbidsPlmn(m_storage->serviceAreaList->get(), nas::utils::PlmnFrom(plmn))) return true; - int tac = m_base->shCtx.currentCell.get([](auto &value) { return value.tac; }); - + int tac = currentCell.tac; if (nas::utils::ServiceAreaListForbidsTai(m_storage->serviceAreaList->get(), nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(plmn), octet3{tac}})) + { return true; - + } return false; } diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index 8855aee22..7efc3a7cc 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -34,6 +34,10 @@ void NasMm::receiveAuthenticationRequest(const nas::AuthenticationRequest &msg) void NasMm::receiveAuthenticationRequestEap(const nas::AuthenticationRequest &msg) { + Plmn currentPlmn = m_base->shCtx.getCurrentPlmn(); + if (!currentPlmn.hasValue()) + return; + auto sendEapFailure = [this](std::unique_ptr &&eap) { // Clear RAND and RES* stored in volatile memory m_usim->m_rand = {}; @@ -111,7 +115,7 @@ void NasMm::receiveAuthenticationRequestEap(const nas::AuthenticationRequest &ms return; } - auto snn = keys::ConstructServingNetworkName(m_base->shCtx.getCurrentPlmn()); + auto snn = keys::ConstructServingNetworkName(currentPlmn); if (receivedEap.attributes.getKdfInput() != OctetString::FromAscii(snn)) { @@ -196,7 +200,7 @@ void NasMm::receiveAuthenticationRequestEap(const nas::AuthenticationRequest &ms m_usim->m_nonCurrentNsCtx->keys.kAusf = keys::CalculateKAusfFor5gAka(milenage.ck, milenage.ik, snn, sqnXorAk); m_usim->m_nonCurrentNsCtx->keys.abba = msg.abba.rawData.copy(); - keys::DeriveKeysSeafAmf(*m_base->config, m_base->shCtx.getCurrentPlmn(), *m_usim->m_nonCurrentNsCtx); + keys::DeriveKeysSeafAmf(*m_base->config, currentPlmn, *m_usim->m_nonCurrentNsCtx); // Send response m_nwConsecutiveAuthFailure = 0; @@ -257,6 +261,10 @@ void NasMm::receiveAuthenticationRequestEap(const nas::AuthenticationRequest &ms void NasMm::receiveAuthenticationRequest5gAka(const nas::AuthenticationRequest &msg) { + Plmn currentPLmn = m_base->shCtx.getCurrentPlmn(); + if (!currentPLmn.hasValue()) + return; + auto sendFailure = [this](nas::EMmCause cause, std::optional &&auts = std::nullopt) { if (cause != nas::EMmCause::SYNCH_FAILURE) m_logger->err("Sending Authentication Failure with cause [%s]", nas::utils::EnumToString(cause)); @@ -346,7 +354,7 @@ void NasMm::receiveAuthenticationRequest5gAka(const nas::AuthenticationRequest & auto milenage = calculateMilenage(m_usim->m_sqnMng->getSqn(), rand, false); auto ckIk = OctetString::Concat(milenage.ck, milenage.ik); auto sqnXorAk = OctetString::Xor(m_usim->m_sqnMng->getSqn(), milenage.ak); - auto snn = keys::ConstructServingNetworkName(m_base->shCtx.getCurrentPlmn()); + auto snn = keys::ConstructServingNetworkName(currentPLmn); // Store the relevant parameters m_usim->m_rand = rand.copy(); @@ -359,7 +367,7 @@ void NasMm::receiveAuthenticationRequest5gAka(const nas::AuthenticationRequest & m_usim->m_nonCurrentNsCtx->keys.kAusf = keys::CalculateKAusfFor5gAka(milenage.ck, milenage.ik, snn, sqnXorAk); m_usim->m_nonCurrentNsCtx->keys.abba = msg.abba.rawData.copy(); - keys::DeriveKeysSeafAmf(*m_base->config, m_base->shCtx.getCurrentPlmn(), *m_usim->m_nonCurrentNsCtx); + keys::DeriveKeysSeafAmf(*m_base->config, currentPLmn, *m_usim->m_nonCurrentNsCtx); // Send response m_nwConsecutiveAuthFailure = 0; diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 8ccc2d040..f6be9c5d8 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -241,7 +241,9 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi if (cause == nas::EMmCause::PLMN_NOT_ALLOWED) { - m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); + Plmn plmn = m_base->shCtx.getCurrentPlmn(); + if (plmn.hasValue()) + m_storage->forbiddenPlmnList->add(plmn); } if (cause == nas::EMmCause::TA_NOT_ALLOWED) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 9b9a4c4bb..cc587a215 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -11,7 +11,6 @@ #include #include #include -#include namespace nr::ue { @@ -231,6 +230,12 @@ void NasMm::receiveRegistrationAccept(const nas::RegistrationAccept &msg) void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) { + Tai currentTai = m_base->shCtx.getCurrentTai(); + Plmn currentPlmn = currentTai.plmn; + + if (!currentTai.hasValue()) + return; + // Store the TAI list as a registration area if (msg.taiList.has_value() && nas::utils::TaiListSize(*msg.taiList) == 0) { @@ -239,7 +244,6 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) return; } m_storage->taiList->set(msg.taiList.value_or(nas::IE5gsTrackingAreaIdentityList{})); - Tai currentTai = m_base->shCtx.getCurrentTai(); if (currentTai.hasValue() && nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) m_storage->lastVisitedRegisteredTai->set(currentTai); @@ -262,7 +266,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) [this](auto &forbiddenPlmn) { m_storage->equivalentPlmnList->remove(forbiddenPlmn); }); } // .. in addition, the UE shall add to the stored list the PLMN code of the registered PLMN that sent the list - m_storage->equivalentPlmnList->add(m_base->shCtx.getCurrentPlmn()); + m_storage->equivalentPlmnList->add(currentPlmn); // Upon receipt of the REGISTRATION ACCEPT message, the UE shall reset the registration attempt counter, enter state // 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED. @@ -352,6 +356,12 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg) { + Tai currentTai = m_base->shCtx.getCurrentTai(); + Plmn currentPlmn = currentTai.plmn; + + if (!currentTai.hasValue()) + return; + // "The UE, upon receiving a REGISTRATION ACCEPT message, shall delete its old TAI list and store the received TAI // list. If there is no TAI list received, the UE shall consider the old TAI list as valid." if (msg.taiList.has_value()) @@ -364,9 +374,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg } m_storage->taiList->set(*msg.taiList); - - Tai currentTai = m_base->shCtx.getCurrentTai(); - if (currentTai.hasValue() && nas::utils::TaiListContains(*msg.taiList, nas::VTrackingAreaIdentity{currentTai})) + if (nas::utils::TaiListContains(*msg.taiList, nas::VTrackingAreaIdentity{currentTai})) m_storage->lastVisitedRegisteredTai->set(currentTai); } @@ -383,7 +391,7 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg [this](auto &forbiddenPlmn) { m_storage->equivalentPlmnList->remove(forbiddenPlmn); }); } // .. in addition, the UE shall add to the stored list the PLMN code of the registered PLMN that sent the list - m_storage->equivalentPlmnList->add(m_base->shCtx.getCurrentPlmn()); + m_storage->equivalentPlmnList->add(currentPlmn); // Store the service area list m_storage->serviceAreaList->set(msg.serviceAreaList.value_or(nas::IEServiceAreaList{})); @@ -603,7 +611,9 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); + Plmn plmn = m_base->shCtx.getCurrentPlmn(); + if (plmn.hasValue()) + m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); } if (cause == nas::EMmCause::CONGESTION) @@ -763,7 +773,9 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); + Plmn plmn = m_base->shCtx.getCurrentPlmn(); + if (plmn.hasValue()) + m_storage->forbiddenPlmnList->add(plmn); } if (cause == nas::EMmCause::CONGESTION) @@ -865,7 +877,7 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) { auto tai = m_base->shCtx.getCurrentTai(); bool includedInTaiList = - nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{tai}); + tai.hasValue() && nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{tai}); // "If the TAI of the current serving cell is not included in the TAI list or the 5GS update status is different // to 5U1 UPDATED" diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 178ed1998..c01edf516 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -34,8 +34,13 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) m_logger->err("Service Request canceled, UE not in 5U1 UPDATED state"); return; } - if (!nas::utils::TaiListContains(m_storage->taiList->get(), - nas::VTrackingAreaIdentity{m_base->shCtx.getCurrentTai()})) + Tai currentTai = m_base->shCtx.getCurrentTai(); + if (!currentTai.hasValue()) + { + m_logger->err("Service Request canceled, no active cell exists"); + return; + } + if (!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) { m_logger->err("Service Request canceled, current TAI is not in the TAI list"); return; @@ -306,7 +311,9 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - m_storage->forbiddenPlmnList->add(m_base->shCtx.getCurrentPlmn()); + Plmn plmn = m_base->shCtx.getCurrentPlmn(); + if (plmn.hasValue()) + m_storage->forbiddenPlmnList->add(plmn); } if (cause == nas::EMmCause::TA_NOT_ALLOWED) From 06e96d4daf17dafcc8543af0ae9637b2233653d1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 21:43:39 +0300 Subject: [PATCH 181/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 34f219111..b5bb29e24 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -154,6 +154,9 @@ void NasMm::handleActiveCellChange() auto currentCell = m_base->shCtx.currentCell.get(); Tai currentTai = Tai{currentCell.plmn, currentCell.tac}; + if (currentCell.hasValue() && !m_storage->equivalentPlmnList->contains(currentCell.plmn)) + m_timers->t3346.stop(); + if (m_mmState == EMmState::MM_REGISTERED) { if (currentCell.cellId == 0) From 860db47a64d4323b4310e8446610e995aa30d109 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 21:59:57 +0300 Subject: [PATCH 182/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 11 ++++++++++- src/ue/nas/mm/service.cpp | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index cc587a215..1d5cefe39 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -113,6 +113,15 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) return; } + if (m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE) + { + if (!isHighPriority() && !hasEmergency()) + { + m_logger->debug("Mobility updating canceled, registered in non allowed service"); + return; + } + } + // 5.5.1.3.7 Abnormal cases in the UE // a) Timer T3346 is running. if (m_timers->t3346.isRunning()) @@ -121,7 +130,7 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) isHighPriority() || hasEmergency() || updateCause == ERegUpdateCause::CONFIGURATION_UPDATE; if (!allowed) { - m_logger->debug("Mobility updating updating canceled, T3346 is running"); + m_logger->debug("Mobility updating canceled, T3346 is running"); return; } } diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index c01edf516..e2c38ed8a 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -46,14 +46,25 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) return; } + if (m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE) + { + if (reqCause != EServiceReqCause::IDLE_PAGING && + reqCause != EServiceReqCause::CONNECTED_3GPP_NOTIFICATION_N3GPP && + reqCause != EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP && !isHighPriority() && !hasEmergency()) + { + m_logger->debug("Service Request canceled, registered in non allowed service"); + return; + } + } + // 5.6.1.7 Abnormal cases in the UE // a) Timer T3525 if (m_timers->t3525.isRunning()) { if (reqCause != EServiceReqCause::IDLE_PAGING && reqCause != EServiceReqCause::CONNECTED_3GPP_NOTIFICATION_N3GPP && - reqCause != EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP && !isHighPriority() && !hasEmergency() && - reqCause != EServiceReqCause::EMERGENCY_FALLBACK) + reqCause != EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP && + reqCause != EServiceReqCause::EMERGENCY_FALLBACK && !isHighPriority() && !hasEmergency()) { m_logger->debug("Service Request canceled, T3346 is running"); return; From 9c836c2bd59bf12dec263033f1a05f45615d57f9 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 22:12:13 +0300 Subject: [PATCH 183/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 4 ++++ src/ue/nas/mm/mm.hpp | 5 ++++- src/ue/nas/sm/establishment.cpp | 6 ++++++ src/ue/nas/sm/release.cpp | 7 +++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 0cf72e1a8..09fe38bda 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -437,12 +437,16 @@ void NasMm::onSimRemoval() { m_storage->equivalentPlmnList->clear(); + m_storage->serviceAreaList->clear(); + m_storage->forbiddenTaiListRoaming->clear(); m_storage->forbiddenTaiListRps->clear(); } void NasMm::onSwitchOff() { + m_storage->serviceAreaList->clear(); + m_storage->forbiddenTaiListRoaming->clear(); m_storage->forbiddenTaiListRps->clear(); } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 810915ea0..ad96dfee3 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -169,9 +169,11 @@ class NasMm void handleRadioLinkFailure(); void handlePaging(const std::vector &tmsiIds); - private: /* Access Control */ + public: /* Access Control */ bool isHighPriority(); bool hasEmergency(); + + private: /* Access Control */ void setN1Capability(bool enabled); bool isInNonAllowedArea(); @@ -189,6 +191,7 @@ class NasMm bool isRegistered(); // used by SM bool isRegisteredForEmergency(); // used by SM void serviceNeededForUplinkData(); // used by SM + bool isStateNonAllowedService(); // used by SM }; } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/sm/establishment.cpp b/src/ue/nas/sm/establishment.cpp index 8ab8863b8..d4635082a 100644 --- a/src/ue/nas/sm/establishment.cpp +++ b/src/ue/nas/sm/establishment.cpp @@ -47,6 +47,12 @@ void NasSm::sendEstablishmentRequest(const SessionConfig &config) return; } + if (m_mm->isStateNonAllowedService() && !m_mm->hasEmergency() && !m_mm->isHighPriority()) + { + m_logger->err("PDU session establishment could not be triggered, non allowed service condition"); + return; + } + /* Control the received config */ if (config.type != nas::EPduSessionType::IPV4) { diff --git a/src/ue/nas/sm/release.cpp b/src/ue/nas/sm/release.cpp index 8cadb9f16..abe8fac67 100644 --- a/src/ue/nas/sm/release.cpp +++ b/src/ue/nas/sm/release.cpp @@ -18,6 +18,13 @@ namespace nr::ue void NasSm::sendReleaseRequest(int psi) { + /* Control the protocol state */ + if (m_mm->isStateNonAllowedService() && !m_mm->hasEmergency() && !m_mm->isHighPriority()) + { + m_logger->err("PDU session release could not start, non allowed service condition"); + return; + } + /* Control the PDU session state */ auto &ps = m_pduSessions[psi]; if (ps->psState != EPsState::ACTIVE) From d55873529ec77ba88675f9139b7245bf4a7e5573 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 22:31:14 +0300 Subject: [PATCH 184/311] L3 RRC/NAS developments --- src/lib/nas/utils.cpp | 40 +++++++++++++++++++++++++++++++++++++ src/lib/nas/utils.hpp | 1 + src/ue/nas/mm/access.cpp | 3 --- src/ue/nas/mm/dereg.cpp | 10 ++++++++++ src/ue/nas/mm/interface.cpp | 5 +++++ src/ue/nas/mm/register.cpp | 10 ++++++++++ src/ue/nas/mm/service.cpp | 4 ++++ 7 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/lib/nas/utils.cpp b/src/lib/nas/utils.cpp index e6e2f05d1..cdd36c687 100644 --- a/src/lib/nas/utils.cpp +++ b/src/lib/nas/utils.cpp @@ -11,6 +11,8 @@ #include #include +#include + namespace nas::utils { @@ -510,4 +512,42 @@ Plmn PlmnFrom(const VPlmn &plmn) return res; } +void RemoveFromServiceAreaList(IEServiceAreaList &list, const VTrackingAreaIdentity &tai) +{ + std::vector deletedSubLists; + int index = 0; + + for (auto &sublist : list.list) + { + if (sublist.present == 0) + { + if (nas::utils::DeepEqualsV(sublist.list00->plmn, tai.plmn)) + ::utils::EraseWhere(sublist.list00->tacs, [&tai](auto &i) { return (int)i == (int)tai.tac; }); + if (sublist.list00->tacs.empty()) + deletedSubLists.push_back(index); + } + else if (sublist.present == 1) + { + if (nas::utils::DeepEqualsV(sublist.list01->plmn, tai.plmn) && (int)tai.tac == (int)sublist.list01->tac) + deletedSubLists.push_back(index); + } + else if (sublist.present == 2) + { + ::utils::EraseWhere(sublist.list10->tais, [&tai](auto &i) { return nas::utils::DeepEqualsV(i, tai); }); + if (sublist.list10->tais.empty()) + deletedSubLists.push_back(index); + } + index++; + } + + int deletedSoFar = 0; + + for (int i : deletedSubLists) + { + int indexToDelete = i - deletedSoFar; + list.list.erase(list.list.begin() + indexToDelete); + deletedSoFar++; + } +} + } // namespace nas::utils diff --git a/src/lib/nas/utils.hpp b/src/lib/nas/utils.hpp index 6ae4a7b62..cd4cd38cc 100644 --- a/src/lib/nas/utils.hpp +++ b/src/lib/nas/utils.hpp @@ -42,6 +42,7 @@ bool ServiceAreaListAllowsPlmn(const nas::IEServiceAreaList &list, const VPlmn & bool ServiceAreaListAllowsTai(const nas::IEServiceAreaList &list, const VTrackingAreaIdentity &tai); bool ServiceAreaListAllowsPlmn(const nas::VPartialServiceAreaList &list, const VPlmn &plmn); bool ServiceAreaListAllowsTai(const nas::VPartialServiceAreaList &list, const VTrackingAreaIdentity &tai); +void RemoveFromServiceAreaList(nas::IEServiceAreaList &list, const VTrackingAreaIdentity &tai); const char *EnumToString(ERegistrationType v); const char *EnumToString(EMmCause v); diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index 8912d9e9d..7caf9cc69 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -45,9 +45,6 @@ void NasMm::setN1Capability(bool enabled) bool NasMm::isInNonAllowedArea() { - if (!m_usim->isValid()) - return false; - auto currentCell = m_base->shCtx.currentCell.get(); if (!currentCell.hasValue()) return false; diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index f6be9c5d8..b6465bca2 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -250,14 +250,24 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) + { m_storage->forbiddenTaiListRps->add(tai); + m_storage->serviceAreaList->mutate([&tai](auto &value) { + nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai}); + }); + } } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) + { m_storage->forbiddenTaiListRoaming->add(tai); + m_storage->serviceAreaList->mutate([&tai](auto &value) { + nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai}); + }); + } } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index b35c593e8..2106c5983 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -94,4 +94,9 @@ void NasMm::serviceNeededForUplinkData() } } +bool NasMm::isStateNonAllowedService() +{ + return m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE; +} + } // namespace nr::ue diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 1d5cefe39..b6f3a6aca 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -615,7 +615,12 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) + { m_storage->forbiddenTaiListRoaming->add(tai); + m_storage->serviceAreaList->mutate([&tai](auto &value) { + nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai}); + }); + } } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) @@ -777,7 +782,12 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) + { m_storage->forbiddenTaiListRoaming->add(tai); + m_storage->serviceAreaList->mutate([&tai](auto &value) { + nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai}); + }); + } } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index e2c38ed8a..4d60497a6 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -331,7 +331,11 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) { Tai tai = m_base->shCtx.getCurrentTai(); if (tai.hasValue()) + { m_storage->forbiddenTaiListRps->add(tai); + m_storage->serviceAreaList->mutate( + [&tai](auto &value) { nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai}); }); + } } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) From c624f4a45ee97ed148a8a5162441238ce3f8e587 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 22:33:35 +0300 Subject: [PATCH 185/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index b5bb29e24..4770a972e 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -125,7 +125,11 @@ void NasMm::performPlmnSelection() if (cellSelected) { - if (cellCategory == ECellCategory::SUITABLE_CELL) + if (isInNonAllowedArea()) + { + switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); + } + else if (cellCategory == ECellCategory::SUITABLE_CELL) { if (m_mmState == EMmState::MM_REGISTERED) switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); From ae349f91feff834692c3d0fafb2ff07005f748cf Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 22 May 2021 22:38:02 +0300 Subject: [PATCH 186/311] L3 RRC/NAS developments --- src/ue/nas/usim/usim.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 43cca13d5..d2c253e3c 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -52,7 +52,7 @@ class Usim std::optional m_networkDaylightSavingTime{}; // Others - bool m_isECallOnly{}; + bool m_isECallOnly{}; // todo: configurable public: void initialize(bool hasSupi, const UeConfig::Initials &initials); From 84304df434310ab04b24ed02128235f468b0509b Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 11:14:14 +0300 Subject: [PATCH 187/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 4 +++- src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/radio.cpp | 27 +++++++++++++++++++++++++++ src/ue/nas/mm/register.cpp | 7 +++++++ src/ue/nas/mm/service.cpp | 2 ++ src/ue/types.hpp | 2 ++ 6 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index b6465bca2..75cf1fc0f 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -36,6 +36,8 @@ void NasMm::sendDeregistration(EDeregCause deregCause) m_logger->debug("Starting de-registration procedure due to [%s]", ToJson(deregCause).str().c_str()); + updateProvidedGuti(); + auto request = std::make_unique(); request->deRegistrationType = MakeDeRegistrationType(deregCause); @@ -253,7 +255,7 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi { m_storage->forbiddenTaiListRps->add(tai); m_storage->serviceAreaList->mutate([&tai](auto &value) { - nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai}); + nas::utils::RemoveFromServiceAreaList(value, nas::VTrackingAreaIdentity{tai}); }); } } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index ad96dfee3..5b104c0a6 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -168,6 +168,7 @@ class NasMm void handleRrcEstablishmentFailure(); void handleRadioLinkFailure(); void handlePaging(const std::vector &tmsiIds); + void updateProvidedGuti(bool provide = true); public: /* Access Control */ bool isHighPriority(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 4770a972e..fa0df9ebe 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -294,4 +294,31 @@ void NasMm::handlePaging(const std::vector &tmsiIds) sendServiceRequest(EServiceReqCause::IDLE_PAGING); } +void NasMm::updateProvidedGuti(bool provide) +{ + if (m_cmState != ECmState::CM_IDLE) + return; + + auto &guti = m_storage->storedGuti->get(); + if (!provide || guti.type == nas::EIdentityType::NO_IDENTITY) + { + m_base->shCtx.providedGuti.set({}); + m_base->shCtx.providedTmsi.set({}); + } + else + { + auto tai = m_base->shCtx.getCurrentTai(); + if (tai.hasValue() && nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{tai})) + { + m_base->shCtx.providedGuti.set({}); + m_base->shCtx.providedTmsi.set(guti.gutiOrTmsi); + } + else + { + m_base->shCtx.providedGuti.set(guti.gutiOrTmsi); + m_base->shCtx.providedTmsi.set({}); + } + } +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index b6f3a6aca..dad6e75ed 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -45,6 +45,8 @@ void NasMm::sendInitialRegistration(EInitialRegCause regCause) nas::utils::EnumToString(isEmergencyReg ? nas::ERegistrationType::EMERGENCY_REGISTRATION : nas::ERegistrationType::INITIAL_REGISTRATION)); + updateProvidedGuti(); + // The UE shall mark the 5G NAS security context on the USIM or in the non-volatile memory as invalid when the UE // initiates an initial registration procedure m_usim->m_currentNsCtx = {}; @@ -148,6 +150,11 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) : nas::ERegistrationType::MOBILITY_REGISTRATION_UPDATING), ToJson(updateCause).str().c_str()); + // "if the registration procedure for mobility and periodic update was triggered due to the last CONFIGURATION + // UPDATE COMMAND message that indicates "registration requested" including: ... the UE NAS shall not provide the + // lower layers with the 5G-S-TMSI or the registered GUAMI; " + updateProvidedGuti(updateCause != ERegUpdateCause::CONFIGURATION_UPDATE); + // Switch state switchMmState(EMmSubState::MM_REGISTERED_INITIATED_PS); diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 4d60497a6..ae1a9a210 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -83,6 +83,8 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) } } + updateProvidedGuti(); + auto request = std::make_unique(); if (reqCause == EServiceReqCause::IDLE_PAGING) diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 019427716..19f5680a7 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -166,6 +166,8 @@ struct UeSharedContext Locked currentCell; Locked> forbiddenTaiRoaming; Locked> forbiddenTaiRps; + Locked providedGuti; + Locked providedTmsi; Plmn getCurrentPlmn(); Tai getCurrentTai(); From e3fa41ad2314615f7ba42ed09652676d2549e87c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 11:24:24 +0300 Subject: [PATCH 188/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 75cf1fc0f..b17b76d2b 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -80,12 +80,7 @@ void NasMm::sendDeregistration(EDeregCause deregCause) m_sm->localReleaseAllSessions(); - if (m_lastDeregistrationRequest->deRegistrationType.switchOff == nas::ESwitchOff::NORMAL_DE_REGISTRATION) - switchMmState(EMmSubState::MM_DEREGISTERED_INITIATED_PS); - else - { - switchMmState(EMmSubState::MM_DEREGISTERED_PS); - } + switchMmState(EMmSubState::MM_DEREGISTERED_INITIATED_PS); } void NasMm::receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOriginating &msg) From 5551dbea435fdaa2d14dfd40c296039c04f77925 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 11:42:19 +0300 Subject: [PATCH 189/311] L3 RRC/NAS developments --- src/ue/nas/mm/mm.hpp | 28 +++++---------- src/ue/nas/mm/{interface.cpp => sap.cpp} | 29 ---------------- src/ue/nas/mm/service.cpp | 14 ++++++++ src/ue/nas/sm/establishment.cpp | 6 ++-- src/ue/nas/sm/release.cpp | 2 +- src/ue/nas/sm/{interface.cpp => sap.cpp} | 0 src/ue/nas/sm/sm.hpp | 43 +++++++++++------------- 7 files changed, 46 insertions(+), 76 deletions(-) rename src/ue/nas/mm/{interface.cpp => sap.cpp} (65%) rename src/ue/nas/sm/{interface.cpp => sap.cpp} (100%) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 5b104c0a6..f35af8f02 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -67,6 +67,8 @@ class NasMm int64_t m_lastTimeMmStateChange{}; friend class UeCmdHandler; + friend class NasSm; + friend class NasTask; public: NasMm(TaskBase *base, NasTimers *timers); @@ -97,14 +99,10 @@ class NasMm private: /* Transport */ void receiveDlNasTransport(const nas::DlNasTransport &msg); - - public: /* Transport */ void deliverUlTransport(const nas::UlNasTransport &msg); - public: /* Registration */ - void sendMobilityRegistration(ERegUpdateCause updateCause); - private: /* Registration */ + void sendMobilityRegistration(ERegUpdateCause updateCause); void sendInitialRegistration(EInitialRegCause regCause); void receiveRegistrationAccept(const nas::RegistrationAccept &msg); void receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg); @@ -132,10 +130,8 @@ class NasMm void receiveSecurityModeCommand(const nas::SecurityModeCommand &msg); nas::IEUeSecurityCapability createSecurityCapabilityIe(); - public: /* De-registration */ - void sendDeregistration(EDeregCause deregCause); - private: /* De-registration */ + void sendDeregistration(EDeregCause deregCause); void receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOriginating &msg); void receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTerminated &msg); void performLocalDeregistration(); @@ -154,6 +150,7 @@ class NasMm void sendServiceRequest(EServiceReqCause reqCause); void receiveServiceAccept(const nas::ServiceAccept &msg); void receiveServiceReject(const nas::ServiceReject &msg); + void serviceNeededForUplinkData(); private: /* Network Slicing */ NetworkSlice makeRequestedNssai(bool &isDefaultNssai) const; @@ -170,11 +167,9 @@ class NasMm void handlePaging(const std::vector &tmsiIds); void updateProvidedGuti(bool provide = true); - public: /* Access Control */ + private: /* Access Control */ bool isHighPriority(); bool hasEmergency(); - - private: /* Access Control */ void setN1Capability(bool enabled); bool isInNonAllowedArea(); @@ -185,14 +180,9 @@ class NasMm private: /* Timer */ void onTimerExpire(UeTimer &timer); - public: - /* Interface */ - void handleRrcEvent(const NwUeRrcToNas &msg); // used by RRC - void handleNasEvent(const NwUeNasToNas &msg); // used by NAS - bool isRegistered(); // used by SM - bool isRegisteredForEmergency(); // used by SM - void serviceNeededForUplinkData(); // used by SM - bool isStateNonAllowedService(); // used by SM + private: /* Service Access Point */ + void handleRrcEvent(const NwUeRrcToNas &msg); + void handleNasEvent(const NwUeNasToNas &msg); }; } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/sap.cpp similarity index 65% rename from src/ue/nas/mm/interface.cpp rename to src/ue/nas/mm/sap.cpp index 2106c5983..0c629c95a 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/sap.cpp @@ -10,8 +10,6 @@ #include -static constexpr const int64_t SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD = 1000; - namespace nr::ue { @@ -72,31 +70,4 @@ void NasMm::handleNasEvent(const NwUeNasToNas &msg) } } -bool NasMm::isRegistered() -{ - return m_rmState == ERmState::RM_REGISTERED; -} - -bool NasMm::isRegisteredForEmergency() -{ - return isRegistered() && m_registeredForEmergency; -} - -void NasMm::serviceNeededForUplinkData() -{ - auto currentTime = utils::CurrentTimeMillis(); - if (currentTime - m_lastTimeServiceReqNeededIndForData > SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD) - { - sendServiceRequest(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING - : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); - - m_lastTimeServiceReqNeededIndForData = currentTime; - } -} - -bool NasMm::isStateNonAllowedService() -{ - return m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE; -} - } // namespace nr::ue diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index ae1a9a210..af6191917 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -459,4 +459,18 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) } } +void NasMm::serviceNeededForUplinkData() +{ + static constexpr const int64_t SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD = 1000; + + auto currentTime = utils::CurrentTimeMillis(); + if (currentTime - m_lastTimeServiceReqNeededIndForData > SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD) + { + sendServiceRequest(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING + : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); + + m_lastTimeServiceReqNeededIndForData = currentTime; + } +} + } // namespace nr::ue diff --git a/src/ue/nas/sm/establishment.cpp b/src/ue/nas/sm/establishment.cpp index d4635082a..0ad57582e 100644 --- a/src/ue/nas/sm/establishment.cpp +++ b/src/ue/nas/sm/establishment.cpp @@ -41,13 +41,13 @@ void NasSm::sendEstablishmentRequest(const SessionConfig &config) m_logger->debug("Sending PDU Session Establishment Request"); /* Control the protocol state */ - if (!m_mm->isRegistered()) + if (m_mm->m_rmState != ERmState::RM_REGISTERED) { m_logger->err("PDU session establishment could not be triggered, UE is not registered"); return; } - if (m_mm->isStateNonAllowedService() && !m_mm->hasEmergency() && !m_mm->isHighPriority()) + if (m_mm->m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE && !m_mm->hasEmergency() && !m_mm->isHighPriority()) { m_logger->err("PDU session establishment could not be triggered, non allowed service condition"); return; @@ -59,7 +59,7 @@ void NasSm::sendEstablishmentRequest(const SessionConfig &config) m_logger->err("PDU session type [%s] is not supported", nas::utils::EnumToString(config.type)); return; } - if (m_mm->isRegisteredForEmergency() && !config.isEmergency) + if (m_mm->m_rmState == ERmState::RM_REGISTERED && m_mm->m_registeredForEmergency && !config.isEmergency) { m_logger->err("Non-emergency PDU session cannot be requested, UE is registered for emergency only"); return; diff --git a/src/ue/nas/sm/release.cpp b/src/ue/nas/sm/release.cpp index abe8fac67..4ebb09c0e 100644 --- a/src/ue/nas/sm/release.cpp +++ b/src/ue/nas/sm/release.cpp @@ -19,7 +19,7 @@ namespace nr::ue void NasSm::sendReleaseRequest(int psi) { /* Control the protocol state */ - if (m_mm->isStateNonAllowedService() && !m_mm->hasEmergency() && !m_mm->isHighPriority()) + if (m_mm->m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE && !m_mm->hasEmergency() && !m_mm->isHighPriority()) { m_logger->err("PDU session release could not start, non allowed service condition"); return; diff --git a/src/ue/nas/sm/interface.cpp b/src/ue/nas/sm/sap.cpp similarity index 100% rename from src/ue/nas/sm/interface.cpp rename to src/ue/nas/sm/sap.cpp diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index 8fb997194..9e1b56f9d 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -32,22 +32,17 @@ class NasSm std::array m_procedureTransactions{}; friend class UeCmdHandler; + friend class NasMm; + friend class NasTask; public: NasSm(TaskBase *base, NasTimers *timers); - public: - /* Base */ + public: /* Base */ void onStart(NasMm *mm); void onQuit(); - void establishInitialSessions(); - /* Transport */ - void receiveSmMessage(const nas::SmMessage &msg); - void receiveForwardingFailure(const nas::SmMessage &msg, nas::EMmCause cause, - const std::optional &backoffTimer); - - /* Resource */ + private: /* Resource */ void localReleaseSession(int psi); void localReleaseAllSessions(); bool anyEmergencySession(); @@ -57,45 +52,45 @@ class NasSm std::bitset<16> getUplinkDataStatus(); std::bitset<16> getPduSessionStatus(); - /* Session Release */ - void sendReleaseRequest(int psi); - void sendReleaseRequestForAll(); - - private: - /* Transport */ + private: /* Transport */ + void receiveSmMessage(const nas::SmMessage &msg); void sendSmMessage(int psi, const nas::SmMessage &msg); void receiveSmStatus(const nas::FiveGSmStatus &msg); void sendSmCause(const nas::ESmCause &cause, int pti, int psi); + void receiveForwardingFailure(const nas::SmMessage &msg, nas::EMmCause cause, + const std::optional &backoffTimer); - /* Allocation */ + private: /* Allocation */ int allocatePduSessionId(const SessionConfig &config); int allocateProcedureTransactionId(); void freeProcedureTransactionId(int pti); void freePduSessionId(int psi); - /* Session Establishment */ + private: /* Session Establishment */ + void establishInitialSessions(); void sendEstablishmentRequest(const SessionConfig &config); void receiveEstablishmentAccept(const nas::PduSessionEstablishmentAccept &msg); void receiveEstablishmentReject(const nas::PduSessionEstablishmentReject &msg); - /* Session Release */ + private: /* Session Release */ + void sendReleaseRequest(int psi); + void sendReleaseRequestForAll(); void receiveReleaseReject(const nas::PduSessionReleaseReject &msg); void receiveReleaseCommand(const nas::PduSessionReleaseCommand &msg); - /* Timer */ + private: /* Timer */ std::unique_ptr newTransactionTimer(int code); void onTimerExpire(UeTimer &timer); void onTransactionTimerExpire(int pti); - /* Procedure */ + private: /* Procedure */ bool checkPtiAndPsi(const nas::SmMessage &msg); void abortProcedureByPti(int pti); void abortProcedureByPtiOrPsi(int pti, int psi); - public: - /* Interface */ - void handleNasEvent(const NwUeNasToNas &msg); // used by NAS - void onTimerTick(); // used by NAS + private: /* Service Access Point */ + void handleNasEvent(const NwUeNasToNas &msg); + void onTimerTick(); }; } // namespace nr::ue \ No newline at end of file From 8a27319208561d9c5b84293c49a1e2c3e008de48 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 11:54:40 +0300 Subject: [PATCH 190/311] L3 RRC/NAS developments --- src/ue/app/task.cpp | 41 ++++------------------------------------- src/ue/app/task.hpp | 1 - src/ue/nas/sm/sap.cpp | 34 ++++++++++++++++++++++++++++++++++ src/ue/nas/sm/sm.hpp | 1 + src/ue/nas/task.cpp | 4 ++-- src/ue/nts.hpp | 10 +++++----- src/utils/nts.hpp | 3 ++- 7 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index 80259a38e..0ddce943d 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -74,7 +74,10 @@ void UeAppTask::onLoop() switch (w->present) { case NwUeTunToApp::DATA_PDU_DELIVERY: { - handleUplinkDataRequest(w->psi, std::move(w->data)); + auto *m = new NwUeAppToNas(NwUeAppToNas::UPLINK_DATA_DELIVERY); + m->psi = w->psi; + m->data = std::move(w->data); + m_base->nasTask->push(m); break; } case NwUeTunToApp::TUN_ERROR: { @@ -224,40 +227,4 @@ void UeAppTask::setupTunInterface(const PduSession *pduSession) allocatedName.c_str(), ipAddress.c_str()); } -void UeAppTask::handleUplinkDataRequest(int psi, OctetString &&data) -{ - if (!m_pduSessions[psi].has_value()) - return; - - if (m_cmState == ECmState::CM_CONNECTED) - { - if (m_pduSessions[psi]->uplinkPending) - { - m_pduSessions[psi]->uplinkPending = false; - - auto *w = new NwUeAppToNas(NwUeAppToNas::UPLINK_STATUS_CHANGE); - w->psi = psi; - w->isPending = false; - m_base->nasTask->push(w); - } - - auto *nw = new NwUeAppToRls(NwUeAppToRls::DATA_PDU_DELIVERY); - nw->psi = psi; - nw->pdu = std::move(data); - m_base->rlsTask->push(nw); - } - else - { - if (!m_pduSessions[psi]->uplinkPending) - { - m_pduSessions[psi]->uplinkPending = true; - - auto *w = new NwUeAppToNas(NwUeAppToNas::UPLINK_STATUS_CHANGE); - w->psi = psi; - w->isPending = true; - m_base->nasTask->push(w); - } - } -} - } // namespace nr::ue diff --git a/src/ue/app/task.hpp b/src/ue/app/task.hpp index ceab73bf8..57de0d362 100644 --- a/src/ue/app/task.hpp +++ b/src/ue/app/task.hpp @@ -45,7 +45,6 @@ class UeAppTask : public NtsTask private: void receiveStatusUpdate(NwUeStatusUpdate &msg); void setupTunInterface(const PduSession *pduSession); - void handleUplinkDataRequest(int psi, OctetString &&data); }; } // namespace nr::ue diff --git a/src/ue/nas/sm/sap.cpp b/src/ue/nas/sm/sap.cpp index 6fc6a982b..f6f8b1857 100644 --- a/src/ue/nas/sm/sap.cpp +++ b/src/ue/nas/sm/sap.cpp @@ -7,11 +7,14 @@ // #include "sm.hpp" + #include + #include #include #include #include +#include namespace nr::ue { @@ -39,4 +42,35 @@ void NasSm::onTimerTick() } } +void NasSm::handleUplinkDataRequest(int psi, OctetString &&data) +{ + if (m_pduSessions[psi]->psState != EPsState::ACTIVE) + return; + + if (m_mm->m_cmState == ECmState::CM_CONNECTED) + { + // TODO: We should also check if radio resources are established by RRC. + // Checking CM state is not sufficient + + if (m_pduSessions[psi]->uplinkPending) + { + m_pduSessions[psi]->uplinkPending = false; + handleUplinkStatusChange(psi, false); + } + + auto *nw = new NwUeNasToRls(NwUeNasToRls::DATA_PDU_DELIVERY); + nw->psi = psi; + nw->pdu = std::move(data); + m_base->rlsTask->push(nw); + } + else + { + if (!m_pduSessions[psi]->uplinkPending) + { + m_pduSessions[psi]->uplinkPending = true; + handleUplinkStatusChange(psi, true); + } + } +} + } // namespace nr::ue diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index 9e1b56f9d..cbf80e3c3 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -91,6 +91,7 @@ class NasSm private: /* Service Access Point */ void handleNasEvent(const NwUeNasToNas &msg); void onTimerTick(); + void handleUplinkDataRequest(int psi, OctetString &&data); }; } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index d298750d5..896756776 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -88,8 +88,8 @@ void NasTask::onLoop() auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeAppToNas::UPLINK_STATUS_CHANGE: { - sm->handleUplinkStatusChange(w->psi, w->isPending); + case NwUeAppToNas::UPLINK_DATA_DELIVERY: { + sm->handleUplinkDataRequest(w->psi, std::move(w->data)); break; } default: diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 597fa2793..c0abf5165 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -196,19 +196,19 @@ struct NwUeAppToNas : NtsMessage { enum PR { - UPLINK_STATUS_CHANGE, + UPLINK_DATA_DELIVERY, } present; - // UPLINK_STATUS_CHANGE + // UPLINK_DATA_DELIVERY int psi{}; - bool isPending{}; + OctetString data; explicit NwUeAppToNas(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_NAS), present(present) { } }; -struct NwUeAppToRls : NtsMessage +struct NwUeNasToRls : NtsMessage { enum PR { @@ -219,7 +219,7 @@ struct NwUeAppToRls : NtsMessage int psi{}; OctetString pdu; - explicit NwUeAppToRls(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_RLS), present(present) + explicit NwUeNasToRls(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RLS), present(present) { } }; diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index bbcf667a6..c14b4ee44 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -57,7 +57,8 @@ enum class NtsMessageType UE_RLS_TO_RRC, UE_RLS_TO_APP, UE_RLS_TO_RLS, - UE_NAS_TO_APP, + UE_NAS_TO_APP, + UE_NAS_TO_RLS, }; struct NtsMessage From 6e675f65bef7b2a1d04729bdcfce2c96f4af92f1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:01:04 +0300 Subject: [PATCH 191/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 12 +++++++----- src/ue/app/task.cpp | 16 ---------------- src/ue/app/task.hpp | 1 - src/ue/nas/sm/release.cpp | 2 +- 4 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 85b034ae5..6b7ff781a 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -19,6 +19,7 @@ #define PAUSE_CONFIRM_TIMEOUT 3000 #define PAUSE_POLLING 10 +// todo add coverage again to cli static std::string SignalDescription(int dbm) { if (dbm > -90) @@ -104,10 +105,11 @@ void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) switch (msg.cmd->present) { case app::UeCliCommand::STATUS: { - std::vector pduSessions{}; - for (auto &pduSession : m_base->appTask->m_pduSessions) - if (pduSession.has_value()) - pduSessions.push_back(ToJson(*pduSession)); + // TODO + //std::vector pduSessions{}; + //for (auto &pduSession : m_base->appTask->m_pduSessions) + // if (pduSession.has_value()) + // pduSessions.push_back(ToJson(*pduSession)); Json json = Json::Obj({ {"cm-state", ToJson(m_base->nasTask->mm->m_cmState)}, @@ -118,7 +120,7 @@ void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, {"stored-guti", ToJson(m_base->nasTask->mm->m_storage->storedGuti->get())}, {"has-emergency", ::ToJson(m_base->nasTask->mm->hasEmergency())}, - {"pdu-sessions", Json::Arr(std::move(pduSessions))}, + //TODO {"pdu-sessions", Json::Arr(std::move(pduSessions))}, }); sendResult(msg.address, json.dumpYaml()); break; diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index 0ddce943d..c83255581 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -129,17 +129,6 @@ void UeAppTask::receiveStatusUpdate(NwUeStatusUpdate &msg) if (msg.what == NwUeStatusUpdate::SESSION_ESTABLISHMENT) { auto *session = msg.pduSession; - - UePduSessionInfo sessionInfo{}; - sessionInfo.psi = session->psi; - sessionInfo.type = nas::utils::EnumToString(session->sessionType); - if (session->pduAddress.has_value()) - sessionInfo.address = utils::OctetStringToIp(session->pduAddress->pduAddressInformation); - sessionInfo.isEmergency = session->isEmergency; - sessionInfo.uplinkPending = false; - - m_pduSessions[session->psi] = std::move(sessionInfo); - setupTunInterface(session); return; } @@ -153,11 +142,6 @@ void UeAppTask::receiveStatusUpdate(NwUeStatusUpdate &msg) m_tunTasks[msg.psi] = nullptr; } - if (m_pduSessions[msg.psi].has_value()) - { - m_logger->info("PDU session[%d] released", msg.psi); - m_pduSessions[msg.psi] = {}; - } return; } diff --git a/src/ue/app/task.hpp b/src/ue/app/task.hpp index 57de0d362..edaf94e5d 100644 --- a/src/ue/app/task.hpp +++ b/src/ue/app/task.hpp @@ -27,7 +27,6 @@ class UeAppTask : public NtsTask TaskBase *m_base; std::unique_ptr m_logger; - std::array, 16> m_pduSessions{}; std::array m_tunTasks{}; ECmState m_cmState{}; diff --git a/src/ue/nas/sm/release.cpp b/src/ue/nas/sm/release.cpp index 4ebb09c0e..006385cb8 100644 --- a/src/ue/nas/sm/release.cpp +++ b/src/ue/nas/sm/release.cpp @@ -150,7 +150,7 @@ void NasSm::receiveReleaseCommand(const nas::PduSessionReleaseCommand &msg) } /* Construct Release Complete message */ - nas::PduSessionReleaseComplete resp{}; + nas::PduSessionReleaseComplete resp; resp.pduSessionId = psi; resp.pti = pti; From d1fde22659dd403d6d7ef1d5d3501deb05b167b1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:05:11 +0300 Subject: [PATCH 192/311] L3 RRC/NAS developments --- src/gnb/nts.hpp | 2 +- src/gnb/rls/task.cpp | 7 ++++++- src/ue/rls/task.cpp | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index caee7b2e9..05034fc90 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -63,7 +63,7 @@ struct NwGnbRlsToGtp : NtsMessage // DATA_PDU_DELIVERY int ueId{}; int psi{}; - OctetString pdu{}; + OctetString pdu; explicit NwGnbRlsToGtp(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_GTP), present(present) { diff --git a/src/gnb/rls/task.cpp b/src/gnb/rls/task.cpp index 6c3f67c27..f925d6644 100644 --- a/src/gnb/rls/task.cpp +++ b/src/gnb/rls/task.cpp @@ -8,6 +8,7 @@ #include "task.hpp" +#include #include #include @@ -55,7 +56,11 @@ void GnbRlsTask::onLoop() break; } case NwGnbRlsToRls::UPLINK_DATA: { - m_logger->debug("UPLINK_DATA ue[%d] psi[%d]", w->ueId, w->psi); + auto *m = new NwGnbRlsToGtp(NwGnbRlsToGtp::DATA_PDU_DELIVERY); + m->ueId = w->ueId; + m->psi = w->psi; + m->pdu = std::move(w->data); + m_base->gtpTask->push(m); break; } case NwGnbRlsToRls::UPLINK_RRC: { diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 8bec4210b..fb96bcdbb 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -102,7 +102,20 @@ void UeRlsTask::onLoop() break; } } - + break; + } + case NtsMessageType::UE_NAS_TO_RLS: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwUeNasToRls::DATA_PDU_DELIVERY: { + auto *m = new NwUeRlsToRls(NwUeRlsToRls::UPLINK_DATA); + m->psi = w->psi; + m->data = std::move(w->pdu); + m_ctlTask->push(m); + break; + } + } break; } default: From 606f38d01cdae1bacc6939af01ce93594156a37d Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:07:19 +0300 Subject: [PATCH 193/311] L3 RRC/NAS developments --- src/gnb/rls/task.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/gnb/rls/task.cpp b/src/gnb/rls/task.cpp index f925d6644..7c7023a95 100644 --- a/src/gnb/rls/task.cpp +++ b/src/gnb/rls/task.cpp @@ -102,6 +102,21 @@ void GnbRlsTask::onLoop() } break; } + case NtsMessageType::GNB_GTP_TO_RLS: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwGnbGtpToRls::DATA_PDU_DELIVERY: { + auto *m = new NwGnbRlsToRls(NwGnbRlsToRls::DOWNLINK_DATA); + m->ueId = w->ueId; + m->psi = w->psi; + m->data = std::move(w->pdu); + m_ctlTask->push(m); + break; + } + } + break; + } default: m_logger->unhandledNts(msg); break; From 0ad6cf291392bbbaaa5d71e8250bcb600be5472f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:08:37 +0300 Subject: [PATCH 194/311] L3 RRC/NAS developments --- src/ue/rls/task.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index fb96bcdbb..9202a2fc8 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -8,6 +8,7 @@ #include "task.hpp" +#include #include #include #include @@ -54,7 +55,10 @@ void UeRlsTask::onLoop() break; } case NwUeRlsToRls::DOWNLINK_DATA: { - m_logger->debug("downlink data psi[%d]", w->psi); + auto *m = new NwUeRlsToApp(NwUeRlsToApp::DATA_PDU_DELIVERY); + m->psi = w->psi; + m->pdu = std::move(w->data); + m_base->appTask->push(m); break; } case NwUeRlsToRls::DOWNLINK_RRC: { From 2a66fe908bdd8c57e3b92cfcf6cc12115534fb85 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:16:23 +0300 Subject: [PATCH 195/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 3 +++ src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/radio.cpp | 9 +++++++++ src/ue/nas/sm/resource.cpp | 4 +--- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 09fe38bda..7bc335362 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -88,6 +88,9 @@ void NasMm::performMmCycle() if (m_mmState == EMmState::MM_NULL) return; + if (m_sm->anyUplinkDataPending() && missingSessionBearer()) + serviceNeededForUplinkData(); + if (m_mmState == EMmState::MM_DEREGISTERED) { if (switchToECallInactivityIfNeeded()) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index f35af8f02..bebe8d375 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -166,6 +166,7 @@ class NasMm void handleRadioLinkFailure(); void handlePaging(const std::vector &tmsiIds); void updateProvidedGuti(bool provide = true); + bool missingSessionBearer(); private: /* Access Control */ bool isHighPriority(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index fa0df9ebe..4229712fe 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -321,4 +321,13 @@ void NasMm::updateProvidedGuti(bool provide) } } +bool NasMm::missingSessionBearer() +{ + if (m_cmState == ECmState::CM_IDLE) + return true; + + // TODO + return false; +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index 733f6fe69..357418d90 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -62,11 +62,9 @@ bool NasSm::anyEmergencySession() void NasSm::handleUplinkStatusChange(int psi, bool isPending) { m_logger->debug("Uplink data status changed PSI[%d] pending[%s]", psi, isPending ? "true" : "false"); - m_pduSessions[psi]->uplinkPending = isPending; - if (isPending) - m_mm->serviceNeededForUplinkData(); + m_mm->triggerMmCycle(); } bool NasSm::anyUplinkDataPending() From 52fe70b75d8ff73e0efb91918c2c45f8b76b6cd4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:28:50 +0300 Subject: [PATCH 196/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 17 ++++++++++++++--- src/ue/nas/mm/mm.hpp | 4 +++- src/ue/nas/mm/radio.cpp | 2 ++ src/ue/nas/mm/register.cpp | 8 -------- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 7bc335362..6ff112c7a 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -70,6 +70,7 @@ void NasMm::onStart(NasSm *sm, Usim *usim) { m_sm = sm; m_usim = usim; + triggerMmCycle(); } @@ -436,18 +437,28 @@ void NasMm::onSwitchUState(E5UState oldState, E5UState newState) { } -void NasMm::onSimRemoval() +void NasMm::onSwitchOn() { - m_storage->equivalentPlmnList->clear(); + resetRegAttemptCounter(); +} + +void NasMm::onSimInsertion() +{ + resetRegAttemptCounter(); +} +void NasMm::onSwitchOff() +{ m_storage->serviceAreaList->clear(); m_storage->forbiddenTaiListRoaming->clear(); m_storage->forbiddenTaiListRps->clear(); } -void NasMm::onSwitchOff() +void NasMm::onSimRemoval() { + m_storage->equivalentPlmnList->clear(); + m_storage->serviceAreaList->clear(); m_storage->forbiddenTaiListRoaming->clear(); diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index bebe8d375..7543c72d6 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -87,8 +87,10 @@ class NasMm void onSwitchRmState(ERmState oldState, ERmState newState); void onSwitchCmState(ECmState oldState, ECmState newState); void onSwitchUState(E5UState oldState, E5UState newState); - void onSimRemoval(); + void onSwitchOn(); + void onSimInsertion(); void onSwitchOff(); + void onSimRemoval(); private: /* Messaging */ void sendNasMessage(const nas::PlainMmMessage &msg); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 4229712fe..925654869 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -107,6 +107,8 @@ void NasMm::performPlmnSelection() { m_logger->info("Selected plmn[%s]", ToJson(selected).str().c_str()); m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::RRC_NOTIFY)); + + resetRegAttemptCounter(); } m_base->shCtx.selectedPlmn.set(selected); diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index dad6e75ed..1a1c0c1ea 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -948,14 +948,6 @@ void NasMm::resetRegAttemptCounter() m_regCounter = 0; m_timers->t3519.stop(); m_storage->storedSuci->clear(); - - // TODO: Registration attempt counter shall be reset for these cases as well (not implemented yet) - // - the UE is powered on; - // - a USIM is inserted - // "Additionally, the registration attempt counter shall be reset when the UE is in substate - // 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION or 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE, and:" - // - a new tracking area is entered; - // - timer T3346 is started. } } // namespace nr::ue \ No newline at end of file From 7cba7f5f54e7d5ae3964b9596e1b5b225e7faf35 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:33:37 +0300 Subject: [PATCH 197/311] L3 RRC/NAS developments --- src/ue/nas/mm/mm.hpp | 2 +- src/ue/nas/mm/radio.cpp | 11 ++++++++++- src/ue/nas/mm/sap.cpp | 2 +- src/ue/nts.hpp | 3 +++ src/ue/rrc/idle.cpp | 9 +++++---- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 7543c72d6..dfcbc382b 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -161,7 +161,7 @@ class NasMm private: /* Radio */ void performPlmnSelection(); void localReleaseConnection(); - void handleActiveCellChange(); + void handleActiveCellChange(const Tai& prevTai); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); void handleRrcEstablishmentFailure(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 925654869..5c8bfe0d3 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -148,7 +148,7 @@ void NasMm::performPlmnSelection() } } -void NasMm::handleActiveCellChange() +void NasMm::handleActiveCellChange(const Tai &prevTai) { if (m_cmState == ECmState::CM_CONNECTED) { @@ -163,6 +163,15 @@ void NasMm::handleActiveCellChange() if (currentCell.hasValue() && !m_storage->equivalentPlmnList->contains(currentCell.plmn)) m_timers->t3346.stop(); + if (currentCell.hasValue() && prevTai != currentTai) + { + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION || + m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) + { + resetRegAttemptCounter(); + } + } + if (m_mmState == EMmState::MM_REGISTERED) { if (currentCell.cellId == 0) diff --git a/src/ue/nas/mm/sap.cpp b/src/ue/nas/mm/sap.cpp index 0c629c95a..0b6d945d1 100644 --- a/src/ue/nas/mm/sap.cpp +++ b/src/ue/nas/mm/sap.cpp @@ -45,7 +45,7 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) break; } case NwUeRrcToNas::ACTIVE_CELL_CHANGED: { - handleActiveCellChange(); + handleActiveCellChange(msg.previousTai); break; } case NwUeRrcToNas::RRC_ESTABLISHMENT_FAILURE: { diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index c0abf5165..a9a04dce3 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -79,6 +79,9 @@ struct NwUeRrcToNas : NtsMessage // PAGING std::vector pagingTmsi; + // ACTIVE_CELL_CHANGED + Tai previousTai; + explicit NwUeRrcToNas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_NAS), present(present) { } diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index a9eb9bb5d..f2cd77730 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -27,9 +27,9 @@ void UeRrcTask::performCellSelection() if (currentTime - m_startedTime <= 1000LL && m_cellDesc.empty()) return; - int lastCell = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); + auto lastCell = m_base->shCtx.currentCell.get(); - bool shouldLogErrors = lastCell != 0 || (currentTime - m_lastTimePlmnSearchFailureLogged >= 30'000LL); + bool shouldLogErrors = lastCell.cellId != 0 || (currentTime - m_lastTimePlmnSearchFailureLogged >= 30'000LL); ActiveCellInfo cellInfo; CellSelectionReport report; @@ -92,17 +92,18 @@ void UeRrcTask::performCellSelection() int selectedCell = cellInfo.cellId; m_base->shCtx.currentCell.set(cellInfo); - if (selectedCell != 0 && selectedCell != lastCell) + if (selectedCell != 0 && selectedCell != lastCell.cellId) m_logger->info("Selected cell plmn[%s] tac[%d] category[%s]", ToJson(cellInfo.plmn).str().c_str(), cellInfo.tac, ToJson(cellInfo.category).str().c_str()); - if (selectedCell != lastCell) + if (selectedCell != lastCell.cellId) { auto *w1 = new NwUeRrcToRls(NwUeRrcToRls::ASSIGN_CURRENT_CELL); w1->cellId = selectedCell; m_base->rlsTask->push(w1); auto w2 = new NwUeRrcToNas(NwUeRrcToNas::ACTIVE_CELL_CHANGED); + w2->previousTai = Tai{lastCell.plmn, lastCell.tac}; m_base->nasTask->push(w2); } } From cb72a45fa700cafa51e2ab66078fe9ab6972ccdf Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:34:15 +0300 Subject: [PATCH 198/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 5c8bfe0d3..0baadcdaa 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -165,6 +165,9 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) if (currentCell.hasValue() && prevTai != currentTai) { + // "Additionally, the registration attempt counter shall be reset when the UE is in substate + // 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION or 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE, and a new + // tracking area is entered" if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION || m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) { From 771dd269d5cf0c0927c72653eeff1e0a1af95b09 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:43:49 +0300 Subject: [PATCH 199/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 4 ++-- src/ue/app/cmd_handler.hpp | 4 ++-- src/ue/app/task.cpp | 30 +++++++++++++-------------- src/ue/app/task.hpp | 2 +- src/ue/nas/mm/base.cpp | 4 ++-- src/ue/nas/mm/dereg.cpp | 2 +- src/ue/nas/mm/messaging.cpp | 2 +- src/ue/nas/mm/mm.hpp | 4 ++-- src/ue/nas/mm/radio.cpp | 4 ++-- src/ue/nas/mm/register.cpp | 2 +- src/ue/nas/mm/sap.cpp | 24 +++++++++++----------- src/ue/nas/sm/establishment.cpp | 2 +- src/ue/nas/sm/resource.cpp | 2 +- src/ue/nas/sm/sap.cpp | 6 +++--- src/ue/nas/sm/sm.hpp | 2 +- src/ue/nas/task.cpp | 18 ++++++++--------- src/ue/rls/ctl_task.cpp | 24 +++++++++++----------- src/ue/rls/task.cpp | 36 ++++++++++++++++----------------- src/ue/rls/udp_task.cpp | 4 ++-- src/ue/rrc/cells.cpp | 2 +- src/ue/rrc/channel.cpp | 6 +++--- src/ue/rrc/connection.cpp | 6 +++--- src/ue/rrc/failures.cpp | 2 +- src/ue/rrc/handler.cpp | 2 +- src/ue/rrc/idle.cpp | 4 ++-- src/ue/rrc/nas.cpp | 2 +- src/ue/rrc/sap.cpp | 16 +++++++-------- src/ue/rrc/state.cpp | 2 +- src/ue/rrc/task.cpp | 8 ++++---- src/ue/rrc/task.hpp | 4 ++-- src/ue/tun/task.cpp | 14 ++++++------- src/ue/ue.cpp | 2 +- 32 files changed, 123 insertions(+), 123 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 6b7ff781a..70824bb5a 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -69,7 +69,7 @@ bool UeCmdHandler::isAllPaused() return true; } -void UeCmdHandler::handleCmd(NwUeCliCommand &msg) +void UeCmdHandler::handleCmd(NmUeCliCommand &msg) { pauseTasks(); @@ -100,7 +100,7 @@ void UeCmdHandler::handleCmd(NwUeCliCommand &msg) unpauseTasks(); } -void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) +void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) { switch (msg.cmd->present) { diff --git a/src/ue/app/cmd_handler.hpp b/src/ue/app/cmd_handler.hpp index 9a107f5a8..ab5c9ba67 100644 --- a/src/ue/app/cmd_handler.hpp +++ b/src/ue/app/cmd_handler.hpp @@ -24,7 +24,7 @@ class UeCmdHandler { } - void handleCmd(NwUeCliCommand &msg); + void handleCmd(NmUeCliCommand &msg); private: void pauseTasks(); @@ -32,7 +32,7 @@ class UeCmdHandler bool isAllPaused(); private: - void handleCmdImpl(NwUeCliCommand &msg); + void handleCmdImpl(NmUeCliCommand &msg); private: void sendResult(const InetAddress &address, const std::string &output); diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index c83255581..624af5b57 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -52,14 +52,14 @@ void UeAppTask::onLoop() switch (msg->msgType) { case NtsMessageType::UE_RLS_TO_APP: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeRlsToApp::DATA_PDU_DELIVERY: { + case NmUeRlsToApp::DATA_PDU_DELIVERY: { auto *tunTask = m_tunTasks[w->psi]; if (tunTask) { - auto *nw = new NwAppToTun(NwAppToTun::DATA_PDU_DELIVERY); + auto *nw = new NmAppToTun(NmAppToTun::DATA_PDU_DELIVERY); nw->psi = w->psi; nw->data = std::move(w->pdu); tunTask->push(nw); @@ -70,17 +70,17 @@ void UeAppTask::onLoop() break; } case NtsMessageType::UE_TUN_TO_APP: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeTunToApp::DATA_PDU_DELIVERY: { - auto *m = new NwUeAppToNas(NwUeAppToNas::UPLINK_DATA_DELIVERY); + case NmUeTunToApp::DATA_PDU_DELIVERY: { + auto *m = new NmUeAppToNas(NmUeAppToNas::UPLINK_DATA_DELIVERY); m->psi = w->psi; m->data = std::move(w->data); m_base->nasTask->push(m); break; } - case NwUeTunToApp::TUN_ERROR: { + case NmUeTunToApp::TUN_ERROR: { m_logger->err("TUN failure [%s]", w->error.c_str()); break; } @@ -88,10 +88,10 @@ void UeAppTask::onLoop() break; } case NtsMessageType::UE_NAS_TO_APP: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeNasToApp::PERFORM_SWITCH_OFF: { + case NmUeNasToApp::PERFORM_SWITCH_OFF: { setTimer(SWITCH_OFF_TIMER_ID, SWITCH_OFF_DELAY); break; } @@ -99,11 +99,11 @@ void UeAppTask::onLoop() break; } case NtsMessageType::UE_STATUS_UPDATE: { - receiveStatusUpdate(*dynamic_cast(msg)); + receiveStatusUpdate(*dynamic_cast(msg)); break; } case NtsMessageType::UE_CLI_COMMAND: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); UeCmdHandler handler{m_base}; handler.handleCmd(*w); break; @@ -124,16 +124,16 @@ void UeAppTask::onLoop() delete msg; } -void UeAppTask::receiveStatusUpdate(NwUeStatusUpdate &msg) +void UeAppTask::receiveStatusUpdate(NmUeStatusUpdate &msg) { - if (msg.what == NwUeStatusUpdate::SESSION_ESTABLISHMENT) + if (msg.what == NmUeStatusUpdate::SESSION_ESTABLISHMENT) { auto *session = msg.pduSession; setupTunInterface(session); return; } - if (msg.what == NwUeStatusUpdate::SESSION_RELEASE) + if (msg.what == NmUeStatusUpdate::SESSION_RELEASE) { if (m_tunTasks[msg.psi] != nullptr) { @@ -145,7 +145,7 @@ void UeAppTask::receiveStatusUpdate(NwUeStatusUpdate &msg) return; } - if (msg.what == NwUeStatusUpdate::CM_STATE) + if (msg.what == NmUeStatusUpdate::CM_STATE) { m_cmState = msg.cmState; return; diff --git a/src/ue/app/task.hpp b/src/ue/app/task.hpp index edaf94e5d..128758970 100644 --- a/src/ue/app/task.hpp +++ b/src/ue/app/task.hpp @@ -42,7 +42,7 @@ class UeAppTask : public NtsTask void onQuit() override; private: - void receiveStatusUpdate(NwUeStatusUpdate &msg); + void receiveStatusUpdate(NmUeStatusUpdate &msg); void setupTunInterface(const PduSession *pduSession); }; diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 6ff112c7a..676eb459e 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -81,7 +81,7 @@ void NasMm::onQuit() void NasMm::triggerMmCycle() { - m_base->nasTask->push(new NwUeNasToNas(NwUeNasToNas::PERFORM_MM_CYCLE)); + m_base->nasTask->push(new NmUeNasToNas(NmUeNasToNas::PERFORM_MM_CYCLE)); } void NasMm::performMmCycle() @@ -291,7 +291,7 @@ void NasMm::switchCmState(ECmState state) onSwitchCmState(oldState, m_cmState); - auto *statusUpdate = new NwUeStatusUpdate(NwUeStatusUpdate::CM_STATE); + auto *statusUpdate = new NmUeStatusUpdate(NmUeStatusUpdate::CM_STATE); statusUpdate->cmState = m_cmState; m_base->appTask->push(statusUpdate); diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index b17b76d2b..aab742bf7 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -69,7 +69,7 @@ void NasMm::sendDeregistration(EDeregCause deregCause) if (deregCause == EDeregCause::SWITCH_OFF) { onSwitchOff(); - m_base->appTask->push(new NwUeNasToApp(NwUeNasToApp::PERFORM_SWITCH_OFF)); + m_base->appTask->push(new NmUeNasToApp(NmUeNasToApp::PERFORM_SWITCH_OFF)); } else if (deregCause == EDeregCause::USIM_REMOVAL) { diff --git a/src/ue/nas/mm/messaging.cpp b/src/ue/nas/mm/messaging.cpp index 8ef0c9e1b..aa6c85400 100644 --- a/src/ue/nas/mm/messaging.cpp +++ b/src/ue/nas/mm/messaging.cpp @@ -166,7 +166,7 @@ void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) } } - auto *nw = new NwUeNasToRrc(NwUeNasToRrc::UPLINK_NAS_DELIVERY); + auto *nw = new NmUeNasToRrc(NmUeNasToRrc::UPLINK_NAS_DELIVERY); nw->pduId = 0; nw->nasPdu = std::move(pdu); m_base->rrcTask->push(nw); diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index dfcbc382b..5f60059d3 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -184,8 +184,8 @@ class NasMm void onTimerExpire(UeTimer &timer); private: /* Service Access Point */ - void handleRrcEvent(const NwUeRrcToNas &msg); - void handleNasEvent(const NwUeNasToNas &msg); + void handleRrcEvent(const NmUeRrcToNas &msg); + void handleNasEvent(const NmUeNasToNas &msg); }; } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 0baadcdaa..79a6d3414 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -106,7 +106,7 @@ void NasMm::performPlmnSelection() else if (lastSelectedPlmn != selected) { m_logger->info("Selected plmn[%s]", ToJson(selected).str().c_str()); - m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::RRC_NOTIFY)); + m_base->rrcTask->push(new NmUeNasToRrc(NmUeNasToRrc::RRC_NOTIFY)); resetRegAttemptCounter(); } @@ -268,7 +268,7 @@ void NasMm::localReleaseConnection() m_logger->info("Performing local release of NAS connection"); - m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::LOCAL_RELEASE_CONNECTION)); + m_base->rrcTask->push(new NmUeNasToRrc(NmUeNasToRrc::LOCAL_RELEASE_CONNECTION)); } void NasMm::handlePaging(const std::vector &tmsiIds) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 1a1c0c1ea..0dc57db85 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -359,7 +359,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) if (regType == nas::ERegistrationType::INITIAL_REGISTRATION || regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) { - m_base->nasTask->push(new NwUeNasToNas(NwUeNasToNas::ESTABLISH_INITIAL_SESSIONS)); + m_base->nasTask->push(new NmUeNasToNas(NmUeNasToNas::ESTABLISH_INITIAL_SESSIONS)); } if (regType == nas::ERegistrationType::INITIAL_REGISTRATION) diff --git a/src/ue/nas/mm/sap.cpp b/src/ue/nas/mm/sap.cpp index 0b6d945d1..d9850adc6 100644 --- a/src/ue/nas/mm/sap.cpp +++ b/src/ue/nas/mm/sap.cpp @@ -13,56 +13,56 @@ namespace nr::ue { -void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) +void NasMm::handleRrcEvent(const NmUeRrcToNas &msg) { switch (msg.present) { - case NwUeRrcToNas::RRC_CONNECTION_SETUP: { + case NmUeRrcToNas::RRC_CONNECTION_SETUP: { handleRrcConnectionSetup(); break; } - case NwUeRrcToNas::NAS_DELIVERY: { + case NmUeRrcToNas::NAS_DELIVERY: { OctetView buffer{msg.nasPdu}; auto nasMessage = nas::DecodeNasMessage(buffer); if (nasMessage != nullptr) receiveNasMessage(*nasMessage); break; } - case NwUeRrcToNas::RRC_CONNECTION_RELEASE: { + case NmUeRrcToNas::RRC_CONNECTION_RELEASE: { handleRrcConnectionRelease(); break; } - case NwUeRrcToNas::RADIO_LINK_FAILURE: { + case NmUeRrcToNas::RADIO_LINK_FAILURE: { handleRadioLinkFailure(); break; } - case NwUeRrcToNas::PAGING: { + case NmUeRrcToNas::PAGING: { handlePaging(msg.pagingTmsi); break; } - case NwUeRrcToNas::NAS_NOTIFY: { + case NmUeRrcToNas::NAS_NOTIFY: { triggerMmCycle(); break; } - case NwUeRrcToNas::ACTIVE_CELL_CHANGED: { + case NmUeRrcToNas::ACTIVE_CELL_CHANGED: { handleActiveCellChange(msg.previousTai); break; } - case NwUeRrcToNas::RRC_ESTABLISHMENT_FAILURE: { + case NmUeRrcToNas::RRC_ESTABLISHMENT_FAILURE: { handleRrcEstablishmentFailure(); break; } } } -void NasMm::handleNasEvent(const NwUeNasToNas &msg) +void NasMm::handleNasEvent(const NmUeNasToNas &msg) { switch (msg.present) { - case NwUeNasToNas::PERFORM_MM_CYCLE: + case NmUeNasToNas::PERFORM_MM_CYCLE: performMmCycle(); break; - case NwUeNasToNas::NAS_TIMER_EXPIRE: + case NmUeNasToNas::NAS_TIMER_EXPIRE: onTimerExpire(*msg.timer); break; default: diff --git a/src/ue/nas/sm/establishment.cpp b/src/ue/nas/sm/establishment.cpp index 0ad57582e..e6b60c048 100644 --- a/src/ue/nas/sm/establishment.cpp +++ b/src/ue/nas/sm/establishment.cpp @@ -170,7 +170,7 @@ void NasSm::receiveEstablishmentAccept(const nas::PduSessionEstablishmentAccept else pduSession->pduAddress = {}; - auto *statusUpdate = new NwUeStatusUpdate(NwUeStatusUpdate::SESSION_ESTABLISHMENT); + auto *statusUpdate = new NmUeStatusUpdate(NmUeStatusUpdate::SESSION_ESTABLISHMENT); statusUpdate->pduSession = pduSession; m_base->appTask->push(statusUpdate); diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index 357418d90..742d3aa39 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -39,7 +39,7 @@ void NasSm::localReleaseSession(int psi) if (isEstablished) { - auto *statusUpdate = new NwUeStatusUpdate(NwUeStatusUpdate::SESSION_RELEASE); + auto *statusUpdate = new NmUeStatusUpdate(NmUeStatusUpdate::SESSION_RELEASE); statusUpdate->psi = psi; m_base->appTask->push(statusUpdate); } diff --git a/src/ue/nas/sm/sap.cpp b/src/ue/nas/sm/sap.cpp index f6f8b1857..53800a6bc 100644 --- a/src/ue/nas/sm/sap.cpp +++ b/src/ue/nas/sm/sap.cpp @@ -19,11 +19,11 @@ namespace nr::ue { -void NasSm::handleNasEvent(const NwUeNasToNas &msg) +void NasSm::handleNasEvent(const NmUeNasToNas &msg) { switch (msg.present) { - case NwUeNasToNas::NAS_TIMER_EXPIRE: + case NmUeNasToNas::NAS_TIMER_EXPIRE: onTimerExpire(*msg.timer); break; default: @@ -58,7 +58,7 @@ void NasSm::handleUplinkDataRequest(int psi, OctetString &&data) handleUplinkStatusChange(psi, false); } - auto *nw = new NwUeNasToRls(NwUeNasToRls::DATA_PDU_DELIVERY); + auto *nw = new NmUeNasToRls(NmUeNasToRls::DATA_PDU_DELIVERY); nw->psi = psi; nw->pdu = std::move(data); m_base->rlsTask->push(nw); diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index cbf80e3c3..5a4831395 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -89,7 +89,7 @@ class NasSm void abortProcedureByPtiOrPsi(int pti, int psi); private: /* Service Access Point */ - void handleNasEvent(const NwUeNasToNas &msg); + void handleNasEvent(const NmUeNasToNas &msg); void onTimerTick(); void handleUplinkDataRequest(int psi, OctetString &&data); }; diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index 896756776..fbe5cf846 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -57,25 +57,25 @@ void NasTask::onLoop() switch (msg->msgType) { case NtsMessageType::UE_RRC_TO_NAS: { - mm->handleRrcEvent(*dynamic_cast(msg)); + mm->handleRrcEvent(*dynamic_cast(msg)); break; } case NtsMessageType::UE_NAS_TO_NAS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeNasToNas::PERFORM_MM_CYCLE: { + case NmUeNasToNas::PERFORM_MM_CYCLE: { mm->handleNasEvent(*w); break; } - case NwUeNasToNas::NAS_TIMER_EXPIRE: { + case NmUeNasToNas::NAS_TIMER_EXPIRE: { if (w->timer->isMmTimer()) mm->handleNasEvent(*w); else sm->handleNasEvent(*w); break; } - case NwUeNasToNas::ESTABLISH_INITIAL_SESSIONS: { + case NmUeNasToNas::ESTABLISH_INITIAL_SESSIONS: { sm->establishInitialSessions(); break; } @@ -85,10 +85,10 @@ void NasTask::onLoop() break; } case NtsMessageType::UE_APP_TO_NAS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeAppToNas::UPLINK_DATA_DELIVERY: { + case NmUeAppToNas::UPLINK_DATA_DELIVERY: { sm->handleUplinkDataRequest(w->psi, std::move(w->data)); break; } @@ -108,7 +108,7 @@ void NasTask::onLoop() if (timerId == NTS_TIMER_ID_MM_CYCLE) { setTimer(NTS_TIMER_ID_MM_CYCLE, NTS_TIMER_INTERVAL_MM_CYCLE); - mm->handleNasEvent(NwUeNasToNas{NwUeNasToNas::PERFORM_MM_CYCLE}); + mm->handleNasEvent(NmUeNasToNas{NmUeNasToNas::PERFORM_MM_CYCLE}); } break; } @@ -123,7 +123,7 @@ void NasTask::onLoop() void NasTask::performTick() { auto sendExpireMsg = [this](UeTimer *timer) { - auto *nw = new NwUeNasToNas(NwUeNasToNas::NAS_TIMER_EXPIRE); + auto *nw = new NmUeNasToNas(NmUeNasToNas::NAS_TIMER_EXPIRE); nw->timer = timer; push(nw); }; diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index a5856b736..0140a6bc3 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -49,22 +49,22 @@ void RlsControlTask::onLoop() switch (msg->msgType) { case NtsMessageType::UE_RLS_TO_RLS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeRlsToRls::SIGNAL_CHANGED: + case NmUeRlsToRls::SIGNAL_CHANGED: handleSignalChange(w->cellId, w->dbm); break; - case NwUeRlsToRls::RECEIVE_RLS_MESSAGE: + case NmUeRlsToRls::RECEIVE_RLS_MESSAGE: handleRlsMessage(w->cellId, *w->msg); break; - case NwUeRlsToRls::UPLINK_DATA: + case NmUeRlsToRls::UPLINK_DATA: handleUplinkDataDelivery(w->psi, std::move(w->data)); break; - case NwUeRlsToRls::UPLINK_RRC: + case NmUeRlsToRls::UPLINK_RRC: handleUplinkRrcDelivery(w->cellId, w->pduId, w->rrcChannel, std::move(w->data)); break; - case NwUeRlsToRls::ASSIGN_CURRENT_CELL: + case NmUeRlsToRls::ASSIGN_CURRENT_CELL: m_servingCell = w->cellId; break; default: @@ -122,14 +122,14 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) return; } - auto *w = new NwUeRlsToRls(NwUeRlsToRls::DOWNLINK_DATA); + auto *w = new NmUeRlsToRls(NmUeRlsToRls::DOWNLINK_DATA); w->psi = static_cast(m.payload); w->data = std::move(m.pdu); m_mainTask->push(w); } else if (m.pduType == rls::EPduType::RRC) { - auto *w = new NwUeRlsToRls(NwUeRlsToRls::DOWNLINK_RRC); + auto *w = new NmUeRlsToRls(NmUeRlsToRls::DOWNLINK_RRC); w->cellId = cellId; w->rrcChannel = static_cast(m.payload); w->data = std::move(m.pdu); @@ -148,7 +148,7 @@ void RlsControlTask::handleRlsMessage(int cellId, rls::RlsMessage &msg) void RlsControlTask::handleSignalChange(int cellId, int dbm) { - auto *w = new NwUeRlsToRls(NwUeRlsToRls::SIGNAL_CHANGED); + auto *w = new NmUeRlsToRls(NmUeRlsToRls::SIGNAL_CHANGED); w->cellId = cellId; w->dbm = dbm; m_mainTask->push(w); @@ -162,7 +162,7 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr { m_pduMap.clear(); - auto *w = new NwUeRlsToRls(NwUeRlsToRls::RADIO_LINK_FAILURE); + auto *w = new NmUeRlsToRls(NmUeRlsToRls::RADIO_LINK_FAILURE); w->rlfCause = rls::ERlfCause::PDU_ID_EXISTS; m_mainTask->push(w); return; @@ -172,7 +172,7 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr { m_pduMap.clear(); - auto *w = new NwUeRlsToRls(NwUeRlsToRls::RADIO_LINK_FAILURE); + auto *w = new NmUeRlsToRls(NmUeRlsToRls::RADIO_LINK_FAILURE); w->rlfCause = rls::ERlfCause::PDU_ID_FULL; m_mainTask->push(w); return; @@ -227,7 +227,7 @@ void RlsControlTask::onAckControlTimerExpired() if (!transmissionFailures.empty()) { - auto *w = new NwUeRlsToRls(NwUeRlsToRls::TRANSMISSION_FAILURE); + auto *w = new NmUeRlsToRls(NmUeRlsToRls::TRANSMISSION_FAILURE); w->pduList = std::move(transmissionFailures); m_mainTask->push(w); } diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 9202a2fc8..82d369f22 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -44,38 +44,38 @@ void UeRlsTask::onLoop() switch (msg->msgType) { case NtsMessageType::UE_RLS_TO_RLS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeRlsToRls::SIGNAL_CHANGED: { - auto *m = new NwUeRlsToRrc(NwUeRlsToRrc::SIGNAL_CHANGED); + case NmUeRlsToRls::SIGNAL_CHANGED: { + auto *m = new NmUeRlsToRrc(NmUeRlsToRrc::SIGNAL_CHANGED); m->cellId = w->cellId; m->dbm = w->dbm; m_base->rrcTask->push(m); break; } - case NwUeRlsToRls::DOWNLINK_DATA: { - auto *m = new NwUeRlsToApp(NwUeRlsToApp::DATA_PDU_DELIVERY); + case NmUeRlsToRls::DOWNLINK_DATA: { + auto *m = new NmUeRlsToApp(NmUeRlsToApp::DATA_PDU_DELIVERY); m->psi = w->psi; m->pdu = std::move(w->data); m_base->appTask->push(m); break; } - case NwUeRlsToRls::DOWNLINK_RRC: { - auto *m = new NwUeRlsToRrc(NwUeRlsToRrc::DOWNLINK_RRC_DELIVERY); + case NmUeRlsToRls::DOWNLINK_RRC: { + auto *m = new NmUeRlsToRrc(NmUeRlsToRrc::DOWNLINK_RRC_DELIVERY); m->cellId = w->cellId; m->channel = w->rrcChannel; m->pdu = std::move(w->data); m_base->rrcTask->push(m); break; } - case NwUeRlsToRls::RADIO_LINK_FAILURE: { - auto *m = new NwUeRlsToRrc(NwUeRlsToRrc::RADIO_LINK_FAILURE); + case NmUeRlsToRls::RADIO_LINK_FAILURE: { + auto *m = new NmUeRlsToRrc(NmUeRlsToRrc::RADIO_LINK_FAILURE); m->rlfCause = w->rlfCause; m_base->rrcTask->push(m); break; } - case NwUeRlsToRls::TRANSMISSION_FAILURE: { + case NmUeRlsToRls::TRANSMISSION_FAILURE: { m_logger->debug("transmission failure [%d]", w->pduList.size()); break; } @@ -87,17 +87,17 @@ void UeRlsTask::onLoop() break; } case NtsMessageType::UE_RRC_TO_RLS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeRrcToRls::ASSIGN_CURRENT_CELL: { - auto *m = new NwUeRlsToRls(NwUeRlsToRls::ASSIGN_CURRENT_CELL); + case NmUeRrcToRls::ASSIGN_CURRENT_CELL: { + auto *m = new NmUeRlsToRls(NmUeRlsToRls::ASSIGN_CURRENT_CELL); m->cellId = w->cellId; m_ctlTask->push(m); break; } - case NwUeRrcToRls::RRC_PDU_DELIVERY: { - auto *m = new NwUeRlsToRls(NwUeRlsToRls::UPLINK_RRC); + case NmUeRrcToRls::RRC_PDU_DELIVERY: { + auto *m = new NmUeRlsToRls(NmUeRlsToRls::UPLINK_RRC); m->cellId = w->cellId; m->rrcChannel = w->channel; m->pduId = w->pduId; @@ -109,11 +109,11 @@ void UeRlsTask::onLoop() break; } case NtsMessageType::UE_NAS_TO_RLS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeNasToRls::DATA_PDU_DELIVERY: { - auto *m = new NwUeRlsToRls(NwUeRlsToRls::UPLINK_DATA); + case NmUeNasToRls::DATA_PDU_DELIVERY: { + auto *m = new NmUeRlsToRls(NmUeRlsToRls::UPLINK_DATA); m->psi = w->psi; m->data = std::move(w->pdu); m_ctlTask->push(m); diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp index e461fe9db..6479842ba 100644 --- a/src/ue/rls/udp_task.cpp +++ b/src/ue/rls/udp_task.cpp @@ -117,7 +117,7 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptrcellId = m_cells[msg->sti].cellId; w->msg = std::move(msg); m_ctlTask->push(w); @@ -132,7 +132,7 @@ void RlsUdpTask::onSignalChangeOrLost(int cellId) dbm = m_cells[sti].dbm; } - auto *w = new NwUeRlsToRls(NwUeRlsToRls::SIGNAL_CHANGED); + auto *w = new NmUeRlsToRls(NmUeRlsToRls::SIGNAL_CHANGED); w->cellId = cellId; w->dbm = dbm; m_ctlTask->push(w); diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index cc38cd18f..825519891 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -87,7 +87,7 @@ void UeRrcTask::updateAvailablePlmns() value.insert(cellDesc.second.sib1.plmn); }); - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::NAS_NOTIFY)); + m_base->nasTask->push(new NmUeRrcToNas(NmUeRrcToNas::NAS_NOTIFY)); } } // namespace nr::ue diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index d1330a776..7c272f768 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -93,7 +93,7 @@ void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH_Message *msg) return; } - auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); + auto *nw = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); nw->cellId = cellId; nw->channel = rrc::RrcChannel::UL_CCCH; nw->pdu = std::move(pdu); @@ -109,7 +109,7 @@ void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH1_Message *msg) return; } - auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); + auto *nw = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); nw->cellId = cellId; nw->channel = rrc::RrcChannel::UL_CCCH1; nw->pdu = std::move(pdu); @@ -125,7 +125,7 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) return; } - auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); + auto *nw = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); nw->cellId = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); nw->channel = rrc::RrcChannel::UL_DCCH; nw->pdu = std::move(pdu); diff --git a/src/ue/rrc/connection.cpp b/src/ue/rrc/connection.cpp index 3dd89895c..9bc28cc4a 100644 --- a/src/ue/rrc/connection.cpp +++ b/src/ue/rrc/connection.cpp @@ -99,7 +99,7 @@ void UeRrcTask::receiveRrcSetup(int cellId, const ASN_RRC_RRCSetup &msg) m_logger->info("RRC connection established"); switchState(ERrcState::RRC_CONNECTED); - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_SETUP)); + m_base->nasTask->push(new NmUeRrcToNas(NmUeRrcToNas::RRC_CONNECTION_SETUP)); } void UeRrcTask::receiveRrcReject(int cellId, const ASN_RRC_RRCReject &msg) @@ -116,12 +116,12 @@ void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) { m_logger->debug("RRC Release received"); m_state = ERrcState::RRC_IDLE; - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); + m_base->nasTask->push(new NmUeRrcToNas(NmUeRrcToNas::RRC_CONNECTION_RELEASE)); } void UeRrcTask::handleEstablishmentFailure() { - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_ESTABLISHMENT_FAILURE)); + m_base->nasTask->push(new NmUeRrcToNas(NmUeRrcToNas::RRC_ESTABLISHMENT_FAILURE)); } } // namespace nr::ue diff --git a/src/ue/rrc/failures.cpp b/src/ue/rrc/failures.cpp index 3536f71ea..3920b2427 100644 --- a/src/ue/rrc/failures.cpp +++ b/src/ue/rrc/failures.cpp @@ -23,7 +23,7 @@ void UeRrcTask::declareRadioLinkFailure(rls::ERlfCause cause) void UeRrcTask::handleRadioLinkFailure(rls::ERlfCause cause) { m_state = ERrcState::RRC_IDLE; - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RADIO_LINK_FAILURE)); + m_base->nasTask->push(new NmUeRrcToNas(NmUeRrcToNas::RADIO_LINK_FAILURE)); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index d87c897b6..d206f4107 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -51,7 +51,7 @@ void UeRrcTask::receivePaging(const ASN_RRC_Paging &msg) } }); - auto *w = new NwUeRrcToNas(NwUeRrcToNas::PAGING); + auto *w = new NmUeRrcToNas(NmUeRrcToNas::PAGING); w->pagingTmsi = std::move(tmsiIds); m_base->nasTask->push(w); } diff --git a/src/ue/rrc/idle.cpp b/src/ue/rrc/idle.cpp index f2cd77730..64b5b6085 100644 --- a/src/ue/rrc/idle.cpp +++ b/src/ue/rrc/idle.cpp @@ -98,11 +98,11 @@ void UeRrcTask::performCellSelection() if (selectedCell != lastCell.cellId) { - auto *w1 = new NwUeRrcToRls(NwUeRrcToRls::ASSIGN_CURRENT_CELL); + auto *w1 = new NmUeRrcToRls(NmUeRrcToRls::ASSIGN_CURRENT_CELL); w1->cellId = selectedCell; m_base->rlsTask->push(w1); - auto w2 = new NwUeRrcToNas(NwUeRrcToNas::ACTIVE_CELL_CHANGED); + auto w2 = new NmUeRrcToNas(NmUeRrcToNas::ACTIVE_CELL_CHANGED); w2->previousTai = Tai{lastCell.plmn, lastCell.tac}; m_base->nasTask->push(w2); } diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp index c7619946b..bc2ce5178 100644 --- a/src/ue/rrc/nas.cpp +++ b/src/ue/rrc/nas.cpp @@ -64,7 +64,7 @@ void UeRrcTask::receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTr OctetString nasPdu = asn::GetOctetString(*msg.criticalExtensions.choice.dlInformationTransfer->dedicatedNAS_Message); - auto *nw = new NwUeRrcToNas(NwUeRrcToNas::NAS_DELIVERY); + auto *nw = new NmUeRrcToNas(NmUeRrcToNas::NAS_DELIVERY); nw->nasPdu = std::move(nasPdu); m_base->nasTask->push(nw); } diff --git a/src/ue/rrc/sap.cpp b/src/ue/rrc/sap.cpp index 94c5d5e42..51f3d6794 100644 --- a/src/ue/rrc/sap.cpp +++ b/src/ue/rrc/sap.cpp @@ -15,41 +15,41 @@ namespace nr::ue { -void UeRrcTask::handleRlsSapMessage(NwUeRlsToRrc &msg) +void UeRrcTask::handleRlsSapMessage(NmUeRlsToRrc &msg) { switch (msg.present) { - case NwUeRlsToRrc::SIGNAL_CHANGED: { + case NmUeRlsToRrc::SIGNAL_CHANGED: { handleCellSignalChange(msg.cellId, msg.dbm); break; } - case NwUeRlsToRrc::DOWNLINK_RRC_DELIVERY: { + case NmUeRlsToRrc::DOWNLINK_RRC_DELIVERY: { handleDownlinkRrc(msg.cellId, msg.channel, msg.pdu); break; } - case NwUeRlsToRrc::RADIO_LINK_FAILURE: { + case NmUeRlsToRrc::RADIO_LINK_FAILURE: { handleRadioLinkFailure(msg.rlfCause); break; } } } -void UeRrcTask::handleNasSapMessage(NwUeNasToRrc &msg) +void UeRrcTask::handleNasSapMessage(NmUeNasToRrc &msg) { switch (msg.present) { - case NwUeNasToRrc::UPLINK_NAS_DELIVERY: { + case NmUeNasToRrc::UPLINK_NAS_DELIVERY: { deliverUplinkNas(msg.pduId, std::move(msg.nasPdu)); break; } - case NwUeNasToRrc::LOCAL_RELEASE_CONNECTION: { + case NmUeNasToRrc::LOCAL_RELEASE_CONNECTION: { // TODO // m_state = ERrcState::RRC_IDLE; // m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); // m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::RESET_STI)); break; } - case NwUeNasToRrc::RRC_NOTIFY: { + case NmUeNasToRrc::RRC_NOTIFY: { triggerCycle(); break; } diff --git a/src/ue/rrc/state.cpp b/src/ue/rrc/state.cpp index bcde6b035..4119e30b1 100644 --- a/src/ue/rrc/state.cpp +++ b/src/ue/rrc/state.cpp @@ -18,7 +18,7 @@ namespace nr::ue void UeRrcTask::triggerCycle() { - push(new NwUeRrcToRrc(NwUeRrcToRrc::TRIGGER_CYCLE)); + push(new NmUeRrcToRrc(NmUeRrcToRrc::TRIGGER_CYCLE)); } void UeRrcTask::performCycle() diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 366ae3865..b0acb06a8 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -53,18 +53,18 @@ void UeRrcTask::onLoop() switch (msg->msgType) { case NtsMessageType::UE_NAS_TO_RRC: { - handleNasSapMessage(*dynamic_cast(msg)); + handleNasSapMessage(*dynamic_cast(msg)); break; } case NtsMessageType::UE_RLS_TO_RRC: { - handleRlsSapMessage(*dynamic_cast(msg)); + handleRlsSapMessage(*dynamic_cast(msg)); break; } case NtsMessageType::UE_RRC_TO_RRC: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeRrcToRrc::TRIGGER_CYCLE: + case NmUeRrcToRrc::TRIGGER_CYCLE: performCycle(); break; } diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index e3b93aec6..529292c12 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -93,8 +93,8 @@ class UeRrcTask : public NtsTask void receiveRrcMessage(ASN_RRC_PCCH_Message *msg); /* Service Access Point */ - void handleRlsSapMessage(NwUeRlsToRrc &msg); - void handleNasSapMessage(NwUeNasToRrc &msg); + void handleRlsSapMessage(NmUeRlsToRrc &msg); + void handleNasSapMessage(NmUeNasToRrc &msg); /* State Management */ void triggerCycle(); diff --git a/src/ue/tun/task.cpp b/src/ue/tun/task.cpp index 1b2772e5e..2d8439ab5 100644 --- a/src/ue/tun/task.cpp +++ b/src/ue/tun/task.cpp @@ -35,9 +35,9 @@ static std::string GetErrorMessage(const std::string &cause) return what; } -static nr::ue::NwUeTunToApp *NwError(std::string &&error) +static nr::ue::NmUeTunToApp *NmError(std::string &&error) { - auto *nw = new nr::ue::NwUeTunToApp(nr::ue::NwUeTunToApp::TUN_ERROR); + auto *nw = new nr::ue::NmUeTunToApp(nr::ue::NmUeTunToApp::TUN_ERROR); nw->error = std::move(error); return nw; } @@ -57,13 +57,13 @@ static void ReceiverThread(ReceiverArgs *args) int n = ::read(fd, buffer, RECEIVER_BUFFER_SIZE); if (n < 0) { - targetTask->push(NwError(GetErrorMessage("TUN device could not read"))); + targetTask->push(NmError(GetErrorMessage("TUN device could not read"))); return; // Abort receiver thread } if (n > 0) { - auto *nw = new nr::ue::NwUeTunToApp(nr::ue::NwUeTunToApp::DATA_PDU_DELIVERY); + auto *nw = new nr::ue::NmUeTunToApp(nr::ue::NmUeTunToApp::DATA_PDU_DELIVERY); nw->psi = psi; nw->data = OctetString::FromArray(buffer, static_cast(n)); targetTask->push(nw); @@ -103,12 +103,12 @@ void TunTask::onLoop() switch (msg->msgType) { case NtsMessageType::UE_APP_TO_TUN: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); int res = ::write(m_fd, w->data.data(), w->data.length()); if (res < 0) - push(NwError(GetErrorMessage("TUN device could not write"))); + push(NmError(GetErrorMessage("TUN device could not write"))); else if (res != w->data.length()) - push(NwError(GetErrorMessage("TUN device partially written"))); + push(NmError(GetErrorMessage("TUN device partially written"))); delete w; break; } diff --git a/src/ue/ue.cpp b/src/ue/ue.cpp index 8a84eddf3..ea0d2d3f9 100644 --- a/src/ue/ue.cpp +++ b/src/ue/ue.cpp @@ -62,7 +62,7 @@ void UserEquipment::start() void UserEquipment::pushCommand(std::unique_ptr cmd, const InetAddress &address) { - taskBase->appTask->push(new NwUeCliCommand(std::move(cmd), address)); + taskBase->appTask->push(new NmUeCliCommand(std::move(cmd), address)); } } // namespace nr::ue From 75266085eaf0fcb00fd1f046c1cf1e19ed83d521 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:44:22 +0300 Subject: [PATCH 200/311] L3 RRC/NAS developments --- src/ue/nts.hpp | 60 +++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index a9a04dce3..35aadfdf1 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -23,7 +23,7 @@ namespace nr::ue { -struct NwAppToTun : NtsMessage +struct NmAppToTun : NtsMessage { enum PR { @@ -34,12 +34,12 @@ struct NwAppToTun : NtsMessage int psi{}; OctetString data{}; - explicit NwAppToTun(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_TUN), present(present) + explicit NmAppToTun(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_TUN), present(present) { } }; -struct NwUeTunToApp : NtsMessage +struct NmUeTunToApp : NtsMessage { enum PR { @@ -54,12 +54,12 @@ struct NwUeTunToApp : NtsMessage // TUN_ERROR std::string error{}; - explicit NwUeTunToApp(PR present) : NtsMessage(NtsMessageType::UE_TUN_TO_APP), present(present) + explicit NmUeTunToApp(PR present) : NtsMessage(NtsMessageType::UE_TUN_TO_APP), present(present) { } }; -struct NwUeRrcToNas : NtsMessage +struct NmUeRrcToNas : NtsMessage { enum PR { @@ -82,12 +82,12 @@ struct NwUeRrcToNas : NtsMessage // ACTIVE_CELL_CHANGED Tai previousTai; - explicit NwUeRrcToNas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_NAS), present(present) + explicit NmUeRrcToNas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_NAS), present(present) { } }; -struct NwUeNasToRrc : NtsMessage +struct NmUeNasToRrc : NtsMessage { enum PR { @@ -100,12 +100,12 @@ struct NwUeNasToRrc : NtsMessage uint32_t pduId{}; OctetString nasPdu; - explicit NwUeNasToRrc(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RRC), present(present) + explicit NmUeNasToRrc(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RRC), present(present) { } }; -struct NwUeRrcToRls : NtsMessage +struct NmUeRrcToRls : NtsMessage { enum PR { @@ -121,24 +121,24 @@ struct NwUeRrcToRls : NtsMessage uint32_t pduId{}; OctetString pdu{}; - explicit NwUeRrcToRls(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_RLS), present(present) + explicit NmUeRrcToRls(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_RLS), present(present) { } }; -struct NwUeRrcToRrc : NtsMessage +struct NmUeRrcToRrc : NtsMessage { enum PR { TRIGGER_CYCLE, } present; - explicit NwUeRrcToRrc(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_RRC), present(present) + explicit NmUeRrcToRrc(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_RRC), present(present) { } }; -struct NwUeRlsToRrc : NtsMessage +struct NmUeRlsToRrc : NtsMessage { enum PR { @@ -161,12 +161,12 @@ struct NwUeRlsToRrc : NtsMessage // RADIO_LINK_FAILURE rls::ERlfCause rlfCause{}; - explicit NwUeRlsToRrc(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RRC), present(present) + explicit NmUeRlsToRrc(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RRC), present(present) { } }; -struct NwUeNasToNas : NtsMessage +struct NmUeNasToNas : NtsMessage { enum PR { @@ -178,24 +178,24 @@ struct NwUeNasToNas : NtsMessage // NAS_TIMER_EXPIRE UeTimer *timer{}; - explicit NwUeNasToNas(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_NAS), present(present) + explicit NmUeNasToNas(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_NAS), present(present) { } }; -struct NwUeNasToApp : NtsMessage +struct NmUeNasToApp : NtsMessage { enum PR { PERFORM_SWITCH_OFF, } present; - explicit NwUeNasToApp(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_APP), present(present) + explicit NmUeNasToApp(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_APP), present(present) { } }; -struct NwUeAppToNas : NtsMessage +struct NmUeAppToNas : NtsMessage { enum PR { @@ -206,12 +206,12 @@ struct NwUeAppToNas : NtsMessage int psi{}; OctetString data; - explicit NwUeAppToNas(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_NAS), present(present) + explicit NmUeAppToNas(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_NAS), present(present) { } }; -struct NwUeNasToRls : NtsMessage +struct NmUeNasToRls : NtsMessage { enum PR { @@ -222,12 +222,12 @@ struct NwUeNasToRls : NtsMessage int psi{}; OctetString pdu; - explicit NwUeNasToRls(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RLS), present(present) + explicit NmUeNasToRls(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RLS), present(present) { } }; -struct NwUeRlsToApp : NtsMessage +struct NmUeRlsToApp : NtsMessage { enum PR { @@ -238,12 +238,12 @@ struct NwUeRlsToApp : NtsMessage int psi{}; OctetString pdu{}; - explicit NwUeRlsToApp(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_APP), present(present) + explicit NmUeRlsToApp(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_APP), present(present) { } }; -struct NwUeRlsToRls : NtsMessage +struct NmUeRlsToRls : NtsMessage { enum PR { @@ -294,12 +294,12 @@ struct NwUeRlsToRls : NtsMessage // TRANSMISSION_FAILURE std::vector pduList; - explicit NwUeRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) + explicit NmUeRlsToRls(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RLS), present(present) { } }; -struct NwUeStatusUpdate : NtsMessage +struct NmUeStatusUpdate : NtsMessage { static constexpr const int SESSION_ESTABLISHMENT = 1; static constexpr const int SESSION_RELEASE = 2; @@ -316,17 +316,17 @@ struct NwUeStatusUpdate : NtsMessage // CM_STATE ECmState cmState{}; - explicit NwUeStatusUpdate(const int what) : NtsMessage(NtsMessageType::UE_STATUS_UPDATE), what(what) + explicit NmUeStatusUpdate(const int what) : NtsMessage(NtsMessageType::UE_STATUS_UPDATE), what(what) { } }; -struct NwUeCliCommand : NtsMessage +struct NmUeCliCommand : NtsMessage { std::unique_ptr cmd; InetAddress address; - NwUeCliCommand(std::unique_ptr cmd, InetAddress address) + NmUeCliCommand(std::unique_ptr cmd, InetAddress address) : NtsMessage(NtsMessageType::UE_CLI_COMMAND), cmd(std::move(cmd)), address(address) { } From e04f5926a641969facfdbd55632d4388aeab23df Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:46:08 +0300 Subject: [PATCH 201/311] L3 RRC/NAS developments --- src/gnb/app/cmd_handler.cpp | 4 ++-- src/gnb/app/cmd_handler.hpp | 4 ++-- src/gnb/app/task.cpp | 6 ++--- src/gnb/gnb.cpp | 2 +- src/gnb/gtp/task.cpp | 16 +++++++------- src/gnb/ngap/context.cpp | 8 +++---- src/gnb/ngap/interface.cpp | 6 ++--- src/gnb/ngap/nas.cpp | 2 +- src/gnb/ngap/radio.cpp | 4 ++-- src/gnb/ngap/session.cpp | 4 ++-- src/gnb/ngap/task.cpp | 18 +++++++-------- src/gnb/ngap/transport.cpp | 4 ++-- src/gnb/nts.hpp | 44 ++++++++++++++++++------------------- src/gnb/rls/ctl_task.cpp | 26 +++++++++++----------- src/gnb/rls/task.cpp | 32 +++++++++++++-------------- src/gnb/rls/udp_task.cpp | 6 ++--- src/gnb/rrc/channel.cpp | 10 ++++----- src/gnb/rrc/connection.cpp | 2 +- src/gnb/rrc/handler.cpp | 4 ++-- src/gnb/rrc/sap.cpp | 6 ++--- src/gnb/rrc/task.cpp | 12 +++++----- src/gnb/rrc/task.hpp | 2 +- src/gnb/sctp/task.cpp | 30 ++++++++++++------------- 23 files changed, 126 insertions(+), 126 deletions(-) diff --git a/src/gnb/app/cmd_handler.cpp b/src/gnb/app/cmd_handler.cpp index a3b94ccde..5d40d4c69 100644 --- a/src/gnb/app/cmd_handler.cpp +++ b/src/gnb/app/cmd_handler.cpp @@ -66,7 +66,7 @@ bool GnbCmdHandler::isAllPaused() return true; } -void GnbCmdHandler::handleCmd(NwGnbCliCommand &msg) +void GnbCmdHandler::handleCmd(NmGnbCliCommand &msg) { pauseTasks(); @@ -97,7 +97,7 @@ void GnbCmdHandler::handleCmd(NwGnbCliCommand &msg) unpauseTasks(); } -void GnbCmdHandler::handleCmdImpl(NwGnbCliCommand &msg) +void GnbCmdHandler::handleCmdImpl(NmGnbCliCommand &msg) { switch (msg.cmd->present) { diff --git a/src/gnb/app/cmd_handler.hpp b/src/gnb/app/cmd_handler.hpp index 4341dbff7..354583d31 100644 --- a/src/gnb/app/cmd_handler.hpp +++ b/src/gnb/app/cmd_handler.hpp @@ -24,7 +24,7 @@ class GnbCmdHandler { } - void handleCmd(NwGnbCliCommand &msg); + void handleCmd(NmGnbCliCommand &msg); private: void pauseTasks(); @@ -32,7 +32,7 @@ class GnbCmdHandler bool isAllPaused(); private: - void handleCmdImpl(NwGnbCliCommand &msg); + void handleCmdImpl(NmGnbCliCommand &msg); private: void sendResult(const InetAddress &address, const std::string &output); diff --git a/src/gnb/app/task.cpp b/src/gnb/app/task.cpp index 5ba5bc46f..aa6b39d07 100644 --- a/src/gnb/app/task.cpp +++ b/src/gnb/app/task.cpp @@ -32,17 +32,17 @@ void GnbAppTask::onLoop() switch (msg->msgType) { case NtsMessageType::GNB_STATUS_UPDATE: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->what) { - case NwGnbStatusUpdate::NGAP_IS_UP: + case NmGnbStatusUpdate::NGAP_IS_UP: m_statusInfo.isNgapUp = w->isNgapUp; break; } break; } case NtsMessageType::GNB_CLI_COMMAND: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); GnbCmdHandler handler{m_base}; handler.handleCmd(*w); break; diff --git a/src/gnb/gnb.cpp b/src/gnb/gnb.cpp index 2a0561763..284982312 100644 --- a/src/gnb/gnb.cpp +++ b/src/gnb/gnb.cpp @@ -70,7 +70,7 @@ void GNodeB::start() void GNodeB::pushCommand(std::unique_ptr cmd, const InetAddress &address) { - taskBase->appTask->push(new NwGnbCliCommand(std::move(cmd), address)); + taskBase->appTask->push(new NmGnbCliCommand(std::move(cmd), address)); } } // namespace nr::gnb diff --git a/src/gnb/gtp/task.cpp b/src/gnb/gtp/task.cpp index d4cb91d12..6622fd961 100644 --- a/src/gnb/gtp/task.cpp +++ b/src/gnb/gtp/task.cpp @@ -55,22 +55,22 @@ void GtpTask::onLoop() switch (msg->msgType) { case NtsMessageType::GNB_NGAP_TO_GTP: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbNgapToGtp::UE_CONTEXT_UPDATE: { + case NmGnbNgapToGtp::UE_CONTEXT_UPDATE: { handleUeContextUpdate(*w->update); break; } - case NwGnbNgapToGtp::UE_CONTEXT_RELEASE: { + case NmGnbNgapToGtp::UE_CONTEXT_RELEASE: { handleUeContextDelete(w->ueId); break; } - case NwGnbNgapToGtp::SESSION_CREATE: { + case NmGnbNgapToGtp::SESSION_CREATE: { handleSessionCreate(w->resource); break; } - case NwGnbNgapToGtp::SESSION_RELEASE: { + case NmGnbNgapToGtp::SESSION_RELEASE: { handleSessionRelease(w->ueId, w->psi); break; } @@ -78,10 +78,10 @@ void GtpTask::onLoop() break; } case NtsMessageType::GNB_RLS_TO_GTP: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbRlsToGtp::DATA_PDU_DELIVERY: { + case NmGnbRlsToGtp::DATA_PDU_DELIVERY: { handleUplinkData(w->ueId, w->psi, std::move(w->pdu)); break; } @@ -240,7 +240,7 @@ void GtpTask::handleUdpReceive(const udp::NwUdpServerReceive &msg) if (m_rateLimiter->allowDownlinkPacket(sessionInd, gtp->payload.length())) { - auto *w = new NwGnbGtpToRls(NwGnbGtpToRls::DATA_PDU_DELIVERY); + auto *w = new NmGnbGtpToRls(NmGnbGtpToRls::DATA_PDU_DELIVERY); w->ueId = GetUeId(sessionInd); w->psi = GetPsi(sessionInd); w->pdu = std::move(gtp->payload); diff --git a/src/gnb/ngap/context.cpp b/src/gnb/ngap/context.cpp index 330985c8e..32ea91bd8 100644 --- a/src/gnb/ngap/context.cpp +++ b/src/gnb/ngap/context.cpp @@ -53,7 +53,7 @@ void NgapTask::receiveInitialContextSetup(int amfId, ASN_NGAP_InitialContextSetu if (ie) deliverDownlinkNas(ue->ctxId, asn::GetOctetString(ie->NAS_PDU)); - auto *w = new NwGnbNgapToGtp(NwGnbNgapToGtp::UE_CONTEXT_UPDATE); + auto *w = new NmGnbNgapToGtp(NmGnbNgapToGtp::UE_CONTEXT_UPDATE); w->update = std::make_unique(true, ue->ctxId, ue->ueAmbr); m_base->gtpTask->push(w); } @@ -67,12 +67,12 @@ void NgapTask::receiveContextRelease(int amfId, ASN_NGAP_UEContextReleaseCommand return; // Notify RRC task - auto *w1 = new NwGnbNgapToRrc(NwGnbNgapToRrc::AN_RELEASE); + auto *w1 = new NmGnbNgapToRrc(NmGnbNgapToRrc::AN_RELEASE); w1->ueId = ue->ctxId; m_base->rrcTask->push(w1); // Notify GTP task - auto *w2 = new NwGnbNgapToGtp(NwGnbNgapToGtp::UE_CONTEXT_RELEASE); + auto *w2 = new NmGnbNgapToGtp(NmGnbNgapToGtp::UE_CONTEXT_RELEASE); w2->ueId = ue->ctxId; m_base->gtpTask->push(w2); @@ -108,7 +108,7 @@ void NgapTask::receiveContextModification(int amfId, ASN_NGAP_UEContextModificat auto *response = asn::ngap::NewMessagePdu({}); sendNgapUeAssociated(ue->ctxId, response); - auto *w = new NwGnbNgapToGtp(NwGnbNgapToGtp::UE_CONTEXT_UPDATE); + auto *w = new NmGnbNgapToGtp(NmGnbNgapToGtp::UE_CONTEXT_UPDATE); w->update = std::make_unique(false, ue->ctxId, ue->ueAmbr); m_base->gtpTask->push(w); } diff --git a/src/gnb/ngap/interface.cpp b/src/gnb/ngap/interface.cpp index 87af38579..d6126486a 100644 --- a/src/gnb/ngap/interface.cpp +++ b/src/gnb/ngap/interface.cpp @@ -99,7 +99,7 @@ void NgapTask::handleAssociationShutdown(int amfId) amf->state = EAmfState::NOT_CONNECTED; - auto *w = new NwGnbSctp(NwGnbSctp::CONNECTION_CLOSE); + auto *w = new NmGnbSctp(NmGnbSctp::CONNECTION_CLOSE); w->clientId = amfId; m_base->sctpTask->push(w); @@ -192,11 +192,11 @@ void NgapTask::receiveNgSetupResponse(int amfId, ASN_NGAP_NGSetupResponse *msg) { m_isInitialized = true; - auto *update = new NwGnbStatusUpdate(NwGnbStatusUpdate::NGAP_IS_UP); + auto *update = new NmGnbStatusUpdate(NmGnbStatusUpdate::NGAP_IS_UP); update->isNgapUp = true; m_base->appTask->push(update); - m_base->rrcTask->push(new NwGnbNgapToRrc(NwGnbNgapToRrc::RADIO_POWER_ON)); + m_base->rrcTask->push(new NmGnbNgapToRrc(NmGnbNgapToRrc::RADIO_POWER_ON)); } } diff --git a/src/gnb/ngap/nas.cpp b/src/gnb/ngap/nas.cpp index 9bbacec3a..307d09649 100644 --- a/src/gnb/ngap/nas.cpp +++ b/src/gnb/ngap/nas.cpp @@ -78,7 +78,7 @@ void NgapTask::handleInitialNasTransport(int ueId, const OctetString &nasPdu, lo void NgapTask::deliverDownlinkNas(int ueId, OctetString &&nasPdu) { - auto *w = new NwGnbNgapToRrc(NwGnbNgapToRrc::NAS_DELIVERY); + auto *w = new NmGnbNgapToRrc(NmGnbNgapToRrc::NAS_DELIVERY); w->ueId = ueId; w->pdu = std::move(nasPdu); m_base->rrcTask->push(w); diff --git a/src/gnb/ngap/radio.cpp b/src/gnb/ngap/radio.cpp index 52fecfd3c..01fa5bc9d 100644 --- a/src/gnb/ngap/radio.cpp +++ b/src/gnb/ngap/radio.cpp @@ -22,7 +22,7 @@ namespace nr::gnb void NgapTask::handleRadioLinkFailure(int ueId) { // Notify GTP task - auto *w2 = new NwGnbNgapToGtp(NwGnbNgapToGtp::UE_CONTEXT_RELEASE); + auto *w2 = new NmGnbNgapToGtp(NmGnbNgapToGtp::UE_CONTEXT_RELEASE); w2->ueId = ueId; m_base->gtpTask->push(w2); @@ -48,7 +48,7 @@ void NgapTask::receivePaging(int amfId, ASN_NGAP_Paging *msg) return; } - auto *w = new NwGnbNgapToRrc(NwGnbNgapToRrc::PAGING); + auto *w = new NmGnbNgapToRrc(NmGnbNgapToRrc::PAGING); w->uePagingTmsi = asn::UniqueCopy(*ieUePagingIdentity->UEPagingIdentity.choice.fiveG_S_TMSI, asn_DEF_ASN_NGAP_FiveG_S_TMSI); w->taiListForPaging = asn::UniqueCopy(ieTaiListForPaging->TAIListForPaging, asn_DEF_ASN_NGAP_TAIListForPaging); diff --git a/src/gnb/ngap/session.cpp b/src/gnb/ngap/session.cpp index 0511da1f1..eb9bcff50 100644 --- a/src/gnb/ngap/session.cpp +++ b/src/gnb/ngap/session.cpp @@ -236,7 +236,7 @@ std::optional NgapTask::setupPduSessionResource(PduSessionResource *r resource->downTunnel.address = utils::IpToOctetString(m_base->config->gtpIp); resource->downTunnel.teid = ++m_downlinkTeidCounter; - auto *w = new NwGnbNgapToGtp(NwGnbNgapToGtp::SESSION_CREATE); + auto *w = new NmGnbNgapToGtp(NmGnbNgapToGtp::SESSION_CREATE); w->resource = resource; m_base->gtpTask->push(w); @@ -277,7 +277,7 @@ void NgapTask::receiveSessionResourceReleaseCommand(int amfId, ASN_NGAP_PDUSessi // Perform release for (auto &psi : psIds) { - auto *w = new NwGnbNgapToGtp(NwGnbNgapToGtp::SESSION_RELEASE); + auto *w = new NmGnbNgapToGtp(NmGnbNgapToGtp::SESSION_RELEASE); w->ueId = ue->ctxId; w->psi = psi; m_base->gtpTask->push(w); diff --git a/src/gnb/ngap/task.cpp b/src/gnb/ngap/task.cpp index 34610ecb9..3623f4334 100644 --- a/src/gnb/ngap/task.cpp +++ b/src/gnb/ngap/task.cpp @@ -30,7 +30,7 @@ void NgapTask::onStart() for (auto &amfCtx : m_amfCtx) { - auto *msg = new NwGnbSctp(NwGnbSctp::CONNECTION_REQUEST); + auto *msg = new NmGnbSctp(NmGnbSctp::CONNECTION_REQUEST); msg->clientId = amfCtx.second->ctxId; msg->localAddress = m_base->config->ngapIp; msg->localPort = 0; @@ -51,18 +51,18 @@ void NgapTask::onLoop() switch (msg->msgType) { case NtsMessageType::GNB_RRC_TO_NGAP: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbRrcToNgap::INITIAL_NAS_DELIVERY: { + case NmGnbRrcToNgap::INITIAL_NAS_DELIVERY: { handleInitialNasTransport(w->ueId, w->pdu, w->rrcEstablishmentCause); break; } - case NwGnbRrcToNgap::UPLINK_NAS_DELIVERY: { + case NmGnbRrcToNgap::UPLINK_NAS_DELIVERY: { handleUplinkNasTransport(w->ueId, w->pdu); break; } - case NwGnbRrcToNgap::RADIO_LINK_FAILURE: { + case NmGnbRrcToNgap::RADIO_LINK_FAILURE: { handleRadioLinkFailure(w->ueId); break; } @@ -70,16 +70,16 @@ void NgapTask::onLoop() break; } case NtsMessageType::GNB_SCTP: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbSctp::ASSOCIATION_SETUP: + case NmGnbSctp::ASSOCIATION_SETUP: handleAssociationSetup(w->clientId, w->associationId, w->inStreams, w->outStreams); break; - case NwGnbSctp::RECEIVE_MESSAGE: + case NmGnbSctp::RECEIVE_MESSAGE: handleSctpMessage(w->clientId, w->stream, w->buffer); break; - case NwGnbSctp::ASSOCIATION_SHUTDOWN: + case NmGnbSctp::ASSOCIATION_SHUTDOWN: handleAssociationShutdown(w->clientId); break; default: diff --git a/src/gnb/ngap/transport.cpp b/src/gnb/ngap/transport.cpp index 29f4d8405..b6c0e2494 100644 --- a/src/gnb/ngap/transport.cpp +++ b/src/gnb/ngap/transport.cpp @@ -109,7 +109,7 @@ void NgapTask::sendNgapNonUe(int associatedAmf, ASN_NGAP_NGAP_PDU *pdu) m_logger->err("NGAP APER encoding failed"); else { - auto *msg = new NwGnbSctp(NwGnbSctp::SEND_MESSAGE); + auto *msg = new NmGnbSctp(NmGnbSctp::SEND_MESSAGE); msg->clientId = amf->ctxId; msg->stream = 0; msg->buffer = UniqueBuffer{buffer, static_cast(encoded)}; @@ -200,7 +200,7 @@ void NgapTask::sendNgapUeAssociated(int ueId, ASN_NGAP_NGAP_PDU *pdu) m_logger->err("NGAP APER encoding failed"); else { - auto *msg = new NwGnbSctp(NwGnbSctp::SEND_MESSAGE); + auto *msg = new NmGnbSctp(NmGnbSctp::SEND_MESSAGE); msg->clientId = amf->ctxId; msg->stream = ue->uplinkStream; msg->buffer = UniqueBuffer{buffer, static_cast(encoded)}; diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 05034fc90..3edde81ac 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -32,7 +32,7 @@ extern "C" namespace nr::gnb { -struct NwGnbRlsToRrc : NtsMessage +struct NmGnbRlsToRrc : NtsMessage { enum PR { @@ -48,12 +48,12 @@ struct NwGnbRlsToRrc : NtsMessage OctetString data; rrc::RrcChannel rrcChannel{}; - explicit NwGnbRlsToRrc(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RRC), present(present) + explicit NmGnbRlsToRrc(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RRC), present(present) { } }; -struct NwGnbRlsToGtp : NtsMessage +struct NmGnbRlsToGtp : NtsMessage { enum PR { @@ -65,12 +65,12 @@ struct NwGnbRlsToGtp : NtsMessage int psi{}; OctetString pdu; - explicit NwGnbRlsToGtp(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_GTP), present(present) + explicit NmGnbRlsToGtp(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_GTP), present(present) { } }; -struct NwGnbGtpToRls : NtsMessage +struct NmGnbGtpToRls : NtsMessage { enum PR { @@ -82,12 +82,12 @@ struct NwGnbGtpToRls : NtsMessage int psi{}; OctetString pdu{}; - explicit NwGnbGtpToRls(PR present) : NtsMessage(NtsMessageType::GNB_GTP_TO_RLS), present(present) + explicit NmGnbGtpToRls(PR present) : NtsMessage(NtsMessageType::GNB_GTP_TO_RLS), present(present) { } }; -struct NwGnbRlsToRls : NtsMessage +struct NmGnbRlsToRls : NtsMessage { enum PR { @@ -136,12 +136,12 @@ struct NwGnbRlsToRls : NtsMessage // TRANSMISSION_FAILURE std::vector pduList; - explicit NwGnbRlsToRls(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RLS), present(present) + explicit NmGnbRlsToRls(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RLS), present(present) { } }; -struct NwGnbRrcToRls : NtsMessage +struct NmGnbRrcToRls : NtsMessage { enum PR { @@ -153,12 +153,12 @@ struct NwGnbRrcToRls : NtsMessage rrc::RrcChannel channel{}; OctetString pdu{}; - explicit NwGnbRrcToRls(PR present) : NtsMessage(NtsMessageType::GNB_RRC_TO_RLS), present(present) + explicit NmGnbRrcToRls(PR present) : NtsMessage(NtsMessageType::GNB_RRC_TO_RLS), present(present) { } }; -struct NwGnbNgapToRrc : NtsMessage +struct NmGnbNgapToRrc : NtsMessage { enum PR { @@ -179,12 +179,12 @@ struct NwGnbNgapToRrc : NtsMessage asn::Unique uePagingTmsi{}; asn::Unique taiListForPaging{}; - explicit NwGnbNgapToRrc(PR present) : NtsMessage(NtsMessageType::GNB_NGAP_TO_RRC), present(present) + explicit NmGnbNgapToRrc(PR present) : NtsMessage(NtsMessageType::GNB_NGAP_TO_RRC), present(present) { } }; -struct NwGnbRrcToNgap : NtsMessage +struct NmGnbRrcToNgap : NtsMessage { enum PR { @@ -205,12 +205,12 @@ struct NwGnbRrcToNgap : NtsMessage // INITIAL_NAS_DELIVERY long rrcEstablishmentCause{}; - explicit NwGnbRrcToNgap(PR present) : NtsMessage(NtsMessageType::GNB_RRC_TO_NGAP), present(present) + explicit NmGnbRrcToNgap(PR present) : NtsMessage(NtsMessageType::GNB_RRC_TO_NGAP), present(present) { } }; -struct NwGnbNgapToGtp : NtsMessage +struct NmGnbNgapToGtp : NtsMessage { enum PR { @@ -233,12 +233,12 @@ struct NwGnbNgapToGtp : NtsMessage // SESSION_RELEASE int psi{}; - explicit NwGnbNgapToGtp(PR present) : NtsMessage(NtsMessageType::GNB_NGAP_TO_GTP), present(present) + explicit NmGnbNgapToGtp(PR present) : NtsMessage(NtsMessageType::GNB_NGAP_TO_GTP), present(present) { } }; -struct NwGnbSctp : NtsMessage +struct NmGnbSctp : NtsMessage { enum PR { @@ -278,12 +278,12 @@ struct NwGnbSctp : NtsMessage UniqueBuffer buffer{}; uint16_t stream{}; - explicit NwGnbSctp(PR present) : NtsMessage(NtsMessageType::GNB_SCTP), present(present) + explicit NmGnbSctp(PR present) : NtsMessage(NtsMessageType::GNB_SCTP), present(present) { } }; -struct NwGnbStatusUpdate : NtsMessage +struct NmGnbStatusUpdate : NtsMessage { static constexpr const int NGAP_IS_UP = 1; @@ -292,17 +292,17 @@ struct NwGnbStatusUpdate : NtsMessage // NGAP_IS_UP bool isNgapUp{}; - explicit NwGnbStatusUpdate(const int what) : NtsMessage(NtsMessageType::GNB_STATUS_UPDATE), what(what) + explicit NmGnbStatusUpdate(const int what) : NtsMessage(NtsMessageType::GNB_STATUS_UPDATE), what(what) { } }; -struct NwGnbCliCommand : NtsMessage +struct NmGnbCliCommand : NtsMessage { std::unique_ptr cmd; InetAddress address; - NwGnbCliCommand(std::unique_ptr cmd, InetAddress address) + NmGnbCliCommand(std::unique_ptr cmd, InetAddress address) : NtsMessage(NtsMessageType::GNB_CLI_COMMAND), cmd(std::move(cmd)), address(address) { } diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 8648c5a33..6f772a29a 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -50,22 +50,22 @@ void RlsControlTask::onLoop() switch (msg->msgType) { case NtsMessageType::GNB_RLS_TO_RLS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbRlsToRls::SIGNAL_DETECTED: + case NmGnbRlsToRls::SIGNAL_DETECTED: handleSignalDetected(w->ueId); break; - case NwGnbRlsToRls::SIGNAL_LOST: + case NmGnbRlsToRls::SIGNAL_LOST: handleSignalLost(w->ueId); break; - case NwGnbRlsToRls::RECEIVE_RLS_MESSAGE: + case NmGnbRlsToRls::RECEIVE_RLS_MESSAGE: handleRlsMessage(w->ueId, *w->msg); break; - case NwGnbRlsToRls::DOWNLINK_DATA: + case NmGnbRlsToRls::DOWNLINK_DATA: handleDownlinkDataDelivery(w->ueId, w->psi, std::move(w->data)); break; - case NwGnbRlsToRls::DOWNLINK_RRC: + case NmGnbRlsToRls::DOWNLINK_RRC: handleDownlinkRrcDelivery(w->ueId, w->pduId, w->rrcChannel, std::move(w->data)); break; default: @@ -102,14 +102,14 @@ void RlsControlTask::onQuit() void RlsControlTask::handleSignalDetected(int ueId) { - auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_DETECTED); + auto *w = new NmGnbRlsToRls(NmGnbRlsToRls::SIGNAL_DETECTED); w->ueId = ueId; m_mainTask->push(w); } void RlsControlTask::handleSignalLost(int ueId) { - auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_LOST); + auto *w = new NmGnbRlsToRls(NmGnbRlsToRls::SIGNAL_LOST); w->ueId = ueId; m_mainTask->push(w); } @@ -130,7 +130,7 @@ void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) if (m.pduType == rls::EPduType::DATA) { - auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::UPLINK_DATA); + auto *w = new NmGnbRlsToRls(NmGnbRlsToRls::UPLINK_DATA); w->ueId = ueId; w->psi = static_cast(m.payload); w->data = std::move(m.pdu); @@ -138,7 +138,7 @@ void RlsControlTask::handleRlsMessage(int ueId, rls::RlsMessage &msg) } else if (m.pduType == rls::EPduType::RRC) { - auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::UPLINK_RRC); + auto *w = new NmGnbRlsToRls(NmGnbRlsToRls::UPLINK_RRC); w->ueId = ueId; w->rrcChannel = static_cast(m.payload); w->data = std::move(m.pdu); @@ -169,7 +169,7 @@ void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::Rr { m_pduMap.clear(); - auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::RADIO_LINK_FAILURE); + auto *w = new NmGnbRlsToRls(NmGnbRlsToRls::RADIO_LINK_FAILURE); w->rlfCause = rls::ERlfCause::PDU_ID_EXISTS; m_mainTask->push(w); return; @@ -179,7 +179,7 @@ void RlsControlTask::handleDownlinkRrcDelivery(int ueId, uint32_t pduId, rrc::Rr { m_pduMap.clear(); - auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::RADIO_LINK_FAILURE); + auto *w = new NmGnbRlsToRls(NmGnbRlsToRls::RADIO_LINK_FAILURE); w->rlfCause = rls::ERlfCause::PDU_ID_FULL; m_mainTask->push(w); return; @@ -234,7 +234,7 @@ void RlsControlTask::onAckControlTimerExpired() if (!transmissionFailures.empty()) { - auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::TRANSMISSION_FAILURE); + auto *w = new NmGnbRlsToRls(NmGnbRlsToRls::TRANSMISSION_FAILURE); w->pduList = std::move(transmissionFailures); m_mainTask->push(w); } diff --git a/src/gnb/rls/task.cpp b/src/gnb/rls/task.cpp index 7c7023a95..6f699b81a 100644 --- a/src/gnb/rls/task.cpp +++ b/src/gnb/rls/task.cpp @@ -42,40 +42,40 @@ void GnbRlsTask::onLoop() switch (msg->msgType) { case NtsMessageType::GNB_RLS_TO_RLS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbRlsToRls::SIGNAL_DETECTED: { - auto *m = new NwGnbRlsToRrc(NwGnbRlsToRrc::SIGNAL_DETECTED); + case NmGnbRlsToRls::SIGNAL_DETECTED: { + auto *m = new NmGnbRlsToRrc(NmGnbRlsToRrc::SIGNAL_DETECTED); m->ueId = w->ueId; m_base->rrcTask->push(m); break; } - case NwGnbRlsToRls::SIGNAL_LOST: { + case NmGnbRlsToRls::SIGNAL_LOST: { m_logger->debug("UE[%d] signal lost", w->ueId); break; } - case NwGnbRlsToRls::UPLINK_DATA: { - auto *m = new NwGnbRlsToGtp(NwGnbRlsToGtp::DATA_PDU_DELIVERY); + case NmGnbRlsToRls::UPLINK_DATA: { + auto *m = new NmGnbRlsToGtp(NmGnbRlsToGtp::DATA_PDU_DELIVERY); m->ueId = w->ueId; m->psi = w->psi; m->pdu = std::move(w->data); m_base->gtpTask->push(m); break; } - case NwGnbRlsToRls::UPLINK_RRC: { - auto *m = new NwGnbRlsToRrc(NwGnbRlsToRrc::UPLINK_RRC); + case NmGnbRlsToRls::UPLINK_RRC: { + auto *m = new NmGnbRlsToRrc(NmGnbRlsToRrc::UPLINK_RRC); m->ueId = w->ueId; m->rrcChannel = w->rrcChannel; m->data = std::move(w->data); m_base->rrcTask->push(m); break; } - case NwGnbRlsToRls::RADIO_LINK_FAILURE: { + case NmGnbRlsToRls::RADIO_LINK_FAILURE: { m_logger->debug("radio link failure [%d]", (int)w->rlfCause); break; } - case NwGnbRlsToRls::TRANSMISSION_FAILURE: { + case NmGnbRlsToRls::TRANSMISSION_FAILURE: { m_logger->debug("transmission failure [%s]", ""); break; } @@ -87,11 +87,11 @@ void GnbRlsTask::onLoop() break; } case NtsMessageType::GNB_RRC_TO_RLS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbRrcToRls::RRC_PDU_DELIVERY: { - auto *m = new NwGnbRlsToRls(NwGnbRlsToRls::DOWNLINK_RRC); + case NmGnbRrcToRls::RRC_PDU_DELIVERY: { + auto *m = new NmGnbRlsToRls(NmGnbRlsToRls::DOWNLINK_RRC); m->ueId = w->ueId; m->rrcChannel = w->channel; m->pduId = 0; @@ -103,11 +103,11 @@ void GnbRlsTask::onLoop() break; } case NtsMessageType::GNB_GTP_TO_RLS: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbGtpToRls::DATA_PDU_DELIVERY: { - auto *m = new NwGnbRlsToRls(NwGnbRlsToRls::DOWNLINK_DATA); + case NmGnbGtpToRls::DATA_PDU_DELIVERY: { + auto *m = new NmGnbRlsToRls(NmGnbRlsToRls::DOWNLINK_DATA); m->ueId = w->ueId; m->psi = w->psi; m->data = std::move(w->pdu); diff --git a/src/gnb/rls/udp_task.cpp b/src/gnb/rls/udp_task.cpp index d47eba495..fbd83933f 100644 --- a/src/gnb/rls/udp_task.cpp +++ b/src/gnb/rls/udp_task.cpp @@ -115,7 +115,7 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptrueId = ueId; m_ctlTask->push(w); } @@ -133,7 +133,7 @@ void RlsUdpTask::receiveRlsPdu(const InetAddress &addr, std::unique_ptrueId = m_stiToUe[msg->sti]; w->msg = std::move(msg); m_ctlTask->push(w); @@ -169,7 +169,7 @@ void RlsUdpTask::heartbeatCycle(int64_t time) for (int ueId : lostUeId) { - auto *w = new NwGnbRlsToRls(NwGnbRlsToRls::SIGNAL_LOST); + auto *w = new NmGnbRlsToRls(NmGnbRlsToRls::SIGNAL_LOST); w->ueId = ueId; m_ctlTask->push(w); } diff --git a/src/gnb/rrc/channel.cpp b/src/gnb/rrc/channel.cpp index 5851efc28..fc89756dc 100644 --- a/src/gnb/rrc/channel.cpp +++ b/src/gnb/rrc/channel.cpp @@ -74,7 +74,7 @@ void GnbRrcTask::sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) return; } - auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); + auto *w = new NmGnbRrcToRls(NmGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = 0; w->channel = rrc::RrcChannel::BCCH_BCH; w->pdu = std::move(pdu); @@ -90,7 +90,7 @@ void GnbRrcTask::sendRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg) return; } - auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); + auto *w = new NmGnbRrcToRls(NmGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = 0; w->channel = rrc::RrcChannel::BCCH_DL_SCH; w->pdu = std::move(pdu); @@ -106,7 +106,7 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg) return; } - auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); + auto *w = new NmGnbRrcToRls(NmGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::DL_CCCH; w->pdu = std::move(pdu); @@ -122,7 +122,7 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg) return; } - auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); + auto *w = new NmGnbRrcToRls(NmGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::DL_DCCH; w->pdu = std::move(pdu); @@ -138,7 +138,7 @@ void GnbRrcTask::sendRrcMessage(ASN_RRC_PCCH_Message *msg) return; } - auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); + auto *w = new NmGnbRrcToRls(NmGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = 0; w->channel = rrc::RrcChannel::PCCH; w->pdu = std::move(pdu); diff --git a/src/gnb/rrc/connection.cpp b/src/gnb/rrc/connection.cpp index cedfa6992..e95c956c4 100644 --- a/src/gnb/rrc/connection.cpp +++ b/src/gnb/rrc/connection.cpp @@ -100,7 +100,7 @@ void GnbRrcTask::receiveRrcSetupComplete(int ueId, const ASN_RRC_RRCSetupComplet auto setupComplete = msg.criticalExtensions.choice.rrcSetupComplete; - auto *w = new NwGnbRrcToNgap(NwGnbRrcToNgap::INITIAL_NAS_DELIVERY); + auto *w = new NmGnbRrcToNgap(NmGnbRrcToNgap::INITIAL_NAS_DELIVERY); w->ueId = ueId; w->pdu = asn::GetOctetString(setupComplete->dedicatedNAS_Message); w->rrcEstablishmentCause = ue->establishmentCause; diff --git a/src/gnb/rrc/handler.cpp b/src/gnb/rrc/handler.cpp index afd913647..04d42e6de 100644 --- a/src/gnb/rrc/handler.cpp +++ b/src/gnb/rrc/handler.cpp @@ -59,7 +59,7 @@ void GnbRrcTask::handleDownlinkNasDelivery(int ueId, const OctetString &nasPdu) void GnbRrcTask::deliverUplinkNas(int ueId, OctetString &&nasPdu) { - auto *w = new NwGnbRrcToNgap(NwGnbRrcToNgap::UPLINK_NAS_DELIVERY); + auto *w = new NmGnbRrcToNgap(NmGnbRrcToNgap::UPLINK_NAS_DELIVERY); w->ueId = ueId; w->pdu = std::move(nasPdu); m_base->ngapTask->push(w); @@ -95,7 +95,7 @@ void GnbRrcTask::releaseConnection(int ueId) void GnbRrcTask::handleRadioLinkFailure(int ueId) { // Notify NGAP task - auto *w = new NwGnbRrcToNgap(NwGnbRrcToNgap::RADIO_LINK_FAILURE); + auto *w = new NmGnbRrcToNgap(NmGnbRrcToNgap::RADIO_LINK_FAILURE); w->ueId = ueId; m_base->ngapTask->push(w); diff --git a/src/gnb/rrc/sap.cpp b/src/gnb/rrc/sap.cpp index 435e226ef..c21b96802 100644 --- a/src/gnb/rrc/sap.cpp +++ b/src/gnb/rrc/sap.cpp @@ -14,16 +14,16 @@ namespace nr::gnb { -void GnbRrcTask::handleRlsSapMessage(NwGnbRlsToRrc &msg) +void GnbRrcTask::handleRlsSapMessage(NmGnbRlsToRrc &msg) { switch (msg.present) { - case NwGnbRlsToRrc::SIGNAL_DETECTED: { + case NmGnbRlsToRrc::SIGNAL_DETECTED: { m_logger->debug("UE[%d] new signal detected", msg.ueId); triggerSysInfoBroadcast(); break; } - case NwGnbRlsToRrc::UPLINK_RRC: { + case NmGnbRlsToRrc::UPLINK_RRC: { handleUplinkRrc(msg.ueId, msg.rrcChannel, msg.data); break; } diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index 7e4d2f11b..91492cd4d 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -46,27 +46,27 @@ void GnbRrcTask::onLoop() switch (msg->msgType) { case NtsMessageType::GNB_RLS_TO_RRC: { - handleRlsSapMessage(*dynamic_cast(msg)); + handleRlsSapMessage(*dynamic_cast(msg)); break; } case NtsMessageType::GNB_NGAP_TO_RRC: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbNgapToRrc::RADIO_POWER_ON: { + case NmGnbNgapToRrc::RADIO_POWER_ON: { m_isBarred = false; triggerSysInfoBroadcast(); break; } - case NwGnbNgapToRrc::NAS_DELIVERY: { + case NmGnbNgapToRrc::NAS_DELIVERY: { handleDownlinkNasDelivery(w->ueId, w->pdu); break; } - case NwGnbNgapToRrc::AN_RELEASE: { + case NmGnbNgapToRrc::AN_RELEASE: { releaseConnection(w->ueId); break; } - case NwGnbNgapToRrc::PAGING: + case NmGnbNgapToRrc::PAGING: handlePaging(w->uePagingTmsi, w->taiListForPaging); break; } diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 5dd91bcfd..e33ca4c11 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -98,7 +98,7 @@ class GnbRrcTask : public NtsTask void triggerSysInfoBroadcast(); /* Service Access Point */ - void handleRlsSapMessage(NwGnbRlsToRrc &msg); + void handleRlsSapMessage(NmGnbRlsToRrc &msg); /* UE Management */ RrcUeContext *createUe(int id); diff --git a/src/gnb/sctp/task.cpp b/src/gnb/sctp/task.cpp index 5cffa5e4e..18b71526b 100644 --- a/src/gnb/sctp/task.cpp +++ b/src/gnb/sctp/task.cpp @@ -55,7 +55,7 @@ class SctpHandler : public sctp::ISctpHandler private: void onAssociationSetup(int associationId, int inStreams, int outStreams) override { - auto *w = new NwGnbSctp(NwGnbSctp::ASSOCIATION_SETUP); + auto *w = new NmGnbSctp(NmGnbSctp::ASSOCIATION_SETUP); w->clientId = clientId; w->associationId = associationId; w->inStreams = inStreams; @@ -65,7 +65,7 @@ class SctpHandler : public sctp::ISctpHandler void onAssociationShutdown() override { - auto *w = new NwGnbSctp(NwGnbSctp::ASSOCIATION_SHUTDOWN); + auto *w = new NmGnbSctp(NmGnbSctp::ASSOCIATION_SHUTDOWN); w->clientId = clientId; sctpTask->push(w); } @@ -75,7 +75,7 @@ class SctpHandler : public sctp::ISctpHandler auto *data = new uint8_t[length]; std::memcpy(data, buffer, length); - auto *w = new NwGnbSctp(NwGnbSctp::RECEIVE_MESSAGE); + auto *w = new NmGnbSctp(NmGnbSctp::RECEIVE_MESSAGE); w->clientId = clientId; w->buffer = UniqueBuffer{data, length}; w->stream = stream; @@ -84,7 +84,7 @@ class SctpHandler : public sctp::ISctpHandler void onUnhandledNotification() override { - auto *w = new NwGnbSctp(NwGnbSctp::UNHANDLED_NOTIFICATION); + auto *w = new NmGnbSctp(NmGnbSctp::UNHANDLED_NOTIFICATION); w->clientId = clientId; sctpTask->push(w); } @@ -119,35 +119,35 @@ void SctpTask::onLoop() switch (msg->msgType) { case NtsMessageType::GNB_SCTP: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbSctp::CONNECTION_REQUEST: { + case NmGnbSctp::CONNECTION_REQUEST: { receiveSctpConnectionSetupRequest(w->clientId, w->localAddress, w->localPort, w->remoteAddress, w->remotePort, w->ppid, w->associatedTask); break; } - case NwGnbSctp::CONNECTION_CLOSE: { + case NmGnbSctp::CONNECTION_CLOSE: { receiveConnectionClose(w->clientId); break; } - case NwGnbSctp::ASSOCIATION_SETUP: { + case NmGnbSctp::ASSOCIATION_SETUP: { receiveAssociationSetup(w->clientId, w->associationId, w->inStreams, w->outStreams); break; } - case NwGnbSctp::ASSOCIATION_SHUTDOWN: { + case NmGnbSctp::ASSOCIATION_SHUTDOWN: { receiveAssociationShutdown(w->clientId); break; } - case NwGnbSctp::RECEIVE_MESSAGE: { + case NmGnbSctp::RECEIVE_MESSAGE: { receiveClientReceive(w->clientId, w->stream, std::move(w->buffer)); break; } - case NwGnbSctp::SEND_MESSAGE: { + case NmGnbSctp::SEND_MESSAGE: { receiveSendMessage(w->clientId, w->stream, std::move(w->buffer)); break; } - case NwGnbSctp::UNHANDLED_NOTIFICATION: { + case NmGnbSctp::UNHANDLED_NOTIFICATION: { receiveUnhandledNotification(w->clientId); break; } @@ -242,7 +242,7 @@ void SctpTask::receiveAssociationSetup(int clientId, int associationId, int inSt } // Notify the relevant task - auto *msg = new NwGnbSctp(NwGnbSctp::ASSOCIATION_SETUP); + auto *msg = new NmGnbSctp(NmGnbSctp::ASSOCIATION_SETUP); msg->clientId = clientId; msg->associationId = associationId; msg->inStreams = inStreams; @@ -262,7 +262,7 @@ void SctpTask::receiveAssociationShutdown(int clientId) } // Notify the relevant task - auto *msg = new NwGnbSctp(NwGnbSctp::ASSOCIATION_SHUTDOWN); + auto *msg = new NmGnbSctp(NmGnbSctp::ASSOCIATION_SHUTDOWN); msg->clientId = clientId; entry->associatedTask->push(msg); } @@ -277,7 +277,7 @@ void SctpTask::receiveClientReceive(int clientId, uint16_t stream, UniqueBuffer } // Notify the relevant task - auto *msg = new NwGnbSctp(NwGnbSctp::RECEIVE_MESSAGE); + auto *msg = new NmGnbSctp(NmGnbSctp::RECEIVE_MESSAGE); msg->clientId = clientId; msg->stream = stream; msg->buffer = std::move(buffer); From 06b090003701b6b143fb941a22814e310f554048 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:46:39 +0300 Subject: [PATCH 202/311] L3 RRC/NAS developments --- src/gnb/rls/ctl_task.cpp | 2 +- src/gnb/rrc/task.cpp | 2 +- src/ue/app/task.cpp | 2 +- src/ue/nas/task.cpp | 2 +- src/ue/rls/ctl_task.cpp | 2 +- src/ue/rrc/task.cpp | 2 +- src/utils/nts.cpp | 2 +- src/utils/nts.hpp | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/gnb/rls/ctl_task.cpp b/src/gnb/rls/ctl_task.cpp index 6f772a29a..a2f72ea04 100644 --- a/src/gnb/rls/ctl_task.cpp +++ b/src/gnb/rls/ctl_task.cpp @@ -75,7 +75,7 @@ void RlsControlTask::onLoop() break; } case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); if (w->timerId == TIMER_ID_ACK_CONTROL) { setTimer(TIMER_ID_ACK_CONTROL, TIMER_PERIOD_ACK_CONTROL); diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index 91492cd4d..e10837c12 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -73,7 +73,7 @@ void GnbRrcTask::onLoop() break; } case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); if (w->timerId == TIMER_ID_SI_BROADCAST) { setTimer(TIMER_ID_SI_BROADCAST, TIMER_PERIOD_SI_BROADCAST); diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index 624af5b57..55b6e1b46 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -109,7 +109,7 @@ void UeAppTask::onLoop() break; } case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); if (w->timerId == SWITCH_OFF_TIMER_ID) { m_logger->info("UE device is switching off"); diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index fbe5cf846..904692ad0 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -98,7 +98,7 @@ void NasTask::onLoop() break; } case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); int timerId = w->timerId; if (timerId == NTS_TIMER_ID_NAS_TIMER_CYCLE) { diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 0140a6bc3..73a8623d4 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -74,7 +74,7 @@ void RlsControlTask::onLoop() break; } case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); if (w->timerId == TIMER_ID_ACK_CONTROL) { setTimer(TIMER_ID_ACK_CONTROL, TIMER_PERIOD_ACK_CONTROL); diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index b0acb06a8..f016dadfc 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -71,7 +71,7 @@ void UeRrcTask::onLoop() break; } case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); + auto *w = dynamic_cast(msg); if (w->timerId == TIMER_ID_MACHINE_CYCLE) { setTimer(TIMER_ID_MACHINE_CYCLE, TIMER_PERIOD_MACHINE_CYCLE); diff --git a/src/utils/nts.cpp b/src/utils/nts.cpp index 98c6c3e23..498379df0 100644 --- a/src/utils/nts.cpp +++ b/src/utils/nts.cpp @@ -16,7 +16,7 @@ static NtsMessage *TimerExpiredMessage(TimerInfo *timerInfo) { - return timerInfo ? new NwTimerExpired(timerInfo->timerId) : nullptr; + return timerInfo ? new NmTimerExpired(timerInfo->timerId) : nullptr; } void TimerBase::setTimerAbsolute(int timerId, int64_t timeMs) diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index c14b4ee44..010bee138 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -72,11 +72,11 @@ struct NtsMessage virtual ~NtsMessage() = default; }; -struct NwTimerExpired : NtsMessage +struct NmTimerExpired : NtsMessage { int timerId; - explicit NwTimerExpired(int timerId) : NtsMessage(NtsMessageType::TIMER_EXPIRED), timerId(timerId) + explicit NmTimerExpired(int timerId) : NtsMessage(NtsMessageType::TIMER_EXPIRED), timerId(timerId) { } }; From fdf86aafd95cecd82ceec43b483787074335b04f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:49:18 +0300 Subject: [PATCH 203/311] L3 RRC/NAS developments --- src/ue/app/task.cpp | 8 ++++---- src/ue/nas/mm/messaging.cpp | 8 ++++---- src/ue/nas/sm/sap.cpp | 8 ++++---- src/ue/nas/task.cpp | 6 +++--- src/ue/rrc/channel.cpp | 30 +++++++++++++++--------------- src/ue/rrc/nas.cpp | 6 +++--- src/ue/tun/task.cpp | 18 +++++++++--------- 7 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index 55b6e1b46..85c45883f 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -59,10 +59,10 @@ void UeAppTask::onLoop() auto *tunTask = m_tunTasks[w->psi]; if (tunTask) { - auto *nw = new NmAppToTun(NmAppToTun::DATA_PDU_DELIVERY); - nw->psi = w->psi; - nw->data = std::move(w->pdu); - tunTask->push(nw); + auto *m = new NmAppToTun(NmAppToTun::DATA_PDU_DELIVERY); + m->psi = w->psi; + m->data = std::move(w->pdu); + tunTask->push(m); } break; } diff --git a/src/ue/nas/mm/messaging.cpp b/src/ue/nas/mm/messaging.cpp index aa6c85400..116091ef2 100644 --- a/src/ue/nas/mm/messaging.cpp +++ b/src/ue/nas/mm/messaging.cpp @@ -166,10 +166,10 @@ void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) } } - auto *nw = new NmUeNasToRrc(NmUeNasToRrc::UPLINK_NAS_DELIVERY); - nw->pduId = 0; - nw->nasPdu = std::move(pdu); - m_base->rrcTask->push(nw); + auto *m = new NmUeNasToRrc(NmUeNasToRrc::UPLINK_NAS_DELIVERY); + m->pduId = 0; + m->nasPdu = std::move(pdu); + m_base->rrcTask->push(m); } void NasMm::receiveNasMessage(const nas::NasMessage &msg) diff --git a/src/ue/nas/sm/sap.cpp b/src/ue/nas/sm/sap.cpp index 53800a6bc..ce5d3c9dd 100644 --- a/src/ue/nas/sm/sap.cpp +++ b/src/ue/nas/sm/sap.cpp @@ -58,10 +58,10 @@ void NasSm::handleUplinkDataRequest(int psi, OctetString &&data) handleUplinkStatusChange(psi, false); } - auto *nw = new NmUeNasToRls(NmUeNasToRls::DATA_PDU_DELIVERY); - nw->psi = psi; - nw->pdu = std::move(data); - m_base->rlsTask->push(nw); + auto *m = new NmUeNasToRls(NmUeNasToRls::DATA_PDU_DELIVERY); + m->psi = psi; + m->pdu = std::move(data); + m_base->rlsTask->push(m); } else { diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index 904692ad0..d6335df88 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -123,9 +123,9 @@ void NasTask::onLoop() void NasTask::performTick() { auto sendExpireMsg = [this](UeTimer *timer) { - auto *nw = new NmUeNasToNas(NmUeNasToNas::NAS_TIMER_EXPIRE); - nw->timer = timer; - push(nw); + auto *m = new NmUeNasToNas(NmUeNasToNas::NAS_TIMER_EXPIRE); + m->timer = timer; + push(m); }; if (timers.t3346.performTick()) diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index 7c272f768..5bd140a83 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -93,11 +93,11 @@ void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH_Message *msg) return; } - auto *nw = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); - nw->cellId = cellId; - nw->channel = rrc::RrcChannel::UL_CCCH; - nw->pdu = std::move(pdu); - m_base->rlsTask->push(nw); + auto *m = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); + m->cellId = cellId; + m->channel = rrc::RrcChannel::UL_CCCH; + m->pdu = std::move(pdu); + m_base->rlsTask->push(m); } void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH1_Message *msg) @@ -109,11 +109,11 @@ void UeRrcTask::sendRrcMessage(int cellId, ASN_RRC_UL_CCCH1_Message *msg) return; } - auto *nw = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); - nw->cellId = cellId; - nw->channel = rrc::RrcChannel::UL_CCCH1; - nw->pdu = std::move(pdu); - m_base->rlsTask->push(nw); + auto *m = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); + m->cellId = cellId; + m->channel = rrc::RrcChannel::UL_CCCH1; + m->pdu = std::move(pdu); + m_base->rlsTask->push(m); } void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) @@ -125,11 +125,11 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) return; } - auto *nw = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); - nw->cellId = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); - nw->channel = rrc::RrcChannel::UL_DCCH; - nw->pdu = std::move(pdu); - m_base->rlsTask->push(nw); + auto *m = new NmUeRrcToRls(NmUeRrcToRls::RRC_PDU_DELIVERY); + m->cellId = m_base->shCtx.currentCell.get([](auto &value) { return value.cellId; }); + m->channel = rrc::RrcChannel::UL_DCCH; + m->pdu = std::move(pdu); + m_base->rlsTask->push(m); } void UeRrcTask::receiveRrcMessage(int cellId, ASN_RRC_BCCH_BCH_Message *msg) diff --git a/src/ue/rrc/nas.cpp b/src/ue/rrc/nas.cpp index bc2ce5178..c5451095a 100644 --- a/src/ue/rrc/nas.cpp +++ b/src/ue/rrc/nas.cpp @@ -64,9 +64,9 @@ void UeRrcTask::receiveDownlinkInformationTransfer(const ASN_RRC_DLInformationTr OctetString nasPdu = asn::GetOctetString(*msg.criticalExtensions.choice.dlInformationTransfer->dedicatedNAS_Message); - auto *nw = new NmUeRrcToNas(NmUeRrcToNas::NAS_DELIVERY); - nw->nasPdu = std::move(nasPdu); - m_base->nasTask->push(nw); + auto *m = new NmUeRrcToNas(NmUeRrcToNas::NAS_DELIVERY); + m->nasPdu = std::move(nasPdu); + m_base->nasTask->push(m); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/tun/task.cpp b/src/ue/tun/task.cpp index 2d8439ab5..a539ebbee 100644 --- a/src/ue/tun/task.cpp +++ b/src/ue/tun/task.cpp @@ -37,9 +37,9 @@ static std::string GetErrorMessage(const std::string &cause) static nr::ue::NmUeTunToApp *NmError(std::string &&error) { - auto *nw = new nr::ue::NmUeTunToApp(nr::ue::NmUeTunToApp::TUN_ERROR); - nw->error = std::move(error); - return nw; + auto *m = new nr::ue::NmUeTunToApp(nr::ue::NmUeTunToApp::TUN_ERROR); + m->error = std::move(error); + return m; } static void ReceiverThread(ReceiverArgs *args) @@ -54,7 +54,7 @@ static void ReceiverThread(ReceiverArgs *args) while (true) { - int n = ::read(fd, buffer, RECEIVER_BUFFER_SIZE); + ssize_t n = ::read(fd, buffer, RECEIVER_BUFFER_SIZE); if (n < 0) { targetTask->push(NmError(GetErrorMessage("TUN device could not read"))); @@ -63,10 +63,10 @@ static void ReceiverThread(ReceiverArgs *args) if (n > 0) { - auto *nw = new nr::ue::NmUeTunToApp(nr::ue::NmUeTunToApp::DATA_PDU_DELIVERY); - nw->psi = psi; - nw->data = OctetString::FromArray(buffer, static_cast(n)); - targetTask->push(nw); + auto *m = new nr::ue::NmUeTunToApp(nr::ue::NmUeTunToApp::DATA_PDU_DELIVERY); + m->psi = psi; + m->data = OctetString::FromArray(buffer, static_cast(n)); + targetTask->push(m); } } } @@ -104,7 +104,7 @@ void TunTask::onLoop() { case NtsMessageType::UE_APP_TO_TUN: { auto *w = dynamic_cast(msg); - int res = ::write(m_fd, w->data.data(), w->data.length()); + ssize_t res = ::write(m_fd, w->data.data(), w->data.length()); if (res < 0) push(NmError(GetErrorMessage("TUN device could not write"))); else if (res != w->data.length()) From 5dc2ae1a76a5d1a9e20e85daabda9ab59f8fb620 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 12:56:06 +0300 Subject: [PATCH 204/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 79a6d3414..58d535528 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -129,6 +129,7 @@ void NasMm::performPlmnSelection() { if (isInNonAllowedArea()) { + // TODO: check this later switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); } else if (cellCategory == ECellCategory::SUITABLE_CELL) From 9b36a7da58fd980994b485a911e28b1cf4964eec Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 13:12:00 +0300 Subject: [PATCH 205/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 10 +++++----- src/ue/nas/mm/base.cpp | 8 ++++---- src/ue/nas/mm/register.cpp | 4 ++-- src/ue/nas/mm/service.cpp | 2 +- src/ue/nas/storage.cpp | 4 +++- src/ue/nas/storage.hpp | 2 ++ src/ue/nas/usim/usim.cpp | 2 -- src/ue/nas/usim/usim.hpp | 3 --- src/ue/types.hpp | 2 +- 9 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 70824bb5a..51bb23826 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -10,8 +10,8 @@ #include #include -#include #include +#include #include #include #include @@ -106,8 +106,8 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) { case app::UeCliCommand::STATUS: { // TODO - //std::vector pduSessions{}; - //for (auto &pduSession : m_base->appTask->m_pduSessions) + // std::vector pduSessions{}; + // for (auto &pduSession : m_base->appTask->m_pduSessions) // if (pduSession.has_value()) // pduSessions.push_back(ToJson(*pduSession)); @@ -115,12 +115,12 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"cm-state", ToJson(m_base->nasTask->mm->m_cmState)}, {"rm-state", ToJson(m_base->nasTask->mm->m_rmState)}, {"mm-state", ToJson(m_base->nasTask->mm->m_mmSubState)}, - {"5u-state", ToJson(m_base->nasTask->mm->m_usim->m_uState)}, + {"5u-state", ToJson(m_base->nasTask->mm->m_storage->uState->get())}, {"sim-inserted", m_base->nasTask->mm->m_usim->isValid()}, {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, {"stored-guti", ToJson(m_base->nasTask->mm->m_storage->storedGuti->get())}, {"has-emergency", ::ToJson(m_base->nasTask->mm->hasEmergency())}, - //TODO {"pdu-sessions", Json::Arr(std::move(pduSessions))}, + // TODO {"pdu-sessions", Json::Arr(std::move(pduSessions))}, }); sendResult(msg.address, json.dumpYaml()); break; diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 676eb459e..ab99c2c62 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -306,15 +306,15 @@ void NasMm::switchCmState(ECmState state) void NasMm::switchUState(E5UState state) { - E5UState oldState = m_usim->m_uState; - m_usim->m_uState = state; + E5UState oldState = m_storage->uState->get(); + m_storage->uState->set(state); - onSwitchUState(oldState, m_usim->m_uState); + onSwitchUState(oldState, state); if (m_base->nodeListener) { m_base->nodeListener->onSwitch(app::NodeType::UE, m_base->config->getNodeName(), app::StateType::U5, - ToJson(oldState).str(), ToJson(m_usim->m_uState).str()); + ToJson(oldState).str(), ToJson(state).str()); } if (state != oldState) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 0dc57db85..00d8f5157 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -907,7 +907,7 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) // "If the TAI of the current serving cell is not included in the TAI list or the 5GS update status is different // to 5U1 UPDATED" - if (!includedInTaiList || m_usim->m_uState != E5UState::U1_UPDATED) + if (!includedInTaiList || m_storage->uState->get() != E5UState::U1_UPDATED) { // "The UE shall start timer T3511, shall set the 5GS update status to 5U2 NOT UPDATED and change to state // 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE. When timer T3511 expires and the registration update @@ -920,7 +920,7 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) // "If the TAI of the current serving cell is included in the TAI list, the 5GS update status is equal to 5U1 // UPDATED, and the UE is not performing the registration procedure after an inter-system change from S1 mode to // N1 mode" - if (includedInTaiList && m_usim->m_uState == E5UState::U1_UPDATED) + if (includedInTaiList && m_storage->uState->get() == E5UState::U1_UPDATED) { // "The UE shall keep the 5GS update status to 5U1 UPDATED and enter state 5GMM-REGISTERED.NORMAL-SERVICE." switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index af6191917..0a88399dc 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -29,7 +29,7 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) m_logger->debug("Service Request canceled, already in 5GMM-SERVICE-REQUEST-INITIATED"); return; } - if (m_usim->m_uState != E5UState::U1_UPDATED) + if (m_storage->uState->get() != E5UState::U1_UPDATED) { m_logger->err("Service Request canceled, UE not in 5U1 UPDATED state"); return; diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 118deb456..5c9aeebc8 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -22,7 +22,9 @@ namespace nr::ue MmStorage::MmStorage(TaskBase *base) : m_base{base} { - storedSuci = std::make_unique>(0, std::nullopt); + uState = std::make_unique>(0, std::nullopt); + + storedSuci = std::make_unique>(0, std::nullopt); storedGuti = std::make_unique>(0, std::nullopt); diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 626fd644a..76a5a9fe4 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -19,6 +19,8 @@ class MmStorage TaskBase *m_base; public: + std::unique_ptr> uState; + std::unique_ptr> storedSuci; std::unique_ptr> storedGuti; diff --git a/src/ue/nas/usim/usim.cpp b/src/ue/nas/usim/usim.cpp index 26fb7af5e..ccd8839a0 100644 --- a/src/ue/nas/usim/usim.cpp +++ b/src/ue/nas/usim/usim.cpp @@ -15,8 +15,6 @@ void ue::Usim::initialize(bool hasSupi, const UeConfig::Initials &initials) { m_isValid = hasSupi; - m_uState = E5UState::U1_UPDATED; - m_defConfiguredNssai = initials.defaultConfiguredNssai; m_configuredNssai = initials.configuredNssai; diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index d2c253e3c..5eeef458a 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -27,9 +27,6 @@ class Usim bool m_isValid{}; public: - // State related - E5UState m_uState{}; - // Security related std::unique_ptr m_currentNsCtx{}; std::unique_ptr m_nonCurrentNsCtx{}; diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 19f5680a7..d93a4202a 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -237,7 +237,7 @@ enum class ECmState enum class E5UState { - U1_UPDATED, + U1_UPDATED = 0, U2_NOT_UPDATED, U3_ROAMING_NOT_ALLOWED }; From 04899872a79cab8be1c874da6522cd53802b057f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 13:58:05 +0300 Subject: [PATCH 206/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 117 +++++++++++++++++++++++----------------- src/ue/nas/mm/radio.cpp | 8 --- 2 files changed, 67 insertions(+), 58 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index ab99c2c62..7feb0dddd 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -86,43 +86,83 @@ void NasMm::triggerMmCycle() void NasMm::performMmCycle() { + /* Do nothing in case of MM-NULL */ if (m_mmState == EMmState::MM_NULL) return; - if (m_sm->anyUplinkDataPending() && missingSessionBearer()) - serviceNeededForUplinkData(); + auto currentCell = m_base->shCtx.currentCell.get(); + Tai currentTai = Tai{currentCell.plmn, currentCell.tac}; - if (m_mmState == EMmState::MM_DEREGISTERED) + /* Perform substate selection in case of primary substate */ + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PS) { - if (switchToECallInactivityIfNeeded()) - return; - - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PS) + if (m_cmState == ECmState::CM_IDLE) + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + else { - if (m_cmState == ECmState::CM_IDLE) - switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - else + if (currentCell.hasValue()) { - auto cell = m_base->shCtx.currentCell.get(); - if (cell.hasValue()) - { - if (!m_usim->isValid()) - switchMmState(EMmSubState::MM_DEREGISTERED_NO_SUPI); - else if (cell.category == ECellCategory::SUITABLE_CELL) - switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); - else if (cell.category == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - } + if (!m_usim->isValid()) + switchMmState(EMmSubState::MM_DEREGISTERED_NO_SUPI); + else if (currentCell.category == ECellCategory::SUITABLE_CELL) + switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + else if (currentCell.category == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); else - { switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - } } - return; + else + { + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + } + } + return; + } + + if (m_mmSubState == EMmSubState::MM_REGISTERED_PS) + { + if (m_cmState == ECmState::CM_IDLE) + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); + else + { + auto cell = m_base->shCtx.currentCell.get(); + if (cell.hasValue()) + { + if (cell.category == ECellCategory::SUITABLE_CELL) + switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + else if (cell.category == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + else + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); + } + else + { + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); + } } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) + return; + } + + /* Check for uplink data pending */ + if (m_sm->anyUplinkDataPending() && missingSessionBearer()) + serviceNeededForUplinkData(); + + /* Process TAI changes if any */ + if (!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) + { + if (m_rmState == ERmState::RM_REGISTERED) + sendMobilityRegistration(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); + } + else + m_storage->lastVisitedRegisteredTai->set(currentTai); + + /* Other operations */ + if (m_mmState == EMmState::MM_DEREGISTERED) + { + if (switchToECallInactivityIfNeeded()) + return; + + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) { if (!m_timers->t3346.isRunning()) sendInitialRegistration(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); @@ -166,30 +206,7 @@ void NasMm::performMmCycle() if (startECallInactivityIfNeeded()) return; - if (m_mmSubState == EMmSubState::MM_REGISTERED_PS) - { - if (m_cmState == ECmState::CM_IDLE) - switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); - else - { - auto cell = m_base->shCtx.currentCell.get(); - if (cell.hasValue()) - { - if (cell.category == ECellCategory::SUITABLE_CELL) - switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - else if (cell.category == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); - } - else - { - switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); - } - } - return; - } - else if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) + if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) { return; } diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 58d535528..d61b30da2 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -194,11 +194,6 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); else switchMmState(EMmSubState::MM_REGISTERED_PS); - - if (!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) - sendMobilityRegistration(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); - else - m_storage->lastVisitedRegisteredTai->set(currentTai); } } else if (m_mmState == EMmState::MM_DEREGISTERED) @@ -219,9 +214,6 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); else switchMmState(EMmSubState::MM_DEREGISTERED_PS); - - if (nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) - m_storage->lastVisitedRegisteredTai->set(currentTai); } } else if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED || From e7ef5f628104b8baa60c9bf0af29377fce82a7ea Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:04:25 +0300 Subject: [PATCH 207/311] L3 RRC/NAS developments --- src/ue/nas/mm/ecall.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index 6ba2b6053..3473adcb5 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -79,9 +79,6 @@ bool NasMm::switchToECallInactivityIfNeeded() if (!m_usim->m_isECallOnly) return false; - if (m_mmState != EMmState::MM_DEREGISTERED) - return false; - if (m_cmState != ECmState::CM_IDLE) return false; if (!((!m_timers->t3444.isRunning() && m_timers->t3445.isRunning()) || From 1df2104570827f9836b6aa46a2957d550c3846fa Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:08:12 +0300 Subject: [PATCH 208/311] L3 RRC/NAS developments --- src/ue/nas/mm/timer.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index b022ba53b..41d157387 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -30,6 +30,11 @@ void NasMm::onTimerExpire(UeTimer &timer) logExpired(); sendInitialRegistration(EInitialRegCause::T3346_EXPIRY); } + else if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) + { + logExpired(); + sendMobilityRegistration(ERegUpdateCause::UNSPECIFIED); + } break; } case 3502: { @@ -38,6 +43,9 @@ void NasMm::onTimerExpire(UeTimer &timer) { logExpired(); resetRegAttemptCounter(); + + if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) + sendMobilityRegistration(ERegUpdateCause::UNSPECIFIED); } break; } @@ -74,7 +82,11 @@ void NasMm::onTimerExpire(UeTimer &timer) break; } case 3511: { - // TODO + if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) + { + logExpired(); + sendMobilityRegistration(ERegUpdateCause::UNSPECIFIED); + } break; } case 3512: { From a366c2f33647e9f36fcb4242e8d781d5b4d17d6d Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:11:41 +0300 Subject: [PATCH 209/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index d61b30da2..5c2dd57e1 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -164,18 +164,6 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) if (currentCell.hasValue() && !m_storage->equivalentPlmnList->contains(currentCell.plmn)) m_timers->t3346.stop(); - if (currentCell.hasValue() && prevTai != currentTai) - { - // "Additionally, the registration attempt counter shall be reset when the UE is in substate - // 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION or 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE, and a new - // tracking area is entered" - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION || - m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) - { - resetRegAttemptCounter(); - } - } - if (m_mmState == EMmState::MM_REGISTERED) { if (currentCell.cellId == 0) @@ -223,6 +211,18 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) m_logger->err("Active cell change in [CM-IDLE] state while MM specific procedure is ongoing"); switchMmState(EMmSubState::MM_DEREGISTERED_PS); } + + if (currentCell.hasValue() && prevTai != currentTai) + { + // "Additionally, the registration attempt counter shall be reset when the UE is in substate + // 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION or 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE, and a new + // tracking area is entered" + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION || + m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) + { + resetRegAttemptCounter(); + } + } } void NasMm::handleRrcConnectionSetup() From 0d4d87a8bdc8a82ec1ab4b44beaa21d8e809fd3c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:16:13 +0300 Subject: [PATCH 210/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 5c2dd57e1..8aeffc4aa 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -164,6 +164,28 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) if (currentCell.hasValue() && !m_storage->equivalentPlmnList->contains(currentCell.plmn)) m_timers->t3346.stop(); + if (currentCell.hasValue() && prevTai != currentTai) + { + // "Additionally, the registration attempt counter shall be reset when the UE is in substate + // 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION or 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE, and a new + // tracking area is entered" + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION || + m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) + { + resetRegAttemptCounter(); + } + } + + if (currentCell.hasValue() && prevTai.plmn != currentTai.plmn) + { + if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE && m_timers->t3346.isRunning() && + !m_storage->equivalentPlmnList->contains(currentTai.plmn) && + currentCell.category == ECellCategory::SUITABLE_CELL) + { + sendMobilityRegistration(ERegUpdateCause::UNSPECIFIED); + } + } + if (m_mmState == EMmState::MM_REGISTERED) { if (currentCell.cellId == 0) @@ -211,18 +233,6 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) m_logger->err("Active cell change in [CM-IDLE] state while MM specific procedure is ongoing"); switchMmState(EMmSubState::MM_DEREGISTERED_PS); } - - if (currentCell.hasValue() && prevTai != currentTai) - { - // "Additionally, the registration attempt counter shall be reset when the UE is in substate - // 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION or 5GMM-REGISTERED.ATTEMPTING-REGISTRATION-UPDATE, and a new - // tracking area is entered" - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION || - m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) - { - resetRegAttemptCounter(); - } - } } void NasMm::handleRrcConnectionSetup() From ccc1b1d78fe6f2696ab8c309b408c109a3c3874d Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:18:34 +0300 Subject: [PATCH 211/311] L3 RRC/NAS developments --- src/ue/nas/mm/mm.hpp | 5 ++++- src/ue/nas/mm/proc.cpp | 27 +++++++++++++++++++++++++++ src/ue/nas/mm/radio.cpp | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/ue/nas/mm/proc.cpp diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 5f60059d3..139a8f217 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -161,7 +161,7 @@ class NasMm private: /* Radio */ void performPlmnSelection(); void localReleaseConnection(); - void handleActiveCellChange(const Tai& prevTai); + void handleActiveCellChange(const Tai &prevTai); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); void handleRrcEstablishmentFailure(); @@ -183,6 +183,9 @@ class NasMm private: /* Timer */ void onTimerExpire(UeTimer &timer); + private: /* Procedure Control */ + void mobilityUpdatingRequired(ERegUpdateCause cause); + private: /* Service Access Point */ void handleRrcEvent(const NmUeRrcToNas &msg); void handleNasEvent(const NmUeNasToNas &msg); diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp new file mode 100644 index 000000000..fedd84187 --- /dev/null +++ b/src/ue/nas/mm/proc.cpp @@ -0,0 +1,27 @@ +// +// This file is a part of UERANSIM open source project. +// Copyright (c) 2021 ALİ GÜNGÖR. +// +// The software and all associated files are licensed under GPL-3.0 +// and subject to the terms and conditions defined in LICENSE file. +// + +#include "mm.hpp" + +#include + +#include +#include +#include +#include +#include + +namespace nr::ue +{ + +void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) +{ + // TODO +} + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 8aeffc4aa..eeb843c24 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -182,7 +182,7 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) !m_storage->equivalentPlmnList->contains(currentTai.plmn) && currentCell.category == ECellCategory::SUITABLE_CELL) { - sendMobilityRegistration(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); } } From fab5b46eb4eb9e6b0127ebf99eed4ba943c47440 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:21:19 +0300 Subject: [PATCH 212/311] L3 RRC/NAS developments --- src/ue/nas/mm/timer.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index 41d157387..3e2df1a53 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -33,7 +33,7 @@ void NasMm::onTimerExpire(UeTimer &timer) else if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) { logExpired(); - sendMobilityRegistration(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); } break; } @@ -45,7 +45,7 @@ void NasMm::onTimerExpire(UeTimer &timer) resetRegAttemptCounter(); if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) - sendMobilityRegistration(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); } break; } @@ -85,7 +85,7 @@ void NasMm::onTimerExpire(UeTimer &timer) if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) { logExpired(); - sendMobilityRegistration(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); } break; } @@ -97,15 +97,7 @@ void NasMm::onTimerExpire(UeTimer &timer) if (m_registeredForEmergency) performLocalDeregistration(); else - { - if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) - sendMobilityRegistration(ERegUpdateCause::T3512_EXPIRY); - else - { - // TODO: "the periodic registration update procedure is delayed until the UE returns to - // 5GMM-REGISTERED.NORMAL-SERVICE over 3GPP access." See 5.3.7 - } - } + mobilityUpdatingRequired(ERegUpdateCause::T3512_EXPIRY); } break; } From aee8e2b6b7ad02cb45b02794b346aaaf3622533c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:24:37 +0300 Subject: [PATCH 213/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index eeb843c24..43ca52df4 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -174,10 +174,23 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) { resetRegAttemptCounter(); } + + // "Shall initiate a registration procedure for mobility and periodic registration update when the tracking area + // of the serving cell has changed, if timer T3346 is not running, the PLMN identity of the new cell is not in + // one of the forbidden PLMN lists and the tracking area is not in one of the lists of 5GS forbidden tracking + // area" + if (!m_timers->t3346.isRunning() && currentCell.category == ECellCategory::SUITABLE_CELL) + { + mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); + } } if (currentCell.hasValue() && prevTai.plmn != currentTai.plmn) { + // "Shall initiate a registration procedure for mobility and periodic registration update when entering a new + // PLMN, if timer T3346 is running and the new PLMN is not equivalent to the PLMN where the UE started timer + // T3346, the PLMN identity of the new cell is not in the forbidden PLMN lists, and the tracking area is not in + // one of the lists of 5GS forbidden tracking areas" if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE && m_timers->t3346.isRunning() && !m_storage->equivalentPlmnList->contains(currentTai.plmn) && currentCell.category == ECellCategory::SUITABLE_CELL) From 22aca1d67c3feb001b50c3c74234977435df62de Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:30:33 +0300 Subject: [PATCH 214/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 4 ++-- src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/radio.cpp | 2 +- src/ue/nas/mm/service.cpp | 12 +++++++----- src/ue/nas/mm/timer.cpp | 2 +- src/ue/nas/mm/transport.cpp | 2 +- src/ue/nas/sm/timer.cpp | 2 +- 7 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 7feb0dddd..7d8f9bc21 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -151,7 +151,7 @@ void NasMm::performMmCycle() if (!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) { if (m_rmState == ERmState::RM_REGISTERED) - sendMobilityRegistration(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); + mobilityUpdatingRequired(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); } else m_storage->lastVisitedRegisteredTai->set(currentTai); @@ -165,7 +165,7 @@ void NasMm::performMmCycle() if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) { if (!m_timers->t3346.isRunning()) - sendInitialRegistration(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); + initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); return; } else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 139a8f217..6e883a1ca 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -184,6 +184,7 @@ class NasMm void onTimerExpire(UeTimer &timer); private: /* Procedure Control */ + void initialRegistrationRequired(EInitialRegCause cause); void mobilityUpdatingRequired(ERegUpdateCause cause); private: /* Service Access Point */ diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 43ca52df4..80f7a017b 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -319,7 +319,7 @@ void NasMm::handlePaging(const std::vector &tmsiIds) m_logger->debug("Responding to received Paging"); if (m_cmState == ECmState::CM_CONNECTED) - sendMobilityRegistration(ERegUpdateCause::PAGING_OR_NOTIFICATION); + mobilityUpdatingRequired(ERegUpdateCause::PAGING_OR_NOTIFICATION); else sendServiceRequest(EServiceReqCause::IDLE_PAGING); } diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 0a88399dc..1547b9002 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -398,13 +398,13 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK) { if (m_lastServiceReqCause != EServiceReqCause::EMERGENCY_FALLBACK) - sendInitialRegistration(EInitialRegCause::DUE_TO_SERVICE_REJECT); + initialRegistrationRequired(EInitialRegCause::DUE_TO_SERVICE_REJECT); } if (cause == nas::EMmCause::IMPLICITY_DEREGISTERED) { if (!hasEmergency()) - sendInitialRegistration(EInitialRegCause::DUE_TO_SERVICE_REJECT); + initialRegistrationRequired(EInitialRegCause::DUE_TO_SERVICE_REJECT); } if (cause == nas::EMmCause::CONGESTION) @@ -436,7 +436,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); if (m_lastServiceRequest->serviceType.serviceType != nas::EServiceType::ELEVATED_SIGNALLING) - sendMobilityRegistration(ERegUpdateCause::RESTRICTED_SERVICE_AREA); + mobilityUpdatingRequired(ERegUpdateCause::RESTRICTED_SERVICE_AREA); } if (hasEmergency()) @@ -461,15 +461,17 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) void NasMm::serviceNeededForUplinkData() { - static constexpr const int64_t SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD = 1000; + static constexpr const int64_t SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD = 1000; - auto currentTime = utils::CurrentTimeMillis(); + auto currentTime = utils::CurrentTimeMillis(); if (currentTime - m_lastTimeServiceReqNeededIndForData > SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD) { sendServiceRequest(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); m_lastTimeServiceReqNeededIndForData = currentTime; + + triggerMmCycle(); } } diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index 3e2df1a53..b1191b94f 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -28,7 +28,7 @@ void NasMm::onTimerExpire(UeTimer &timer) if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) { logExpired(); - sendInitialRegistration(EInitialRegCause::T3346_EXPIRY); + initialRegistrationRequired(EInitialRegCause::T3346_EXPIRY); } else if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) { diff --git a/src/ue/nas/mm/transport.cpp b/src/ue/nas/mm/transport.cpp index e75442ca8..6d2eb7218 100644 --- a/src/ue/nas/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -83,7 +83,7 @@ void NasMm::receiveDlNasTransport(const nas::DlNasTransport &msg) if (m_rmState == ERmState::RM_REGISTERED) { switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); - sendMobilityRegistration(ERegUpdateCause::RESTRICTED_SERVICE_AREA); + mobilityUpdatingRequired(ERegUpdateCause::RESTRICTED_SERVICE_AREA); } m_sm->receiveForwardingFailure(smMessage, msg.mmCause->value, std::nullopt); break; diff --git a/src/ue/nas/sm/timer.cpp b/src/ue/nas/sm/timer.cpp index 80b2dcc90..b1ad0a901 100644 --- a/src/ue/nas/sm/timer.cpp +++ b/src/ue/nas/sm/timer.cpp @@ -79,7 +79,7 @@ void NasSm::onTransactionTimerExpire(int pti) { m_logger->err("PDU Session Release procedure failure, no response from the network after 5 attempts"); abortProcedureByPti(pti); - m_mm->sendMobilityRegistration(ERegUpdateCause::PS_STATUS_INFORM); + m_mm->mobilityUpdatingRequired(ERegUpdateCause::PS_STATUS_INFORM); } break; } From affae9df6e014a1e066c33739bf085837a8c374c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:34:19 +0300 Subject: [PATCH 215/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 12 ++++++++++++ src/ue/rrc/cells.cpp | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index fedd84187..7155c350f 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -19,9 +19,21 @@ namespace nr::ue { +void NasMm::initialRegistrationRequired(EInitialRegCause cause) +{ + // TODO + + triggerMmCycle(); +} + void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) { // TODO + + // TODO: "the periodic registration update procedure is delayed until the UE returns to + // 5GMM-REGISTERED.NORMAL-SERVICE over 3GPP access." See 5.3.7 + + triggerMmCycle(); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/cells.cpp b/src/ue/rrc/cells.cpp index 825519891..46bb0c32a 100644 --- a/src/ue/rrc/cells.cpp +++ b/src/ue/rrc/cells.cpp @@ -49,9 +49,11 @@ void UeRrcTask::notifyCellLost(int cellId) return; bool isActiveCell = false; - m_base->shCtx.currentCell.mutate([&isActiveCell, cellId](auto &value) { + ActiveCellInfo lastActiveCell; + m_base->shCtx.currentCell.mutate([&isActiveCell, &lastActiveCell, cellId](auto &value) { if (value.cellId == cellId) { + lastActiveCell = value; value = {}; isActiveCell = true; } @@ -62,8 +64,17 @@ void UeRrcTask::notifyCellLost(int cellId) m_logger->debug("Signal lost for cell[%d], total [%d] cells in coverage", cellId, static_cast(m_cellDesc.size())); - if (isActiveCell && m_state != ERrcState::RRC_IDLE) - declareRadioLinkFailure(rls::ERlfCause::SIGNAL_LOST_TO_CONNECTED_CELL); + if (isActiveCell) + { + if (m_state != ERrcState::RRC_IDLE) + declareRadioLinkFailure(rls::ERlfCause::SIGNAL_LOST_TO_CONNECTED_CELL); + else + { + auto w2 = new NmUeRrcToNas(NmUeRrcToNas::ACTIVE_CELL_CHANGED); + w2->previousTai = Tai{lastActiveCell.plmn, lastActiveCell.tac}; + m_base->nasTask->push(w2); + } + } updateAvailablePlmns(); } From d34802561a3d483aac881b26b516ce2e36e18075 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:40:06 +0300 Subject: [PATCH 216/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 +- src/ue/nas/mm/messaging.cpp | 2 +- src/ue/nas/mm/mm.hpp | 4 +++- src/ue/nas/mm/proc.cpp | 27 +++++++++++++++++++++++++++ src/ue/nas/mm/radio.cpp | 2 +- src/ue/nas/mm/service.cpp | 16 ---------------- 6 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 7d8f9bc21..8fb3b9a39 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -145,7 +145,7 @@ void NasMm::performMmCycle() /* Check for uplink data pending */ if (m_sm->anyUplinkDataPending() && missingSessionBearer()) - serviceNeededForUplinkData(); + serviceRequestRequiredForData(); /* Process TAI changes if any */ if (!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) diff --git a/src/ue/nas/mm/messaging.cpp b/src/ue/nas/mm/messaging.cpp index 116091ef2..bd84e0b26 100644 --- a/src/ue/nas/mm/messaging.cpp +++ b/src/ue/nas/mm/messaging.cpp @@ -109,7 +109,7 @@ void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) { m_logger->warn("NAS Transport aborted, Service Request is needed for uplink signalling"); if (m_mmState != EMmState::MM_SERVICE_REQUEST_INITIATED) - sendServiceRequest(EServiceReqCause::IDLE_UPLINK_SIGNAL_PENDING); + serviceRequestRequiredForSignalling(); return; } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 6e883a1ca..9028e5ded 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -152,7 +152,6 @@ class NasMm void sendServiceRequest(EServiceReqCause reqCause); void receiveServiceAccept(const nas::ServiceAccept &msg); void receiveServiceReject(const nas::ServiceReject &msg); - void serviceNeededForUplinkData(); private: /* Network Slicing */ NetworkSlice makeRequestedNssai(bool &isDefaultNssai) const; @@ -186,6 +185,9 @@ class NasMm private: /* Procedure Control */ void initialRegistrationRequired(EInitialRegCause cause); void mobilityUpdatingRequired(ERegUpdateCause cause); + void serviceRequestRequiredForData(); + void serviceRequestRequiredForSignalling(); + void serviceRequestRequired(EServiceReqCause cause); private: /* Service Access Point */ void handleRrcEvent(const NmUeRrcToNas &msg); diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index 7155c350f..16b248f82 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -36,4 +36,31 @@ void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) triggerMmCycle(); } +void NasMm::serviceRequestRequiredForSignalling() +{ +} + +void NasMm::serviceRequestRequiredForData() +{ + static constexpr const int64_t SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD = 1000; + + auto currentTime = utils::CurrentTimeMillis(); + if (currentTime - m_lastTimeServiceReqNeededIndForData > SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD) + { + serviceRequestRequired(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING + : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); + + m_lastTimeServiceReqNeededIndForData = currentTime; + + triggerMmCycle(); + } +} + +void NasMm::serviceRequestRequired(EServiceReqCause cause) +{ + // TODO + + triggerMmCycle(); +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 80f7a017b..18fa9499e 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -321,7 +321,7 @@ void NasMm::handlePaging(const std::vector &tmsiIds) if (m_cmState == ECmState::CM_CONNECTED) mobilityUpdatingRequired(ERegUpdateCause::PAGING_OR_NOTIFICATION); else - sendServiceRequest(EServiceReqCause::IDLE_PAGING); + serviceRequestRequired(EServiceReqCause::IDLE_PAGING); } void NasMm::updateProvidedGuti(bool provide) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 1547b9002..8db20cc51 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -459,20 +459,4 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) } } -void NasMm::serviceNeededForUplinkData() -{ - static constexpr const int64_t SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD = 1000; - - auto currentTime = utils::CurrentTimeMillis(); - if (currentTime - m_lastTimeServiceReqNeededIndForData > SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD) - { - sendServiceRequest(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING - : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); - - m_lastTimeServiceReqNeededIndForData = currentTime; - - triggerMmCycle(); - } -} - } // namespace nr::ue From 55fd679c35b72060a0dfbe6c9ac905d439329b49 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:42:01 +0300 Subject: [PATCH 217/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 2 +- src/ue/nas/mm/ecall.cpp | 2 +- src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/proc.cpp | 7 +++++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 51bb23826..ee8aef2f7 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -134,7 +134,7 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) break; } case app::UeCliCommand::DE_REGISTER: { - m_base->nasTask->mm->sendDeregistration(msg.cmd->deregCause); + m_base->nasTask->mm->deregistrationRequired(msg.cmd->deregCause); if (msg.cmd->deregCause != EDeregCause::SWITCH_OFF) sendResult(msg.address, "De-registration procedure triggered"); diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index 3473adcb5..8154101d3 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -67,7 +67,7 @@ bool NasMm::startECallInactivityIfNeeded() // And perform de-registration. // NOTE: The items c) and d) is performed after de-registration by the other function, therefore we are just // performing de-registration for now. - sendDeregistration(EDeregCause::ECALL_INACTIVITY); + deregistrationRequired(EDeregCause::ECALL_INACTIVITY); return true; } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 9028e5ded..87bf6cd85 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -188,6 +188,7 @@ class NasMm void serviceRequestRequiredForData(); void serviceRequestRequiredForSignalling(); void serviceRequestRequired(EServiceReqCause cause); + void deregistrationRequired(EDeregCause cause); private: /* Service Access Point */ void handleRrcEvent(const NmUeRrcToNas &msg); diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index 16b248f82..f4351d1ce 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -63,4 +63,11 @@ void NasMm::serviceRequestRequired(EServiceReqCause cause) triggerMmCycle(); } +void NasMm::deregistrationRequired(EDeregCause cause) +{ + // TODO + + triggerMmCycle(); +} + } // namespace nr::ue \ No newline at end of file From 152a128cda2834b82ce18b0900f7c3c84464d60c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:43:51 +0300 Subject: [PATCH 218/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index f4351d1ce..baa546fdf 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -38,6 +38,7 @@ void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) void NasMm::serviceRequestRequiredForSignalling() { + // TODO } void NasMm::serviceRequestRequiredForData() From 8975bd855ffaf2c46584b2f39f877273bef70c5f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:52:09 +0300 Subject: [PATCH 219/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 52 +++++++++++++++++------------------------ src/ue/nas/mm/radio.cpp | 36 ++-------------------------- 2 files changed, 23 insertions(+), 65 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 8fb3b9a39..9941b6a80 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -96,49 +96,39 @@ void NasMm::performMmCycle() /* Perform substate selection in case of primary substate */ if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PS) { - if (m_cmState == ECmState::CM_IDLE) - switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - else + if (currentCell.hasValue()) { - if (currentCell.hasValue()) - { - if (!m_usim->isValid()) - switchMmState(EMmSubState::MM_DEREGISTERED_NO_SUPI); - else if (currentCell.category == ECellCategory::SUITABLE_CELL) - switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); - else if (currentCell.category == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - } + if (!m_usim->isValid()) + switchMmState(EMmSubState::MM_DEREGISTERED_NO_SUPI); + else if (currentCell.category == ECellCategory::SUITABLE_CELL) + switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + else if (currentCell.category == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); else - { switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - } + } + else + { + switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); } return; } if (m_mmSubState == EMmSubState::MM_REGISTERED_PS) { - if (m_cmState == ECmState::CM_IDLE) - switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); - else + auto cell = m_base->shCtx.currentCell.get(); + if (cell.hasValue()) { - auto cell = m_base->shCtx.currentCell.get(); - if (cell.hasValue()) - { - if (cell.category == ECellCategory::SUITABLE_CELL) - switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - else if (cell.category == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); - } + if (cell.category == ECellCategory::SUITABLE_CELL) + switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); + else if (cell.category == ECellCategory::ACCEPTABLE_CELL) + switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); else - { switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); - } + } + else + { + switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); } return; } diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 18fa9499e..9b30f8492 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -201,43 +201,11 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) if (m_mmState == EMmState::MM_REGISTERED) { - if (currentCell.cellId == 0) - { - if (m_mmSubState != EMmSubState::MM_REGISTERED_PLMN_SEARCH && - m_mmSubState != EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE) - { - switchMmState(EMmSubState::MM_REGISTERED_PLMN_SEARCH); - } - } - else - { - if (currentCell.category == ECellCategory::SUITABLE_CELL) - switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - else if (currentCell.category == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmSubState::MM_REGISTERED_PS); - } + switchMmState(EMmSubState::MM_REGISTERED_PS); } else if (m_mmState == EMmState::MM_DEREGISTERED) { - if (currentCell.cellId == 0) - { - if (m_mmSubState != EMmSubState::MM_DEREGISTERED_PLMN_SEARCH && - m_mmSubState != EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) - { - switchMmState(EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - } - } - else - { - if (currentCell.category == ECellCategory::SUITABLE_CELL) - switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); - else if (currentCell.category == ECellCategory::ACCEPTABLE_CELL) - switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmSubState::MM_DEREGISTERED_PS); - } + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } else if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED || m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) From caa925d5a13cc6926724f93c1b0d9ca32435efc0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:58:31 +0300 Subject: [PATCH 220/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 ++ src/ue/nas/mm/ecall.cpp | 4 ++++ src/ue/nas/mm/radio.cpp | 6 ++++++ src/ue/types.hpp | 1 + 4 files changed, 13 insertions(+) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 9941b6a80..288441100 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -470,6 +470,8 @@ void NasMm::onSimRemoval() m_storage->forbiddenTaiListRoaming->clear(); m_storage->forbiddenTaiListRps->clear(); + + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } } // namespace nr::ue diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index 8154101d3..c0672e47a 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -27,6 +27,10 @@ bool NasMm::startECallInactivityIfNeeded() if (!m_usim->m_isECallOnly) return false; + // "5.2.2.3.7 The UE camps on a suitable cell or an acceptable cell in a PLMN selected as specified in 3GPP ..." + if (!m_base->shCtx.hasActiveCell()) + return false; + // The procedure shall be started when // a) the UE is in any 5GMM-REGISTERED substate except substates 5GMM-REGISTERED.PLMN-SEARCH or // 5GMM-REGISTERED.NO-CELL-AVAILABLE;" diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 9b30f8492..0d0964874 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -275,6 +275,12 @@ void NasMm::handlePaging(const std::vector &tmsiIds) if (!tmsiMatches) return; + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ECALL_INACTIVE) + { + m_logger->debug("Ignoring received Paging due to eCall inactive"); + return; + } + m_timers->t3346.stop(); if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED || diff --git a/src/ue/types.hpp b/src/ue/types.hpp index d93a4202a..20d45e10d 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -171,6 +171,7 @@ struct UeSharedContext Plmn getCurrentPlmn(); Tai getCurrentTai(); + bool hasActiveCell(); }; struct TaskBase From af662c9cba1cbb795efe84466bb01930945510fe Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 14:59:20 +0300 Subject: [PATCH 221/311] L3 RRC/NAS developments --- src/ue/types.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ue/types.cpp b/src/ue/types.cpp index eb6babdd5..b0e433a2a 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -309,6 +309,11 @@ Tai UeSharedContext::getCurrentTai() return tai; } +bool UeSharedContext::hasActiveCell() +{ + return getCurrentTai().hasValue(); +} + RrcTimers::RrcTimers() : t300(300, false, 1) { } From 0c4a14ed915451826707cbaa7c99c279fcbfeff4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:00:48 +0300 Subject: [PATCH 222/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 288441100..4e72e2a77 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -134,7 +134,7 @@ void NasMm::performMmCycle() } /* Check for uplink data pending */ - if (m_sm->anyUplinkDataPending() && missingSessionBearer()) + if (m_sm->anyUplinkDataPending() || missingSessionBearer()) serviceRequestRequiredForData(); /* Process TAI changes if any */ From 83c733c5976079929ac31d1e0418499bbcbfc584 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:08:30 +0300 Subject: [PATCH 223/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 113 ++++++++-------------------------------- src/ue/nas/mm/ecall.cpp | 3 ++ src/ue/nas/mm/radio.cpp | 35 ------------- 3 files changed, 26 insertions(+), 125 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 4e72e2a77..759ab06d3 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -100,6 +100,11 @@ void NasMm::performMmCycle() { if (!m_usim->isValid()) switchMmState(EMmSubState::MM_DEREGISTERED_NO_SUPI); + else if (isInNonAllowedArea()) + { + // TODO: check this later + switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); + } else if (currentCell.category == ECellCategory::SUITABLE_CELL) switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); else if (currentCell.category == ECellCategory::ACCEPTABLE_CELL) @@ -119,7 +124,12 @@ void NasMm::performMmCycle() auto cell = m_base->shCtx.currentCell.get(); if (cell.hasValue()) { - if (cell.category == ECellCategory::SUITABLE_CELL) + if (isInNonAllowedArea()) + { + // TODO: check this later + switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); + } + else if (cell.category == ECellCategory::SUITABLE_CELL) switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); else if (cell.category == ECellCategory::ACCEPTABLE_CELL) switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); @@ -146,102 +156,25 @@ void NasMm::performMmCycle() else m_storage->lastVisitedRegisteredTai->set(currentTai); - /* Other operations */ - if (m_mmState == EMmState::MM_DEREGISTERED) + /* PLMN selection related */ + if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH || + m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE || + m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || + m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) { - if (switchToECallInactivityIfNeeded()) - return; - - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) - { - if (!m_timers->t3346.isRunning()) - initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE) - { - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION) - { - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH) - { - performPlmnSelection(); - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_SUPI) - { - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) - { - performPlmnSelection(); - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ECALL_INACTIVE) - { - return; - } - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_INITIAL_REGISTRATION_NEEDED) - { - return; - } + performPlmnSelection(); return; } - if (m_mmState == EMmState::MM_REGISTERED) - { - if (startECallInactivityIfNeeded()) - return; - - if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE) - { - return; - } - else if (m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE) - { - return; - } - else if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) - { - return; - } - else if (m_mmSubState == EMmSubState::MM_REGISTERED_LIMITED_SERVICE) - { - return; - } - else if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) - { - performPlmnSelection(); - return; - } - else if (m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE) - { - performPlmnSelection(); - return; - } - else if (m_mmSubState == EMmSubState::MM_REGISTERED_UPDATE_NEEDED) - { - return; - } - return; - } - - if (m_mmState == EMmState::MM_REGISTERED_INITIATED) - { - return; - } - - if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) - { + /* eCall inactivity related */ + if (switchToECallInactivityIfNeeded()) return; - } - if (m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) + /* Other operations */ + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) { - return; + if (!m_timers->t3346.isRunning()) + initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); } } diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index c0672e47a..dea4a5262 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -83,6 +83,9 @@ bool NasMm::switchToECallInactivityIfNeeded() if (!m_usim->m_isECallOnly) return false; + if (m_mmState != EMmState::MM_DEREGISTERED && m_mmState != EMmState::MM_REGISTERED) + return false; + if (m_cmState != ECmState::CM_IDLE) return false; if (!((!m_timers->t3444.isRunning() && m_timers->t3445.isRunning()) || diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 0d0964874..0d3b66e4a 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -112,41 +112,6 @@ void NasMm::performPlmnSelection() } m_base->shCtx.selectedPlmn.set(selected); - - // Check if the RRC selected some cell - bool cellSelected{}; - ECellCategory cellCategory{}; - - m_base->shCtx.currentCell.access([&cellSelected, &cellCategory](auto &value) { - if (value.cellId != 0) - { - cellSelected = true; - cellCategory = value.category; - } - }); - - if (cellSelected) - { - if (isInNonAllowedArea()) - { - // TODO: check this later - switchMmState(EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); - } - else if (cellCategory == ECellCategory::SUITABLE_CELL) - { - if (m_mmState == EMmState::MM_REGISTERED) - switchMmState(EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - else - switchMmState(EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); - } - else - { - if (m_mmState == EMmState::MM_REGISTERED) - switchMmState(EMmSubState::MM_REGISTERED_LIMITED_SERVICE); - else - switchMmState(EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); - } - } } void NasMm::handleActiveCellChange(const Tai &prevTai) From becc99c3f61e6583ebfb50228ea287326bb067b0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:32:42 +0300 Subject: [PATCH 224/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 759ab06d3..b8b58e4e0 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -156,6 +156,10 @@ void NasMm::performMmCycle() else m_storage->lastVisitedRegisteredTai->set(currentTai); + /* eCall inactivity related */ + if (switchToECallInactivityIfNeeded()) + return; + /* PLMN selection related */ if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH || m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE || @@ -166,16 +170,9 @@ void NasMm::performMmCycle() return; } - /* eCall inactivity related */ - if (switchToECallInactivityIfNeeded()) - return; - - /* Other operations */ - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) - { - if (!m_timers->t3346.isRunning()) - initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); - } + /* Automatic initial registration */ + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) + initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); } void NasMm::switchMmState(EMmSubState subState) From e10b45512f0e617b0d4452839123539fda1fb68c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:33:57 +0300 Subject: [PATCH 225/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 3 +++ src/ue/nas/mm/mm.hpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index b8b58e4e0..108cf328d 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -173,6 +173,9 @@ void NasMm::performMmCycle() /* Automatic initial registration */ if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); + + /* Try to start procedures */ + invokeProcedures(); } void NasMm::switchMmState(EMmSubState subState) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 87bf6cd85..b3bc43372 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -189,6 +189,7 @@ class NasMm void serviceRequestRequiredForSignalling(); void serviceRequestRequired(EServiceReqCause cause); void deregistrationRequired(EDeregCause cause); + void invokeProcedures(); private: /* Service Access Point */ void handleRrcEvent(const NmUeRrcToNas &msg); From c7e88bc12633f6095110d018d75858fc1afd8f8c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:34:04 +0300 Subject: [PATCH 226/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index baa546fdf..dde8ab0b5 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -71,4 +71,9 @@ void NasMm::deregistrationRequired(EDeregCause cause) triggerMmCycle(); } +void NasMm::invokeProcedures() +{ + // TODO +} + } // namespace nr::ue \ No newline at end of file From d2bf24c4831441d5f99e20a57cf766b3b8758d6f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:39:52 +0300 Subject: [PATCH 227/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 +- src/ue/nas/mm/mm.hpp | 4 ++-- src/ue/nas/mm/proc.cpp | 30 ++++++++---------------------- src/ue/types.hpp | 8 ++++++++ 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 108cf328d..cc6c1cfda 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -54,7 +54,7 @@ static EMmState GetMmStateFromSubState(EMmSubState subState) std::terminate(); } -NasMm::NasMm(TaskBase *base, NasTimers *timers) : m_base{base}, m_timers{timers}, m_sm{}, m_usim{} +NasMm::NasMm(TaskBase *base, NasTimers *timers) : m_base{base}, m_timers{timers}, m_sm{}, m_usim{}, m_procCtl{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "nas"); diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index b3bc43372..d5cc788ba 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -37,6 +37,8 @@ class NasMm EMmState m_mmState; EMmSubState m_mmSubState; + // Procedure management + ProcControl m_procCtl; // Most recent registration request std::unique_ptr m_lastRegistrationRequest{}; // Most recent service request @@ -57,8 +59,6 @@ class NasMm bool m_registeredForEmergency{}; // Network feature support information nas::IE5gsNetworkFeatureSupport m_nwFeatureSupport{}; - // Last time Service Request needed indication for Data - int64_t m_lastTimeServiceReqNeededIndForData{}; // Number of times the network failing the authentication check int m_nwConsecutiveAuthFailure{}; // Last time PLMN search failure logged diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index dde8ab0b5..9cc6781ef 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -21,53 +21,39 @@ namespace nr::ue void NasMm::initialRegistrationRequired(EInitialRegCause cause) { - // TODO - + m_procCtl.initialRegistration = cause; triggerMmCycle(); } void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) { - // TODO + m_procCtl.mobilityRegistration = cause; + triggerMmCycle(); // TODO: "the periodic registration update procedure is delayed until the UE returns to // 5GMM-REGISTERED.NORMAL-SERVICE over 3GPP access." See 5.3.7 - - triggerMmCycle(); } void NasMm::serviceRequestRequiredForSignalling() { - // TODO + serviceRequestRequired(EServiceReqCause::IDLE_UPLINK_SIGNAL_PENDING); } void NasMm::serviceRequestRequiredForData() { - static constexpr const int64_t SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD = 1000; - - auto currentTime = utils::CurrentTimeMillis(); - if (currentTime - m_lastTimeServiceReqNeededIndForData > SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD) - { - serviceRequestRequired(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING - : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); - - m_lastTimeServiceReqNeededIndForData = currentTime; - - triggerMmCycle(); - } + serviceRequestRequired(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING + : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); } void NasMm::serviceRequestRequired(EServiceReqCause cause) { - // TODO - + m_procCtl.serviceRequest = cause; triggerMmCycle(); } void NasMm::deregistrationRequired(EDeregCause cause) { - // TODO - + m_procCtl.deregistration = cause; triggerMmCycle(); } diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 20d45e10d..bbca57548 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -550,6 +550,14 @@ enum class EServiceReqCause FALLBACK_INDICATION }; +struct ProcControl +{ + std::optional initialRegistration{}; + std::optional mobilityRegistration{}; + std::optional serviceRequest{}; + std::optional deregistration{}; +}; + Json ToJson(const ECmState &state); Json ToJson(const ERmState &state); Json ToJson(const EMmState &state); From 4453a90dfe203b41dde8a7bd55ba7d4769240b24 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:44:25 +0300 Subject: [PATCH 228/311] L3 RRC/NAS developments --- src/utils/common_types.hpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 555ae3e31..2d741df72 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -40,7 +40,7 @@ struct Tai int tac; Tai(); - Tai(const Plmn& plmn, int tac); + Tai(const Plmn &plmn, int tac); Tai(int mcc, int mnc, bool longMnc, int tac); [[nodiscard]] bool hasValue() const; @@ -188,6 +188,12 @@ struct UacAiBarringSet bool ai15 = false; }; +enum class Rc +{ + OK, + FAIL +}; + bool operator==(const Plmn &lhs, const Plmn &rhs); bool operator!=(const Plmn &lhs, const Plmn &rhs); From cbe5723e75037f5ae8c07dc24a45c806fa9f121a Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:54:10 +0300 Subject: [PATCH 229/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 20 ++++++++++++++++++++ src/utils/common_types.cpp | 21 +++++++++++++++++++++ src/utils/common_types.hpp | 1 + 3 files changed, 42 insertions(+) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index 9cc6781ef..6924d2864 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -21,12 +21,22 @@ namespace nr::ue void NasMm::initialRegistrationRequired(EInitialRegCause cause) { + if (m_procCtl.initialRegistration == cause) + return; + + m_logger->debug("Initial registration required due to [%s]", ToJson(cause).str().c_str()); + m_procCtl.initialRegistration = cause; triggerMmCycle(); } void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) { + if (m_procCtl.mobilityRegistration == cause) + return; + + m_logger->debug("Mobility registration updating required due to [%s]", ToJson(cause).str().c_str()); + m_procCtl.mobilityRegistration = cause; triggerMmCycle(); @@ -47,12 +57,22 @@ void NasMm::serviceRequestRequiredForData() void NasMm::serviceRequestRequired(EServiceReqCause cause) { + if (m_procCtl.serviceRequest == cause) + return; + + m_logger->debug("Service request required due to [%s]", ToJson(cause).str().c_str()); + m_procCtl.serviceRequest = cause; triggerMmCycle(); } void NasMm::deregistrationRequired(EDeregCause cause) { + if (m_procCtl.deregistration == cause) + return; + + m_logger->debug("De-registration required due to [%s]", ToJson(cause).str().c_str()); + m_procCtl.deregistration = cause; triggerMmCycle(); } diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index ef6f20852..b3fe95399 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -93,6 +93,27 @@ Json ToJson(const ECellCategory &v) } } +Json ToJson(const EInitialRegCause &v) +{ + switch (v) + { + case EInitialRegCause::UNSPECIFIED: + return "UNSPECIFIED"; + case EInitialRegCause::EMERGENCY_SERVICES: + return "EMERGENCY_SERVICES"; + case EInitialRegCause::MM_DEREG_NORMAL_SERVICE: + return "MM_DEREG_NORMAL_SERVICE"; + case EInitialRegCause::T3346_EXPIRY: + return "T3346_EXPIRY"; + case EInitialRegCause::DUE_TO_DEREGISTRATION: + return "DUE_TO_DEREGISTRATION"; + case EInitialRegCause::DUE_TO_SERVICE_REJECT: + return "DUE_TO_SERVICE_REJECT"; + default: + return "?"; + } +} + bool operator==(const SingleSlice &lhs, const SingleSlice &rhs) { if ((int)lhs.sst != (int)rhs.sst) diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 2d741df72..729f51aef 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -213,6 +213,7 @@ Json ToJson(const NetworkSlice &v); Json ToJson(const PlmnSupport &v); Json ToJson(const EDeregCause &v); Json ToJson(const ECellCategory &v); +Json ToJson(const EInitialRegCause &v); namespace std { From 5c5bc8316de5cef9623219cf645af8363921ac2c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:54:28 +0300 Subject: [PATCH 230/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index 6924d2864..8f716ca64 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -39,9 +39,6 @@ void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) m_procCtl.mobilityRegistration = cause; triggerMmCycle(); - - // TODO: "the periodic registration update procedure is delayed until the UE returns to - // 5GMM-REGISTERED.NORMAL-SERVICE over 3GPP access." See 5.3.7 } void NasMm::serviceRequestRequiredForSignalling() @@ -80,6 +77,10 @@ void NasMm::deregistrationRequired(EDeregCause cause) void NasMm::invokeProcedures() { // TODO + + // note1: + // TODO: "the periodic registration update procedure is delayed until the UE returns to + // 5GMM-REGISTERED.NORMAL-SERVICE over 3GPP access." See 5.3.7 } } // namespace nr::ue \ No newline at end of file From 1221531bb6f7dbe39816aa65ef2e2ea86bcc80c3 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 15:58:56 +0300 Subject: [PATCH 231/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 8 ++++---- src/ue/nas/mm/radio.cpp | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index cc6c1cfda..51c1f2534 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -143,6 +143,10 @@ void NasMm::performMmCycle() return; } + /* Automatic initial registration */ + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) + initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); + /* Check for uplink data pending */ if (m_sm->anyUplinkDataPending() || missingSessionBearer()) serviceRequestRequiredForData(); @@ -170,10 +174,6 @@ void NasMm::performMmCycle() return; } - /* Automatic initial registration */ - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) - initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); - /* Try to start procedures */ invokeProcedures(); } diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 0d3b66e4a..d6a0656e2 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -292,8 +292,9 @@ void NasMm::updateProvidedGuti(bool provide) bool NasMm::missingSessionBearer() { + // This control is only valid in CM-CONNECTED if (m_cmState == ECmState::CM_IDLE) - return true; + return false; // TODO return false; From 614ac12e7ea479a8e5f942d819f92c62d07f0fec Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 16:11:32 +0300 Subject: [PATCH 232/311] L3 RRC/NAS developments --- src/lib/app/cli_cmd.cpp | 1 - src/ue/nas/mm/radio.cpp | 7 ++-- src/ue/nas/mm/timer.cpp | 6 +-- src/ue/types.cpp | 78 -------------------------------------- src/ue/types.hpp | 12 +++--- src/utils/common_types.cpp | 40 ------------------- src/utils/common_types.hpp | 2 - 7 files changed, 14 insertions(+), 132 deletions(-) diff --git a/src/lib/app/cli_cmd.cpp b/src/lib/app/cli_cmd.cpp index 0e9b01e20..420ff1de7 100644 --- a/src/lib/app/cli_cmd.cpp +++ b/src/lib/app/cli_cmd.cpp @@ -235,7 +235,6 @@ static std::unique_ptr UeCliParseImpl(const std::string &subCmd, c else if (subCmd == "deregister") { auto cmd = std::make_unique(UeCliCommand::DE_REGISTER); - cmd->deregCause = EDeregCause::UNSPECIFIED; if (options.positionalCount() == 0) CMD_ERR("De-registration type is expected") if (options.positionalCount() > 1) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index d6a0656e2..333553e63 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -144,9 +144,10 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) // of the serving cell has changed, if timer T3346 is not running, the PLMN identity of the new cell is not in // one of the forbidden PLMN lists and the tracking area is not in one of the lists of 5GS forbidden tracking // area" - if (!m_timers->t3346.isRunning() && currentCell.category == ECellCategory::SUITABLE_CELL) + if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE && !m_timers->t3346.isRunning() && + currentCell.category == ECellCategory::SUITABLE_CELL) { - mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::TAI_CHANGE_IN_ATT_UPD); } } @@ -160,7 +161,7 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) !m_storage->equivalentPlmnList->contains(currentTai.plmn) && currentCell.category == ECellCategory::SUITABLE_CELL) { - mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::PLMN_CHANGE_IN_ATT_UPD); } } diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index b1191b94f..ea3641f99 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -33,7 +33,7 @@ void NasMm::onTimerExpire(UeTimer &timer) else if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) { logExpired(); - mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::T3346_EXPIRY_IN_ATT_UPD); } break; } @@ -45,7 +45,7 @@ void NasMm::onTimerExpire(UeTimer &timer) resetRegAttemptCounter(); if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) - mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::T3502_EXPIRY_IN_ATT_UPD); } break; } @@ -85,7 +85,7 @@ void NasMm::onTimerExpire(UeTimer &timer) if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) { logExpired(); - mobilityUpdatingRequired(ERegUpdateCause::UNSPECIFIED); + mobilityUpdatingRequired(ERegUpdateCause::T3511_EXPIRY_IN_ATT_UPD); } break; } diff --git a/src/ue/types.cpp b/src/ue/types.cpp index b0e433a2a..9f08f9880 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -182,55 +182,6 @@ Json ToJson(const E5UState &state) } } -Json ToJson(const ERegUpdateCause &v) -{ - switch (v) - { - case ERegUpdateCause::UNSPECIFIED: - return "UNSPECIFIED"; - case ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA: - return "ENTER_UNLISTED_TRACKING_AREA"; - case ERegUpdateCause::T3512_EXPIRY: - return "T3512_EXPIRY"; - case ERegUpdateCause::CONFIGURATION_UPDATE: - return "CONFIGURATION_UPDATE"; - case ERegUpdateCause::PAGING_OR_NOTIFICATION: - return "PAGING_OR_NOTIFICATION"; - case ERegUpdateCause::INTER_SYSTEM_CHANGE_S1_TO_N1: - return "INTER_SYSTEM_CHANGE_S1_TO_N1"; - case ERegUpdateCause::CONNECTION_RECOVERY: - return "CONNECTION_RECOVERY"; - case ERegUpdateCause::FALLBACK_INDICATION: - return "FALLBACK_INDICATION"; - case ERegUpdateCause::MM_OR_S1_CAPABILITY_CHANGE: - return "MM_OR_S1_CAPABILITY_CHANGE"; - case ERegUpdateCause::USAGE_SETTING_CHANGE: - return "USAGE_SETTING_CHANGE"; - case ERegUpdateCause::SLICE_CHANGE: - return "SLICE_CHANGE"; - case ERegUpdateCause::DRX_CHANGE: - return "DRX_CHANGE"; - case ERegUpdateCause::EMERGENCY_CASE: - return "EMERGENCY_CASE"; - case ERegUpdateCause::SMS_OVER_NAS_CHANGE: - return "SMS_OVER_NAS_CHANGE"; - case ERegUpdateCause::PS_STATUS_INFORM: - return "PS_STATUS_INFORM"; - case ERegUpdateCause::RADIO_CAP_CHANGE: - return "RADIO_CAP_CHANGE"; - case ERegUpdateCause::NEW_LADN_NEEDED: - return "NEW_LADN_NEEDED"; - case ERegUpdateCause::MICO_MODE_CHANGE: - return "MICO_MODE_CHANGE"; - case ERegUpdateCause::ENTER_EQUIVALENT_PLMN_CELL: - return "ENTER_EQUIVALENT_PLMN_CELL"; - case ERegUpdateCause::RESTRICTED_SERVICE_AREA: - return "RESTRICTED_SERVICE_AREA"; - default: - return "?"; - } -} - Json ToJson(const EPsState &state) { switch (state) @@ -260,35 +211,6 @@ Json ToJson(const UePduSessionInfo &v) }); } -Json ToJson(const EServiceReqCause &v) -{ - switch (v) - { - case EServiceReqCause::UNSPECIFIED: - return "UNSPECIFIED"; - case EServiceReqCause::IDLE_PAGING: - return "IDLE_PAGING"; - case EServiceReqCause::CONNECTED_3GPP_NOTIFICATION_N3GPP: - return "CONNECTED_3GPP_NOTIFICATION_N3GPP"; - case EServiceReqCause::IDLE_UPLINK_SIGNAL_PENDING: - return "IDLE_UPLINK_SIGNAL_PENDING"; - case EServiceReqCause::IDLE_UPLINK_DATA_PENDING: - return "IDLE_UPLINK_DATA_PENDING"; - case EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING: - return "CONNECTED_UPLINK_DATA_PENDING"; - case EServiceReqCause::NON_3GPP_AS_ESTABLISHED: - return "NON_3GPP_AS_ESTABLISHED"; - case EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP: - return "IDLE_3GPP_NOTIFICATION_N3GPP"; - case EServiceReqCause::EMERGENCY_FALLBACK: - return "EMERGENCY_FALLBACK"; - case EServiceReqCause::FALLBACK_INDICATION: - return "FALLBACK_INDICATION"; - default: - return "?"; - } -} - bool ActiveCellInfo::hasValue() const { return cellId != 0; diff --git a/src/ue/types.hpp b/src/ue/types.hpp index bbca57548..fa1330ee8 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -465,8 +465,6 @@ struct UePduSessionInfo enum class ERegUpdateCause { - // unspecified cause - UNSPECIFIED, // when the UE detects entering a tracking area that is not in the list of tracking areas that the UE previously // registered in the AMF ENTER_UNLISTED_TRACKING_AREA, @@ -515,13 +513,17 @@ enum class ERegUpdateCause // belonging to an equivalent PLMN of the registered PLMN and not belonging to the registered PLMN; ENTER_EQUIVALENT_PLMN_CELL, // when the UE receives a SERVICE REJECT message with the 5GMM cause value set to #28 "Restricted service area". - RESTRICTED_SERVICE_AREA + RESTRICTED_SERVICE_AREA, + // ------ following are not specified by 24.501 ------ + TAI_CHANGE_IN_ATT_UPD, + PLMN_CHANGE_IN_ATT_UPD, + T3346_EXPIRY_IN_ATT_UPD, + T3502_EXPIRY_IN_ATT_UPD, + T3511_EXPIRY_IN_ATT_UPD, }; enum class EServiceReqCause { - // unspecified cause - UNSPECIFIED, // a) the UE, in 5GMM-IDLE mode over 3GPP access, receives a paging request from the network IDLE_PAGING, // b) the UE, in 5GMM-CONNECTED mode over 3GPP access, receives a notification from the network with access type diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index b3fe95399..0e6d30406 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -57,25 +57,6 @@ Json ToJson(const PlmnSupport &v) return Json::Obj({{"plmn", ToJson(v.plmn)}, {"nssai", ToJson(v.sliceSupportList)}}); } -Json ToJson(const EDeregCause &v) -{ - switch (v) - { - case EDeregCause::UNSPECIFIED: - return "NORMAL"; - case EDeregCause::SWITCH_OFF: - return "SWITCH-OFF"; - case EDeregCause::USIM_REMOVAL: - return "USIM-REMOVAL"; - case EDeregCause::DISABLE_5G: - return "DISABLE-5G"; - case EDeregCause::ECALL_INACTIVITY: - return "ECALL-INACTIVITY"; - default: - return "?"; - } -} - Json ToJson(const ECellCategory &v) { switch (v) @@ -93,27 +74,6 @@ Json ToJson(const ECellCategory &v) } } -Json ToJson(const EInitialRegCause &v) -{ - switch (v) - { - case EInitialRegCause::UNSPECIFIED: - return "UNSPECIFIED"; - case EInitialRegCause::EMERGENCY_SERVICES: - return "EMERGENCY_SERVICES"; - case EInitialRegCause::MM_DEREG_NORMAL_SERVICE: - return "MM_DEREG_NORMAL_SERVICE"; - case EInitialRegCause::T3346_EXPIRY: - return "T3346_EXPIRY"; - case EInitialRegCause::DUE_TO_DEREGISTRATION: - return "DUE_TO_DEREGISTRATION"; - case EInitialRegCause::DUE_TO_SERVICE_REJECT: - return "DUE_TO_SERVICE_REJECT"; - default: - return "?"; - } -} - bool operator==(const SingleSlice &lhs, const SingleSlice &rhs) { if ((int)lhs.sst != (int)rhs.sst) diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 729f51aef..94722cd37 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -127,7 +127,6 @@ struct Supi enum class EDeregCause { - UNSPECIFIED, SWITCH_OFF, USIM_REMOVAL, DISABLE_5G, @@ -136,7 +135,6 @@ enum class EDeregCause enum class EInitialRegCause { - UNSPECIFIED, EMERGENCY_SERVICES, MM_DEREG_NORMAL_SERVICE, T3346_EXPIRY, From 416a658cdad83d9fa1125701d6ed975237a7a560 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 16:21:23 +0300 Subject: [PATCH 233/311] L3 RRC/NAS developments --- src/ue/nas/mm/access.cpp | 6 +++ src/ue/types.cpp | 84 ++++++++++++++++++++++++++++++++++++++ src/utils/common_types.cpp | 36 ++++++++++++++++ 3 files changed, 126 insertions(+) diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index 7caf9cc69..f8bae2aeb 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -24,6 +24,12 @@ bool NasMm::hasEmergency() if (m_mmState == EMmState::MM_REGISTERED_INITIATED && m_lastRegistrationRequest && m_lastRegistrationRequest->registrationType.registrationType == nas::ERegistrationType::EMERGENCY_REGISTRATION) return true; + if (m_procCtl.initialRegistration && m_procCtl.initialRegistration == EInitialRegCause::EMERGENCY_SERVICES) + return true; + if (m_procCtl.mobilityRegistration && m_procCtl.mobilityRegistration == ERegUpdateCause::EMERGENCY_CASE) + return true; + if (m_procCtl.serviceRequest && m_procCtl.serviceRequest == EServiceReqCause::EMERGENCY_FALLBACK) + return true; // TODO: Other case which is an emergency PDU session need to be established (and wanted to be // established soon) diff --git a/src/ue/types.cpp b/src/ue/types.cpp index 9f08f9880..e948e22b1 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -134,6 +134,90 @@ Json ToJson(const EMmSubState &state) } } +Json ToJson(const EServiceReqCause &v) +{ + switch (v) + { + case EServiceReqCause::IDLE_PAGING: + return "IDLE-PAGING"; + case EServiceReqCause::CONNECTED_3GPP_NOTIFICATION_N3GPP: + return "CONNECTED-3GPP-NOTIFICATION-N3GPP"; + case EServiceReqCause::IDLE_UPLINK_SIGNAL_PENDING: + return "IDLE-UPLINK-SIGNAL-PENDING"; + case EServiceReqCause::IDLE_UPLINK_DATA_PENDING: + return "IDLE-UPLINK-DATA-PENDING"; + case EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING: + return "CONNECTED-UPLINK-DATA-PENDING"; + case EServiceReqCause::NON_3GPP_AS_ESTABLISHED: + return "NON-3GPP-AS-ESTABLISHED"; + case EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP: + return "IDLE-3GPP-NOTIFICATION-N3GPP"; + case EServiceReqCause::EMERGENCY_FALLBACK: + return "EMERGENCY-FALLBACK"; + case EServiceReqCause::FALLBACK_INDICATION: + return "FALLBACK-INDICATION"; + default: + return "?"; + } +} + +Json ToJson(const ERegUpdateCause &v) +{ + switch (v) + { + case ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA: + return "ENTER-UNLISTED-TRACKING-AREA"; + case ERegUpdateCause::T3512_EXPIRY: + return "T3512-EXPIRY"; + case ERegUpdateCause::CONFIGURATION_UPDATE: + return "CONFIGURATION-UPDATE"; + case ERegUpdateCause::PAGING_OR_NOTIFICATION: + return "PAGING-OR-NOTIFICATION"; + case ERegUpdateCause::INTER_SYSTEM_CHANGE_S1_TO_N1: + return "INTER-SYSTEM-CHANGE-S1-TO-N1"; + case ERegUpdateCause::CONNECTION_RECOVERY: + return "CONNECTION-RECOVERY"; + case ERegUpdateCause::FALLBACK_INDICATION: + return "FALLBACK-INDICATION"; + case ERegUpdateCause::MM_OR_S1_CAPABILITY_CHANGE: + return "MM-OR-S1-CAPABILITY-CHANGE"; + case ERegUpdateCause::USAGE_SETTING_CHANGE: + return "USAGE-SETTING_CHANGE"; + case ERegUpdateCause::SLICE_CHANGE: + return "SLICE-CHANGE"; + case ERegUpdateCause::DRX_CHANGE: + return "DRX-CHANGE"; + case ERegUpdateCause::EMERGENCY_CASE: + return "EMERGENCY-CASE"; + case ERegUpdateCause::SMS_OVER_NAS_CHANGE: + return "SMS-OVER-NAS-CHANGE"; + case ERegUpdateCause::PS_STATUS_INFORM: + return "PS-STATUS-INFORM"; + case ERegUpdateCause::RADIO_CAP_CHANGE: + return "RADIO-CAP-CHANGE"; + case ERegUpdateCause::NEW_LADN_NEEDED: + return "NEW-LADN-NEEDED"; + case ERegUpdateCause::MICO_MODE_CHANGE: + return "MICO-MODE-CHANGE"; + case ERegUpdateCause::ENTER_EQUIVALENT_PLMN_CELL: + return "ENTER-EQUIVALENT-PLMN-CELL"; + case ERegUpdateCause::RESTRICTED_SERVICE_AREA: + return "RESTRICTED-SERVICE-AREA"; + case ERegUpdateCause::TAI_CHANGE_IN_ATT_UPD: + return "TAI-CHANGE-IN-ATT-UPD"; + case ERegUpdateCause::PLMN_CHANGE_IN_ATT_UPD: + return "PLMN-CHANGE-IN-ATT-UPD"; + case ERegUpdateCause::T3346_EXPIRY_IN_ATT_UPD: + return "T3346-EXPIRY-IN-ATT-UPD"; + case ERegUpdateCause::T3502_EXPIRY_IN_ATT_UPD: + return "T3502-EXPIRY-IN-ATT-UPD"; + case ERegUpdateCause::T3511_EXPIRY_IN_ATT_UPD: + return "T3511-EXPIRY-IN-ATT-UPD"; + default: + return "?"; + } +} + Json ToJson(const UeConfig &v) { return Json::Obj({ diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 0e6d30406..fd68c697b 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -124,6 +124,42 @@ bool operator!=(const Tai &lhs, const Tai &rhs) return !(lhs == rhs); } +Json ToJson(const EDeregCause &v) +{ + switch (v) + { + case EDeregCause::SWITCH_OFF: + return "SWITCH-OFF"; + case EDeregCause::USIM_REMOVAL: + return "USIM-REMOVAL"; + case EDeregCause::DISABLE_5G: + return "DISABLE-5G"; + case EDeregCause::ECALL_INACTIVITY: + return "ECALL-INACTIVITY"; + default: + return "?"; + } +} + +Json ToJson(const EInitialRegCause &v) +{ + switch (v) + { + case EInitialRegCause::EMERGENCY_SERVICES: + return "EMERGENCY-SERVICES"; + case EInitialRegCause::MM_DEREG_NORMAL_SERVICE: + return "MM-DEREG-NORMAL-SERVICE"; + case EInitialRegCause::T3346_EXPIRY: + return "T3346-EXPIRY"; + case EInitialRegCause::DUE_TO_DEREGISTRATION: + return "DUE-TO-DEREGISTRATION"; + case EInitialRegCause::DUE_TO_SERVICE_REJECT: + return "DUE-TO-SERVICE_REJECT"; + default: + return "?"; + } +} + void NetworkSlice::addIfNotExists(const SingleSlice &slice) { if (!std::any_of(slices.begin(), slices.end(), [&slice](auto &s) { return s == slice; })) From e3e36bad0a4a0891cc34b6aa381b31c15690fc61 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 16:39:33 +0300 Subject: [PATCH 234/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 4 ++++ src/ue/types.hpp | 7 +++++++ src/utils/common_types.hpp | 6 ------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index 8f716ca64..393b3fe30 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -77,6 +77,10 @@ void NasMm::deregistrationRequired(EDeregCause cause) void NasMm::invokeProcedures() { // TODO + if (m_procCtl.deregistration) + { + + } // note1: // TODO: "the periodic registration update procedure is delayed until the UE returns to diff --git a/src/ue/types.hpp b/src/ue/types.hpp index fa1330ee8..c155bd9d0 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -552,6 +552,13 @@ enum class EServiceReqCause FALLBACK_INDICATION }; +enum class EProcRc +{ + OK, + INVALID, + FAIL, +}; + struct ProcControl { std::optional initialRegistration{}; diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 94722cd37..e4c9ccaea 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -186,12 +186,6 @@ struct UacAiBarringSet bool ai15 = false; }; -enum class Rc -{ - OK, - FAIL -}; - bool operator==(const Plmn &lhs, const Plmn &rhs); bool operator!=(const Plmn &lhs, const Plmn &rhs); From d79d64342541bf10e701f7915c3c43a00b6ead18 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 17:46:39 +0300 Subject: [PATCH 235/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 1 - src/ue/nas/mm/proc.cpp | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 51c1f2534..44e9892df 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -171,7 +171,6 @@ void NasMm::performMmCycle() m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) { performPlmnSelection(); - return; } /* Try to start procedures */ diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index 393b3fe30..ddafd6305 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -19,6 +19,32 @@ namespace nr::ue { +static void AssignCause(std::optional &oldCause, EInitialRegCause newCause) +{ + oldCause = newCause; +} + +static void AssignCause(std::optional &oldCause, ERegUpdateCause newCause) +{ + oldCause = newCause; +} + +static void AssignCause(std::optional &oldCause, EServiceReqCause newCause) +{ + oldCause = newCause; +} + +static void AssignCause(std::optional &oldCause, EDeregCause newCause) +{ + if ((oldCause == EDeregCause::SWITCH_OFF || oldCause == EDeregCause::USIM_REMOVAL) && + (newCause == EDeregCause::SWITCH_OFF || newCause == EDeregCause::USIM_REMOVAL)) + return; + if (oldCause == EDeregCause::DISABLE_5G && newCause == EDeregCause::ECALL_INACTIVITY) + return; + + oldCause = newCause; +} + void NasMm::initialRegistrationRequired(EInitialRegCause cause) { if (m_procCtl.initialRegistration == cause) @@ -26,7 +52,7 @@ void NasMm::initialRegistrationRequired(EInitialRegCause cause) m_logger->debug("Initial registration required due to [%s]", ToJson(cause).str().c_str()); - m_procCtl.initialRegistration = cause; + AssignCause(m_procCtl.initialRegistration, cause); triggerMmCycle(); } @@ -37,7 +63,7 @@ void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) m_logger->debug("Mobility registration updating required due to [%s]", ToJson(cause).str().c_str()); - m_procCtl.mobilityRegistration = cause; + AssignCause(m_procCtl.mobilityRegistration, cause); triggerMmCycle(); } @@ -59,7 +85,7 @@ void NasMm::serviceRequestRequired(EServiceReqCause cause) m_logger->debug("Service request required due to [%s]", ToJson(cause).str().c_str()); - m_procCtl.serviceRequest = cause; + AssignCause(m_procCtl.serviceRequest, cause); triggerMmCycle(); } @@ -70,16 +96,20 @@ void NasMm::deregistrationRequired(EDeregCause cause) m_logger->debug("De-registration required due to [%s]", ToJson(cause).str().c_str()); - m_procCtl.deregistration = cause; + AssignCause(m_procCtl.deregistration, cause); triggerMmCycle(); } void NasMm::invokeProcedures() { - // TODO if (m_procCtl.deregistration) { - + sendDeregistration(*m_procCtl.deregistration); + m_procCtl.initialRegistration = std::nullopt; + m_procCtl.mobilityRegistration = std::nullopt; + m_procCtl.serviceRequest = std::nullopt; + m_procCtl.deregistration = std::nullopt; + return; } // note1: From c2dbba5d79e1eb421a39b1df3c1d2640bff43e34 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 17:54:13 +0300 Subject: [PATCH 236/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 17 +++++++++++------ src/ue/nas/mm/messaging.cpp | 6 ++++-- src/ue/nas/mm/mm.hpp | 4 ++-- src/ue/nas/mm/proc.cpp | 6 ++++-- src/ue/types.hpp | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index aab742bf7..d292365ec 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -26,12 +26,12 @@ static nas::IEDeRegistrationType MakeDeRegistrationType(EDeregCause deregCause) return res; } -void NasMm::sendDeregistration(EDeregCause deregCause) +EProcRc NasMm::sendDeregistration(EDeregCause deregCause) { if (m_rmState != ERmState::RM_REGISTERED) { m_logger->warn("De-registration could not be triggered. UE is already de-registered"); - return; + return EProcRc::CANCEL; } m_logger->debug("Starting de-registration procedure due to [%s]", ToJson(deregCause).str().c_str()); @@ -54,7 +54,10 @@ void NasMm::sendDeregistration(EDeregCause deregCause) request->mobileIdentity = getOrGeneratePreferredId(); - sendNasMessage(*request); + auto rc = sendNasMessage(*request); + if (rc != EProcRc::OK) + return EProcRc::STAY; + m_lastDeregistrationRequest = std::move(request); m_lastDeregCause = deregCause; m_timers->t3521.resetExpiryCount(); @@ -65,6 +68,10 @@ void NasMm::sendDeregistration(EDeregCause deregCause) m_timers->t3521.start(); } + m_sm->localReleaseAllSessions(); + + switchMmState(EMmSubState::MM_DEREGISTERED_INITIATED_PS); + // TODO: Bu ikisinin burada olması gerektiğinden emin değilim if (deregCause == EDeregCause::SWITCH_OFF) { @@ -78,9 +85,7 @@ void NasMm::sendDeregistration(EDeregCause deregCause) m_usim->invalidate(); } - m_sm->localReleaseAllSessions(); - - switchMmState(EMmSubState::MM_DEREGISTERED_INITIATED_PS); + return EProcRc::OK; } void NasMm::receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOriginating &msg) diff --git a/src/ue/nas/mm/messaging.cpp b/src/ue/nas/mm/messaging.cpp index bd84e0b26..e44d6f3a0 100644 --- a/src/ue/nas/mm/messaging.cpp +++ b/src/ue/nas/mm/messaging.cpp @@ -103,14 +103,14 @@ static void RemoveCleartextIEs(nas::PlainMmMessage &msg, OctetString &&nasMsgCon } } -void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) +EProcRc NasMm::sendNasMessage(const nas::PlainMmMessage &msg) { if (m_cmState == ECmState::CM_IDLE && !IsInitialNasMessage(msg)) { m_logger->warn("NAS Transport aborted, Service Request is needed for uplink signalling"); if (m_mmState != EMmState::MM_SERVICE_REQUEST_INITIATED) serviceRequestRequiredForSignalling(); - return; + return EProcRc::STAY; } bool hasNsCtx = @@ -170,6 +170,8 @@ void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) m->pduId = 0; m->nasPdu = std::move(pdu); m_base->rrcTask->push(m); + + return EProcRc::OK; } void NasMm::receiveNasMessage(const nas::NasMessage &msg) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index d5cc788ba..a61e2e250 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -93,7 +93,7 @@ class NasMm void onSimRemoval(); private: /* Messaging */ - void sendNasMessage(const nas::PlainMmMessage &msg); + EProcRc sendNasMessage(const nas::PlainMmMessage &msg); void receiveNasMessage(const nas::NasMessage &msg); void receiveMmMessage(const nas::PlainMmMessage &msg); void receiveMmStatus(const nas::FiveGMmStatus &msg); @@ -133,7 +133,7 @@ class NasMm nas::IEUeSecurityCapability createSecurityCapabilityIe(); private: /* De-registration */ - void sendDeregistration(EDeregCause deregCause); + EProcRc sendDeregistration(EDeregCause deregCause); void receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOriginating &msg); void receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTerminated &msg); void performLocalDeregistration(); diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index ddafd6305..ad565b643 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -104,11 +104,13 @@ void NasMm::invokeProcedures() { if (m_procCtl.deregistration) { - sendDeregistration(*m_procCtl.deregistration); + EProcRc rc = sendDeregistration(*m_procCtl.deregistration); + if (rc != EProcRc::STAY) + m_procCtl.deregistration = std::nullopt; + m_procCtl.initialRegistration = std::nullopt; m_procCtl.mobilityRegistration = std::nullopt; m_procCtl.serviceRequest = std::nullopt; - m_procCtl.deregistration = std::nullopt; return; } diff --git a/src/ue/types.hpp b/src/ue/types.hpp index c155bd9d0..01a9dbd35 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -555,8 +555,8 @@ enum class EServiceReqCause enum class EProcRc { OK, - INVALID, - FAIL, + CANCEL, + STAY, }; struct ProcControl From ce6ff2e4f0ee976dc963d1a24a6993bf1aa76e43 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:02:58 +0300 Subject: [PATCH 237/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 5 ++++- src/ue/nas/mm/mm.hpp | 2 +- src/ue/nas/mm/proc.cpp | 29 +++++++++++++++++++++++++---- src/ue/nas/mm/register.cpp | 29 ++++++++++++++++++----------- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index d292365ec..23130a96d 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -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; diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index a61e2e250..0f46d9e8f 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -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); diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index ad565b643..fce90ea28 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -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; } diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 00d8f5157..6e28e8ad1 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -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}); }); } } From aec399ec95863f8ff06fbb096f90be2b13d24251 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:21:20 +0300 Subject: [PATCH 238/311] L3 RRC/NAS developments --- src/ue/nas/mm/messaging.cpp | 6 ++++++ src/ue/nas/mm/mm.hpp | 4 ++-- src/ue/nas/mm/proc.cpp | 38 ++++++++++++++++++++++++++++++++----- src/ue/nas/mm/register.cpp | 28 +++++++++++++++------------ src/ue/nas/mm/service.cpp | 27 ++++++++++++++------------ 5 files changed, 72 insertions(+), 31 deletions(-) diff --git a/src/ue/nas/mm/messaging.cpp b/src/ue/nas/mm/messaging.cpp index e44d6f3a0..cca587ca1 100644 --- a/src/ue/nas/mm/messaging.cpp +++ b/src/ue/nas/mm/messaging.cpp @@ -105,6 +105,12 @@ static void RemoveCleartextIEs(nas::PlainMmMessage &msg, OctetString &&nasMsgCon EProcRc NasMm::sendNasMessage(const nas::PlainMmMessage &msg) { + if (!m_base->shCtx.hasActiveCell()) + { + m_logger->debug("NAS Transport aborted, no active cell"); + return EProcRc::STAY; + } + if (m_cmState == ECmState::CM_IDLE && !IsInitialNasMessage(msg)) { m_logger->warn("NAS Transport aborted, Service Request is needed for uplink signalling"); diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 0f46d9e8f..36fd5fe22 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -104,8 +104,8 @@ class NasMm void deliverUlTransport(const nas::UlNasTransport &msg); private: /* Registration */ - void sendMobilityRegistration(ERegUpdateCause updateCause); EProcRc sendInitialRegistration(EInitialRegCause regCause); + EProcRc sendMobilityRegistration(ERegUpdateCause updateCause); void receiveRegistrationAccept(const nas::RegistrationAccept &msg); void receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg); void receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg); @@ -149,7 +149,7 @@ class NasMm nas::IE5gsMobileIdentity getOrGeneratePreferredId(); private: /* Service */ - void sendServiceRequest(EServiceReqCause reqCause); + EProcRc sendServiceRequest(EServiceReqCause reqCause); void receiveServiceAccept(const nas::ServiceAccept &msg); void receiveServiceReject(const nas::ServiceReject &msg); diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index fce90ea28..38b7c820f 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -102,7 +102,11 @@ void NasMm::deregistrationRequired(EDeregCause cause) void NasMm::invokeProcedures() { - if (m_procCtl.deregistration) + auto activeCell = m_base->shCtx.currentCell.get(); + + bool hasActiveCell = activeCell.hasValue(); + + if (hasActiveCell && m_procCtl.deregistration) { EProcRc rc = sendDeregistration(*m_procCtl.deregistration); if (rc == EProcRc::OK) @@ -119,7 +123,7 @@ void NasMm::invokeProcedures() return; } - if (m_procCtl.initialRegistration) + if (hasActiveCell && m_procCtl.initialRegistration) { EProcRc rc = sendInitialRegistration(*m_procCtl.initialRegistration); if (rc == EProcRc::OK) @@ -127,17 +131,41 @@ void NasMm::invokeProcedures() m_procCtl.initialRegistration = std::nullopt; m_procCtl.mobilityRegistration = std::nullopt; m_procCtl.serviceRequest = std::nullopt; + return; } else if (rc == EProcRc::CANCEL) { m_procCtl.initialRegistration = std::nullopt; + return; + } + } + + if (hasActiveCell && m_procCtl.mobilityRegistration) + { + EProcRc rc = sendMobilityRegistration(*m_procCtl.mobilityRegistration); + if (rc == EProcRc::OK) + { + m_procCtl.mobilityRegistration = std::nullopt; + m_procCtl.serviceRequest = std::nullopt; + return; + } + else if (rc == EProcRc::CANCEL) + { + m_procCtl.mobilityRegistration = std::nullopt; + return; } return; } - // note1: - // TODO: "the periodic registration update procedure is delayed until the UE returns to - // 5GMM-REGISTERED.NORMAL-SERVICE over 3GPP access." See 5.3.7 + if (hasActiveCell && m_procCtl.serviceRequest) + { + EProcRc rc = sendServiceRequest(*m_procCtl.serviceRequest); + if (rc == EProcRc::OK || rc == EProcRc::CANCEL) + { + m_procCtl.serviceRequest = std::nullopt; + return; + } + } } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 6e28e8ad1..267bb0228 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -115,21 +115,21 @@ EProcRc NasMm::sendInitialRegistration(EInitialRegCause regCause) return EProcRc::OK; } -void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) +EProcRc NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) { if (m_rmState == ERmState::RM_DEREGISTERED) { m_logger->warn("Mobility updating could not be triggered. UE is in RM-DEREGISTERED state."); - return; + return EProcRc::CANCEL; } - if (m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE) + if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) + return EProcRc::STAY; + + if (updateCause == ERegUpdateCause::T3512_EXPIRY && m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE) { if (!isHighPriority() && !hasEmergency()) - { - m_logger->debug("Mobility updating canceled, registered in non allowed service"); - return; - } + return EProcRc::STAY; } // 5.5.1.3.7 Abnormal cases in the UE @@ -141,7 +141,7 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) if (!allowed) { m_logger->debug("Mobility updating canceled, T3346 is running"); - return; + return EProcRc::STAY; } } @@ -163,9 +163,6 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) // lower layers with the 5G-S-TMSI or the registered GUAMI; " updateProvidedGuti(updateCause != ERegUpdateCause::CONFIGURATION_UPDATE); - // Switch state - switchMmState(EMmSubState::MM_REGISTERED_INITIATED_PS); - // Prepare FOR pending field nas::EFollowOnRequest followOn = nas::EFollowOnRequest::FOR_PENDING; @@ -211,14 +208,21 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) // : nas::EDefaultConfiguredNssaiIndication::NOT_CREATED_FROM_DEFAULT_CONFIGURED_NSSAI; // Send the message - sendNasMessage(*request); + auto rc = sendNasMessage(*request); + if (rc != EProcRc::OK) + return rc; m_lastRegistrationRequest = std::move(request); m_lastRegWithoutNsc = m_usim->m_currentNsCtx == nullptr; + // Switch state + switchMmState(EMmSubState::MM_REGISTERED_INITIATED_PS); + // Process timers m_timers->t3510.start(); m_timers->t3502.stop(); m_timers->t3511.stop(); + + return EProcRc::OK; } void NasMm::receiveRegistrationAccept(const nas::RegistrationAccept &msg) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 8db20cc51..ee39d0370 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -14,36 +14,34 @@ namespace nr::ue { -void NasMm::sendServiceRequest(EServiceReqCause reqCause) +EProcRc NasMm::sendServiceRequest(EServiceReqCause reqCause) { - m_logger->debug("Sending Service Request due to [%s]", ToJson(reqCause).str().c_str()); - // "The procedure shall only be initiated by the UE when the following conditions are fulfilled ..." if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED) { m_logger->warn("Service Request canceled, MM specific procedure is ongoing"); - return; + return EProcRc::STAY; } if (m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) { m_logger->debug("Service Request canceled, already in 5GMM-SERVICE-REQUEST-INITIATED"); - return; + return EProcRc::CANCEL; } if (m_storage->uState->get() != E5UState::U1_UPDATED) { m_logger->err("Service Request canceled, UE not in 5U1 UPDATED state"); - return; + return EProcRc::STAY; } Tai currentTai = m_base->shCtx.getCurrentTai(); if (!currentTai.hasValue()) { m_logger->err("Service Request canceled, no active cell exists"); - return; + return EProcRc::STAY; } if (!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) { m_logger->err("Service Request canceled, current TAI is not in the TAI list"); - return; + return EProcRc::CANCEL; } if (m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE) @@ -53,7 +51,7 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) reqCause != EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP && !isHighPriority() && !hasEmergency()) { m_logger->debug("Service Request canceled, registered in non allowed service"); - return; + return EProcRc::CANCEL; } } @@ -67,7 +65,7 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) reqCause != EServiceReqCause::EMERGENCY_FALLBACK && !isHighPriority() && !hasEmergency()) { m_logger->debug("Service Request canceled, T3346 is running"); - return; + return EProcRc::STAY; } } // c) Timer T3346 is running. @@ -79,10 +77,12 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) reqCause != EServiceReqCause::EMERGENCY_FALLBACK) { m_logger->debug("Service Request canceled, T3346 is running"); - return; + return EProcRc::STAY; } } + m_logger->debug("Sending Service Request due to [%s]", ToJson(reqCause).str().c_str()); + updateProvidedGuti(); auto request = std::make_unique(); @@ -174,10 +174,13 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) request->pduSessionStatus->psi = m_sm->getPduSessionStatus(); // Send the message and process the timers - sendNasMessage(*request); + auto rc = sendNasMessage(*request); + if (rc != EProcRc::OK) + return rc; m_lastServiceRequest = std::move(request); m_lastServiceReqCause = reqCause; m_timers->t3517.start(); + switchMmState(EMmSubState::MM_SERVICE_REQUEST_INITIATED_PS); } From 984045f5c872a36fd139d54530e042a2e63fdbaa Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:24:24 +0300 Subject: [PATCH 239/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 44e9892df..99a8cfccf 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -152,7 +152,8 @@ void NasMm::performMmCycle() serviceRequestRequiredForData(); /* Process TAI changes if any */ - if (!nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) + if (currentTai.hasValue() && + !nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) { if (m_rmState == ERmState::RM_REGISTERED) mobilityUpdatingRequired(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); From f08ac05d3993b439831a0dd2224f5e3469f09b2f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:29:00 +0300 Subject: [PATCH 240/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 267bb0228..714ae18d6 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -364,7 +364,10 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) m_nwFeatureSupport = msg.networkFeatureSupport.value_or(nas::IE5gsNetworkFeatureSupport{}); if (sendComplete) + { + m_logger->debug("Sending Registration Complete"); sendNasMessage(nas::RegistrationComplete{}); + } auto regType = m_lastRegistrationRequest->registrationType.registrationType; From ba456243cfdf469b27e45e19a047e0038d0f48d3 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:32:16 +0300 Subject: [PATCH 241/311] L3 RRC/NAS developments --- src/ue/nas/mm/service.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index ee39d0370..4a390f096 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -182,6 +182,8 @@ EProcRc NasMm::sendServiceRequest(EServiceReqCause reqCause) m_timers->t3517.start(); switchMmState(EMmSubState::MM_SERVICE_REQUEST_INITIATED_PS); + + return EProcRc::OK; } void NasMm::receiveServiceAccept(const nas::ServiceAccept &msg) From 4d22e551835f53af1f49413b157d4255f9e8d4b7 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:40:48 +0300 Subject: [PATCH 242/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 4 ---- src/ue/nas/sm/resource.cpp | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 99a8cfccf..1ce872f48 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -147,10 +147,6 @@ void NasMm::performMmCycle() if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); - /* Check for uplink data pending */ - if (m_sm->anyUplinkDataPending() || missingSessionBearer()) - serviceRequestRequiredForData(); - /* Process TAI changes if any */ if (currentTai.hasValue() && !nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index 742d3aa39..9455acd2e 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -64,6 +64,9 @@ void NasSm::handleUplinkStatusChange(int psi, bool isPending) m_logger->debug("Uplink data status changed PSI[%d] pending[%s]", psi, isPending ? "true" : "false"); m_pduSessions[psi]->uplinkPending = isPending; + if (isPending) + m_mm->serviceRequestRequiredForData(); + m_mm->triggerMmCycle(); } From 3c6027ced5570790b6e4a14fb6a616229e0aa27b Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:44:39 +0300 Subject: [PATCH 243/311] L3 RRC/NAS developments --- src/ue/nas/mm/mm.hpp | 2 +- src/ue/nas/mm/transport.cpp | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 36fd5fe22..4c1db0ef1 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -101,7 +101,7 @@ class NasMm private: /* Transport */ void receiveDlNasTransport(const nas::DlNasTransport &msg); - void deliverUlTransport(const nas::UlNasTransport &msg); + EProcRc deliverUlTransport(const nas::UlNasTransport &msg); private: /* Registration */ EProcRc sendInitialRegistration(EInitialRegCause regCause); diff --git a/src/ue/nas/mm/transport.cpp b/src/ue/nas/mm/transport.cpp index 6d2eb7218..54e354027 100644 --- a/src/ue/nas/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -107,7 +107,7 @@ void NasMm::receiveDlNasTransport(const nas::DlNasTransport &msg) } } -void NasMm::deliverUlTransport(const nas::UlNasTransport &msg) +EProcRc NasMm::deliverUlTransport(const nas::UlNasTransport &msg) { // 5.4.5.2.6 Abnormal cases in the UE // "The UE shall not send the UL NAS TRANSPORT message when the UE is in non-allowed area or @@ -126,12 +126,16 @@ void NasMm::deliverUlTransport(const nas::UlNasTransport &msg) msg.payloadContainerType.payloadContainerType == nas::EPayloadContainerType::SMS) { m_logger->err("Ul Nas Transport procedure canceled, UE is not in allowed area"); - return; + return EProcRc::STAY; } } // Send the UL NAS Transport Message - sendNasMessage(msg); + auto rc = sendNasMessage(msg); + if (rc != EProcRc::OK) + return rc; + + return EProcRc::OK; } } // namespace nr::ue From 83563a46c8f1da8e9e7eba2a4e4a2262a2b52add Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:45:53 +0300 Subject: [PATCH 244/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 333553e63..bf0210de1 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -184,20 +184,25 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) void NasMm::handleRrcConnectionSetup() { + // TODO switchCmState(ECmState::CM_CONNECTED); } void NasMm::handleRrcConnectionRelease() { + // TODO switchCmState(ECmState::CM_IDLE); } void NasMm::handleRrcEstablishmentFailure() { + // TODO } void NasMm::handleRadioLinkFailure() { + // TODO + if (m_cmState == ECmState::CM_CONNECTED) { m_logger->err("Radio link failure detected"); From 6ea35744ab3294192228b5bda8ad1bbcdff11e0e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:46:40 +0300 Subject: [PATCH 245/311] L3 RRC/NAS developments --- src/ue/nas/mm/mm.hpp | 1 - src/ue/nas/mm/radio.cpp | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 4c1db0ef1..e87553c82 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -167,7 +167,6 @@ class NasMm void handleRadioLinkFailure(); void handlePaging(const std::vector &tmsiIds); void updateProvidedGuti(bool provide = true); - bool missingSessionBearer(); private: /* Access Control */ bool isHighPriority(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index bf0210de1..221a8e3dd 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -296,14 +296,4 @@ void NasMm::updateProvidedGuti(bool provide) } } -bool NasMm::missingSessionBearer() -{ - // This control is only valid in CM-CONNECTED - if (m_cmState == ECmState::CM_IDLE) - return false; - - // TODO - return false; -} - } // namespace nr::ue \ No newline at end of file From 835180eebf8903d9f8bcf290a46011bcdc34022f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:50:01 +0300 Subject: [PATCH 246/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 2 +- src/ue/nas/sm/base.cpp | 14 -------------- src/ue/nas/sm/resource.cpp | 14 ++++++++++++++ src/ue/nas/sm/sm.hpp | 2 +- src/ue/nas/task.cpp | 4 ---- src/ue/nts.hpp | 1 - 6 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 714ae18d6..a54b70cf1 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -374,7 +374,7 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) if (regType == nas::ERegistrationType::INITIAL_REGISTRATION || regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) { - m_base->nasTask->push(new NmUeNasToNas(NmUeNasToNas::ESTABLISH_INITIAL_SESSIONS)); + m_sm->establishInitialSessions(); } if (regType == nas::ERegistrationType::INITIAL_REGISTRATION) diff --git a/src/ue/nas/sm/base.cpp b/src/ue/nas/sm/base.cpp index 20c5f6d84..c4207df2c 100644 --- a/src/ue/nas/sm/base.cpp +++ b/src/ue/nas/sm/base.cpp @@ -29,18 +29,4 @@ void NasSm::onQuit() // TODO } -void NasSm::establishInitialSessions() -{ - if (m_base->config->initSessions.empty()) - { - m_logger->warn("No initial PDU sessions are configured"); - return; - } - - m_logger->debug("Initial PDU sessions are establishing [%d#]", m_base->config->initSessions.size()); - - for (auto &sess : m_base->config->initSessions) - sendEstablishmentRequest(sess); -} - } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index 9455acd2e..e5566a9fe 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -106,4 +106,18 @@ std::bitset<16> NasSm::getPduSessionStatus() return res; } +void NasSm::establishInitialSessions() +{ + if (m_base->config->initSessions.empty()) + { + m_logger->warn("No initial PDU sessions are configured"); + return; + } + + m_logger->debug("Initial PDU sessions are establishing [%d#]", m_base->config->initSessions.size()); + + for (auto &sess : m_base->config->initSessions) + sendEstablishmentRequest(sess); +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index 5a4831395..ead5a1f53 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -51,6 +51,7 @@ class NasSm bool anyEmergencyUplinkDataPending(); std::bitset<16> getUplinkDataStatus(); std::bitset<16> getPduSessionStatus(); + void establishInitialSessions(); private: /* Transport */ void receiveSmMessage(const nas::SmMessage &msg); @@ -67,7 +68,6 @@ class NasSm void freePduSessionId(int psi); private: /* Session Establishment */ - void establishInitialSessions(); void sendEstablishmentRequest(const SessionConfig &config); void receiveEstablishmentAccept(const nas::PduSessionEstablishmentAccept &msg); void receiveEstablishmentReject(const nas::PduSessionEstablishmentReject &msg); diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index d6335df88..ec9791947 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -75,10 +75,6 @@ void NasTask::onLoop() sm->handleNasEvent(*w); break; } - case NmUeNasToNas::ESTABLISH_INITIAL_SESSIONS: { - sm->establishInitialSessions(); - break; - } default: break; } diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 35aadfdf1..58956ad52 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -172,7 +172,6 @@ struct NmUeNasToNas : NtsMessage { PERFORM_MM_CYCLE, NAS_TIMER_EXPIRE, - ESTABLISH_INITIAL_SESSIONS } present; // NAS_TIMER_EXPIRE From f8107a501cedc11d977f9cc75e43a04036a015c0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:53:16 +0300 Subject: [PATCH 247/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 12 ++++++------ src/ue/nas/sm/resource.cpp | 4 ++-- src/ue/nas/sm/sm.hpp | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index a54b70cf1..c1eb65680 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -371,18 +371,18 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) auto regType = m_lastRegistrationRequest->registrationType.registrationType; - if (regType == nas::ERegistrationType::INITIAL_REGISTRATION || - regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) - { - m_sm->establishInitialSessions(); - } - if (regType == nas::ERegistrationType::INITIAL_REGISTRATION) m_registeredForEmergency = false; else if (regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) m_registeredForEmergency = true; m_logger->info("%s is successful", nas::utils::EnumToString(regType)); + + if (regType == nas::ERegistrationType::INITIAL_REGISTRATION || + regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) + { + m_sm->establishRequiredSessions(); + } } void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg) diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index e5566a9fe..9cfcdecd9 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -106,7 +106,7 @@ std::bitset<16> NasSm::getPduSessionStatus() return res; } -void NasSm::establishInitialSessions() +void NasSm::establishRequiredSessions() { if (m_base->config->initSessions.empty()) { @@ -114,7 +114,7 @@ void NasSm::establishInitialSessions() return; } - m_logger->debug("Initial PDU sessions are establishing [%d#]", m_base->config->initSessions.size()); + //m_logger->debug("Initial PDU sessions are establishing [%d#]", m_base->config->initSessions.size()); for (auto &sess : m_base->config->initSessions) sendEstablishmentRequest(sess); diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index ead5a1f53..c7b0d8d5e 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -51,7 +51,7 @@ class NasSm bool anyEmergencyUplinkDataPending(); std::bitset<16> getUplinkDataStatus(); std::bitset<16> getPduSessionStatus(); - void establishInitialSessions(); + void establishRequiredSessions(); private: /* Transport */ void receiveSmMessage(const nas::SmMessage &msg); From 455524d6d6f078e668b3eb74ee767d3f00687f26 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 18:56:26 +0300 Subject: [PATCH 248/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 6 ++++++ src/ue/nas/mm/register.cpp | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index 38b7c820f..a684ba781 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -166,6 +166,12 @@ void NasMm::invokeProcedures() return; } } + + if (m_mmSubState == EMmSubState::MM_REGISTERED_NORMAL_SERVICE || + m_mmSubState == EMmSubState::MM_REGISTERED_LIMITED_SERVICE) + { + m_sm->establishRequiredSessions(); + } } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index c1eb65680..1fd0bb9da 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -377,12 +377,6 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) m_registeredForEmergency = true; m_logger->info("%s is successful", nas::utils::EnumToString(regType)); - - if (regType == nas::ERegistrationType::INITIAL_REGISTRATION || - regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) - { - m_sm->establishRequiredSessions(); - } } void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg) From e73b1cec630d210635336d6b387f2f5c9e1a50fa Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 19:04:06 +0300 Subject: [PATCH 249/311] L3 RRC/NAS developments --- src/ue.cpp | 4 ++-- src/ue/nas/sm/resource.cpp | 43 +++++++++++++++++++++++++++++++++----- src/ue/nas/sm/sm.hpp | 1 + src/ue/types.hpp | 2 +- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/ue.cpp b/src/ue.cpp index a3f4241d6..fd4db1c7b 100644 --- a/src/ue.cpp +++ b/src/ue.cpp @@ -201,7 +201,7 @@ static nr::ue::UeConfig *ReadConfigYaml() s.isEmergency = yaml::GetBool(sess, "emergency"); - result->initSessions.push_back(s); + result->defaultSessions.push_back(s); } } @@ -317,7 +317,7 @@ static nr::ue::UeConfig *GetConfigByUe(int ueIndex) c->initials = g_refConfig->initials; c->supportedAlgs = g_refConfig->supportedAlgs; c->gnbSearchList = g_refConfig->gnbSearchList; - c->initSessions = g_refConfig->initSessions; + c->defaultSessions = g_refConfig->defaultSessions; c->configureRouting = g_refConfig->configureRouting; c->prefixLogger = g_refConfig->prefixLogger; c->integrityMaxRate = g_refConfig->integrityMaxRate; diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index 9cfcdecd9..b958acee0 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -108,16 +108,49 @@ std::bitset<16> NasSm::getPduSessionStatus() void NasSm::establishRequiredSessions() { - if (m_base->config->initSessions.empty()) + if (m_mm->hasEmergency()) { - m_logger->warn("No initial PDU sessions are configured"); + if (!anyEmergencySession()) + { + SessionConfig config; + config.type = nas::EPduSessionType::IPV4; + config.apn = std::nullopt; + config.sNssai = std::nullopt; + config.isEmergency = true; + sendEstablishmentRequest(config); + } + return; } - //m_logger->debug("Initial PDU sessions are establishing [%d#]", m_base->config->initSessions.size()); + for (auto &config : m_base->config->defaultSessions) + { + if (!anySessionMatches(config)) + sendEstablishmentRequest(config); + } +} + +bool NasSm::anySessionMatches(const SessionConfig &config) +{ + // ACTIVE_PENDING etc. are also included + return std::any_of(m_pduSessions.begin(), m_pduSessions.end(), [&config](auto &ps) { + if (ps->psState == EPsState::INACTIVE) + return false; + + if (config.isEmergency) + return ps->isEmergency; + + if (config.isEmergency != ps->isEmergency) + return false; + if (config.type != ps->sessionType) + return false; + if (config.apn != ps->apn) + return false; + if (config.sNssai != ps->sNssai) + return false; - for (auto &sess : m_base->config->initSessions) - sendEstablishmentRequest(sess); + return true; + }); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index c7b0d8d5e..e82371767 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -52,6 +52,7 @@ class NasSm std::bitset<16> getUplinkDataStatus(); std::bitset<16> getPduSessionStatus(); void establishRequiredSessions(); + bool anySessionMatches(const SessionConfig &config); private: /* Transport */ void receiveSmMessage(const nas::SmMessage &msg); diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 01a9dbd35..e7b0cdeda 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -100,7 +100,7 @@ struct UeConfig std::optional imeiSv{}; SupportedAlgs supportedAlgs{}; std::vector gnbSearchList{}; - std::vector initSessions{}; + std::vector defaultSessions{}; IntegrityMaxDataRateConfig integrityMaxRate{}; /* Read from config file as well, but should be stored in non-volatile From 65cde6c9edda6056b92c6a908537eb2109ec155c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 19:10:13 +0300 Subject: [PATCH 250/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 1ce872f48..79b04c91b 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -157,10 +157,6 @@ void NasMm::performMmCycle() else m_storage->lastVisitedRegisteredTai->set(currentTai); - /* eCall inactivity related */ - if (switchToECallInactivityIfNeeded()) - return; - /* PLMN selection related */ if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH || m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE || @@ -170,6 +166,16 @@ void NasMm::performMmCycle() performPlmnSelection(); } + /* eCall inactivity related */ + if (m_mmSubState != EMmSubState::MM_REGISTERED_PLMN_SEARCH && + m_mmSubState != EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE && + m_mmSubState != EMmSubState::MM_DEREGISTERED_PLMN_SEARCH && + m_mmSubState != EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) + { + if (switchToECallInactivityIfNeeded()) + return; + } + /* Try to start procedures */ invokeProcedures(); } From a720e5e1b6cfae013d0e93b8bd5ceb1e9c242b13 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 20:35:06 +0300 Subject: [PATCH 251/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index a684ba781..aaad75adb 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -103,7 +103,6 @@ void NasMm::deregistrationRequired(EDeregCause cause) void NasMm::invokeProcedures() { auto activeCell = m_base->shCtx.currentCell.get(); - bool hasActiveCell = activeCell.hasValue(); if (hasActiveCell && m_procCtl.deregistration) From c486df5a8b3b9467379173423ac493ecece8de42 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 20:38:32 +0300 Subject: [PATCH 252/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 34 +++++++++++++++++++++++----------- src/ue/nas/mm/sap.cpp | 6 ++++++ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index aaad75adb..ad9e710e2 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -47,6 +47,9 @@ static void AssignCause(std::optional &oldCause, EDeregCause newCau void NasMm::initialRegistrationRequired(EInitialRegCause cause) { + if (m_mmState == EMmState::MM_NULL) + return; + if (m_procCtl.initialRegistration == cause) return; @@ -58,6 +61,9 @@ void NasMm::initialRegistrationRequired(EInitialRegCause cause) void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) { + if (m_mmState == EMmState::MM_NULL) + return; + if (m_procCtl.mobilityRegistration == cause) return; @@ -67,19 +73,11 @@ void NasMm::mobilityUpdatingRequired(ERegUpdateCause cause) triggerMmCycle(); } -void NasMm::serviceRequestRequiredForSignalling() -{ - serviceRequestRequired(EServiceReqCause::IDLE_UPLINK_SIGNAL_PENDING); -} - -void NasMm::serviceRequestRequiredForData() -{ - serviceRequestRequired(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING - : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); -} - void NasMm::serviceRequestRequired(EServiceReqCause cause) { + if (m_mmState == EMmState::MM_NULL) + return; + if (m_procCtl.serviceRequest == cause) return; @@ -91,6 +89,9 @@ void NasMm::serviceRequestRequired(EServiceReqCause cause) void NasMm::deregistrationRequired(EDeregCause cause) { + if (m_mmState == EMmState::MM_NULL) + return; + if (m_procCtl.deregistration == cause) return; @@ -100,6 +101,17 @@ void NasMm::deregistrationRequired(EDeregCause cause) triggerMmCycle(); } +void NasMm::serviceRequestRequiredForSignalling() +{ + serviceRequestRequired(EServiceReqCause::IDLE_UPLINK_SIGNAL_PENDING); +} + +void NasMm::serviceRequestRequiredForData() +{ + serviceRequestRequired(m_cmState == ECmState::CM_CONNECTED ? EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING + : EServiceReqCause::IDLE_UPLINK_DATA_PENDING); +} + void NasMm::invokeProcedures() { auto activeCell = m_base->shCtx.currentCell.get(); diff --git a/src/ue/nas/mm/sap.cpp b/src/ue/nas/mm/sap.cpp index d9850adc6..76ce02bcd 100644 --- a/src/ue/nas/mm/sap.cpp +++ b/src/ue/nas/mm/sap.cpp @@ -15,6 +15,9 @@ namespace nr::ue void NasMm::handleRrcEvent(const NmUeRrcToNas &msg) { + if (m_mmState == EMmState::MM_NULL) + return; + switch (msg.present) { case NmUeRrcToNas::RRC_CONNECTION_SETUP: { @@ -57,6 +60,9 @@ void NasMm::handleRrcEvent(const NmUeRrcToNas &msg) void NasMm::handleNasEvent(const NmUeNasToNas &msg) { + if (m_mmState == EMmState::MM_NULL) + return; + switch (msg.present) { case NmUeNasToNas::PERFORM_MM_CYCLE: From aaeea5102d9864569c70fd2c339c0ea69afeb6f7 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 20:39:29 +0300 Subject: [PATCH 253/311] L3 RRC/NAS developments --- src/ue/nas/sm/sap.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/sm/sap.cpp b/src/ue/nas/sm/sap.cpp index ce5d3c9dd..64edd23bc 100644 --- a/src/ue/nas/sm/sap.cpp +++ b/src/ue/nas/sm/sap.cpp @@ -11,7 +11,6 @@ #include #include -#include #include #include #include @@ -21,6 +20,9 @@ namespace nr::ue void NasSm::handleNasEvent(const NmUeNasToNas &msg) { + if (m_mm->m_mmState == EMmState::MM_NULL) + return; + switch (msg.present) { case NmUeNasToNas::NAS_TIMER_EXPIRE: @@ -33,6 +35,9 @@ void NasSm::handleNasEvent(const NmUeNasToNas &msg) void NasSm::onTimerTick() { + if (m_mm->m_mmState == EMmState::MM_NULL) + return; + int pti = 0; for (auto &pt : m_procedureTransactions) { @@ -44,6 +49,9 @@ void NasSm::onTimerTick() void NasSm::handleUplinkDataRequest(int psi, OctetString &&data) { + if (m_mm->m_mmState == EMmState::MM_NULL) + return; + if (m_pduSessions[psi]->psState != EPsState::ACTIVE) return; From a5a4974ab9a40dd6ddbcad14050a2fdd054c65e7 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 20:58:24 +0300 Subject: [PATCH 254/311] L3 RRC/NAS developments --- src/ue/app/task.cpp | 29 +++++++++++------------------ src/ue/nas/sm/sap.cpp | 22 +++++++++++++++++++++- src/ue/nas/sm/sm.hpp | 1 + src/ue/nas/task.cpp | 12 ++++++++++++ src/ue/nts.hpp | 9 +++++++-- src/ue/rls/task.cpp | 5 +++-- src/utils/nts.hpp | 3 +-- 7 files changed, 56 insertions(+), 25 deletions(-) diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index 85c45883f..738ab9144 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -51,24 +51,6 @@ void UeAppTask::onLoop() switch (msg->msgType) { - case NtsMessageType::UE_RLS_TO_APP: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NmUeRlsToApp::DATA_PDU_DELIVERY: { - auto *tunTask = m_tunTasks[w->psi]; - if (tunTask) - { - auto *m = new NmAppToTun(NmAppToTun::DATA_PDU_DELIVERY); - m->psi = w->psi; - m->data = std::move(w->pdu); - tunTask->push(m); - } - break; - } - } - break; - } case NtsMessageType::UE_TUN_TO_APP: { auto *w = dynamic_cast(msg); switch (w->present) @@ -95,6 +77,17 @@ void UeAppTask::onLoop() setTimer(SWITCH_OFF_TIMER_ID, SWITCH_OFF_DELAY); break; } + case NmUeNasToApp::DOWNLINK_DATA_DELIVERY: { + auto *tunTask = m_tunTasks[w->psi]; + if (tunTask) + { + auto *m = new NmAppToTun(NmAppToTun::DATA_PDU_DELIVERY); + m->psi = w->psi; + m->data = std::move(w->data); + tunTask->push(m); + } + break; + } } break; } diff --git a/src/ue/nas/sm/sap.cpp b/src/ue/nas/sm/sap.cpp index 64edd23bc..1e1265e33 100644 --- a/src/ue/nas/sm/sap.cpp +++ b/src/ue/nas/sm/sap.cpp @@ -49,7 +49,11 @@ void NasSm::onTimerTick() void NasSm::handleUplinkDataRequest(int psi, OctetString &&data) { - if (m_mm->m_mmState == EMmState::MM_NULL) + auto state = m_mm->m_mmSubState; + if (state != EMmSubState::MM_REGISTERED_INITIATED_PS && state != EMmSubState::MM_REGISTERED_NORMAL_SERVICE && + state != EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE && + state != EMmSubState::MM_REGISTERED_LIMITED_SERVICE && state != EMmSubState::MM_DEREGISTERED_INITIATED_PS && + state != EMmSubState::MM_SERVICE_REQUEST_INITIATED_PS) return; if (m_pduSessions[psi]->psState != EPsState::ACTIVE) @@ -81,4 +85,20 @@ void NasSm::handleUplinkDataRequest(int psi, OctetString &&data) } } +void NasSm::handleDownlinkDataRequest(int psi, OctetString &&data) +{ + auto state = m_mm->m_mmSubState; + if (state != EMmSubState::MM_REGISTERED_INITIATED_PS && state != EMmSubState::MM_REGISTERED_NORMAL_SERVICE && + state != EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE && + state != EMmSubState::MM_REGISTERED_LIMITED_SERVICE && state != EMmSubState::MM_DEREGISTERED_INITIATED_PS && + state != EMmSubState::MM_SERVICE_REQUEST_INITIATED_PS) + return; + + auto *w = new NmUeNasToApp(NmUeNasToApp::DOWNLINK_DATA_DELIVERY); + w->psi = psi; + w->data = std::move(data); + + m_base->appTask->push(w); +} + } // namespace nr::ue diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index e82371767..ab9a3bde9 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -93,6 +93,7 @@ class NasSm void handleNasEvent(const NmUeNasToNas &msg); void onTimerTick(); void handleUplinkDataRequest(int psi, OctetString &&data); + void handleDownlinkDataRequest(int psi, OctetString &&data); }; } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index ec9791947..9a6db87bd 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -93,6 +93,18 @@ void NasTask::onLoop() } break; } + case NtsMessageType::UE_RLS_TO_NAS: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NmUeRlsToNas::DATA_PDU_DELIVERY: { + sm->handleDownlinkDataRequest(w->psi, std::move(w->pdu)); + break; + } + } + + break; + } case NtsMessageType::TIMER_EXPIRED: { auto *w = dynamic_cast(msg); int timerId = w->timerId; diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 58956ad52..af63546cf 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -187,8 +187,13 @@ struct NmUeNasToApp : NtsMessage enum PR { PERFORM_SWITCH_OFF, + DOWNLINK_DATA_DELIVERY } present; + // DOWNLINK_DATA_DELIVERY + int psi{}; + OctetString data; + explicit NmUeNasToApp(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_APP), present(present) { } @@ -226,7 +231,7 @@ struct NmUeNasToRls : NtsMessage } }; -struct NmUeRlsToApp : NtsMessage +struct NmUeRlsToNas : NtsMessage { enum PR { @@ -237,7 +242,7 @@ struct NmUeRlsToApp : NtsMessage int psi{}; OctetString pdu{}; - explicit NmUeRlsToApp(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_APP), present(present) + explicit NmUeRlsToNas(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_NAS), present(present) { } }; diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 82d369f22..5e506e555 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -9,6 +9,7 @@ #include "task.hpp" #include +#include #include #include #include @@ -55,10 +56,10 @@ void UeRlsTask::onLoop() break; } case NmUeRlsToRls::DOWNLINK_DATA: { - auto *m = new NmUeRlsToApp(NmUeRlsToApp::DATA_PDU_DELIVERY); + auto *m = new NmUeRlsToNas(NmUeRlsToNas::DATA_PDU_DELIVERY); m->psi = w->psi; m->pdu = std::move(w->data); - m_base->appTask->push(m); + m_base->nasTask->push(m); break; } case NmUeRlsToRls::DOWNLINK_RRC: { diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 010bee138..405306239 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -45,7 +45,6 @@ enum class NtsMessageType GNB_NGAP_TO_GTP, GNB_SCTP, - UE_APP_TO_RLS, UE_APP_TO_TUN, UE_APP_TO_NAS, UE_TUN_TO_APP, @@ -55,7 +54,7 @@ enum class NtsMessageType UE_RRC_TO_RRC, UE_NAS_TO_NAS, UE_RLS_TO_RRC, - UE_RLS_TO_APP, + UE_RLS_TO_NAS, UE_RLS_TO_RLS, UE_NAS_TO_APP, UE_NAS_TO_RLS, From 4d152247f293d39a3dba19525c499ed13497e8e0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:00:10 +0300 Subject: [PATCH 255/311] L3 RRC/NAS developments --- src/ue/nas/sm/sap.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ue/nas/sm/sap.cpp b/src/ue/nas/sm/sap.cpp index 1e1265e33..6c1270367 100644 --- a/src/ue/nas/sm/sap.cpp +++ b/src/ue/nas/sm/sap.cpp @@ -87,6 +87,9 @@ void NasSm::handleUplinkDataRequest(int psi, OctetString &&data) void NasSm::handleDownlinkDataRequest(int psi, OctetString &&data) { + if (m_mm->m_cmState == ECmState::CM_IDLE) + return; + auto state = m_mm->m_mmSubState; if (state != EMmSubState::MM_REGISTERED_INITIATED_PS && state != EMmSubState::MM_REGISTERED_NORMAL_SERVICE && state != EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE && From 3da9ec30c1d9eda23c92d61c05a4f03e36aae842 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:12:23 +0300 Subject: [PATCH 256/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 79b04c91b..02822072c 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -143,20 +143,6 @@ void NasMm::performMmCycle() return; } - /* Automatic initial registration */ - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) - initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); - - /* Process TAI changes if any */ - if (currentTai.hasValue() && - !nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) - { - if (m_rmState == ERmState::RM_REGISTERED) - mobilityUpdatingRequired(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); - } - else - m_storage->lastVisitedRegisteredTai->set(currentTai); - /* PLMN selection related */ if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH || m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE || @@ -178,6 +164,20 @@ void NasMm::performMmCycle() /* Try to start procedures */ invokeProcedures(); + + /* Automatic initial registration */ + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) + initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); + + /* Process TAI changes if any */ + if (currentTai.hasValue() && + !nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) + { + if (m_rmState == ERmState::RM_REGISTERED) + mobilityUpdatingRequired(ERegUpdateCause::ENTER_UNLISTED_TRACKING_AREA); + } + else + m_storage->lastVisitedRegisteredTai->set(currentTai); } void NasMm::switchMmState(EMmSubState subState) From bd1e2222832387ad275800b8d94b6fd0c1a54a5e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:20:32 +0300 Subject: [PATCH 257/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 6 +++++- src/ue/nas/mm/radio.cpp | 20 ++++++++++++++++++++ src/ue/nas/mm/timer.cpp | 12 ++++++++++++ src/utils/common_types.cpp | 10 ++++++++++ src/utils/common_types.hpp | 5 +++++ 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 02822072c..d5cb736b4 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -165,9 +165,13 @@ void NasMm::performMmCycle() /* Try to start procedures */ invokeProcedures(); - /* Automatic initial registration */ + /* Initial registration controls */ if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE && hasEmergency()) + initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION && hasEmergency()) + initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); /* Process TAI changes if any */ if (currentTai.hasValue() && diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 221a8e3dd..1f45110d5 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -149,6 +149,15 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) { mobilityUpdatingRequired(ERegUpdateCause::TAI_CHANGE_IN_ATT_UPD); } + + // "shall initiate an initial registration procedure when the tracking area of the serving cell has changed, if + // timer T3346 is not running, the PLMN identity of the new cell is not in one of the forbidden PLMN lists and + // the tracking area of the new cell is not in one of the lists of 5GS forbidden tracking areas" + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION && !m_timers->t3346.isRunning() && + currentCell.category == ECellCategory::SUITABLE_CELL) + { + initialRegistrationRequired(EInitialRegCause::TAI_CHANGE_IN_ATT_REG); + } } if (currentCell.hasValue() && prevTai.plmn != currentTai.plmn) @@ -163,6 +172,17 @@ void NasMm::handleActiveCellChange(const Tai &prevTai) { mobilityUpdatingRequired(ERegUpdateCause::PLMN_CHANGE_IN_ATT_UPD); } + + // "shall initiate an initial registration procedure when entering a new PLMN, if timer T3346 is running and the + // new PLMN is not equivalent to the PLMN where the UE started timer T3346, the PLMN identity of the new cell is + // not in the forbidden PLMN lists and the tracking area is not in one of the lists of 5GS forbidden tracking + // areas" + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION && m_timers->t3346.isRunning() && + !m_storage->equivalentPlmnList->contains(currentTai.plmn) && + currentCell.category == ECellCategory::SUITABLE_CELL) + { + initialRegistrationRequired(EInitialRegCause::PLMN_CHANGE_IN_ATT_REG); + } } if (m_mmState == EMmState::MM_REGISTERED) diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index ea3641f99..da0690583 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -35,6 +35,11 @@ void NasMm::onTimerExpire(UeTimer &timer) logExpired(); mobilityUpdatingRequired(ERegUpdateCause::T3346_EXPIRY_IN_ATT_UPD); } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION) + { + logExpired(); + initialRegistrationRequired(EInitialRegCause::T3346_EXPIRY_IN_ATT_REG); + } break; } case 3502: { @@ -44,6 +49,8 @@ void NasMm::onTimerExpire(UeTimer &timer) logExpired(); resetRegAttemptCounter(); + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION) + initialRegistrationRequired(EInitialRegCause::T3502_EXPIRY_IN_ATT_REG); if (m_mmSubState == EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE) mobilityUpdatingRequired(ERegUpdateCause::T3502_EXPIRY_IN_ATT_UPD); } @@ -87,6 +94,11 @@ void NasMm::onTimerExpire(UeTimer &timer) logExpired(); mobilityUpdatingRequired(ERegUpdateCause::T3511_EXPIRY_IN_ATT_UPD); } + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION) + { + logExpired(); + initialRegistrationRequired(EInitialRegCause::T3511_EXPIRY_IN_ATT_REG); + } break; } case 3512: { diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index fd68c697b..2ab774cc6 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -155,6 +155,16 @@ Json ToJson(const EInitialRegCause &v) return "DUE-TO-DEREGISTRATION"; case EInitialRegCause::DUE_TO_SERVICE_REJECT: return "DUE-TO-SERVICE_REJECT"; + case EInitialRegCause::TAI_CHANGE_IN_ATT_REG: + return "TAI-CHANGE-IN-ATT-REG"; + case EInitialRegCause::PLMN_CHANGE_IN_ATT_REG: + return "PLMN-CHANGE-IN-ATT-REG"; + case EInitialRegCause::T3346_EXPIRY_IN_ATT_REG: + return "T3346-EXPIRY-IN-ATT-REG"; + case EInitialRegCause::T3502_EXPIRY_IN_ATT_REG: + return "T3502-EXPIRY-IN-ATT-REG"; + case EInitialRegCause::T3511_EXPIRY_IN_ATT_REG: + return "T3511-EXPIRY-IN-ATT-REG"; default: return "?"; } diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index e4c9ccaea..e50fdf195 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -140,6 +140,11 @@ enum class EInitialRegCause T3346_EXPIRY, DUE_TO_DEREGISTRATION, DUE_TO_SERVICE_REJECT, + TAI_CHANGE_IN_ATT_REG, + PLMN_CHANGE_IN_ATT_REG, + T3346_EXPIRY_IN_ATT_REG, + T3502_EXPIRY_IN_ATT_REG, + T3511_EXPIRY_IN_ATT_REG, }; struct GlobalNci From 30140d19e4f5fa6f27c51aa2ba6ada654be194be Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:21:15 +0300 Subject: [PATCH 258/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index d5cb736b4..f81228ce1 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -172,6 +172,8 @@ void NasMm::performMmCycle() initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION && hasEmergency()) initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_SUPI && hasEmergency()) + initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); /* Process TAI changes if any */ if (currentTai.hasValue() && From e44c83d41b21e2eefc9a1aad301bc4e87ed4aec0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:30:28 +0300 Subject: [PATCH 259/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 1fd0bb9da..4c8af88bb 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -23,6 +23,8 @@ EProcRc NasMm::sendInitialRegistration(EInitialRegCause regCause) return EProcRc::CANCEL; } + if (m_mmState == EMmState::MM_REGISTERED_INITIATED) + return EProcRc::CANCEL; if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) return EProcRc::STAY; @@ -123,6 +125,8 @@ EProcRc NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) return EProcRc::CANCEL; } + if (m_mmState == EMmState::MM_REGISTERED_INITIATED) + return EProcRc::CANCEL; if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) return EProcRc::STAY; From cfeae3692d89b21aa6723790a9395bd9e613049d Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:36:55 +0300 Subject: [PATCH 260/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 16 +++++++++++----- src/ue/nas/mm/radio.cpp | 3 +++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index f81228ce1..9638e918f 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -168,13 +168,19 @@ void NasMm::performMmCycle() /* Initial registration controls */ if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && !m_timers->t3346.isRunning()) initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE && hasEmergency()) - initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION && hasEmergency()) - initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); - if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_SUPI && hasEmergency()) + else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && hasEmergency()) initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); + if (hasEmergency()) + { + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE || + m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION || + m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_SUPI || + m_mmSubState == EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE || + m_mmSubState == EMmSubState::MM_REGISTERED_LIMITED_SERVICE) + initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); + } + /* Process TAI changes if any */ if (currentTai.hasValue() && !nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 1f45110d5..7888871b7 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -248,6 +248,9 @@ void NasMm::localReleaseConnection() void NasMm::handlePaging(const std::vector &tmsiIds) { + if (m_rmState != ERmState::RM_REGISTERED) + return; + auto guti = m_storage->storedGuti->get(); if (guti.type == nas::EIdentityType::NO_IDENTITY) From c4b82c56089da9f54329eab67d53a982521adca8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:37:31 +0300 Subject: [PATCH 261/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 9638e918f..7af732fa5 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -170,8 +170,7 @@ void NasMm::performMmCycle() initialRegistrationRequired(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE && hasEmergency()) initialRegistrationRequired(EInitialRegCause::EMERGENCY_SERVICES); - - if (hasEmergency()) + else if (hasEmergency()) { if (m_mmSubState == EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE || m_mmSubState == EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION || From 30216be91eced9c91704901074e2c27fc17676c9 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:47:07 +0300 Subject: [PATCH 262/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 12 +++++++++++- src/ue/nas/mm/dereg.cpp | 18 +++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 7af732fa5..564f119f9 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -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})) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 23130a96d..c1a58d9c3 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -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(); From 8582ab9ca70f276fa2ae93221ceaa02a7d03dfd8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:50:30 +0300 Subject: [PATCH 263/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 2 ++ src/ue/nas/mm/radio.cpp | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 564f119f9..0c74d8a40 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -408,6 +408,8 @@ void NasMm::onSwitchOn() void NasMm::onSimInsertion() { resetRegAttemptCounter(); + + switchMmState(EMmSubState::MM_DEREGISTERED_PS); } void NasMm::onSwitchOff() diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 7888871b7..62b428bec 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -248,13 +248,14 @@ void NasMm::localReleaseConnection() void NasMm::handlePaging(const std::vector &tmsiIds) { - if (m_rmState != ERmState::RM_REGISTERED) + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ECALL_INACTIVE) return; auto guti = m_storage->storedGuti->get(); if (guti.type == nas::EIdentityType::NO_IDENTITY) return; + bool tmsiMatches = false; for (auto &tmsi : tmsiIds) { From 89f562902145694b02eca8731eeda3438fc066b2 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:54:53 +0300 Subject: [PATCH 264/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 0c74d8a40..187904024 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -190,6 +190,14 @@ void NasMm::performMmCycle() performLocalDeregistration(); } + if (m_mmSubState == EMmSubState::MM_DEREGISTERED_ECALL_INACTIVE && hasEmergency()) + { + // "If the UE receives a request from upper layers to establish an eCall over IMS, the UE enters state + // 5GMM-DEREGISTERED.ATTEMPTING-REGISTRATION. The UE then uses the relevant 5GMM and 5GSM procedures to + // establish the eCall over IMS at the earliest opportunity" + switchMmState(EMmSubState::MM_DEREGISTERED_ATTEMPTING_REGISTRATION); + } + /* Process TAI changes if any */ if (currentTai.hasValue() && !nas::utils::TaiListContains(m_storage->taiList->get(), nas::VTrackingAreaIdentity{currentTai})) From 21e73b5e5ad8fd5b3a423b65b64838461462a5c5 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 23 May 2021 21:58:34 +0300 Subject: [PATCH 265/311] L3 RRC/NAS developments --- src/ue/nas/mm/dereg.cpp | 2 ++ src/ue/nas/mm/register.cpp | 2 ++ src/ue/nas/mm/service.cpp | 10 ++++++++++ 3 files changed, 14 insertions(+) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index c1a58d9c3..456a705e3 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -40,6 +40,8 @@ EProcRc NasMm::sendDeregistration(EDeregCause deregCause) if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) return EProcRc::CANCEL; + if (m_mmSubState == EMmSubState::MM_REGISTERED_UPDATE_NEEDED) + return EProcRc::STAY; // 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." diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 4c8af88bb..9cf92f490 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -27,6 +27,8 @@ EProcRc NasMm::sendInitialRegistration(EInitialRegCause regCause) return EProcRc::CANCEL; if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) return EProcRc::STAY; + if (m_mmSubState == EMmSubState::MM_REGISTERED_UPDATE_NEEDED) + return EProcRc::STAY; bool isEmergencyReg = regCause == EInitialRegCause::EMERGENCY_SERVICES; diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 4a390f096..63f4491f2 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -55,6 +55,16 @@ EProcRc NasMm::sendServiceRequest(EServiceReqCause reqCause) } } + if (m_mmSubState == EMmSubState::MM_REGISTERED_UPDATE_NEEDED) + { + if (reqCause != EServiceReqCause::IDLE_PAGING && + reqCause != EServiceReqCause::CONNECTED_3GPP_NOTIFICATION_N3GPP && + reqCause != EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP) + { + return EProcRc::STAY; + } + } + // 5.6.1.7 Abnormal cases in the UE // a) Timer T3525 if (m_timers->t3525.isRunning()) From becf4e675e3c1e202a87af26bd6942801c355d50 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 19:59:45 +0300 Subject: [PATCH 266/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index ee8aef2f7..5592ceff1 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -110,6 +110,7 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) // for (auto &pduSession : m_base->appTask->m_pduSessions) // if (pduSession.has_value()) // pduSessions.push_back(ToJson(*pduSession)); + // TODO: include SST, SD, DNN as well.. Json json = Json::Obj({ {"cm-state", ToJson(m_base->nasTask->mm->m_cmState)}, From a3362af59cad35ec5bf0e663ef96aaaaf06d1c91 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 20:06:18 +0300 Subject: [PATCH 267/311] L3 RRC/NAS developments --- src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/radio.cpp | 7 +++++++ src/ue/nas/mm/sap.cpp | 4 ++++ src/ue/nts.hpp | 3 ++- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index e87553c82..d7625a804 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -165,6 +165,7 @@ class NasMm void handleRrcConnectionRelease(); void handleRrcEstablishmentFailure(); void handleRadioLinkFailure(); + void handleRrcFallbackIndication(); void handlePaging(const std::vector &tmsiIds); void updateProvidedGuti(bool provide = true); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 62b428bec..f677a06c3 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -320,4 +320,11 @@ void NasMm::updateProvidedGuti(bool provide) } } +void NasMm::handleRrcFallbackIndication() +{ + // TODO: RRC does not send this indication yet + + +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/mm/sap.cpp b/src/ue/nas/mm/sap.cpp index 76ce02bcd..ff0f0f54c 100644 --- a/src/ue/nas/mm/sap.cpp +++ b/src/ue/nas/mm/sap.cpp @@ -55,6 +55,10 @@ void NasMm::handleRrcEvent(const NmUeRrcToNas &msg) handleRrcEstablishmentFailure(); break; } + case NmUeRrcToNas::RRC_FALLBACK_INDICATION: { + handleRrcFallbackIndication(); + break; + } } } diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index af63546cf..959502ea8 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -70,7 +70,8 @@ struct NmUeRrcToNas : NtsMessage RRC_ESTABLISHMENT_FAILURE, RADIO_LINK_FAILURE, PAGING, - ACTIVE_CELL_CHANGED + ACTIVE_CELL_CHANGED, + RRC_FALLBACK_INDICATION, } present; // NAS_DELIVERY From 53ae415b4e7abeae6bc525491421fe2026aab3e8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 20:20:34 +0300 Subject: [PATCH 268/311] L3 RRC/NAS developments --- src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/radio.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index d7625a804..4fed79f80 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -190,6 +190,7 @@ class NasMm void serviceRequestRequired(EServiceReqCause cause); void deregistrationRequired(EDeregCause cause); void invokeProcedures(); + bool hasPendingProcedure(); private: /* Service Access Point */ void handleRrcEvent(const NmUeRrcToNas &msg); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index f677a06c3..46c8f18d9 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -324,7 +324,33 @@ void NasMm::handleRrcFallbackIndication() { // TODO: RRC does not send this indication yet + if (m_cmState == ECmState::CM_IDLE) + { + m_logger->err("RRC fallback indication in CM-IDLE"); + return; + } + + bool pendingProc = hasPendingProcedure(); + bool pendingData = m_sm->anyUplinkDataPending(); // TODO: look for only resources are already established (5.3.1.2) + + switchCmState(ECmState::CM_IDLE); + if (!pendingProc) + { + if (pendingData) + serviceRequestRequired(EServiceReqCause::FALLBACK_INDICATION); + else + mobilityUpdatingRequired(ERegUpdateCause::FALLBACK_INDICATION); + } + else + { + if (m_procCtl.initialRegistration || m_procCtl.deregistration) + (void)0; + else if (m_procCtl.mobilityRegistration) + mobilityUpdatingRequired(ERegUpdateCause::FALLBACK_INDICATION); + else + serviceRequestRequired(EServiceReqCause::FALLBACK_INDICATION); + } } } // namespace nr::ue \ No newline at end of file From ac4a0f2807c873386fe2fe5f3f32c243a6c4aac2 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 20:22:20 +0300 Subject: [PATCH 269/311] L3 RRC/NAS developments --- src/ue/nas/mm/ecall.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/ue/nas/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp index dea4a5262..51c361cc9 100644 --- a/src/ue/nas/mm/ecall.cpp +++ b/src/ue/nas/mm/ecall.cpp @@ -61,13 +61,6 @@ bool NasMm::startECallInactivityIfNeeded() m_timers->t3511.stop(); m_timers->t3512.stop(); - // Spec says if the UE is currently registered to the network for 5GS services, but it also says procedure shall - // be started if ... and 5GMM-REGISTERED .... - if (m_rmState != ERmState::RM_REGISTERED) - { - // Therefore just assert that the UE is registered - throw std::runtime_error("UE MM eCall - MM and RM state inconsistent"); - } // And perform de-registration. // NOTE: The items c) and d) is performed after de-registration by the other function, therefore we are just // performing de-registration for now. From d71d6d9749b676d2f06d162c80609538ab588701 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 20:25:10 +0300 Subject: [PATCH 270/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 2 +- src/ue/nas/sm/resource.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 46c8f18d9..6912d3d4f 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -331,7 +331,7 @@ void NasMm::handleRrcFallbackIndication() } bool pendingProc = hasPendingProcedure(); - bool pendingData = m_sm->anyUplinkDataPending(); // TODO: look for only resources are already established (5.3.1.2) + bool pendingData = m_sm->anyUplinkDataPending(); switchCmState(ECmState::CM_IDLE); diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index b958acee0..86783785e 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -72,6 +72,8 @@ void NasSm::handleUplinkStatusChange(int psi, bool isPending) bool NasSm::anyUplinkDataPending() { + // TODO: look for only resources are already established etc + auto status = getUplinkDataStatus(); for (int i = 1; i < 16; i++) if (status[i]) From 5476d10a573c8166e8f17b78f904d278c030cd7b Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 20:28:58 +0300 Subject: [PATCH 271/311] L3 RRC/NAS developments --- src/ue/nas/mm/proc.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ue/nas/mm/proc.cpp b/src/ue/nas/mm/proc.cpp index ad9e710e2..b98086982 100644 --- a/src/ue/nas/mm/proc.cpp +++ b/src/ue/nas/mm/proc.cpp @@ -185,4 +185,20 @@ void NasMm::invokeProcedures() } } +bool NasMm::hasPendingProcedure() +{ + if (m_procCtl.initialRegistration) + return true; + if (m_procCtl.mobilityRegistration) + return true; + if (m_procCtl.serviceRequest) + return true; + if (m_procCtl.deregistration) + return true; + + // TODO: Check for SM sublayer, (and other stacks in the future such as SMS) because they are transported over MM. + // NOTE: Other MM common procedures are ignored. (Except UL/DL NAS Transport) + return false; +} + } // namespace nr::ue \ No newline at end of file From 73a6e4b8de9566110dac9c077780655f089f995c Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 20:30:05 +0300 Subject: [PATCH 272/311] L3 RRC/NAS developments --- src/ue/nas/mm/base.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 187904024..69dbb1d10 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -161,6 +161,11 @@ void NasMm::performMmCycle() if (switchToECallInactivityIfNeeded()) return; } + if (m_mmState == EMmState::MM_REGISTERED) + { + if (startECallInactivityIfNeeded()) + return; + } /* Try to start procedures */ invokeProcedures(); From edf78737a12203a4f7e1e488c21a1f9f71e71067 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 20:32:37 +0300 Subject: [PATCH 273/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 6912d3d4f..b0fddc217 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -217,6 +217,19 @@ void NasMm::handleRrcConnectionRelease() void NasMm::handleRrcEstablishmentFailure() { // TODO + + if (m_mmState == EMmState::MM_REGISTERED_INITIATED) + { + switchMmState(m_rmState == ERmState::RM_REGISTERED ? EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE + : EMmSubState::MM_DEREGISTERED_INITIAL_REGISTRATION_NEEDED); + } + else if (m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) + { + switchMmState(EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE); + } + else if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED) + { + } } void NasMm::handleRadioLinkFailure() From 1c5f69485802ed3326deca58a9d80ddd83db8635 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 24 May 2021 20:32:59 +0300 Subject: [PATCH 274/311] L3 RRC/NAS developments --- src/ue/nas/mm/radio.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index b0fddc217..2bfc8a772 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -218,6 +218,8 @@ void NasMm::handleRrcEstablishmentFailure() { // TODO + m_logger->err("RRC Establishment failure"); + if (m_mmState == EMmState::MM_REGISTERED_INITIATED) { switchMmState(m_rmState == ERmState::RM_REGISTERED ? EMmSubState::MM_REGISTERED_ATTEMPTING_REGISTRATION_UPDATE From 6974ebddde303812633e39a072e1a2dcc78d4dbc Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 25 May 2021 21:55:38 +0300 Subject: [PATCH 275/311] bits.hpp compile fix --- src/ue/nas/mm/register.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 9cf92f490..d3dd746c6 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -190,6 +190,20 @@ EProcRc NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) ? nas::ENgRanRadioCapabilityUpdate::NEEDED : nas::ENgRanRadioCapabilityUpdate::NOT_NEEDED; + // Assign uplink data status + if (updateCause == ERegUpdateCause::FALLBACK_INDICATION || updateCause == ERegUpdateCause::CONNECTION_RECOVERY) + { + request->uplinkDataStatus = nas::IEUplinkDataStatus{}; + request->uplinkDataStatus->psi = m_sm->getUplinkDataStatus(); + } + + // Assign PDU session status + if (m_cmState == ECmState::CM_IDLE) + { + request->pduSessionStatus = nas::IEPduSessionStatus{}; + request->pduSessionStatus->psi = m_sm->getPduSessionStatus(); + } + // MM capability should be included if it is not a periodic registration if (updateCause != ERegUpdateCause::T3512_EXPIRY) { From 28675115a96be59bb9f713ad430d417b4d5e8214 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 25 May 2021 21:56:03 +0300 Subject: [PATCH 276/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index d3dd746c6..66f3c4943 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -190,19 +190,7 @@ EProcRc NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) ? nas::ENgRanRadioCapabilityUpdate::NEEDED : nas::ENgRanRadioCapabilityUpdate::NOT_NEEDED; - // Assign uplink data status - if (updateCause == ERegUpdateCause::FALLBACK_INDICATION || updateCause == ERegUpdateCause::CONNECTION_RECOVERY) - { - request->uplinkDataStatus = nas::IEUplinkDataStatus{}; - request->uplinkDataStatus->psi = m_sm->getUplinkDataStatus(); - } - // Assign PDU session status - if (m_cmState == ECmState::CM_IDLE) - { - request->pduSessionStatus = nas::IEPduSessionStatus{}; - request->pduSessionStatus->psi = m_sm->getPduSessionStatus(); - } // MM capability should be included if it is not a periodic registration if (updateCause != ERegUpdateCause::T3512_EXPIRY) From 5f85adca28472dd729345fd709a281f5a0701893 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 25 May 2021 21:56:08 +0300 Subject: [PATCH 277/311] L3 RRC/NAS developments --- src/ue/nas/mm/register.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index 66f3c4943..d3dd746c6 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -190,7 +190,19 @@ EProcRc NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) ? nas::ENgRanRadioCapabilityUpdate::NEEDED : nas::ENgRanRadioCapabilityUpdate::NOT_NEEDED; + // Assign uplink data status + if (updateCause == ERegUpdateCause::FALLBACK_INDICATION || updateCause == ERegUpdateCause::CONNECTION_RECOVERY) + { + request->uplinkDataStatus = nas::IEUplinkDataStatus{}; + request->uplinkDataStatus->psi = m_sm->getUplinkDataStatus(); + } + // Assign PDU session status + if (m_cmState == ECmState::CM_IDLE) + { + request->pduSessionStatus = nas::IEPduSessionStatus{}; + request->pduSessionStatus->psi = m_sm->getPduSessionStatus(); + } // MM capability should be included if it is not a periodic registration if (updateCause != ERegUpdateCause::T3512_EXPIRY) From ac01807983940a4bb88a437a24f8e7f37d941c04 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 25 May 2021 21:58:40 +0300 Subject: [PATCH 278/311] L3 RRC/NAS developments --- src/utils/octet_string.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/octet_string.hpp b/src/utils/octet_string.hpp index b40179cf4..f1ff225b1 100644 --- a/src/utils/octet_string.hpp +++ b/src/utils/octet_string.hpp @@ -15,7 +15,6 @@ #include #include -// TODO: implement MemoryBlock and use it for decoders etc. instead of this. class OctetString { private: From 2710380e5e34c9523988578195dd10a56b5a9ff4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 25 May 2021 21:59:11 +0300 Subject: [PATCH 279/311] L3 RRC/NAS developments --- src/ue/tun/task.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/tun/task.cpp b/src/ue/tun/task.cpp index a539ebbee..e2851e810 100644 --- a/src/ue/tun/task.cpp +++ b/src/ue/tun/task.cpp @@ -15,7 +15,7 @@ #include // TODO: May be reduced to MTU 1500 -#define RECEIVER_BUFFER_SIZE 16000 +#define RECEIVER_BUFFER_SIZE 8000 struct ReceiverArgs { From 6ae860cad63544731e5165ddfced6b5312a6425f Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 25 May 2021 22:21:29 +0300 Subject: [PATCH 280/311] L3 RRC/NAS developments --- config/custom-ue.yaml | 1 - config/free5gc-ue.yaml | 1 - config/open5gs-ue.yaml | 2 -- src/ue.cpp | 2 +- 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/config/custom-ue.yaml b/config/custom-ue.yaml index 2600b37ae..4545e6a24 100644 --- a/config/custom-ue.yaml +++ b/config/custom-ue.yaml @@ -29,7 +29,6 @@ sessions: slice: sst: 1 sd: 1 - emergency: false # Configured NSSAI for this UE by HPLMN configured-nssai: diff --git a/config/free5gc-ue.yaml b/config/free5gc-ue.yaml index 9f2e7c8f1..28b0baa9c 100644 --- a/config/free5gc-ue.yaml +++ b/config/free5gc-ue.yaml @@ -29,7 +29,6 @@ sessions: slice: sst: 0x01 sd: 0x010203 - emergency: false # Configured NSSAI for this UE by HPLMN configured-nssai: diff --git a/config/open5gs-ue.yaml b/config/open5gs-ue.yaml index d6779ed65..49f60824b 100644 --- a/config/open5gs-ue.yaml +++ b/config/open5gs-ue.yaml @@ -28,8 +28,6 @@ sessions: apn: 'internet' slice: sst: 1 - sd: 1 - emergency: false # Configured NSSAI for this UE by HPLMN configured-nssai: diff --git a/src/ue.cpp b/src/ue.cpp index fd4db1c7b..8eb651667 100644 --- a/src/ue.cpp +++ b/src/ue.cpp @@ -199,7 +199,7 @@ static nr::ue::UeConfig *ReadConfigYaml() else throw std::runtime_error("Invalid PDU session type: " + type); - s.isEmergency = yaml::GetBool(sess, "emergency"); + s.isEmergency = false; result->defaultSessions.push_back(s); } From 0cad0976437104c8788549a74d59c19cf651126c Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 19:50:20 +0300 Subject: [PATCH 281/311] L3 RRC/NAS developments --- src/lib/nas/base.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/nas/base.cpp b/src/lib/nas/base.cpp index 07dce6c7e..8d288561e 100644 --- a/src/lib/nas/base.cpp +++ b/src/lib/nas/base.cpp @@ -36,7 +36,7 @@ void nas::EncodeBcdString(OctetString &stream, const std::string &bcd, size_t oc if (skipFirst) { - for (int i = bcd.length(); i >= 1; i--) + for (size_t i = bcd.length(); i >= 1; i--) halfOctets[i] = halfOctets[i - 1]; halfOctets[0] = skippedHalfOctet & 0xF; } From ae86138d83ce78630f7853b54e66df59a5c6fe49 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 20:11:14 +0300 Subject: [PATCH 282/311] L3 RRC/NAS developments --- config/open5gs-ue.yaml | 5 +++++ src/ue/nas/mm/config.cpp | 12 ++++++------ src/ue/nas/mm/dereg.cpp | 4 ++-- src/ue/nas/mm/register.cpp | 22 +++++++++++----------- src/ue/nas/mm/slice.cpp | 22 +++++++++++----------- src/ue/nas/storage.cpp | 19 +++++++++++++++++-- src/ue/nas/storage.hpp | 6 ++++++ src/ue/nas/usim/usim.cpp | 3 --- src/ue/nas/usim/usim.hpp | 7 ------- 9 files changed, 58 insertions(+), 42 deletions(-) diff --git a/config/open5gs-ue.yaml b/config/open5gs-ue.yaml index 49f60824b..dbfa1f477 100644 --- a/config/open5gs-ue.yaml +++ b/config/open5gs-ue.yaml @@ -18,6 +18,11 @@ imei: '356938035643803' # IMEISV number of the device. It is used if no SUPI and IMEI is provided imeiSv: '4370816125816151' +# Other USIM (Universal Subscriber Identity Module) Parameters +highPriority: false +eCallOnly: false +emergencyIndication: false + # List of gNB IP addresses for Radio Link Simulation gnbSearchList: - 127.0.0.1 diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index 089e8e84a..ea09503d8 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -118,7 +118,7 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms if (msg.allowedNssai.has_value()) { hasNewConfig = true; - m_usim->m_allowedNssai = nas::utils::NssaiTo(*msg.allowedNssai); + m_storage->allowedNssai->set(nas::utils::NssaiTo(*msg.allowedNssai)); } // "If the UE receives a new configured NSSAI in the CONFIGURATION UPDATE COMMAND message, the UE shall consider the @@ -128,7 +128,7 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms if (msg.configuredNssai.has_value()) { hasNewConfig = true; - m_usim->m_configuredNssai = nas::utils::NssaiTo(*msg.configuredNssai); + m_storage->configuredNssai->set(nas::utils::NssaiTo(*msg.configuredNssai)); } // "If the UE receives the Network slicing indication IE in the CONFIGURATION UPDATE COMMAND message with the @@ -149,13 +149,13 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms hasNewConfig = true; for (auto &rejectedSlice : msg.rejectedNssai->list) { - SingleSlice slice{}; + SingleSlice slice; slice.sst = rejectedSlice.sst; slice.sd = rejectedSlice.sd; - auto &list = rejectedSlice.cause == nas::ERejectedSNssaiCause::NA_IN_PLMN ? m_usim->m_rejectedNssaiInPlmn - : m_usim->m_rejectedNssaiInTa; - list.addIfNotExists(slice); + auto &nssai = rejectedSlice.cause == nas::ERejectedSNssaiCause::NA_IN_PLMN ? m_storage->rejectedNssaiInPlmn + : m_storage->rejectedNssaiInTa; + nssai->mutate([slice](auto &value) { value.addIfNotExists(slice); }); } } diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 456a705e3..af6aa5887 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -208,8 +208,8 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi // "Upon sending a DEREGISTRATION ACCEPT message, the UE shall delete the rejected NSSAI as specified in // subclause 4.6.2.2." - m_usim->m_rejectedNssaiInTa = {}; - m_usim->m_rejectedNssaiInPlmn = {}; + m_storage->rejectedNssaiInTa->clear(); + m_storage->rejectedNssaiInPlmn->clear(); // Handle 5.5.2.3.4 Abnormal cases in the UE, item b) auto handleAbnormal = [this]() { diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index d3dd746c6..1d2a4053b 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -352,13 +352,13 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) { for (auto &rejectedSlice : msg.rejectedNSSAI->list) { - SingleSlice slice{}; + SingleSlice slice; slice.sst = rejectedSlice.sst; slice.sd = rejectedSlice.sd; - auto &list = rejectedSlice.cause == nas::ERejectedSNssaiCause::NA_IN_PLMN ? m_usim->m_rejectedNssaiInPlmn - : m_usim->m_rejectedNssaiInTa; - list.addIfNotExists(slice); + auto &nssai = rejectedSlice.cause == nas::ERejectedSNssaiCause::NA_IN_PLMN ? m_storage->rejectedNssaiInPlmn + : m_storage->rejectedNssaiInTa; + nssai->mutate([slice](auto &value) { value.addIfNotExists(slice); }); } } @@ -371,12 +371,12 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) } // Store the allowed NSSAI - m_usim->m_allowedNssai = nas::utils::NssaiTo(msg.allowedNSSAI.value_or(nas::IENssai{})); + m_storage->allowedNssai->set(nas::utils::NssaiTo(msg.allowedNSSAI.value_or(nas::IENssai{}))); // Process configured NSSAI IE if (msg.configuredNSSAI.has_value()) { - m_usim->m_configuredNssai = nas::utils::NssaiTo(msg.configuredNSSAI.value_or(nas::IENssai{})); + m_storage->configuredNssai->set(nas::utils::NssaiTo(msg.configuredNSSAI.value_or(nas::IENssai{}))); sendComplete = true; } @@ -484,9 +484,9 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg slice.sst = rejectedSlice.sst; slice.sd = rejectedSlice.sd; - auto &list = rejectedSlice.cause == nas::ERejectedSNssaiCause::NA_IN_PLMN ? m_usim->m_rejectedNssaiInPlmn - : m_usim->m_rejectedNssaiInTa; - list.addIfNotExists(slice); + auto &nssai = rejectedSlice.cause == nas::ERejectedSNssaiCause::NA_IN_PLMN ? m_storage->rejectedNssaiInPlmn + : m_storage->rejectedNssaiInTa; + nssai->mutate([slice](auto &value) { value.addIfNotExists(slice); }); } } @@ -499,12 +499,12 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg } // Store the allowed NSSAI - m_usim->m_allowedNssai = nas::utils::NssaiTo(msg.allowedNSSAI.value_or(nas::IENssai{})); + m_storage->allowedNssai->set(nas::utils::NssaiTo(msg.allowedNSSAI.value_or(nas::IENssai{}))); // Process configured NSSAI IE if (msg.configuredNSSAI.has_value()) { - m_usim->m_configuredNssai = nas::utils::NssaiTo(msg.configuredNSSAI.value_or(nas::IENssai{})); + m_storage->configuredNssai->set(nas::utils::NssaiTo(msg.configuredNSSAI.value_or(nas::IENssai{}))); sendComplete = true; } diff --git a/src/ue/nas/mm/slice.cpp b/src/ue/nas/mm/slice.cpp index 6dda9b236..6629f62aa 100644 --- a/src/ue/nas/mm/slice.cpp +++ b/src/ue/nas/mm/slice.cpp @@ -43,25 +43,25 @@ NetworkSlice NasMm::makeRequestedNssai(bool &isDefaultNssai) const NetworkSlice res{}; - if (!m_usim->m_allowedNssai.slices.empty() || !m_usim->m_configuredNssai.slices.empty()) + if (!m_storage->allowedNssai->get().slices.empty() || !m_storage->configuredNssai->get().slices.empty()) { - if (!m_usim->m_allowedNssai.slices.empty()) + if (!m_storage->allowedNssai->get().slices.empty()) { - AppendSubset(m_usim->m_allowedNssai, res, m_usim->m_rejectedNssaiInPlmn, m_usim->m_rejectedNssaiInTa, - 8); - AppendSubset(m_usim->m_configuredNssai, res, m_usim->m_rejectedNssaiInPlmn, - m_usim->m_rejectedNssaiInTa, static_cast(8) - res.slices.size()); + AppendSubset(m_storage->allowedNssai->get(), res, m_storage->rejectedNssaiInPlmn->get(), + m_storage->rejectedNssaiInTa->get(), 8); + AppendSubset(m_storage->configuredNssai->get(), res, m_storage->rejectedNssaiInPlmn->get(), + m_storage->rejectedNssaiInTa->get(), static_cast(8) - res.slices.size()); } else { - AppendSubset(m_usim->m_configuredNssai, res, m_usim->m_rejectedNssaiInPlmn, - m_usim->m_rejectedNssaiInTa, 8); + AppendSubset(m_storage->configuredNssai->get(), res, m_storage->rejectedNssaiInPlmn->get(), + m_storage->rejectedNssaiInTa->get(), 8); } } - else if (!m_usim->m_defConfiguredNssai.slices.empty()) + else if (!m_storage->defConfiguredNssai->get().slices.empty()) { - AppendSubset(m_usim->m_defConfiguredNssai, res, m_usim->m_rejectedNssaiInPlmn, - m_usim->m_rejectedNssaiInTa, 8); + AppendSubset(m_storage->defConfiguredNssai->get(), res, m_storage->rejectedNssaiInPlmn->get(), + m_storage->rejectedNssaiInTa->get(), 8); isDefaultNssai = true; } diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 5c9aeebc8..b7679ff5b 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -22,9 +22,9 @@ namespace nr::ue MmStorage::MmStorage(TaskBase *base) : m_base{base} { - uState = std::make_unique>(0, std::nullopt); + uState = std::make_unique>(0, std::nullopt); - storedSuci = std::make_unique>(0, std::nullopt); + storedSuci = std::make_unique>(0, std::nullopt); storedGuti = std::make_unique>(0, std::nullopt); @@ -47,6 +47,21 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} equivalentPlmnList = std::make_unique>(16, 0, std::nullopt); forbiddenPlmnList = std::make_unique>(16, 0, std::nullopt); + + defConfiguredNssai = std::make_unique>(0, std::nullopt); + + configuredNssai = std::make_unique>(0, std::nullopt); + + allowedNssai = std::make_unique>(0, std::nullopt); + + rejectedNssaiInPlmn = std::make_unique>(0, std::nullopt); + + rejectedNssaiInTa = std::make_unique>(0, std::nullopt); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + + defConfiguredNssai->set(m_base->config->initials.defaultConfiguredNssai); + configuredNssai->set(m_base->config->initials.configuredNssai); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 76a5a9fe4..2f22b874e 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -34,6 +34,12 @@ class MmStorage std::unique_ptr> serviceAreaList; + std::unique_ptr> defConfiguredNssai; + std::unique_ptr> configuredNssai; + std::unique_ptr> allowedNssai; + std::unique_ptr> rejectedNssaiInPlmn; + std::unique_ptr> rejectedNssaiInTa; + public: explicit MmStorage(TaskBase *base); }; diff --git a/src/ue/nas/usim/usim.cpp b/src/ue/nas/usim/usim.cpp index ccd8839a0..8306bbcf0 100644 --- a/src/ue/nas/usim/usim.cpp +++ b/src/ue/nas/usim/usim.cpp @@ -15,9 +15,6 @@ void ue::Usim::initialize(bool hasSupi, const UeConfig::Initials &initials) { m_isValid = hasSupi; - m_defConfiguredNssai = initials.defaultConfiguredNssai; - m_configuredNssai = initials.configuredNssai; - m_sqnMng = std::make_unique(5ull, 1ull << 28ull); } diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 5eeef458a..55f52cbad 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -34,13 +34,6 @@ class Usim OctetString m_resStar{}; std::unique_ptr m_sqnMng{}; - // NSSAI related - NetworkSlice m_defConfiguredNssai{}; - NetworkSlice m_configuredNssai{}; - NetworkSlice m_allowedNssai{}; - NetworkSlice m_rejectedNssaiInPlmn{}; - NetworkSlice m_rejectedNssaiInTa{}; - // NITZ related std::optional m_networkFullName{}; std::optional m_networkShortName{}; From 3ab8bc49bd0e6f0f24f5606d5cbb62ef70535f9f Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 20:15:24 +0300 Subject: [PATCH 283/311] L3 RRC/NAS developments --- config/open5gs-ue.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/config/open5gs-ue.yaml b/config/open5gs-ue.yaml index dbfa1f477..49f60824b 100644 --- a/config/open5gs-ue.yaml +++ b/config/open5gs-ue.yaml @@ -18,11 +18,6 @@ imei: '356938035643803' # IMEISV number of the device. It is used if no SUPI and IMEI is provided imeiSv: '4370816125816151' -# Other USIM (Universal Subscriber Identity Module) Parameters -highPriority: false -eCallOnly: false -emergencyIndication: false - # List of gNB IP addresses for Radio Link Simulation gnbSearchList: - 127.0.0.1 From 85c8b72772453d565649f1610b946d8cd58d9790 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 20:20:06 +0300 Subject: [PATCH 284/311] L3 RRC/NAS developments --- src/ue/nas/mm/config.cpp | 10 +++++----- src/ue/nas/storage.cpp | 12 ++++++++++++ src/ue/nas/storage.hpp | 6 ++++++ src/ue/nas/usim/usim.hpp | 7 ------- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/ue/nas/mm/config.cpp b/src/ue/nas/mm/config.cpp index ea09503d8..71a78fe91 100644 --- a/src/ue/nas/mm/config.cpp +++ b/src/ue/nas/mm/config.cpp @@ -87,27 +87,27 @@ void NasMm::receiveConfigurationUpdate(const nas::ConfigurationUpdateCommand &ms if (msg.networkFullName.has_value()) { hasNewConfig = true; - m_usim->m_networkFullName = nas::utils::DeepCopyIe(*msg.networkFullName); + m_storage->networkFullName->set(nas::utils::DeepCopyIe(*msg.networkFullName)); } if (msg.networkShortName.has_value()) { hasNewConfig = true; - m_usim->m_networkShortName = nas::utils::DeepCopyIe(*msg.networkShortName); + m_storage->networkShortName->set(nas::utils::DeepCopyIe(*msg.networkShortName)); } if (msg.localTimeZone.has_value()) { hasNewConfig = true; - m_usim->m_localTimeZone = *msg.localTimeZone; + m_storage->localTimeZone->set(*msg.localTimeZone); } if (msg.universalTimeAndLocalTimeZone.has_value()) { hasNewConfig = true; - m_usim->m_universalTimeAndLocalTimeZone = *msg.universalTimeAndLocalTimeZone; + m_storage->universalTimeAndLocalTimeZone->set(*msg.universalTimeAndLocalTimeZone); } if (msg.networkDaylightSavingTime.has_value()) { hasNewConfig = true; - m_usim->m_networkDaylightSavingTime = *msg.networkDaylightSavingTime; + m_storage->networkDaylightSavingTime->set(*msg.networkDaylightSavingTime); } // "If the UE receives a new allowed NSSAI for the associated access type in the CONFIGURATION UPDATE COMMAND diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index b7679ff5b..14a974ae5 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -58,6 +58,18 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} rejectedNssaiInTa = std::make_unique>(0, std::nullopt); + networkFullName = std::make_unique>>(0, std::nullopt); + + networkShortName = std::make_unique>>(0, std::nullopt); + + localTimeZone = std::make_unique>>(0, std::nullopt); + + universalTimeAndLocalTimeZone = + std::make_unique>>(0, std::nullopt); + + networkDaylightSavingTime = + std::make_unique>>(0, std::nullopt); + ///////////////////////////////////////////////////////////////////////////////////////////////////////// defConfiguredNssai->set(m_base->config->initials.defaultConfiguredNssai); diff --git a/src/ue/nas/storage.hpp b/src/ue/nas/storage.hpp index 2f22b874e..d8f0a31c1 100644 --- a/src/ue/nas/storage.hpp +++ b/src/ue/nas/storage.hpp @@ -40,6 +40,12 @@ class MmStorage std::unique_ptr> rejectedNssaiInPlmn; std::unique_ptr> rejectedNssaiInTa; + std::unique_ptr>> networkFullName; + std::unique_ptr>> networkShortName; + std::unique_ptr>> localTimeZone; + std::unique_ptr>> universalTimeAndLocalTimeZone; + std::unique_ptr>> networkDaylightSavingTime; + public: explicit MmStorage(TaskBase *base); }; diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 55f52cbad..75137cd6d 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -34,13 +34,6 @@ class Usim OctetString m_resStar{}; std::unique_ptr m_sqnMng{}; - // NITZ related - std::optional m_networkFullName{}; - std::optional m_networkShortName{}; - std::optional m_localTimeZone{}; - std::optional m_universalTimeAndLocalTimeZone{}; - std::optional m_networkDaylightSavingTime{}; - // Others bool m_isECallOnly{}; // todo: configurable From 16c056f84f6fa736456a3417c04dc2ccdb6f92bc Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 20:23:00 +0300 Subject: [PATCH 285/311] L3 RRC/NAS developments --- src/ue/nas/mm/access.cpp | 11 ++++++++--- src/ue/nas/usim/usim.hpp | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index f8bae2aeb..4c655303d 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -18,23 +18,28 @@ bool NasMm::hasEmergency() { // Indicates emergency services are required (even if registered for normal initial registration) // This happens if it 'has' or 'need' some emergency PDU Session, as well. - if (m_rmState == ERmState::RM_REGISTERED && m_registeredForEmergency) return true; + if (m_mmState == EMmState::MM_REGISTERED_INITIATED && m_lastRegistrationRequest && m_lastRegistrationRequest->registrationType.registrationType == nas::ERegistrationType::EMERGENCY_REGISTRATION) return true; + if (m_procCtl.initialRegistration && m_procCtl.initialRegistration == EInitialRegCause::EMERGENCY_SERVICES) return true; + if (m_procCtl.mobilityRegistration && m_procCtl.mobilityRegistration == ERegUpdateCause::EMERGENCY_CASE) return true; + if (m_procCtl.serviceRequest && m_procCtl.serviceRequest == EServiceReqCause::EMERGENCY_FALLBACK) return true; - // TODO: Other case which is an emergency PDU session need to be established (and wanted to be - // established soon) if (m_sm->anyEmergencySession()) return true; + + if (m_usim->m_emgIndication) + return true; + return false; } diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 75137cd6d..02c49a7a3 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -35,7 +35,8 @@ class Usim std::unique_ptr m_sqnMng{}; // Others - bool m_isECallOnly{}; // todo: configurable + bool m_isECallOnly = false; // todo: configurable + bool m_emgIndication = false; // todo: configurable public: void initialize(bool hasSupi, const UeConfig::Initials &initials); From 2b5416270878a3a45036acb8e769ecb2fac07a53 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 20:26:07 +0300 Subject: [PATCH 286/311] L3 RRC/NAS developments --- src/ue/nas/task.cpp | 2 +- src/ue/nas/usim/usim.cpp | 2 +- src/ue/nas/usim/usim.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index 9a6db87bd..f1be3905c 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -28,7 +28,7 @@ NasTask::NasTask(TaskBase *base) : base{base}, timers{} void NasTask::onStart() { - usim->initialize(base->config->supi.has_value(), base->config->initials); + usim->initialize(base->config->supi.has_value()); sm->onStart(mm); mm->onStart(sm, usim); diff --git a/src/ue/nas/usim/usim.cpp b/src/ue/nas/usim/usim.cpp index 8306bbcf0..1610c5fdb 100644 --- a/src/ue/nas/usim/usim.cpp +++ b/src/ue/nas/usim/usim.cpp @@ -11,7 +11,7 @@ namespace nr::ue { -void ue::Usim::initialize(bool hasSupi, const UeConfig::Initials &initials) +void ue::Usim::initialize(bool hasSupi) { m_isValid = hasSupi; diff --git a/src/ue/nas/usim/usim.hpp b/src/ue/nas/usim/usim.hpp index 02c49a7a3..9b0822dec 100644 --- a/src/ue/nas/usim/usim.hpp +++ b/src/ue/nas/usim/usim.hpp @@ -39,7 +39,7 @@ class Usim bool m_emgIndication = false; // todo: configurable public: - void initialize(bool hasSupi, const UeConfig::Initials &initials); + void initialize(bool hasSupi); bool isValid(); void invalidate(); From a55cfeba42db298bebc06709fb0b3a8159fa16ec Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 20:27:58 +0300 Subject: [PATCH 287/311] L3 RRC/NAS developments --- src/ue.cpp | 7 ++++--- src/ue/nas/storage.cpp | 4 ++-- src/ue/types.hpp | 10 ++-------- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/ue.cpp b/src/ue.cpp index 8eb651667..a4a8e6345 100644 --- a/src/ue.cpp +++ b/src/ue.cpp @@ -118,7 +118,7 @@ static nr::ue::UeConfig *ReadConfigYaml() s.sst = yaml::GetInt32(sNssai, "sst", 0, 0xFF); if (yaml::HasField(sNssai, "sd")) s.sd = octet3{yaml::GetInt32(sNssai, "sd", 0, 0xFFFFFF)}; - result->initials.defaultConfiguredNssai.slices.push_back(s); + result->defaultConfiguredNssai.slices.push_back(s); } } @@ -130,7 +130,7 @@ static nr::ue::UeConfig *ReadConfigYaml() s.sst = yaml::GetInt32(sNssai, "sst", 0, 0xFF); if (yaml::HasField(sNssai, "sd")) s.sd = octet3{yaml::GetInt32(sNssai, "sd", 0, 0xFFFFFF)}; - result->initials.configuredNssai.slices.push_back(s); + result->configuredNssai.slices.push_back(s); } } @@ -314,7 +314,8 @@ static nr::ue::UeConfig *GetConfigByUe(int ueIndex) c->imeiSv = g_refConfig->imeiSv; c->supi = g_refConfig->supi; c->hplmn = g_refConfig->hplmn; - c->initials = g_refConfig->initials; + c->configuredNssai = g_refConfig->configuredNssai; + c->defaultConfiguredNssai = g_refConfig->defaultConfiguredNssai; c->supportedAlgs = g_refConfig->supportedAlgs; c->gnbSearchList = g_refConfig->gnbSearchList; c->defaultSessions = g_refConfig->defaultSessions; diff --git a/src/ue/nas/storage.cpp b/src/ue/nas/storage.cpp index 14a974ae5..6af0682c4 100644 --- a/src/ue/nas/storage.cpp +++ b/src/ue/nas/storage.cpp @@ -72,8 +72,8 @@ MmStorage::MmStorage(TaskBase *base) : m_base{base} ///////////////////////////////////////////////////////////////////////////////////////////////////////// - defConfiguredNssai->set(m_base->config->initials.defaultConfiguredNssai); - configuredNssai->set(m_base->config->initials.configuredNssai); + defConfiguredNssai->set(m_base->config->defaultConfiguredNssai); + configuredNssai->set(m_base->config->configuredNssai); } } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/types.hpp b/src/ue/types.hpp index e7b0cdeda..ef11ccd72 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -102,14 +102,8 @@ struct UeConfig std::vector gnbSearchList{}; std::vector defaultSessions{}; IntegrityMaxDataRateConfig integrityMaxRate{}; - - /* Read from config file as well, but should be stored in non-volatile - * mobile storage and subject to change in runtime */ - struct Initials - { - NetworkSlice defaultConfiguredNssai{}; - NetworkSlice configuredNssai{}; - } initials{}; + NetworkSlice defaultConfiguredNssai{}; + NetworkSlice configuredNssai{}; /* Assigned by program */ bool configureRouting{}; From 93c3fceb396bce918f8dd2a29d09613a7d957140 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 20:54:33 +0300 Subject: [PATCH 288/311] L3 RRC/NAS developments --- src/ue/nas/mm/service.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 63f4491f2..7491fd41d 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -159,7 +159,14 @@ EProcRc NasMm::sendServiceRequest(EServiceReqCause reqCause) request->serviceType.serviceType = nas::EServiceType::HIGH_PRIORITY_ACCESS; else { - // TODO: fallback indication not supported yet + // From 5.6.1.2: + // "a) if the pending message is an UL NAS TRANSPORT message with the Request type IE set to "initial + // emergency request" or "existing emergency PDU session", the UE shall set the Service type IE in the + // SERVICE REQUEST message to "emergency services"; or + // b) otherwise, the UE shall set the Service type IE in the SERVICE REQUEST message to "signalling"." + // Just check if the UE has an emergency + request->serviceType.serviceType = + hasEmergency() ? nas::EServiceType::EMERGENCY_SERVICES : nas::EServiceType::SIGNALLING; } } From 36e91e85d98afbf37d26d5d856ce3e22596f3088 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 20:59:16 +0300 Subject: [PATCH 289/311] L3 RRC/NAS developments --- src/ue/nas/mm/auth.cpp | 5 +---- src/ue/nas/mm/base.cpp | 2 +- src/ue/nas/mm/mm.hpp | 2 +- src/ue/nas/mm/radio.cpp | 12 ++++++------ src/ue/nas/mm/timer.cpp | 4 ++-- src/ue/nts.hpp | 9 ++++++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/ue/nas/mm/auth.cpp b/src/ue/nas/mm/auth.cpp index 7efc3a7cc..2c2829124 100644 --- a/src/ue/nas/mm/auth.cpp +++ b/src/ue/nas/mm/auth.cpp @@ -532,10 +532,7 @@ bool NasMm::networkFailingTheAuthCheck(bool hasChance) m_logger->err("Network failing the authentication check"); if (m_cmState == ECmState::CM_CONNECTED) - { - localReleaseConnection(); - // TODO: treat the active cell as barred - } + localReleaseConnection(true); m_timers->t3520.stop(); return true; diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 69dbb1d10..b9bb367bb 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -330,7 +330,7 @@ void NasMm::onSwitchMmState(EMmState oldState, EMmState newState, EMmSubState ol if (m_cmState == ECmState::CM_CONNECTED && (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH)) { - localReleaseConnection(); + localReleaseConnection(false); } // "Timer T3512 is stopped when the UE enters ... the 5GMM-DEREGISTERED state over 3GPP access" diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 4fed79f80..1c09bf633 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -159,7 +159,7 @@ class NasMm private: /* Radio */ void performPlmnSelection(); - void localReleaseConnection(); + void localReleaseConnection(bool treatBarred); void handleActiveCellChange(const Tai &prevTai); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 2bfc8a772..ea5c1e400 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -251,14 +251,14 @@ void NasMm::handleRadioLinkFailure() switchMmState(EMmSubState::MM_DEREGISTERED_PS); } -void NasMm::localReleaseConnection() +void NasMm::localReleaseConnection(bool treatBarred) { - if (m_cmState == ECmState::CM_IDLE) - return; - - m_logger->info("Performing local release of NAS connection"); + if (m_cmState != ECmState::CM_IDLE) + m_logger->info("Performing local release of NAS connection"); - m_base->rrcTask->push(new NmUeNasToRrc(NmUeNasToRrc::LOCAL_RELEASE_CONNECTION)); + auto *w = new NmUeNasToRrc(NmUeNasToRrc::LOCAL_RELEASE_CONNECTION); + w->treatBarred = treatBarred; + m_base->rrcTask->push(w); } void NasMm::handlePaging(const std::vector &tmsiIds) diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index da0690583..187d96b8b 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -74,7 +74,7 @@ void NasMm::onTimerExpire(UeTimer &timer) if (m_lastRegistrationRequest->registrationType.registrationType != nas::ERegistrationType::EMERGENCY_REGISTRATION) { - localReleaseConnection(); + localReleaseConnection(false); } handleAbnormalInitialRegFailure(regType); @@ -82,7 +82,7 @@ void NasMm::onTimerExpire(UeTimer &timer) else if (regType == nas::ERegistrationType::MOBILITY_REGISTRATION_UPDATING || regType == nas::ERegistrationType::PERIODIC_REGISTRATION_UPDATING) { - localReleaseConnection(); + localReleaseConnection(false); handleAbnormalMobilityRegFailure(regType); } } diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 959502ea8..e54a11bdb 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -101,6 +101,9 @@ struct NmUeNasToRrc : NtsMessage uint32_t pduId{}; OctetString nasPdu; + // LOCAL_RELEASE_CONNECTION + bool treatBarred{}; + explicit NmUeNasToRrc(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_RRC), present(present) { } @@ -191,9 +194,9 @@ struct NmUeNasToApp : NtsMessage DOWNLINK_DATA_DELIVERY } present; - // DOWNLINK_DATA_DELIVERY - int psi{}; - OctetString data; + // DOWNLINK_DATA_DELIVERY + int psi{}; + OctetString data; explicit NmUeNasToApp(PR present) : NtsMessage(NtsMessageType::UE_NAS_TO_APP), present(present) { From 748d53e521954bebbe1966e6d7761414a2de8102 Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 21:05:44 +0300 Subject: [PATCH 290/311] L3 RRC/NAS developments --- src/ue/nts.hpp | 1 + src/ue/rls/task.cpp | 3 +++ src/ue/rrc/sap.cpp | 8 ++++---- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index e54a11bdb..5a9a24f6f 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -115,6 +115,7 @@ struct NmUeRrcToRls : NtsMessage { ASSIGN_CURRENT_CELL, RRC_PDU_DELIVERY, + RESET_STI, } present; // ASSIGN_CURRENT_CELL diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 5e506e555..57f9d2c65 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -106,6 +106,9 @@ void UeRlsTask::onLoop() m_ctlTask->push(m); break; } + case NmUeRrcToRls::RESET_STI: { + break; + } } break; } diff --git a/src/ue/rrc/sap.cpp b/src/ue/rrc/sap.cpp index 51f3d6794..2ae198aaa 100644 --- a/src/ue/rrc/sap.cpp +++ b/src/ue/rrc/sap.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace nr::ue { @@ -43,10 +44,9 @@ void UeRrcTask::handleNasSapMessage(NmUeNasToRrc &msg) break; } case NmUeNasToRrc::LOCAL_RELEASE_CONNECTION: { - // TODO - // m_state = ERrcState::RRC_IDLE; - // m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); - // m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::RESET_STI)); + switchState(ERrcState::RRC_IDLE); + m_base->rlsTask->push(new NmUeRrcToRls(NmUeRrcToRls::RESET_STI)); + m_base->nasTask->push(new NmUeRrcToNas(NmUeRrcToNas::RRC_CONNECTION_RELEASE)); break; } case NmUeNasToRrc::RRC_NOTIFY: { From cb4899d2bf89b6087ebede5e1d7deab010a3e3dd Mon Sep 17 00:00:00 2001 From: aligungr Date: Thu, 27 May 2021 21:16:40 +0300 Subject: [PATCH 291/311] L3 RRC/NAS developments --- src/ue/rls/ctl_task.cpp | 10 +++++----- src/ue/rls/ctl_task.hpp | 4 ++-- src/ue/rls/task.cpp | 11 ++++++++--- src/ue/rls/task.hpp | 2 +- src/ue/rls/udp_task.cpp | 7 ++++--- src/ue/rls/udp_task.hpp | 4 ++-- src/ue/types.hpp | 5 +++++ 7 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/ue/rls/ctl_task.cpp b/src/ue/rls/ctl_task.cpp index 73a8623d4..81a5a63d9 100644 --- a/src/ue/rls/ctl_task.cpp +++ b/src/ue/rls/ctl_task.cpp @@ -22,8 +22,8 @@ static constexpr const int TIMER_PERIOD_ACK_SEND = 2250; namespace nr::ue { -RlsControlTask::RlsControlTask(TaskBase *base, uint64_t sti) - : m_sti{sti}, m_servingCell{}, m_mainTask{}, m_udpTask{}, m_pduMap{}, m_pendingAck{} +RlsControlTask::RlsControlTask(TaskBase *base, RlsSharedContext *shCtx) + : m_shCtx{shCtx}, m_servingCell{}, m_mainTask{}, m_udpTask{}, m_pduMap{}, m_pendingAck{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-ctl"); } @@ -185,7 +185,7 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr m_pduMap[pduId].sentTime = utils::CurrentTimeMillis(); } - rls::RlsPduTransmission msg{m_sti}; + rls::RlsPduTransmission msg{m_shCtx->sti}; msg.pduType = rls::EPduType::RRC; msg.pdu = std::move(data); msg.payload = static_cast(channel); @@ -196,7 +196,7 @@ void RlsControlTask::handleUplinkRrcDelivery(int cellId, uint32_t pduId, rrc::Rr void RlsControlTask::handleUplinkDataDelivery(int psi, OctetString &&data) { - rls::RlsPduTransmission msg{m_sti}; + rls::RlsPduTransmission msg{m_shCtx->sti}; msg.pduType = rls::EPduType::DATA; msg.pdu = std::move(data); msg.payload = static_cast(psi); @@ -243,7 +243,7 @@ void RlsControlTask::onAckSendTimerExpired() if (!item.second.empty()) continue; - rls::RlsPduTransmissionAck msg{m_sti}; + rls::RlsPduTransmissionAck msg{m_shCtx->sti}; msg.pduIds = std::move(item.second); m_udpTask->send(item.first, msg); diff --git a/src/ue/rls/ctl_task.hpp b/src/ue/rls/ctl_task.hpp index 32244a55f..b1944c96b 100644 --- a/src/ue/rls/ctl_task.hpp +++ b/src/ue/rls/ctl_task.hpp @@ -25,7 +25,7 @@ class RlsControlTask : public NtsTask { private: std::unique_ptr m_logger; - uint64_t m_sti; + RlsSharedContext *m_shCtx; int m_servingCell; NtsTask *m_mainTask; RlsUdpTask *m_udpTask; @@ -33,7 +33,7 @@ class RlsControlTask : public NtsTask std::unordered_map> m_pendingAck; public: - explicit RlsControlTask(TaskBase *base, uint64_t sti); + explicit RlsControlTask(TaskBase *base, RlsSharedContext *shCtx); ~RlsControlTask() override = default; protected: diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 57f9d2c65..213b49523 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -21,10 +21,11 @@ UeRlsTask::UeRlsTask(TaskBase *base) : m_base{base} { m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "rls"); - m_sti = utils::Random64(); + m_shCtx = new RlsSharedContext(); + m_shCtx->sti = utils::Random64(); - m_udpTask = new RlsUdpTask(base, m_sti, base->config->gnbSearchList); - m_ctlTask = new RlsControlTask(base, m_sti); + m_udpTask = new RlsUdpTask(base, m_shCtx, base->config->gnbSearchList); + m_ctlTask = new RlsControlTask(base, m_shCtx); m_udpTask->initialize(m_ctlTask); m_ctlTask->initialize(this, m_udpTask); @@ -107,6 +108,7 @@ void UeRlsTask::onLoop() break; } case NmUeRrcToRls::RESET_STI: { + m_shCtx->sti = utils::Random64(); break; } } @@ -138,8 +140,11 @@ void UeRlsTask::onQuit() { m_udpTask->quit(); m_ctlTask->quit(); + delete m_udpTask; delete m_ctlTask; + + delete m_shCtx; } } // namespace nr::ue diff --git a/src/ue/rls/task.hpp b/src/ue/rls/task.hpp index 99c4c3195..706cc8043 100644 --- a/src/ue/rls/task.hpp +++ b/src/ue/rls/task.hpp @@ -34,7 +34,7 @@ class UeRlsTask : public NtsTask TaskBase *m_base; std::unique_ptr m_logger; - uint64_t m_sti; + RlsSharedContext* m_shCtx; RlsUdpTask *m_udpTask; RlsControlTask *m_ctlTask; diff --git a/src/ue/rls/udp_task.cpp b/src/ue/rls/udp_task.cpp index 6479842ba..54a2dc0e9 100644 --- a/src/ue/rls/udp_task.cpp +++ b/src/ue/rls/udp_task.cpp @@ -24,8 +24,9 @@ static constexpr const int HEARTBEAT_THRESHOLD = 2000; // (LOOP_PERIOD + RECEIVE namespace nr::ue { -RlsUdpTask::RlsUdpTask(TaskBase *base, uint64_t sti, const std::vector &searchSpace) - : m_server{}, m_ctlTask{}, m_sti{sti}, m_searchSpace{}, m_cells{}, m_cellIdToSti{}, m_lastLoop{}, m_cellIdCounter{} +RlsUdpTask::RlsUdpTask(TaskBase *base, RlsSharedContext *shCtx, const std::vector &searchSpace) + : m_server{}, m_ctlTask{}, m_shCtx{shCtx}, m_searchSpace{}, m_cells{}, m_cellIdToSti{}, m_lastLoop{}, + m_cellIdCounter{} { m_logger = base->logBase->makeUniqueLogger(base->config->getLoggerPrefix() + "rls-udp"); @@ -160,7 +161,7 @@ void RlsUdpTask::heartbeatCycle(uint64_t time, const Vector3 &simPos) for (auto &addr : m_searchSpace) { - rls::RlsHeartBeat msg{m_sti}; + rls::RlsHeartBeat msg{m_shCtx->sti}; msg.simPos = simPos; sendRlsPdu(addr, msg); } diff --git a/src/ue/rls/udp_task.hpp b/src/ue/rls/udp_task.hpp index 1bea38f36..ed96abe31 100644 --- a/src/ue/rls/udp_task.hpp +++ b/src/ue/rls/udp_task.hpp @@ -35,7 +35,7 @@ class RlsUdpTask : public NtsTask std::unique_ptr m_logger; udp::UdpServer *m_server; NtsTask *m_ctlTask; - uint64_t m_sti; + RlsSharedContext* m_shCtx; std::vector m_searchSpace; std::unordered_map m_cells; std::unordered_map m_cellIdToSti; @@ -44,7 +44,7 @@ class RlsUdpTask : public NtsTask int m_cellIdCounter; public: - explicit RlsUdpTask(TaskBase *base, uint64_t sti, const std::vector &searchSpace); + explicit RlsUdpTask(TaskBase *base, RlsSharedContext* shCtx, const std::vector &searchSpace); ~RlsUdpTask() override = default; protected: diff --git a/src/ue/types.hpp b/src/ue/types.hpp index ef11ccd72..2f1b578ed 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -168,6 +168,11 @@ struct UeSharedContext bool hasActiveCell(); }; +struct RlsSharedContext +{ + std::atomic sti{}; +}; + struct TaskBase { UserEquipment *ue{}; From 6f903ab78709acc024651100bfbb8c2d1e7ca603 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 19:24:08 +0300 Subject: [PATCH 292/311] L3 RRC/NAS developments --- src/lib/app/cli_cmd.cpp | 6 ++++-- src/utils/common_types.cpp | 2 ++ src/utils/common_types.hpp | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lib/app/cli_cmd.cpp b/src/lib/app/cli_cmd.cpp index 420ff1de7..be2907d9e 100644 --- a/src/lib/app/cli_cmd.cpp +++ b/src/lib/app/cli_cmd.cpp @@ -240,13 +240,15 @@ static std::unique_ptr UeCliParseImpl(const std::string &subCmd, c if (options.positionalCount() > 1) CMD_ERR("Only one de-registration type is expected") auto type = options.getPositional(0); - if (type == "switch-off") + if (type == "normal") + cmd->deregCause = EDeregCause::NORMAL; + else if (type == "switch-off") cmd->deregCause = EDeregCause::SWITCH_OFF; else if (type == "disable-5g") cmd->deregCause = EDeregCause::DISABLE_5G; else if (type == "remove-sim") cmd->deregCause = EDeregCause::USIM_REMOVAL; - else if (type != "normal") + else CMD_ERR("Invalid de-registration type, possible values are: \"normal\", \"disable-5g\", \"switch-off\", " "\"remove-sim\"") return cmd; diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 2ab774cc6..169aa5bd6 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -128,6 +128,8 @@ Json ToJson(const EDeregCause &v) { switch (v) { + case EDeregCause::NORMAL: + return "NORMAL"; case EDeregCause::SWITCH_OFF: return "SWITCH-OFF"; case EDeregCause::USIM_REMOVAL: diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index e50fdf195..040319b3d 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -127,6 +127,7 @@ struct Supi enum class EDeregCause { + NORMAL, SWITCH_OFF, USIM_REMOVAL, DISABLE_5G, From d3cd0455391e2271a4a3d26d673128b118854f0f Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 19:34:44 +0300 Subject: [PATCH 293/311] L3 RRC/NAS developments --- src/ue/app/task.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index a3073aa8e..d6500f454 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -134,7 +134,7 @@ void UeAppTask::receiveStatusUpdate(NmUeStatusUpdate &msg) sessionInfo.isEmergency = session->isEmergency; sessionInfo.uplinkPending = false; - m_pduSessions[session->psi] = std::move(sessionInfo); + //m_pduSessions[session->psi] = std::move(sessionInfo); setupTunInterface(session); return; From 62f9ed00832f3053a27b579078fcbe91d7755e92 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 19:35:51 +0300 Subject: [PATCH 294/311] L3 RRC/NAS developments --- src/lib/nas/ie6.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/nas/ie6.cpp b/src/lib/nas/ie6.cpp index 1102496b0..54cd8b03a 100644 --- a/src/lib/nas/ie6.cpp +++ b/src/lib/nas/ie6.cpp @@ -448,7 +448,7 @@ Json ToJson(const IE5gsMobileIdentity &v) switch (v.type) { case EIdentityType::NO_IDENTITY: - return "no-identitiy"; + return "no-identity"; case EIdentityType::SUCI: { switch (v.supiFormat) { From 6141ba21eeeac32fea0991d89aa6afcacb8a6d1d Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 19:39:24 +0300 Subject: [PATCH 295/311] L3 RRC/NAS developments --- src/ue/app/task.cpp | 13 ------------- src/ue/types.cpp | 10 ---------- src/ue/types.hpp | 12 ------------ 3 files changed, 35 deletions(-) diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index d6500f454..d1376b0b3 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -123,19 +123,6 @@ void UeAppTask::receiveStatusUpdate(NmUeStatusUpdate &msg) { auto *session = msg.pduSession; - UePduSessionInfo sessionInfo{}; - sessionInfo.psi = session->psi; - - sessionInfo.apn = session->apn; - sessionInfo.sNssai = session->sNssai; - sessionInfo.type = nas::utils::EnumToString(session->sessionType); - if (session->pduAddress.has_value()) - sessionInfo.address = utils::OctetStringToIp(session->pduAddress->pduAddressInformation); - sessionInfo.isEmergency = session->isEmergency; - sessionInfo.uplinkPending = false; - - //m_pduSessions[session->psi] = std::move(sessionInfo); - setupTunInterface(session); return; } diff --git a/src/ue/types.cpp b/src/ue/types.cpp index d268920c9..65b8a78b5 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -285,16 +285,6 @@ Json ToJson(const EPsState &state) } } -Json ToJson(const UePduSessionInfo &v) -{ - return Json::Obj({{"id", v.psi}, - {"type", v.type}, - {"address", v.address}, - {"emergency", v.isEmergency}, - {"apn", ::ToJson(v.apn)}, - {"s-nssai", ToJson(v.sNssai)}}); -} - bool ActiveCellInfo::hasValue() const { return cellId != 0; diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 803f6c2f1..397bb3754 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -453,17 +453,6 @@ enum class EAutnValidationRes SYNCHRONISATION_FAILURE, }; -struct UePduSessionInfo -{ - int psi{}; - std::string type{}; - std::string address{}; - bool isEmergency{}; - bool uplinkPending{}; - std::optional apn{}; - std::optional sNssai{}; -}; - enum class ERegUpdateCause { // when the UE detects entering a tracking area that is not in the list of tracking areas that the UE previously @@ -577,7 +566,6 @@ Json ToJson(const UeConfig &v); Json ToJson(const NasTimers &v); Json ToJson(const ERegUpdateCause &v); Json ToJson(const EPsState &v); -Json ToJson(const UePduSessionInfo &v); Json ToJson(const EServiceReqCause &v); Json ToJson(const ERrcState &v); From ade2494e77ba4030425221ebdb5d5447d8fd60df Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 19:41:29 +0300 Subject: [PATCH 296/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 5592ceff1..8255e7308 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -155,7 +155,7 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) break; } case app::UeCliCommand::PS_ESTABLISH: { - SessionConfig config{}; + SessionConfig config; config.type = nas::EPduSessionType::IPV4; config.isEmergency = msg.cmd->isEmergency; config.apn = msg.cmd->apn; From 960735817c0eb94a1812878c915cc481407bc372 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 20:10:06 +0300 Subject: [PATCH 297/311] L3 RRC/NAS developments --- src/lib/app/cli_cmd.cpp | 5 +++++ src/lib/app/cli_cmd.hpp | 1 + src/lib/nas/enums.cpp | 24 ++++++++++++++++++++++++ src/lib/nas/enums.hpp | 4 ++++ src/lib/nas/ie4.cpp | 18 ++++++++++++++++++ src/lib/nas/ie4.hpp | 4 ++++ src/ue/app/cmd_handler.cpp | 27 +++++++++++++++++++-------- 7 files changed, 75 insertions(+), 8 deletions(-) diff --git a/src/lib/app/cli_cmd.cpp b/src/lib/app/cli_cmd.cpp index be2907d9e..603ac6ae6 100644 --- a/src/lib/app/cli_cmd.cpp +++ b/src/lib/app/cli_cmd.cpp @@ -160,6 +160,7 @@ static OrderedMap g_ueCmdEntries = { {"timers", {"Dump current status of the timers in the UE", "", DefaultDesc, false}}, {"ps-establish", {"Trigger a PDU session establishment procedure", " [options]", DescForPsEstablish, true}}, + {"ps-list", {"List all PDU sessions", "", DefaultDesc, false}}, {"ps-release", {"Trigger a PDU session release procedure", "...", DefaultDesc, true}}, {"ps-release-all", {"Trigger PDU session release procedures for all active sessions", "", DefaultDesc, false}}, {"deregister", @@ -316,6 +317,10 @@ static std::unique_ptr UeCliParseImpl(const std::string &subCmd, c } return cmd; } + else if (subCmd == "ps-list") + { + return std::make_unique(UeCliCommand::PS_LIST); + } return nullptr; } diff --git a/src/lib/app/cli_cmd.hpp b/src/lib/app/cli_cmd.hpp index 9eae2db1c..02eeda01c 100644 --- a/src/lib/app/cli_cmd.hpp +++ b/src/lib/app/cli_cmd.hpp @@ -52,6 +52,7 @@ struct UeCliCommand PS_ESTABLISH, PS_RELEASE, PS_RELEASE_ALL, + PS_LIST, DE_REGISTER, } present; diff --git a/src/lib/nas/enums.cpp b/src/lib/nas/enums.cpp index 93ebff1f3..eadd0bd7a 100644 --- a/src/lib/nas/enums.cpp +++ b/src/lib/nas/enums.cpp @@ -7,3 +7,27 @@ // #include "enums.hpp" + +namespace nas +{ + +Json ToJson(const EPduSessionType &v) +{ + switch (v) + { + case EPduSessionType::IPV4: + return "IPv4"; + case EPduSessionType::IPV6: + return "IPv6"; + case EPduSessionType::IPV4V6: + return "IPv4v6"; + case EPduSessionType::UNSTRUCTURED: + return "unstructured"; + case EPduSessionType::ETHERNET: + return "ethernet"; + default: + return "?"; + } +} + +} // namespace nas diff --git a/src/lib/nas/enums.hpp b/src/lib/nas/enums.hpp index d810aa58a..4c6767ebc 100644 --- a/src/lib/nas/enums.hpp +++ b/src/lib/nas/enums.hpp @@ -8,6 +8,8 @@ #pragma once +#include + namespace nas { @@ -750,4 +752,6 @@ enum class EQoSOperationCode MODIFY_EXISTING = 0b011, }; +Json ToJson(const EPduSessionType &v); + } // namespace nas \ No newline at end of file diff --git a/src/lib/nas/ie4.cpp b/src/lib/nas/ie4.cpp index 5a6e5ea14..33445f363 100644 --- a/src/lib/nas/ie4.cpp +++ b/src/lib/nas/ie4.cpp @@ -8,6 +8,8 @@ #include "ie4.hpp" +#include + namespace nas { @@ -1075,4 +1077,20 @@ void IE5gsTrackingAreaIdentityList::Encode(const IE5gsTrackingAreaIdentityList & VPartialTrackingAreaIdentityList::Encode(x, stream); } +Json ToJson(const IEPduAddress &v) +{ + switch (v.sessionType) + { + case EPduSessionType::IPV4: + case EPduSessionType::IPV6: + case EPduSessionType::IPV4V6: + return utils::OctetStringToIp(v.pduAddressInformation); + case EPduSessionType::UNSTRUCTURED: + case EPduSessionType::ETHERNET: + return v.pduAddressInformation.toHexString(); + default: + return "?"; + } +} + } // namespace nas \ No newline at end of file diff --git a/src/lib/nas/ie4.hpp b/src/lib/nas/ie4.hpp index b191f3ed9..18cfaa6bb 100644 --- a/src/lib/nas/ie4.hpp +++ b/src/lib/nas/ie4.hpp @@ -14,6 +14,8 @@ #include #include +#include + namespace nas { @@ -570,4 +572,6 @@ struct IE5gsTrackingAreaIdentityList : InformationElement4 static void Encode(const IE5gsTrackingAreaIdentityList &ie, OctetString &stream); }; +Json ToJson(const IEPduAddress &v); + } // namespace nas diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 8255e7308..ea50bf601 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -105,13 +105,6 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) switch (msg.cmd->present) { case app::UeCliCommand::STATUS: { - // TODO - // std::vector pduSessions{}; - // for (auto &pduSession : m_base->appTask->m_pduSessions) - // if (pduSession.has_value()) - // pduSessions.push_back(ToJson(*pduSession)); - // TODO: include SST, SD, DNN as well.. - Json json = Json::Obj({ {"cm-state", ToJson(m_base->nasTask->mm->m_cmState)}, {"rm-state", ToJson(m_base->nasTask->mm->m_rmState)}, @@ -121,7 +114,6 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, {"stored-guti", ToJson(m_base->nasTask->mm->m_storage->storedGuti->get())}, {"has-emergency", ::ToJson(m_base->nasTask->mm->hasEmergency())}, - // TODO {"pdu-sessions", Json::Arr(std::move(pduSessions))}, }); sendResult(msg.address, json.dumpYaml()); break; @@ -164,6 +156,25 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) sendResult(msg.address, "PDU session establishment procedure triggered"); break; } + case app::UeCliCommand::PS_LIST: { + std::vector arr{}; + for (auto *pduSession : m_base->nasTask->sm->m_pduSessions) + { + arr.push_back(Json::Obj({ + {"ID", pduSession->psi}, + {"state", ToJson(pduSession->psState)}, + {"session-type", ToJson(pduSession->sessionType)}, + {"apn", ::ToJson(pduSession->apn)}, + {"s-nssai", ToJson(pduSession->sNssai)}, + {"emergency", pduSession->isEmergency}, + {"address", ::ToJson(pduSession->pduAddress)}, + {"ambr", ""}, // TODO + {"data-pending", pduSession->uplinkPending}, + })); + } + sendResult(msg.address, Json::Arr(arr).dumpYaml()); + break; + } } } From 4b392a25efb66b2fc48f32dc1d1cf435ea4d1992 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 20:26:31 +0300 Subject: [PATCH 298/311] L3 RRC/NAS developments --- src/lib/nas/ie4.cpp | 23 +++++++++++++++++++++++ src/lib/nas/ie4.hpp | 1 + src/ue/app/cmd_handler.cpp | 5 ++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/lib/nas/ie4.cpp b/src/lib/nas/ie4.cpp index 33445f363..b5df744bf 100644 --- a/src/lib/nas/ie4.cpp +++ b/src/lib/nas/ie4.cpp @@ -1093,4 +1093,27 @@ Json ToJson(const IEPduAddress &v) } } +Json ToJson(const IESessionAmbr &v) +{ + int downlinkValue = static_cast(v.sessionAmbrForDownlink); + int uplinkValue = static_cast(v.sessionAmbrForUplink); + + int downlinkUnit = static_cast(v.unitForSessionAmbrForDownlink); + int uplinkUnit = static_cast(v.unitForSessionAmbrForUplink); + + int downlinkFactor = 1 << (2 * ((downlinkUnit - 1) % 5)); + int uplinkFactor = 1 << (2 * ((uplinkUnit - 1) % 5)); + + int downlinkMagnitude = (downlinkUnit - 1) / 5; + int uplinkMagnitude = (uplinkUnit - 1) / 5; + + int downlink = downlinkValue * downlinkFactor; + int uplink = uplinkValue * uplinkFactor; + + static const std::string units[5] = {"Kb/s", "Mb/s", "Gb/s", "Tb/s", "Pb/s"}; + + return "up[" + std::to_string(uplink) + units[uplinkMagnitude] + "] down[" + std::to_string(downlink) + + units[downlinkMagnitude] + "]"; +} + } // namespace nas \ No newline at end of file diff --git a/src/lib/nas/ie4.hpp b/src/lib/nas/ie4.hpp index 18cfaa6bb..1406054fe 100644 --- a/src/lib/nas/ie4.hpp +++ b/src/lib/nas/ie4.hpp @@ -573,5 +573,6 @@ struct IE5gsTrackingAreaIdentityList : InformationElement4 }; Json ToJson(const IEPduAddress &v); +Json ToJson(const IESessionAmbr &v); } // namespace nas diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index ea50bf601..f24ebef34 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -160,6 +160,9 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) std::vector arr{}; for (auto *pduSession : m_base->nasTask->sm->m_pduSessions) { + if (pduSession->psi == 0) + continue; + arr.push_back(Json::Obj({ {"ID", pduSession->psi}, {"state", ToJson(pduSession->psState)}, @@ -168,7 +171,7 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"s-nssai", ToJson(pduSession->sNssai)}, {"emergency", pduSession->isEmergency}, {"address", ::ToJson(pduSession->pduAddress)}, - {"ambr", ""}, // TODO + {"ambr", ::ToJson(pduSession->sessionAmbr)}, {"data-pending", pduSession->uplinkPending}, })); } From ea444284a6b65da469dc67b60d64f022347ac690 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 20:28:39 +0300 Subject: [PATCH 299/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index f24ebef34..cf4af96cb 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -157,14 +157,13 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) break; } case app::UeCliCommand::PS_LIST: { - std::vector arr{}; + Json json = Json::Obj({}); for (auto *pduSession : m_base->nasTask->sm->m_pduSessions) { - if (pduSession->psi == 0) + if (pduSession->psi == 0 || pduSession->psState == EPsState::INACTIVE) continue; - arr.push_back(Json::Obj({ - {"ID", pduSession->psi}, + auto obj = Json::Obj({ {"state", ToJson(pduSession->psState)}, {"session-type", ToJson(pduSession->sessionType)}, {"apn", ::ToJson(pduSession->apn)}, @@ -173,9 +172,11 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"address", ::ToJson(pduSession->pduAddress)}, {"ambr", ::ToJson(pduSession->sessionAmbr)}, {"data-pending", pduSession->uplinkPending}, - })); + }); + + json.put(std::to_string(pduSession->psi), obj); } - sendResult(msg.address, Json::Arr(arr).dumpYaml()); + sendResult(msg.address, json.dumpYaml()); break; } } From 6e63a210c582628f9199d9da27c785aa21270226 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 20:30:08 +0300 Subject: [PATCH 300/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index cf4af96cb..3790741ae 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -174,7 +174,7 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"data-pending", pduSession->uplinkPending}, }); - json.put(std::to_string(pduSession->psi), obj); + json.put("PDU Session" + std::to_string(pduSession->psi), obj); } sendResult(msg.address, json.dumpYaml()); break; From 6308b9234612f1fa705cf8068d2540d4aca6949a Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 20:35:48 +0300 Subject: [PATCH 301/311] L3 RRC/NAS developments --- src/lib/app/cli_cmd.cpp | 10 ++++++++++ src/lib/app/cli_cmd.hpp | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/lib/app/cli_cmd.cpp b/src/lib/app/cli_cmd.cpp index 603ac6ae6..8eecc819f 100644 --- a/src/lib/app/cli_cmd.cpp +++ b/src/lib/app/cli_cmd.cpp @@ -158,6 +158,8 @@ static OrderedMap g_ueCmdEntries = { {"info", {"Show some information about the UE", "", DefaultDesc, false}}, {"status", {"Show some status information about the UE", "", DefaultDesc, false}}, {"timers", {"Dump current status of the timers in the UE", "", DefaultDesc, false}}, + {"rls-state", {"Show status information about RLS", "", DefaultDesc, false}}, + {"coverage", {"Dump available cells and PLMNs in the coverage", "", DefaultDesc, false}}, {"ps-establish", {"Trigger a PDU session establishment procedure", " [options]", DescForPsEstablish, true}}, {"ps-list", {"List all PDU sessions", "", DefaultDesc, false}}, @@ -321,6 +323,14 @@ static std::unique_ptr UeCliParseImpl(const std::string &subCmd, c { return std::make_unique(UeCliCommand::PS_LIST); } + else if (subCmd == "rls-info") + { + return std::make_unique(UeCliCommand::RLS_INFO); + } + else if (subCmd == "coverage") + { + return std::make_unique(UeCliCommand::COVERAGE); + } return nullptr; } diff --git a/src/lib/app/cli_cmd.hpp b/src/lib/app/cli_cmd.hpp index 02eeda01c..585f003cf 100644 --- a/src/lib/app/cli_cmd.hpp +++ b/src/lib/app/cli_cmd.hpp @@ -54,6 +54,8 @@ struct UeCliCommand PS_RELEASE_ALL, PS_LIST, DE_REGISTER, + RLS_INFO, + COVERAGE, } present; // DE_REGISTER From 0455b4d4283c779b7cca9105b3fd6f349da7c3e2 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 20:40:08 +0300 Subject: [PATCH 302/311] L3 RRC/NAS developments --- src/lib/app/cli_cmd.cpp | 4 ++-- src/lib/app/cli_cmd.hpp | 2 +- src/ue/app/cmd_handler.cpp | 10 ++++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/lib/app/cli_cmd.cpp b/src/lib/app/cli_cmd.cpp index 8eecc819f..5a0b847a3 100644 --- a/src/lib/app/cli_cmd.cpp +++ b/src/lib/app/cli_cmd.cpp @@ -323,9 +323,9 @@ static std::unique_ptr UeCliParseImpl(const std::string &subCmd, c { return std::make_unique(UeCliCommand::PS_LIST); } - else if (subCmd == "rls-info") + else if (subCmd == "rls-state") { - return std::make_unique(UeCliCommand::RLS_INFO); + return std::make_unique(UeCliCommand::RLS_STATE); } else if (subCmd == "coverage") { diff --git a/src/lib/app/cli_cmd.hpp b/src/lib/app/cli_cmd.hpp index 585f003cf..49b32d891 100644 --- a/src/lib/app/cli_cmd.hpp +++ b/src/lib/app/cli_cmd.hpp @@ -54,7 +54,7 @@ struct UeCliCommand PS_RELEASE_ALL, PS_LIST, DE_REGISTER, - RLS_INFO, + RLS_STATE, COVERAGE, } present; diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 3790741ae..477db637f 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -179,6 +179,16 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) sendResult(msg.address, json.dumpYaml()); break; } + case app::UeCliCommand::RLS_STATE: { + Json json = Json::Obj({ + {"STI", OctetString::FromOctet8(m_base->rlsTask->m_shCtx->sti).toHexString()}, + }); + sendResult(msg.address, json.dumpYaml()); + break; + } + case app::UeCliCommand::COVERAGE: { + break; + } } } From 99a9851f3c44d846f87830c36386d185444fc237 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 20:56:58 +0300 Subject: [PATCH 303/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 42 +++++++++++++++++++++++++++++++++++++- src/ue/rls/udp_task.hpp | 2 ++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 477db637f..1db416f2c 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -181,12 +181,52 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) } case app::UeCliCommand::RLS_STATE: { Json json = Json::Obj({ - {"STI", OctetString::FromOctet8(m_base->rlsTask->m_shCtx->sti).toHexString()}, + {"sti", OctetString::FromOctet8(m_base->rlsTask->m_shCtx->sti).toHexString()}, + {"gnb-search-space", ::ToJson(m_base->config->gnbSearchList)}, }); sendResult(msg.address, json.dumpYaml()); break; } case app::UeCliCommand::COVERAGE: { + Json json = Json::Obj({}); + + const auto &cells = m_base->rrcTask->m_cellDesc; + for (auto &item : cells) + { + auto &cell = item.second; + + auto mib = Json{}; + auto sib1 = Json{}; + + if (cell.mib.hasMib) + { + mib = Json::Obj({ + {"barred", cell.mib.isBarred}, + {"intra-freq-reselection", + std::string{cell.mib.isIntraFreqReselectAllowed ? "allowed" : "not-allowed"}}, + }); + } + if (cell.sib1.hasSib1) + { + sib1 = Json::Obj({ + {"nr-cell-id", utils::IntToHex(cell.sib1.nci)}, + {"plmn", ToJson(cell.sib1.plmn)}, + {"tac", cell.sib1.tac}, + {"operator-reserved", cell.sib1.isReserved}, + }); + } + + auto obj = Json::Obj({{"signal", std::to_string(cell.dbm) + " dBm (" + SignalDescription(cell.dbm) + ")"}, + {"mib", mib}, + {"sib1", sib1}}); + + json.put("[" + std::to_string(item.first) + "]", obj); + } + + if (cells.empty()) + json = "No cell available"; + + sendResult(msg.address, json.dumpYaml()); break; } } diff --git a/src/ue/rls/udp_task.hpp b/src/ue/rls/udp_task.hpp index ed96abe31..ef093b5d4 100644 --- a/src/ue/rls/udp_task.hpp +++ b/src/ue/rls/udp_task.hpp @@ -43,6 +43,8 @@ class RlsUdpTask : public NtsTask Vector3 m_simPos; int m_cellIdCounter; + friend class UeCmdHandler; + public: explicit RlsUdpTask(TaskBase *base, RlsSharedContext* shCtx, const std::vector &searchSpace); ~RlsUdpTask() override = default; From c54ff570ccd71e2aec28edd8aa3e0bb2f9ff3351 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 21:04:09 +0300 Subject: [PATCH 304/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 10 +++++++++- src/ue/types.cpp | 10 ---------- src/ue/types.hpp | 1 - 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 1db416f2c..c4c1683e7 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -119,7 +119,15 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) break; } case app::UeCliCommand::INFO: { - sendResult(msg.address, ToJson(*m_base->config).dumpYaml()); + auto json = Json::Obj({ + {"supi", ToJson(m_base->config->supi)}, + {"hplmn", ToJson(m_base->config->hplmn)}, + {"imei", ::ToJson(m_base->config->imei)}, + {"imeiSv", ::ToJson(m_base->config->imeiSv)}, + {"eCallOnly", ::ToJson(m_base->nasTask->usim->m_isECallOnly)}, + }); + + sendResult(msg.address, json.dumpYaml()); break; } case app::UeCliCommand::TIMERS: { diff --git a/src/ue/types.cpp b/src/ue/types.cpp index 65b8a78b5..caa1497a6 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -218,16 +218,6 @@ Json ToJson(const ERegUpdateCause &v) } } -Json ToJson(const UeConfig &v) -{ - return Json::Obj({ - {"supi", ToJson(v.supi)}, - {"hplmn", ToJson(v.hplmn)}, - {"imei", ::ToJson(v.imei)}, - {"imeiSv", ::ToJson(v.imeiSv)}, - }); -} - Json ToJson(const NasTimers &v) { return Json::Obj({ diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 397bb3754..12bc72113 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -562,7 +562,6 @@ Json ToJson(const ERmState &state); Json ToJson(const EMmState &state); Json ToJson(const EMmSubState &state); Json ToJson(const E5UState &state); -Json ToJson(const UeConfig &v); Json ToJson(const NasTimers &v); Json ToJson(const ERegUpdateCause &v); Json ToJson(const EPsState &v); From 35574c7a8197fc2dddf1d17f35756799bee3b63b Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 21:05:07 +0300 Subject: [PATCH 305/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index c4c1683e7..bfaa1caa1 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -123,8 +123,8 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"supi", ToJson(m_base->config->supi)}, {"hplmn", ToJson(m_base->config->hplmn)}, {"imei", ::ToJson(m_base->config->imei)}, - {"imeiSv", ::ToJson(m_base->config->imeiSv)}, - {"eCallOnly", ::ToJson(m_base->nasTask->usim->m_isECallOnly)}, + {"imeisv", ::ToJson(m_base->config->imeiSv)}, + {"ecall-only", ::ToJson(m_base->nasTask->usim->m_isECallOnly)}, }); sendResult(msg.address, json.dumpYaml()); From 707f4b9eb675c3d1582295eba230a79b9d3fb994 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 21:12:19 +0300 Subject: [PATCH 306/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index bfaa1caa1..4d512148e 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -105,12 +105,28 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) switch (msg.cmd->present) { case app::UeCliCommand::STATUS: { + std::optional currentCellId = std::nullopt; + std::optional currentPlmn = std::nullopt; + std::optional currentTac = std::nullopt; + + auto currentCell = m_base->shCtx.currentCell.get(); + if (currentCell.hasValue()) + { + currentCellId = currentCell.cellId; + currentPlmn = currentCell.plmn; + currentTac = currentCell.tac; + } + Json json = Json::Obj({ {"cm-state", ToJson(m_base->nasTask->mm->m_cmState)}, {"rm-state", ToJson(m_base->nasTask->mm->m_rmState)}, {"mm-state", ToJson(m_base->nasTask->mm->m_mmSubState)}, {"5u-state", ToJson(m_base->nasTask->mm->m_storage->uState->get())}, {"sim-inserted", m_base->nasTask->mm->m_usim->isValid()}, + {"selected-plmn", ::ToJson(m_base->shCtx.selectedPlmn.get())}, + {"current-cell", ::ToJson(currentCellId)}, + {"current-plmn", ::ToJson(currentPlmn)}, + {"current-tac", ::ToJson(currentTac)}, {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, {"stored-guti", ToJson(m_base->nasTask->mm->m_storage->storedGuti->get())}, {"has-emergency", ::ToJson(m_base->nasTask->mm->hasEmergency())}, From a3363e6890b7107e8803c099b4a9821fbf9336f8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 21:15:44 +0300 Subject: [PATCH 307/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 4d512148e..3040f7f05 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -105,18 +105,6 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) switch (msg.cmd->present) { case app::UeCliCommand::STATUS: { - std::optional currentCellId = std::nullopt; - std::optional currentPlmn = std::nullopt; - std::optional currentTac = std::nullopt; - - auto currentCell = m_base->shCtx.currentCell.get(); - if (currentCell.hasValue()) - { - currentCellId = currentCell.cellId; - currentPlmn = currentCell.plmn; - currentTac = currentCell.tac; - } - Json json = Json::Obj({ {"cm-state", ToJson(m_base->nasTask->mm->m_cmState)}, {"rm-state", ToJson(m_base->nasTask->mm->m_rmState)}, @@ -124,9 +112,11 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"5u-state", ToJson(m_base->nasTask->mm->m_storage->uState->get())}, {"sim-inserted", m_base->nasTask->mm->m_usim->isValid()}, {"selected-plmn", ::ToJson(m_base->shCtx.selectedPlmn.get())}, - {"current-cell", ::ToJson(currentCellId)}, - {"current-plmn", ::ToJson(currentPlmn)}, - {"current-tac", ::ToJson(currentTac)}, + {"current-cell", ::ToJson(m_base->shCtx.currentCell.get().cellId)}, + {"current-plmn", ::ToJson(m_base->shCtx.getCurrentPlmn())}, + {"current-tac", ::ToJson(m_base->shCtx.currentCell.get().tac)}, + {"tai-list", ""}, + {"last-tai", ""}, {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, {"stored-guti", ToJson(m_base->nasTask->mm->m_storage->storedGuti->get())}, {"has-emergency", ::ToJson(m_base->nasTask->mm->hasEmergency())}, From cc3c83e7b5edcea4b0125d9e879d22231b908790 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 21:17:15 +0300 Subject: [PATCH 308/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 18 +++++++++++++++--- src/utils/common_types.cpp | 3 +++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 3040f7f05..b18946cc9 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -105,6 +105,18 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) switch (msg.cmd->present) { case app::UeCliCommand::STATUS: { + std::optional currentCellId = std::nullopt; + std::optional currentPlmn = std::nullopt; + std::optional currentTac = std::nullopt; + + auto currentCell = m_base->shCtx.currentCell.get(); + if (currentCell.hasValue()) + { + currentCellId = currentCell.cellId; + currentPlmn = currentCell.plmn; + currentTac = currentCell.tac; + } + Json json = Json::Obj({ {"cm-state", ToJson(m_base->nasTask->mm->m_cmState)}, {"rm-state", ToJson(m_base->nasTask->mm->m_rmState)}, @@ -112,9 +124,9 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"5u-state", ToJson(m_base->nasTask->mm->m_storage->uState->get())}, {"sim-inserted", m_base->nasTask->mm->m_usim->isValid()}, {"selected-plmn", ::ToJson(m_base->shCtx.selectedPlmn.get())}, - {"current-cell", ::ToJson(m_base->shCtx.currentCell.get().cellId)}, - {"current-plmn", ::ToJson(m_base->shCtx.getCurrentPlmn())}, - {"current-tac", ::ToJson(m_base->shCtx.currentCell.get().tac)}, + {"current-cell", ::ToJson(currentCellId)}, + {"current-plmn", ::ToJson(currentPlmn)}, + {"current-tac", ::ToJson(currentTac)}, {"tai-list", ""}, {"last-tai", ""}, {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 169aa5bd6..2e5e5a30c 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -36,6 +36,9 @@ Json ToJson(const Supi &v) Json ToJson(const Plmn &v) { + if (!v.hasValue()) + return nullptr; + std::stringstream ss{}; ss << std::setfill('0') << std::setw(3) << v.mcc << "/"; ss << std::setfill('0') << std::setw(v.isLongMnc ? 3 : 2) << v.mnc; From c4c9ea6a4a061dd73057b692206b61b57f9049a6 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 21:29:13 +0300 Subject: [PATCH 309/311] L3 RRC/NAS developments --- src/lib/nas/storage.hpp | 12 ++++++++++++ src/ue/app/cmd_handler.cpp | 2 +- src/utils/common_types.cpp | 7 +++++++ src/utils/common_types.hpp | 1 + src/utils/json.cpp | 4 ++-- src/utils/json.hpp | 4 ++-- 6 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/lib/nas/storage.hpp b/src/lib/nas/storage.hpp index b434496c7..3c0f3a82d 100644 --- a/src/lib/nas/storage.hpp +++ b/src/lib/nas/storage.hpp @@ -13,6 +13,7 @@ #include #include +#include namespace nas { @@ -207,6 +208,11 @@ class NasSlot return m_value; } + const T &getPure() const + { + return m_value; + } + void clear() { set(T{}); @@ -267,3 +273,9 @@ class NasSlot }; } // namespace nas + +template +inline Json ToJson(const nas::NasSlot &v) +{ + return ToJson(v.getPure()); +} diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index b18946cc9..11aa70023 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -128,7 +128,7 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"current-plmn", ::ToJson(currentPlmn)}, {"current-tac", ::ToJson(currentTac)}, {"tai-list", ""}, - {"last-tai", ""}, + {"last-tai", ToJson(m_base->nasTask->mm->m_storage->lastVisitedRegisteredTai)}, {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, {"stored-guti", ToJson(m_base->nasTask->mm->m_storage->storedGuti->get())}, {"has-emergency", ::ToJson(m_base->nasTask->mm->hasEmergency())}, diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 2e5e5a30c..0cddc21a5 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -175,6 +175,13 @@ Json ToJson(const EInitialRegCause &v) } } +Json ToJson(const Tai &v) +{ + if (!v.hasValue()) + return nullptr; + return "PLMN[" + ToJson(v.plmn).str() + "] TAC[" + std::to_string(v.tac) + "]"; +} + void NetworkSlice::addIfNotExists(const SingleSlice &slice) { if (!std::any_of(slices.begin(), slices.end(), [&slice](auto &s) { return s == slice; })) diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 040319b3d..642d43d98 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -206,6 +206,7 @@ bool operator!=(const GlobalNci &lhs, const GlobalNci &rhs); Json ToJson(const Supi &v); Json ToJson(const Plmn &v); +Json ToJson(const Tai &v); Json ToJson(const SingleSlice &v); Json ToJson(const NetworkSlice &v); Json ToJson(const PlmnSupport &v); diff --git a/src/utils/json.cpp b/src/utils/json.cpp index 30de77887..33560916c 100644 --- a/src/utils/json.cpp +++ b/src/utils/json.cpp @@ -161,7 +161,7 @@ Json::Json() : m_type{Type::NULL_TYPE} { } -Json::Json(nullptr_t) : m_type{Type::NULL_TYPE} +Json::Json(std::nullptr_t) : m_type{Type::NULL_TYPE} { } @@ -362,7 +362,7 @@ void Json::put(std::string key, Json value) m_children.emplace_back(std::move(key), std::move(value)); } -Json ToJson(nullptr_t) +Json ToJson(std::nullptr_t) { return nullptr; } diff --git a/src/utils/json.hpp b/src/utils/json.hpp index 4667ea1f0..cff6aa7f3 100644 --- a/src/utils/json.hpp +++ b/src/utils/json.hpp @@ -47,7 +47,7 @@ class Json public: Json(); - /* no-explicit */ Json(nullptr_t v); + /* no-explicit */ Json(std::nullptr_t v); /* no-explicit */ Json(std::string str); /* no-explicit */ Json(bool v); /* no-explicit */ Json(uint8_t v); @@ -105,7 +105,7 @@ class Json [[nodiscard]] std::string dumpYaml() const; }; -Json ToJson(nullptr_t); +Json ToJson(std::nullptr_t); Json ToJson(bool v); Json ToJson(const std::string &v); Json ToJson(uint8_t v); From d998b2cec44c6aac772b1b1bc334737fd7828215 Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 21:38:06 +0300 Subject: [PATCH 310/311] L3 RRC/NAS developments --- src/ue/app/cmd_handler.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 11aa70023..8110a9539 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -127,7 +127,6 @@ void UeCmdHandler::handleCmdImpl(NmUeCliCommand &msg) {"current-cell", ::ToJson(currentCellId)}, {"current-plmn", ::ToJson(currentPlmn)}, {"current-tac", ::ToJson(currentTac)}, - {"tai-list", ""}, {"last-tai", ToJson(m_base->nasTask->mm->m_storage->lastVisitedRegisteredTai)}, {"stored-suci", ToJson(m_base->nasTask->mm->m_storage->storedSuci->get())}, {"stored-guti", ToJson(m_base->nasTask->mm->m_storage->storedGuti->get())}, From 78a27d3b1c14444e01f8839c63bf4949efae8e9e Mon Sep 17 00:00:00 2001 From: aligungr Date: Fri, 28 May 2021 21:40:21 +0300 Subject: [PATCH 311/311] Release of v3.2.0 --- README.md | 2 +- src/utils/constants.hpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0cd99b792..6f1ccfcaf 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

- +

diff --git a/src/utils/constants.hpp b/src/utils/constants.hpp index 380c29c96..94fb8d27a 100644 --- a/src/utils/constants.hpp +++ b/src/utils/constants.hpp @@ -14,11 +14,11 @@ struct cons { // Version information static constexpr const uint8_t Major = 3; - static constexpr const uint8_t Minor = 1; - static constexpr const uint8_t Patch = 9; + static constexpr const uint8_t Minor = 2; + static constexpr const uint8_t Patch = 0; static constexpr const char *Project = "UERANSIM"; - static constexpr const char *Tag = "v3.1.9"; - static constexpr const char *Name = "UERANSIM v3.1.9"; + static constexpr const char *Tag = "v3.2.0"; + static constexpr const char *Name = "UERANSIM v3.2.0"; static constexpr const char *Owner = "ALİ GÜNGÖR"; // Some port values