From eab12cc8567081ef87d9a4a59c3fd4447957b6a8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 18:06:45 +0300 Subject: [PATCH 001/116] UE cell coverage detection mechanism --- CMakeLists.txt | 3 ++ src/sas/CMakeLists.txt | 11 +++++ src/sas/pdu.cpp | 99 ++++++++++++++++++++++++++++++++++++++ src/sas/pdu.hpp | 59 +++++++++++++++++++++++ src/ue/sas/measurement.cpp | 84 ++++++++++++++++++++++++++++++++ src/ue/sas/task.cpp | 83 ++++++++++++++++++++++++++++++++ src/ue/sas/task.hpp | 59 +++++++++++++++++++++++ src/ue/sas/transport.cpp | 35 ++++++++++++++ src/ue/types.hpp | 2 + src/ue/ue.cpp | 5 ++ src/utils/common.hpp | 7 +++ src/utils/common_types.cpp | 32 ++++++++++++ src/utils/common_types.hpp | 41 +++++++++++++++- 13 files changed, 519 insertions(+), 1 deletion(-) create mode 100644 src/sas/CMakeLists.txt create mode 100644 src/sas/pdu.cpp create mode 100644 src/sas/pdu.hpp create mode 100644 src/ue/sas/measurement.cpp create mode 100644 src/ue/sas/task.cpp create mode 100644 src/ue/sas/task.hpp create mode 100644 src/ue/sas/transport.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b4f9646d2..faf051cf6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,7 @@ add_subdirectory(src/app) add_subdirectory(src/urs) add_subdirectory(src/crypt) add_subdirectory(src/ue) +add_subdirectory(src/sas) #################### GNB EXECUTABLE #################### @@ -42,6 +43,7 @@ target_link_libraries(nr-gnb udp) target_link_libraries(nr-gnb app) target_link_libraries(nr-gnb urs) target_link_libraries(nr-gnb crypt) +target_link_libraries(nr-gnb sas) #################### UE EXECUTABLE #################### @@ -58,6 +60,7 @@ target_link_libraries(nr-ue app) target_link_libraries(nr-ue urs) target_link_libraries(nr-ue crypt) target_link_libraries(nr-ue ue) +target_link_libraries(nr-ue sas) ###################### IF BINDER ###################### add_library(devbnd SHARED src/binder.cpp) diff --git a/src/sas/CMakeLists.txt b/src/sas/CMakeLists.txt new file mode 100644 index 000000000..069e448c4 --- /dev/null +++ b/src/sas/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.17) + +file(GLOB_RECURSE HDR_FILES *.hpp) +file(GLOB_RECURSE SRC_FILES *.cpp) + +add_library(sas ${HDR_FILES} ${SRC_FILES}) + +target_compile_options(sas PRIVATE -Wall -Wextra -pedantic -Wno-unused-parameter) + +target_link_libraries(sas utils) +target_link_libraries(sas udp) diff --git a/src/sas/pdu.cpp b/src/sas/pdu.cpp new file mode 100644 index 000000000..9b76d25d7 --- /dev/null +++ b/src/sas/pdu.cpp @@ -0,0 +1,99 @@ +// +// 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 "pdu.hpp" +#include + +namespace sas +{ + +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 EncodeSasMessage(const SasMessage &msg, OctetString &stream) +{ + stream.appendOctet(0x03); // (Just for old RLS compatibility) + + stream.appendOctet(cons::Major); + stream.appendOctet(cons::Minor); + stream.appendOctet(cons::Patch); + stream.appendOctet(static_cast(msg.msgType)); + if (msg.msgType == SasMessageType::CELL_INFO_REQUEST) + { + auto m = (const SasCellInfoRequest &)msg; + stream.appendOctet4(m.simPos); + } + else if (msg.msgType == SasMessageType::CELL_INFO_RESPONSE) + { + auto m = (const SasCellInfoResponse &)msg; + AppendGlobalNci(m.cellId, stream); + stream.appendOctet4(m.tac); + stream.appendOctet4(m.dbm); + } +} + +std::unique_ptr DecodeSasMessage(const OctetView &stream) +{ + auto first = stream.readI(); // (Just for old RLS compatibility) + if (first != 3) + return nullptr; + + if (stream.read() != cons::Major) + return nullptr; + if (stream.read() != cons::Minor) + return nullptr; + if (stream.read() != cons::Patch) + return nullptr; + + auto msgType = static_cast(stream.readI()); + if (msgType == SasMessageType::CELL_INFO_REQUEST) + { + auto res = std::make_unique(); + res->simPos = stream.read4I(); + return res; + } + else if (msgType == SasMessageType::CELL_INFO_RESPONSE) + { + auto res = std::make_unique(); + res->cellId = DecodeGlobalNci(stream); + res->tac = stream.read4I(); + res->dbm = stream.read4I(); + return res; + } + + return nullptr; +} + +} // namespace sas diff --git a/src/sas/pdu.hpp b/src/sas/pdu.hpp new file mode 100644 index 000000000..41410ca08 --- /dev/null +++ b/src/sas/pdu.hpp @@ -0,0 +1,59 @@ +// +// 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 + +namespace sas +{ + +enum class SasMessageType : uint8_t +{ + RESERVED = 0, + CELL_INFO_REQUEST, + CELL_INFO_RESPONSE, +}; + +struct SasMessage +{ + const SasMessageType msgType; + + explicit SasMessage(SasMessageType msgType) : msgType(msgType) + { + } +}; + +struct SasCellInfoRequest : SasMessage +{ + int32_t simPos{}; + + SasCellInfoRequest() : SasMessage(SasMessageType::CELL_INFO_REQUEST) + { + } +}; + +struct SasCellInfoResponse : SasMessage +{ + GlobalNci cellId{}; + int32_t tac{}; + int32_t dbm{}; + + SasCellInfoResponse() : SasMessage(SasMessageType::CELL_INFO_RESPONSE) + { + } +}; + +void EncodeSasMessage(const SasMessage &msg, OctetString &stream); +std::unique_ptr DecodeSasMessage(const OctetView &stream); + +} // namespace sas \ No newline at end of file diff --git a/src/ue/sas/measurement.cpp b/src/ue/sas/measurement.cpp new file mode 100644 index 000000000..1b41c6ae0 --- /dev/null +++ b/src/ue/sas/measurement.cpp @@ -0,0 +1,84 @@ +// +// 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 + +static int DBM_STRONG_STRENGTH_THRESHOLD = -70; + +namespace nr::ue +{ + +void UeSasTask::onMeasurement() +{ + evaluatePendingMeasurements(); + requestCellInfo(); +} + +void UeSasTask::evaluatePendingMeasurements() +{ + std::vector entered{}; + std::vector exited{}; + + // compare active and pending measurements + for (auto &m : m_activeMeasurements) + { + bool newStrong = m.second.dbm >= DBM_STRONG_STRENGTH_THRESHOLD; + if (m_pendingMeasurements.count(m.first)) + { + bool oldStrong = m_pendingMeasurements[m.first].dbm >= DBM_STRONG_STRENGTH_THRESHOLD; + if (newStrong ^ oldStrong) + (newStrong ? entered : exited).push_back(m.first); + } + else if (newStrong) + entered.push_back(m.first); + } + for (auto &m : m_pendingMeasurements) + { + bool oldStrong = m_pendingMeasurements[m.first].dbm >= DBM_STRONG_STRENGTH_THRESHOLD; + if (!m_activeMeasurements.count(m.first) && oldStrong) + exited.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 = {}; +} + +void UeSasTask::requestCellInfo() +{ + for (auto &ip : m_cellSearchSpace) + { + sas::SasCellInfoRequest req{}; + sendSasMessage(ip, req); + } +} + +void UeSasTask::receiveCellInfoResponse(const sas::SasCellInfoResponse &msg) +{ + UeCellMeasurement meas{}; + meas.cellId = msg.cellId; + meas.tac = msg.tac; + meas.dbm = msg.dbm; + meas.time = utils::CurrentTimeMillis(); + + m_pendingMeasurements[meas.cellId] = meas; +} + +void UeSasTask::onCoverageChange(const std::vector &entered, const std::vector &exited) +{ + m_logger->debug("Coverage change detected. [%d] cell entered, [%d] exited to/from coverage", + static_cast(entered.size()), static_cast(exited.size())); + + // TODO +} + +} // namespace nr::ue diff --git a/src/ue/sas/task.cpp b/src/ue/sas/task.cpp new file mode 100644 index 000000000..7e1b6a11b --- /dev/null +++ b/src/ue/sas/task.cpp @@ -0,0 +1,83 @@ +// +// 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 + +static const int TIMER_ID_MEASUREMENT = 1; +static const int TIMER_PERIOD_MEASUREMENT = 2000; + +namespace nr::ue +{ + +UeSasTask::UeSasTask(TaskBase *base) + : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{} +{ + m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "sas"); + + for (auto &addr : m_base->config->gnbSearchList) + m_cellSearchSpace.emplace_back(addr, cons::PortalPort); +} + +void UeSasTask::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, TIMER_PERIOD_MEASUREMENT); + onMeasurement(); +} + +void UeSasTask::onLoop() +{ + NtsMessage *msg = take(); + if (!msg) + return; + + switch (msg->msgType) + { + case NtsMessageType::TIMER_EXPIRED: { + auto *w = dynamic_cast(msg); + if (w->timerId == TIMER_ID_MEASUREMENT) + { + setTimer(TIMER_ID_MEASUREMENT, TIMER_PERIOD_MEASUREMENT); + onMeasurement(); + } + break; + } + case NtsMessageType::UDP_SERVER_RECEIVE: { + auto *w = dynamic_cast(msg); + auto sasMsg = sas::DecodeSasMessage(OctetView{w->packet}); + if (sasMsg == nullptr) + { + m_logger->err("Unable to decode SAS message"); + break; + } + receiveSasMessage(w->fromAddress, *sasMsg); + break; + } + default: + m_logger->unhandledNts(msg); + break; + } + + delete msg; +} + +void UeSasTask::onQuit() +{ + m_udpTask->quit(); + delete m_udpTask; +} + +} // namespace nr::ue diff --git a/src/ue/sas/task.hpp b/src/ue/sas/task.hpp new file mode 100644 index 000000000..781106919 --- /dev/null +++ b/src/ue/sas/task.hpp @@ -0,0 +1,59 @@ +// +// 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 +#include +#include +#include + +namespace nr::ue +{ + +class UeSasTask : 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; + + friend class UeCmdHandler; + + public: + explicit UeSasTask(TaskBase *base); + ~UeSasTask() override = default; + + protected: + void onStart() override; + void onLoop() override; + void onQuit() override; + + private: /* Transport */ + void receiveSasMessage(const InetAddress &address, const sas::SasMessage &msg); + void sendSasMessage(const InetAddress &address, const sas::SasMessage &msg); + + private: /* Measurement */ + void onMeasurement(); + void evaluatePendingMeasurements(); + void requestCellInfo(); + void receiveCellInfoResponse(const sas::SasCellInfoResponse &msg); + void onCoverageChange(const std::vector &entered, const std::vector &exited); +}; + +} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/sas/transport.cpp b/src/ue/sas/transport.cpp new file mode 100644 index 000000000..2de67ead6 --- /dev/null +++ b/src/ue/sas/transport.cpp @@ -0,0 +1,35 @@ +// +// 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::ue +{ + +void UeSasTask::receiveSasMessage(const InetAddress &address, const sas::SasMessage &msg) +{ + switch (msg.msgType) + { + case sas::SasMessageType::CELL_INFO_RESPONSE: { + receiveCellInfoResponse((const sas::SasCellInfoResponse &)msg); + break; + default: + m_logger->err("Unhandled SAS message type[%d]", static_cast(msg.msgType)); + break; + } + } +} + +void UeSasTask::sendSasMessage(const InetAddress &address, const sas::SasMessage &msg) +{ + OctetString stream{}; + sas::EncodeSasMessage(msg, stream); + m_udpTask->send(address, stream); +} + +} // namespace nr::ue diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 54fa71fe9..4f51c9f68 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -27,6 +27,7 @@ class UeAppTask; class UeMrTask; class NasTask; class UeRrcTask; +class UeSasTask; class UserEquipment; struct SupportedAlgs @@ -125,6 +126,7 @@ struct TaskBase UeMrTask *mrTask{}; NasTask *nasTask{}; UeRrcTask *rrcTask{}; + UeSasTask *sasTask{}; }; struct UeTimers diff --git a/src/ue/ue.cpp b/src/ue/ue.cpp index 0d9354569..8d64eafa9 100644 --- a/src/ue/ue.cpp +++ b/src/ue/ue.cpp @@ -12,6 +12,7 @@ #include "mr/task.hpp" #include "nas/task.hpp" #include "rrc/task.hpp" +#include "sas/task.hpp" namespace nr::ue { @@ -31,6 +32,7 @@ UserEquipment::UserEquipment(UeConfig *config, app::IUeController *ueController, base->rrcTask = new UeRrcTask(base); base->mrTask = new UeMrTask(base); base->appTask = new UeAppTask(base); + base->sasTask = new UeSasTask(base); taskBase = base; } @@ -40,11 +42,13 @@ UserEquipment::~UserEquipment() taskBase->nasTask->quit(); taskBase->rrcTask->quit(); taskBase->mrTask->quit(); + taskBase->sasTask->quit(); taskBase->appTask->quit(); delete taskBase->nasTask; delete taskBase->rrcTask; delete taskBase->mrTask; + delete taskBase->sasTask; delete taskBase->appTask; delete taskBase->logBase; @@ -57,6 +61,7 @@ void UserEquipment::start() taskBase->nasTask->start(); taskBase->rrcTask->start(); taskBase->mrTask->start(); + taskBase->sasTask->start(); taskBase->appTask->start(); } diff --git a/src/utils/common.hpp b/src/utils/common.hpp index b07f1fd96..084a046fa 100644 --- a/src/utils/common.hpp +++ b/src/utils/common.hpp @@ -66,4 +66,11 @@ static std::string IntToHex(T i) return stream.str(); } +template +inline void HashCombine(std::size_t &seed, const T &v) +{ + std::hash hasher{}; + seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); +} + } // namespace utils \ No newline at end of file diff --git a/src/utils/common_types.cpp b/src/utils/common_types.cpp index 5fc072e49..32791ffda 100644 --- a/src/utils/common_types.cpp +++ b/src/utils/common_types.cpp @@ -7,6 +7,7 @@ // #include "common_types.hpp" +#include "common.hpp" #include #include #include @@ -85,8 +86,39 @@ bool operator==(const SingleSlice &lhs, const SingleSlice &rhs) return ((int)*lhs.sd) == ((int)*rhs.sd); } +bool operator==(const Plmn &lhs, const Plmn &rhs) +{ + if (lhs.mcc != rhs.mcc) + return false; + if (lhs.mnc != rhs.mnc) + return false; + return lhs.isLongMnc == rhs.isLongMnc; +} + +bool operator==(const GlobalNci &lhs, const GlobalNci &rhs) +{ + return lhs.plmn == rhs.plmn && lhs.nci == rhs.nci; +} + void NetworkSlice::addIfNotExists(const SingleSlice &slice) { if (!std::any_of(slices.begin(), slices.end(), [&slice](auto &s) { return s == slice; })) slices.push_back(slice); } + +std::size_t std::hash::operator()(const Plmn &v) const noexcept +{ + std::size_t h = 0; + utils::HashCombine(h, v.mcc); + utils::HashCombine(h, v.mnc); + utils::HashCombine(h, v.isLongMnc); + return h; +} + +std::size_t std::hash::operator()(const GlobalNci &v) const noexcept +{ + std::size_t h = 0; + utils::HashCombine(h, v.plmn); + utils::HashCombine(h, v.nci); + return h; +} diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index f2be86dc2..28371cff6 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -12,9 +12,9 @@ #include "octet.hpp" #include #include +#include #include #include -#include enum class EPagingDrx { @@ -126,4 +126,43 @@ Json ToJson(const NetworkSlice &v); Json ToJson(const PlmnSupport &v); Json ToJson(const EDeregCause &v); +struct GlobalNci +{ + Plmn plmn{}; + int64_t nci{}; + + GlobalNci() = default; + + GlobalNci(const Plmn &plmn, int64_t nci) : plmn(plmn), nci(nci) + { + } +}; + +struct UeCellMeasurement +{ + GlobalNci cellId{}; + int tac{}; + int dbm{}; + uint64_t time{}; +}; + bool operator==(const SingleSlice &lhs, const SingleSlice &rhs); +bool operator==(const Plmn &lhs, const Plmn &rhs); +bool operator==(const GlobalNci &lhs, const GlobalNci &rhs); + +namespace std +{ + +template <> +struct hash +{ + std::size_t operator()(const Plmn &v) const noexcept; +}; + +template <> +struct hash +{ + std::size_t operator()(const GlobalNci &v) const noexcept; +}; + +} // namespace std \ No newline at end of file From 19059d14926ea92a00724b876e7a27210baea048 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 18:25:17 +0300 Subject: [PATCH 002/116] UE SAS refactor --- src/ue/sas/measurement.cpp | 10 +--------- src/ue/sas/task.hpp | 2 -- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/ue/sas/measurement.cpp b/src/ue/sas/measurement.cpp index 1b41c6ae0..899627ed8 100644 --- a/src/ue/sas/measurement.cpp +++ b/src/ue/sas/measurement.cpp @@ -15,12 +15,6 @@ namespace nr::ue { void UeSasTask::onMeasurement() -{ - evaluatePendingMeasurements(); - requestCellInfo(); -} - -void UeSasTask::evaluatePendingMeasurements() { std::vector entered{}; std::vector exited{}; @@ -51,10 +45,8 @@ void UeSasTask::evaluatePendingMeasurements() m_activeMeasurements = m_pendingMeasurements; // clear pending measurements m_pendingMeasurements = {}; -} -void UeSasTask::requestCellInfo() -{ + // Issue another cell info request for search space for (auto &ip : m_cellSearchSpace) { sas::SasCellInfoRequest req{}; diff --git a/src/ue/sas/task.hpp b/src/ue/sas/task.hpp index 781106919..852b1c466 100644 --- a/src/ue/sas/task.hpp +++ b/src/ue/sas/task.hpp @@ -50,8 +50,6 @@ class UeSasTask : public NtsTask private: /* Measurement */ void onMeasurement(); - void evaluatePendingMeasurements(); - void requestCellInfo(); void receiveCellInfoResponse(const sas::SasCellInfoResponse &msg); void onCoverageChange(const std::vector &entered, const std::vector &exited); }; From 7f4f5086ede3e006046c8cc31f523b5d0c214f94 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 18:46:14 +0300 Subject: [PATCH 003/116] UE SAS refactor --- src/ue/nas/task.cpp | 2 -- src/ue/rrc/task.cpp | 1 - 2 files changed, 3 deletions(-) diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index fa17a8319..02e09faa6 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -28,8 +28,6 @@ NasTask::NasTask(TaskBase *base) : base{base}, timers{} void NasTask::onStart() { - logger->debug("NAS layer started"); - usim->initialize(base->config->supi.has_value(), base->config->initials); usim->m_currentPlmn = base->config->hplmn; // TODO: normally assigned after plmn search diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index a5a8ac5cf..f2cf2e9ec 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -29,7 +29,6 @@ UeRrcTask::UeRrcTask(TaskBase *base) : m_base{base} void UeRrcTask::onStart() { - m_logger->debug("RRC layer started"); } void UeRrcTask::onQuit() From 53548ab1dd0c41b9b1e03bf448084dbb745dd74f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 19:49:59 +0300 Subject: [PATCH 004/116] UE SAS refactor --- CMakeLists.txt | 3 --- src/sas/CMakeLists.txt | 11 ----------- src/ue/sas/task.hpp | 2 +- src/{sas/pdu.cpp => urs/sas_pdu.cpp} | 2 +- src/{sas/pdu.hpp => urs/sas_pdu.hpp} | 0 5 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 src/sas/CMakeLists.txt rename src/{sas/pdu.cpp => urs/sas_pdu.cpp} (99%) rename src/{sas/pdu.hpp => urs/sas_pdu.hpp} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index faf051cf6..b4f9646d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,6 @@ add_subdirectory(src/app) add_subdirectory(src/urs) add_subdirectory(src/crypt) add_subdirectory(src/ue) -add_subdirectory(src/sas) #################### GNB EXECUTABLE #################### @@ -43,7 +42,6 @@ target_link_libraries(nr-gnb udp) target_link_libraries(nr-gnb app) target_link_libraries(nr-gnb urs) target_link_libraries(nr-gnb crypt) -target_link_libraries(nr-gnb sas) #################### UE EXECUTABLE #################### @@ -60,7 +58,6 @@ target_link_libraries(nr-ue app) target_link_libraries(nr-ue urs) target_link_libraries(nr-ue crypt) target_link_libraries(nr-ue ue) -target_link_libraries(nr-ue sas) ###################### IF BINDER ###################### add_library(devbnd SHARED src/binder.cpp) diff --git a/src/sas/CMakeLists.txt b/src/sas/CMakeLists.txt deleted file mode 100644 index 069e448c4..000000000 --- a/src/sas/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.17) - -file(GLOB_RECURSE HDR_FILES *.hpp) -file(GLOB_RECURSE SRC_FILES *.cpp) - -add_library(sas ${HDR_FILES} ${SRC_FILES}) - -target_compile_options(sas PRIVATE -Wall -Wextra -pedantic -Wno-unused-parameter) - -target_link_libraries(sas utils) -target_link_libraries(sas udp) diff --git a/src/ue/sas/task.hpp b/src/ue/sas/task.hpp index 852b1c466..c26098ac1 100644 --- a/src/ue/sas/task.hpp +++ b/src/ue/sas/task.hpp @@ -9,7 +9,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/src/sas/pdu.cpp b/src/urs/sas_pdu.cpp similarity index 99% rename from src/sas/pdu.cpp rename to src/urs/sas_pdu.cpp index 9b76d25d7..2ab8879e1 100644 --- a/src/sas/pdu.cpp +++ b/src/urs/sas_pdu.cpp @@ -6,7 +6,7 @@ // and subject to the terms and conditions defined in LICENSE file. // -#include "pdu.hpp" +#include "sas_pdu.hpp" #include namespace sas diff --git a/src/sas/pdu.hpp b/src/urs/sas_pdu.hpp similarity index 100% rename from src/sas/pdu.hpp rename to src/urs/sas_pdu.hpp From 14fe33e51b7aba3f1245bdf701256b2b5d904c4a Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 20:34:50 +0300 Subject: [PATCH 005/116] UE SAS dev. --- src/gnb/gnb.cpp | 5 +++ src/gnb/sas/handler.cpp | 36 +++++++++++++++++++ src/gnb/sas/task.cpp | 74 ++++++++++++++++++++++++++++++++++++++ src/gnb/sas/task.hpp | 52 +++++++++++++++++++++++++++ src/gnb/sas/transport.cpp | 34 ++++++++++++++++++ src/gnb/types.hpp | 3 ++ src/ue/sas/measurement.cpp | 24 ++++++------- src/urs/sas_pdu.cpp | 8 +++-- src/urs/sas_pdu.hpp | 6 ++-- src/utils/common_types.hpp | 27 ++++++++++---- 10 files changed, 244 insertions(+), 25 deletions(-) create mode 100644 src/gnb/sas/handler.cpp create mode 100644 src/gnb/sas/task.cpp create mode 100644 src/gnb/sas/task.hpp create mode 100644 src/gnb/sas/transport.cpp diff --git a/src/gnb/gnb.cpp b/src/gnb/gnb.cpp index a277bc437..722e32e0d 100644 --- a/src/gnb/gnb.cpp +++ b/src/gnb/gnb.cpp @@ -12,6 +12,7 @@ #include "mr/task.hpp" #include "ngap/task.hpp" #include "rrc/task.hpp" +#include "sas/task.hpp" #include "sctp/task.hpp" #include @@ -34,6 +35,7 @@ GNodeB::GNodeB(GnbConfig *config, app::INodeListener *nodeListener, NtsTask *cli base->rrcTask = new GnbRrcTask(base); base->gtpTask = new GtpTask(base); base->mrTask = new GnbMrTask(base); + base->sasTask = new GnbSasTask(base); taskBase = base; } @@ -46,6 +48,7 @@ GNodeB::~GNodeB() taskBase->rrcTask->quit(); taskBase->gtpTask->quit(); taskBase->mrTask->quit(); + taskBase->sasTask->quit(); delete taskBase->appTask; delete taskBase->sctpTask; @@ -53,6 +56,7 @@ GNodeB::~GNodeB() delete taskBase->rrcTask; delete taskBase->gtpTask; delete taskBase->mrTask; + delete taskBase->sasTask; delete taskBase->logBase; @@ -65,6 +69,7 @@ void GNodeB::start() taskBase->sctpTask->start(); taskBase->ngapTask->start(); taskBase->rrcTask->start(); + taskBase->sasTask->start(); taskBase->mrTask->start(); taskBase->gtpTask->start(); } diff --git a/src/gnb/sas/handler.cpp b/src/gnb/sas/handler.cpp new file mode 100644 index 000000000..7b1f27f53 --- /dev/null +++ b/src/gnb/sas/handler.cpp @@ -0,0 +1,36 @@ +// +// 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 + +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)); + return -distance; +} + +namespace nr::gnb +{ + +void GnbSasTask::handleCellInfoRequest(const InetAddress &addr, const sas::SasCellInfoRequest &msg) +{ + sas::SasCellInfoResponse resp{}; + resp.cellId.nci = m_base->config->nci; + resp.cellId.plmn = m_base->config->plmn; + resp.tac = m_base->config->tac; + resp.dbm = EstimateSimulatedDbm(m_base->config->phyLocation, msg.simPos); + + sendSasMessage(addr, resp); +} + +} // namespace nr::gnb diff --git a/src/gnb/sas/task.cpp b/src/gnb/sas/task.cpp new file mode 100644 index 000000000..8bed9d0f1 --- /dev/null +++ b/src/gnb/sas/task.cpp @@ -0,0 +1,74 @@ +// +// 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::gnb +{ + +GnbSasTask::GnbSasTask(TaskBase *base) : m_base{base}, m_udpTask{} +{ + m_logger = m_base->logBase->makeUniqueLogger("sas"); +} + +void GnbSasTask::onStart() +{ + try + { + m_udpTask = new udp::UdpServerTask(m_base->config->portalIp, cons::PortalPort, this); + m_udpTask->start(); + } + catch (const LibError &e) + { + m_logger->err("SAS failure [%s]", e.what()); + quit(); + return; + } +} + +void GnbSasTask::onLoop() +{ + NtsMessage *msg = take(); + if (!msg) + return; + + switch (msg->msgType) + { + case NtsMessageType::UDP_SERVER_RECEIVE: { + auto *w = dynamic_cast(msg); + auto sasMsg = sas::DecodeSasMessage(OctetView{w->packet}); + if (sasMsg == nullptr) + { + m_logger->err("Unable to decode SAS message"); + break; + } + receiveSasMessage(w->fromAddress, *sasMsg); + break; + } + default: + m_logger->unhandledNts(msg); + break; + } + + delete msg; +} + +void GnbSasTask::onQuit() +{ + if (m_udpTask != nullptr) + m_udpTask->quit(); + delete m_udpTask; +} + + +} // namespace nr::gnb diff --git a/src/gnb/sas/task.hpp b/src/gnb/sas/task.hpp new file mode 100644 index 000000000..f5bb2cb00 --- /dev/null +++ b/src/gnb/sas/task.hpp @@ -0,0 +1,52 @@ +// +// 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 +#include +#include +#include +#include + +namespace nr::gnb +{ + +class GnbSasTask : public NtsTask +{ + private: + TaskBase *m_base; + std::unique_ptr m_logger; + udp::UdpServerTask *m_udpTask; + + friend class GnbCmdHandler; + + public: + explicit GnbSasTask(TaskBase *base); + ~GnbSasTask() override = default; + + protected: + void onStart() override; + void onLoop() override; + void onQuit() override; + + private: /* Transport */ + void receiveSasMessage(const InetAddress &addr, const sas::SasMessage &msg); + void sendSasMessage(const InetAddress &addr, const sas::SasMessage &msg); + + private: /* Handler */ + void handleCellInfoRequest(const InetAddress &addr, const sas::SasCellInfoRequest &msg); +}; + +} // namespace nr::gnb \ No newline at end of file diff --git a/src/gnb/sas/transport.cpp b/src/gnb/sas/transport.cpp new file mode 100644 index 000000000..cdc8dcc28 --- /dev/null +++ b/src/gnb/sas/transport.cpp @@ -0,0 +1,34 @@ +// +// 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 GnbSasTask::receiveSasMessage(const InetAddress &addr, const sas::SasMessage &msg) +{ + switch (msg.msgType) + { + case sas::SasMessageType::CELL_INFO_REQUEST: + handleCellInfoRequest(addr, (const sas::SasCellInfoRequest &)msg); + break; + default: + m_logger->err("Unhandled SAS message received with type[%d]", static_cast(msg.msgType)); + break; + } +} + +void GnbSasTask::sendSasMessage(const InetAddress &addr, const sas::SasMessage &msg) +{ + OctetString stream{}; + sas::EncodeSasMessage(msg, stream); + m_udpTask->send(addr, stream); +} + +} // namespace nr::gnb diff --git a/src/gnb/types.hpp b/src/gnb/types.hpp index 0afef9e4d..450446a31 100644 --- a/src/gnb/types.hpp +++ b/src/gnb/types.hpp @@ -26,6 +26,7 @@ class GtpTask; class GnbMrTask; class NgapTask; class GnbRrcTask; +class GnbSasTask; class SctpTask; enum class EAmfState @@ -299,6 +300,7 @@ struct GnbConfig /* Assigned by program */ std::string name{}; EPagingDrx pagingDrx{}; + Vector3 phyLocation{}; [[nodiscard]] inline uint32_t getGnbId() const { @@ -324,6 +326,7 @@ struct TaskBase NgapTask *ngapTask{}; GnbRrcTask *rrcTask{}; SctpTask *sctpTask{}; + GnbSasTask *sasTask{}; }; struct MrUeContext diff --git a/src/ue/sas/measurement.cpp b/src/ue/sas/measurement.cpp index 899627ed8..edaf3fbee 100644 --- a/src/ue/sas/measurement.cpp +++ b/src/ue/sas/measurement.cpp @@ -22,23 +22,23 @@ void UeSasTask::onMeasurement() // compare active and pending measurements for (auto &m : m_activeMeasurements) { - bool newStrong = m.second.dbm >= DBM_STRONG_STRENGTH_THRESHOLD; + bool oldStrong = m.second.dbm >= DBM_STRONG_STRENGTH_THRESHOLD; if (m_pendingMeasurements.count(m.first)) { - bool oldStrong = m_pendingMeasurements[m.first].dbm >= DBM_STRONG_STRENGTH_THRESHOLD; + bool newStrong = m_pendingMeasurements[m.first].dbm >= DBM_STRONG_STRENGTH_THRESHOLD; if (newStrong ^ oldStrong) (newStrong ? entered : exited).push_back(m.first); } - else if (newStrong) - entered.push_back(m.first); + else if (oldStrong) + exited.push_back(m.first); } for (auto &m : m_pendingMeasurements) { - bool oldStrong = m_pendingMeasurements[m.first].dbm >= DBM_STRONG_STRENGTH_THRESHOLD; - if (!m_activeMeasurements.count(m.first) && oldStrong) - exited.push_back(m.first); + bool newStrong = m_pendingMeasurements[m.first].dbm >= DBM_STRONG_STRENGTH_THRESHOLD; + if (!m_activeMeasurements.count(m.first) && newStrong) + entered.push_back(m.first); } - if (!entered.empty() && !exited.empty()) + if (!entered.empty() || !exited.empty()) onCoverageChange(entered, exited); // copy from pending to active measurements @@ -46,7 +46,7 @@ void UeSasTask::onMeasurement() // clear pending measurements m_pendingMeasurements = {}; - // Issue another cell info request for search space + // Issue another cell info request for each address in the search space for (auto &ip : m_cellSearchSpace) { sas::SasCellInfoRequest req{}; @@ -67,10 +67,8 @@ void UeSasTask::receiveCellInfoResponse(const sas::SasCellInfoResponse &msg) void UeSasTask::onCoverageChange(const std::vector &entered, const std::vector &exited) { - m_logger->debug("Coverage change detected. [%d] cell entered, [%d] exited to/from coverage", - static_cast(entered.size()), static_cast(exited.size())); - - // TODO + m_logger->debug("Coverage change detected. [%d] cell entered, [%d] cell exited", static_cast(entered.size()), + static_cast(exited.size())); } } // namespace nr::ue diff --git a/src/urs/sas_pdu.cpp b/src/urs/sas_pdu.cpp index 2ab8879e1..71654aa31 100644 --- a/src/urs/sas_pdu.cpp +++ b/src/urs/sas_pdu.cpp @@ -53,7 +53,9 @@ void EncodeSasMessage(const SasMessage &msg, OctetString &stream) if (msg.msgType == SasMessageType::CELL_INFO_REQUEST) { auto m = (const SasCellInfoRequest &)msg; - stream.appendOctet4(m.simPos); + stream.appendOctet4(m.simPos.x); + stream.appendOctet4(m.simPos.y); + stream.appendOctet4(m.simPos.z); } else if (msg.msgType == SasMessageType::CELL_INFO_RESPONSE) { @@ -81,7 +83,9 @@ std::unique_ptr DecodeSasMessage(const OctetView &stream) if (msgType == SasMessageType::CELL_INFO_REQUEST) { auto res = std::make_unique(); - res->simPos = stream.read4I(); + res->simPos.x = stream.read4I(); + res->simPos.y = stream.read4I(); + res->simPos.z = stream.read4I(); return res; } else if (msgType == SasMessageType::CELL_INFO_RESPONSE) diff --git a/src/urs/sas_pdu.hpp b/src/urs/sas_pdu.hpp index 41410ca08..561a57367 100644 --- a/src/urs/sas_pdu.hpp +++ b/src/urs/sas_pdu.hpp @@ -35,7 +35,7 @@ struct SasMessage struct SasCellInfoRequest : SasMessage { - int32_t simPos{}; + Vector3 simPos{}; SasCellInfoRequest() : SasMessage(SasMessageType::CELL_INFO_REQUEST) { @@ -45,8 +45,8 @@ struct SasCellInfoRequest : SasMessage struct SasCellInfoResponse : SasMessage { GlobalNci cellId{}; - int32_t tac{}; - int32_t dbm{}; + int tac{}; + int dbm{}; SasCellInfoResponse() : SasMessage(SasMessageType::CELL_INFO_RESPONSE) { diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 28371cff6..5cd9ebd3c 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -119,13 +119,6 @@ enum class EDeregCause ECALL_INACTIVITY, }; -Json ToJson(const Supi &v); -Json ToJson(const Plmn &v); -Json ToJson(const SingleSlice &v); -Json ToJson(const NetworkSlice &v); -Json ToJson(const PlmnSupport &v); -Json ToJson(const EDeregCause &v); - struct GlobalNci { Plmn plmn{}; @@ -146,10 +139,30 @@ struct UeCellMeasurement uint64_t time{}; }; +struct Vector3 +{ + int x{}; + int y{}; + int z{}; + + Vector3() = default; + + Vector3(int x, int y, int z) : x(x), y(y), z(z) + { + } +}; + bool operator==(const SingleSlice &lhs, const SingleSlice &rhs); bool operator==(const Plmn &lhs, const Plmn &rhs); bool operator==(const GlobalNci &lhs, const GlobalNci &rhs); +Json ToJson(const Supi &v); +Json ToJson(const Plmn &v); +Json ToJson(const SingleSlice &v); +Json ToJson(const NetworkSlice &v); +Json ToJson(const PlmnSupport &v); +Json ToJson(const EDeregCause &v); + namespace std { From 52eb0de5a1d9fb64340fe7e1fefe17ced8ee2654 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 20:38:30 +0300 Subject: [PATCH 006/116] UE SAS dev. --- src/gnb/sas/handler.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/gnb/sas/handler.cpp b/src/gnb/sas/handler.cpp index 7b1f27f53..d2a7bfb59 100644 --- a/src/gnb/sas/handler.cpp +++ b/src/gnb/sas/handler.cpp @@ -9,6 +9,8 @@ #include "task.hpp" #include +static int MIN_ALLOWED_DBM = -100; + static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) { int deltaX = myPos.x - uePos.x; @@ -24,11 +26,18 @@ namespace nr::gnb void GnbSasTask::handleCellInfoRequest(const InetAddress &addr, const sas::SasCellInfoRequest &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; + } + sas::SasCellInfoResponse resp{}; resp.cellId.nci = m_base->config->nci; resp.cellId.plmn = m_base->config->plmn; resp.tac = m_base->config->tac; - resp.dbm = EstimateSimulatedDbm(m_base->config->phyLocation, msg.simPos); + resp.dbm = dbm; sendSasMessage(addr, resp); } From fee3c0289d21e25c7136364bb883b54e4b069514 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 20:42:44 +0300 Subject: [PATCH 007/116] UE SAS dev. --- src/gnb/sas/handler.cpp | 4 +++- src/ue/sas/measurement.cpp | 14 ++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/gnb/sas/handler.cpp b/src/gnb/sas/handler.cpp index d2a7bfb59..bc959b0fe 100644 --- a/src/gnb/sas/handler.cpp +++ b/src/gnb/sas/handler.cpp @@ -9,7 +9,7 @@ #include "task.hpp" #include -static int MIN_ALLOWED_DBM = -100; +static int MIN_ALLOWED_DBM = -120; static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) { @@ -18,6 +18,8 @@ static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) 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; } diff --git a/src/ue/sas/measurement.cpp b/src/ue/sas/measurement.cpp index edaf3fbee..6550c7d1a 100644 --- a/src/ue/sas/measurement.cpp +++ b/src/ue/sas/measurement.cpp @@ -9,8 +9,6 @@ #include "task.hpp" #include -static int DBM_STRONG_STRENGTH_THRESHOLD = -70; - namespace nr::ue { @@ -22,20 +20,12 @@ void UeSasTask::onMeasurement() // compare active and pending measurements for (auto &m : m_activeMeasurements) { - bool oldStrong = m.second.dbm >= DBM_STRONG_STRENGTH_THRESHOLD; - if (m_pendingMeasurements.count(m.first)) - { - bool newStrong = m_pendingMeasurements[m.first].dbm >= DBM_STRONG_STRENGTH_THRESHOLD; - if (newStrong ^ oldStrong) - (newStrong ? entered : exited).push_back(m.first); - } - else if (oldStrong) + if (!m_pendingMeasurements.count(m.first)) exited.push_back(m.first); } for (auto &m : m_pendingMeasurements) { - bool newStrong = m_pendingMeasurements[m.first].dbm >= DBM_STRONG_STRENGTH_THRESHOLD; - if (!m_activeMeasurements.count(m.first) && newStrong) + if (!m_activeMeasurements.count(m.first)) entered.push_back(m.first); } if (!entered.empty() || !exited.empty()) From 7a34a73fd364b8049232564a104ad7cfab598819 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 20:55:31 +0300 Subject: [PATCH 008/116] UE SAS dev. --- src/ue/mm/base.cpp | 7 ++++--- src/urs/rls/ue_entity.cpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ue/mm/base.cpp b/src/ue/mm/base.cpp index aaeedd39f..4cfac2a31 100644 --- a/src/ue/mm/base.cpp +++ b/src/ue/mm/base.cpp @@ -72,9 +72,10 @@ void NasMm::performMmCycle() m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE || m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE) { - long current = utils::CurrentTimeMillis(); - long elapsedMs = current - m_lastPlmnSearchTrigger; - if (elapsedMs > 50) + int64_t current = utils::CurrentTimeMillis(); + int64_t backoff = m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH ? -1 : 1500; + + if (current - m_lastPlmnSearchTrigger > backoff) { m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::PLMN_SEARCH_REQUEST)); m_lastPlmnSearchTrigger = current; diff --git a/src/urs/rls/ue_entity.cpp b/src/urs/rls/ue_entity.cpp index f18bb61af..dba9a09bb 100644 --- a/src/urs/rls/ue_entity.cpp +++ b/src/urs/rls/ue_entity.cpp @@ -290,7 +290,7 @@ void RlsUeEntity::sendRlsMessage(const InetAddress &address, const RlsMessage &m return; } - sendRlsPdu(address, std::move(stream)); + //sendRlsPdu(address, std::move(stream)); } void RlsUeEntity::localReleaseConnection(ECause cause) From 8d21162311d1e8f0dcc8b12cb6c321d3f486e335 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 21:07:08 +0300 Subject: [PATCH 009/116] UE SAS dev. --- src/ue/nts.hpp | 27 +++++++++++++++++++++++++++ src/ue/rrc/task.cpp | 3 ++- src/ue/sas/measurement.cpp | 13 +++++++++++++ src/ue/sas/task.cpp | 7 +++++++ src/ue/sas/task.hpp | 1 + src/utils/nts.hpp | 2 ++ 6 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 725387221..cc93d65a1 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -215,6 +215,33 @@ struct NwUeRrcToMr : NtsMessage } }; +struct NwUeRrcToSas : NtsMessage +{ + enum PR + { + PLMN_SEARCH_REQUEST, + } present; + + explicit NwUeRrcToSas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_SAS), present(present) + { + } +}; + +struct NwUeSasToRrc : NtsMessage +{ + enum PR + { + PLMN_SEARCH_RESPONSE, + } present; + + // PLMN_SEARCH_RESPONSE + std::vector measurements{}; + + explicit NwUeSasToRrc(PR present) : NtsMessage(NtsMessageType::UE_SAS_TO_RRC), present(present) + { + } +}; + struct NwUeNasToNas : NtsMessage { enum PR diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index f2cf2e9ec..9f89c9081 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include namespace nr::ue @@ -74,7 +75,7 @@ void UeRrcTask::onLoop() switch (w->present) { case NwUeNasToRrc::PLMN_SEARCH_REQUEST: { - m_base->mrTask->push(new NwUeRrcToMr(NwUeRrcToMr::PLMN_SEARCH_REQUEST)); + m_base->sasTask->push(new NwUeRrcToSas(NwUeRrcToSas::PLMN_SEARCH_REQUEST)); break; } case NwUeNasToRrc::INITIAL_NAS_DELIVERY: diff --git a/src/ue/sas/measurement.cpp b/src/ue/sas/measurement.cpp index 6550c7d1a..61cc6e048 100644 --- a/src/ue/sas/measurement.cpp +++ b/src/ue/sas/measurement.cpp @@ -7,6 +7,8 @@ // #include "task.hpp" +#include +#include #include namespace nr::ue @@ -61,4 +63,15 @@ void UeSasTask::onCoverageChange(const std::vector &entered, const st static_cast(exited.size())); } +void UeSasTask::plmnSearchRequested() +{ + std::vector measurements{}; + for (auto &m : m_activeMeasurements) + measurements.push_back(m.second); + + auto *w = new NwUeSasToRrc(NwUeSasToRrc::PLMN_SEARCH_RESPONSE); + w->measurements = std::move(measurements); + m_base->rrcTask->push(w); +} + } // namespace nr::ue diff --git a/src/ue/sas/task.cpp b/src/ue/sas/task.cpp index 7e1b6a11b..7cd536ce5 100644 --- a/src/ue/sas/task.cpp +++ b/src/ue/sas/task.cpp @@ -7,6 +7,7 @@ // #include "task.hpp" +#include #include static const int TIMER_ID_MEASUREMENT = 1; @@ -46,6 +47,12 @@ void UeSasTask::onLoop() switch (msg->msgType) { + case NtsMessageType::UE_RRC_TO_SAS: { + auto *w = dynamic_cast(msg); + if (w->present == NwUeRrcToSas::PLMN_SEARCH_REQUEST) + plmnSearchRequested(); + break; + } case NtsMessageType::TIMER_EXPIRED: { auto *w = dynamic_cast(msg); if (w->timerId == TIMER_ID_MEASUREMENT) diff --git a/src/ue/sas/task.hpp b/src/ue/sas/task.hpp index c26098ac1..5289a8833 100644 --- a/src/ue/sas/task.hpp +++ b/src/ue/sas/task.hpp @@ -52,6 +52,7 @@ class UeSasTask : public NtsTask void onMeasurement(); void receiveCellInfoResponse(const sas::SasCellInfoResponse &msg); void onCoverageChange(const std::vector &entered, const std::vector &exited); + void plmnSearchRequested(); }; } // namespace nr::ue \ No newline at end of file diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index f2ab32313..0d6a84f2a 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -53,7 +53,9 @@ enum class NtsMessageType UE_RRC_TO_NAS, UE_NAS_TO_RRC, UE_RRC_TO_MR, + UE_RRC_TO_SAS, UE_NAS_TO_NAS, + UE_SAS_TO_RRC, UE_NAS_TO_APP, }; From 886d8eb5606cb262e9f769f081bfa445c3acdea8 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 21:44:14 +0300 Subject: [PATCH 010/116] UE SAS dev. --- src/app/cli_cmd.cpp | 5 +++++ src/app/cli_cmd.hpp | 1 + src/gnb/sas/handler.cpp | 1 + src/ue/app/cmd_handler.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/ue/sas/measurement.cpp | 1 + src/urs/sas_pdu.cpp | 3 +++ src/urs/sas_pdu.hpp | 1 + src/utils/common_types.hpp | 1 + 8 files changed, 49 insertions(+) diff --git a/src/app/cli_cmd.cpp b/src/app/cli_cmd.cpp index 5a1213c4b..8f88738bc 100644 --- a/src/app/cli_cmd.cpp +++ b/src/app/cli_cmd.cpp @@ -162,6 +162,7 @@ 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, @@ -301,6 +302,10 @@ 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/app/cli_cmd.hpp b/src/app/cli_cmd.hpp index 45b7d2e96..e46e5cda6 100644 --- a/src/app/cli_cmd.hpp +++ b/src/app/cli_cmd.hpp @@ -48,6 +48,7 @@ struct UeCliCommand PS_RELEASE, PS_RELEASE_ALL, DE_REGISTER, + COVERAGE, } present; // DE_REGISTER diff --git a/src/gnb/sas/handler.cpp b/src/gnb/sas/handler.cpp index bc959b0fe..242277429 100644 --- a/src/gnb/sas/handler.cpp +++ b/src/gnb/sas/handler.cpp @@ -40,6 +40,7 @@ void GnbSasTask::handleCellInfoRequest(const InetAddress &addr, const sas::SasCe resp.cellId.plmn = m_base->config->plmn; resp.tac = m_base->config->tac; resp.dbm = dbm; + resp.gnbName = m_base->config->name; sendSasMessage(addr, resp); } diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 1e98f2547..647efb5ef 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -19,6 +20,17 @@ #define PAUSE_CONFIRM_TIMEOUT 3000 #define PAUSE_POLLING 10 +static std::string SignalDescription(int dbm) +{ + if (dbm > -90) + return "Excellent"; + if (dbm > -105) + return "Good"; + if (dbm > -120) + return "Fair"; + return "Poor"; +} + namespace nr::ue { @@ -150,6 +162,30 @@ void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) sendResult(msg.address, "PDU session establishment procedure triggered"); break; } + case app::UeCliCommand::COVERAGE: { + auto &map = m_base->sasTask->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/sas/measurement.cpp b/src/ue/sas/measurement.cpp index 61cc6e048..acda67c91 100644 --- a/src/ue/sas/measurement.cpp +++ b/src/ue/sas/measurement.cpp @@ -52,6 +52,7 @@ void UeSasTask::receiveCellInfoResponse(const sas::SasCellInfoResponse &msg) meas.cellId = msg.cellId; meas.tac = msg.tac; meas.dbm = msg.dbm; + meas.gnbName = msg.gnbName; meas.time = utils::CurrentTimeMillis(); m_pendingMeasurements[meas.cellId] = meas; diff --git a/src/urs/sas_pdu.cpp b/src/urs/sas_pdu.cpp index 71654aa31..53653fb70 100644 --- a/src/urs/sas_pdu.cpp +++ b/src/urs/sas_pdu.cpp @@ -63,6 +63,8 @@ void EncodeSasMessage(const SasMessage &msg, OctetString &stream) AppendGlobalNci(m.cellId, stream); stream.appendOctet4(m.tac); stream.appendOctet4(m.dbm); + stream.appendOctet4(static_cast(m.gnbName.size())); + stream.appendUtf8(m.gnbName); } } @@ -94,6 +96,7 @@ std::unique_ptr DecodeSasMessage(const OctetView &stream) res->cellId = DecodeGlobalNci(stream); res->tac = stream.read4I(); res->dbm = stream.read4I(); + res->gnbName = stream.readUtf8String(stream.read4I()); return res; } diff --git a/src/urs/sas_pdu.hpp b/src/urs/sas_pdu.hpp index 561a57367..140573658 100644 --- a/src/urs/sas_pdu.hpp +++ b/src/urs/sas_pdu.hpp @@ -47,6 +47,7 @@ struct SasCellInfoResponse : SasMessage GlobalNci cellId{}; int tac{}; int dbm{}; + std::string gnbName{}; SasCellInfoResponse() : SasMessage(SasMessageType::CELL_INFO_RESPONSE) { diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 5cd9ebd3c..42c9903b3 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -136,6 +136,7 @@ struct UeCellMeasurement GlobalNci cellId{}; int tac{}; int dbm{}; + std::string gnbName{}; uint64_t time{}; }; From 9f17fa9c5f0ba101e47afee839a82033b8137b80 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 23:30:05 +0300 Subject: [PATCH 011/116] UE SAS dev. --- src/nas/utils.cpp | 92 ++++++++++++++++++++++++ src/nas/utils.hpp | 8 +++ src/ue/mm/interface.cpp | 6 +- src/ue/mm/mm.hpp | 3 +- src/ue/mm/radio.cpp | 148 +++++++++++++++++++++++++++++++++----- src/ue/mr/task.cpp | 20 +++--- src/ue/nas/usim.hpp | 6 +- src/ue/nts.hpp | 20 +++--- src/ue/rrc/task.cpp | 39 ++++++---- src/ue/sas/connection.cpp | 23 ++++++ src/ue/sas/task.cpp | 2 + src/ue/sas/task.hpp | 5 +- 12 files changed, 312 insertions(+), 60 deletions(-) create mode 100644 src/ue/sas/connection.cpp diff --git a/src/nas/utils.cpp b/src/nas/utils.cpp index 0d8bcebd0..a3c16fc5d 100644 --- a/src/nas/utils.cpp +++ b/src/nas/utils.cpp @@ -289,4 +289,96 @@ SingleSlice SNssaiTo(const IESNssai &v) return sNssai; } +bool PlmnListContains(const IEPlmnList &list, Plmn item) +{ + return PlmnListContains(list, PlmnFrom(item)); +} + +bool PlmnListContains(const IEPlmnList &list, VPlmn item) +{ + return std::any_of(list.plmns.begin(), list.plmns.end(), [&item](auto &i) { return DeepEqualsV(i, item); }); +} + +bool TaiListContains(const IE5gsTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai) +{ + return std::any_of(list.list.begin(), list.list.end(), [&tai](auto &i) { return TaiListContains(i, tai); }); +} + +bool TaiListContains(const VPartialTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai) +{ + if (list.present == 0) + { + auto &list0 = list.list00; + if (DeepEqualsV(list0->plmn, tai.plmn)) + { + if (std::any_of(list0->tacs.begin(), list0->tacs.end(), [&tai](auto &i) { return (int)i == (int)tai.tac; })) + return true; + } + } + else if (list.present == 1) + { + auto &list1 = list.list01; + if (DeepEqualsV(list1->plmn, tai.plmn) && (int)list1->tac == (int)tai.tac) + return true; + } + else if (list.present == 2) + { + auto &list2 = list.list10; + if (std::any_of(list2->tais.begin(), list2->tais.end(), [&tai](auto &i) { return DeepEqualsV(i, tai); })) + return true; + } + + return false; +} + +bool ServiceAreaListForbidsPlmn(const IEServiceAreaList &list, const VPlmn &plmn) +{ + return std::any_of(list.list.begin(), list.list.end(), + [&plmn](auto &i) { return ServiceAreaListForbidsPlmn(i, plmn); }); +} + +bool ServiceAreaListForbidsTai(const IEServiceAreaList &list, const VTrackingAreaIdentity &tai) +{ + return std::any_of(list.list.begin(), list.list.end(), + [&tai](auto &i) { return ServiceAreaListForbidsTai(i, tai); }); +} + +bool ServiceAreaListForbidsPlmn(const VPartialServiceAreaList &list, const VPlmn &plmn) +{ + if (list.present == 3) + { + if (list.list11->allowedType == EAllowedType::IN_THE_NON_ALLOWED_AREA && DeepEqualsV(list.list11->plmn, plmn)) + return true; + } + return false; +} + +bool ServiceAreaListForbidsTai(const VPartialServiceAreaList &list, const VTrackingAreaIdentity &tai) +{ + if (ServiceAreaListForbidsPlmn(list, tai.plmn)) + return true; + if (list.present == 0) + { + if (list.list00->allowedType == EAllowedType::IN_THE_NON_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_NON_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_NON_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/nas/utils.hpp b/src/nas/utils.hpp index b122f8c5c..2470052df 100644 --- a/src/nas/utils.hpp +++ b/src/nas/utils.hpp @@ -25,6 +25,14 @@ bool HasValue(const IEGprsTimer3 &v); bool HasValue(const IEGprsTimer2 &v); void AddToPlmnList(IEPlmnList &list, VPlmn item); +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); +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); +bool ServiceAreaListForbidsTai(const nas::VPartialServiceAreaList &list, const VTrackingAreaIdentity &tai); const char *EnumToString(ERegistrationType v); const char *EnumToString(EMmCause v); diff --git a/src/ue/mm/interface.cpp b/src/ue/mm/interface.cpp index 4843f2822..19607eada 100644 --- a/src/ue/mm/interface.cpp +++ b/src/ue/mm/interface.cpp @@ -22,11 +22,7 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) break; } case NwUeRrcToNas::PLMN_SEARCH_RESPONSE: { - handlePlmnSearchResponse(msg.gnbName); - break; - } - case NwUeRrcToNas::PLMN_SEARCH_FAILURE: { - handlePlmnSearchFailure(); + handlePlmnSearchResponse(msg.measurements); break; } case NwUeRrcToNas::NAS_DELIVERY: { diff --git a/src/ue/mm/mm.hpp b/src/ue/mm/mm.hpp index 73dd01a31..106ff0e82 100644 --- a/src/ue/mm/mm.hpp +++ b/src/ue/mm/mm.hpp @@ -142,8 +142,7 @@ class NasMm private: /* Radio */ void localReleaseConnection(); - void handlePlmnSearchResponse(const std::string &gnbName); - void handlePlmnSearchFailure(); + void handlePlmnSearchResponse(const std::vector &measures); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); void handleRadioLinkFailure(); diff --git a/src/ue/mm/radio.cpp b/src/ue/mm/radio.cpp index 90179caba..706e989e8 100644 --- a/src/ue/mm/radio.cpp +++ b/src/ue/mm/radio.cpp @@ -7,6 +7,7 @@ // #include "mm.hpp" +#include #include #include #include @@ -15,30 +16,139 @@ namespace nr::ue { -void NasMm::handlePlmnSearchResponse(const std::string &gnbName) +void NasMm::handlePlmnSearchResponse(const std::vector &measures) { - if (m_base->nodeListener) - m_base->nodeListener->onConnected(app::NodeType::UE, m_base->config->getNodeName(), app::NodeType::GNB, - gnbName); + // TODO + // if (m_base->nodeListener) + // m_base->nodeListener->onConnected(app::NodeType::UE, m_base->config->getNodeName(), app::NodeType::GNB, + // gnbName); - m_logger->info("UE connected to gNB"); + 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 (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH || - m_mmSubState == EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || - m_mmSubState == EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + 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 + } - resetRegAttemptCounter(); -} + int listedAsForbiddenPlmn = 0; + int listedAsForbiddenTai = 0; + int listedAsForbiddenServiceAreaPlmn = 0; + int listedAsForbiddenServiceAreaTai = 0; + int unlistedPlmn = 0; -void NasMm::handlePlmnSearchFailure() -{ - if (m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NO_CELL_AVAILABLE); - else if (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH) - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NO_CELL_AVAILABLE); + 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_forbiddenTaiList, + 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::handleRrcConnectionSetup() diff --git a/src/ue/mr/task.cpp b/src/ue/mr/task.cpp index d2a1a1233..305270570 100644 --- a/src/ue/mr/task.cpp +++ b/src/ue/mr/task.cpp @@ -62,9 +62,9 @@ void UeMrTask::onLoop() switch (w->present) { case NwUeMrToMr::RLS_CONNECTED: { - auto tw = new NwUeMrToRrc(NwUeMrToRrc::PLMN_SEARCH_RESPONSE); - tw->gnbName = std::move(w->gnbName); - m_base->rrcTask->push(tw); + //auto tw = new NwUeMrToRrc(NwUeMrToRrc::PLMN_SEARCH_RESPONSE); + //tw->gnbName = std::move(w->gnbName); + //m_base->rrcTask->push(tw); break; } case NwUeMrToMr::RLS_RELEASED: { @@ -80,13 +80,13 @@ void UeMrTask::onLoop() break; } case NwUeMrToMr::RLS_SEARCH_FAILURE: { - long current = utils::CurrentTimeMillis(); - if (current - m_lastPlmnSearchFailurePrinted > PLMN_SEARCH_FAILED_PRINT_THRESHOLD) - { - m_logger->err("PLMN search failed [%s]", rls::CauseToString(w->cause)); - m_lastPlmnSearchFailurePrinted = current; - m_base->rrcTask->push(new NwUeMrToRrc(NwUeMrToRrc::PLMN_SEARCH_FAILURE)); - } + //long current = utils::CurrentTimeMillis(); + //if (current - m_lastPlmnSearchFailurePrinted > PLMN_SEARCH_FAILED_PRINT_THRESHOLD) + //{ + // m_logger->err("PLMN search failed [%s]", rls::CauseToString(w->cause)); + // m_lastPlmnSearchFailurePrinted = current; + // m_base->rrcTask->push(new NwUeMrToRrc(NwUeMrToRrc::PLMN_SEARCH_FAILURE)); + //} break; } case NwUeMrToMr::RLS_START_WAITING_TIMER: { diff --git a/src/ue/nas/usim.hpp b/src/ue/nas/usim.hpp index 0cfadb838..88a8c8c08 100644 --- a/src/ue/nas/usim.hpp +++ b/src/ue/nas/usim.hpp @@ -24,13 +24,15 @@ class Usim bool m_isValid{}; public: + // State related + E5UState m_uState{}; + // Location related - nas::IE5gsMobileIdentity m_storedGuti{}; std::optional m_lastVisitedRegisteredTai{}; - E5UState m_uState{}; // Identity related nas::IE5gsMobileIdentity m_storedSuci{}; + nas::IE5gsMobileIdentity m_storedGuti{}; // Plmn related Plmn m_currentPlmn{}; diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index cc93d65a1..05cc07dcb 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -63,15 +63,10 @@ struct NwUeMrToRrc : NtsMessage { enum PR { - PLMN_SEARCH_RESPONSE, - PLMN_SEARCH_FAILURE, RRC_PDU_DELIVERY, RADIO_LINK_FAILURE } present; - // PLMN_SEARCH_RESPONSE - std::string gnbName{}; - // RRC_PDU_DELIVERY rrc::RrcChannel channel{}; OctetString pdu{}; @@ -155,7 +150,6 @@ struct NwUeRrcToNas : NtsMessage { NAS_DELIVERY, PLMN_SEARCH_RESPONSE, - PLMN_SEARCH_FAILURE, RRC_CONNECTION_SETUP, RRC_CONNECTION_RELEASE, RADIO_LINK_FAILURE, @@ -165,7 +159,7 @@ struct NwUeRrcToNas : NtsMessage OctetString nasPdu{}; // PLMN_SEARCH_RESPONSE - std::string gnbName{}; + std::vector measurements{}; explicit NwUeRrcToNas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_NAS), present(present) { @@ -179,7 +173,8 @@ struct NwUeNasToRrc : NtsMessage PLMN_SEARCH_REQUEST, LOCAL_RELEASE_CONNECTION, INITIAL_NAS_DELIVERY, - UPLINK_NAS_DELIVERY + UPLINK_NAS_DELIVERY, + CELL_SELECTION_COMMAND, } present; // INITIAL_NAS_DELIVERY @@ -189,6 +184,10 @@ 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) { } @@ -220,8 +219,13 @@ struct NwUeRrcToSas : NtsMessage enum PR { PLMN_SEARCH_REQUEST, + CELL_SELECTION_COMMAND, } present; + // CELL_SELECTION_COMMAND + GlobalNci cellId{}; + bool isSuitableCell{}; // otherwise 'acceptable' + explicit NwUeRrcToSas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_SAS), present(present) { } diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 9f89c9081..ca06c353f 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -49,16 +49,6 @@ void UeRrcTask::onLoop() auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeMrToRrc::PLMN_SEARCH_RESPONSE: { - auto *nw = new NwUeRrcToNas(NwUeRrcToNas::PLMN_SEARCH_RESPONSE); - nw->gnbName = std::move(w->gnbName); - m_base->nasTask->push(nw); - break; - } - case NwUeMrToRrc::PLMN_SEARCH_FAILURE: { - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::PLMN_SEARCH_FAILURE)); - break; - } case NwUeMrToRrc::RRC_PDU_DELIVERY: { handleDownlinkRrc(w->channel, w->pdu); break; @@ -78,13 +68,15 @@ void UeRrcTask::onLoop() m_base->sasTask->push(new NwUeRrcToSas(NwUeRrcToSas::PLMN_SEARCH_REQUEST)); break; } - case NwUeNasToRrc::INITIAL_NAS_DELIVERY: + case NwUeNasToRrc::INITIAL_NAS_DELIVERY: { deliverInitialNas(std::move(w->nasPdu), w->rrcEstablishmentCause); break; - case NwUeNasToRrc::UPLINK_NAS_DELIVERY: + } + case NwUeNasToRrc::UPLINK_NAS_DELIVERY: { deliverUplinkNas(std::move(w->nasPdu)); break; - case NwUeNasToRrc::LOCAL_RELEASE_CONNECTION: + } + case NwUeNasToRrc::LOCAL_RELEASE_CONNECTION: { m_state = ERrcState::RRC_IDLE; auto *wr = new NwUeRrcToMr(NwUeRrcToMr::RRC_CONNECTION_RELEASE); @@ -94,6 +86,27 @@ void UeRrcTask::onLoop() m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); break; } + case NwUeNasToRrc::CELL_SELECTION_COMMAND: { + auto *wr = new NwUeRrcToSas(NwUeRrcToSas::CELL_SELECTION_COMMAND); + wr->cellId = w->cellId; + wr->isSuitableCell = w->isSuitableCell; + m_base->sasTask->push(wr); + break; + } + } + break; + } + case NtsMessageType::UE_SAS_TO_RRC: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwUeSasToRrc::PLMN_SEARCH_RESPONSE: { + auto *wr = new NwUeRrcToNas(NwUeRrcToNas::PLMN_SEARCH_RESPONSE); + wr->measurements = std::move(w->measurements); + m_base->nasTask->push(wr); + break; + } + } break; } default: diff --git a/src/ue/sas/connection.cpp b/src/ue/sas/connection.cpp new file mode 100644 index 000000000..ed59bd839 --- /dev/null +++ b/src/ue/sas/connection.cpp @@ -0,0 +1,23 @@ +// +// 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 UeSasTask::receiveCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) +{ + m_logger->err("TODO"); // TODO perform camp +} + + +} // namespace nr::ue diff --git a/src/ue/sas/task.cpp b/src/ue/sas/task.cpp index 7cd536ce5..edc495462 100644 --- a/src/ue/sas/task.cpp +++ b/src/ue/sas/task.cpp @@ -51,6 +51,8 @@ void UeSasTask::onLoop() auto *w = dynamic_cast(msg); if (w->present == NwUeRrcToSas::PLMN_SEARCH_REQUEST) plmnSearchRequested(); + else if (w->present == NwUeRrcToSas::CELL_SELECTION_COMMAND) + receiveCellSelectionCommand(w->cellId, w->isSuitableCell); break; } case NtsMessageType::TIMER_EXPIRED: { diff --git a/src/ue/sas/task.hpp b/src/ue/sas/task.hpp index 5289a8833..9c6c9fbd6 100644 --- a/src/ue/sas/task.hpp +++ b/src/ue/sas/task.hpp @@ -9,11 +9,11 @@ #pragma once #include -#include #include #include #include #include +#include #include #include #include @@ -53,6 +53,9 @@ class UeSasTask : public NtsTask void receiveCellInfoResponse(const sas::SasCellInfoResponse &msg); void onCoverageChange(const std::vector &entered, const std::vector &exited); void plmnSearchRequested(); + + private: /* Connection */ + void receiveCellSelectionCommand(const GlobalNci &cellId, bool isSuitable); }; } // namespace nr::ue \ No newline at end of file From 3a1d5581fe40ba5a9033231fc6ac1c4adc45d0ae Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 3 Apr 2021 23:46:52 +0300 Subject: [PATCH 012/116] UE SAS dev. --- src/ue/sas/connection.cpp | 2 +- src/ue/sas/task.cpp | 2 +- src/ue/sas/task.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ue/sas/connection.cpp b/src/ue/sas/connection.cpp index ed59bd839..6282081d7 100644 --- a/src/ue/sas/connection.cpp +++ b/src/ue/sas/connection.cpp @@ -14,7 +14,7 @@ namespace nr::ue { -void UeSasTask::receiveCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) +void UeSasTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) { m_logger->err("TODO"); // TODO perform camp } diff --git a/src/ue/sas/task.cpp b/src/ue/sas/task.cpp index edc495462..ee61768b1 100644 --- a/src/ue/sas/task.cpp +++ b/src/ue/sas/task.cpp @@ -52,7 +52,7 @@ void UeSasTask::onLoop() if (w->present == NwUeRrcToSas::PLMN_SEARCH_REQUEST) plmnSearchRequested(); else if (w->present == NwUeRrcToSas::CELL_SELECTION_COMMAND) - receiveCellSelectionCommand(w->cellId, w->isSuitableCell); + handleCellSelectionCommand(w->cellId, w->isSuitableCell); break; } case NtsMessageType::TIMER_EXPIRED: { diff --git a/src/ue/sas/task.hpp b/src/ue/sas/task.hpp index 9c6c9fbd6..28d1e879b 100644 --- a/src/ue/sas/task.hpp +++ b/src/ue/sas/task.hpp @@ -55,7 +55,7 @@ class UeSasTask : public NtsTask void plmnSearchRequested(); private: /* Connection */ - void receiveCellSelectionCommand(const GlobalNci &cellId, bool isSuitable); + void handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable); }; } // namespace nr::ue \ No newline at end of file From 2ab318fe30a07d7e05581013ef68570bc5f0cf11 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 00:27:17 +0300 Subject: [PATCH 013/116] UE SAS dev. --- src/gnb/sas/handler.cpp | 1 + src/ue/mm/interface.cpp | 3 +++ src/ue/mm/mm.hpp | 1 + src/ue/mm/radio.cpp | 30 ++++++++++++++++++++++++++++++ src/ue/nts.hpp | 8 ++++++++ src/ue/rrc/task.cpp | 6 ++++++ src/ue/sas/connection.cpp | 20 ++++++++++++++++++-- src/ue/sas/measurement.cpp | 2 +- src/ue/sas/task.cpp | 2 +- src/ue/sas/task.hpp | 3 +++ src/urs/sas_pdu.cpp | 3 +++ src/urs/sas_pdu.hpp | 1 + src/utils/common_types.hpp | 20 +++++++++++++++++++- 13 files changed, 95 insertions(+), 5 deletions(-) diff --git a/src/gnb/sas/handler.cpp b/src/gnb/sas/handler.cpp index 242277429..2788eaaf6 100644 --- a/src/gnb/sas/handler.cpp +++ b/src/gnb/sas/handler.cpp @@ -41,6 +41,7 @@ void GnbSasTask::handleCellInfoRequest(const InetAddress &addr, const sas::SasCe resp.tac = m_base->config->tac; resp.dbm = dbm; resp.gnbName = m_base->config->name; + resp.linkIp = m_base->config->portalIp; sendSasMessage(addr, resp); } diff --git a/src/ue/mm/interface.cpp b/src/ue/mm/interface.cpp index 19607eada..4337ddca7 100644 --- a/src/ue/mm/interface.cpp +++ b/src/ue/mm/interface.cpp @@ -40,6 +40,9 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) handleRadioLinkFailure(); break; } + case NwUeRrcToNas::SERVING_CELL_CHANGE: { + handleServingCellChange(msg.servingCell); + } } } diff --git a/src/ue/mm/mm.hpp b/src/ue/mm/mm.hpp index 106ff0e82..adab03da0 100644 --- a/src/ue/mm/mm.hpp +++ b/src/ue/mm/mm.hpp @@ -145,6 +145,7 @@ class NasMm void handlePlmnSearchResponse(const std::vector &measures); void handleRrcConnectionSetup(); void handleRrcConnectionRelease(); + void handleServingCellChange(const UeCellInfo &servingCell); void handleRadioLinkFailure(); private: /* Access Control */ diff --git a/src/ue/mm/radio.cpp b/src/ue/mm/radio.cpp index 706e989e8..dfa162699 100644 --- a/src/ue/mm/radio.cpp +++ b/src/ue/mm/radio.cpp @@ -151,6 +151,36 @@ void NasMm::handlePlmnSearchResponse(const std::vector &measu } } +void NasMm::handleServingCellChange(const UeCellInfo &servingCell) +{ + if (m_cmState == ECmState::CM_CONNECTED) + { + m_logger->err("Serving cell change in CM-CONNECTED"); + return; + } + + if (servingCell.cellCategory != ECellCategory::ACCEPTABLE_CELL && + servingCell.cellCategory != ECellCategory::SUITABLE_CELL) + { + m_logger->err("Serving cell change with unhandled cell category"); + return; + } + + m_logger->info("Serving cell determined [%s]", servingCell.gnbName.c_str()); + + if (m_mmState == EMmState::MM_REGISTERED || 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); + else + switchMmState(EMmState::MM_DEREGISTERED, isSuitable ? EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE + : EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + } +} + void NasMm::handleRrcConnectionSetup() { switchCmState(ECmState::CM_CONNECTED); diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 05cc07dcb..c1c3e2dbc 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -153,6 +153,7 @@ struct NwUeRrcToNas : NtsMessage RRC_CONNECTION_SETUP, RRC_CONNECTION_RELEASE, RADIO_LINK_FAILURE, + SERVING_CELL_CHANGE, } present; // NAS_DELIVERY @@ -161,6 +162,9 @@ struct NwUeRrcToNas : NtsMessage // PLMN_SEARCH_RESPONSE std::vector measurements{}; + // SERVING_CELL_CHANGE + UeCellInfo servingCell{}; + explicit NwUeRrcToNas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_NAS), present(present) { } @@ -236,11 +240,15 @@ struct NwUeSasToRrc : NtsMessage enum PR { PLMN_SEARCH_RESPONSE, + SERVING_CELL_CHANGE } present; // PLMN_SEARCH_RESPONSE std::vector measurements{}; + // SERVING_CELL_CHANGE + UeCellInfo servingCell{}; + explicit NwUeSasToRrc(PR present) : NtsMessage(NtsMessageType::UE_SAS_TO_RRC), present(present) { } diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index ca06c353f..43d0380e0 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -106,6 +106,12 @@ void UeRrcTask::onLoop() m_base->nasTask->push(wr); break; } + case NwUeSasToRrc::SERVING_CELL_CHANGE: { + auto *wr = new NwUeRrcToNas(NwUeRrcToNas::SERVING_CELL_CHANGE); + wr->servingCell = w->servingCell; + m_base->nasTask->push(wr); + break; + } } break; } diff --git a/src/ue/sas/connection.cpp b/src/ue/sas/connection.cpp index 6282081d7..f887f8a4c 100644 --- a/src/ue/sas/connection.cpp +++ b/src/ue/sas/connection.cpp @@ -16,8 +16,24 @@ namespace nr::ue void UeSasTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) { - m_logger->err("TODO"); // TODO perform camp -} + 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->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 NwUeSasToRrc(NwUeSasToRrc::SERVING_CELL_CHANGE); + w->servingCell = *m_servingCell; + m_base->rrcTask->push(w); +} } // namespace nr::ue diff --git a/src/ue/sas/measurement.cpp b/src/ue/sas/measurement.cpp index acda67c91..8cb3cec3c 100644 --- a/src/ue/sas/measurement.cpp +++ b/src/ue/sas/measurement.cpp @@ -53,7 +53,7 @@ void UeSasTask::receiveCellInfoResponse(const sas::SasCellInfoResponse &msg) meas.tac = msg.tac; meas.dbm = msg.dbm; meas.gnbName = msg.gnbName; - meas.time = utils::CurrentTimeMillis(); + meas.linkIp = msg.linkIp; m_pendingMeasurements[meas.cellId] = meas; } diff --git a/src/ue/sas/task.cpp b/src/ue/sas/task.cpp index ee61768b1..115511ec8 100644 --- a/src/ue/sas/task.cpp +++ b/src/ue/sas/task.cpp @@ -17,7 +17,7 @@ namespace nr::ue { UeSasTask::UeSasTask(TaskBase *base) - : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{} + : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{}, m_servingCell{} { m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "sas"); diff --git a/src/ue/sas/task.hpp b/src/ue/sas/task.hpp index 28d1e879b..aeffd76a6 100644 --- a/src/ue/sas/task.hpp +++ b/src/ue/sas/task.hpp @@ -9,6 +9,7 @@ #pragma once #include +#include #include #include #include @@ -33,6 +34,8 @@ class UeSasTask : public NtsTask std::unordered_map m_pendingMeasurements; std::unordered_map m_activeMeasurements; + std::optional m_servingCell; + friend class UeCmdHandler; public: diff --git a/src/urs/sas_pdu.cpp b/src/urs/sas_pdu.cpp index 53653fb70..24014b0de 100644 --- a/src/urs/sas_pdu.cpp +++ b/src/urs/sas_pdu.cpp @@ -65,6 +65,8 @@ void EncodeSasMessage(const SasMessage &msg, OctetString &stream) 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); } } @@ -97,6 +99,7 @@ std::unique_ptr DecodeSasMessage(const OctetView &stream) res->tac = stream.read4I(); res->dbm = stream.read4I(); res->gnbName = stream.readUtf8String(stream.read4I()); + res->linkIp = stream.readUtf8String(stream.read4I()); return res; } diff --git a/src/urs/sas_pdu.hpp b/src/urs/sas_pdu.hpp index 140573658..7a48d05be 100644 --- a/src/urs/sas_pdu.hpp +++ b/src/urs/sas_pdu.hpp @@ -48,6 +48,7 @@ struct SasCellInfoResponse : SasMessage int tac{}; int dbm{}; std::string gnbName{}; + std::string linkIp{}; SasCellInfoResponse() : SasMessage(SasMessageType::CELL_INFO_RESPONSE) { diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 42c9903b3..d9d466046 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -131,13 +131,31 @@ struct GlobalNci } }; +enum class ECellCategory +{ + UNDEFINED, + ACCEPTABLE_CELL, + SUITABLE_CELL, + BARRED_CELL, + RESERVED_CELL, +}; + struct UeCellMeasurement { GlobalNci cellId{}; int tac{}; int dbm{}; std::string gnbName{}; - uint64_t time{}; + std::string linkIp{}; +}; + +struct UeCellInfo +{ + GlobalNci cellId{}; + int tac{}; + ECellCategory cellCategory{}; + std::string gnbName{}; + std::string linkIp{}; }; struct Vector3 From 0b5cad7ad246323c14b5d317a8dc9fca7b3875b0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 00:37:23 +0300 Subject: [PATCH 014/116] UE SRA dev. --- src/gnb/gnb.cpp | 10 +++++----- src/gnb/{sas => sra}/handler.cpp | 6 +++--- src/gnb/{sas => sra}/task.cpp | 20 ++++++++++---------- src/gnb/{sas => sra}/task.hpp | 14 +++++++------- src/gnb/{sas => sra}/transport.cpp | 12 ++++++------ src/gnb/types.hpp | 4 ++-- src/ue/app/cmd_handler.cpp | 4 ++-- src/ue/nts.hpp | 8 ++++---- src/ue/rrc/task.cpp | 16 ++++++++-------- src/ue/{sas => sra}/connection.cpp | 4 ++-- src/ue/{sas => sra}/measurement.cpp | 14 +++++++------- src/ue/{sas => sra}/task.cpp | 26 +++++++++++++------------- src/ue/{sas => sra}/task.hpp | 14 +++++++------- src/ue/{sas => sra}/transport.cpp | 12 ++++++------ src/ue/types.hpp | 4 ++-- src/ue/ue.cpp | 10 +++++----- src/urs/{sas_pdu.cpp => sra_pdu.cpp} | 28 ++++++++++++++-------------- src/urs/{sas_pdu.hpp => sra_pdu.hpp} | 24 ++++++++++++------------ src/utils/nts.hpp | 4 ++-- 19 files changed, 117 insertions(+), 117 deletions(-) rename src/gnb/{sas => sra}/handler.cpp (87%) rename src/gnb/{sas => sra}/task.cpp (70%) rename src/gnb/{sas => sra}/task.hpp (69%) rename src/gnb/{sas => sra}/transport.cpp (56%) rename src/ue/{sas => sra}/connection.cpp (88%) rename src/ue/{sas => sra}/measurement.cpp (84%) rename src/ue/{sas => sra}/task.cpp (76%) rename src/ue/{sas => sra}/task.hpp (78%) rename src/ue/{sas => sra}/transport.cpp (55%) rename src/urs/{sas_pdu.cpp => sra_pdu.cpp} (77%) rename src/urs/{sas_pdu.hpp => sra_pdu.hpp} (56%) diff --git a/src/gnb/gnb.cpp b/src/gnb/gnb.cpp index 722e32e0d..1ede5efac 100644 --- a/src/gnb/gnb.cpp +++ b/src/gnb/gnb.cpp @@ -12,7 +12,7 @@ #include "mr/task.hpp" #include "ngap/task.hpp" #include "rrc/task.hpp" -#include "sas/task.hpp" +#include "sra/task.hpp" #include "sctp/task.hpp" #include @@ -35,7 +35,7 @@ GNodeB::GNodeB(GnbConfig *config, app::INodeListener *nodeListener, NtsTask *cli base->rrcTask = new GnbRrcTask(base); base->gtpTask = new GtpTask(base); base->mrTask = new GnbMrTask(base); - base->sasTask = new GnbSasTask(base); + base->sraTask = new GnbSraTask(base); taskBase = base; } @@ -48,7 +48,7 @@ GNodeB::~GNodeB() taskBase->rrcTask->quit(); taskBase->gtpTask->quit(); taskBase->mrTask->quit(); - taskBase->sasTask->quit(); + taskBase->sraTask->quit(); delete taskBase->appTask; delete taskBase->sctpTask; @@ -56,7 +56,7 @@ GNodeB::~GNodeB() delete taskBase->rrcTask; delete taskBase->gtpTask; delete taskBase->mrTask; - delete taskBase->sasTask; + delete taskBase->sraTask; delete taskBase->logBase; @@ -69,7 +69,7 @@ void GNodeB::start() taskBase->sctpTask->start(); taskBase->ngapTask->start(); taskBase->rrcTask->start(); - taskBase->sasTask->start(); + taskBase->sraTask->start(); taskBase->mrTask->start(); taskBase->gtpTask->start(); } diff --git a/src/gnb/sas/handler.cpp b/src/gnb/sra/handler.cpp similarity index 87% rename from src/gnb/sas/handler.cpp rename to src/gnb/sra/handler.cpp index 2788eaaf6..f43a0aca0 100644 --- a/src/gnb/sas/handler.cpp +++ b/src/gnb/sra/handler.cpp @@ -26,7 +26,7 @@ static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) namespace nr::gnb { -void GnbSasTask::handleCellInfoRequest(const InetAddress &addr, const sas::SasCellInfoRequest &msg) +void GnbSraTask::handleCellInfoRequest(const InetAddress &addr, const sra::SraCellInfoRequest &msg) { int dbm = EstimateSimulatedDbm(m_base->config->phyLocation, msg.simPos); if (dbm < MIN_ALLOWED_DBM) @@ -35,7 +35,7 @@ void GnbSasTask::handleCellInfoRequest(const InetAddress &addr, const sas::SasCe return; } - sas::SasCellInfoResponse resp{}; + sra::SraCellInfoResponse resp{}; resp.cellId.nci = m_base->config->nci; resp.cellId.plmn = m_base->config->plmn; resp.tac = m_base->config->tac; @@ -43,7 +43,7 @@ void GnbSasTask::handleCellInfoRequest(const InetAddress &addr, const sas::SasCe resp.gnbName = m_base->config->name; resp.linkIp = m_base->config->portalIp; - sendSasMessage(addr, resp); + sendSraMessage(addr, resp); } } // namespace nr::gnb diff --git a/src/gnb/sas/task.cpp b/src/gnb/sra/task.cpp similarity index 70% rename from src/gnb/sas/task.cpp rename to src/gnb/sra/task.cpp index 8bed9d0f1..edac53a4a 100644 --- a/src/gnb/sas/task.cpp +++ b/src/gnb/sra/task.cpp @@ -16,12 +16,12 @@ namespace nr::gnb { -GnbSasTask::GnbSasTask(TaskBase *base) : m_base{base}, m_udpTask{} +GnbSraTask::GnbSraTask(TaskBase *base) : m_base{base}, m_udpTask{} { - m_logger = m_base->logBase->makeUniqueLogger("sas"); + m_logger = m_base->logBase->makeUniqueLogger("sra"); } -void GnbSasTask::onStart() +void GnbSraTask::onStart() { try { @@ -30,13 +30,13 @@ void GnbSasTask::onStart() } catch (const LibError &e) { - m_logger->err("SAS failure [%s]", e.what()); + m_logger->err("SRA failure [%s]", e.what()); quit(); return; } } -void GnbSasTask::onLoop() +void GnbSraTask::onLoop() { NtsMessage *msg = take(); if (!msg) @@ -46,13 +46,13 @@ void GnbSasTask::onLoop() { case NtsMessageType::UDP_SERVER_RECEIVE: { auto *w = dynamic_cast(msg); - auto sasMsg = sas::DecodeSasMessage(OctetView{w->packet}); - if (sasMsg == nullptr) + auto sraMsg = sra::DecodeSraMessage(OctetView{w->packet}); + if (sraMsg == nullptr) { - m_logger->err("Unable to decode SAS message"); + m_logger->err("Unable to decode SRA message"); break; } - receiveSasMessage(w->fromAddress, *sasMsg); + receiveSraMessage(w->fromAddress, *sraMsg); break; } default: @@ -63,7 +63,7 @@ void GnbSasTask::onLoop() delete msg; } -void GnbSasTask::onQuit() +void GnbSraTask::onQuit() { if (m_udpTask != nullptr) m_udpTask->quit(); diff --git a/src/gnb/sas/task.hpp b/src/gnb/sra/task.hpp similarity index 69% rename from src/gnb/sas/task.hpp rename to src/gnb/sra/task.hpp index f5bb2cb00..ab43cc3ba 100644 --- a/src/gnb/sas/task.hpp +++ b/src/gnb/sra/task.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include @@ -23,7 +23,7 @@ namespace nr::gnb { -class GnbSasTask : public NtsTask +class GnbSraTask : public NtsTask { private: TaskBase *m_base; @@ -33,8 +33,8 @@ class GnbSasTask : public NtsTask friend class GnbCmdHandler; public: - explicit GnbSasTask(TaskBase *base); - ~GnbSasTask() override = default; + explicit GnbSraTask(TaskBase *base); + ~GnbSraTask() override = default; protected: void onStart() override; @@ -42,11 +42,11 @@ class GnbSasTask : public NtsTask void onQuit() override; private: /* Transport */ - void receiveSasMessage(const InetAddress &addr, const sas::SasMessage &msg); - void sendSasMessage(const InetAddress &addr, const sas::SasMessage &msg); + void receiveSraMessage(const InetAddress &addr, const sra::SraMessage &msg); + void sendSraMessage(const InetAddress &addr, const sra::SraMessage &msg); private: /* Handler */ - void handleCellInfoRequest(const InetAddress &addr, const sas::SasCellInfoRequest &msg); + void handleCellInfoRequest(const InetAddress &addr, const sra::SraCellInfoRequest &msg); }; } // namespace nr::gnb \ No newline at end of file diff --git a/src/gnb/sas/transport.cpp b/src/gnb/sra/transport.cpp similarity index 56% rename from src/gnb/sas/transport.cpp rename to src/gnb/sra/transport.cpp index cdc8dcc28..ab1005a20 100644 --- a/src/gnb/sas/transport.cpp +++ b/src/gnb/sra/transport.cpp @@ -11,23 +11,23 @@ namespace nr::gnb { -void GnbSasTask::receiveSasMessage(const InetAddress &addr, const sas::SasMessage &msg) +void GnbSraTask::receiveSraMessage(const InetAddress &addr, const sra::SraMessage &msg) { switch (msg.msgType) { - case sas::SasMessageType::CELL_INFO_REQUEST: - handleCellInfoRequest(addr, (const sas::SasCellInfoRequest &)msg); + case sra::SraMessageType::CELL_INFO_REQUEST: + handleCellInfoRequest(addr, (const sra::SraCellInfoRequest &)msg); break; default: - m_logger->err("Unhandled SAS message received with type[%d]", static_cast(msg.msgType)); + m_logger->err("Unhandled SRA message received with type[%d]", static_cast(msg.msgType)); break; } } -void GnbSasTask::sendSasMessage(const InetAddress &addr, const sas::SasMessage &msg) +void GnbSraTask::sendSraMessage(const InetAddress &addr, const sra::SraMessage &msg) { OctetString stream{}; - sas::EncodeSasMessage(msg, stream); + sra::EncodeSraMessage(msg, stream); m_udpTask->send(addr, stream); } diff --git a/src/gnb/types.hpp b/src/gnb/types.hpp index 450446a31..17a6a3bb2 100644 --- a/src/gnb/types.hpp +++ b/src/gnb/types.hpp @@ -26,7 +26,7 @@ class GtpTask; class GnbMrTask; class NgapTask; class GnbRrcTask; -class GnbSasTask; +class GnbSraTask; class SctpTask; enum class EAmfState @@ -326,7 +326,7 @@ struct TaskBase NgapTask *ngapTask{}; GnbRrcTask *rrcTask{}; SctpTask *sctpTask{}; - GnbSasTask *sasTask{}; + GnbSraTask *sraTask{}; }; struct MrUeContext diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 647efb5ef..02a299dce 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include @@ -163,7 +163,7 @@ void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) break; } case app::UeCliCommand::COVERAGE: { - auto &map = m_base->sasTask->m_activeMeasurements; + auto &map = m_base->sraTask->m_activeMeasurements; if (map.empty()) { sendResult(msg.address, "No cell exists in the range"); diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index c1c3e2dbc..57dbcb9f1 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -218,7 +218,7 @@ struct NwUeRrcToMr : NtsMessage } }; -struct NwUeRrcToSas : NtsMessage +struct NwUeRrcToSra : NtsMessage { enum PR { @@ -230,12 +230,12 @@ struct NwUeRrcToSas : NtsMessage GlobalNci cellId{}; bool isSuitableCell{}; // otherwise 'acceptable' - explicit NwUeRrcToSas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_SAS), present(present) + explicit NwUeRrcToSra(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_SRA), present(present) { } }; -struct NwUeSasToRrc : NtsMessage +struct NwUeSraToRrc : NtsMessage { enum PR { @@ -249,7 +249,7 @@ struct NwUeSasToRrc : NtsMessage // SERVING_CELL_CHANGE UeCellInfo servingCell{}; - explicit NwUeSasToRrc(PR present) : NtsMessage(NtsMessageType::UE_SAS_TO_RRC), present(present) + explicit NwUeSraToRrc(PR present) : NtsMessage(NtsMessageType::UE_SRA_TO_RRC), present(present) { } }; diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 43d0380e0..2a3985369 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include namespace nr::ue @@ -65,7 +65,7 @@ void UeRrcTask::onLoop() switch (w->present) { case NwUeNasToRrc::PLMN_SEARCH_REQUEST: { - m_base->sasTask->push(new NwUeRrcToSas(NwUeRrcToSas::PLMN_SEARCH_REQUEST)); + m_base->sraTask->push(new NwUeRrcToSra(NwUeRrcToSra::PLMN_SEARCH_REQUEST)); break; } case NwUeNasToRrc::INITIAL_NAS_DELIVERY: { @@ -87,26 +87,26 @@ void UeRrcTask::onLoop() break; } case NwUeNasToRrc::CELL_SELECTION_COMMAND: { - auto *wr = new NwUeRrcToSas(NwUeRrcToSas::CELL_SELECTION_COMMAND); + auto *wr = new NwUeRrcToSra(NwUeRrcToSra::CELL_SELECTION_COMMAND); wr->cellId = w->cellId; wr->isSuitableCell = w->isSuitableCell; - m_base->sasTask->push(wr); + m_base->sraTask->push(wr); break; } } break; } - case NtsMessageType::UE_SAS_TO_RRC: { - auto *w = dynamic_cast(msg); + case NtsMessageType::UE_SRA_TO_RRC: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeSasToRrc::PLMN_SEARCH_RESPONSE: { + case NwUeSraToRrc::PLMN_SEARCH_RESPONSE: { auto *wr = new NwUeRrcToNas(NwUeRrcToNas::PLMN_SEARCH_RESPONSE); wr->measurements = std::move(w->measurements); m_base->nasTask->push(wr); break; } - case NwUeSasToRrc::SERVING_CELL_CHANGE: { + case NwUeSraToRrc::SERVING_CELL_CHANGE: { auto *wr = new NwUeRrcToNas(NwUeRrcToNas::SERVING_CELL_CHANGE); wr->servingCell = w->servingCell; m_base->nasTask->push(wr); diff --git a/src/ue/sas/connection.cpp b/src/ue/sra/connection.cpp similarity index 88% rename from src/ue/sas/connection.cpp rename to src/ue/sra/connection.cpp index f887f8a4c..12632b315 100644 --- a/src/ue/sas/connection.cpp +++ b/src/ue/sra/connection.cpp @@ -14,7 +14,7 @@ namespace nr::ue { -void UeSasTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) +void UeSraTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) { if (!m_activeMeasurements.count(cellId)) { @@ -31,7 +31,7 @@ void UeSasTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuita m_servingCell->linkIp = measurement.linkIp; m_servingCell->cellCategory = isSuitable ? ECellCategory::SUITABLE_CELL : ECellCategory::ACCEPTABLE_CELL; - auto *w = new NwUeSasToRrc(NwUeSasToRrc::SERVING_CELL_CHANGE); + auto *w = new NwUeSraToRrc(NwUeSraToRrc::SERVING_CELL_CHANGE); w->servingCell = *m_servingCell; m_base->rrcTask->push(w); } diff --git a/src/ue/sas/measurement.cpp b/src/ue/sra/measurement.cpp similarity index 84% rename from src/ue/sas/measurement.cpp rename to src/ue/sra/measurement.cpp index 8cb3cec3c..787f005a2 100644 --- a/src/ue/sas/measurement.cpp +++ b/src/ue/sra/measurement.cpp @@ -14,7 +14,7 @@ namespace nr::ue { -void UeSasTask::onMeasurement() +void UeSraTask::onMeasurement() { std::vector entered{}; std::vector exited{}; @@ -41,12 +41,12 @@ void UeSasTask::onMeasurement() // Issue another cell info request for each address in the search space for (auto &ip : m_cellSearchSpace) { - sas::SasCellInfoRequest req{}; - sendSasMessage(ip, req); + sra::SraCellInfoRequest req{}; + sendSraMessage(ip, req); } } -void UeSasTask::receiveCellInfoResponse(const sas::SasCellInfoResponse &msg) +void UeSraTask::receiveCellInfoResponse(const sra::SraCellInfoResponse &msg) { UeCellMeasurement meas{}; meas.cellId = msg.cellId; @@ -58,19 +58,19 @@ void UeSasTask::receiveCellInfoResponse(const sas::SasCellInfoResponse &msg) m_pendingMeasurements[meas.cellId] = meas; } -void UeSasTask::onCoverageChange(const std::vector &entered, const std::vector &exited) +void UeSraTask::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())); } -void UeSasTask::plmnSearchRequested() +void UeSraTask::plmnSearchRequested() { std::vector measurements{}; for (auto &m : m_activeMeasurements) measurements.push_back(m.second); - auto *w = new NwUeSasToRrc(NwUeSasToRrc::PLMN_SEARCH_RESPONSE); + auto *w = new NwUeSraToRrc(NwUeSraToRrc::PLMN_SEARCH_RESPONSE); w->measurements = std::move(measurements); m_base->rrcTask->push(w); } diff --git a/src/ue/sas/task.cpp b/src/ue/sra/task.cpp similarity index 76% rename from src/ue/sas/task.cpp rename to src/ue/sra/task.cpp index 115511ec8..e46a6df6a 100644 --- a/src/ue/sas/task.cpp +++ b/src/ue/sra/task.cpp @@ -16,16 +16,16 @@ static const int TIMER_PERIOD_MEASUREMENT = 2000; namespace nr::ue { -UeSasTask::UeSasTask(TaskBase *base) +UeSraTask::UeSraTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{}, m_servingCell{} { - m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "sas"); + m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "sra"); for (auto &addr : m_base->config->gnbSearchList) m_cellSearchSpace.emplace_back(addr, cons::PortalPort); } -void UeSasTask::onStart() +void UeSraTask::onStart() { m_udpTask = new udp::UdpServerTask(this); @@ -39,7 +39,7 @@ void UeSasTask::onStart() onMeasurement(); } -void UeSasTask::onLoop() +void UeSraTask::onLoop() { NtsMessage *msg = take(); if (!msg) @@ -47,11 +47,11 @@ void UeSasTask::onLoop() switch (msg->msgType) { - case NtsMessageType::UE_RRC_TO_SAS: { - auto *w = dynamic_cast(msg); - if (w->present == NwUeRrcToSas::PLMN_SEARCH_REQUEST) + case NtsMessageType::UE_RRC_TO_SRA: { + auto *w = dynamic_cast(msg); + if (w->present == NwUeRrcToSra::PLMN_SEARCH_REQUEST) plmnSearchRequested(); - else if (w->present == NwUeRrcToSas::CELL_SELECTION_COMMAND) + else if (w->present == NwUeRrcToSra::CELL_SELECTION_COMMAND) handleCellSelectionCommand(w->cellId, w->isSuitableCell); break; } @@ -66,13 +66,13 @@ void UeSasTask::onLoop() } case NtsMessageType::UDP_SERVER_RECEIVE: { auto *w = dynamic_cast(msg); - auto sasMsg = sas::DecodeSasMessage(OctetView{w->packet}); - if (sasMsg == nullptr) + auto sraMsg = sra::DecodeSraMessage(OctetView{w->packet}); + if (sraMsg == nullptr) { - m_logger->err("Unable to decode SAS message"); + m_logger->err("Unable to decode SRA message"); break; } - receiveSasMessage(w->fromAddress, *sasMsg); + receiveSraMessage(w->fromAddress, *sraMsg); break; } default: @@ -83,7 +83,7 @@ void UeSasTask::onLoop() delete msg; } -void UeSasTask::onQuit() +void UeSraTask::onQuit() { m_udpTask->quit(); delete m_udpTask; diff --git a/src/ue/sas/task.hpp b/src/ue/sra/task.hpp similarity index 78% rename from src/ue/sas/task.hpp rename to src/ue/sra/task.hpp index aeffd76a6..a9f8130d4 100644 --- a/src/ue/sas/task.hpp +++ b/src/ue/sra/task.hpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -23,7 +23,7 @@ namespace nr::ue { -class UeSasTask : public NtsTask +class UeSraTask : public NtsTask { private: TaskBase *m_base; @@ -39,8 +39,8 @@ class UeSasTask : public NtsTask friend class UeCmdHandler; public: - explicit UeSasTask(TaskBase *base); - ~UeSasTask() override = default; + explicit UeSraTask(TaskBase *base); + ~UeSraTask() override = default; protected: void onStart() override; @@ -48,12 +48,12 @@ class UeSasTask : public NtsTask void onQuit() override; private: /* Transport */ - void receiveSasMessage(const InetAddress &address, const sas::SasMessage &msg); - void sendSasMessage(const InetAddress &address, const sas::SasMessage &msg); + void receiveSraMessage(const InetAddress &address, const sra::SraMessage &msg); + void sendSraMessage(const InetAddress &address, const sra::SraMessage &msg); private: /* Measurement */ void onMeasurement(); - void receiveCellInfoResponse(const sas::SasCellInfoResponse &msg); + void receiveCellInfoResponse(const sra::SraCellInfoResponse &msg); void onCoverageChange(const std::vector &entered, const std::vector &exited); void plmnSearchRequested(); diff --git a/src/ue/sas/transport.cpp b/src/ue/sra/transport.cpp similarity index 55% rename from src/ue/sas/transport.cpp rename to src/ue/sra/transport.cpp index 2de67ead6..881c1c68f 100644 --- a/src/ue/sas/transport.cpp +++ b/src/ue/sra/transport.cpp @@ -11,24 +11,24 @@ namespace nr::ue { -void UeSasTask::receiveSasMessage(const InetAddress &address, const sas::SasMessage &msg) +void UeSraTask::receiveSraMessage(const InetAddress &address, const sra::SraMessage &msg) { switch (msg.msgType) { - case sas::SasMessageType::CELL_INFO_RESPONSE: { - receiveCellInfoResponse((const sas::SasCellInfoResponse &)msg); + case sra::SraMessageType::CELL_INFO_RESPONSE: { + receiveCellInfoResponse((const sra::SraCellInfoResponse &)msg); break; default: - m_logger->err("Unhandled SAS message type[%d]", static_cast(msg.msgType)); + m_logger->err("Unhandled SRA message type[%d]", static_cast(msg.msgType)); break; } } } -void UeSasTask::sendSasMessage(const InetAddress &address, const sas::SasMessage &msg) +void UeSraTask::sendSraMessage(const InetAddress &address, const sra::SraMessage &msg) { OctetString stream{}; - sas::EncodeSasMessage(msg, stream); + sra::EncodeSraMessage(msg, stream); m_udpTask->send(address, stream); } diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 4f51c9f68..79b5a11b5 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -27,7 +27,7 @@ class UeAppTask; class UeMrTask; class NasTask; class UeRrcTask; -class UeSasTask; +class UeSraTask; class UserEquipment; struct SupportedAlgs @@ -126,7 +126,7 @@ struct TaskBase UeMrTask *mrTask{}; NasTask *nasTask{}; UeRrcTask *rrcTask{}; - UeSasTask *sasTask{}; + UeSraTask *sraTask{}; }; struct UeTimers diff --git a/src/ue/ue.cpp b/src/ue/ue.cpp index 8d64eafa9..715e4a8e7 100644 --- a/src/ue/ue.cpp +++ b/src/ue/ue.cpp @@ -12,7 +12,7 @@ #include "mr/task.hpp" #include "nas/task.hpp" #include "rrc/task.hpp" -#include "sas/task.hpp" +#include "sra/task.hpp" namespace nr::ue { @@ -32,7 +32,7 @@ UserEquipment::UserEquipment(UeConfig *config, app::IUeController *ueController, base->rrcTask = new UeRrcTask(base); base->mrTask = new UeMrTask(base); base->appTask = new UeAppTask(base); - base->sasTask = new UeSasTask(base); + base->sraTask = new UeSraTask(base); taskBase = base; } @@ -42,13 +42,13 @@ UserEquipment::~UserEquipment() taskBase->nasTask->quit(); taskBase->rrcTask->quit(); taskBase->mrTask->quit(); - taskBase->sasTask->quit(); + taskBase->sraTask->quit(); taskBase->appTask->quit(); delete taskBase->nasTask; delete taskBase->rrcTask; delete taskBase->mrTask; - delete taskBase->sasTask; + delete taskBase->sraTask; delete taskBase->appTask; delete taskBase->logBase; @@ -61,7 +61,7 @@ void UserEquipment::start() taskBase->nasTask->start(); taskBase->rrcTask->start(); taskBase->mrTask->start(); - taskBase->sasTask->start(); + taskBase->sraTask->start(); taskBase->appTask->start(); } diff --git a/src/urs/sas_pdu.cpp b/src/urs/sra_pdu.cpp similarity index 77% rename from src/urs/sas_pdu.cpp rename to src/urs/sra_pdu.cpp index 24014b0de..5484566c0 100644 --- a/src/urs/sas_pdu.cpp +++ b/src/urs/sra_pdu.cpp @@ -6,10 +6,10 @@ // and subject to the terms and conditions defined in LICENSE file. // -#include "sas_pdu.hpp" +#include "sra_pdu.hpp" #include -namespace sas +namespace sra { static void AppendPlmn(const Plmn &plmn, OctetString &stream) @@ -42,7 +42,7 @@ static GlobalNci DecodeGlobalNci(const OctetView &stream) return res; } -void EncodeSasMessage(const SasMessage &msg, OctetString &stream) +void EncodeSraMessage(const SraMessage &msg, OctetString &stream) { stream.appendOctet(0x03); // (Just for old RLS compatibility) @@ -50,16 +50,16 @@ void EncodeSasMessage(const SasMessage &msg, OctetString &stream) stream.appendOctet(cons::Minor); stream.appendOctet(cons::Patch); stream.appendOctet(static_cast(msg.msgType)); - if (msg.msgType == SasMessageType::CELL_INFO_REQUEST) + if (msg.msgType == SraMessageType::CELL_INFO_REQUEST) { - auto m = (const SasCellInfoRequest &)msg; + auto m = (const SraCellInfoRequest &)msg; stream.appendOctet4(m.simPos.x); stream.appendOctet4(m.simPos.y); stream.appendOctet4(m.simPos.z); } - else if (msg.msgType == SasMessageType::CELL_INFO_RESPONSE) + else if (msg.msgType == SraMessageType::CELL_INFO_RESPONSE) { - auto m = (const SasCellInfoResponse &)msg; + auto m = (const SraCellInfoResponse &)msg; AppendGlobalNci(m.cellId, stream); stream.appendOctet4(m.tac); stream.appendOctet4(m.dbm); @@ -70,7 +70,7 @@ void EncodeSasMessage(const SasMessage &msg, OctetString &stream) } } -std::unique_ptr DecodeSasMessage(const OctetView &stream) +std::unique_ptr DecodeSraMessage(const OctetView &stream) { auto first = stream.readI(); // (Just for old RLS compatibility) if (first != 3) @@ -83,18 +83,18 @@ std::unique_ptr DecodeSasMessage(const OctetView &stream) if (stream.read() != cons::Patch) return nullptr; - auto msgType = static_cast(stream.readI()); - if (msgType == SasMessageType::CELL_INFO_REQUEST) + auto msgType = static_cast(stream.readI()); + if (msgType == SraMessageType::CELL_INFO_REQUEST) { - auto res = std::make_unique(); + auto res = std::make_unique(); res->simPos.x = stream.read4I(); res->simPos.y = stream.read4I(); res->simPos.z = stream.read4I(); return res; } - else if (msgType == SasMessageType::CELL_INFO_RESPONSE) + else if (msgType == SraMessageType::CELL_INFO_RESPONSE) { - auto res = std::make_unique(); + auto res = std::make_unique(); res->cellId = DecodeGlobalNci(stream); res->tac = stream.read4I(); res->dbm = stream.read4I(); @@ -106,4 +106,4 @@ std::unique_ptr DecodeSasMessage(const OctetView &stream) return nullptr; } -} // namespace sas +} // namespace sra diff --git a/src/urs/sas_pdu.hpp b/src/urs/sra_pdu.hpp similarity index 56% rename from src/urs/sas_pdu.hpp rename to src/urs/sra_pdu.hpp index 7a48d05be..8c305a819 100644 --- a/src/urs/sas_pdu.hpp +++ b/src/urs/sra_pdu.hpp @@ -14,35 +14,35 @@ #include #include -namespace sas +namespace sra { -enum class SasMessageType : uint8_t +enum class SraMessageType : uint8_t { RESERVED = 0, CELL_INFO_REQUEST, CELL_INFO_RESPONSE, }; -struct SasMessage +struct SraMessage { - const SasMessageType msgType; + const SraMessageType msgType; - explicit SasMessage(SasMessageType msgType) : msgType(msgType) + explicit SraMessage(SraMessageType msgType) : msgType(msgType) { } }; -struct SasCellInfoRequest : SasMessage +struct SraCellInfoRequest : SraMessage { Vector3 simPos{}; - SasCellInfoRequest() : SasMessage(SasMessageType::CELL_INFO_REQUEST) + SraCellInfoRequest() : SraMessage(SraMessageType::CELL_INFO_REQUEST) { } }; -struct SasCellInfoResponse : SasMessage +struct SraCellInfoResponse : SraMessage { GlobalNci cellId{}; int tac{}; @@ -50,12 +50,12 @@ struct SasCellInfoResponse : SasMessage std::string gnbName{}; std::string linkIp{}; - SasCellInfoResponse() : SasMessage(SasMessageType::CELL_INFO_RESPONSE) + SraCellInfoResponse() : SraMessage(SraMessageType::CELL_INFO_RESPONSE) { } }; -void EncodeSasMessage(const SasMessage &msg, OctetString &stream); -std::unique_ptr DecodeSasMessage(const OctetView &stream); +void EncodeSraMessage(const SraMessage &msg, OctetString &stream); +std::unique_ptr DecodeSraMessage(const OctetView &stream); -} // namespace sas \ No newline at end of file +} // namespace sra \ No newline at end of file diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 0d6a84f2a..5af636f90 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -53,9 +53,9 @@ enum class NtsMessageType UE_RRC_TO_NAS, UE_NAS_TO_RRC, UE_RRC_TO_MR, - UE_RRC_TO_SAS, + UE_RRC_TO_SRA, UE_NAS_TO_NAS, - UE_SAS_TO_RRC, + UE_SRA_TO_RRC, UE_NAS_TO_APP, }; From 4a5f885518d1821628daa81782d3563a59e7b435 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 00:38:08 +0300 Subject: [PATCH 015/116] UE SRA dev. --- src/ue/mm/radio.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ue/mm/radio.cpp b/src/ue/mm/radio.cpp index dfa162699..9b283c897 100644 --- a/src/ue/mm/radio.cpp +++ b/src/ue/mm/radio.cpp @@ -178,6 +178,8 @@ void NasMm::handleServingCellChange(const UeCellInfo &servingCell) else switchMmState(EMmState::MM_DEREGISTERED, isSuitable ? EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE : EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + + resetRegAttemptCounter(); } } From c2eeb194d4547655ed3b1203d9705b5260d0f609 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 00:42:35 +0300 Subject: [PATCH 016/116] UE SRA dev. --- src/utils/nts.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 5af636f90..df3281c42 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -54,9 +54,9 @@ enum class NtsMessageType UE_NAS_TO_RRC, UE_RRC_TO_MR, UE_RRC_TO_SRA, - UE_NAS_TO_NAS, + UE_NAS_TO_NAS, UE_SRA_TO_RRC, - UE_NAS_TO_APP, + UE_NAS_TO_APP, }; struct NtsMessage From 1a1fc96aee0801d8026e6938b23812a2aa3dfbd6 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 01:04:03 +0300 Subject: [PATCH 017/116] UE SRA dev. --- src/ue/mm/auth.cpp | 8 ++++---- src/ue/mm/identity.cpp | 2 +- src/ue/mm/radio.cpp | 8 ++++++-- src/ue/mm/register.cpp | 8 ++++---- src/ue/nas/task.cpp | 1 - src/ue/nas/usim.hpp | 7 +++---- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/ue/mm/auth.cpp b/src/ue/mm/auth.cpp index 20f22cd76..ceaf89c2e 100644 --- a/src/ue/mm/auth.cpp +++ b/src/ue/mm/auth.cpp @@ -80,7 +80,7 @@ void NasMm::receiveAuthenticationRequestEap(const nas::AuthenticationRequest &ms auto sqnXorAk = OctetString::Xor(m_usim->m_sqn, milenageAk); auto ckPrimeIkPrime = - keys::CalculateCkPrimeIkPrime(ck, ik, keys::ConstructServingNetworkName(m_usim->m_currentPlmn), sqnXorAk); + keys::CalculateCkPrimeIkPrime(ck, ik, keys::ConstructServingNetworkName(*m_usim->m_currentPlmn), sqnXorAk); auto &ckPrime = ckPrimeIkPrime.first; auto &ikPrime = ckPrimeIkPrime.second; @@ -198,7 +198,7 @@ void NasMm::receiveAuthenticationRequestEap(const nas::AuthenticationRequest &ms m_usim->m_nonCurrentNsCtx->keys.kAusf = std::move(kAusf); 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_usim->m_currentPlmn, *m_usim->m_nonCurrentNsCtx); // m_logger->debug("kSeaf: %s", m_usim->m_nonCurrentNsCtx->keys.kSeaf.toHexString().c_str()); // m_logger->debug("kAmf: %s", m_usim->m_nonCurrentNsCtx->keys.kAmf.toHexString().c_str()); @@ -266,7 +266,7 @@ void NasMm::receiveAuthenticationRequest5gAka(const nas::AuthenticationRequest & auto &milenageAk = milenage.ak; auto &milenageMac = milenage.mac_a; auto sqnXorAk = OctetString::Xor(m_usim->m_sqn, milenageAk); - auto snn = keys::ConstructServingNetworkName(m_usim->m_currentPlmn); + auto snn = keys::ConstructServingNetworkName(*m_usim->m_currentPlmn); // m_logger->debug("Calculated res[%s] ck[%s] ik[%s] ak[%s] mac_a[%s]", res.toHexString().c_str(), // ck.toHexString().c_str(), ik.toHexString().c_str(), milenageAk.toHexString().c_str(), @@ -287,7 +287,7 @@ void NasMm::receiveAuthenticationRequest5gAka(const nas::AuthenticationRequest & m_usim->m_nonCurrentNsCtx->keys.kAusf = keys::CalculateKAusfFor5gAka(ck, 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_usim->m_currentPlmn, *m_usim->m_nonCurrentNsCtx); // m_logger->debug("Derived kSeaf[%s] kAusf[%s] kAmf[%s]", // m_usim->m_nonCurrentNsCtx->keys.kSeaf.toHexString().c_str(), diff --git a/src/ue/mm/identity.cpp b/src/ue/mm/identity.cpp index 154c64a57..3d1f851fe 100644 --- a/src/ue/mm/identity.cpp +++ b/src/ue/mm/identity.cpp @@ -56,7 +56,7 @@ nas::IE5gsMobileIdentity NasMm::getOrGenerateSuci() nas::IE5gsMobileIdentity NasMm::generateSuci() { auto &supi = m_base->config->supi; - auto &plmn = m_usim->m_currentPlmn; + auto &plmn = m_base->config->hplmn; if (!supi.has_value()) return {}; diff --git a/src/ue/mm/radio.cpp b/src/ue/mm/radio.cpp index 9b283c897..14efdc4d0 100644 --- a/src/ue/mm/radio.cpp +++ b/src/ue/mm/radio.cpp @@ -178,9 +178,13 @@ void NasMm::handleServingCellChange(const UeCellInfo &servingCell) else switchMmState(EMmState::MM_DEREGISTERED, isSuitable ? EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE : EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); - - resetRegAttemptCounter(); } + // todo: else, other states abnormal case + + resetRegAttemptCounter(); + + m_usim->m_servingCell = servingCell; + m_usim->m_currentPlmn = servingCell.cellId.plmn; } void NasMm::handleRrcConnectionSetup() diff --git a/src/ue/mm/register.cpp b/src/ue/mm/register.cpp index 04d6b6f1a..6b8cd4151 100644 --- a/src/ue/mm/register.cpp +++ b/src/ue/mm/register.cpp @@ -230,7 +230,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_usim->m_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. @@ -337,7 +337,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_usim->m_currentPlmn)); // Store the service area list m_usim->m_serviceAreaList = msg.serviceAreaList.value_or(nas::IEServiceAreaList{}); @@ -547,7 +547,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_usim->m_currentPlmn)); } if (cause == nas::EMmCause::CONGESTION) @@ -707,7 +707,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_usim->m_currentPlmn)); } if (cause == nas::EMmCause::CONGESTION) diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index 02e09faa6..1e32ca889 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -29,7 +29,6 @@ NasTask::NasTask(TaskBase *base) : base{base}, timers{} void NasTask::onStart() { usim->initialize(base->config->supi.has_value(), base->config->initials); - usim->m_currentPlmn = base->config->hplmn; // TODO: normally assigned after plmn search sm->onStart(mm); mm->onStart(sm, usim); diff --git a/src/ue/nas/usim.hpp b/src/ue/nas/usim.hpp index 88a8c8c08..3a4c7595a 100644 --- a/src/ue/nas/usim.hpp +++ b/src/ue/nas/usim.hpp @@ -27,15 +27,14 @@ class Usim // State related E5UState m_uState{}; - // Location related - std::optional m_lastVisitedRegisteredTai{}; - // Identity related nas::IE5gsMobileIdentity m_storedSuci{}; nas::IE5gsMobileIdentity m_storedGuti{}; // Plmn related - Plmn m_currentPlmn{}; + std::optional m_servingCell{}; + std::optional m_currentPlmn{}; + std::optional m_lastVisitedRegisteredTai{}; nas::IE5gsTrackingAreaIdentityList m_taiList{}; nas::IE5gsTrackingAreaIdentityList m_forbiddenTaiList{}; nas::IEPlmnList m_equivalentPlmnList{}; From 0683203716fd9fa69876fad52c407c809eeade5f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 01:07:44 +0300 Subject: [PATCH 018/116] UE SRA dev. --- src/ue/mm/register.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ue/mm/register.cpp b/src/ue/mm/register.cpp index 6b8cd4151..0159cd64a 100644 --- a/src/ue/mm/register.cpp +++ b/src/ue/mm/register.cpp @@ -807,7 +807,9 @@ void NasMm::handleAbnormalMobilityRegFailure(nas::ERegistrationType regType) // "If the registration attempt counter is less than 5:" if (m_regCounter < 5) { - bool includedInTaiList = false; // TODO + 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}}); // "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" From 72059c9f565f6e098d1801f5bc9f32bb807e5c14 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:16:44 +0300 Subject: [PATCH 019/116] UE SRA dev. --- src/gnb/sra/transport.cpp | 2 +- src/ue/nts.hpp | 5 +++++ src/ue/rrc/channel.cpp | 34 +++++++++++++++++----------------- src/ue/sra/task.cpp | 15 +++++++++++++-- src/ue/sra/task.hpp | 3 +++ src/ue/sra/transport.cpp | 19 ++++++++++++++++++- src/urs/sra_pdu.cpp | 33 ++++++++++++++++++++++++++------- src/urs/sra_pdu.hpp | 29 ++++++++++++++++++++++++----- 8 files changed, 107 insertions(+), 33 deletions(-) diff --git a/src/gnb/sra/transport.cpp b/src/gnb/sra/transport.cpp index ab1005a20..bed85105b 100644 --- a/src/gnb/sra/transport.cpp +++ b/src/gnb/sra/transport.cpp @@ -15,7 +15,7 @@ void GnbSraTask::receiveSraMessage(const InetAddress &addr, const sra::SraMessag { switch (msg.msgType) { - case sra::SraMessageType::CELL_INFO_REQUEST: + case sra::EMessageType::CELL_INFO_REQUEST: handleCellInfoRequest(addr, (const sra::SraCellInfoRequest &)msg); break; default: diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 57dbcb9f1..3c5c8d3f0 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -224,12 +224,17 @@ struct NwUeRrcToSra : NtsMessage { PLMN_SEARCH_REQUEST, CELL_SELECTION_COMMAND, + RRC_PDU_DELIVERY } present; // CELL_SELECTION_COMMAND GlobalNci cellId{}; bool isSuitableCell{}; // otherwise 'acceptable' + // RRC_PDU_DELIVERY + rrc::RrcChannel channel{}; + OctetString pdu{}; + explicit NwUeRrcToSra(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_SRA), present(present) { } diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index de4c70733..d32557ed4 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -9,7 +9,7 @@ #include "task.hpp" #include -#include +#include #include #include @@ -107,10 +107,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) return; } - auto *nw = new NwUeRrcToMr(NwUeRrcToMr::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::BCCH_BCH; nw->pdu = std::move(pdu); - m_base->mrTask->push(nw); + m_base->sraTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg) @@ -122,10 +122,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg) return; } - auto *nw = new NwUeRrcToMr(NwUeRrcToMr::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::BCCH_DL_SCH; nw->pdu = std::move(pdu); - m_base->mrTask->push(nw); + m_base->sraTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_DL_CCCH_Message *msg) @@ -137,10 +137,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_DL_CCCH_Message *msg) return; } - auto *nw = new NwUeRrcToMr(NwUeRrcToMr::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::DL_CCCH; nw->pdu = std::move(pdu); - m_base->mrTask->push(nw); + m_base->sraTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_DL_DCCH_Message *msg) @@ -152,10 +152,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_DL_DCCH_Message *msg) return; } - auto *nw = new NwUeRrcToMr(NwUeRrcToMr::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::DL_DCCH; nw->pdu = std::move(pdu); - m_base->mrTask->push(nw); + m_base->sraTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_PCCH_Message *msg) @@ -167,10 +167,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_PCCH_Message *msg) return; } - auto *nw = new NwUeRrcToMr(NwUeRrcToMr::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::PCCH; nw->pdu = std::move(pdu); - m_base->mrTask->push(nw); + m_base->sraTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg) @@ -182,10 +182,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg) return; } - auto *nw = new NwUeRrcToMr(NwUeRrcToMr::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::UL_CCCH; nw->pdu = std::move(pdu); - m_base->mrTask->push(nw); + m_base->sraTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg) @@ -197,10 +197,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg) return; } - auto *nw = new NwUeRrcToMr(NwUeRrcToMr::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::UL_CCCH1; nw->pdu = std::move(pdu); - m_base->mrTask->push(nw); + m_base->sraTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) @@ -212,10 +212,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) return; } - auto *nw = new NwUeRrcToMr(NwUeRrcToMr::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::UL_DCCH; nw->pdu = std::move(pdu); - m_base->mrTask->push(nw); + m_base->sraTask->push(nw); } void UeRrcTask::receiveRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) diff --git a/src/ue/sra/task.cpp b/src/ue/sra/task.cpp index e46a6df6a..c8b1323b6 100644 --- a/src/ue/sra/task.cpp +++ b/src/ue/sra/task.cpp @@ -8,6 +8,7 @@ #include "task.hpp" #include +#include #include static const int TIMER_ID_MEASUREMENT = 1; @@ -23,6 +24,8 @@ UeSraTask::UeSraTask(TaskBase *base) for (auto &addr : m_base->config->gnbSearchList) m_cellSearchSpace.emplace_back(addr, cons::PortalPort); + + m_sti = utils::Random64(); } void UeSraTask::onStart() @@ -49,10 +52,18 @@ void UeSraTask::onLoop() { case NtsMessageType::UE_RRC_TO_SRA: { auto *w = dynamic_cast(msg); - if (w->present == NwUeRrcToSra::PLMN_SEARCH_REQUEST) + switch (w->present) + { + case NwUeRrcToSra::PLMN_SEARCH_REQUEST: plmnSearchRequested(); - else if (w->present == NwUeRrcToSra::CELL_SELECTION_COMMAND) + break; + case NwUeRrcToSra::CELL_SELECTION_COMMAND: handleCellSelectionCommand(w->cellId, w->isSuitableCell); + break; + case NwUeRrcToSra::RRC_PDU_DELIVERY: + deliverUplinkRrc(w->channel, std::move(w->pdu)); + break; + } break; } case NtsMessageType::TIMER_EXPIRED: { diff --git a/src/ue/sra/task.hpp b/src/ue/sra/task.hpp index a9f8130d4..f3700a7d9 100644 --- a/src/ue/sra/task.hpp +++ b/src/ue/sra/task.hpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -34,6 +35,7 @@ class UeSraTask : public NtsTask std::unordered_map m_pendingMeasurements; std::unordered_map m_activeMeasurements; + uint64_t m_sti; std::optional m_servingCell; friend class UeCmdHandler; @@ -50,6 +52,7 @@ class UeSraTask : public NtsTask private: /* Transport */ void receiveSraMessage(const InetAddress &address, const sra::SraMessage &msg); void sendSraMessage(const InetAddress &address, const sra::SraMessage &msg); + void deliverUplinkRrc(rrc::RrcChannel channel, OctetString &&pdu); private: /* Measurement */ void onMeasurement(); diff --git a/src/ue/sra/transport.cpp b/src/ue/sra/transport.cpp index 881c1c68f..d407bcc84 100644 --- a/src/ue/sra/transport.cpp +++ b/src/ue/sra/transport.cpp @@ -7,6 +7,7 @@ // #include "task.hpp" +#include namespace nr::ue { @@ -15,7 +16,7 @@ void UeSraTask::receiveSraMessage(const InetAddress &address, const sra::SraMess { switch (msg.msgType) { - case sra::SraMessageType::CELL_INFO_RESPONSE: { + case sra::EMessageType::CELL_INFO_RESPONSE: { receiveCellInfoResponse((const sra::SraCellInfoResponse &)msg); break; default: @@ -32,4 +33,20 @@ void UeSraTask::sendSraMessage(const InetAddress &address, const sra::SraMessage m_udpTask->send(address, stream); } +void UeSraTask::deliverUplinkRrc(rrc::RrcChannel channel, OctetString &&pdu) +{ + if (!m_servingCell.has_value()) + { + m_logger->warn("SRA uplink delivery requested without a serving cell"); + return; + } + + sra::SraPduDelivery msg{}; + msg.sti = m_sti; + msg.pduType = sra::EPduType::RRC; + msg.pdu = std::move(pdu); + msg.payload.appendOctet4(static_cast(channel)); + sendSraMessage(InetAddress{m_servingCell->linkIp, cons::PortalPort}, msg); +} + } // namespace nr::ue diff --git a/src/urs/sra_pdu.cpp b/src/urs/sra_pdu.cpp index 5484566c0..0ea3184d5 100644 --- a/src/urs/sra_pdu.cpp +++ b/src/urs/sra_pdu.cpp @@ -50,16 +50,16 @@ void EncodeSraMessage(const SraMessage &msg, OctetString &stream) stream.appendOctet(cons::Minor); stream.appendOctet(cons::Patch); stream.appendOctet(static_cast(msg.msgType)); - if (msg.msgType == SraMessageType::CELL_INFO_REQUEST) + if (msg.msgType == EMessageType::CELL_INFO_REQUEST) { - auto m = (const SraCellInfoRequest &)msg; + auto &m = (const SraCellInfoRequest &)msg; stream.appendOctet4(m.simPos.x); stream.appendOctet4(m.simPos.y); stream.appendOctet4(m.simPos.z); } - else if (msg.msgType == SraMessageType::CELL_INFO_RESPONSE) + else if (msg.msgType == EMessageType::CELL_INFO_RESPONSE) { - auto m = (const SraCellInfoResponse &)msg; + auto &m = (const SraCellInfoResponse &)msg; AppendGlobalNci(m.cellId, stream); stream.appendOctet4(m.tac); stream.appendOctet4(m.dbm); @@ -68,6 +68,16 @@ void EncodeSraMessage(const SraMessage &msg, OctetString &stream) stream.appendOctet4(static_cast(m.linkIp.size())); stream.appendUtf8(m.linkIp); } + else if (msg.msgType == EMessageType::PDU_DELIVERY) + { + auto &m = (const SraPduDelivery &)msg; + stream.appendOctet8(m.sti); + stream.appendOctet(static_cast(m.pduType)); + stream.appendOctet4(m.pdu.length()); + stream.append(m.pdu); + stream.appendOctet4(m.payload.length()); + stream.append(m.payload); + } } std::unique_ptr DecodeSraMessage(const OctetView &stream) @@ -83,8 +93,8 @@ std::unique_ptr DecodeSraMessage(const OctetView &stream) if (stream.read() != cons::Patch) return nullptr; - auto msgType = static_cast(stream.readI()); - if (msgType == SraMessageType::CELL_INFO_REQUEST) + auto msgType = static_cast(stream.readI()); + if (msgType == EMessageType::CELL_INFO_REQUEST) { auto res = std::make_unique(); res->simPos.x = stream.read4I(); @@ -92,7 +102,7 @@ std::unique_ptr DecodeSraMessage(const OctetView &stream) res->simPos.z = stream.read4I(); return res; } - else if (msgType == SraMessageType::CELL_INFO_RESPONSE) + else if (msgType == EMessageType::CELL_INFO_RESPONSE) { auto res = std::make_unique(); res->cellId = DecodeGlobalNci(stream); @@ -102,6 +112,15 @@ std::unique_ptr DecodeSraMessage(const OctetView &stream) res->linkIp = stream.readUtf8String(stream.read4I()); return res; } + else if (msgType == EMessageType::PDU_DELIVERY) + { + auto res = std::make_unique(); + res->sti = stream.read8UL(); + res->pduType = static_cast(stream.readI()); + res->pdu = stream.readOctetString(stream.read4I()); + res->payload = stream.readOctetString(stream.read4I()); + return res; + } return nullptr; } diff --git a/src/urs/sra_pdu.hpp b/src/urs/sra_pdu.hpp index 8c305a819..1d0402bd6 100644 --- a/src/urs/sra_pdu.hpp +++ b/src/urs/sra_pdu.hpp @@ -17,18 +17,25 @@ namespace sra { -enum class SraMessageType : uint8_t +enum class EMessageType : uint8_t { RESERVED = 0, CELL_INFO_REQUEST, CELL_INFO_RESPONSE, + PDU_DELIVERY +}; + +enum class EPduType : uint8_t +{ + RESERVED = 0, + RRC }; struct SraMessage { - const SraMessageType msgType; + const EMessageType msgType; - explicit SraMessage(SraMessageType msgType) : msgType(msgType) + explicit SraMessage(EMessageType msgType) : msgType(msgType) { } }; @@ -37,7 +44,7 @@ struct SraCellInfoRequest : SraMessage { Vector3 simPos{}; - SraCellInfoRequest() : SraMessage(SraMessageType::CELL_INFO_REQUEST) + SraCellInfoRequest() : SraMessage(EMessageType::CELL_INFO_REQUEST) { } }; @@ -50,7 +57,19 @@ struct SraCellInfoResponse : SraMessage std::string gnbName{}; std::string linkIp{}; - SraCellInfoResponse() : SraMessage(SraMessageType::CELL_INFO_RESPONSE) + SraCellInfoResponse() : SraMessage(EMessageType::CELL_INFO_RESPONSE) + { + } +}; + +struct SraPduDelivery : SraMessage +{ + uint64_t sti{}; + EPduType pduType{}; + OctetString pdu{}; + OctetString payload{}; + + SraPduDelivery() : SraMessage(EMessageType::PDU_DELIVERY) { } }; From 6af9ea83c2bc34d9a9bcbea1dedc3d1393ac26a3 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:18:07 +0300 Subject: [PATCH 020/116] UE SRA dev. --- src/ue/sra/connection.cpp | 39 -------------------------------------- src/ue/sra/measurement.cpp | 22 +++++++++++++++++++++ src/ue/sra/task.hpp | 2 -- 3 files changed, 22 insertions(+), 41 deletions(-) delete mode 100644 src/ue/sra/connection.cpp diff --git a/src/ue/sra/connection.cpp b/src/ue/sra/connection.cpp deleted file mode 100644 index 12632b315..000000000 --- a/src/ue/sra/connection.cpp +++ /dev/null @@ -1,39 +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 UeSraTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) -{ - 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->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 NwUeSraToRrc(NwUeSraToRrc::SERVING_CELL_CHANGE); - w->servingCell = *m_servingCell; - m_base->rrcTask->push(w); -} - -} // namespace nr::ue diff --git a/src/ue/sra/measurement.cpp b/src/ue/sra/measurement.cpp index 787f005a2..cca4a4aa6 100644 --- a/src/ue/sra/measurement.cpp +++ b/src/ue/sra/measurement.cpp @@ -75,4 +75,26 @@ void UeSraTask::plmnSearchRequested() m_base->rrcTask->push(w); } +void UeSraTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) +{ + 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->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 NwUeSraToRrc(NwUeSraToRrc::SERVING_CELL_CHANGE); + w->servingCell = *m_servingCell; + m_base->rrcTask->push(w); +} + } // namespace nr::ue diff --git a/src/ue/sra/task.hpp b/src/ue/sra/task.hpp index f3700a7d9..dabcac517 100644 --- a/src/ue/sra/task.hpp +++ b/src/ue/sra/task.hpp @@ -59,8 +59,6 @@ class UeSraTask : public NtsTask void receiveCellInfoResponse(const sra::SraCellInfoResponse &msg); void onCoverageChange(const std::vector &entered, const std::vector &exited); void plmnSearchRequested(); - - private: /* Connection */ void handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable); }; From e9ec142cea7d18fe9e6e71cd3bd6b40bcb79f117 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:20:46 +0300 Subject: [PATCH 021/116] UE SRA dev. --- src/ue/sra/task.hpp | 1 + src/ue/sra/transport.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ue/sra/task.hpp b/src/ue/sra/task.hpp index dabcac517..91ca9c9a8 100644 --- a/src/ue/sra/task.hpp +++ b/src/ue/sra/task.hpp @@ -52,6 +52,7 @@ class UeSraTask : public NtsTask private: /* Transport */ void receiveSraMessage(const InetAddress &address, const sra::SraMessage &msg); void sendSraMessage(const InetAddress &address, const sra::SraMessage &msg); + void deliverUplinkPdu(sra::EPduType pduType, OctetString &&pdu, OctetString &&payload); void deliverUplinkRrc(rrc::RrcChannel channel, OctetString &&pdu); private: /* Measurement */ diff --git a/src/ue/sra/transport.cpp b/src/ue/sra/transport.cpp index d407bcc84..d62c0f158 100644 --- a/src/ue/sra/transport.cpp +++ b/src/ue/sra/transport.cpp @@ -33,7 +33,7 @@ void UeSraTask::sendSraMessage(const InetAddress &address, const sra::SraMessage m_udpTask->send(address, stream); } -void UeSraTask::deliverUplinkRrc(rrc::RrcChannel channel, OctetString &&pdu) +void UeSraTask::deliverUplinkPdu(sra::EPduType pduType, OctetString &&pdu, OctetString &&payload) { if (!m_servingCell.has_value()) { @@ -43,10 +43,15 @@ void UeSraTask::deliverUplinkRrc(rrc::RrcChannel channel, OctetString &&pdu) sra::SraPduDelivery msg{}; msg.sti = m_sti; - msg.pduType = sra::EPduType::RRC; + msg.pduType = pduType; msg.pdu = std::move(pdu); - msg.payload.appendOctet4(static_cast(channel)); + msg.payload = std::move(payload); sendSraMessage(InetAddress{m_servingCell->linkIp, cons::PortalPort}, msg); } +void UeSraTask::deliverUplinkRrc(rrc::RrcChannel channel, OctetString &&pdu) +{ + deliverUplinkPdu(sra::EPduType::RRC, std::move(pdu), OctetString::FromOctet4(static_cast(channel))); +} + } // namespace nr::ue From a60627dc0c2427b536755a808a9b710063e545b4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:26:01 +0300 Subject: [PATCH 022/116] UE SRA dev. --- src/gnb/sra/handler.cpp | 2 +- src/gnb/sra/task.cpp | 3 ++- src/gnb/sra/task.hpp | 2 ++ src/ue/sra/measurement.cpp | 2 +- src/ue/sra/transport.cpp | 3 +-- src/urs/sra_pdu.cpp | 11 ++++++----- src/urs/sra_pdu.hpp | 10 +++++----- 7 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/gnb/sra/handler.cpp b/src/gnb/sra/handler.cpp index f43a0aca0..4887f3e70 100644 --- a/src/gnb/sra/handler.cpp +++ b/src/gnb/sra/handler.cpp @@ -35,7 +35,7 @@ void GnbSraTask::handleCellInfoRequest(const InetAddress &addr, const sra::SraCe return; } - sra::SraCellInfoResponse resp{}; + sra::SraCellInfoResponse resp{m_sti}; resp.cellId.nci = m_base->config->nci; resp.cellId.plmn = m_base->config->plmn; resp.tac = m_base->config->tac; diff --git a/src/gnb/sra/task.cpp b/src/gnb/sra/task.cpp index edac53a4a..996e5e0bf 100644 --- a/src/gnb/sra/task.cpp +++ b/src/gnb/sra/task.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -19,6 +20,7 @@ namespace nr::gnb GnbSraTask::GnbSraTask(TaskBase *base) : m_base{base}, m_udpTask{} { m_logger = m_base->logBase->makeUniqueLogger("sra"); + m_sti = utils::Random64(); } void GnbSraTask::onStart() @@ -70,5 +72,4 @@ void GnbSraTask::onQuit() delete m_udpTask; } - } // namespace nr::gnb diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index ab43cc3ba..737f90cbe 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -30,6 +30,8 @@ class GnbSraTask : public NtsTask std::unique_ptr m_logger; udp::UdpServerTask *m_udpTask; + uint64_t m_sti; + friend class GnbCmdHandler; public: diff --git a/src/ue/sra/measurement.cpp b/src/ue/sra/measurement.cpp index cca4a4aa6..eef919bcd 100644 --- a/src/ue/sra/measurement.cpp +++ b/src/ue/sra/measurement.cpp @@ -41,7 +41,7 @@ void UeSraTask::onMeasurement() // Issue another cell info request for each address in the search space for (auto &ip : m_cellSearchSpace) { - sra::SraCellInfoRequest req{}; + sra::SraCellInfoRequest req{m_sti}; sendSraMessage(ip, req); } } diff --git a/src/ue/sra/transport.cpp b/src/ue/sra/transport.cpp index d62c0f158..7ada33621 100644 --- a/src/ue/sra/transport.cpp +++ b/src/ue/sra/transport.cpp @@ -41,8 +41,7 @@ void UeSraTask::deliverUplinkPdu(sra::EPduType pduType, OctetString &&pdu, Octet return; } - sra::SraPduDelivery msg{}; - msg.sti = m_sti; + sra::SraPduDelivery msg{m_sti}; msg.pduType = pduType; msg.pdu = std::move(pdu); msg.payload = std::move(payload); diff --git a/src/urs/sra_pdu.cpp b/src/urs/sra_pdu.cpp index 0ea3184d5..091860b27 100644 --- a/src/urs/sra_pdu.cpp +++ b/src/urs/sra_pdu.cpp @@ -50,6 +50,7 @@ void EncodeSraMessage(const SraMessage &msg, OctetString &stream) stream.appendOctet(cons::Minor); stream.appendOctet(cons::Patch); stream.appendOctet(static_cast(msg.msgType)); + stream.appendOctet8(msg.sti); if (msg.msgType == EMessageType::CELL_INFO_REQUEST) { auto &m = (const SraCellInfoRequest &)msg; @@ -71,7 +72,6 @@ void EncodeSraMessage(const SraMessage &msg, OctetString &stream) else if (msg.msgType == EMessageType::PDU_DELIVERY) { auto &m = (const SraPduDelivery &)msg; - stream.appendOctet8(m.sti); stream.appendOctet(static_cast(m.pduType)); stream.appendOctet4(m.pdu.length()); stream.append(m.pdu); @@ -94,9 +94,11 @@ std::unique_ptr DecodeSraMessage(const OctetView &stream) return nullptr; auto msgType = static_cast(stream.readI()); + uint64_t sti = stream.read8UL(); + if (msgType == EMessageType::CELL_INFO_REQUEST) { - auto res = std::make_unique(); + auto res = std::make_unique(sti); res->simPos.x = stream.read4I(); res->simPos.y = stream.read4I(); res->simPos.z = stream.read4I(); @@ -104,7 +106,7 @@ std::unique_ptr DecodeSraMessage(const OctetView &stream) } else if (msgType == EMessageType::CELL_INFO_RESPONSE) { - auto res = std::make_unique(); + auto res = std::make_unique(sti); res->cellId = DecodeGlobalNci(stream); res->tac = stream.read4I(); res->dbm = stream.read4I(); @@ -114,8 +116,7 @@ std::unique_ptr DecodeSraMessage(const OctetView &stream) } else if (msgType == EMessageType::PDU_DELIVERY) { - auto res = std::make_unique(); - res->sti = stream.read8UL(); + auto res = std::make_unique(sti); res->pduType = static_cast(stream.readI()); res->pdu = stream.readOctetString(stream.read4I()); res->payload = stream.readOctetString(stream.read4I()); diff --git a/src/urs/sra_pdu.hpp b/src/urs/sra_pdu.hpp index 1d0402bd6..cd9decdff 100644 --- a/src/urs/sra_pdu.hpp +++ b/src/urs/sra_pdu.hpp @@ -34,8 +34,9 @@ enum class EPduType : uint8_t struct SraMessage { const EMessageType msgType; + const uint64_t sti{}; - explicit SraMessage(EMessageType msgType) : msgType(msgType) + explicit SraMessage(EMessageType msgType, uint64_t sti) : msgType(msgType), sti(sti) { } }; @@ -44,7 +45,7 @@ struct SraCellInfoRequest : SraMessage { Vector3 simPos{}; - SraCellInfoRequest() : SraMessage(EMessageType::CELL_INFO_REQUEST) + explicit SraCellInfoRequest(uint64_t sti) : SraMessage(EMessageType::CELL_INFO_REQUEST, sti) { } }; @@ -57,19 +58,18 @@ struct SraCellInfoResponse : SraMessage std::string gnbName{}; std::string linkIp{}; - SraCellInfoResponse() : SraMessage(EMessageType::CELL_INFO_RESPONSE) + explicit SraCellInfoResponse(uint64_t sti) : SraMessage(EMessageType::CELL_INFO_RESPONSE, sti) { } }; struct SraPduDelivery : SraMessage { - uint64_t sti{}; EPduType pduType{}; OctetString pdu{}; OctetString payload{}; - SraPduDelivery() : SraMessage(EMessageType::PDU_DELIVERY) + explicit SraPduDelivery(uint64_t sti) : SraMessage(EMessageType::PDU_DELIVERY, sti) { } }; From 505bc9cfd948f715783d1efc16b60a88a7633182 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:28:49 +0300 Subject: [PATCH 023/116] UE SRA dev. --- src/ue/sra/measurement.cpp | 2 ++ src/utils/common_types.hpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/ue/sra/measurement.cpp b/src/ue/sra/measurement.cpp index eef919bcd..13cc0764c 100644 --- a/src/ue/sra/measurement.cpp +++ b/src/ue/sra/measurement.cpp @@ -49,6 +49,7 @@ void UeSraTask::onMeasurement() void UeSraTask::receiveCellInfoResponse(const sra::SraCellInfoResponse &msg) { UeCellMeasurement meas{}; + meas.sti = msg.sti; meas.cellId = msg.cellId; meas.tac = msg.tac; meas.dbm = msg.dbm; @@ -86,6 +87,7 @@ void UeSraTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuita 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; diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index d9d466046..337c00ec3 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -142,6 +142,7 @@ enum class ECellCategory struct UeCellMeasurement { + uint64_t sti{}; GlobalNci cellId{}; int tac{}; int dbm{}; @@ -151,6 +152,7 @@ struct UeCellMeasurement struct UeCellInfo { + uint64_t sti{}; GlobalNci cellId{}; int tac{}; ECellCategory cellCategory{}; From b44eeafd93e2dea57d6544a8f27b980f067bddba Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:43:17 +0300 Subject: [PATCH 024/116] UE SRA dev. --- src/gnb/sra/management.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/gnb/sra/task.cpp | 2 +- src/gnb/sra/task.hpp | 5 +++++ src/gnb/sra/transport.cpp | 2 ++ src/gnb/types.hpp | 12 ++++++++++++ src/utils/common.cpp | 4 ++-- 6 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/gnb/sra/management.cpp diff --git a/src/gnb/sra/management.cpp b/src/gnb/sra/management.cpp new file mode 100644 index 000000000..c28d0c12e --- /dev/null +++ b/src/gnb/sra/management.cpp @@ -0,0 +1,36 @@ +// +// 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 + +namespace nr::gnb +{ + +void GnbSraTask::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; + } + else + { + int ueId = utils::NextId(); + m_stiToUeId[sti] = ueId; + auto ctx = std::make_unique(ueId); + ctx->sti = sti; + ctx->addr = addr; + m_ueCtx[ueId] = std::move(ctx); + + m_logger->debug("New UE signal detected, UE[%d]", ueId); + } +} + +} // namespace nr::gnb diff --git a/src/gnb/sra/task.cpp b/src/gnb/sra/task.cpp index 996e5e0bf..a074e7e42 100644 --- a/src/gnb/sra/task.cpp +++ b/src/gnb/sra/task.cpp @@ -17,7 +17,7 @@ namespace nr::gnb { -GnbSraTask::GnbSraTask(TaskBase *base) : m_base{base}, m_udpTask{} +GnbSraTask::GnbSraTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_ueCtx{}, m_stiToUeId{} { m_logger = m_base->logBase->makeUniqueLogger("sra"); m_sti = utils::Random64(); diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index 737f90cbe..b8b139663 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -31,6 +31,8 @@ class GnbSraTask : public NtsTask udp::UdpServerTask *m_udpTask; uint64_t m_sti; + std::unordered_map> m_ueCtx; + std::unordered_map m_stiToUeId; friend class GnbCmdHandler; @@ -49,6 +51,9 @@ class GnbSraTask : public NtsTask private: /* Handler */ void handleCellInfoRequest(const InetAddress &addr, const sra::SraCellInfoRequest &msg); + + private: /* UE Management */ + void updateUeInfo(const InetAddress &addr, uint64_t sti); }; } // namespace nr::gnb \ No newline at end of file diff --git a/src/gnb/sra/transport.cpp b/src/gnb/sra/transport.cpp index bed85105b..2d8b01d21 100644 --- a/src/gnb/sra/transport.cpp +++ b/src/gnb/sra/transport.cpp @@ -13,6 +13,8 @@ namespace nr::gnb void GnbSraTask::receiveSraMessage(const InetAddress &addr, const sra::SraMessage &msg) { + updateUeInfo(addr, msg.sti); + switch (msg.msgType) { case sra::EMessageType::CELL_INFO_REQUEST: diff --git a/src/gnb/types.hpp b/src/gnb/types.hpp index 17a6a3bb2..1e7fa24a5 100644 --- a/src/gnb/types.hpp +++ b/src/gnb/types.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -104,6 +105,17 @@ struct NgapAmfContext std::vector plmnSupportList{}; }; +struct SraUeContext +{ + const int ueId; + uint64_t sti{}; + InetAddress addr{}; + + explicit SraUeContext(int ueId) : ueId(ueId) + { + } +}; + struct AggregateMaximumBitRate { uint64_t dlAmbr{}; diff --git a/src/utils/common.cpp b/src/utils/common.cpp index 537f792e8..2ec0d7e6a 100644 --- a/src/utils/common.cpp +++ b/src/utils/common.cpp @@ -26,7 +26,7 @@ static_assert(sizeof(float) == sizeof(uint32_t)); static_assert(sizeof(double) == sizeof(uint64_t)); static_assert(sizeof(long long) == sizeof(uint64_t)); -static std::atomic IdCounter = 1; +static std::atomic g_idCounter = 1; static bool IPv6FromString(const char *szAddress, uint8_t *address) { @@ -135,7 +135,7 @@ std::vector utils::HexStringToVector(const std::string &hex) int utils::NextId() { - int res = ++IdCounter; + int res = ++g_idCounter; if (res == 0) { // ID counter overflows. From 489220a5da691f645855d62b3c70dde6b1cfadbb Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:45:50 +0300 Subject: [PATCH 025/116] UE SRA dev. --- src/gnb/sra/management.cpp | 2 ++ src/gnb/types.hpp | 1 + 2 files changed, 3 insertions(+) diff --git a/src/gnb/sra/management.cpp b/src/gnb/sra/management.cpp index c28d0c12e..044972d54 100644 --- a/src/gnb/sra/management.cpp +++ b/src/gnb/sra/management.cpp @@ -19,6 +19,7 @@ void GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) int ueId = m_stiToUeId[sti]; auto &ctx = m_ueCtx[ueId]; ctx->addr = addr; + ctx->lastSeen = utils::CurrentTimeMillis(); } else { @@ -27,6 +28,7 @@ void GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) 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, UE[%d]", ueId); diff --git a/src/gnb/types.hpp b/src/gnb/types.hpp index 1e7fa24a5..e9fc0b8a5 100644 --- a/src/gnb/types.hpp +++ b/src/gnb/types.hpp @@ -110,6 +110,7 @@ struct SraUeContext const int ueId; uint64_t sti{}; InetAddress addr{}; + int64_t lastSeen{}; explicit SraUeContext(int ueId) : ueId(ueId) { From ca30b23593a82403878e9430d7c72dfdc0e57341 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:49:04 +0300 Subject: [PATCH 026/116] UE SRA dev. --- src/gnb/sra/management.cpp | 5 +++++ src/gnb/sra/task.cpp | 14 ++++++++++++++ src/gnb/sra/task.hpp | 1 + 3 files changed, 20 insertions(+) diff --git a/src/gnb/sra/management.cpp b/src/gnb/sra/management.cpp index 044972d54..1fe3fc4a8 100644 --- a/src/gnb/sra/management.cpp +++ b/src/gnb/sra/management.cpp @@ -35,4 +35,9 @@ void GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) } } +void GnbSraTask::onPeriodicLostControl() +{ + +} + } // namespace nr::gnb diff --git a/src/gnb/sra/task.cpp b/src/gnb/sra/task.cpp index a074e7e42..99270cf38 100644 --- a/src/gnb/sra/task.cpp +++ b/src/gnb/sra/task.cpp @@ -14,6 +14,9 @@ #include #include +static const int TIMER_ID_LOST_CONTROL = 1; +static const int TIMER_PERIOD_LOST_CONTROL = 2000; + namespace nr::gnb { @@ -36,6 +39,8 @@ void GnbSraTask::onStart() quit(); return; } + + setTimer(TIMER_ID_LOST_CONTROL, TIMER_PERIOD_LOST_CONTROL); } void GnbSraTask::onLoop() @@ -57,6 +62,15 @@ void GnbSraTask::onLoop() receiveSraMessage(w->fromAddress, *sraMsg); 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; + } default: m_logger->unhandledNts(msg); break; diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index b8b139663..6173366df 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -54,6 +54,7 @@ class GnbSraTask : public NtsTask private: /* UE Management */ void updateUeInfo(const InetAddress &addr, uint64_t sti); + void onPeriodicLostControl(); }; } // namespace nr::gnb \ No newline at end of file From a583bd553a7a82c40381a7db28352b6ac08556ea Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 15:59:10 +0300 Subject: [PATCH 027/116] UE SRA dev. --- src/gnb/sra/management.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/gnb/sra/management.cpp b/src/gnb/sra/management.cpp index 1fe3fc4a8..27dea7fc8 100644 --- a/src/gnb/sra/management.cpp +++ b/src/gnb/sra/management.cpp @@ -7,8 +7,11 @@ // #include "task.hpp" +#include #include +static const int64_t LAST_SEEN_THRESHOLD = 3000; + namespace nr::gnb { @@ -31,13 +34,33 @@ void GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) ctx->lastSeen = utils::CurrentTimeMillis(); m_ueCtx[ueId] = std::move(ctx); - m_logger->debug("New UE signal detected, UE[%d]", ueId); + m_logger->debug("New UE signal detected, total [%d] UEs in coverage", static_cast(m_stiToUeId.size())); } } void GnbSraTask::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); + } } } // namespace nr::gnb From 330ee8862dbe0ad7368644a3a06f15cebb67dd7f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 16:24:58 +0300 Subject: [PATCH 028/116] UE SRA dev. --- src/gnb/sra/handler.cpp | 9 +++++++-- src/gnb/sra/management.cpp | 4 +++- src/gnb/sra/task.hpp | 7 ++++--- src/gnb/sra/transport.cpp | 21 ++++++++++++++++----- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/gnb/sra/handler.cpp b/src/gnb/sra/handler.cpp index 4887f3e70..214cfb924 100644 --- a/src/gnb/sra/handler.cpp +++ b/src/gnb/sra/handler.cpp @@ -26,7 +26,7 @@ static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) namespace nr::gnb { -void GnbSraTask::handleCellInfoRequest(const InetAddress &addr, const sra::SraCellInfoRequest &msg) +void GnbSraTask::handleCellInfoRequest(int ueId,const sra::SraCellInfoRequest &msg) { int dbm = EstimateSimulatedDbm(m_base->config->phyLocation, msg.simPos); if (dbm < MIN_ALLOWED_DBM) @@ -43,7 +43,12 @@ void GnbSraTask::handleCellInfoRequest(const InetAddress &addr, const sra::SraCe resp.gnbName = m_base->config->name; resp.linkIp = m_base->config->portalIp; - sendSraMessage(addr, resp); + sendSraMessage(ueId, resp); +} + +void GnbSraTask::handleUplinkPduDelivery(int ueId, const sra::SraPduDelivery &msg) +{ + } } // namespace nr::gnb diff --git a/src/gnb/sra/management.cpp b/src/gnb/sra/management.cpp index 27dea7fc8..01b8e789b 100644 --- a/src/gnb/sra/management.cpp +++ b/src/gnb/sra/management.cpp @@ -15,7 +15,7 @@ static const int64_t LAST_SEEN_THRESHOLD = 3000; namespace nr::gnb { -void GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) +int GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) { if (m_stiToUeId.count(sti)) { @@ -23,6 +23,7 @@ void GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) auto &ctx = m_ueCtx[ueId]; ctx->addr = addr; ctx->lastSeen = utils::CurrentTimeMillis(); + return ueId; } else { @@ -35,6 +36,7 @@ void GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) 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; } } diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index 6173366df..b2206f4f6 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -47,13 +47,14 @@ class GnbSraTask : public NtsTask private: /* Transport */ void receiveSraMessage(const InetAddress &addr, const sra::SraMessage &msg); - void sendSraMessage(const InetAddress &addr, const sra::SraMessage &msg); + void sendSraMessage(int ueId, const sra::SraMessage &msg); private: /* Handler */ - void handleCellInfoRequest(const InetAddress &addr, const sra::SraCellInfoRequest &msg); + void handleCellInfoRequest(int ueId, const sra::SraCellInfoRequest &msg); + void handleUplinkPduDelivery(int ueId, const sra::SraPduDelivery &msg); private: /* UE Management */ - void updateUeInfo(const InetAddress &addr, uint64_t sti); + int updateUeInfo(const InetAddress &addr, uint64_t sti); void onPeriodicLostControl(); }; diff --git a/src/gnb/sra/transport.cpp b/src/gnb/sra/transport.cpp index 2d8b01d21..90204bc14 100644 --- a/src/gnb/sra/transport.cpp +++ b/src/gnb/sra/transport.cpp @@ -13,24 +13,35 @@ namespace nr::gnb void GnbSraTask::receiveSraMessage(const InetAddress &addr, const sra::SraMessage &msg) { - updateUeInfo(addr, msg.sti); + int ueId = updateUeInfo(addr, msg.sti); switch (msg.msgType) { - case sra::EMessageType::CELL_INFO_REQUEST: - handleCellInfoRequest(addr, (const sra::SraCellInfoRequest &)msg); + case sra::EMessageType::CELL_INFO_REQUEST: { + handleCellInfoRequest(ueId, (const sra::SraCellInfoRequest &)msg); break; + } + case sra::EMessageType::PDU_DELIVERY: { + handleUplinkPduDelivery(ueId, (const sra::SraPduDelivery &)msg); + break; + } default: m_logger->err("Unhandled SRA message received with type[%d]", static_cast(msg.msgType)); break; } } -void GnbSraTask::sendSraMessage(const InetAddress &addr, const sra::SraMessage &msg) +void GnbSraTask::sendSraMessage(int ueId, const sra::SraMessage &msg) { + if (!m_ueCtx.count(ueId)) + { + m_logger->err("SRA message sending failure, UE[%d] not exists", ueId); + return; + } + OctetString stream{}; sra::EncodeSraMessage(msg, stream); - m_udpTask->send(addr, stream); + m_udpTask->send(m_ueCtx[ueId]->addr, stream); } } // namespace nr::gnb From ee60a817789cae16f532a806c0b5a06f57ac46e9 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 16:35:10 +0300 Subject: [PATCH 029/116] UE SRA dev. --- src/gnb/nts.hpp | 19 +++++++++++++++++++ src/gnb/sra/handler.cpp | 12 ++++++++++-- src/gnb/sra/task.hpp | 4 ++-- src/gnb/sra/transport.cpp | 4 ++-- src/utils/nts.hpp | 1 + 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 4d8904fa0..9dc970353 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -45,6 +45,25 @@ struct NwGnbMrToRrc : NtsMessage } }; +struct NwGnbSraToRrc : NtsMessage +{ + enum PR + { + RRC_PDU_DELIVERY, + } present; + + // RRC_PDU_DELIVERY + int ueId{}; + + // RRC_PDU_DELIVERY + rrc::RrcChannel channel{}; + OctetString pdu{}; + + explicit NwGnbSraToRrc(PR present) : NtsMessage(NtsMessageType::GNB_SRA_TO_RRC), present(present) + { + } +}; + struct NwGnbRrcToMr : NtsMessage { enum PR diff --git a/src/gnb/sra/handler.cpp b/src/gnb/sra/handler.cpp index 214cfb924..11451d9ca 100644 --- a/src/gnb/sra/handler.cpp +++ b/src/gnb/sra/handler.cpp @@ -8,6 +8,7 @@ #include "task.hpp" #include +#include static int MIN_ALLOWED_DBM = -120; @@ -46,9 +47,16 @@ void GnbSraTask::handleCellInfoRequest(int ueId,const sra::SraCellInfoRequest &m sendSraMessage(ueId, resp); } -void GnbSraTask::handleUplinkPduDelivery(int ueId, const sra::SraPduDelivery &msg) +void GnbSraTask::handleUplinkPduDelivery(int ueId, sra::SraPduDelivery &msg) { - + if (msg.pduType == sra::EPduType::RRC) + { + auto *nw = new NwGnbSraToRrc(NwGnbSraToRrc::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); + } } } // namespace nr::gnb diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index b2206f4f6..159b4e016 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -46,12 +46,12 @@ class GnbSraTask : public NtsTask void onQuit() override; private: /* Transport */ - void receiveSraMessage(const InetAddress &addr, const sra::SraMessage &msg); + void receiveSraMessage(const InetAddress &addr, sra::SraMessage &msg); void sendSraMessage(int ueId, const sra::SraMessage &msg); private: /* Handler */ void handleCellInfoRequest(int ueId, const sra::SraCellInfoRequest &msg); - void handleUplinkPduDelivery(int ueId, const sra::SraPduDelivery &msg); + void handleUplinkPduDelivery(int ueId, sra::SraPduDelivery &msg); private: /* UE Management */ int updateUeInfo(const InetAddress &addr, uint64_t sti); diff --git a/src/gnb/sra/transport.cpp b/src/gnb/sra/transport.cpp index 90204bc14..91dd70767 100644 --- a/src/gnb/sra/transport.cpp +++ b/src/gnb/sra/transport.cpp @@ -11,7 +11,7 @@ namespace nr::gnb { -void GnbSraTask::receiveSraMessage(const InetAddress &addr, const sra::SraMessage &msg) +void GnbSraTask::receiveSraMessage(const InetAddress &addr, sra::SraMessage &msg) { int ueId = updateUeInfo(addr, msg.sti); @@ -22,7 +22,7 @@ void GnbSraTask::receiveSraMessage(const InetAddress &addr, const sra::SraMessag break; } case sra::EMessageType::PDU_DELIVERY: { - handleUplinkPduDelivery(ueId, (const sra::SraPduDelivery &)msg); + handleUplinkPduDelivery(ueId, (sra::SraPduDelivery &)msg); break; } default: diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index df3281c42..ca88a84b8 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -36,6 +36,7 @@ enum class NtsMessageType GNB_MR_TO_MR, GNB_MR_TO_RRC, + GNB_SRA_TO_RRC, GNB_RRC_TO_MR, GNB_NGAP_TO_RRC, GNB_RRC_TO_NGAP, From bf35195486fd271c01b3b79e1eee5528ce53d3e6 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 16:39:06 +0300 Subject: [PATCH 030/116] UE SRA dev. --- src/gnb/mr/task.cpp | 10 +++++----- src/gnb/nts.hpp | 6 ------ src/gnb/rrc/task.cpp | 15 +++++++++++---- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/gnb/mr/task.cpp b/src/gnb/mr/task.cpp index 4e7d54f56..385f1da59 100644 --- a/src/gnb/mr/task.cpp +++ b/src/gnb/mr/task.cpp @@ -171,11 +171,11 @@ void GnbMrTask::receiveUplinkPayload(int ue, rls::EPayloadType type, OctetString { if (type == rls::EPayloadType::RRC) { - auto *nw = new NwGnbMrToRrc(NwGnbMrToRrc::RRC_PDU_DELIVERY); - nw->ueId = ue; - nw->channel = static_cast(payload.getI(0)); - nw->pdu = payload.subCopy(1); - m_base->rrcTask->push(nw); + //auto *nw = new NwGnbMrToRrc(NwGnbMrToRrc::RRC_PDU_DELIVERY); + //nw->ueId = ue; + //nw->channel = static_cast(payload.getI(0)); + //nw->pdu = payload.subCopy(1); + //m_base->rrcTask->push(nw); } else if (type == rls::EPayloadType::DATA) { diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 9dc970353..95e7dcd4a 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -28,18 +28,12 @@ struct NwGnbMrToRrc : NtsMessage { enum PR { - RRC_PDU_DELIVERY, RADIO_LINK_FAILURE, } present; - // RRC_PDU_DELIVERY // RADIO_LINK_FAILURE int ueId{}; - // RRC_PDU_DELIVERY - rrc::RrcChannel channel{}; - OctetString pdu{}; - explicit NwGnbMrToRrc(PR present) : NtsMessage(NtsMessageType::GNB_MR_TO_RRC), present(present) { } diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index cd9b6f7ab..7ddba577d 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -42,10 +42,6 @@ void GnbRrcTask::onLoop() auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbMrToRrc::RRC_PDU_DELIVERY: { - handleUplinkRrc(w->ueId, w->channel, w->pdu); - break; - } case NwGnbMrToRrc::RADIO_LINK_FAILURE: { handleRadioLinkFailure(w->ueId); break; @@ -53,6 +49,17 @@ void GnbRrcTask::onLoop() } break; } + case NtsMessageType::GNB_SRA_TO_RRC: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwGnbSraToRrc::RRC_PDU_DELIVERY: { + handleUplinkRrc(w->ueId, w->channel, w->pdu); + break; + } + } + break; + } case NtsMessageType::GNB_NGAP_TO_RRC: { auto *w = dynamic_cast(msg); switch (w->present) From bf553cbaa81d68a7863a5b545c6b0f26d7825fc6 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 16:50:55 +0300 Subject: [PATCH 031/116] UE SRA dev. --- src/gnb/nts.hpp | 17 +++++++++++++++++ src/gnb/rrc/channel.cpp | 34 +++++++++++++++++----------------- src/gnb/sra/handler.cpp | 23 ++++++++++++++++------- src/gnb/sra/task.cpp | 12 ++++++++++++ src/gnb/sra/task.hpp | 1 + src/utils/nts.hpp | 1 + 6 files changed, 64 insertions(+), 24 deletions(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 95e7dcd4a..fdac242f4 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -80,6 +80,23 @@ struct NwGnbRrcToMr : NtsMessage } }; +struct NwGnbRrcToSra : NtsMessage +{ + enum PR + { + RRC_PDU_DELIVERY, + } present; + + // RRC_PDU_DELIVERY + int ueId{}; + rrc::RrcChannel channel{}; + OctetString pdu{}; + + explicit NwGnbRrcToSra(PR present) : NtsMessage(NtsMessageType::GNB_RRC_TO_SRA), present(present) + { + } +}; + struct NwGnbNgapToRrc : NtsMessage { enum PR diff --git a/src/gnb/rrc/channel.cpp b/src/gnb/rrc/channel.cpp index b689310ef..c0002f285 100644 --- a/src/gnb/rrc/channel.cpp +++ b/src/gnb/rrc/channel.cpp @@ -9,8 +9,8 @@ #include "task.hpp" #include #include +#include #include -#include namespace nr::gnb { @@ -103,11 +103,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg) return; } - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::BCCH_BCH; w->pdu = std::move(pdu); - m_base->mrTask->push(w); + m_base->sraTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg) @@ -119,11 +119,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg) return; } - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::BCCH_DL_SCH; w->pdu = std::move(pdu); - m_base->mrTask->push(w); + m_base->sraTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg) @@ -135,11 +135,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg) return; } - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::DL_CCCH; w->pdu = std::move(pdu); - m_base->mrTask->push(w); + m_base->sraTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg) @@ -151,11 +151,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg) return; } - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::DL_DCCH; w->pdu = std::move(pdu); - m_base->mrTask->push(w); + m_base->sraTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg) @@ -167,11 +167,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg) return; } - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::PCCH; w->pdu = std::move(pdu); - m_base->mrTask->push(w); + m_base->sraTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH_Message *msg) @@ -183,11 +183,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH_Message *msg) return; } - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::UL_CCCH; w->pdu = std::move(pdu); - m_base->mrTask->push(w); + m_base->sraTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH1_Message *msg) @@ -199,11 +199,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH1_Message *msg) return; } - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::UL_CCCH1; w->pdu = std::move(pdu); - m_base->mrTask->push(w); + m_base->sraTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_DCCH_Message *msg) @@ -215,11 +215,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_DCCH_Message *msg) return; } - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::UL_DCCH; w->pdu = std::move(pdu); - m_base->mrTask->push(w); + m_base->sraTask->push(w); } void GnbRrcTask::receiveRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg) diff --git a/src/gnb/sra/handler.cpp b/src/gnb/sra/handler.cpp index 11451d9ca..66e4cd208 100644 --- a/src/gnb/sra/handler.cpp +++ b/src/gnb/sra/handler.cpp @@ -27,7 +27,7 @@ static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) namespace nr::gnb { -void GnbSraTask::handleCellInfoRequest(int ueId,const sra::SraCellInfoRequest &msg) +void GnbSraTask::handleCellInfoRequest(int ueId, const sra::SraCellInfoRequest &msg) { int dbm = EstimateSimulatedDbm(m_base->config->phyLocation, msg.simPos); if (dbm < MIN_ALLOWED_DBM) @@ -50,13 +50,22 @@ void GnbSraTask::handleCellInfoRequest(int ueId,const sra::SraCellInfoRequest &m void GnbSraTask::handleUplinkPduDelivery(int ueId, sra::SraPduDelivery &msg) { if (msg.pduType == sra::EPduType::RRC) - { - auto *nw = new NwGnbSraToRrc(NwGnbSraToRrc::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); + { + auto *nw = new NwGnbSraToRrc(NwGnbSraToRrc::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); } } +void GnbSraTask::handleDownlinkDelivery(int ueId, sra::EPduType pduType, OctetString &&pdu, OctetString &&payload) +{ + sra::SraPduDelivery resp{m_sti}; + resp.pduType = pduType; + resp.pdu = std::move(pdu); + resp.payload = std::move(payload); + sendSraMessage(ueId, resp); +} + } // namespace nr::gnb diff --git a/src/gnb/sra/task.cpp b/src/gnb/sra/task.cpp index 99270cf38..70c6a615c 100644 --- a/src/gnb/sra/task.cpp +++ b/src/gnb/sra/task.cpp @@ -51,6 +51,18 @@ void GnbSraTask::onLoop() switch (msg->msgType) { + case NtsMessageType::GNB_RRC_TO_SRA: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwGnbRrcToSra::RRC_PDU_DELIVERY: { + handleDownlinkDelivery(w->ueId, sra::EPduType::RRC, std::move(w->pdu), + OctetString::FromOctet4(static_cast(w->channel))); + break; + } + } + break; + } case NtsMessageType::UDP_SERVER_RECEIVE: { auto *w = dynamic_cast(msg); auto sraMsg = sra::DecodeSraMessage(OctetView{w->packet}); diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index 159b4e016..1e0c6bce3 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -52,6 +52,7 @@ class GnbSraTask : public NtsTask private: /* Handler */ void handleCellInfoRequest(int ueId, const sra::SraCellInfoRequest &msg); void handleUplinkPduDelivery(int ueId, sra::SraPduDelivery &msg); + void handleDownlinkDelivery(int ueId, sra::EPduType pduType, OctetString &&pdu, OctetString &&payload); private: /* UE Management */ int updateUeInfo(const InetAddress &addr, uint64_t sti); diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index ca88a84b8..85aadc6da 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -38,6 +38,7 @@ enum class NtsMessageType GNB_MR_TO_RRC, GNB_SRA_TO_RRC, GNB_RRC_TO_MR, + GNB_RRC_TO_SRA, GNB_NGAP_TO_RRC, GNB_RRC_TO_NGAP, GNB_NGAP_TO_GTP, From 25fc5487a474161b94e9801f4bfc2e13b4e794d2 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:14:21 +0300 Subject: [PATCH 032/116] UE SRA dev. --- src/ue/mr/task.cpp | 8 ++++---- src/ue/nts.hpp | 12 ++++++------ src/ue/rrc/task.cpp | 8 ++++---- src/ue/sra/task.cpp | 3 ++- src/ue/sra/task.hpp | 4 ++-- src/ue/sra/transport.cpp | 18 +++++++++++++++--- 6 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/ue/mr/task.cpp b/src/ue/mr/task.cpp index 305270570..d23c6f1eb 100644 --- a/src/ue/mr/task.cpp +++ b/src/ue/mr/task.cpp @@ -175,10 +175,10 @@ void UeMrTask::receiveDownlinkPayload(rls::EPayloadType type, OctetString &&payl { if (type == rls::EPayloadType::RRC) { - auto *nw = new NwUeMrToRrc(NwUeMrToRrc::RRC_PDU_DELIVERY); - nw->channel = static_cast(payload.getI(0)); - nw->pdu = payload.subCopy(1); - m_base->rrcTask->push(nw); + //auto *nw = new NwUeMrToRrc(NwUeMrToRrc::RRC_PDU_DELIVERY); + //nw->channel = static_cast(payload.getI(0)); + //nw->pdu = payload.subCopy(1); + //m_base->rrcTask->push(nw); } else if (type == rls::EPayloadType::DATA) { diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 3c5c8d3f0..14e80cee7 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -63,14 +63,9 @@ struct NwUeMrToRrc : NtsMessage { enum PR { - RRC_PDU_DELIVERY, RADIO_LINK_FAILURE } present; - // RRC_PDU_DELIVERY - rrc::RrcChannel channel{}; - OctetString pdu{}; - explicit NwUeMrToRrc(PR present) : NtsMessage(NtsMessageType::UE_MR_TO_RRC), present(present) { } @@ -245,7 +240,8 @@ struct NwUeSraToRrc : NtsMessage enum PR { PLMN_SEARCH_RESPONSE, - SERVING_CELL_CHANGE + SERVING_CELL_CHANGE, + RRC_PDU_DELIVERY } present; // PLMN_SEARCH_RESPONSE @@ -254,6 +250,10 @@ struct NwUeSraToRrc : NtsMessage // SERVING_CELL_CHANGE UeCellInfo servingCell{}; + // RRC_PDU_DELIVERY + rrc::RrcChannel channel{}; + OctetString pdu{}; + explicit NwUeSraToRrc(PR present) : NtsMessage(NtsMessageType::UE_SRA_TO_RRC), present(present) { } diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 2a3985369..e15e25066 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -49,10 +49,6 @@ void UeRrcTask::onLoop() auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeMrToRrc::RRC_PDU_DELIVERY: { - handleDownlinkRrc(w->channel, w->pdu); - break; - } case NwUeMrToRrc::RADIO_LINK_FAILURE: { handleRadioLinkFailure(); break; @@ -112,6 +108,10 @@ void UeRrcTask::onLoop() m_base->nasTask->push(wr); break; } + case NwUeSraToRrc::RRC_PDU_DELIVERY: { + handleDownlinkRrc(w->channel, w->pdu); + break; + } } break; } diff --git a/src/ue/sra/task.cpp b/src/ue/sra/task.cpp index c8b1323b6..60f86c2be 100644 --- a/src/ue/sra/task.cpp +++ b/src/ue/sra/task.cpp @@ -61,7 +61,8 @@ void UeSraTask::onLoop() handleCellSelectionCommand(w->cellId, w->isSuitableCell); break; case NwUeRrcToSra::RRC_PDU_DELIVERY: - deliverUplinkRrc(w->channel, std::move(w->pdu)); + deliverUplinkPdu(sra::EPduType::RRC, std::move(w->pdu), + OctetString::FromOctet4(static_cast(w->channel))); break; } break; diff --git a/src/ue/sra/task.hpp b/src/ue/sra/task.hpp index 91ca9c9a8..6cc6a0170 100644 --- a/src/ue/sra/task.hpp +++ b/src/ue/sra/task.hpp @@ -50,10 +50,10 @@ class UeSraTask : public NtsTask void onQuit() override; private: /* Transport */ - void receiveSraMessage(const InetAddress &address, const sra::SraMessage &msg); + void receiveSraMessage(const InetAddress &address, sra::SraMessage &msg); void sendSraMessage(const InetAddress &address, const sra::SraMessage &msg); void deliverUplinkPdu(sra::EPduType pduType, OctetString &&pdu, OctetString &&payload); - void deliverUplinkRrc(rrc::RrcChannel channel, OctetString &&pdu); + void deliverDownlinkPdu(sra::SraPduDelivery &msg); private: /* Measurement */ void onMeasurement(); diff --git a/src/ue/sra/transport.cpp b/src/ue/sra/transport.cpp index 7ada33621..8c8790e89 100644 --- a/src/ue/sra/transport.cpp +++ b/src/ue/sra/transport.cpp @@ -7,18 +7,24 @@ // #include "task.hpp" +#include +#include #include namespace nr::ue { -void UeSraTask::receiveSraMessage(const InetAddress &address, const sra::SraMessage &msg) +void UeSraTask::receiveSraMessage(const InetAddress &address, sra::SraMessage &msg) { switch (msg.msgType) { case sra::EMessageType::CELL_INFO_RESPONSE: { receiveCellInfoResponse((const sra::SraCellInfoResponse &)msg); break; + case sra::EMessageType::PDU_DELIVERY: { + deliverDownlinkPdu((sra::SraPduDelivery &)msg); + break; + } default: m_logger->err("Unhandled SRA message type[%d]", static_cast(msg.msgType)); break; @@ -48,9 +54,15 @@ void UeSraTask::deliverUplinkPdu(sra::EPduType pduType, OctetString &&pdu, Octet sendSraMessage(InetAddress{m_servingCell->linkIp, cons::PortalPort}, msg); } -void UeSraTask::deliverUplinkRrc(rrc::RrcChannel channel, OctetString &&pdu) +void UeSraTask::deliverDownlinkPdu(sra::SraPduDelivery &msg) { - deliverUplinkPdu(sra::EPduType::RRC, std::move(pdu), OctetString::FromOctet4(static_cast(channel))); + if (msg.pduType == sra::EPduType::RRC) + { + auto *nw = new NwUeSraToRrc(NwUeSraToRrc::RRC_PDU_DELIVERY); + nw->channel = static_cast(msg.payload.get4I(0)); + nw->pdu = std::move(msg.pdu); + m_base->rrcTask->push(nw); + } } } // namespace nr::ue From 9744a72792db4e60300583a59cbd156e56c143e0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:15:26 +0300 Subject: [PATCH 033/116] UE SRA dev. --- src/ue/mm/security.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ue/mm/security.cpp b/src/ue/mm/security.cpp index 9f850981e..6a023d9c4 100644 --- a/src/ue/mm/security.cpp +++ b/src/ue/mm/security.cpp @@ -109,8 +109,8 @@ void NasMm::receiveSecurityModeCommand(const nas::SecurityModeCommand &msg) nsCtx->ciphering = msg.selectedNasSecurityAlgorithms.ciphering; keys::DeriveNasKeys(*nsCtx); - m_logger->debug("Derived NAS keys integrity[%s] ciphering[%s]", nsCtx->keys.kNasInt.toHexString().c_str(), - nsCtx->keys.kNasEnc.toHexString().c_str()); + // m_logger->debug("Derived NAS keys integrity[%s] ciphering[%s]", nsCtx->keys.kNasInt.toHexString().c_str(), + // nsCtx->keys.kNasEnc.toHexString().c_str()); m_logger->debug("Selected integrity[%d] ciphering[%d]", (int)nsCtx->integrity, (int)nsCtx->ciphering); // The UE shall in addition reset the uplink NAS COUNT counter if a) the SECURITY MODE COMMAND message is received From 43e1dc4b6b17d05530404c0a8896b8fcaf5de57d Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:18:31 +0300 Subject: [PATCH 034/116] UE NAS refactor --- src/ue/{ => nas}/mm/access.cpp | 2 +- src/ue/{ => nas}/mm/auth.cpp | 0 src/ue/{ => nas}/mm/base.cpp | 0 src/ue/{ => nas}/mm/config.cpp | 0 src/ue/{ => nas}/mm/dereg.cpp | 2 +- src/ue/{ => nas}/mm/ecall.cpp | 0 src/ue/{ => nas}/mm/identity.cpp | 0 src/ue/{ => nas}/mm/interface.cpp | 0 src/ue/{ => nas}/mm/mm.hpp | 0 src/ue/{ => nas}/mm/radio.cpp | 2 +- src/ue/{ => nas}/mm/register.cpp | 0 src/ue/{ => nas}/mm/security.cpp | 0 src/ue/{ => nas}/mm/service.cpp | 0 src/ue/{ => nas}/mm/slice.cpp | 2 +- src/ue/{ => nas}/mm/timer.cpp | 0 src/ue/{ => nas}/mm/transport.cpp | 2 +- src/ue/{ => nas}/sm/allocation.cpp | 0 src/ue/{ => nas}/sm/base.cpp | 0 src/ue/{ => nas}/sm/establishment.cpp | 2 +- src/ue/{ => nas}/sm/interface.cpp | 2 +- src/ue/{ => nas}/sm/procedure.cpp | 2 +- src/ue/{ => nas}/sm/release.cpp | 2 +- src/ue/{ => nas}/sm/resource.cpp | 0 src/ue/{ => nas}/sm/sm.hpp | 0 src/ue/{ => nas}/sm/timer.cpp | 2 +- src/ue/{ => nas}/sm/transport.cpp | 2 +- src/ue/nas/task.hpp | 4 ++-- 27 files changed, 13 insertions(+), 13 deletions(-) rename src/ue/{ => nas}/mm/access.cpp (97%) rename src/ue/{ => nas}/mm/auth.cpp (100%) rename src/ue/{ => nas}/mm/base.cpp (100%) rename src/ue/{ => nas}/mm/config.cpp (100%) rename src/ue/{ => nas}/mm/dereg.cpp (99%) rename src/ue/{ => nas}/mm/ecall.cpp (100%) rename src/ue/{ => nas}/mm/identity.cpp (100%) rename src/ue/{ => nas}/mm/interface.cpp (100%) rename src/ue/{ => nas}/mm/mm.hpp (100%) rename src/ue/{ => nas}/mm/radio.cpp (99%) rename src/ue/{ => nas}/mm/register.cpp (100%) rename src/ue/{ => nas}/mm/security.cpp (100%) rename src/ue/{ => nas}/mm/service.cpp (100%) rename src/ue/{ => nas}/mm/slice.cpp (98%) rename src/ue/{ => nas}/mm/timer.cpp (100%) rename src/ue/{ => nas}/mm/transport.cpp (99%) rename src/ue/{ => nas}/sm/allocation.cpp (100%) rename src/ue/{ => nas}/sm/base.cpp (100%) rename src/ue/{ => nas}/sm/establishment.cpp (99%) rename src/ue/{ => nas}/sm/interface.cpp (96%) rename src/ue/{ => nas}/sm/procedure.cpp (98%) rename src/ue/{ => nas}/sm/release.cpp (99%) rename src/ue/{ => nas}/sm/resource.cpp (100%) rename src/ue/{ => nas}/sm/sm.hpp (100%) rename src/ue/{ => nas}/sm/timer.cpp (98%) rename src/ue/{ => nas}/sm/transport.cpp (99%) diff --git a/src/ue/mm/access.cpp b/src/ue/nas/mm/access.cpp similarity index 97% rename from src/ue/mm/access.cpp rename to src/ue/nas/mm/access.cpp index b8ec3baca..44c2c1703 100644 --- a/src/ue/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -9,7 +9,7 @@ #include "mm.hpp" #include -#include +#include namespace nr::ue { diff --git a/src/ue/mm/auth.cpp b/src/ue/nas/mm/auth.cpp similarity index 100% rename from src/ue/mm/auth.cpp rename to src/ue/nas/mm/auth.cpp diff --git a/src/ue/mm/base.cpp b/src/ue/nas/mm/base.cpp similarity index 100% rename from src/ue/mm/base.cpp rename to src/ue/nas/mm/base.cpp diff --git a/src/ue/mm/config.cpp b/src/ue/nas/mm/config.cpp similarity index 100% rename from src/ue/mm/config.cpp rename to src/ue/nas/mm/config.cpp diff --git a/src/ue/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp similarity index 99% rename from src/ue/mm/dereg.cpp rename to src/ue/nas/mm/dereg.cpp index 2fcc7f0b5..50ff934e1 100644 --- a/src/ue/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -9,7 +9,7 @@ #include "mm.hpp" #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/mm/ecall.cpp b/src/ue/nas/mm/ecall.cpp similarity index 100% rename from src/ue/mm/ecall.cpp rename to src/ue/nas/mm/ecall.cpp diff --git a/src/ue/mm/identity.cpp b/src/ue/nas/mm/identity.cpp similarity index 100% rename from src/ue/mm/identity.cpp rename to src/ue/nas/mm/identity.cpp diff --git a/src/ue/mm/interface.cpp b/src/ue/nas/mm/interface.cpp similarity index 100% rename from src/ue/mm/interface.cpp rename to src/ue/nas/mm/interface.cpp diff --git a/src/ue/mm/mm.hpp b/src/ue/nas/mm/mm.hpp similarity index 100% rename from src/ue/mm/mm.hpp rename to src/ue/nas/mm/mm.hpp diff --git a/src/ue/mm/radio.cpp b/src/ue/nas/mm/radio.cpp similarity index 99% rename from src/ue/mm/radio.cpp rename to src/ue/nas/mm/radio.cpp index 14efdc4d0..e485cb597 100644 --- a/src/ue/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/mm/register.cpp b/src/ue/nas/mm/register.cpp similarity index 100% rename from src/ue/mm/register.cpp rename to src/ue/nas/mm/register.cpp diff --git a/src/ue/mm/security.cpp b/src/ue/nas/mm/security.cpp similarity index 100% rename from src/ue/mm/security.cpp rename to src/ue/nas/mm/security.cpp diff --git a/src/ue/mm/service.cpp b/src/ue/nas/mm/service.cpp similarity index 100% rename from src/ue/mm/service.cpp rename to src/ue/nas/mm/service.cpp diff --git a/src/ue/mm/slice.cpp b/src/ue/nas/mm/slice.cpp similarity index 98% rename from src/ue/mm/slice.cpp rename to src/ue/nas/mm/slice.cpp index 34a42dc11..7b048e0e6 100644 --- a/src/ue/mm/slice.cpp +++ b/src/ue/nas/mm/slice.cpp @@ -9,7 +9,7 @@ #include "mm.hpp" #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/mm/timer.cpp b/src/ue/nas/mm/timer.cpp similarity index 100% rename from src/ue/mm/timer.cpp rename to src/ue/nas/mm/timer.cpp diff --git a/src/ue/mm/transport.cpp b/src/ue/nas/mm/transport.cpp similarity index 99% rename from src/ue/mm/transport.cpp rename to src/ue/nas/mm/transport.cpp index 3ec6123f6..fff9dbe5a 100644 --- a/src/ue/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/sm/allocation.cpp b/src/ue/nas/sm/allocation.cpp similarity index 100% rename from src/ue/sm/allocation.cpp rename to src/ue/nas/sm/allocation.cpp diff --git a/src/ue/sm/base.cpp b/src/ue/nas/sm/base.cpp similarity index 100% rename from src/ue/sm/base.cpp rename to src/ue/nas/sm/base.cpp diff --git a/src/ue/sm/establishment.cpp b/src/ue/nas/sm/establishment.cpp similarity index 99% rename from src/ue/sm/establishment.cpp rename to src/ue/nas/sm/establishment.cpp index daffb55a1..1155a67e3 100644 --- a/src/ue/sm/establishment.cpp +++ b/src/ue/nas/sm/establishment.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/sm/interface.cpp b/src/ue/nas/sm/interface.cpp similarity index 96% rename from src/ue/sm/interface.cpp rename to src/ue/nas/sm/interface.cpp index cfeae4554..139628469 100644 --- a/src/ue/sm/interface.cpp +++ b/src/ue/nas/sm/interface.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/sm/procedure.cpp b/src/ue/nas/sm/procedure.cpp similarity index 98% rename from src/ue/sm/procedure.cpp rename to src/ue/nas/sm/procedure.cpp index 4ad14c51e..617b80fd6 100644 --- a/src/ue/sm/procedure.cpp +++ b/src/ue/nas/sm/procedure.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/sm/release.cpp b/src/ue/nas/sm/release.cpp similarity index 99% rename from src/ue/sm/release.cpp rename to src/ue/nas/sm/release.cpp index f85cf90ce..b07c44641 100644 --- a/src/ue/sm/release.cpp +++ b/src/ue/nas/sm/release.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/sm/resource.cpp b/src/ue/nas/sm/resource.cpp similarity index 100% rename from src/ue/sm/resource.cpp rename to src/ue/nas/sm/resource.cpp diff --git a/src/ue/sm/sm.hpp b/src/ue/nas/sm/sm.hpp similarity index 100% rename from src/ue/sm/sm.hpp rename to src/ue/nas/sm/sm.hpp diff --git a/src/ue/sm/timer.cpp b/src/ue/nas/sm/timer.cpp similarity index 98% rename from src/ue/sm/timer.cpp rename to src/ue/nas/sm/timer.cpp index 5b5ede1ac..2b8e418a5 100644 --- a/src/ue/sm/timer.cpp +++ b/src/ue/nas/sm/timer.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace nr::ue { diff --git a/src/ue/sm/transport.cpp b/src/ue/nas/sm/transport.cpp similarity index 99% rename from src/ue/sm/transport.cpp rename to src/ue/nas/sm/transport.cpp index 2b5d5b74d..2a02abf19 100644 --- a/src/ue/sm/transport.cpp +++ b/src/ue/nas/sm/transport.cpp @@ -8,7 +8,7 @@ #include "sm.hpp" #include -#include +#include namespace nr::ue { diff --git a/src/ue/nas/task.hpp b/src/ue/nas/task.hpp index b726ac832..d3e575be0 100644 --- a/src/ue/nas/task.hpp +++ b/src/ue/nas/task.hpp @@ -12,9 +12,9 @@ #include #include #include -#include +#include +#include #include -#include #include #include From a07f5dda632894f72d50e95669c8bab68d20c36c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:19:45 +0300 Subject: [PATCH 035/116] SRA dev. --- src/ue/mr/task.cpp | 9 --------- src/ue/nts.hpp | 5 ----- 2 files changed, 14 deletions(-) diff --git a/src/ue/mr/task.cpp b/src/ue/mr/task.cpp index d23c6f1eb..a1fe984ca 100644 --- a/src/ue/mr/task.cpp +++ b/src/ue/mr/task.cpp @@ -112,15 +112,6 @@ void UeMrTask::onLoop() m_rlsEntity->startGnbSearch(); break; } - case NwUeRrcToMr::RRC_PDU_DELIVERY: { - // Append channel information - OctetString stream{}; - stream.appendOctet(static_cast(w->channel)); - stream.append(w->pdu); - - m_rlsEntity->onUplinkDelivery(rls::EPayloadType::RRC, std::move(stream)); - break; - } case NwUeRrcToMr::RRC_CONNECTION_RELEASE: { m_rlsEntity->localReleaseConnection(w->cause); m_rlsEntity->resetEntity(); diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 14e80cee7..1ccc8c524 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -197,14 +197,9 @@ struct NwUeRrcToMr : NtsMessage enum PR { PLMN_SEARCH_REQUEST, - RRC_PDU_DELIVERY, RRC_CONNECTION_RELEASE, } present; - // RRC_PDU_DELIVERY - rrc::RrcChannel channel{}; - OctetString pdu{}; - // RRC_CONNECTION_RELEASE rls::ECause cause{}; From 8f5a14c4638e6a4513a0fcf868acc938bacf3521 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:22:06 +0300 Subject: [PATCH 036/116] SRA dev. --- src/ue/mr/task.cpp | 16 ---------------- src/ue/nts.hpp | 16 ---------------- src/ue/rrc/handler.cpp | 5 ----- src/ue/rrc/task.cpp | 5 ----- src/utils/nts.hpp | 1 - 5 files changed, 43 deletions(-) diff --git a/src/ue/mr/task.cpp b/src/ue/mr/task.cpp index a1fe984ca..1900835d3 100644 --- a/src/ue/mr/task.cpp +++ b/src/ue/mr/task.cpp @@ -104,22 +104,6 @@ void UeMrTask::onLoop() } break; } - case NtsMessageType::UE_RRC_TO_MR: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwUeRrcToMr::PLMN_SEARCH_REQUEST: { - m_rlsEntity->startGnbSearch(); - break; - } - case NwUeRrcToMr::RRC_CONNECTION_RELEASE: { - m_rlsEntity->localReleaseConnection(w->cause); - m_rlsEntity->resetEntity(); - break; - } - } - break; - } case NtsMessageType::UE_APP_TO_MR: { auto *w = dynamic_cast(msg); switch (w->present) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 1ccc8c524..68747b479 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -192,22 +192,6 @@ struct NwUeNasToRrc : NtsMessage } }; -struct NwUeRrcToMr : NtsMessage -{ - enum PR - { - PLMN_SEARCH_REQUEST, - RRC_CONNECTION_RELEASE, - } present; - - // RRC_CONNECTION_RELEASE - rls::ECause cause{}; - - explicit NwUeRrcToMr(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_MR), present(present) - { - } -}; - struct NwUeRrcToSra : NtsMessage { enum PR diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index e44fa314d..050ed8cac 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -129,11 +129,6 @@ void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) { m_logger->debug("RRC Release received"); m_state = ERrcState::RRC_IDLE; - - auto *wr = new NwUeRrcToMr(NwUeRrcToMr::RRC_CONNECTION_RELEASE); - wr->cause = rls::ECause::RRC_NORMAL_RELEASE; - m_base->mrTask->push(wr); - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); } diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index e15e25066..7845bbaa0 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -74,11 +74,6 @@ void UeRrcTask::onLoop() } case NwUeNasToRrc::LOCAL_RELEASE_CONNECTION: { m_state = ERrcState::RRC_IDLE; - - auto *wr = new NwUeRrcToMr(NwUeRrcToMr::RRC_CONNECTION_RELEASE); - wr->cause = rls::ECause::RRC_LOCAL_RELEASE; - m_base->mrTask->push(wr); - m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); break; } diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 85aadc6da..295568033 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -54,7 +54,6 @@ enum class NtsMessageType UE_TUN_TO_APP, UE_RRC_TO_NAS, UE_NAS_TO_RRC, - UE_RRC_TO_MR, UE_RRC_TO_SRA, UE_NAS_TO_NAS, UE_SRA_TO_RRC, From 7b7a22bc2f309bab02250a8ba7ed22fcae6fb52e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:23:24 +0300 Subject: [PATCH 037/116] SRA dev. --- src/ue/mr/task.cpp | 3 +-- src/ue/mr/task.hpp | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ue/mr/task.cpp b/src/ue/mr/task.cpp index 1900835d3..2511ad4c4 100644 --- a/src/ue/mr/task.cpp +++ b/src/ue/mr/task.cpp @@ -15,12 +15,11 @@ static const int TIMER_ID_RLS_WAITING_TIMER = 1; static const int TIMER_ID_RLS_HEARTBEAT = 2; -static const int PLMN_SEARCH_FAILED_PRINT_THRESHOLD = 10000; namespace nr::ue { -ue::UeMrTask::UeMrTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_rlsEntity{}, m_lastPlmnSearchFailurePrinted{} +ue::UeMrTask::UeMrTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_rlsEntity{} { m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "mr"); } diff --git a/src/ue/mr/task.hpp b/src/ue/mr/task.hpp index e5d780831..1cc821a77 100644 --- a/src/ue/mr/task.hpp +++ b/src/ue/mr/task.hpp @@ -30,8 +30,6 @@ class UeMrTask : public NtsTask udp::UdpServerTask *m_udpTask; UeRls *m_rlsEntity; - long m_lastPlmnSearchFailurePrinted; - friend class UeCmdHandler; public: From 88666ef9e4b801ec250b811561a4888feccf0530 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:39:42 +0300 Subject: [PATCH 038/116] SRA dev. --- src/gnb/app/cmd_handler.cpp | 9 +- src/gnb/gnb.cpp | 7 +- src/gnb/gtp/task.cpp | 33 ++-- src/gnb/mr/rls.cpp | 63 -------- src/gnb/mr/rls.hpp | 36 ----- src/gnb/mr/task.cpp | 193 ----------------------- src/gnb/mr/task.hpp | 53 ------- src/gnb/nts.hpp | 105 ------------ src/gnb/rrc/handler.cpp | 6 - src/gnb/rrc/task.cpp | 25 ++- src/gnb/sra/task.hpp | 1 - src/gnb/types.hpp | 2 - src/ue/app/cmd_handler.cpp | 9 +- src/ue/app/task.cpp | 45 +++--- src/ue/mr/rls.cpp | 76 --------- src/ue/mr/rls.hpp | 39 ----- src/ue/mr/task.cpp | 166 ------------------- src/ue/mr/task.hpp | 48 ------ src/ue/nts.hpp | 82 ---------- src/ue/rrc/handler.cpp | 1 - src/ue/rrc/task.cpp | 23 ++- src/ue/types.hpp | 2 - src/ue/ue.cpp | 6 +- src/urs/rls/gnb_entity.cpp | 245 ---------------------------- src/urs/rls/gnb_entity.hpp | 64 -------- src/urs/rls/rls.cpp | 107 ------------- src/urs/rls/rls.hpp | 109 ------------- src/urs/rls/ue_entity.cpp | 307 ------------------------------------ src/urs/rls/ue_entity.hpp | 64 -------- src/utils/nts.hpp | 6 - 30 files changed, 71 insertions(+), 1861 deletions(-) delete mode 100644 src/gnb/mr/rls.cpp delete mode 100644 src/gnb/mr/rls.hpp delete mode 100644 src/gnb/mr/task.cpp delete mode 100644 src/gnb/mr/task.hpp delete mode 100644 src/ue/mr/rls.cpp delete mode 100644 src/ue/mr/rls.hpp delete mode 100644 src/ue/mr/task.cpp delete mode 100644 src/ue/mr/task.hpp delete mode 100644 src/urs/rls/gnb_entity.cpp delete mode 100644 src/urs/rls/gnb_entity.hpp delete mode 100644 src/urs/rls/rls.cpp delete mode 100644 src/urs/rls/rls.hpp delete mode 100644 src/urs/rls/ue_entity.cpp delete mode 100644 src/urs/rls/ue_entity.hpp diff --git a/src/gnb/app/cmd_handler.cpp b/src/gnb/app/cmd_handler.cpp index 995f8576e..edf4ffd3f 100644 --- a/src/gnb/app/cmd_handler.cpp +++ b/src/gnb/app/cmd_handler.cpp @@ -10,9 +10,9 @@ #include #include -#include #include #include +#include #include #include #include @@ -36,7 +36,7 @@ void GnbCmdHandler::sendError(const InetAddress &address, const std::string &out void GnbCmdHandler::pauseTasks() { m_base->gtpTask->requestPause(); - m_base->mrTask->requestPause(); + m_base->sraTask->requestPause(); m_base->ngapTask->requestPause(); m_base->rrcTask->requestPause(); m_base->sctpTask->requestPause(); @@ -45,7 +45,7 @@ void GnbCmdHandler::pauseTasks() void GnbCmdHandler::unpauseTasks() { m_base->gtpTask->requestUnpause(); - m_base->mrTask->requestUnpause(); + m_base->sraTask->requestUnpause(); m_base->ngapTask->requestUnpause(); m_base->rrcTask->requestUnpause(); m_base->sctpTask->requestUnpause(); @@ -55,7 +55,7 @@ bool GnbCmdHandler::isAllPaused() { if (!m_base->gtpTask->isPauseConfirmed()) return false; - if (!m_base->mrTask->isPauseConfirmed()) + if (!m_base->sraTask->isPauseConfirmed()) return false; if (!m_base->ngapTask->isPauseConfirmed()) return false; @@ -131,7 +131,6 @@ void GnbCmdHandler::handleCmdImpl(NwGnbCliCommand &msg) for (auto &ue : m_base->ngapTask->m_ueCtx) { json.push(Json::Obj({ - {"ue-name", m_base->mrTask->m_ueMap[ue.first].name}, {"ran-ngap-id", ue.second->ranUeNgapId}, {"amf-ngap-id", ue.second->amfUeNgapId}, })); diff --git a/src/gnb/gnb.cpp b/src/gnb/gnb.cpp index 1ede5efac..119f5487b 100644 --- a/src/gnb/gnb.cpp +++ b/src/gnb/gnb.cpp @@ -9,14 +9,13 @@ #include "gnb.hpp" #include "app/task.hpp" #include "gtp/task.hpp" -#include "mr/task.hpp" +#include "sra/task.hpp" #include "ngap/task.hpp" #include "rrc/task.hpp" #include "sra/task.hpp" #include "sctp/task.hpp" #include -#include namespace nr::gnb { @@ -34,7 +33,6 @@ GNodeB::GNodeB(GnbConfig *config, app::INodeListener *nodeListener, NtsTask *cli base->ngapTask = new NgapTask(base); base->rrcTask = new GnbRrcTask(base); base->gtpTask = new GtpTask(base); - base->mrTask = new GnbMrTask(base); base->sraTask = new GnbSraTask(base); taskBase = base; @@ -47,7 +45,6 @@ GNodeB::~GNodeB() taskBase->ngapTask->quit(); taskBase->rrcTask->quit(); taskBase->gtpTask->quit(); - taskBase->mrTask->quit(); taskBase->sraTask->quit(); delete taskBase->appTask; @@ -55,7 +52,6 @@ GNodeB::~GNodeB() delete taskBase->ngapTask; delete taskBase->rrcTask; delete taskBase->gtpTask; - delete taskBase->mrTask; delete taskBase->sraTask; delete taskBase->logBase; @@ -70,7 +66,6 @@ void GNodeB::start() taskBase->ngapTask->start(); taskBase->rrcTask->start(); taskBase->sraTask->start(); - taskBase->mrTask->start(); taskBase->gtpTask->start(); } diff --git a/src/gnb/gtp/task.cpp b/src/gnb/gtp/task.cpp index e6557e3d0..ae394ede6 100644 --- a/src/gnb/gtp/task.cpp +++ b/src/gnb/gtp/task.cpp @@ -10,7 +10,6 @@ #include #include -#include #include #include @@ -76,17 +75,17 @@ void GtpTask::onLoop() } break; } - case NtsMessageType::GNB_MR_TO_GTP: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwGnbMrToGtp::UPLINK_DELIVERY: { - handleUplinkData(w->ueId, w->pduSessionId, std::move(w->data)); - break; - } - } - break; - } + //case NtsMessageType::GNB_MR_TO_GTP: { + // auto *w = dynamic_cast(msg); + // switch (w->present) + // { + // case NwGnbMrToGtp::UPLINK_DELIVERY: { + // handleUplinkData(w->ueId, w->pduSessionId, std::move(w->data)); + // break; + // } + // } + // break; + //} case NtsMessageType::UDP_SERVER_RECEIVE: handleUdpReceive(*dynamic_cast(msg)); break; @@ -239,11 +238,11 @@ void GtpTask::handleUdpReceive(const udp::NwUdpServerReceive &msg) if (m_rateLimiter->allowDownlinkPacket(sessionInd, gtp->payload.length())) { - auto *w = new NwGnbGtpToMr(NwGnbGtpToMr::DATA_PDU_DELIVERY); - w->ueId = GetUeId(sessionInd); - w->pduSessionId = GetPsi(sessionInd); - w->data = std::move(gtp->payload); - m_base->mrTask->push(w); + //auto *w = new NwGnbGtpToMr(NwGnbGtpToMr::DATA_PDU_DELIVERY); + //w->ueId = GetUeId(sessionInd); + //w->pduSessionId = GetPsi(sessionInd); + //w->data = std::move(gtp->payload); + //m_base->mrTask->push(w); } delete gtp; diff --git a/src/gnb/mr/rls.cpp b/src/gnb/mr/rls.cpp deleted file mode 100644 index 36aa37aa4..000000000 --- a/src/gnb/mr/rls.cpp +++ /dev/null @@ -1,63 +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 "rls.hpp" -#include - -namespace nr::gnb -{ - -GnbRls::GnbRls(std::string nodeName, std::unique_ptr logger, NtsTask *targetTask) - : RlsGnbEntity(std::move(nodeName)), m_logger(std::move(logger)), m_targetTask(targetTask) -{ -} - -void GnbRls::logWarn(const std::string &msg) -{ - m_logger->warn(msg); -} - -void GnbRls::logError(const std::string &msg) -{ - m_logger->err(msg); -} - -void GnbRls::onUeConnected(int ue, std::string name) -{ - auto *w = new NwGnbMrToMr(NwGnbMrToMr::UE_CONNECTED); - w->ue = ue; - w->name = std::move(name); - m_targetTask->push(w); -} - -void GnbRls::onUeReleased(int ue, rls::ECause cause) -{ - auto *w = new NwGnbMrToMr(NwGnbMrToMr::UE_RELEASED); - w->ue = ue; - w->cause = cause; - m_targetTask->push(w); -} - -void GnbRls::deliverUplinkPayload(int ue, rls::EPayloadType type, OctetString &&payload) -{ - auto *w = new NwGnbMrToMr(NwGnbMrToMr::RECEIVE_OVER_UDP); - w->ue = ue; - w->type = type; - w->pdu = std::move(payload); - m_targetTask->push(w); -} - -void GnbRls::sendRlsPdu(const InetAddress &address, OctetString &&pdu) -{ - auto *w = new NwGnbMrToMr(NwGnbMrToMr::SEND_OVER_UDP); - w->address = address; - w->pdu = std::move(pdu); - m_targetTask->push(w); -} - -} // namespace nr::gnb diff --git a/src/gnb/mr/rls.hpp b/src/gnb/mr/rls.hpp deleted file mode 100644 index 823d3451c..000000000 --- a/src/gnb/mr/rls.hpp +++ /dev/null @@ -1,36 +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. -// - -#pragma once - -#include -#include -#include - -namespace nr::gnb -{ - -class GnbRls : public rls::RlsGnbEntity -{ - private: - std::unique_ptr m_logger; - NtsTask *m_targetTask; - - public: - explicit GnbRls(std::string nodeName, std::unique_ptr logger, NtsTask *targetTask); - - protected: - void logWarn(const std::string &msg) override; - void logError(const std::string &msg) override; - void onUeConnected(int ue, std::string name) override; - void onUeReleased(int ue, rls::ECause cause) override; - void sendRlsPdu(const InetAddress &address, OctetString &&pdu) override; - void deliverUplinkPayload(int ue, rls::EPayloadType type, OctetString &&payload) override; -}; - -} // namespace nr::gnb diff --git a/src/gnb/mr/task.cpp b/src/gnb/mr/task.cpp deleted file mode 100644 index 385f1da59..000000000 --- a/src/gnb/mr/task.cpp +++ /dev/null @@ -1,193 +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 "rls.hpp" -#include -#include -#include -#include -#include - -static const int TIMER_ID_RLS_HEARTBEAT = 1; - -namespace nr::gnb -{ - -GnbMrTask::GnbMrTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_rlsEntity{}, m_ueMap{} -{ - m_logger = m_base->logBase->makeUniqueLogger("mr"); -} - -void GnbMrTask::onStart() -{ - m_rlsEntity = new GnbRls(m_base->config->name, m_base->logBase->makeUniqueLogger("rls"), this); - - try - { - m_udpTask = new udp::UdpServerTask(m_base->config->portalIp, cons::PortalPort, this); - m_udpTask->start(); - } - catch (const LibError &e) - { - m_logger->err("MR failure [%s]", e.what()); - quit(); - return; - } - - setTimer(TIMER_ID_RLS_HEARTBEAT, rls::Constants::HB_PERIOD_UE_TO_GNB); -} - -void GnbMrTask::onLoop() -{ - NtsMessage *msg = take(); - if (!msg) - return; - - switch (msg->msgType) - { - case NtsMessageType::GNB_MR_TO_MR: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwGnbMrToMr::UE_CONNECTED: { - onUeConnected(w->ue, w->name); - break; - } - case NwGnbMrToMr::UE_RELEASED: { - onUeReleased(w->ue, w->cause); - break; - } - case NwGnbMrToMr::SEND_OVER_UDP: { - m_udpTask->send(w->address, w->pdu); - break; - } - case NwGnbMrToMr::RECEIVE_OVER_UDP: { - receiveUplinkPayload(w->ue, w->type, std::move(w->pdu)); - break; - } - } - break; - } - case NtsMessageType::GNB_GTP_TO_MR: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwGnbGtpToMr::DATA_PDU_DELIVERY: { - OctetString stream{}; - stream.appendOctet4(static_cast(w->pduSessionId)); - stream.append(w->data); - - m_rlsEntity->downlinkPayloadDelivery(w->ueId, rls::EPayloadType::DATA, std::move(stream)); - break; - } - } - break; - } - case NtsMessageType::GNB_RRC_TO_MR: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwGnbRrcToMr::RRC_PDU_DELIVERY: { - OctetString stream{}; - stream.appendOctet(static_cast(w->channel)); - stream.append(w->pdu); - - m_rlsEntity->downlinkPayloadDelivery(w->ueId, rls::EPayloadType::RRC, std::move(stream)); - break; - } - case NwGnbRrcToMr::NGAP_LAYER_INITIALIZED: { - m_rlsEntity->setAcceptConnections(true); - break; - } - case NwGnbRrcToMr::AN_RELEASE: { - m_rlsEntity->localReleaseConnection(w->ueId, rls::ECause::RRC_NORMAL_RELEASE); - break; - } - } - break; - } - case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); - if (w->timerId == TIMER_ID_RLS_HEARTBEAT) - { - setTimer(TIMER_ID_RLS_HEARTBEAT, rls::Constants::HB_PERIOD_GNB_TO_UE); - m_rlsEntity->onHeartbeat(); - } - break; - } - case NtsMessageType::UDP_SERVER_RECEIVE: { - auto *w = dynamic_cast(msg); - m_rlsEntity->onReceive(w->fromAddress, w->packet); - break; - } - default: - m_logger->unhandledNts(msg); - break; - } - - delete msg; -} - -void GnbMrTask::onQuit() -{ - delete m_rlsEntity; - - if (m_udpTask != nullptr) - m_udpTask->quit(); - delete m_udpTask; -} - -void GnbMrTask::onUeConnected(int ue, const std::string &name) -{ - m_ueMap[ue] = {}; - m_ueMap[ue].ueId = ue; - m_ueMap[ue].name = name; - - m_logger->info("New UE connected to gNB. Total number of UEs [%d]", m_ueMap.size()); -} - -void GnbMrTask::onUeReleased(int ue, rls::ECause cause) -{ - if (rls::IsRlf(cause)) - { - m_logger->err("Radio link failure for UE[%d] with cause[%s]", ue, rls::CauseToString(cause)); - - auto *w = new NwGnbMrToRrc(NwGnbMrToRrc::RADIO_LINK_FAILURE); - w->ueId = ue; - m_base->rrcTask->push(w); - } - - m_ueMap.erase(ue); - m_logger->info("A UE disconnected from gNB. Total number of UEs [%d]", m_ueMap.size()); -} - -void GnbMrTask::receiveUplinkPayload(int ue, rls::EPayloadType type, OctetString &&payload) -{ - if (type == rls::EPayloadType::RRC) - { - //auto *nw = new NwGnbMrToRrc(NwGnbMrToRrc::RRC_PDU_DELIVERY); - //nw->ueId = ue; - //nw->channel = static_cast(payload.getI(0)); - //nw->pdu = payload.subCopy(1); - //m_base->rrcTask->push(nw); - } - else if (type == rls::EPayloadType::DATA) - { - int psi = payload.get4I(0); - OctetString dataPayload = payload.subCopy(4); - - auto *w = new NwGnbMrToGtp(NwGnbMrToGtp::UPLINK_DELIVERY); - w->ueId = ue; - w->pduSessionId = psi; - w->data = std::move(dataPayload); - m_base->gtpTask->push(w); - } -} - -} // namespace nr::gnb diff --git a/src/gnb/mr/task.hpp b/src/gnb/mr/task.hpp deleted file mode 100644 index 184fcef86..000000000 --- a/src/gnb/mr/task.hpp +++ /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. -// - -#pragma once - -#include "rls.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace nr::gnb -{ - -class GnbMrTask : public NtsTask -{ - private: - TaskBase *m_base; - std::unique_ptr m_logger; - - udp::UdpServerTask *m_udpTask; - GnbRls *m_rlsEntity; - std::unordered_map m_ueMap; - - friend class GnbCmdHandler; - - public: - explicit GnbMrTask(TaskBase *base); - ~GnbMrTask() override = default; - - protected: - void onStart() override; - void onLoop() override; - void onQuit() override; - - private: - void onUeConnected(int ue, const std::string &name); - void onUeReleased(int ue, rls::ECause cause); - void receiveUplinkPayload(int ue, rls::EPayloadType type, OctetString &&payload); -}; - -} // namespace nr::gnb \ No newline at end of file diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index fdac242f4..077edcbbd 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -24,21 +23,6 @@ namespace nr::gnb { -struct NwGnbMrToRrc : NtsMessage -{ - enum PR - { - RADIO_LINK_FAILURE, - } present; - - // RADIO_LINK_FAILURE - int ueId{}; - - explicit NwGnbMrToRrc(PR present) : NtsMessage(NtsMessageType::GNB_MR_TO_RRC), present(present) - { - } -}; - struct NwGnbSraToRrc : NtsMessage { enum PR @@ -58,28 +42,6 @@ struct NwGnbSraToRrc : NtsMessage } }; -struct NwGnbRrcToMr : NtsMessage -{ - enum PR - { - NGAP_LAYER_INITIALIZED, - RRC_PDU_DELIVERY, - AN_RELEASE, - } present; - - // RRC_PDU_DELIVERY - // AN_RELEASE - int ueId{}; - - // RRC_PDU_DELIVERY - rrc::RrcChannel channel{}; - OctetString pdu{}; - - explicit NwGnbRrcToMr(PR present) : NtsMessage(NtsMessageType::GNB_RRC_TO_MR), present(present) - { - } -}; - struct NwGnbRrcToSra : NtsMessage { enum PR @@ -172,73 +134,6 @@ struct NwGnbNgapToGtp : NtsMessage } }; -struct NwGnbMrToGtp : NtsMessage -{ - enum PR - { - UPLINK_DELIVERY, - } present; - - // UPLINK_DELIVERY - int ueId{}; - int pduSessionId{}; - OctetString data{}; - - explicit NwGnbMrToGtp(PR present) : NtsMessage(NtsMessageType::GNB_MR_TO_GTP), present(present) - { - } -}; - -struct NwGnbGtpToMr : NtsMessage -{ - enum PR - { - DATA_PDU_DELIVERY, - } present; - - // DATA_PDU_DELIVERY - int ueId{}; - int pduSessionId{}; - OctetString data{}; - - explicit NwGnbGtpToMr(PR present) : NtsMessage(NtsMessageType::GNB_GTP_TO_MR), present(present) - { - } -}; - -struct NwGnbMrToMr : NtsMessage -{ - enum PR - { - UE_CONNECTED, - UE_RELEASED, - SEND_OVER_UDP, - RECEIVE_OVER_UDP, - } present; - - // UE_CONNECTED - // UE_RELEASED - // RECEIVE_OVER_UDP - int ue{}; - - // UE_CONNECTED - std::string name{}; - - // UE_RELEASED - rls::ECause cause{}; - - // SEND_OVER_RLS - InetAddress address{}; - OctetString pdu{}; - - // RECEIVE_OVER_UDP - rls::EPayloadType type{}; - - explicit NwGnbMrToMr(PR present) : NtsMessage(NtsMessageType::GNB_MR_TO_MR), present(present) - { - } -}; - struct NwGnbSctp : NtsMessage { enum PR diff --git a/src/gnb/rrc/handler.cpp b/src/gnb/rrc/handler.cpp index 3e921ea42..1dd50204d 100644 --- a/src/gnb/rrc/handler.cpp +++ b/src/gnb/rrc/handler.cpp @@ -8,7 +8,6 @@ #include "task.hpp" -#include #include #include @@ -155,11 +154,6 @@ void GnbRrcTask::releaseConnection(int ueId) sendRrcMessage(ueId, pdu); - // Notify MR task - auto *w = new NwGnbRrcToMr(NwGnbRrcToMr::AN_RELEASE); - w->ueId = ueId; - m_base->mrTask->push(w); - // Delete UE RRC context m_ueCtx.erase(ueId); } diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index 7ddba577d..3367cb301 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -9,7 +9,6 @@ #include "task.hpp" #include #include -#include #include #include @@ -38,17 +37,17 @@ void GnbRrcTask::onLoop() switch (msg->msgType) { - case NtsMessageType::GNB_MR_TO_RRC: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwGnbMrToRrc::RADIO_LINK_FAILURE: { - handleRadioLinkFailure(w->ueId); - break; - } - } - break; - } + //case NtsMessageType::GNB_MR_TO_RRC: { + // auto *w = dynamic_cast(msg); + // switch (w->present) + // { + // case NwGnbMrToRrc::RADIO_LINK_FAILURE: { + // handleRadioLinkFailure(w->ueId); + // break; + // } + // } + // break; + //} case NtsMessageType::GNB_SRA_TO_RRC: { auto *w = dynamic_cast(msg); switch (w->present) @@ -65,7 +64,7 @@ void GnbRrcTask::onLoop() switch (w->present) { case NwGnbNgapToRrc::NGAP_LAYER_INITIALIZED: { - m_base->mrTask->push(new NwGnbRrcToMr(NwGnbRrcToMr::NGAP_LAYER_INITIALIZED)); + //m_base->mrTask->push(new NwGnbRrcToMr(NwGnbRrcToMr::NGAP_LAYER_INITIALIZED)); break; } case NwGnbNgapToRrc::NAS_DELIVERY: { diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index 1e0c6bce3..c56c214c8 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include diff --git a/src/gnb/types.hpp b/src/gnb/types.hpp index e9fc0b8a5..95c4bca23 100644 --- a/src/gnb/types.hpp +++ b/src/gnb/types.hpp @@ -24,7 +24,6 @@ namespace nr::gnb class GnbAppTask; class GtpTask; -class GnbMrTask; class NgapTask; class GnbRrcTask; class GnbSraTask; @@ -335,7 +334,6 @@ struct TaskBase GnbAppTask *appTask{}; GtpTask *gtpTask{}; - GnbMrTask *mrTask{}; NgapTask *ngapTask{}; GnbRrcTask *rrcTask{}; SctpTask *sctpTask{}; diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 02a299dce..72ab28935 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -9,7 +9,6 @@ #include "cmd_handler.hpp" #include -#include #include #include #include @@ -46,26 +45,26 @@ void UeCmdHandler::sendError(const InetAddress &address, const std::string &outp void UeCmdHandler::pauseTasks() { - m_base->mrTask->requestPause(); m_base->nasTask->requestPause(); m_base->rrcTask->requestPause(); + m_base->sraTask->requestPause(); } void UeCmdHandler::unpauseTasks() { - m_base->mrTask->requestUnpause(); m_base->nasTask->requestUnpause(); m_base->rrcTask->requestUnpause(); + m_base->sraTask->requestUnpause(); } bool UeCmdHandler::isAllPaused() { - if (!m_base->mrTask->isPauseConfirmed()) - return false; if (!m_base->nasTask->isPauseConfirmed()) return false; if (!m_base->rrcTask->isPauseConfirmed()) return false; + if (!m_base->sraTask->isPauseConfirmed()) + return false; return true; } diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index 22a7c339f..dde869e95 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -9,7 +9,6 @@ #include "task.hpp" #include "cmd_handler.hpp" #include -#include #include #include #include @@ -50,33 +49,33 @@ void UeAppTask::onLoop() switch (msg->msgType) { - case NtsMessageType::UE_MR_TO_APP: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwUeMrToApp::DATA_PDU_DELIVERY: { - auto *tunTask = m_tunTasks[w->psi]; - if (tunTask) - { - auto *nw = new NwAppToTun(NwAppToTun::DATA_PDU_DELIVERY); - nw->psi = w->psi; - nw->data = std::move(w->data); - tunTask->push(nw); - } - break; - } - } - break; - } + //case NtsMessageType::UE_MR_TO_APP: { + // auto *w = dynamic_cast(msg); + // switch (w->present) + // { + // case NwUeMrToApp::DATA_PDU_DELIVERY: { + // auto *tunTask = m_tunTasks[w->psi]; + // if (tunTask) + // { + // auto *nw = new NwAppToTun(NwAppToTun::DATA_PDU_DELIVERY); + // nw->psi = w->psi; + // nw->data = std::move(w->data); + // tunTask->push(nw); + // } + // break; + // } + // } + // break; + //} case NtsMessageType::UE_TUN_TO_APP: { auto *w = dynamic_cast(msg); switch (w->present) { case NwUeTunToApp::DATA_PDU_DELIVERY: { - auto *nw = new NwAppToMr(NwAppToMr::DATA_PDU_DELIVERY); - nw->psi = w->psi; - nw->data = std::move(w->data); - m_base->mrTask->push(nw); + //auto *nw = new NwAppToMr(NwAppToMr::DATA_PDU_DELIVERY); + //nw->psi = w->psi; + //nw->data = std::move(w->data); + //m_base->mrTask->push(nw); break; } case NwUeTunToApp::TUN_ERROR: { diff --git a/src/ue/mr/rls.cpp b/src/ue/mr/rls.cpp deleted file mode 100644 index 69682859e..000000000 --- a/src/ue/mr/rls.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 "rls.hpp" -#include -#include - -namespace nr::ue -{ - -UeRls::UeRls(const std::string &nodeName, const std::vector &gnbSearchList, std::unique_ptr logger, - NtsTask *targetTask) - : RlsUeEntity(nodeName, gnbSearchList), m_logger(std::move(logger)), m_targetTask(targetTask) -{ -} - -void UeRls::logWarn(const std::string &msg) -{ - m_logger->warn(msg); -} - -void UeRls::logError(const std::string &msg) -{ - m_logger->err(msg); -} - -void UeRls::startWaitingTimer(int period) -{ - auto *w = new NwUeMrToMr(NwUeMrToMr::RLS_START_WAITING_TIMER); - w->period = period; - m_targetTask->push(w); -} - -void UeRls::searchFailure(rls::ECause cause) -{ - auto *w = new NwUeMrToMr(NwUeMrToMr::RLS_SEARCH_FAILURE); - w->cause = cause; - m_targetTask->push(w); -} - -void UeRls::onRelease(rls::ECause cause) -{ - auto *w = new NwUeMrToMr(NwUeMrToMr::RLS_RELEASED); - w->cause = cause; - m_targetTask->push(w); -} - -void UeRls::onConnect(const std::string &gnbName) -{ - auto *w = new NwUeMrToMr(NwUeMrToMr::RLS_CONNECTED); - w->gnbName = gnbName; - m_targetTask->push(w); -} - -void UeRls::sendRlsPdu(const InetAddress &address, OctetString &&pdu) -{ - auto *w = new NwUeMrToMr(NwUeMrToMr::RLS_SEND_OVER_UDP); - w->address = address; - w->pdu = std::move(pdu); - m_targetTask->push(w); -} - -void UeRls::deliverPayload(rls::EPayloadType type, OctetString &&payload) -{ - auto *w = new NwUeMrToMr(NwUeMrToMr::RLS_RECEIVE_OVER_UDP); - w->type = type; - w->pdu = std::move(payload); - m_targetTask->push(w); -} - -} // namespace nr::ue diff --git a/src/ue/mr/rls.hpp b/src/ue/mr/rls.hpp deleted file mode 100644 index 3ba47016e..000000000 --- a/src/ue/mr/rls.hpp +++ /dev/null @@ -1,39 +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. -// - -#pragma once - -#include -#include -#include - -namespace nr::ue -{ - -class UeRls : public rls::RlsUeEntity -{ - private: - std::unique_ptr m_logger; - NtsTask *m_targetTask; - - public: - UeRls(const std::string &nodeName, const std::vector &gnbSearchList, std::unique_ptr logger, - NtsTask *targetTask); - - protected: - void logWarn(const std::string &msg) override; - void logError(const std::string &msg) override; - void startWaitingTimer(int period) override; - void searchFailure(rls::ECause cause) override; - void onRelease(rls::ECause cause) override; - void onConnect(const std::string &gnbName) override; - void sendRlsPdu(const InetAddress &address, OctetString &&pdu) override; - void deliverPayload(rls::EPayloadType type, OctetString &&payload) override; -}; - -} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/mr/task.cpp b/src/ue/mr/task.cpp deleted file mode 100644 index 2511ad4c4..000000000 --- a/src/ue/mr/task.cpp +++ /dev/null @@ -1,166 +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 -#include - -static const int TIMER_ID_RLS_WAITING_TIMER = 1; -static const int TIMER_ID_RLS_HEARTBEAT = 2; - -namespace nr::ue -{ - -ue::UeMrTask::UeMrTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_rlsEntity{} -{ - m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "mr"); -} - -void UeMrTask::onStart() -{ - m_udpTask = new udp::UdpServerTask(this); - - std::vector gnbSearchList{}; - for (auto &ip : m_base->config->gnbSearchList) - gnbSearchList.emplace_back(ip, cons::PortalPort); - - m_rlsEntity = new UeRls(m_base->config->getNodeName(), gnbSearchList, - m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "rls"), this); - - m_udpTask->start(); - - setTimer(TIMER_ID_RLS_HEARTBEAT, rls::Constants::HB_PERIOD_UE_TO_GNB); -} - -void UeMrTask::onQuit() -{ - delete m_rlsEntity; - - m_udpTask->quit(); - delete m_udpTask; -} - -void UeMrTask::onLoop() -{ - NtsMessage *msg = take(); - if (!msg) - return; - - switch (msg->msgType) - { - case NtsMessageType::UE_MR_TO_MR: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwUeMrToMr::RLS_CONNECTED: { - //auto tw = new NwUeMrToRrc(NwUeMrToRrc::PLMN_SEARCH_RESPONSE); - //tw->gnbName = std::move(w->gnbName); - //m_base->rrcTask->push(tw); - break; - } - case NwUeMrToMr::RLS_RELEASED: { - if (rls::IsRlf(w->cause)) - { - m_logger->err("Radio link failure with cause[%s]", rls::CauseToString(w->cause)); - m_base->rrcTask->push(new NwUeMrToRrc(NwUeMrToRrc::RADIO_LINK_FAILURE)); - } - else - { - m_logger->debug("UE disconnected from gNB [%s]", rls::CauseToString(w->cause)); - } - break; - } - case NwUeMrToMr::RLS_SEARCH_FAILURE: { - //long current = utils::CurrentTimeMillis(); - //if (current - m_lastPlmnSearchFailurePrinted > PLMN_SEARCH_FAILED_PRINT_THRESHOLD) - //{ - // m_logger->err("PLMN search failed [%s]", rls::CauseToString(w->cause)); - // m_lastPlmnSearchFailurePrinted = current; - // m_base->rrcTask->push(new NwUeMrToRrc(NwUeMrToRrc::PLMN_SEARCH_FAILURE)); - //} - break; - } - case NwUeMrToMr::RLS_START_WAITING_TIMER: { - setTimer(TIMER_ID_RLS_WAITING_TIMER, w->period); - break; - } - case NwUeMrToMr::RLS_SEND_OVER_UDP: { - m_udpTask->send(w->address, w->pdu); - break; - } - case NwUeMrToMr::RLS_RECEIVE_OVER_UDP: { - receiveDownlinkPayload(w->type, std::move(w->pdu)); - break; - } - } - break; - } - case NtsMessageType::UE_APP_TO_MR: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwAppToMr::DATA_PDU_DELIVERY: { - // Append PDU session information - OctetString stream{}; - stream.appendOctet4(w->psi); - stream.append(w->data); - - m_rlsEntity->onUplinkDelivery(rls::EPayloadType::DATA, std::move(stream)); - break; - } - } - break; - } - case NtsMessageType::TIMER_EXPIRED: { - auto *w = dynamic_cast(msg); - if (w->timerId == TIMER_ID_RLS_WAITING_TIMER) - { - m_rlsEntity->onWaitingTimerExpire(); - } - else if (w->timerId == TIMER_ID_RLS_HEARTBEAT) - { - setTimer(TIMER_ID_RLS_HEARTBEAT, rls::Constants::HB_PERIOD_UE_TO_GNB); - m_rlsEntity->onHeartbeat(); - } - break; - } - case NtsMessageType::UDP_SERVER_RECEIVE: { - auto *w = dynamic_cast(msg); - m_rlsEntity->onReceive(w->fromAddress, w->packet); - break; - } - default: - m_logger->unhandledNts(msg); - break; - } - - delete msg; -} - -void UeMrTask::receiveDownlinkPayload(rls::EPayloadType type, OctetString &&payload) -{ - if (type == rls::EPayloadType::RRC) - { - //auto *nw = new NwUeMrToRrc(NwUeMrToRrc::RRC_PDU_DELIVERY); - //nw->channel = static_cast(payload.getI(0)); - //nw->pdu = payload.subCopy(1); - //m_base->rrcTask->push(nw); - } - else if (type == rls::EPayloadType::DATA) - { - auto *nw = new NwUeMrToApp(NwUeMrToApp::DATA_PDU_DELIVERY); - nw->psi = payload.get4I(0); - nw->data = payload.subCopy(4); - m_base->appTask->push(nw); - } -} - -} // namespace nr::ue diff --git a/src/ue/mr/task.hpp b/src/ue/mr/task.hpp deleted file mode 100644 index 1cc821a77..000000000 --- a/src/ue/mr/task.hpp +++ /dev/null @@ -1,48 +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. -// - -#pragma once - -#include "rls.hpp" -#include -#include -#include -#include -#include -#include -#include -#include - -namespace nr::ue -{ - -class UeMrTask : public NtsTask -{ - private: - TaskBase *m_base; - std::unique_ptr m_logger; - - udp::UdpServerTask *m_udpTask; - UeRls *m_rlsEntity; - - friend class UeCmdHandler; - - public: - explicit UeMrTask(TaskBase *base); - ~UeMrTask() override = default; - - protected: - void onStart() override; - void onLoop() override; - void onQuit() override; - - private: - void receiveDownlinkPayload(rls::EPayloadType type, OctetString &&payload); -}; - -} // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 68747b479..48fddaffe 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -22,87 +21,6 @@ namespace nr::ue { -struct NwUeMrToMr : NtsMessage -{ - enum PR - { - RLS_CONNECTED, - RLS_RELEASED, - RLS_SEARCH_FAILURE, - RLS_START_WAITING_TIMER, - RLS_SEND_OVER_UDP, - RLS_RECEIVE_OVER_UDP - } present; - - // RLS_CONNECTED - std::string gnbName{}; - - // RLS_RELEASED - // RLS_SEARCH_FAILURE - rls::ECause cause{}; - - // RLS_START_WAITING_TIMER - int period{}; - - // RLS_SEND_OVER_UDP - InetAddress address{}; - - // RLS_RECEIVE_OVER_UDP - rls::EPayloadType type{}; - - // RLS_SEND_OVER_UDP - // RLS_RECEIVE_OVER_UDP - OctetString pdu{}; - - explicit NwUeMrToMr(PR present) : NtsMessage(NtsMessageType::UE_MR_TO_MR), present(present) - { - } -}; - -struct NwUeMrToRrc : NtsMessage -{ - enum PR - { - RADIO_LINK_FAILURE - } present; - - explicit NwUeMrToRrc(PR present) : NtsMessage(NtsMessageType::UE_MR_TO_RRC), present(present) - { - } -}; - -struct NwUeMrToApp : NtsMessage -{ - enum PR - { - DATA_PDU_DELIVERY - } present; - - // DATA_PDU_DELIVERY - int psi{}; - OctetString data{}; - - explicit NwUeMrToApp(PR present) : NtsMessage(NtsMessageType::UE_MR_TO_APP), present(present) - { - } -}; - -struct NwAppToMr : NtsMessage -{ - enum PR - { - DATA_PDU_DELIVERY - } present; - - // DATA_PDU_DELIVERY - int psi{}; - OctetString data{}; - - explicit NwAppToMr(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_MR), present(present) - { - } -}; - struct NwAppToTun : NtsMessage { enum PR diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index 050ed8cac..a73a37142 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -9,7 +9,6 @@ #include "task.hpp" #include #include -#include #include #include #include diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index 7845bbaa0..a59f2e916 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -45,17 +44,17 @@ void UeRrcTask::onLoop() switch (msg->msgType) { - case NtsMessageType::UE_MR_TO_RRC: { - auto *w = dynamic_cast(msg); - switch (w->present) - { - case NwUeMrToRrc::RADIO_LINK_FAILURE: { - handleRadioLinkFailure(); - break; - } - } - break; - } + //case NtsMessageType::UE_MR_TO_RRC: { + // auto *w = dynamic_cast(msg); + // switch (w->present) + // { + // case NwUeMrToRrc::RADIO_LINK_FAILURE: { + // handleRadioLinkFailure(); + // break; + // } + // } + // break; + //} case NtsMessageType::UE_NAS_TO_RRC: { auto *w = dynamic_cast(msg); switch (w->present) diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 79b5a11b5..92d52406d 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -24,7 +24,6 @@ namespace nr::ue { class UeAppTask; -class UeMrTask; class NasTask; class UeRrcTask; class UeSraTask; @@ -123,7 +122,6 @@ struct TaskBase NtsTask *cliCallbackTask{}; UeAppTask *appTask{}; - UeMrTask *mrTask{}; NasTask *nasTask{}; UeRrcTask *rrcTask{}; UeSraTask *sraTask{}; diff --git a/src/ue/ue.cpp b/src/ue/ue.cpp index 715e4a8e7..3115ce385 100644 --- a/src/ue/ue.cpp +++ b/src/ue/ue.cpp @@ -9,7 +9,7 @@ #include "ue.hpp" #include "app/task.hpp" -#include "mr/task.hpp" +#include "sra/task.hpp" #include "nas/task.hpp" #include "rrc/task.hpp" #include "sra/task.hpp" @@ -30,7 +30,6 @@ UserEquipment::UserEquipment(UeConfig *config, app::IUeController *ueController, base->nasTask = new NasTask(base); base->rrcTask = new UeRrcTask(base); - base->mrTask = new UeMrTask(base); base->appTask = new UeAppTask(base); base->sraTask = new UeSraTask(base); @@ -41,13 +40,11 @@ UserEquipment::~UserEquipment() { taskBase->nasTask->quit(); taskBase->rrcTask->quit(); - taskBase->mrTask->quit(); taskBase->sraTask->quit(); taskBase->appTask->quit(); delete taskBase->nasTask; delete taskBase->rrcTask; - delete taskBase->mrTask; delete taskBase->sraTask; delete taskBase->appTask; @@ -60,7 +57,6 @@ void UserEquipment::start() { taskBase->nasTask->start(); taskBase->rrcTask->start(); - taskBase->mrTask->start(); taskBase->sraTask->start(); taskBase->appTask->start(); } diff --git a/src/urs/rls/gnb_entity.cpp b/src/urs/rls/gnb_entity.cpp deleted file mode 100644 index 85a125ae3..000000000 --- a/src/urs/rls/gnb_entity.cpp +++ /dev/null @@ -1,245 +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 "gnb_entity.hpp" - -#include -#include - -static const octet3 AppVersion = octet3{cons::Major, cons::Minor, cons::Patch}; - -namespace rls -{ - -RlsGnbEntity::RlsGnbEntity(std::string nodeName) - : nodeName(std::move(nodeName)), token(utils::Random64()), ueIdMap(), idUeMap(), ueAddressMap(), heartbeatMap(), - setupCompleteWaiting(), acceptConnections() -{ -} - -void RlsGnbEntity::onHeartbeat() -{ - uint64_t current = utils::CurrentTimeMillis(); - - std::vector uesToRemove{}; - - for (auto &v : heartbeatMap) - { - if (current - v.second > Constants::HB_TIMEOUT_UE_TO_GNB) - uesToRemove.push_back(v.first); - else - sendHeartbeat(v.first); - } - - for (int ue : uesToRemove) - removeUe(ue, ECause::HEARTBEAT_TIMEOUT); -} - -void RlsGnbEntity::downlinkPayloadDelivery(int ue, EPayloadType type, OctetString &&payload) -{ - if (!idUeMap.count(ue)) - { - logWarn("UE connection released or not established"); - return; - } - - RlsMessage m; - m.msgCls = EMessageClass::NORMAL_MESSAGE; - m.msgType = EMessageType::RLS_PAYLOAD_TRANSPORT; - m.appVersion = AppVersion; - m.ueToken = idUeMap[ue]; - m.gnbToken = token; - m.payloadType = type; - m.payload = std::move(payload); - sendRlsMessage(ue, m); -} - -void RlsGnbEntity::setAcceptConnections(bool accept) -{ - acceptConnections = accept; -} - -void RlsGnbEntity::releaseConnection(int ue, ECause cause) -{ - sendReleaseIndication(ue, cause); - removeUe(ue, cause); -} - -void RlsGnbEntity::localReleaseConnection(int ue, ECause cause) -{ - removeUe(ue, cause); -} - -void RlsGnbEntity::sendRlsMessage(int ue, const RlsMessage &msg) -{ - OctetString buf{}; - if (!Encode(msg, buf)) - { - logError("PDU encoding failed"); - return; - } - - sendRlsPdu(ueAddressMap[ue], std::move(buf)); -} - -void RlsGnbEntity::sendHeartbeat(int ue) -{ - RlsMessage m; - m.msgCls = EMessageClass::NORMAL_MESSAGE; - m.msgType = EMessageType::RLS_HEARTBEAT; - m.appVersion = AppVersion; - m.ueToken = idUeMap[ue]; - m.gnbToken = token; - sendRlsMessage(ue, m); -} - -void RlsGnbEntity::sendReleaseIndication(int ue, ECause cause) -{ - RlsMessage m; - m.msgCls = EMessageClass::NORMAL_MESSAGE; - m.msgType = EMessageType::RLS_RELEASE_INDICATION; - m.appVersion = AppVersion; - m.ueToken = idUeMap[ue]; - m.gnbToken = token; - m.cause = cause; - sendRlsMessage(ue, m); -} - -void RlsGnbEntity::removeUe(int ue, ECause cause) -{ - if (idUeMap.count(ue) == 0) - return; - - uint64_t ueToken = idUeMap[ue]; - ueIdMap.erase(ueToken); - idUeMap.erase(ue); - ueAddressMap.erase(ue); - heartbeatMap.erase(ue); - if (!setupCompleteWaiting.count(ue)) - onUeReleased(ue, cause); - setupCompleteWaiting.erase(ue); -} - -void RlsGnbEntity::onReceive(const InetAddress &address, const OctetString &pdu) -{ - RlsMessage msg{}; - - auto res = Decode(OctetView{pdu}, msg, AppVersion); - if (res == DecodeRes::FAILURE) - { - logError("PDU decoding failed"); - return; - } - if (res == DecodeRes::VERSION_MISMATCH) - { - logError("Version mismatch between UE and gNB"); - return; - } - - if (msg.msgCls == EMessageClass::ERROR_INDICATION) - { - logError("RLS error indication received | " + std::to_string((int)msg.cause) + " | " + msg.str); - return; - } - - if (msg.ueToken == 0) - { - logWarn("UE gNB token received"); - return; - } - - if (msg.msgType == EMessageType::RLS_SETUP_REQUEST) - { - if (!acceptConnections) - { - // ignore setup request - return; - } - - if (ueIdMap.count(msg.ueToken)) - { - sendSetupFailure(address, msg.ueToken, ECause::TOKEN_CONFLICT); - return; - } - - int ueId = utils::NextId(); - ueIdMap[msg.ueToken] = ueId; - idUeMap[ueId] = msg.ueToken; - ueAddressMap[ueId] = address; - heartbeatMap[ueId] = utils::CurrentTimeMillis(); - setupCompleteWaiting.insert(ueId); - - sendSetupResponse(ueId); - return; - } - - if (!ueIdMap.count(msg.ueToken)) - { - logWarn("Unknown UE token"); - return; - } - - int ue = ueIdMap[msg.ueToken]; - heartbeatMap[ue] = utils::CurrentTimeMillis(); - - if (msg.msgType == EMessageType::RLS_SETUP_COMPLETE) - { - setupCompleteWaiting.erase(ue); - onUeConnected(ue, msg.str); - } - else if (msg.msgType == EMessageType::RLS_HEARTBEAT) - { - heartbeatMap[ue] = utils::CurrentTimeMillis(); - } - else if (msg.msgType == EMessageType::RLS_RELEASE_INDICATION) - { - removeUe(ue, msg.cause); - } - else if (msg.msgType == EMessageType::RLS_PAYLOAD_TRANSPORT) - { - deliverUplinkPayload(ue, msg.payloadType, std::move(msg.payload)); - } - else - { - logWarn("Bad message type received from UE"); - } -} - -void RlsGnbEntity::sendSetupResponse(int ue) -{ - RlsMessage m; - m.msgCls = EMessageClass::NORMAL_MESSAGE; - m.msgType = EMessageType::RLS_SETUP_RESPONSE; - m.appVersion = AppVersion; - m.ueToken = idUeMap[ue]; - m.gnbToken = token; - m.str = nodeName; - sendRlsMessage(ue, m); -} - -void RlsGnbEntity::sendSetupFailure(const InetAddress &address, uint64_t ueToken, ECause cause) -{ - RlsMessage m; - m.msgCls = EMessageClass::NORMAL_MESSAGE; - m.msgType = EMessageType::RLS_SETUP_FAILURE; - m.appVersion = AppVersion; - m.ueToken = ueToken; - m.gnbToken = token; - m.cause = cause; - - OctetString buf{}; - if (!Encode(m, buf)) - { - logWarn("PDU encoding failed"); - return; - } - - sendRlsPdu(address, std::move(buf)); -} - -} // namespace rls \ No newline at end of file diff --git a/src/urs/rls/gnb_entity.hpp b/src/urs/rls/gnb_entity.hpp deleted file mode 100644 index 5f3a85a4e..000000000 --- a/src/urs/rls/gnb_entity.hpp +++ /dev/null @@ -1,64 +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. -// - -#pragma once - -#include "rls.hpp" - -#include -#include -#include -#include - -namespace rls -{ - -class RlsGnbEntity -{ - private: - std::string nodeName; - uint64_t token; - std::unordered_map ueIdMap; // UE token to gNB-internal UE id. - std::unordered_map idUeMap; // gNB-internal UE id to UE token. - std::unordered_map ueAddressMap; // UE token to address - std::unordered_map heartbeatMap; // UE token to last heartbeat time - std::set setupCompleteWaiting; - bool acceptConnections; - - public: - explicit RlsGnbEntity(std::string nodeName); - virtual ~RlsGnbEntity() = default; - - protected: - virtual void logWarn(const std::string &msg) = 0; - virtual void logError(const std::string &msg) = 0; - - virtual void onUeConnected(int ue, std::string name) = 0; - virtual void onUeReleased(int ue, ECause cause) = 0; - - virtual void sendRlsPdu(const InetAddress &address, OctetString &&pdu) = 0; - virtual void deliverUplinkPayload(int ue, EPayloadType type, OctetString &&payload) = 0; - - public: - void onHeartbeat(); - void onReceive(const InetAddress &address, const OctetString &pdu); - void downlinkPayloadDelivery(int ue, EPayloadType type, OctetString &&payload); - void setAcceptConnections(bool accept); - void releaseConnection(int ue, ECause cause); - void localReleaseConnection(int ue, ECause cause); - - private: - void sendReleaseIndication(int ue, ECause cause); - void sendHeartbeat(int ue); - void removeUe(int ue, ECause cause); - void sendRlsMessage(int ue, const RlsMessage &msg); - void sendSetupFailure(const InetAddress &address, uint64_t ueToken, ECause cause); - void sendSetupResponse(int ue); -}; - -} // namespace rls \ No newline at end of file diff --git a/src/urs/rls/rls.cpp b/src/urs/rls/rls.cpp deleted file mode 100644 index b3f883172..000000000 --- a/src/urs/rls/rls.cpp +++ /dev/null @@ -1,107 +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 "rls.hpp" - -namespace rls -{ - -DecodeRes Decode(const OctetView &stream, RlsMessage &output, octet3 appVersion) -{ - output.msgCls = static_cast(stream.readI()); - if (output.msgCls == EMessageClass::ERROR_INDICATION) - { - output.cause = static_cast(stream.readI()); - uint16_t errLen = stream.read2US(); - output.str = stream.readUtf8String(errLen); - return DecodeRes::OK; - } - if (output.msgCls == EMessageClass::NORMAL_MESSAGE) - { - output.appVersion = stream.read3(); - if ((int)output.appVersion != (int)appVersion) - return DecodeRes::VERSION_MISMATCH; - output.msgType = static_cast(stream.readI()); - if (output.msgType != EMessageType::RLS_SETUP_REQUEST && output.msgType != EMessageType::RLS_SETUP_COMPLETE && - output.msgType != EMessageType::RLS_SETUP_FAILURE && output.msgType != EMessageType::RLS_HEARTBEAT && - output.msgType != EMessageType::RLS_RELEASE_INDICATION && - output.msgType != EMessageType::RLS_PAYLOAD_TRANSPORT && output.msgType != EMessageType::RLS_SETUP_RESPONSE) - return DecodeRes::FAILURE; - output.ueToken = stream.read8UL(); - output.gnbToken = stream.read8UL(); - output.payloadType = static_cast(stream.readI()); - uint16_t len = stream.read2US(); - output.payload = stream.readOctetString(len); - output.cause = static_cast(stream.readI()); - len = stream.read2US(); - output.str = stream.readUtf8String(len); - return DecodeRes::OK; - } - - return DecodeRes::FAILURE; -} - -bool Encode(const RlsMessage &msg, OctetString &stream) -{ - stream.appendOctet(static_cast(msg.msgCls)); - if (msg.msgCls == EMessageClass::ERROR_INDICATION) - { - stream.appendOctet(static_cast(msg.cause)); - stream.appendOctet2(msg.str.length()); - for (char c : msg.str) - stream.appendOctet(c); - return true; - } - if (msg.msgCls == EMessageClass::NORMAL_MESSAGE) - { - if (msg.msgType != EMessageType::RLS_SETUP_REQUEST && msg.msgType != EMessageType::RLS_SETUP_COMPLETE && - msg.msgType != EMessageType::RLS_SETUP_FAILURE && msg.msgType != EMessageType::RLS_HEARTBEAT && - msg.msgType != EMessageType::RLS_RELEASE_INDICATION && msg.msgType != EMessageType::RLS_PAYLOAD_TRANSPORT && - msg.msgType != EMessageType::RLS_SETUP_RESPONSE) - return false; - - stream.appendOctet3(msg.appVersion); - stream.appendOctet(static_cast(msg.msgType)); - stream.appendOctet8(msg.ueToken); - stream.appendOctet8(msg.gnbToken); - stream.appendOctet(static_cast(msg.payloadType)); - stream.appendOctet2(msg.payload.length()); - stream.append(msg.payload); - stream.appendOctet(static_cast(msg.cause)); - stream.appendOctet2(msg.str.length()); - stream.appendUtf8(msg.str); - - return true; - } - return false; -} - -const char *CauseToString(ECause cause) -{ - switch (cause) - { - case ECause::UNSPECIFIED: - return "RLS-UNSPECIFIED"; - case ECause::TOKEN_CONFLICT: - return "RLS-TOKEN-CONFLICT"; - case ECause::EMPTY_SEARCH_LIST: - return "RLS-EMPTY-SEARCH-LIST"; - case ECause::SETUP_TIMEOUT: - return "RLS-SETUP-TIMEOUT"; - case ECause::HEARTBEAT_TIMEOUT: - return "RLS-HEARTBEAT-TIMEOUT"; - case ECause::RRC_NORMAL_RELEASE: - return "RLS-RRC-NORMAL-RELEASE"; - case ECause::RRC_LOCAL_RELEASE: - return "RLS-RRC-LOCAL-RELEASE"; - default: - return "?"; - } -} - -} // namespace rls diff --git a/src/urs/rls/rls.hpp b/src/urs/rls/rls.hpp deleted file mode 100644 index 1d04fbda1..000000000 --- a/src/urs/rls/rls.hpp +++ /dev/null @@ -1,109 +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. -// - -#pragma once - -#include -#include -#include -#include - -namespace rls -{ - -enum class EUeState -{ - IDLE, - SEARCH, - CONNECTED, - RELEASED, -}; - -enum class EMessageClass : uint8_t -{ - RESERVED = 0, - ERROR_INDICATION, - NORMAL_MESSAGE -}; - -enum class EMessageType : uint8_t -{ - RESERVED = 0, - RLS_SETUP_REQUEST, - RLS_SETUP_RESPONSE, - RLS_SETUP_FAILURE, - RLS_SETUP_COMPLETE, - RLS_HEARTBEAT, - RLS_RELEASE_INDICATION, - RLS_PAYLOAD_TRANSPORT -}; - -enum class ECause : uint8_t -{ - // Error causes (treated as radio link failure) - UNSPECIFIED = 0, - TOKEN_CONFLICT, - EMPTY_SEARCH_LIST, - SETUP_TIMEOUT, - HEARTBEAT_TIMEOUT, - - // Successful causes - RRC_NORMAL_RELEASE, // release with UE-gNB coordination over RRC - RRC_LOCAL_RELEASE, // release locally without UE-gNB coordination -}; - -// Checks if the cause treated as radio link failure -inline bool IsRlf(ECause cause) -{ - return cause != ECause::RRC_NORMAL_RELEASE && cause != ECause::RRC_LOCAL_RELEASE; -} - -enum class EPayloadType : uint8_t -{ - RRC, - DATA, -}; - -struct Constants -{ - static constexpr const int UE_WAIT_TIMEOUT = 500; - static constexpr const int HB_TIMEOUT_GNB_TO_UE = 3000; - static constexpr const int HB_TIMEOUT_UE_TO_GNB = 5000; - static constexpr const int HB_PERIOD_GNB_TO_UE = 1500; - static constexpr const int HB_PERIOD_UE_TO_GNB = 2000; -}; - -struct RlsMessage -{ - EMessageClass msgCls{}; - - ECause cause{}; // only for RLS_SETUP_FAILURE and error indication messages - std::string str{}; // only for error indication, RLS_SETUP_RESPONSE, RLS_SETUP_COMPLETE, RLS_SETUP_FAILURE - - octet3 appVersion{}; // only for normal messages - EMessageType msgType{}; // only for normal messages - uint64_t ueToken{}; // only for normal messages - uint64_t gnbToken{}; // only for normal messages except RLS_SETUP_REQUEST - - EPayloadType payloadType{}; // only for RLC_PAYLOAD_TRANSPORT - OctetString payload{}; // only for RLC_PAYLOAD_TRANSPORT -}; - -enum class DecodeRes -{ - OK, - VERSION_MISMATCH, - FAILURE, -}; - -DecodeRes Decode(const OctetView &stream, RlsMessage &output, octet3 appVersion); -bool Encode(const RlsMessage &msg, OctetString &stream); - -const char *CauseToString(ECause cause); - -} // namespace rls diff --git a/src/urs/rls/ue_entity.cpp b/src/urs/rls/ue_entity.cpp deleted file mode 100644 index dba9a09bb..000000000 --- a/src/urs/rls/ue_entity.cpp +++ /dev/null @@ -1,307 +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 "ue_entity.hpp" - -#include -#include -#include - -static const octet3 AppVersion = octet3{cons::Major, cons::Minor, cons::Patch}; - -namespace rls -{ - -RlsUeEntity::RlsUeEntity(std::string nodeName, std::vector gnbSearchList) - : nodeName(std::move(nodeName)), gnbSearchList(std::move(gnbSearchList)), state(EUeState::IDLE), nextSearch(0), - ueToken(0), gnbToken(0), lastGnbHeartbeat(0), lastError(ECause::UNSPECIFIED) -{ -} - -void RlsUeEntity::onHeartbeat() -{ - if (state != EUeState::CONNECTED) - return; - - if (utils::CurrentTimeMillis() - lastGnbHeartbeat > Constants::HB_TIMEOUT_GNB_TO_UE) - { - state = EUeState::RELEASED; - nextSearch = 0; - ueToken = 0; - gnbToken = 0; - lastGnbHeartbeat = 0; - lastError = ECause::UNSPECIFIED; - onRelease(ECause::HEARTBEAT_TIMEOUT); - return; - } - - RlsMessage msg; - msg.gnbToken = gnbToken; - msg.ueToken = ueToken; - msg.msgType = EMessageType::RLS_HEARTBEAT; - msg.msgCls = EMessageClass::NORMAL_MESSAGE; - msg.appVersion = AppVersion; - sendRlsMessage(selected, msg); -} - -void RlsUeEntity::onWaitingTimerExpire() -{ - if (state != EUeState::SEARCH) - return; - - if (nextSearch + 1 >= gnbSearchList.size()) - { - resetEntity(); - searchFailure(ECause::SETUP_TIMEOUT); - } - else - { - nextSearch++; - ueToken = utils::Random64(); - startWaitingTimer(Constants::UE_WAIT_TIMEOUT); - sendSetupRequest(); - } -} - -void RlsUeEntity::onUplinkDelivery(EPayloadType type, OctetString &&payload) -{ - if (state != EUeState::CONNECTED) - { - logWarn("RLS uplink delivery request without connection"); - return; - } - - RlsMessage msg; - msg.gnbToken = gnbToken; - msg.ueToken = ueToken; - msg.msgType = EMessageType::RLS_PAYLOAD_TRANSPORT; - msg.msgCls = EMessageClass::NORMAL_MESSAGE; - msg.appVersion = AppVersion; - msg.payloadType = type; - msg.payload = std::move(payload); - sendRlsMessage(selected, msg); -} - -void RlsUeEntity::startGnbSearch() -{ - if (state == EUeState::SEARCH) - return; - - if (state != EUeState::IDLE) - { - logWarn("gNB search request while in not IDLE state"); - return; - } - - if (gnbSearchList.empty()) - { - searchFailure(ECause::EMPTY_SEARCH_LIST); - return; - } - - nextSearch = 0; - ueToken = utils::Random64(); - startWaitingTimer(Constants::UE_WAIT_TIMEOUT); - state = EUeState::SEARCH; - sendSetupRequest(); -} - -void RlsUeEntity::onReceive(const InetAddress &address, const OctetString &pdu) -{ - if (ueToken == 0) - { - logWarn("Received PDU ignored, UE entity is not initialized"); - return; - } - - RlsMessage msg{}; - - auto res = Decode(OctetView{pdu}, msg, AppVersion); - if (res == DecodeRes::FAILURE) - { - logError("PDU decoding failed"); - return; - } - if (res == DecodeRes::VERSION_MISMATCH) - { - logError("Version mismatch between UE and gNB"); - return; - } - - if (msg.msgCls == EMessageClass::ERROR_INDICATION) - { - logError("RLS error indication received | " + std::to_string((int)msg.cause) + " | " + msg.str); - return; - } - - if (msg.ueToken != ueToken) - { - logWarn("UE token mismatched message received"); - return; - } - - if (msg.gnbToken == 0) - { - logWarn("Bad gNB token received"); - return; - } - - if (state != EUeState::CONNECTED && state != EUeState::SEARCH) - { - logWarn("RLS received while in not CONNECTED or SEARCH"); - return; - } - - if (state == EUeState::CONNECTED) - { - if (gnbToken != msg.gnbToken) - { - logWarn("gNB token mismatched message received"); - return; - } - - lastGnbHeartbeat = utils::CurrentTimeMillis(); - - if (msg.msgType == EMessageType::RLS_PAYLOAD_TRANSPORT) - { - deliverPayload(msg.payloadType, std::move(msg.payload)); - } - else if (msg.msgType == EMessageType::RLS_HEARTBEAT) - { - lastGnbHeartbeat = utils::CurrentTimeMillis(); - } - else if (msg.msgType == EMessageType::RLS_RELEASE_INDICATION) - { - state = EUeState::RELEASED; - nextSearch = 0; - ueToken = 0; - gnbToken = 0; - lastGnbHeartbeat = 0; - lastError = ECause::UNSPECIFIED; - onRelease(msg.cause); - } - else - { - logWarn("RLS receive invalid message type in CONNECTED " + std::to_string((int)msg.msgType)); - } - } - - if (state == EUeState::SEARCH) - { - if (msg.msgType == EMessageType::RLS_SETUP_RESPONSE) - { - state = EUeState::CONNECTED; - gnbToken = msg.gnbToken; - lastError = ECause::UNSPECIFIED; - nextSearch = 0; - lastGnbHeartbeat = utils::CurrentTimeMillis(); - selected = address; - sendSetupComplete(); - onConnect(msg.str); - } - else if (msg.msgType == EMessageType::RLS_SETUP_FAILURE) - { - if (msg.cause != ECause::UNSPECIFIED) - lastError = msg.cause; - - if (nextSearch + 1 >= gnbSearchList.size()) - { - searchFailure(lastError); - resetEntity(); - } - else - { - nextSearch++; - ueToken = utils::Random64(); - startWaitingTimer(Constants::UE_WAIT_TIMEOUT); - sendSetupRequest(); - } - } - else - { - logWarn("RLS receive invalid message type in IDLE " + std::to_string((int)msg.msgType)); - } - } -} - -void RlsUeEntity::releaseConnection(ECause cause) -{ - sendReleaseIndication(cause); - localReleaseConnection(cause); -} - -void RlsUeEntity::resetEntity() -{ - state = EUeState::IDLE; - nextSearch = 0; - ueToken = 0; - gnbToken = 0; - lastError = ECause::UNSPECIFIED; - lastGnbHeartbeat = 0; - selected = {}; -} - -void RlsUeEntity::sendSetupRequest() -{ - RlsMessage m; - m.msgCls = EMessageClass::NORMAL_MESSAGE; - m.msgType = EMessageType::RLS_SETUP_REQUEST; - m.appVersion = AppVersion; - m.ueToken = ueToken; - m.gnbToken = 0; - sendRlsMessage(gnbSearchList[nextSearch], m); -} - -void RlsUeEntity::sendSetupComplete() -{ - RlsMessage m; - m.msgCls = EMessageClass::NORMAL_MESSAGE; - m.msgType = EMessageType::RLS_SETUP_COMPLETE; - m.appVersion = AppVersion; - m.ueToken = ueToken; - m.gnbToken = gnbToken; - m.str = nodeName; - sendRlsMessage(selected, m); -} - -void RlsUeEntity::sendReleaseIndication(ECause cause) -{ - RlsMessage m; - m.msgCls = EMessageClass::NORMAL_MESSAGE; - m.msgType = EMessageType::RLS_RELEASE_INDICATION; - m.appVersion = AppVersion; - m.ueToken = ueToken; - m.gnbToken = gnbToken; - m.cause = cause; - sendRlsMessage(selected, m); -} - -void RlsUeEntity::sendRlsMessage(const InetAddress &address, const RlsMessage &msg) -{ - OctetString stream{}; - if (!Encode(msg, stream)) - { - logWarn("PDU encoding failed"); - return; - } - - //sendRlsPdu(address, std::move(stream)); -} - -void RlsUeEntity::localReleaseConnection(ECause cause) -{ - state = EUeState::RELEASED; - nextSearch = 0; - ueToken = 0; - gnbToken = 0; - lastGnbHeartbeat = 0; - lastError = ECause::UNSPECIFIED; - onRelease(cause); -} - -} // namespace rls \ No newline at end of file diff --git a/src/urs/rls/ue_entity.hpp b/src/urs/rls/ue_entity.hpp deleted file mode 100644 index 11bb4a5fd..000000000 --- a/src/urs/rls/ue_entity.hpp +++ /dev/null @@ -1,64 +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. -// - -#pragma once - -#include "rls.hpp" - -#include -#include - -namespace rls -{ - -class RlsUeEntity -{ - private: - std::string nodeName; - std::vector gnbSearchList; - - EUeState state; - size_t nextSearch; - uint64_t ueToken; - uint64_t gnbToken; - uint64_t lastGnbHeartbeat; - ECause lastError; - InetAddress selected; - - public: - explicit RlsUeEntity(std::string nodeName, std::vector gnbSearchList); - virtual ~RlsUeEntity() = default; - - protected: - virtual void logWarn(const std::string &msg) = 0; - virtual void logError(const std::string &msg) = 0; - virtual void startWaitingTimer(int period) = 0; - virtual void searchFailure(ECause cause) = 0; - virtual void onRelease(ECause cause) = 0; - virtual void onConnect(const std::string &gnbName) = 0; - virtual void sendRlsPdu(const InetAddress &address, OctetString &&pdu) = 0; - virtual void deliverPayload(EPayloadType type, OctetString &&payload) = 0; - - public: - void onHeartbeat(); - void onWaitingTimerExpire(); - void onReceive(const InetAddress &address, const OctetString &pdu); - void onUplinkDelivery(EPayloadType type, OctetString &&payload); - void startGnbSearch(); - void releaseConnection(ECause cause); - void localReleaseConnection(ECause cause); - void resetEntity(); - - private: - void sendSetupRequest(); - void sendSetupComplete(); - void sendReleaseIndication(ECause cause); - void sendRlsMessage(const InetAddress &address, const RlsMessage &msg); -}; - -} // namespace rls \ No newline at end of file diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 295568033..9dc0b2392 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -34,21 +34,15 @@ enum class NtsMessageType UDP_SERVER_RECEIVE, CLI_SEND_RESPONSE, - GNB_MR_TO_MR, GNB_MR_TO_RRC, GNB_SRA_TO_RRC, - GNB_RRC_TO_MR, GNB_RRC_TO_SRA, GNB_NGAP_TO_RRC, GNB_RRC_TO_NGAP, GNB_NGAP_TO_GTP, - GNB_MR_TO_GTP, GNB_GTP_TO_MR, GNB_SCTP, - UE_MR_TO_MR, - UE_MR_TO_RRC, - UE_MR_TO_APP, UE_APP_TO_MR, UE_APP_TO_TUN, UE_TUN_TO_APP, From 3220df5bfbbf04a3669a467be0e17980018a3d8e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:40:31 +0300 Subject: [PATCH 039/116] SRA dev. --- src/ue/ue.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ue/ue.cpp b/src/ue/ue.cpp index 3115ce385..5749e49c5 100644 --- a/src/ue/ue.cpp +++ b/src/ue/ue.cpp @@ -12,7 +12,6 @@ #include "sra/task.hpp" #include "nas/task.hpp" #include "rrc/task.hpp" -#include "sra/task.hpp" namespace nr::ue { From 2b737b430e044f6359ca4ea20a567b1ee7ecd2af Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 17:45:17 +0300 Subject: [PATCH 040/116] SRA dev. --- src/ue/app/task.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index dde869e95..bbf4f1d80 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -49,7 +49,7 @@ void UeAppTask::onLoop() switch (msg->msgType) { - //case NtsMessageType::UE_MR_TO_APP: { + // case NtsMessageType::UE_MR_TO_APP: { // auto *w = dynamic_cast(msg); // switch (w->present) // { @@ -72,10 +72,10 @@ void UeAppTask::onLoop() switch (w->present) { case NwUeTunToApp::DATA_PDU_DELIVERY: { - //auto *nw = new NwAppToMr(NwAppToMr::DATA_PDU_DELIVERY); - //nw->psi = w->psi; - //nw->data = std::move(w->data); - //m_base->mrTask->push(nw); + // auto *nw = new NwAppToMr(NwAppToMr::DATA_PDU_DELIVERY); + // nw->psi = w->psi; + // nw->data = std::move(w->data); + // m_base->mrTask->push(nw); break; } case NwUeTunToApp::TUN_ERROR: { From f8f15b20b218c47445b2c691598a061adc7a5bf0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 18:11:49 +0300 Subject: [PATCH 041/116] SRA dev. --- src/ue/app/cmd_handler.cpp | 2 ++ src/ue/nas/mm/base.cpp | 20 ++++++++++++++++---- src/ue/nas/mm/radio.cpp | 11 +++++++++-- src/ue/nts.hpp | 3 ++- src/ue/rrc/task.cpp | 15 ++++----------- src/ue/sra/measurement.cpp | 10 ++++++++++ 6 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 72ab28935..2f9ef070c 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -114,6 +114,8 @@ 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->sraTask->m_servingCell.has_value() ? m_base->sraTask->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)}, diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 4cfac2a31..0e3aae030 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -70,10 +70,14 @@ void NasMm::performMmCycle() 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) { int64_t current = utils::CurrentTimeMillis(); - int64_t backoff = m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH ? -1 : 1500; + int64_t backoff = (m_mmSubState == EMmSubState::MM_DEREGISTERED_PLMN_SEARCH || + m_mmSubState == EMmSubState::MM_REGISTERED_PLMN_SEARCH) + ? -1 + : 1500; if (current - m_lastPlmnSearchTrigger > backoff) { @@ -145,6 +149,9 @@ void NasMm::switchCmState(ECmState state) ECmState oldState = m_cmState; m_cmState = state; + if (state != oldState) + m_logger->info("UE switches to state [%s]", ToJson(state).str().c_str()); + onSwitchCmState(oldState, m_cmState); if (m_base->nodeListener) @@ -153,9 +160,6 @@ void NasMm::switchCmState(ECmState state) ToJson(oldState).str(), ToJson(m_cmState).str()); } - if (state != oldState) - m_logger->info("UE switches to state [%s]", ToJson(state).str().c_str()); - triggerMmCycle(); } @@ -242,6 +246,14 @@ void NasMm::onSwitchCmState(ECmState oldState, ECmState newState) switchRmState(ERmState::RM_DEREGISTERED); } + else if (m_mmState == EMmState::MM_REGISTERED) + { + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); + } + else if (m_mmState == EMmState::MM_DEREGISTERED) + { + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + } } } diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index e485cb597..59dd3a7ae 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -10,8 +10,8 @@ #include #include #include -#include #include +#include namespace nr::ue { @@ -199,7 +199,14 @@ void NasMm::handleRrcConnectionRelease() void NasMm::handleRadioLinkFailure() { - m_logger->debug("Radio link failure detected"); + if (m_cmState == ECmState::CM_CONNECTED) + { + m_logger->err("Radio link failure detected"); + } + + m_usim->m_servingCell = std::nullopt; + m_usim->m_currentPlmn = std::nullopt; + handleRrcConnectionRelease(); } diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 48fddaffe..6524ded22 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -138,7 +138,8 @@ struct NwUeSraToRrc : NtsMessage { PLMN_SEARCH_RESPONSE, SERVING_CELL_CHANGE, - RRC_PDU_DELIVERY + RRC_PDU_DELIVERY, + RADIO_LINK_FAILURE } present; // PLMN_SEARCH_RESPONSE diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index a59f2e916..f488fb527 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -44,17 +44,6 @@ void UeRrcTask::onLoop() switch (msg->msgType) { - //case NtsMessageType::UE_MR_TO_RRC: { - // auto *w = dynamic_cast(msg); - // switch (w->present) - // { - // case NwUeMrToRrc::RADIO_LINK_FAILURE: { - // handleRadioLinkFailure(); - // break; - // } - // } - // break; - //} case NtsMessageType::UE_NAS_TO_RRC: { auto *w = dynamic_cast(msg); switch (w->present) @@ -106,6 +95,10 @@ void UeRrcTask::onLoop() handleDownlinkRrc(w->channel, w->pdu); break; } + case NwUeSraToRrc::RADIO_LINK_FAILURE: { + handleRadioLinkFailure(); + break; + } } break; } diff --git a/src/ue/sra/measurement.cpp b/src/ue/sra/measurement.cpp index 13cc0764c..85b2063d2 100644 --- a/src/ue/sra/measurement.cpp +++ b/src/ue/sra/measurement.cpp @@ -63,6 +63,16 @@ void UeSraTask::onCoverageChange(const std::vector &entered, const st { 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 NwUeSraToRrc(NwUeSraToRrc::RADIO_LINK_FAILURE)); + } } void UeSraTask::plmnSearchRequested() From 474f5156d67d146681e22c408f38a5dd18a1422d Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 18:15:28 +0300 Subject: [PATCH 042/116] SRA dev. --- src/ue/nas/mm/timer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index 7bc2f36b7..f464985fb 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -112,7 +112,7 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) if (m_mmState == EMmState::MM_DEREGISTERED_INITIATED && m_lastDeregistrationRequest != nullptr) { logExpired(); - m_logger->debug("Retrying de-registration request"); + m_logger->debug("Retransmitting De-registration Request due to T3521 expiry"); sendNasMessage(*m_lastDeregistrationRequest); m_timers->t3521.start(false); From 97e344f4817ee111b621ee4f7a42b7ebb0e61ca6 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 18:30:55 +0300 Subject: [PATCH 043/116] SRA dev. --- src/gnb/nts.hpp | 2 ++ src/gnb/rrc/task.cpp | 15 ++++----------- src/gnb/sra/management.cpp | 5 +++++ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 077edcbbd..957eb78dc 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -28,9 +28,11 @@ struct NwGnbSraToRrc : NtsMessage enum PR { RRC_PDU_DELIVERY, + SIGNAL_LOST } present; // RRC_PDU_DELIVERY + // SIGNAL_LOST int ueId{}; // RRC_PDU_DELIVERY diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index 3367cb301..c8d3f9b8b 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -37,17 +37,6 @@ void GnbRrcTask::onLoop() switch (msg->msgType) { - //case NtsMessageType::GNB_MR_TO_RRC: { - // auto *w = dynamic_cast(msg); - // switch (w->present) - // { - // case NwGnbMrToRrc::RADIO_LINK_FAILURE: { - // handleRadioLinkFailure(w->ueId); - // break; - // } - // } - // break; - //} case NtsMessageType::GNB_SRA_TO_RRC: { auto *w = dynamic_cast(msg); switch (w->present) @@ -56,6 +45,10 @@ void GnbRrcTask::onLoop() handleUplinkRrc(w->ueId, w->channel, w->pdu); break; } + case NwGnbSraToRrc::SIGNAL_LOST: { + handleRadioLinkFailure(w->ueId); + break; + } } break; } diff --git a/src/gnb/sra/management.cpp b/src/gnb/sra/management.cpp index 01b8e789b..899febaee 100644 --- a/src/gnb/sra/management.cpp +++ b/src/gnb/sra/management.cpp @@ -7,6 +7,7 @@ // #include "task.hpp" +#include #include #include @@ -62,6 +63,10 @@ void GnbSraTask::onPeriodicLostControl() { m_ueCtx.erase(ueId); m_logger->debug("Signal lost detected for UE[%d]", ueId); + + auto *w = new NwGnbSraToRrc(NwGnbSraToRrc::SIGNAL_LOST); + w->ueId = ueId; + m_base->rrcTask->push(w); } } From 05b209e352e9808619b539d84d3ab72a34f6623f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 18:33:05 +0300 Subject: [PATCH 044/116] SRA dev. --- src/gnb/sra/management.cpp | 2 +- src/gnb/sra/task.cpp | 2 +- src/gnb/sra/task.hpp | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gnb/sra/management.cpp b/src/gnb/sra/management.cpp index 899febaee..6d7ffbf9e 100644 --- a/src/gnb/sra/management.cpp +++ b/src/gnb/sra/management.cpp @@ -28,7 +28,7 @@ int GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) } else { - int ueId = utils::NextId(); + int ueId = ++m_ueIdCounter; m_stiToUeId[sti] = ueId; auto ctx = std::make_unique(ueId); ctx->sti = sti; diff --git a/src/gnb/sra/task.cpp b/src/gnb/sra/task.cpp index 70c6a615c..da5bff75a 100644 --- a/src/gnb/sra/task.cpp +++ b/src/gnb/sra/task.cpp @@ -20,7 +20,7 @@ static const int TIMER_PERIOD_LOST_CONTROL = 2000; namespace nr::gnb { -GnbSraTask::GnbSraTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_ueCtx{}, m_stiToUeId{} +GnbSraTask::GnbSraTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_ueCtx{}, m_stiToUeId{}, m_ueIdCounter{} { m_logger = m_base->logBase->makeUniqueLogger("sra"); m_sti = utils::Random64(); diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index c56c214c8..f9aa0bb93 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -32,6 +32,7 @@ class GnbSraTask : public NtsTask uint64_t m_sti; std::unordered_map> m_ueCtx; std::unordered_map m_stiToUeId; + int m_ueIdCounter; friend class GnbCmdHandler; From 63ce82089047eb03ae923ad240583aa5788cffc3 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 18:38:42 +0300 Subject: [PATCH 045/116] SRA dev. --- src/ue/nas/mm/base.cpp | 8 -------- src/ue/nas/mm/radio.cpp | 5 +++++ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 0e3aae030..e3acc26a6 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -246,14 +246,6 @@ void NasMm::onSwitchCmState(ECmState oldState, ECmState newState) switchRmState(ERmState::RM_DEREGISTERED); } - else if (m_mmState == EMmState::MM_REGISTERED) - { - switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); - } - else if (m_mmState == EMmState::MM_DEREGISTERED) - { - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - } } } diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 59dd3a7ae..123f06056 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -208,6 +208,11 @@ void NasMm::handleRadioLinkFailure() m_usim->m_currentPlmn = std::nullopt; handleRrcConnectionRelease(); + + if (m_mmState == EMmState::MM_REGISTERED) + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + else if (m_mmState == EMmState::MM_DEREGISTERED) + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); } void NasMm::localReleaseConnection() From 1dfa1434e06b1956380f1a93e868f81687364250 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 18:53:10 +0300 Subject: [PATCH 046/116] SRA dev. --- src/gnb/ngap/interface.cpp | 2 +- src/gnb/nts.hpp | 3 ++- src/gnb/rrc/task.cpp | 5 +++-- src/gnb/sra/task.cpp | 4 ++++ src/gnb/sra/task.hpp | 1 + src/gnb/sra/transport.cpp | 6 ++++++ 6 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/gnb/ngap/interface.cpp b/src/gnb/ngap/interface.cpp index 6b7ebab77..ccfc6835e 100644 --- a/src/gnb/ngap/interface.cpp +++ b/src/gnb/ngap/interface.cpp @@ -195,7 +195,7 @@ void NgapTask::receiveNgSetupResponse(int amfId, ASN_NGAP_NGSetupResponse *msg) update->isNgapUp = true; m_base->appTask->push(update); - m_base->rrcTask->push(new NwGnbNgapToRrc(NwGnbNgapToRrc::NGAP_LAYER_INITIALIZED)); + m_base->rrcTask->push(new NwGnbNgapToRrc(NwGnbNgapToRrc::RADIO_POWER_ON)); } } diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 957eb78dc..15dcdb18b 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -48,6 +48,7 @@ struct NwGnbRrcToSra : NtsMessage { enum PR { + RADIO_POWER_ON, RRC_PDU_DELIVERY, } present; @@ -65,7 +66,7 @@ struct NwGnbNgapToRrc : NtsMessage { enum PR { - NGAP_LAYER_INITIALIZED, + RADIO_POWER_ON, NAS_DELIVERY, AN_RELEASE, } present; diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index c8d3f9b8b..6350af766 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include namespace nr::gnb @@ -56,8 +57,8 @@ void GnbRrcTask::onLoop() auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbNgapToRrc::NGAP_LAYER_INITIALIZED: { - //m_base->mrTask->push(new NwGnbRrcToMr(NwGnbRrcToMr::NGAP_LAYER_INITIALIZED)); + case NwGnbNgapToRrc::RADIO_POWER_ON: { + m_base->sraTask->push(new NwGnbRrcToSra(NwGnbRrcToSra::RADIO_POWER_ON)); break; } case NwGnbNgapToRrc::NAS_DELIVERY: { diff --git a/src/gnb/sra/task.cpp b/src/gnb/sra/task.cpp index da5bff75a..879bb2eef 100644 --- a/src/gnb/sra/task.cpp +++ b/src/gnb/sra/task.cpp @@ -60,6 +60,10 @@ void GnbSraTask::onLoop() OctetString::FromOctet4(static_cast(w->channel))); break; } + case NwGnbRrcToSra::RADIO_POWER_ON: { + m_powerOn = true; + break; + } } break; } diff --git a/src/gnb/sra/task.hpp b/src/gnb/sra/task.hpp index f9aa0bb93..a02b5c42c 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/sra/task.hpp @@ -29,6 +29,7 @@ class GnbSraTask : public NtsTask std::unique_ptr m_logger; udp::UdpServerTask *m_udpTask; + bool m_powerOn; uint64_t m_sti; std::unordered_map> m_ueCtx; std::unordered_map m_stiToUeId; diff --git a/src/gnb/sra/transport.cpp b/src/gnb/sra/transport.cpp index 91dd70767..d1b7ce6e0 100644 --- a/src/gnb/sra/transport.cpp +++ b/src/gnb/sra/transport.cpp @@ -13,6 +13,12 @@ namespace nr::gnb void GnbSraTask::receiveSraMessage(const InetAddress &addr, sra::SraMessage &msg) { + if (!m_powerOn) + { + // ignore received SRA message + return; + } + int ueId = updateUeInfo(addr, msg.sti); switch (msg.msgType) From d8e46c67b2de1b137ebd80c8b480d3af36b4dc03 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 18:58:12 +0300 Subject: [PATCH 047/116] SRA dev. --- src/utils/nts.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 9dc0b2392..f63a11bb7 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -104,6 +104,7 @@ class TimerBase }; // TODO: Limit queue size? +// todo: message priority, especially control plane messages should have more priorty in appTask etc class NtsTask { private: From 98b30ebbe119e53e3ae02b85023078a9c6fd6271 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 19:12:34 +0300 Subject: [PATCH 048/116] SRA dev. --- src/ue/app/task.hpp | 2 ++ src/ue/nas/mm/base.cpp | 4 ++++ src/ue/nts.hpp | 20 ++++++++++++++++++++ src/urs/sra_pdu.hpp | 3 ++- src/utils/nts.hpp | 3 +-- 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/ue/app/task.hpp b/src/ue/app/task.hpp index 75a528b21..ceab73bf8 100644 --- a/src/ue/app/task.hpp +++ b/src/ue/app/task.hpp @@ -29,6 +29,7 @@ class UeAppTask : public NtsTask std::array, 16> m_pduSessions{}; std::array m_tunTasks{}; + ECmState m_cmState{}; friend class UeCmdHandler; @@ -44,6 +45,7 @@ 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/mm/base.cpp b/src/ue/nas/mm/base.cpp index e3acc26a6..ae1646ed8 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -154,6 +154,10 @@ void NasMm::switchCmState(ECmState state) onSwitchCmState(oldState, m_cmState); + auto *statusUpdate = new NwUeStatusUpdate(NwUeStatusUpdate::CM_STATE); + statusUpdate->cmState = m_cmState; + m_base->appTask->push(statusUpdate); + if (m_base->nodeListener) { m_base->nodeListener->onSwitch(app::NodeType::UE, m_base->config->getNodeName(), app::StateType::CM, diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 6524ded22..66042352c 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -186,10 +186,27 @@ struct NwUeNasToApp : NtsMessage } }; +struct NwUeAppToSra : NtsMessage +{ + enum PR + { + DATA_PDU_DELIVERY + } present; + + // DATA_PDU_DELIVERY + int psi{}; + OctetString pdu{}; + + explicit NwUeAppToSra(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_SRA), present(present) + { + } +}; + struct NwUeStatusUpdate : NtsMessage { static constexpr const int SESSION_ESTABLISHMENT = 1; static constexpr const int SESSION_RELEASE = 2; + static constexpr const int CM_STATE = 3; const int what{}; @@ -199,6 +216,9 @@ struct NwUeStatusUpdate : NtsMessage // SESSION_RELEASE int psi{}; + // CM_STATE + ECmState cmState{}; + explicit NwUeStatusUpdate(const int what) : NtsMessage(NtsMessageType::UE_STATUS_UPDATE), what(what) { } diff --git a/src/urs/sra_pdu.hpp b/src/urs/sra_pdu.hpp index cd9decdff..283f770cc 100644 --- a/src/urs/sra_pdu.hpp +++ b/src/urs/sra_pdu.hpp @@ -28,7 +28,8 @@ enum class EMessageType : uint8_t enum class EPduType : uint8_t { RESERVED = 0, - RRC + RRC, + DATA }; struct SraMessage diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index f63a11bb7..31cc71a8a 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -40,10 +40,9 @@ enum class NtsMessageType GNB_NGAP_TO_RRC, GNB_RRC_TO_NGAP, GNB_NGAP_TO_GTP, - GNB_GTP_TO_MR, GNB_SCTP, - UE_APP_TO_MR, + UE_APP_TO_SRA, UE_APP_TO_TUN, UE_TUN_TO_APP, UE_RRC_TO_NAS, From 5d844b4a0740d7f37f49c1328e9aed45a50f1084 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 19:13:56 +0300 Subject: [PATCH 049/116] SRA dev. --- src/ue/sra/task.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ue/sra/task.cpp b/src/ue/sra/task.cpp index 60f86c2be..04c876d14 100644 --- a/src/ue/sra/task.cpp +++ b/src/ue/sra/task.cpp @@ -67,6 +67,17 @@ void UeSraTask::onLoop() } break; } + case NtsMessageType::UE_APP_TO_SRA: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwUeAppToSra::DATA_PDU_DELIVERY: { + deliverUplinkPdu(sra::EPduType::DATA, std::move(w->pdu), OctetString::FromOctet4(static_cast(w->psi))); + break; + } + } + break; + } case NtsMessageType::TIMER_EXPIRED: { auto *w = dynamic_cast(msg); if (w->timerId == TIMER_ID_MEASUREMENT) From 37470ff1973b5be2dc15e4833d1a65e449b48632 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 19:23:58 +0300 Subject: [PATCH 050/116] SRA dev. --- src/gnb/gtp/task.cpp | 33 +++++++++++---------- src/gnb/nts.hpp | 34 +++++++++++++++++++++ src/gnb/sra/handler.cpp | 9 ++++++ src/gnb/sra/task.cpp | 12 ++++++++ src/ue/app/task.cpp | 64 ++++++++++++++++++++++++++-------------- src/ue/nts.hpp | 16 ++++++++++ src/ue/sra/transport.cpp | 8 +++++ src/utils/nts.hpp | 3 ++ 8 files changed, 141 insertions(+), 38 deletions(-) diff --git a/src/gnb/gtp/task.cpp b/src/gnb/gtp/task.cpp index ae394ede6..bf64db04b 100644 --- a/src/gnb/gtp/task.cpp +++ b/src/gnb/gtp/task.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -75,17 +76,17 @@ void GtpTask::onLoop() } break; } - //case NtsMessageType::GNB_MR_TO_GTP: { - // auto *w = dynamic_cast(msg); - // switch (w->present) - // { - // case NwGnbMrToGtp::UPLINK_DELIVERY: { - // handleUplinkData(w->ueId, w->pduSessionId, std::move(w->data)); - // break; - // } - // } - // break; - //} + case NtsMessageType::GNB_SRA_TO_GTP: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwGnbSraToGtp::DATA_PDU_DELIVERY: { + handleUplinkData(w->ueId, w->psi, std::move(w->pdu)); + break; + } + } + break; + } case NtsMessageType::UDP_SERVER_RECEIVE: handleUdpReceive(*dynamic_cast(msg)); break; @@ -238,11 +239,11 @@ void GtpTask::handleUdpReceive(const udp::NwUdpServerReceive &msg) if (m_rateLimiter->allowDownlinkPacket(sessionInd, gtp->payload.length())) { - //auto *w = new NwGnbGtpToMr(NwGnbGtpToMr::DATA_PDU_DELIVERY); - //w->ueId = GetUeId(sessionInd); - //w->pduSessionId = GetPsi(sessionInd); - //w->data = std::move(gtp->payload); - //m_base->mrTask->push(w); + auto *w = new NwGnbGtpToSra(NwGnbGtpToSra::DATA_PDU_DELIVERY); + w->ueId = GetUeId(sessionInd); + w->psi = GetPsi(sessionInd); + w->pdu = std::move(gtp->payload); + m_base->sraTask->push(w); } delete gtp; diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 15dcdb18b..ab58d46e8 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -44,6 +44,40 @@ struct NwGnbSraToRrc : NtsMessage } }; +struct NwGnbSraToGtp : NtsMessage +{ + enum PR + { + DATA_PDU_DELIVERY, + } present; + + // DATA_PDU_DELIVERY + int ueId{}; + int psi{}; + OctetString pdu{}; + + explicit NwGnbSraToGtp(PR present) : NtsMessage(NtsMessageType::GNB_SRA_TO_GTP), present(present) + { + } +}; + +struct NwGnbGtpToSra : NtsMessage +{ + enum PR + { + DATA_PDU_DELIVERY, + } present; + + // DATA_PDU_DELIVERY + int ueId{}; + int psi{}; + OctetString pdu{}; + + explicit NwGnbGtpToSra(PR present) : NtsMessage(NtsMessageType::GNB_GTP_TO_SRA), present(present) + { + } +}; + struct NwGnbRrcToSra : NtsMessage { enum PR diff --git a/src/gnb/sra/handler.cpp b/src/gnb/sra/handler.cpp index 66e4cd208..0579ba0b6 100644 --- a/src/gnb/sra/handler.cpp +++ b/src/gnb/sra/handler.cpp @@ -8,6 +8,7 @@ #include "task.hpp" #include +#include #include static int MIN_ALLOWED_DBM = -120; @@ -57,6 +58,14 @@ void GnbSraTask::handleUplinkPduDelivery(int ueId, sra::SraPduDelivery &msg) nw->pdu = std::move(msg.pdu); m_base->rrcTask->push(nw); } + else if (msg.pduType == sra::EPduType::DATA) + { + auto *nw = new NwGnbSraToGtp(NwGnbSraToGtp::DATA_PDU_DELIVERY); + nw->ueId = ueId; + nw->psi = msg.payload.get4I(0); + nw->pdu = std::move(msg.pdu); + m_base->gtpTask->push(nw); + } } void GnbSraTask::handleDownlinkDelivery(int ueId, sra::EPduType pduType, OctetString &&pdu, OctetString &&payload) diff --git a/src/gnb/sra/task.cpp b/src/gnb/sra/task.cpp index 879bb2eef..c161619f3 100644 --- a/src/gnb/sra/task.cpp +++ b/src/gnb/sra/task.cpp @@ -67,6 +67,18 @@ void GnbSraTask::onLoop() } break; } + case NtsMessageType::GNB_GTP_TO_SRA: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwGnbGtpToSra::DATA_PDU_DELIVERY: { + handleDownlinkDelivery(w->ueId, sra::EPduType::DATA, std::move(w->pdu), + OctetString::FromOctet4(static_cast(w->psi))); + break; + } + } + break; + } case NtsMessageType::UDP_SERVER_RECEIVE: { auto *w = dynamic_cast(msg); auto sraMsg = sra::DecodeSraMessage(OctetView{w->packet}); diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index bbf4f1d80..72fca0754 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -9,6 +9,7 @@ #include "task.hpp" #include "cmd_handler.hpp" #include +#include #include #include #include @@ -49,33 +50,30 @@ void UeAppTask::onLoop() switch (msg->msgType) { - // case NtsMessageType::UE_MR_TO_APP: { - // auto *w = dynamic_cast(msg); - // switch (w->present) - // { - // case NwUeMrToApp::DATA_PDU_DELIVERY: { - // auto *tunTask = m_tunTasks[w->psi]; - // if (tunTask) - // { - // auto *nw = new NwAppToTun(NwAppToTun::DATA_PDU_DELIVERY); - // nw->psi = w->psi; - // nw->data = std::move(w->data); - // tunTask->push(nw); - // } - // break; - // } - // } - // break; - //} + case NtsMessageType::UE_SRA_TO_APP: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwUeSraToApp::DATA_PDU_DELIVERY: { + auto *tunTask = m_tunTasks[w->psi]; + if (tunTask) + { + auto *nw = new NwAppToTun(NwAppToTun::DATA_PDU_DELIVERY); + nw->psi = w->psi; + nw->data = std::move(w->pdu); + tunTask->push(nw); + } + break; + } + } + break; + } case NtsMessageType::UE_TUN_TO_APP: { auto *w = dynamic_cast(msg); switch (w->present) { case NwUeTunToApp::DATA_PDU_DELIVERY: { - // auto *nw = new NwAppToMr(NwAppToMr::DATA_PDU_DELIVERY); - // nw->psi = w->psi; - // nw->data = std::move(w->data); - // m_base->mrTask->push(nw); + handleUplinkDataRequest(w->psi, std::move(w->data)); break; } case NwUeTunToApp::TUN_ERROR: { @@ -157,6 +155,12 @@ void UeAppTask::receiveStatusUpdate(NwUeStatusUpdate &msg) } return; } + + if (msg.what == NwUeStatusUpdate::CM_STATE) + { + m_cmState = msg.cmState; + return; + } } void UeAppTask::setupTunInterface(const PduSession *pduSession) @@ -218,4 +222,20 @@ void UeAppTask::setupTunInterface(const PduSession *pduSession) allocatedName.c_str(), ipAddress.c_str()); } +void UeAppTask::handleUplinkDataRequest(int psi, OctetString &&data) +{ + if (m_cmState == ECmState::CM_CONNECTED) + { + auto *nw = new NwUeAppToSra(NwUeAppToSra::DATA_PDU_DELIVERY); + nw->psi = psi; + nw->pdu = std::move(data); + m_base->sraTask->push(nw); + } + else + { + // TODO + m_logger->err("Uplink data is pending"); + } +} + } // namespace nr::ue diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 66042352c..3e9531f38 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -202,6 +202,22 @@ struct NwUeAppToSra : NtsMessage } }; +struct NwUeSraToApp : NtsMessage +{ + enum PR + { + DATA_PDU_DELIVERY + } present; + + // DATA_PDU_DELIVERY + int psi{}; + OctetString pdu{}; + + explicit NwUeSraToApp(PR present) : NtsMessage(NtsMessageType::UE_SRA_TO_APP), present(present) + { + } +}; + struct NwUeStatusUpdate : NtsMessage { static constexpr const int SESSION_ESTABLISHMENT = 1; diff --git a/src/ue/sra/transport.cpp b/src/ue/sra/transport.cpp index 8c8790e89..cfe3d97a1 100644 --- a/src/ue/sra/transport.cpp +++ b/src/ue/sra/transport.cpp @@ -7,6 +7,7 @@ // #include "task.hpp" +#include #include #include #include @@ -63,6 +64,13 @@ void UeSraTask::deliverDownlinkPdu(sra::SraPduDelivery &msg) nw->pdu = std::move(msg.pdu); m_base->rrcTask->push(nw); } + else if (msg.pduType == sra::EPduType::DATA) + { + auto *nw = new NwUeSraToApp(NwUeSraToApp::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/utils/nts.hpp b/src/utils/nts.hpp index 31cc71a8a..efd3baf6d 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -36,6 +36,8 @@ enum class NtsMessageType GNB_MR_TO_RRC, GNB_SRA_TO_RRC, + GNB_SRA_TO_GTP, + GNB_GTP_TO_SRA, GNB_RRC_TO_SRA, GNB_NGAP_TO_RRC, GNB_RRC_TO_NGAP, @@ -50,6 +52,7 @@ enum class NtsMessageType UE_RRC_TO_SRA, UE_NAS_TO_NAS, UE_SRA_TO_RRC, + UE_SRA_TO_APP, UE_NAS_TO_APP, }; From d526e59f5860cefc7b04b73894070e13b415c1f5 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 19:36:22 +0300 Subject: [PATCH 051/116] SRA dev. --- src/gnb/rrc/task.hpp | 1 - src/gnb/types.hpp | 6 ------ src/utils/nts.hpp | 1 - 3 files changed, 8 deletions(-) diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 9cefe6dae..931fbd74c 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -36,7 +36,6 @@ namespace nr::gnb { class NgapTask; -class GnbMrTask; class GnbRrcTask : public NtsTask { diff --git a/src/gnb/types.hpp b/src/gnb/types.hpp index 95c4bca23..74743a3e5 100644 --- a/src/gnb/types.hpp +++ b/src/gnb/types.hpp @@ -340,12 +340,6 @@ struct TaskBase GnbSraTask *sraTask{}; }; -struct MrUeContext -{ - int ueId{}; - std::string name{}; -}; - Json ToJson(const GnbStatusInfo &v); Json ToJson(const GnbConfig &v); Json ToJson(const NgapAmfContext &v); diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index efd3baf6d..f49d477fc 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -34,7 +34,6 @@ enum class NtsMessageType UDP_SERVER_RECEIVE, CLI_SEND_RESPONSE, - GNB_MR_TO_RRC, GNB_SRA_TO_RRC, GNB_SRA_TO_GTP, GNB_GTP_TO_SRA, From de9a379070aef736ceda698c4c6a3ca2e5c9d928 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 19:56:17 +0300 Subject: [PATCH 052/116] SRA dev. --- src/gnb/app/cmd_handler.cpp | 8 +++---- src/gnb/gnb.cpp | 11 ++++----- src/gnb/gtp/task.cpp | 12 +++++----- src/gnb/nts.hpp | 16 ++++++------- src/gnb/{sra => rls}/handler.cpp | 18 +++++++------- src/gnb/{sra => rls}/management.cpp | 6 ++--- src/gnb/{sra => rls}/task.cpp | 33 ++++++++++++------------- src/gnb/{sra => rls}/task.hpp | 18 +++++++------- src/gnb/{sra => rls}/transport.cpp | 14 +++++------ src/gnb/rrc/channel.cpp | 34 +++++++++++++------------- src/gnb/rrc/task.cpp | 12 +++++----- src/gnb/types.hpp | 4 ++-- src/ue/app/cmd_handler.cpp | 12 +++++----- src/ue/app/task.cpp | 12 +++++----- src/ue/nts.hpp | 16 ++++++------- src/ue/{sra => rls}/measurement.cpp | 20 ++++++++-------- src/ue/{sra => rls}/task.cpp | 36 ++++++++++++++-------------- src/ue/{sra => rls}/task.hpp | 18 +++++++------- src/ue/{sra => rls}/transport.cpp | 30 +++++++++++------------ src/ue/rrc/channel.cpp | 34 +++++++++++++------------- src/ue/rrc/task.cpp | 20 ++++++++-------- src/ue/types.hpp | 4 ++-- src/ue/ue.cpp | 10 ++++---- src/urs/{sra_pdu.cpp => rls_pdu.cpp} | 8 +++---- src/urs/{sra_pdu.hpp => rls_pdu.hpp} | 6 ++--- src/utils/nts.hpp | 16 ++++++------- 26 files changed, 214 insertions(+), 214 deletions(-) rename src/gnb/{sra => rls}/handler.cpp (79%) rename src/gnb/{sra => rls}/management.cpp (90%) rename src/gnb/{sra => rls}/task.cpp (72%) rename src/gnb/{sra => rls}/task.hpp (72%) rename src/gnb/{sra => rls}/transport.cpp (70%) rename src/ue/{sra => rls}/measurement.cpp (84%) rename src/ue/{sra => rls}/task.cpp (73%) rename src/ue/{sra => rls}/task.hpp (76%) rename src/ue/{sra => rls}/transport.cpp (59%) rename src/urs/{sra_pdu.cpp => rls_pdu.cpp} (95%) rename src/urs/{sra_pdu.hpp => rls_pdu.hpp} (91%) diff --git a/src/gnb/app/cmd_handler.cpp b/src/gnb/app/cmd_handler.cpp index edf4ffd3f..5572bacca 100644 --- a/src/gnb/app/cmd_handler.cpp +++ b/src/gnb/app/cmd_handler.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include @@ -36,7 +36,7 @@ void GnbCmdHandler::sendError(const InetAddress &address, const std::string &out void GnbCmdHandler::pauseTasks() { m_base->gtpTask->requestPause(); - m_base->sraTask->requestPause(); + m_base->rlsTask->requestPause(); m_base->ngapTask->requestPause(); m_base->rrcTask->requestPause(); m_base->sctpTask->requestPause(); @@ -45,7 +45,7 @@ void GnbCmdHandler::pauseTasks() void GnbCmdHandler::unpauseTasks() { m_base->gtpTask->requestUnpause(); - m_base->sraTask->requestUnpause(); + m_base->rlsTask->requestUnpause(); m_base->ngapTask->requestUnpause(); m_base->rrcTask->requestUnpause(); m_base->sctpTask->requestUnpause(); @@ -55,7 +55,7 @@ bool GnbCmdHandler::isAllPaused() { if (!m_base->gtpTask->isPauseConfirmed()) return false; - if (!m_base->sraTask->isPauseConfirmed()) + if (!m_base->rlsTask->isPauseConfirmed()) return false; if (!m_base->ngapTask->isPauseConfirmed()) return false; diff --git a/src/gnb/gnb.cpp b/src/gnb/gnb.cpp index 119f5487b..d63330db0 100644 --- a/src/gnb/gnb.cpp +++ b/src/gnb/gnb.cpp @@ -9,10 +9,9 @@ #include "gnb.hpp" #include "app/task.hpp" #include "gtp/task.hpp" -#include "sra/task.hpp" +#include "rls/task.hpp" #include "ngap/task.hpp" #include "rrc/task.hpp" -#include "sra/task.hpp" #include "sctp/task.hpp" #include @@ -33,7 +32,7 @@ GNodeB::GNodeB(GnbConfig *config, app::INodeListener *nodeListener, NtsTask *cli base->ngapTask = new NgapTask(base); base->rrcTask = new GnbRrcTask(base); base->gtpTask = new GtpTask(base); - base->sraTask = new GnbSraTask(base); + base->rlsTask = new GnbRlsTask(base); taskBase = base; } @@ -45,14 +44,14 @@ GNodeB::~GNodeB() taskBase->ngapTask->quit(); taskBase->rrcTask->quit(); taskBase->gtpTask->quit(); - taskBase->sraTask->quit(); + taskBase->rlsTask->quit(); delete taskBase->appTask; delete taskBase->sctpTask; delete taskBase->ngapTask; delete taskBase->rrcTask; delete taskBase->gtpTask; - delete taskBase->sraTask; + delete taskBase->rlsTask; delete taskBase->logBase; @@ -65,7 +64,7 @@ void GNodeB::start() taskBase->sctpTask->start(); taskBase->ngapTask->start(); taskBase->rrcTask->start(); - taskBase->sraTask->start(); + taskBase->rlsTask->start(); taskBase->gtpTask->start(); } diff --git a/src/gnb/gtp/task.cpp b/src/gnb/gtp/task.cpp index bf64db04b..a061b14f1 100644 --- a/src/gnb/gtp/task.cpp +++ b/src/gnb/gtp/task.cpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include @@ -76,11 +76,11 @@ void GtpTask::onLoop() } break; } - case NtsMessageType::GNB_SRA_TO_GTP: { - auto *w = dynamic_cast(msg); + case NtsMessageType::GNB_RLS_TO_GTP: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbSraToGtp::DATA_PDU_DELIVERY: { + case NwGnbRlsToGtp::DATA_PDU_DELIVERY: { handleUplinkData(w->ueId, w->psi, std::move(w->pdu)); break; } @@ -239,11 +239,11 @@ void GtpTask::handleUdpReceive(const udp::NwUdpServerReceive &msg) if (m_rateLimiter->allowDownlinkPacket(sessionInd, gtp->payload.length())) { - auto *w = new NwGnbGtpToSra(NwGnbGtpToSra::DATA_PDU_DELIVERY); + auto *w = new NwGnbGtpToRls(NwGnbGtpToRls::DATA_PDU_DELIVERY); w->ueId = GetUeId(sessionInd); w->psi = GetPsi(sessionInd); w->pdu = std::move(gtp->payload); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } delete gtp; diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index ab58d46e8..9b006d273 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -23,7 +23,7 @@ namespace nr::gnb { -struct NwGnbSraToRrc : NtsMessage +struct NwGnbRlsToRrc : NtsMessage { enum PR { @@ -39,12 +39,12 @@ struct NwGnbSraToRrc : NtsMessage rrc::RrcChannel channel{}; OctetString pdu{}; - explicit NwGnbSraToRrc(PR present) : NtsMessage(NtsMessageType::GNB_SRA_TO_RRC), present(present) + explicit NwGnbRlsToRrc(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_RRC), present(present) { } }; -struct NwGnbSraToGtp : NtsMessage +struct NwGnbRlsToGtp : NtsMessage { enum PR { @@ -56,12 +56,12 @@ struct NwGnbSraToGtp : NtsMessage int psi{}; OctetString pdu{}; - explicit NwGnbSraToGtp(PR present) : NtsMessage(NtsMessageType::GNB_SRA_TO_GTP), present(present) + explicit NwGnbRlsToGtp(PR present) : NtsMessage(NtsMessageType::GNB_RLS_TO_GTP), present(present) { } }; -struct NwGnbGtpToSra : NtsMessage +struct NwGnbGtpToRls : NtsMessage { enum PR { @@ -73,12 +73,12 @@ struct NwGnbGtpToSra : NtsMessage int psi{}; OctetString pdu{}; - explicit NwGnbGtpToSra(PR present) : NtsMessage(NtsMessageType::GNB_GTP_TO_SRA), present(present) + explicit NwGnbGtpToRls(PR present) : NtsMessage(NtsMessageType::GNB_GTP_TO_RLS), present(present) { } }; -struct NwGnbRrcToSra : NtsMessage +struct NwGnbRrcToRls : NtsMessage { enum PR { @@ -91,7 +91,7 @@ struct NwGnbRrcToSra : NtsMessage rrc::RrcChannel channel{}; OctetString pdu{}; - explicit NwGnbRrcToSra(PR present) : NtsMessage(NtsMessageType::GNB_RRC_TO_SRA), present(present) + explicit NwGnbRrcToRls(PR present) : NtsMessage(NtsMessageType::GNB_RRC_TO_RLS), present(present) { } }; diff --git a/src/gnb/sra/handler.cpp b/src/gnb/rls/handler.cpp similarity index 79% rename from src/gnb/sra/handler.cpp rename to src/gnb/rls/handler.cpp index 0579ba0b6..1d8722fb8 100644 --- a/src/gnb/sra/handler.cpp +++ b/src/gnb/rls/handler.cpp @@ -28,7 +28,7 @@ static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) namespace nr::gnb { -void GnbSraTask::handleCellInfoRequest(int ueId, const sra::SraCellInfoRequest &msg) +void GnbRlsTask::handleCellInfoRequest(int ueId, const rls::SraCellInfoRequest &msg) { int dbm = EstimateSimulatedDbm(m_base->config->phyLocation, msg.simPos); if (dbm < MIN_ALLOWED_DBM) @@ -37,7 +37,7 @@ void GnbSraTask::handleCellInfoRequest(int ueId, const sra::SraCellInfoRequest & return; } - sra::SraCellInfoResponse resp{m_sti}; + rls::SraCellInfoResponse resp{m_sti}; resp.cellId.nci = m_base->config->nci; resp.cellId.plmn = m_base->config->plmn; resp.tac = m_base->config->tac; @@ -48,19 +48,19 @@ void GnbSraTask::handleCellInfoRequest(int ueId, const sra::SraCellInfoRequest & sendSraMessage(ueId, resp); } -void GnbSraTask::handleUplinkPduDelivery(int ueId, sra::SraPduDelivery &msg) +void GnbRlsTask::handleUplinkPduDelivery(int ueId, rls::SraPduDelivery &msg) { - if (msg.pduType == sra::EPduType::RRC) + if (msg.pduType == rls::EPduType::RRC) { - auto *nw = new NwGnbSraToRrc(NwGnbSraToRrc::RRC_PDU_DELIVERY); + 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 == sra::EPduType::DATA) + else if (msg.pduType == rls::EPduType::DATA) { - auto *nw = new NwGnbSraToGtp(NwGnbSraToGtp::DATA_PDU_DELIVERY); + auto *nw = new NwGnbRlsToGtp(NwGnbRlsToGtp::DATA_PDU_DELIVERY); nw->ueId = ueId; nw->psi = msg.payload.get4I(0); nw->pdu = std::move(msg.pdu); @@ -68,9 +68,9 @@ void GnbSraTask::handleUplinkPduDelivery(int ueId, sra::SraPduDelivery &msg) } } -void GnbSraTask::handleDownlinkDelivery(int ueId, sra::EPduType pduType, OctetString &&pdu, OctetString &&payload) +void GnbRlsTask::handleDownlinkDelivery(int ueId, rls::EPduType pduType, OctetString &&pdu, OctetString &&payload) { - sra::SraPduDelivery resp{m_sti}; + rls::SraPduDelivery resp{m_sti}; resp.pduType = pduType; resp.pdu = std::move(pdu); resp.payload = std::move(payload); diff --git a/src/gnb/sra/management.cpp b/src/gnb/rls/management.cpp similarity index 90% rename from src/gnb/sra/management.cpp rename to src/gnb/rls/management.cpp index 6d7ffbf9e..a9e5a9865 100644 --- a/src/gnb/sra/management.cpp +++ b/src/gnb/rls/management.cpp @@ -16,7 +16,7 @@ static const int64_t LAST_SEEN_THRESHOLD = 3000; namespace nr::gnb { -int GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) +int GnbRlsTask::updateUeInfo(const InetAddress &addr, uint64_t sti) { if (m_stiToUeId.count(sti)) { @@ -41,7 +41,7 @@ int GnbSraTask::updateUeInfo(const InetAddress &addr, uint64_t sti) } } -void GnbSraTask::onPeriodicLostControl() +void GnbRlsTask::onPeriodicLostControl() { int64_t current = utils::CurrentTimeMillis(); @@ -64,7 +64,7 @@ void GnbSraTask::onPeriodicLostControl() m_ueCtx.erase(ueId); m_logger->debug("Signal lost detected for UE[%d]", ueId); - auto *w = new NwGnbSraToRrc(NwGnbSraToRrc::SIGNAL_LOST); + auto *w = new NwGnbRlsToRrc(NwGnbRlsToRrc::SIGNAL_LOST); w->ueId = ueId; m_base->rrcTask->push(w); } diff --git a/src/gnb/sra/task.cpp b/src/gnb/rls/task.cpp similarity index 72% rename from src/gnb/sra/task.cpp rename to src/gnb/rls/task.cpp index c161619f3..fc38b00a8 100644 --- a/src/gnb/sra/task.cpp +++ b/src/gnb/rls/task.cpp @@ -20,13 +20,14 @@ static const int TIMER_PERIOD_LOST_CONTROL = 2000; namespace nr::gnb { -GnbSraTask::GnbSraTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_ueCtx{}, m_stiToUeId{}, m_ueIdCounter{} +GnbRlsTask::GnbRlsTask(TaskBase *base) + : m_base{base}, m_udpTask{}, m_powerOn{}, m_ueCtx{}, m_stiToUeId{}, m_ueIdCounter{} { - m_logger = m_base->logBase->makeUniqueLogger("sra"); + m_logger = m_base->logBase->makeUniqueLogger("rls"); m_sti = utils::Random64(); } -void GnbSraTask::onStart() +void GnbRlsTask::onStart() { try { @@ -35,7 +36,7 @@ void GnbSraTask::onStart() } catch (const LibError &e) { - m_logger->err("SRA failure [%s]", e.what()); + m_logger->err("RLS failure [%s]", e.what()); quit(); return; } @@ -43,7 +44,7 @@ void GnbSraTask::onStart() setTimer(TIMER_ID_LOST_CONTROL, TIMER_PERIOD_LOST_CONTROL); } -void GnbSraTask::onLoop() +void GnbRlsTask::onLoop() { NtsMessage *msg = take(); if (!msg) @@ -51,28 +52,28 @@ void GnbSraTask::onLoop() switch (msg->msgType) { - case NtsMessageType::GNB_RRC_TO_SRA: { - auto *w = dynamic_cast(msg); + case NtsMessageType::GNB_RRC_TO_RLS: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbRrcToSra::RRC_PDU_DELIVERY: { - handleDownlinkDelivery(w->ueId, sra::EPduType::RRC, std::move(w->pdu), + case NwGnbRrcToRls::RRC_PDU_DELIVERY: { + handleDownlinkDelivery(w->ueId, rls::EPduType::RRC, std::move(w->pdu), OctetString::FromOctet4(static_cast(w->channel))); break; } - case NwGnbRrcToSra::RADIO_POWER_ON: { + case NwGnbRrcToRls::RADIO_POWER_ON: { m_powerOn = true; break; } } break; } - case NtsMessageType::GNB_GTP_TO_SRA: { - auto *w = dynamic_cast(msg); + case NtsMessageType::GNB_GTP_TO_RLS: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbGtpToSra::DATA_PDU_DELIVERY: { - handleDownlinkDelivery(w->ueId, sra::EPduType::DATA, std::move(w->pdu), + case NwGnbGtpToRls::DATA_PDU_DELIVERY: { + handleDownlinkDelivery(w->ueId, rls::EPduType::DATA, std::move(w->pdu), OctetString::FromOctet4(static_cast(w->psi))); break; } @@ -81,7 +82,7 @@ void GnbSraTask::onLoop() } case NtsMessageType::UDP_SERVER_RECEIVE: { auto *w = dynamic_cast(msg); - auto sraMsg = sra::DecodeSraMessage(OctetView{w->packet}); + auto sraMsg = rls::DecodeRlsMessage(OctetView{w->packet}); if (sraMsg == nullptr) { m_logger->err("Unable to decode SRA message"); @@ -107,7 +108,7 @@ void GnbSraTask::onLoop() delete msg; } -void GnbSraTask::onQuit() +void GnbRlsTask::onQuit() { if (m_udpTask != nullptr) m_udpTask->quit(); diff --git a/src/gnb/sra/task.hpp b/src/gnb/rls/task.hpp similarity index 72% rename from src/gnb/sra/task.hpp rename to src/gnb/rls/task.hpp index a02b5c42c..d12a04978 100644 --- a/src/gnb/sra/task.hpp +++ b/src/gnb/rls/task.hpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -22,7 +22,7 @@ namespace nr::gnb { -class GnbSraTask : public NtsTask +class GnbRlsTask : public NtsTask { private: TaskBase *m_base; @@ -38,8 +38,8 @@ class GnbSraTask : public NtsTask friend class GnbCmdHandler; public: - explicit GnbSraTask(TaskBase *base); - ~GnbSraTask() override = default; + explicit GnbRlsTask(TaskBase *base); + ~GnbRlsTask() override = default; protected: void onStart() override; @@ -47,13 +47,13 @@ class GnbSraTask : public NtsTask void onQuit() override; private: /* Transport */ - void receiveSraMessage(const InetAddress &addr, sra::SraMessage &msg); - void sendSraMessage(int ueId, const sra::SraMessage &msg); + void receiveSraMessage(const InetAddress &addr, rls::SraMessage &msg); + void sendSraMessage(int ueId, const rls::SraMessage &msg); private: /* Handler */ - void handleCellInfoRequest(int ueId, const sra::SraCellInfoRequest &msg); - void handleUplinkPduDelivery(int ueId, sra::SraPduDelivery &msg); - void handleDownlinkDelivery(int ueId, sra::EPduType pduType, OctetString &&pdu, OctetString &&payload); + void handleCellInfoRequest(int ueId, const rls::SraCellInfoRequest &msg); + void handleUplinkPduDelivery(int ueId, rls::SraPduDelivery &msg); + void handleDownlinkDelivery(int ueId, rls::EPduType pduType, OctetString &&pdu, OctetString &&payload); private: /* UE Management */ int updateUeInfo(const InetAddress &addr, uint64_t sti); diff --git a/src/gnb/sra/transport.cpp b/src/gnb/rls/transport.cpp similarity index 70% rename from src/gnb/sra/transport.cpp rename to src/gnb/rls/transport.cpp index d1b7ce6e0..140833565 100644 --- a/src/gnb/sra/transport.cpp +++ b/src/gnb/rls/transport.cpp @@ -11,7 +11,7 @@ namespace nr::gnb { -void GnbSraTask::receiveSraMessage(const InetAddress &addr, sra::SraMessage &msg) +void GnbRlsTask::receiveSraMessage(const InetAddress &addr, rls::SraMessage &msg) { if (!m_powerOn) { @@ -23,12 +23,12 @@ void GnbSraTask::receiveSraMessage(const InetAddress &addr, sra::SraMessage &msg switch (msg.msgType) { - case sra::EMessageType::CELL_INFO_REQUEST: { - handleCellInfoRequest(ueId, (const sra::SraCellInfoRequest &)msg); + case rls::EMessageType::CELL_INFO_REQUEST: { + handleCellInfoRequest(ueId, (const rls::SraCellInfoRequest &)msg); break; } - case sra::EMessageType::PDU_DELIVERY: { - handleUplinkPduDelivery(ueId, (sra::SraPduDelivery &)msg); + case rls::EMessageType::PDU_DELIVERY: { + handleUplinkPduDelivery(ueId, (rls::SraPduDelivery &)msg); break; } default: @@ -37,7 +37,7 @@ void GnbSraTask::receiveSraMessage(const InetAddress &addr, sra::SraMessage &msg } } -void GnbSraTask::sendSraMessage(int ueId, const sra::SraMessage &msg) +void GnbRlsTask::sendSraMessage(int ueId, const rls::SraMessage &msg) { if (!m_ueCtx.count(ueId)) { @@ -46,7 +46,7 @@ void GnbSraTask::sendSraMessage(int ueId, const sra::SraMessage &msg) } OctetString stream{}; - sra::EncodeSraMessage(msg, stream); + rls::EncodeRlsMessage(msg, stream); m_udpTask->send(m_ueCtx[ueId]->addr, stream); } diff --git a/src/gnb/rrc/channel.cpp b/src/gnb/rrc/channel.cpp index c0002f285..a004c5d1b 100644 --- a/src/gnb/rrc/channel.cpp +++ b/src/gnb/rrc/channel.cpp @@ -9,7 +9,7 @@ #include "task.hpp" #include #include -#include +#include #include namespace nr::gnb @@ -103,11 +103,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg) return; } - auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::BCCH_BCH; w->pdu = std::move(pdu); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg) @@ -119,11 +119,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg) return; } - auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::BCCH_DL_SCH; w->pdu = std::move(pdu); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg) @@ -135,11 +135,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg) return; } - auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::DL_CCCH; w->pdu = std::move(pdu); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg) @@ -151,11 +151,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg) return; } - auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::DL_DCCH; w->pdu = std::move(pdu); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg) @@ -167,11 +167,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg) return; } - auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::PCCH; w->pdu = std::move(pdu); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH_Message *msg) @@ -183,11 +183,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH_Message *msg) return; } - auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::UL_CCCH; w->pdu = std::move(pdu); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH1_Message *msg) @@ -199,11 +199,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH1_Message *msg) return; } - auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::UL_CCCH1; w->pdu = std::move(pdu); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_DCCH_Message *msg) @@ -215,11 +215,11 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_DCCH_Message *msg) return; } - auto *w = new NwGnbRrcToSra(NwGnbRrcToSra::RRC_PDU_DELIVERY); + auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); w->ueId = ueId; w->channel = rrc::RrcChannel::UL_DCCH; w->pdu = std::move(pdu); - m_base->sraTask->push(w); + m_base->rlsTask->push(w); } void GnbRrcTask::receiveRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg) diff --git a/src/gnb/rrc/task.cpp b/src/gnb/rrc/task.cpp index 6350af766..48b381d15 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include namespace nr::gnb @@ -38,15 +38,15 @@ void GnbRrcTask::onLoop() switch (msg->msgType) { - case NtsMessageType::GNB_SRA_TO_RRC: { - auto *w = dynamic_cast(msg); + case NtsMessageType::GNB_RLS_TO_RRC: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwGnbSraToRrc::RRC_PDU_DELIVERY: { + case NwGnbRlsToRrc::RRC_PDU_DELIVERY: { handleUplinkRrc(w->ueId, w->channel, w->pdu); break; } - case NwGnbSraToRrc::SIGNAL_LOST: { + case NwGnbRlsToRrc::SIGNAL_LOST: { handleRadioLinkFailure(w->ueId); break; } @@ -58,7 +58,7 @@ void GnbRrcTask::onLoop() switch (w->present) { case NwGnbNgapToRrc::RADIO_POWER_ON: { - m_base->sraTask->push(new NwGnbRrcToSra(NwGnbRrcToSra::RADIO_POWER_ON)); + m_base->rlsTask->push(new NwGnbRrcToRls(NwGnbRrcToRls::RADIO_POWER_ON)); break; } case NwGnbNgapToRrc::NAS_DELIVERY: { diff --git a/src/gnb/types.hpp b/src/gnb/types.hpp index 74743a3e5..fd3e703b9 100644 --- a/src/gnb/types.hpp +++ b/src/gnb/types.hpp @@ -26,7 +26,7 @@ class GnbAppTask; class GtpTask; class NgapTask; class GnbRrcTask; -class GnbSraTask; +class GnbRlsTask; class SctpTask; enum class EAmfState @@ -337,7 +337,7 @@ struct TaskBase NgapTask *ngapTask{}; GnbRrcTask *rrcTask{}; SctpTask *sctpTask{}; - GnbSraTask *sraTask{}; + GnbRlsTask *rlsTask{}; }; Json ToJson(const GnbStatusInfo &v); diff --git a/src/ue/app/cmd_handler.cpp b/src/ue/app/cmd_handler.cpp index 2f9ef070c..5863d4fdd 100644 --- a/src/ue/app/cmd_handler.cpp +++ b/src/ue/app/cmd_handler.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include @@ -47,14 +47,14 @@ void UeCmdHandler::pauseTasks() { m_base->nasTask->requestPause(); m_base->rrcTask->requestPause(); - m_base->sraTask->requestPause(); + m_base->rlsTask->requestPause(); } void UeCmdHandler::unpauseTasks() { m_base->nasTask->requestUnpause(); m_base->rrcTask->requestUnpause(); - m_base->sraTask->requestUnpause(); + m_base->rlsTask->requestUnpause(); } bool UeCmdHandler::isAllPaused() @@ -63,7 +63,7 @@ bool UeCmdHandler::isAllPaused() return false; if (!m_base->rrcTask->isPauseConfirmed()) return false; - if (!m_base->sraTask->isPauseConfirmed()) + if (!m_base->rlsTask->isPauseConfirmed()) return false; return true; } @@ -115,7 +115,7 @@ 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)}, {"camped-cell", - ::ToJson(m_base->sraTask->m_servingCell.has_value() ? m_base->sraTask->m_servingCell->gnbName : "")}, + ::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)}, @@ -164,7 +164,7 @@ void UeCmdHandler::handleCmdImpl(NwUeCliCommand &msg) break; } case app::UeCliCommand::COVERAGE: { - auto &map = m_base->sraTask->m_activeMeasurements; + auto &map = m_base->rlsTask->m_activeMeasurements; if (map.empty()) { sendResult(msg.address, "No cell exists in the range"); diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index 72fca0754..6f15ffa18 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -9,7 +9,7 @@ #include "task.hpp" #include "cmd_handler.hpp" #include -#include +#include #include #include #include @@ -50,11 +50,11 @@ void UeAppTask::onLoop() switch (msg->msgType) { - case NtsMessageType::UE_SRA_TO_APP: { - auto *w = dynamic_cast(msg); + case NtsMessageType::UE_RLS_TO_APP: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeSraToApp::DATA_PDU_DELIVERY: { + case NwUeRlsToApp::DATA_PDU_DELIVERY: { auto *tunTask = m_tunTasks[w->psi]; if (tunTask) { @@ -226,10 +226,10 @@ void UeAppTask::handleUplinkDataRequest(int psi, OctetString &&data) { if (m_cmState == ECmState::CM_CONNECTED) { - auto *nw = new NwUeAppToSra(NwUeAppToSra::DATA_PDU_DELIVERY); + auto *nw = new NwUeAppToRls(NwUeAppToRls::DATA_PDU_DELIVERY); nw->psi = psi; nw->pdu = std::move(data); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } else { diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 3e9531f38..6d6603f3f 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -110,7 +110,7 @@ struct NwUeNasToRrc : NtsMessage } }; -struct NwUeRrcToSra : NtsMessage +struct NwUeRrcToRls : NtsMessage { enum PR { @@ -127,12 +127,12 @@ struct NwUeRrcToSra : NtsMessage rrc::RrcChannel channel{}; OctetString pdu{}; - explicit NwUeRrcToSra(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_SRA), present(present) + explicit NwUeRrcToRls(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_RLS), present(present) { } }; -struct NwUeSraToRrc : NtsMessage +struct NwUeRlsToRrc : NtsMessage { enum PR { @@ -152,7 +152,7 @@ struct NwUeSraToRrc : NtsMessage rrc::RrcChannel channel{}; OctetString pdu{}; - explicit NwUeSraToRrc(PR present) : NtsMessage(NtsMessageType::UE_SRA_TO_RRC), present(present) + explicit NwUeRlsToRrc(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_RRC), present(present) { } }; @@ -186,7 +186,7 @@ struct NwUeNasToApp : NtsMessage } }; -struct NwUeAppToSra : NtsMessage +struct NwUeAppToRls : NtsMessage { enum PR { @@ -197,12 +197,12 @@ struct NwUeAppToSra : NtsMessage int psi{}; OctetString pdu{}; - explicit NwUeAppToSra(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_SRA), present(present) + explicit NwUeAppToRls(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_RLS), present(present) { } }; -struct NwUeSraToApp : NtsMessage +struct NwUeRlsToApp : NtsMessage { enum PR { @@ -213,7 +213,7 @@ struct NwUeSraToApp : NtsMessage int psi{}; OctetString pdu{}; - explicit NwUeSraToApp(PR present) : NtsMessage(NtsMessageType::UE_SRA_TO_APP), present(present) + explicit NwUeRlsToApp(PR present) : NtsMessage(NtsMessageType::UE_RLS_TO_APP), present(present) { } }; diff --git a/src/ue/sra/measurement.cpp b/src/ue/rls/measurement.cpp similarity index 84% rename from src/ue/sra/measurement.cpp rename to src/ue/rls/measurement.cpp index 85b2063d2..b7b50d01d 100644 --- a/src/ue/sra/measurement.cpp +++ b/src/ue/rls/measurement.cpp @@ -14,7 +14,7 @@ namespace nr::ue { -void UeSraTask::onMeasurement() +void UeRlsTask::onMeasurement() { std::vector entered{}; std::vector exited{}; @@ -41,12 +41,12 @@ void UeSraTask::onMeasurement() // Issue another cell info request for each address in the search space for (auto &ip : m_cellSearchSpace) { - sra::SraCellInfoRequest req{m_sti}; - sendSraMessage(ip, req); + rls::SraCellInfoRequest req{m_sti}; + sendRlsMessage(ip, req); } } -void UeSraTask::receiveCellInfoResponse(const sra::SraCellInfoResponse &msg) +void UeRlsTask::receiveCellInfoResponse(const rls::SraCellInfoResponse &msg) { UeCellMeasurement meas{}; meas.sti = msg.sti; @@ -59,7 +59,7 @@ void UeSraTask::receiveCellInfoResponse(const sra::SraCellInfoResponse &msg) m_pendingMeasurements[meas.cellId] = meas; } -void UeSraTask::onCoverageChange(const std::vector &entered, const std::vector &exited) +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())); @@ -71,22 +71,22 @@ void UeSraTask::onCoverageChange(const std::vector &entered, const st { m_logger->warn("Signal lost from camped cell"); m_servingCell = std::nullopt; - m_base->rrcTask->push(new NwUeSraToRrc(NwUeSraToRrc::RADIO_LINK_FAILURE)); + m_base->rrcTask->push(new NwUeRlsToRrc(NwUeRlsToRrc::RADIO_LINK_FAILURE)); } } -void UeSraTask::plmnSearchRequested() +void UeRlsTask::plmnSearchRequested() { std::vector measurements{}; for (auto &m : m_activeMeasurements) measurements.push_back(m.second); - auto *w = new NwUeSraToRrc(NwUeSraToRrc::PLMN_SEARCH_RESPONSE); + auto *w = new NwUeRlsToRrc(NwUeRlsToRrc::PLMN_SEARCH_RESPONSE); w->measurements = std::move(measurements); m_base->rrcTask->push(w); } -void UeSraTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) +void UeRlsTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) { if (!m_activeMeasurements.count(cellId)) { @@ -104,7 +104,7 @@ void UeSraTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuita m_servingCell->linkIp = measurement.linkIp; m_servingCell->cellCategory = isSuitable ? ECellCategory::SUITABLE_CELL : ECellCategory::ACCEPTABLE_CELL; - auto *w = new NwUeSraToRrc(NwUeSraToRrc::SERVING_CELL_CHANGE); + auto *w = new NwUeRlsToRrc(NwUeRlsToRrc::SERVING_CELL_CHANGE); w->servingCell = *m_servingCell; m_base->rrcTask->push(w); } diff --git a/src/ue/sra/task.cpp b/src/ue/rls/task.cpp similarity index 73% rename from src/ue/sra/task.cpp rename to src/ue/rls/task.cpp index 04c876d14..95a58302a 100644 --- a/src/ue/sra/task.cpp +++ b/src/ue/rls/task.cpp @@ -17,7 +17,7 @@ static const int TIMER_PERIOD_MEASUREMENT = 2000; namespace nr::ue { -UeSraTask::UeSraTask(TaskBase *base) +UeRlsTask::UeRlsTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{}, m_servingCell{} { m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "sra"); @@ -28,7 +28,7 @@ UeSraTask::UeSraTask(TaskBase *base) m_sti = utils::Random64(); } -void UeSraTask::onStart() +void UeRlsTask::onStart() { m_udpTask = new udp::UdpServerTask(this); @@ -42,7 +42,7 @@ void UeSraTask::onStart() onMeasurement(); } -void UeSraTask::onLoop() +void UeRlsTask::onLoop() { NtsMessage *msg = take(); if (!msg) @@ -50,29 +50,29 @@ void UeSraTask::onLoop() switch (msg->msgType) { - case NtsMessageType::UE_RRC_TO_SRA: { - auto *w = dynamic_cast(msg); + case NtsMessageType::UE_RRC_TO_RLS: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeRrcToSra::PLMN_SEARCH_REQUEST: + case NwUeRrcToRls::PLMN_SEARCH_REQUEST: plmnSearchRequested(); break; - case NwUeRrcToSra::CELL_SELECTION_COMMAND: + case NwUeRrcToRls::CELL_SELECTION_COMMAND: handleCellSelectionCommand(w->cellId, w->isSuitableCell); break; - case NwUeRrcToSra::RRC_PDU_DELIVERY: - deliverUplinkPdu(sra::EPduType::RRC, std::move(w->pdu), + case NwUeRrcToRls::RRC_PDU_DELIVERY: + deliverUplinkPdu(rls::EPduType::RRC, std::move(w->pdu), OctetString::FromOctet4(static_cast(w->channel))); break; } break; } - case NtsMessageType::UE_APP_TO_SRA: { - auto *w = dynamic_cast(msg); + case NtsMessageType::UE_APP_TO_RLS: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeAppToSra::DATA_PDU_DELIVERY: { - deliverUplinkPdu(sra::EPduType::DATA, std::move(w->pdu), OctetString::FromOctet4(static_cast(w->psi))); + case NwUeAppToRls::DATA_PDU_DELIVERY: { + deliverUplinkPdu(rls::EPduType::DATA, std::move(w->pdu), OctetString::FromOctet4(static_cast(w->psi))); break; } } @@ -89,13 +89,13 @@ void UeSraTask::onLoop() } case NtsMessageType::UDP_SERVER_RECEIVE: { auto *w = dynamic_cast(msg); - auto sraMsg = sra::DecodeSraMessage(OctetView{w->packet}); - if (sraMsg == nullptr) + auto rlsMsg = rls::DecodeRlsMessage(OctetView{w->packet}); + if (rlsMsg == nullptr) { - m_logger->err("Unable to decode SRA message"); + m_logger->err("Unable to decode RLS message"); break; } - receiveSraMessage(w->fromAddress, *sraMsg); + receiveRlsMessage(w->fromAddress, *rlsMsg); break; } default: @@ -106,7 +106,7 @@ void UeSraTask::onLoop() delete msg; } -void UeSraTask::onQuit() +void UeRlsTask::onQuit() { m_udpTask->quit(); delete m_udpTask; diff --git a/src/ue/sra/task.hpp b/src/ue/rls/task.hpp similarity index 76% rename from src/ue/sra/task.hpp rename to src/ue/rls/task.hpp index 6cc6a0170..b5435d220 100644 --- a/src/ue/sra/task.hpp +++ b/src/ue/rls/task.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include @@ -24,7 +24,7 @@ namespace nr::ue { -class UeSraTask : public NtsTask +class UeRlsTask : public NtsTask { private: TaskBase *m_base; @@ -41,8 +41,8 @@ class UeSraTask : public NtsTask friend class UeCmdHandler; public: - explicit UeSraTask(TaskBase *base); - ~UeSraTask() override = default; + explicit UeRlsTask(TaskBase *base); + ~UeRlsTask() override = default; protected: void onStart() override; @@ -50,14 +50,14 @@ class UeSraTask : public NtsTask void onQuit() override; private: /* Transport */ - void receiveSraMessage(const InetAddress &address, sra::SraMessage &msg); - void sendSraMessage(const InetAddress &address, const sra::SraMessage &msg); - void deliverUplinkPdu(sra::EPduType pduType, OctetString &&pdu, OctetString &&payload); - void deliverDownlinkPdu(sra::SraPduDelivery &msg); + void receiveRlsMessage(const InetAddress &address, rls::SraMessage &msg); + void sendRlsMessage(const InetAddress &address, const rls::SraMessage &msg); + void deliverUplinkPdu(rls::EPduType pduType, OctetString &&pdu, OctetString &&payload); + void deliverDownlinkPdu(rls::SraPduDelivery &msg); private: /* Measurement */ void onMeasurement(); - void receiveCellInfoResponse(const sra::SraCellInfoResponse &msg); + void receiveCellInfoResponse(const rls::SraCellInfoResponse &msg); void onCoverageChange(const std::vector &entered, const std::vector &exited); void plmnSearchRequested(); void handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable); diff --git a/src/ue/sra/transport.cpp b/src/ue/rls/transport.cpp similarity index 59% rename from src/ue/sra/transport.cpp rename to src/ue/rls/transport.cpp index cfe3d97a1..8c87006c0 100644 --- a/src/ue/sra/transport.cpp +++ b/src/ue/rls/transport.cpp @@ -15,15 +15,15 @@ namespace nr::ue { -void UeSraTask::receiveSraMessage(const InetAddress &address, sra::SraMessage &msg) +void UeRlsTask::receiveRlsMessage(const InetAddress &address, rls::SraMessage &msg) { switch (msg.msgType) { - case sra::EMessageType::CELL_INFO_RESPONSE: { - receiveCellInfoResponse((const sra::SraCellInfoResponse &)msg); + case rls::EMessageType::CELL_INFO_RESPONSE: { + receiveCellInfoResponse((const rls::SraCellInfoResponse &)msg); break; - case sra::EMessageType::PDU_DELIVERY: { - deliverDownlinkPdu((sra::SraPduDelivery &)msg); + case rls::EMessageType::PDU_DELIVERY: { + deliverDownlinkPdu((rls::SraPduDelivery &)msg); break; } default: @@ -33,14 +33,14 @@ void UeSraTask::receiveSraMessage(const InetAddress &address, sra::SraMessage &m } } -void UeSraTask::sendSraMessage(const InetAddress &address, const sra::SraMessage &msg) +void UeRlsTask::sendRlsMessage(const InetAddress &address, const rls::SraMessage &msg) { OctetString stream{}; - sra::EncodeSraMessage(msg, stream); + rls::EncodeRlsMessage(msg, stream); m_udpTask->send(address, stream); } -void UeSraTask::deliverUplinkPdu(sra::EPduType pduType, OctetString &&pdu, OctetString &&payload) +void UeRlsTask::deliverUplinkPdu(rls::EPduType pduType, OctetString &&pdu, OctetString &&payload) { if (!m_servingCell.has_value()) { @@ -48,25 +48,25 @@ void UeSraTask::deliverUplinkPdu(sra::EPduType pduType, OctetString &&pdu, Octet return; } - sra::SraPduDelivery msg{m_sti}; + rls::SraPduDelivery msg{m_sti}; msg.pduType = pduType; msg.pdu = std::move(pdu); msg.payload = std::move(payload); - sendSraMessage(InetAddress{m_servingCell->linkIp, cons::PortalPort}, msg); + sendRlsMessage(InetAddress{m_servingCell->linkIp, cons::PortalPort}, msg); } -void UeSraTask::deliverDownlinkPdu(sra::SraPduDelivery &msg) +void UeRlsTask::deliverDownlinkPdu(rls::SraPduDelivery &msg) { - if (msg.pduType == sra::EPduType::RRC) + if (msg.pduType == rls::EPduType::RRC) { - auto *nw = new NwUeSraToRrc(NwUeSraToRrc::RRC_PDU_DELIVERY); + 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 == sra::EPduType::DATA) + else if (msg.pduType == rls::EPduType::DATA) { - auto *nw = new NwUeSraToApp(NwUeSraToApp::DATA_PDU_DELIVERY); + 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); diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index d32557ed4..ac0ffb143 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -9,7 +9,7 @@ #include "task.hpp" #include -#include +#include #include #include @@ -107,10 +107,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) return; } - auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::BCCH_BCH; nw->pdu = std::move(pdu); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg) @@ -122,10 +122,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg) return; } - auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::BCCH_DL_SCH; nw->pdu = std::move(pdu); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_DL_CCCH_Message *msg) @@ -137,10 +137,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_DL_CCCH_Message *msg) return; } - auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::DL_CCCH; nw->pdu = std::move(pdu); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_DL_DCCH_Message *msg) @@ -152,10 +152,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_DL_DCCH_Message *msg) return; } - auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::DL_DCCH; nw->pdu = std::move(pdu); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_PCCH_Message *msg) @@ -167,10 +167,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_PCCH_Message *msg) return; } - auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::PCCH; nw->pdu = std::move(pdu); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg) @@ -182,10 +182,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH_Message *msg) return; } - auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::UL_CCCH; nw->pdu = std::move(pdu); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg) @@ -197,10 +197,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_CCCH1_Message *msg) return; } - auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::UL_CCCH1; nw->pdu = std::move(pdu); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) @@ -212,10 +212,10 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_UL_DCCH_Message *msg) return; } - auto *nw = new NwUeRrcToSra(NwUeRrcToSra::RRC_PDU_DELIVERY); + auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); nw->channel = rrc::RrcChannel::UL_DCCH; nw->pdu = std::move(pdu); - m_base->sraTask->push(nw); + m_base->rlsTask->push(nw); } void UeRrcTask::receiveRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index f488fb527..d99c4bb89 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include namespace nr::ue @@ -49,7 +49,7 @@ void UeRrcTask::onLoop() switch (w->present) { case NwUeNasToRrc::PLMN_SEARCH_REQUEST: { - m_base->sraTask->push(new NwUeRrcToSra(NwUeRrcToSra::PLMN_SEARCH_REQUEST)); + m_base->rlsTask->push(new NwUeRrcToRls(NwUeRrcToRls::PLMN_SEARCH_REQUEST)); break; } case NwUeNasToRrc::INITIAL_NAS_DELIVERY: { @@ -66,36 +66,36 @@ void UeRrcTask::onLoop() break; } case NwUeNasToRrc::CELL_SELECTION_COMMAND: { - auto *wr = new NwUeRrcToSra(NwUeRrcToSra::CELL_SELECTION_COMMAND); + auto *wr = new NwUeRrcToRls(NwUeRrcToRls::CELL_SELECTION_COMMAND); wr->cellId = w->cellId; wr->isSuitableCell = w->isSuitableCell; - m_base->sraTask->push(wr); + m_base->rlsTask->push(wr); break; } } break; } - case NtsMessageType::UE_SRA_TO_RRC: { - auto *w = dynamic_cast(msg); + case NtsMessageType::UE_RLS_TO_RRC: { + auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeSraToRrc::PLMN_SEARCH_RESPONSE: { + 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 NwUeSraToRrc::SERVING_CELL_CHANGE: { + case NwUeRlsToRrc::SERVING_CELL_CHANGE: { auto *wr = new NwUeRrcToNas(NwUeRrcToNas::SERVING_CELL_CHANGE); wr->servingCell = w->servingCell; m_base->nasTask->push(wr); break; } - case NwUeSraToRrc::RRC_PDU_DELIVERY: { + case NwUeRlsToRrc::RRC_PDU_DELIVERY: { handleDownlinkRrc(w->channel, w->pdu); break; } - case NwUeSraToRrc::RADIO_LINK_FAILURE: { + case NwUeRlsToRrc::RADIO_LINK_FAILURE: { handleRadioLinkFailure(); break; } diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 92d52406d..dd51a3ea0 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -26,7 +26,7 @@ namespace nr::ue class UeAppTask; class NasTask; class UeRrcTask; -class UeSraTask; +class UeRlsTask; class UserEquipment; struct SupportedAlgs @@ -124,7 +124,7 @@ struct TaskBase UeAppTask *appTask{}; NasTask *nasTask{}; UeRrcTask *rrcTask{}; - UeSraTask *sraTask{}; + UeRlsTask *rlsTask{}; }; struct UeTimers diff --git a/src/ue/ue.cpp b/src/ue/ue.cpp index 5749e49c5..47fb14d53 100644 --- a/src/ue/ue.cpp +++ b/src/ue/ue.cpp @@ -9,9 +9,9 @@ #include "ue.hpp" #include "app/task.hpp" -#include "sra/task.hpp" #include "nas/task.hpp" #include "rrc/task.hpp" +#include "rls/task.hpp" namespace nr::ue { @@ -30,7 +30,7 @@ UserEquipment::UserEquipment(UeConfig *config, app::IUeController *ueController, base->nasTask = new NasTask(base); base->rrcTask = new UeRrcTask(base); base->appTask = new UeAppTask(base); - base->sraTask = new UeSraTask(base); + base->rlsTask = new UeRlsTask(base); taskBase = base; } @@ -39,12 +39,12 @@ UserEquipment::~UserEquipment() { taskBase->nasTask->quit(); taskBase->rrcTask->quit(); - taskBase->sraTask->quit(); + taskBase->rlsTask->quit(); taskBase->appTask->quit(); delete taskBase->nasTask; delete taskBase->rrcTask; - delete taskBase->sraTask; + delete taskBase->rlsTask; delete taskBase->appTask; delete taskBase->logBase; @@ -56,7 +56,7 @@ void UserEquipment::start() { taskBase->nasTask->start(); taskBase->rrcTask->start(); - taskBase->sraTask->start(); + taskBase->rlsTask->start(); taskBase->appTask->start(); } diff --git a/src/urs/sra_pdu.cpp b/src/urs/rls_pdu.cpp similarity index 95% rename from src/urs/sra_pdu.cpp rename to src/urs/rls_pdu.cpp index 091860b27..ed91e8e6a 100644 --- a/src/urs/sra_pdu.cpp +++ b/src/urs/rls_pdu.cpp @@ -6,10 +6,10 @@ // and subject to the terms and conditions defined in LICENSE file. // -#include "sra_pdu.hpp" +#include "rls_pdu.hpp" #include -namespace sra +namespace rls { static void AppendPlmn(const Plmn &plmn, OctetString &stream) @@ -42,7 +42,7 @@ static GlobalNci DecodeGlobalNci(const OctetView &stream) return res; } -void EncodeSraMessage(const SraMessage &msg, OctetString &stream) +void EncodeRlsMessage(const SraMessage &msg, OctetString &stream) { stream.appendOctet(0x03); // (Just for old RLS compatibility) @@ -80,7 +80,7 @@ void EncodeSraMessage(const SraMessage &msg, OctetString &stream) } } -std::unique_ptr DecodeSraMessage(const OctetView &stream) +std::unique_ptr DecodeRlsMessage(const OctetView &stream) { auto first = stream.readI(); // (Just for old RLS compatibility) if (first != 3) diff --git a/src/urs/sra_pdu.hpp b/src/urs/rls_pdu.hpp similarity index 91% rename from src/urs/sra_pdu.hpp rename to src/urs/rls_pdu.hpp index 283f770cc..8fecc4fae 100644 --- a/src/urs/sra_pdu.hpp +++ b/src/urs/rls_pdu.hpp @@ -14,7 +14,7 @@ #include #include -namespace sra +namespace rls { enum class EMessageType : uint8_t @@ -75,7 +75,7 @@ struct SraPduDelivery : SraMessage } }; -void EncodeSraMessage(const SraMessage &msg, OctetString &stream); -std::unique_ptr DecodeSraMessage(const OctetView &stream); +void EncodeRlsMessage(const SraMessage &msg, OctetString &stream); +std::unique_ptr DecodeRlsMessage(const OctetView &stream); } // namespace sra \ No newline at end of file diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index f49d477fc..80b5bfe5c 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -34,24 +34,24 @@ enum class NtsMessageType UDP_SERVER_RECEIVE, CLI_SEND_RESPONSE, - GNB_SRA_TO_RRC, - GNB_SRA_TO_GTP, - GNB_GTP_TO_SRA, - GNB_RRC_TO_SRA, + GNB_RLS_TO_RRC, + GNB_RLS_TO_GTP, + GNB_GTP_TO_RLS, + GNB_RRC_TO_RLS, GNB_NGAP_TO_RRC, GNB_RRC_TO_NGAP, GNB_NGAP_TO_GTP, GNB_SCTP, - UE_APP_TO_SRA, + UE_APP_TO_RLS, UE_APP_TO_TUN, UE_TUN_TO_APP, UE_RRC_TO_NAS, UE_NAS_TO_RRC, - UE_RRC_TO_SRA, + UE_RRC_TO_RLS, UE_NAS_TO_NAS, - UE_SRA_TO_RRC, - UE_SRA_TO_APP, + UE_RLS_TO_RRC, + UE_RLS_TO_APP, UE_NAS_TO_APP, }; From 9d6b4b0c5badc4c5a4e39d7cb37690dcefe0beac Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 20:03:10 +0300 Subject: [PATCH 053/116] name refactor: SRA -> RLS --- src/gnb/rls/handler.cpp | 12 ++++++------ src/gnb/rls/management.cpp | 2 +- src/gnb/rls/task.cpp | 8 ++++---- src/gnb/rls/task.hpp | 10 +++++----- src/gnb/rls/transport.cpp | 14 +++++++------- src/gnb/types.hpp | 4 ++-- src/ue/rls/measurement.cpp | 4 ++-- src/ue/rls/task.cpp | 2 +- src/ue/rls/task.hpp | 8 ++++---- src/ue/rls/transport.cpp | 16 ++++++++-------- src/urs/rls_pdu.cpp | 18 +++++++++--------- src/urs/rls_pdu.hpp | 22 +++++++++++----------- 12 files changed, 60 insertions(+), 60 deletions(-) diff --git a/src/gnb/rls/handler.cpp b/src/gnb/rls/handler.cpp index 1d8722fb8..0247dc3e8 100644 --- a/src/gnb/rls/handler.cpp +++ b/src/gnb/rls/handler.cpp @@ -28,7 +28,7 @@ static int EstimateSimulatedDbm(const Vector3 &myPos, const Vector3 &uePos) namespace nr::gnb { -void GnbRlsTask::handleCellInfoRequest(int ueId, const rls::SraCellInfoRequest &msg) +void GnbRlsTask::handleCellInfoRequest(int ueId, const rls::RlsCellInfoRequest &msg) { int dbm = EstimateSimulatedDbm(m_base->config->phyLocation, msg.simPos); if (dbm < MIN_ALLOWED_DBM) @@ -37,7 +37,7 @@ void GnbRlsTask::handleCellInfoRequest(int ueId, const rls::SraCellInfoRequest & return; } - rls::SraCellInfoResponse resp{m_sti}; + 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; @@ -45,10 +45,10 @@ void GnbRlsTask::handleCellInfoRequest(int ueId, const rls::SraCellInfoRequest & resp.gnbName = m_base->config->name; resp.linkIp = m_base->config->portalIp; - sendSraMessage(ueId, resp); + sendRlsMessage(ueId, resp); } -void GnbRlsTask::handleUplinkPduDelivery(int ueId, rls::SraPduDelivery &msg) +void GnbRlsTask::handleUplinkPduDelivery(int ueId, rls::RlsPduDelivery &msg) { if (msg.pduType == rls::EPduType::RRC) { @@ -70,11 +70,11 @@ void GnbRlsTask::handleUplinkPduDelivery(int ueId, rls::SraPduDelivery &msg) void GnbRlsTask::handleDownlinkDelivery(int ueId, rls::EPduType pduType, OctetString &&pdu, OctetString &&payload) { - rls::SraPduDelivery resp{m_sti}; + rls::RlsPduDelivery resp{m_sti}; resp.pduType = pduType; resp.pdu = std::move(pdu); resp.payload = std::move(payload); - sendSraMessage(ueId, resp); + sendRlsMessage(ueId, resp); } } // namespace nr::gnb diff --git a/src/gnb/rls/management.cpp b/src/gnb/rls/management.cpp index a9e5a9865..193dda79b 100644 --- a/src/gnb/rls/management.cpp +++ b/src/gnb/rls/management.cpp @@ -30,7 +30,7 @@ int GnbRlsTask::updateUeInfo(const InetAddress &addr, uint64_t sti) { int ueId = ++m_ueIdCounter; m_stiToUeId[sti] = ueId; - auto ctx = std::make_unique(ueId); + auto ctx = std::make_unique(ueId); ctx->sti = sti; ctx->addr = addr; ctx->lastSeen = utils::CurrentTimeMillis(); diff --git a/src/gnb/rls/task.cpp b/src/gnb/rls/task.cpp index fc38b00a8..1ac19793f 100644 --- a/src/gnb/rls/task.cpp +++ b/src/gnb/rls/task.cpp @@ -82,13 +82,13 @@ void GnbRlsTask::onLoop() } case NtsMessageType::UDP_SERVER_RECEIVE: { auto *w = dynamic_cast(msg); - auto sraMsg = rls::DecodeRlsMessage(OctetView{w->packet}); - if (sraMsg == nullptr) + auto rlsMsg = rls::DecodeRlsMessage(OctetView{w->packet}); + if (rlsMsg == nullptr) { - m_logger->err("Unable to decode SRA message"); + m_logger->err("Unable to decode RLS message"); break; } - receiveSraMessage(w->fromAddress, *sraMsg); + receiveRlsMessage(w->fromAddress, *rlsMsg); break; } case NtsMessageType::TIMER_EXPIRED: { diff --git a/src/gnb/rls/task.hpp b/src/gnb/rls/task.hpp index d12a04978..f5b378095 100644 --- a/src/gnb/rls/task.hpp +++ b/src/gnb/rls/task.hpp @@ -31,7 +31,7 @@ class GnbRlsTask : public NtsTask bool m_powerOn; uint64_t m_sti; - std::unordered_map> m_ueCtx; + std::unordered_map> m_ueCtx; std::unordered_map m_stiToUeId; int m_ueIdCounter; @@ -47,12 +47,12 @@ class GnbRlsTask : public NtsTask void onQuit() override; private: /* Transport */ - void receiveSraMessage(const InetAddress &addr, rls::SraMessage &msg); - void sendSraMessage(int ueId, const rls::SraMessage &msg); + void receiveRlsMessage(const InetAddress &addr, rls::RlsMessage &msg); + void sendRlsMessage(int ueId, const rls::RlsMessage &msg); private: /* Handler */ - void handleCellInfoRequest(int ueId, const rls::SraCellInfoRequest &msg); - void handleUplinkPduDelivery(int ueId, rls::SraPduDelivery &msg); + 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 */ diff --git a/src/gnb/rls/transport.cpp b/src/gnb/rls/transport.cpp index 140833565..43eeaaa97 100644 --- a/src/gnb/rls/transport.cpp +++ b/src/gnb/rls/transport.cpp @@ -11,11 +11,11 @@ namespace nr::gnb { -void GnbRlsTask::receiveSraMessage(const InetAddress &addr, rls::SraMessage &msg) +void GnbRlsTask::receiveRlsMessage(const InetAddress &addr, rls::RlsMessage &msg) { if (!m_powerOn) { - // ignore received SRA message + // ignore received RLS message return; } @@ -24,24 +24,24 @@ void GnbRlsTask::receiveSraMessage(const InetAddress &addr, rls::SraMessage &msg switch (msg.msgType) { case rls::EMessageType::CELL_INFO_REQUEST: { - handleCellInfoRequest(ueId, (const rls::SraCellInfoRequest &)msg); + handleCellInfoRequest(ueId, (const rls::RlsCellInfoRequest &)msg); break; } case rls::EMessageType::PDU_DELIVERY: { - handleUplinkPduDelivery(ueId, (rls::SraPduDelivery &)msg); + handleUplinkPduDelivery(ueId, (rls::RlsPduDelivery &)msg); break; } default: - m_logger->err("Unhandled SRA message received with type[%d]", static_cast(msg.msgType)); + m_logger->err("Unhandled RLS message received with type[%d]", static_cast(msg.msgType)); break; } } -void GnbRlsTask::sendSraMessage(int ueId, const rls::SraMessage &msg) +void GnbRlsTask::sendRlsMessage(int ueId, const rls::RlsMessage &msg) { if (!m_ueCtx.count(ueId)) { - m_logger->err("SRA message sending failure, UE[%d] not exists", ueId); + m_logger->err("RLS message sending failure, UE[%d] not exists", ueId); return; } diff --git a/src/gnb/types.hpp b/src/gnb/types.hpp index fd3e703b9..bad4bd96b 100644 --- a/src/gnb/types.hpp +++ b/src/gnb/types.hpp @@ -104,14 +104,14 @@ struct NgapAmfContext std::vector plmnSupportList{}; }; -struct SraUeContext +struct RlsUeContext { const int ueId; uint64_t sti{}; InetAddress addr{}; int64_t lastSeen{}; - explicit SraUeContext(int ueId) : ueId(ueId) + explicit RlsUeContext(int ueId) : ueId(ueId) { } }; diff --git a/src/ue/rls/measurement.cpp b/src/ue/rls/measurement.cpp index b7b50d01d..cc84f6c5e 100644 --- a/src/ue/rls/measurement.cpp +++ b/src/ue/rls/measurement.cpp @@ -41,12 +41,12 @@ void UeRlsTask::onMeasurement() // Issue another cell info request for each address in the search space for (auto &ip : m_cellSearchSpace) { - rls::SraCellInfoRequest req{m_sti}; + rls::RlsCellInfoRequest req{m_sti}; sendRlsMessage(ip, req); } } -void UeRlsTask::receiveCellInfoResponse(const rls::SraCellInfoResponse &msg) +void UeRlsTask::receiveCellInfoResponse(const rls::RlsCellInfoResponse &msg) { UeCellMeasurement meas{}; meas.sti = msg.sti; diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 95a58302a..7d629227e 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -20,7 +20,7 @@ namespace nr::ue UeRlsTask::UeRlsTask(TaskBase *base) : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{}, m_servingCell{} { - m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "sra"); + 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); diff --git a/src/ue/rls/task.hpp b/src/ue/rls/task.hpp index b5435d220..b56c35be3 100644 --- a/src/ue/rls/task.hpp +++ b/src/ue/rls/task.hpp @@ -50,14 +50,14 @@ class UeRlsTask : public NtsTask void onQuit() override; private: /* Transport */ - void receiveRlsMessage(const InetAddress &address, rls::SraMessage &msg); - void sendRlsMessage(const InetAddress &address, const rls::SraMessage &msg); + 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::SraPduDelivery &msg); + void deliverDownlinkPdu(rls::RlsPduDelivery &msg); private: /* Measurement */ void onMeasurement(); - void receiveCellInfoResponse(const rls::SraCellInfoResponse &msg); + 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); diff --git a/src/ue/rls/transport.cpp b/src/ue/rls/transport.cpp index 8c87006c0..4fafa335b 100644 --- a/src/ue/rls/transport.cpp +++ b/src/ue/rls/transport.cpp @@ -15,25 +15,25 @@ namespace nr::ue { -void UeRlsTask::receiveRlsMessage(const InetAddress &address, rls::SraMessage &msg) +void UeRlsTask::receiveRlsMessage(const InetAddress &address, rls::RlsMessage &msg) { switch (msg.msgType) { case rls::EMessageType::CELL_INFO_RESPONSE: { - receiveCellInfoResponse((const rls::SraCellInfoResponse &)msg); + receiveCellInfoResponse((const rls::RlsCellInfoResponse &)msg); break; case rls::EMessageType::PDU_DELIVERY: { - deliverDownlinkPdu((rls::SraPduDelivery &)msg); + deliverDownlinkPdu((rls::RlsPduDelivery &)msg); break; } default: - m_logger->err("Unhandled SRA message type[%d]", static_cast(msg.msgType)); + m_logger->err("Unhandled RLS message type[%d]", static_cast(msg.msgType)); break; } } } -void UeRlsTask::sendRlsMessage(const InetAddress &address, const rls::SraMessage &msg) +void UeRlsTask::sendRlsMessage(const InetAddress &address, const rls::RlsMessage &msg) { OctetString stream{}; rls::EncodeRlsMessage(msg, stream); @@ -44,18 +44,18 @@ void UeRlsTask::deliverUplinkPdu(rls::EPduType pduType, OctetString &&pdu, Octet { if (!m_servingCell.has_value()) { - m_logger->warn("SRA uplink delivery requested without a serving cell"); + m_logger->warn("RLS uplink delivery requested without a serving cell"); return; } - rls::SraPduDelivery msg{m_sti}; + 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::SraPduDelivery &msg) +void UeRlsTask::deliverDownlinkPdu(rls::RlsPduDelivery &msg) { if (msg.pduType == rls::EPduType::RRC) { diff --git a/src/urs/rls_pdu.cpp b/src/urs/rls_pdu.cpp index ed91e8e6a..497c3cdf9 100644 --- a/src/urs/rls_pdu.cpp +++ b/src/urs/rls_pdu.cpp @@ -42,7 +42,7 @@ static GlobalNci DecodeGlobalNci(const OctetView &stream) return res; } -void EncodeRlsMessage(const SraMessage &msg, OctetString &stream) +void EncodeRlsMessage(const RlsMessage &msg, OctetString &stream) { stream.appendOctet(0x03); // (Just for old RLS compatibility) @@ -53,14 +53,14 @@ void EncodeRlsMessage(const SraMessage &msg, OctetString &stream) stream.appendOctet8(msg.sti); if (msg.msgType == EMessageType::CELL_INFO_REQUEST) { - auto &m = (const SraCellInfoRequest &)msg; + 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 SraCellInfoResponse &)msg; + auto &m = (const RlsCellInfoResponse &)msg; AppendGlobalNci(m.cellId, stream); stream.appendOctet4(m.tac); stream.appendOctet4(m.dbm); @@ -71,7 +71,7 @@ void EncodeRlsMessage(const SraMessage &msg, OctetString &stream) } else if (msg.msgType == EMessageType::PDU_DELIVERY) { - auto &m = (const SraPduDelivery &)msg; + auto &m = (const RlsPduDelivery &)msg; stream.appendOctet(static_cast(m.pduType)); stream.appendOctet4(m.pdu.length()); stream.append(m.pdu); @@ -80,7 +80,7 @@ void EncodeRlsMessage(const SraMessage &msg, OctetString &stream) } } -std::unique_ptr DecodeRlsMessage(const OctetView &stream) +std::unique_ptr DecodeRlsMessage(const OctetView &stream) { auto first = stream.readI(); // (Just for old RLS compatibility) if (first != 3) @@ -98,7 +98,7 @@ std::unique_ptr DecodeRlsMessage(const OctetView &stream) if (msgType == EMessageType::CELL_INFO_REQUEST) { - auto res = std::make_unique(sti); + auto res = std::make_unique(sti); res->simPos.x = stream.read4I(); res->simPos.y = stream.read4I(); res->simPos.z = stream.read4I(); @@ -106,7 +106,7 @@ std::unique_ptr DecodeRlsMessage(const OctetView &stream) } else if (msgType == EMessageType::CELL_INFO_RESPONSE) { - auto res = std::make_unique(sti); + auto res = std::make_unique(sti); res->cellId = DecodeGlobalNci(stream); res->tac = stream.read4I(); res->dbm = stream.read4I(); @@ -116,7 +116,7 @@ std::unique_ptr DecodeRlsMessage(const OctetView &stream) } else if (msgType == EMessageType::PDU_DELIVERY) { - auto res = std::make_unique(sti); + auto res = std::make_unique(sti); res->pduType = static_cast(stream.readI()); res->pdu = stream.readOctetString(stream.read4I()); res->payload = stream.readOctetString(stream.read4I()); @@ -126,4 +126,4 @@ std::unique_ptr DecodeRlsMessage(const OctetView &stream) return nullptr; } -} // namespace sra +} // namespace rls diff --git a/src/urs/rls_pdu.hpp b/src/urs/rls_pdu.hpp index 8fecc4fae..8e9569d72 100644 --- a/src/urs/rls_pdu.hpp +++ b/src/urs/rls_pdu.hpp @@ -32,26 +32,26 @@ enum class EPduType : uint8_t DATA }; -struct SraMessage +struct RlsMessage { const EMessageType msgType; const uint64_t sti{}; - explicit SraMessage(EMessageType msgType, uint64_t sti) : msgType(msgType), sti(sti) + explicit RlsMessage(EMessageType msgType, uint64_t sti) : msgType(msgType), sti(sti) { } }; -struct SraCellInfoRequest : SraMessage +struct RlsCellInfoRequest : RlsMessage { Vector3 simPos{}; - explicit SraCellInfoRequest(uint64_t sti) : SraMessage(EMessageType::CELL_INFO_REQUEST, sti) + explicit RlsCellInfoRequest(uint64_t sti) : RlsMessage(EMessageType::CELL_INFO_REQUEST, sti) { } }; -struct SraCellInfoResponse : SraMessage +struct RlsCellInfoResponse : RlsMessage { GlobalNci cellId{}; int tac{}; @@ -59,23 +59,23 @@ struct SraCellInfoResponse : SraMessage std::string gnbName{}; std::string linkIp{}; - explicit SraCellInfoResponse(uint64_t sti) : SraMessage(EMessageType::CELL_INFO_RESPONSE, sti) + explicit RlsCellInfoResponse(uint64_t sti) : RlsMessage(EMessageType::CELL_INFO_RESPONSE, sti) { } }; -struct SraPduDelivery : SraMessage +struct RlsPduDelivery : RlsMessage { EPduType pduType{}; OctetString pdu{}; OctetString payload{}; - explicit SraPduDelivery(uint64_t sti) : SraMessage(EMessageType::PDU_DELIVERY, sti) + explicit RlsPduDelivery(uint64_t sti) : RlsMessage(EMessageType::PDU_DELIVERY, sti) { } }; -void EncodeRlsMessage(const SraMessage &msg, OctetString &stream); -std::unique_ptr DecodeRlsMessage(const OctetView &stream); +void EncodeRlsMessage(const RlsMessage &msg, OctetString &stream); +std::unique_ptr DecodeRlsMessage(const OctetView &stream); -} // namespace sra \ No newline at end of file +} // namespace rls \ No newline at end of file From c8e18b5c5a24238d07ee3a0d23e6f8e745b1e597 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 20:54:02 +0300 Subject: [PATCH 054/116] EServiceReqCause added --- src/ue/types.hpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/ue/types.hpp b/src/ue/types.hpp index dd51a3ea0..0c7000805 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -451,6 +451,38 @@ enum class ERegUpdateCause RESTRICTED_SERVICE_AREA }; +enum class EServiceReqCause +{ + // unspecified cause + UNSPECIFIED, + // the UE, in 5GMM-IDLE mode over 3GPP access, receives a paging request from the network + IDLE_PAGING, + // the UE, in 5GMM-CONNECTED mode over 3GPP access, receives a notification from the network with access type + // indicating non-3GPP access + CONNECTED_3GPP_NOTIFICATION_N3GPP, + // the UE, in 5GMM-IDLE mode over 3GPP access, has uplink signalling pending + IDLE_UPLINK_SIGNAL_PENDING, + // the UE, in 5GMM-IDLE mode over 3GPP access, has uplink user data pending + IDLE_UPLINK_DATA_PENDING, + // the UE, in 5GMM-CONNECTED mode or in 5GMM-CONNECTED mode with RRC inactive indication, has user data pending due + // to no user-plane resources established for PDU session(s) used for user data transport + CONNECTED_UPLINK_DATA_PENDING, + // the UE in 5GMM-IDLE mode over non-3GPP access, receives an indication from the lower layers of non-3GPP access, + // that the access stratum connection is established between UE and network + NON_3GPP_AS_ESTABLISHED, + // the UE, in 5GMM-IDLE mode over 3GPP access, receives a notification from the network with access type indicating + // 3GPP access when the UE is in 5GMM-CONNECTED mode over non-3GPP access + IDLE_3GPP_NOTIFICATION_N3GPP, + // the UE, in 5GMM-IDLE, 5GMM-CONNECTED mode over 3GPP access, or 5GMM-CONNECTED mode with RRC inactive indication, + // receives a request for emergency services fallback from the upper layer and performs emergency services fallback + // as specified in subclause 4.13.4.2 of 3GPP TS 23.502 [9] + EMERGENCY_FALLBACK, + // the UE, in 5GMM-CONNECTED mode over 3GPP access or in 5GMM-CONNECTED mode with RRC inactive indication, receives + // a fallback indication from the lower layers (see subclauses 5.3.1.2 and 5.3.1.4) and or the UE has a pending NAS + // procedure other than a registration, service request, or de-registration procedure + FALLBACK_INDICATION +}; + Json ToJson(const ECmState &state); Json ToJson(const ERmState &state); Json ToJson(const EMmState &state); From 8cade2771e4a856f28f19040b506b1c806ae3956 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 22:38:39 +0300 Subject: [PATCH 055/116] MM state management improvement --- src/ue/nas/mm/base.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index ae1646ed8..ac7e94bd6 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -60,7 +60,23 @@ void NasMm::performMmCycle() if (m_cmState == ECmState::CM_IDLE) switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); else - switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_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 { @@ -99,6 +115,25 @@ void NasMm::performMmCycle() if (startECallInactivityIfNeeded()) return; } + + 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); + } + } } void NasMm::switchMmState(EMmState state, EMmSubState subState) From fddf4ff15da319cd3cde480cb744f6dcfa49c2e3 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 22:39:35 +0300 Subject: [PATCH 056/116] Uplink data status change handling --- src/ue/app/task.cpp | 26 ++++++++++++++++++++++++-- src/ue/nas/sm/resource.cpp | 6 ++++++ src/ue/nas/sm/sm.hpp | 5 +++-- src/ue/nas/task.cpp | 22 +++++++++++++++++++--- src/ue/nts.hpp | 16 ++++++++++++++++ src/utils/nts.hpp | 1 + 6 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/ue/app/task.cpp b/src/ue/app/task.cpp index 6f15ffa18..61febf220 100644 --- a/src/ue/app/task.cpp +++ b/src/ue/app/task.cpp @@ -9,6 +9,7 @@ #include "task.hpp" #include "cmd_handler.hpp" #include +#include #include #include #include @@ -132,6 +133,7 @@ void UeAppTask::receiveStatusUpdate(NwUeStatusUpdate &msg) 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); @@ -224,8 +226,21 @@ void UeAppTask::setupTunInterface(const PduSession *pduSession) 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); @@ -233,8 +248,15 @@ void UeAppTask::handleUplinkDataRequest(int psi, OctetString &&data) } else { - // TODO - m_logger->err("Uplink data is pending"); + 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); + } } } diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index f84d59b53..809649d1c 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -58,4 +58,10 @@ bool NasSm::anyEmergencySession() [](auto &ps) { return ps->psState != EPsState::INACTIVE && ps->isEmergency; }); } +void NasSm::handleUplinkStatusChange(int psi, bool isPending) +{ + m_logger->debug("Uplink data status changed PSI[%d] pending[%s]", psi, isPending ? "true" : "false"); + // TODO +} + } // 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 8d91e7ee4..8906b67f8 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -49,6 +49,7 @@ class NasSm void localReleaseSession(int psi); void localReleaseAllSessions(); bool anyEmergencySession(); + void handleUplinkStatusChange(int psi, bool isPending); /* Session Release */ void sendReleaseRequest(int psi); @@ -88,8 +89,8 @@ class NasSm public: /* Interface */ - void handleNasEvent(const NwUeNasToNas &msg); // used by NAS - void onTimerTick(); // used by NAS + void handleNasEvent(const NwUeNasToNas &msg); // used by NAS + void onTimerTick(); // used by NAS }; } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nas/task.cpp b/src/ue/nas/task.cpp index 1e32ca889..302beb8a4 100644 --- a/src/ue/nas/task.cpp +++ b/src/ue/nas/task.cpp @@ -64,18 +64,34 @@ void NasTask::onLoop() auto *w = dynamic_cast(msg); switch (w->present) { - case NwUeNasToNas::PERFORM_MM_CYCLE: + case NwUeNasToNas::PERFORM_MM_CYCLE: { mm->handleNasEvent(*w); break; - case NwUeNasToNas::NAS_TIMER_EXPIRE: + } + case NwUeNasToNas::NAS_TIMER_EXPIRE: { if (w->timer->isMmTimer()) mm->handleNasEvent(*w); else sm->handleNasEvent(*w); break; - case NwUeNasToNas::ESTABLISH_INITIAL_SESSIONS: + } + case NwUeNasToNas::ESTABLISH_INITIAL_SESSIONS: { sm->establishInitialSessions(); break; + } + default: + break; + } + break; + } + case NtsMessageType::UE_APP_TO_NAS: { + auto *w = dynamic_cast(msg); + switch (w->present) + { + case NwUeAppToNas::UPLINK_STATUS_CHANGE: { + sm->handleUplinkStatusChange(w->psi, w->isPending); + break; + } default: break; } diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 6d6603f3f..ef613be8e 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -186,6 +186,22 @@ struct NwUeNasToApp : NtsMessage } }; +struct NwUeAppToNas : NtsMessage +{ + enum PR + { + UPLINK_STATUS_CHANGE, + } present; + + // UPLINK_STATUS_CHANGE + int psi{}; + bool isPending{}; + + explicit NwUeAppToNas(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_NAS), present(present) + { + } +}; + struct NwUeAppToRls : NtsMessage { enum PR diff --git a/src/utils/nts.hpp b/src/utils/nts.hpp index 80b5bfe5c..6831dea64 100644 --- a/src/utils/nts.hpp +++ b/src/utils/nts.hpp @@ -45,6 +45,7 @@ enum class NtsMessageType UE_APP_TO_RLS, UE_APP_TO_TUN, + UE_APP_TO_NAS, UE_TUN_TO_APP, UE_RRC_TO_NAS, UE_NAS_TO_RRC, From 342fbf2fc6ff34184437ce64fa81cff04c3aea75 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 22:39:42 +0300 Subject: [PATCH 057/116] Uplink data status change handling --- src/ue/types.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 0c7000805..a319c1591 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -395,6 +395,7 @@ struct UePduSessionInfo std::string type{}; std::string address{}; bool isEmergency{}; + bool uplinkPending{}; }; enum class ERegUpdateCause From 4fce9d0bb097e17936b1540d42aac1f9e8f3085c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 22:47:24 +0300 Subject: [PATCH 058/116] Uplink data status handling in SM --- src/ue/nas/sm/establishment.cpp | 1 + src/ue/nas/sm/interface.cpp | 18 ++++++++++++++++++ src/ue/nas/sm/resource.cpp | 3 +++ src/ue/nas/sm/sm.hpp | 9 ++++++--- src/ue/types.hpp | 1 + 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/sm/establishment.cpp b/src/ue/nas/sm/establishment.cpp index 1155a67e3..62a04dd7f 100644 --- a/src/ue/nas/sm/establishment.cpp +++ b/src/ue/nas/sm/establishment.cpp @@ -89,6 +89,7 @@ void NasSm::sendEstablishmentRequest(const SessionConfig &config) ps->sessionAmbr = {}; ps->authorizedQoSFlowDescriptions = {}; ps->pduAddress = {}; + ps->uplinkPending = false; /* Make PCO */ nas::ProtocolConfigurationOptions opt{}; diff --git a/src/ue/nas/sm/interface.cpp b/src/ue/nas/sm/interface.cpp index 139628469..15c0b3da1 100644 --- a/src/ue/nas/sm/interface.cpp +++ b/src/ue/nas/sm/interface.cpp @@ -39,4 +39,22 @@ void NasSm::onTimerTick() } } +bool NasSm::anyUplinkDataPending() +{ + auto status = getUplinkDataStatus(); + for (int i = 1; i < 16; i++) + if (status[i]) + return true; + return false; +} + +std::bitset<16> NasSm::getUplinkDataStatus() +{ + std::bitset<16> res{}; + for (int i = 1; i < 16; i++) + if (m_pduSessions[i]->psState == EPsState::ACTIVE && m_pduSessions[i]->uplinkPending) + res[i] = true; + return res; +} + } // namespace nr::ue diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index 809649d1c..14e566764 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -61,6 +61,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; + // TODO } diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index 8906b67f8..c8b78cab0 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -9,6 +9,7 @@ #pragma once #include +#include #include #include #include @@ -49,7 +50,9 @@ class NasSm void localReleaseSession(int psi); void localReleaseAllSessions(); bool anyEmergencySession(); - void handleUplinkStatusChange(int psi, bool isPending); + void handleUplinkStatusChange(int psi, bool isPending); + bool anyUplinkDataPending(); + std::bitset<16> getUplinkDataStatus(); /* Session Release */ void sendReleaseRequest(int psi); @@ -89,8 +92,8 @@ class NasSm public: /* Interface */ - void handleNasEvent(const NwUeNasToNas &msg); // used by NAS - void onTimerTick(); // used by NAS + void handleNasEvent(const NwUeNasToNas &msg); // used by NAS + void onTimerTick(); // used by NAS }; } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/types.hpp b/src/ue/types.hpp index a319c1591..6b5d6f8c7 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -250,6 +250,7 @@ struct PduSession const int psi; EPsState psState{}; + bool uplinkPending{}; nas::EPduSessionType sessionType{}; std::optional apn{}; From d2f7efa984036eeb45e736d9a781c92ed9aaa462 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 22:55:03 +0300 Subject: [PATCH 059/116] EServiceReqCause refactor --- src/ue/types.hpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/ue/types.hpp b/src/ue/types.hpp index 6b5d6f8c7..df6be70bd 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -457,31 +457,31 @@ enum class EServiceReqCause { // unspecified cause UNSPECIFIED, - // the UE, in 5GMM-IDLE mode over 3GPP access, receives a paging request from the network + // a) the UE, in 5GMM-IDLE mode over 3GPP access, receives a paging request from the network IDLE_PAGING, - // the UE, in 5GMM-CONNECTED mode over 3GPP access, receives a notification from the network with access type + // b) the UE, in 5GMM-CONNECTED mode over 3GPP access, receives a notification from the network with access type // indicating non-3GPP access CONNECTED_3GPP_NOTIFICATION_N3GPP, - // the UE, in 5GMM-IDLE mode over 3GPP access, has uplink signalling pending + // c) the UE, in 5GMM-IDLE mode over 3GPP access, has uplink signalling pending IDLE_UPLINK_SIGNAL_PENDING, - // the UE, in 5GMM-IDLE mode over 3GPP access, has uplink user data pending + // d) the UE, in 5GMM-IDLE mode over 3GPP access, has uplink user data pending IDLE_UPLINK_DATA_PENDING, - // the UE, in 5GMM-CONNECTED mode or in 5GMM-CONNECTED mode with RRC inactive indication, has user data pending due - // to no user-plane resources established for PDU session(s) used for user data transport + // e) the UE, in 5GMM-CONNECTED mode or in 5GMM-CONNECTED mode with RRC inactive indication, has user data pending + // due to no user-plane resources established for PDU session(s) used for user data transport CONNECTED_UPLINK_DATA_PENDING, - // the UE in 5GMM-IDLE mode over non-3GPP access, receives an indication from the lower layers of non-3GPP access, - // that the access stratum connection is established between UE and network + // f) the UE in 5GMM-IDLE mode over non-3GPP access, receives an indication from the lower layers of non-3GPP + // access, that the access stratum connection is established between UE and network NON_3GPP_AS_ESTABLISHED, - // the UE, in 5GMM-IDLE mode over 3GPP access, receives a notification from the network with access type indicating - // 3GPP access when the UE is in 5GMM-CONNECTED mode over non-3GPP access + // g) the UE, in 5GMM-IDLE mode over 3GPP access, receives a notification from the network with access type + // indicating 3GPP access when the UE is in 5GMM-CONNECTED mode over non-3GPP access IDLE_3GPP_NOTIFICATION_N3GPP, - // the UE, in 5GMM-IDLE, 5GMM-CONNECTED mode over 3GPP access, or 5GMM-CONNECTED mode with RRC inactive indication, - // receives a request for emergency services fallback from the upper layer and performs emergency services fallback - // as specified in subclause 4.13.4.2 of 3GPP TS 23.502 [9] + // h) the UE, in 5GMM-IDLE, 5GMM-CONNECTED mode over 3GPP access, or 5GMM-CONNECTED mode with RRC inactive + // indication, receives a request for emergency services fallback from the upper layer and performs emergency + // services fallback as specified in subclause 4.13.4.2 of 3GPP TS 23.502 [9] EMERGENCY_FALLBACK, - // the UE, in 5GMM-CONNECTED mode over 3GPP access or in 5GMM-CONNECTED mode with RRC inactive indication, receives - // a fallback indication from the lower layers (see subclauses 5.3.1.2 and 5.3.1.4) and or the UE has a pending NAS - // procedure other than a registration, service request, or de-registration procedure + // i) the UE, in 5GMM-CONNECTED mode over 3GPP access or in 5GMM-CONNECTED mode with RRC inactive indication, + // receives a fallback indication from the lower layers (see subclauses 5.3.1.2 and 5.3.1.4) and or the UE has a + // pending NAS procedure other than a registration, service request, or de-registration procedure FALLBACK_INDICATION }; From 22e8ceccdb83e70b3a4369de6548bba88b4891ff Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 23:20:15 +0300 Subject: [PATCH 060/116] Identity procedure improvement --- src/ue/nas/mm/identity.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/ue/nas/mm/identity.cpp b/src/ue/nas/mm/identity.cpp index 3d1f851fe..7e470d6b9 100644 --- a/src/ue/nas/mm/identity.cpp +++ b/src/ue/nas/mm/identity.cpp @@ -31,6 +31,21 @@ void NasMm::receiveIdentityRequest(const nas::IdentityRequest &msg) resp.mobileIdentity.type = nas::EIdentityType::IMEISV; resp.mobileIdentity.value = *m_base->config->imeiSv; } + else if (msg.identityType.value == nas::EIdentityType::GUTI) + { + resp.mobileIdentity = m_usim->m_storedGuti; + } + else if (msg.identityType.value == nas::EIdentityType::TMSI) + { + // TMSI is already a part of GUTI + resp.mobileIdentity = m_usim->m_storedGuti; + if (resp.mobileIdentity.type != nas::EIdentityType::NO_IDENTITY) + { + resp.mobileIdentity.type = nas::EIdentityType::TMSI; + resp.mobileIdentity.gutiOrTmsi.plmn = {}; + resp.mobileIdentity.gutiOrTmsi.amfRegionId = {}; + } + } else { resp.mobileIdentity.type = nas::EIdentityType::NO_IDENTITY; From b276eeb1d18fc81ccdae8495c2715fbbcc21c82c Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 23:32:51 +0300 Subject: [PATCH 061/116] Service request initiation --- src/ue/nas/mm/access.cpp | 25 +++++++++- src/ue/nas/mm/mm.hpp | 4 ++ src/ue/nas/mm/service.cpp | 98 +++++++++++++++++++++++++++++++++++++ src/ue/nas/sm/interface.cpp | 18 +++++++ src/ue/nas/sm/sm.hpp | 2 + 5 files changed, 146 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/access.cpp b/src/ue/nas/mm/access.cpp index 44c2c1703..7378072af 100644 --- a/src/ue/nas/mm/access.cpp +++ b/src/ue/nas/mm/access.cpp @@ -25,7 +25,7 @@ bool NasMm::hasEmergency() m_lastRegistrationRequest->registrationType.registrationType == nas::ERegistrationType::EMERGENCY_REGISTRATION) return true; - // TODO: Other case which is an emergency PDU session is established, or need to be established (and wanted to be + // 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; @@ -43,4 +43,27 @@ void NasMm::setN1Capability(bool enabled) // TODO } +bool NasMm::isInNonAllowedArea() +{ + if (!m_usim->isValid()) + return false; + if (!m_usim->m_currentPlmn.has_value()) + return false; + + auto &plmn = *m_usim->m_currentPlmn; + + if (nas::utils::ServiceAreaListForbidsPlmn(m_usim->m_serviceAreaList, nas::utils::PlmnFrom(plmn))) + return true; + + if (m_usim->m_servingCell.has_value()) + { + if (nas::utils::ServiceAreaListForbidsTai( + m_usim->m_serviceAreaList, + nas::VTrackingAreaIdentity{nas::utils::PlmnFrom(plmn), octet3{m_usim->m_servingCell->tac}})) + return true; + } + + return false; +} + } // namespace nr::ue diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index adab03da0..9c4dc808d 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -40,6 +40,8 @@ class NasMm std::unique_ptr m_lastRegistrationRequest{}; // Most recent de-registration request std::unique_ptr m_lastDeregistrationRequest{}; + // Most recent service request + std::unique_ptr m_lastServiceRequest{}; // Indicates the last de-registration cause EDeregCause m_lastDeregCause{}; // Last time PLMN search is triggered @@ -133,6 +135,7 @@ class NasMm nas::IE5gsMobileIdentity getOrGeneratePreferredId(); private: /* Service */ + void sendServiceRequest(EServiceReqCause reqCause); void receiveServiceAccept(const nas::ServiceAccept &msg); void receiveServiceReject(const nas::ServiceReject &msg); @@ -152,6 +155,7 @@ class NasMm bool isHighPriority(); bool hasEmergency(); void setN1Capability(bool enabled); + bool isInNonAllowedArea(); private: /* eCall */ bool startECallInactivityIfNeeded(); diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 594c2412d..24dae0167 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -7,10 +7,108 @@ // #include "mm.hpp" +#include namespace nr::ue { +void NasMm::sendServiceRequest(EServiceReqCause reqCause) +{ + auto request = std::make_unique(); + + if (reqCause == EServiceReqCause::IDLE_PAGING) + { + if (m_sm->anyUplinkDataPending()) + { + request->uplinkDataStatus = nas::IEUplinkDataStatus{}; + request->uplinkDataStatus->psi = m_sm->getUplinkDataStatus(); + } + request->serviceType.serviceType = nas::EServiceType::MOBILE_TERMINATED_SERVICES; + } + else if (reqCause == EServiceReqCause::CONNECTED_3GPP_NOTIFICATION_N3GPP) + { + // TODO: This case not handled since the non-3gpp access is not supported + m_logger->err("Unhandled case in ServiceRequest"); + } + else if (reqCause == EServiceReqCause::IDLE_UPLINK_SIGNAL_PENDING) + { + if (isHighPriority()) + request->serviceType.serviceType = nas::EServiceType::HIGH_PRIORITY_ACCESS; + else if (hasEmergency()) + request->serviceType.serviceType = nas::EServiceType::EMERGENCY_SERVICES; + else + request->serviceType.serviceType = nas::EServiceType::SIGNALLING; + + if (isInNonAllowedArea()) + { + // TODO: This case not handled since PS data off not supported + m_logger->err("Unhandled case in ServiceRequest"); + } + } + else if (reqCause == EServiceReqCause::IDLE_UPLINK_DATA_PENDING || + reqCause == EServiceReqCause::CONNECTED_UPLINK_DATA_PENDING) + { + request->uplinkDataStatus = nas::IEUplinkDataStatus{}; + request->uplinkDataStatus->psi = m_sm->getUplinkDataStatus(); + + if (isHighPriority()) + request->serviceType.serviceType = nas::EServiceType::HIGH_PRIORITY_ACCESS; + else if (m_sm->anyEmergencyUplinkDataPending()) + request->serviceType.serviceType = nas::EServiceType::EMERGENCY_SERVICES; + else + request->serviceType.serviceType = nas::EServiceType::DATA; + } + else if (reqCause == EServiceReqCause::NON_3GPP_AS_ESTABLISHED) + { + // TODO: This case not handled since the non-3gpp access is not supported + m_logger->err("Unhandled case found in ServiceRequest"); + } + else if (reqCause == EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP) + { + // TODO: This case not handled since the non-3gpp access is not supported + m_logger->err("Unhandled case occurred in ServiceRequest"); + } + else if (reqCause == EServiceReqCause::EMERGENCY_FALLBACK) + { + request->serviceType.serviceType = nas::EServiceType::EMERGENCY_SERVICES_FALLBACK; + } + else if (reqCause == EServiceReqCause::FALLBACK_INDICATION) + { + if (isHighPriority()) + request->serviceType.serviceType = nas::EServiceType::HIGH_PRIORITY_ACCESS; + else + { + // TODO: fallback indication not supported yet + } + } + + // Assign ngKSI + if (m_usim->m_currentNsCtx) + { + request->ngKSI.tsc = m_usim->m_currentNsCtx->tsc; + request->ngKSI.ksi = m_usim->m_currentNsCtx->ngKsi; + } + + // Assign TMSI (TMSI is a part of GUTI) + request->tmsi = m_usim->m_storedGuti; + if (request->tmsi.type != nas::EIdentityType::NO_IDENTITY) + { + request->tmsi.type = nas::EIdentityType::TMSI; + request->tmsi.gutiOrTmsi.plmn = {}; + request->tmsi.gutiOrTmsi.amfRegionId = {}; + } + + // Assign PDU session status + request->pduSessionStatus = nas::IEPduSessionStatus{}; + request->pduSessionStatus->psi = m_sm->getPduSessionStatus(); + + // Send the message and process the timers + sendNasMessage(*request); + m_lastServiceRequest = std::move(request); + m_timers->t3517.start(); + switchMmState(EMmState::MM_SERVICE_REQUEST_INITIATED, EMmSubState::MM_SERVICE_REQUEST_INITIATED_NA); +} + void NasMm::receiveServiceAccept(const nas::ServiceAccept &msg) { if (msg.eapMessage.has_value()) diff --git a/src/ue/nas/sm/interface.cpp b/src/ue/nas/sm/interface.cpp index 15c0b3da1..af3676dab 100644 --- a/src/ue/nas/sm/interface.cpp +++ b/src/ue/nas/sm/interface.cpp @@ -48,6 +48,15 @@ bool NasSm::anyUplinkDataPending() return false; } +bool NasSm::anyEmergencyUplinkDataPending() +{ + auto status = getUplinkDataStatus(); + for (int i = 1; i < 16; i++) + if (status[i] && m_pduSessions[i]->isEmergency) + return true; + return false; +} + std::bitset<16> NasSm::getUplinkDataStatus() { std::bitset<16> res{}; @@ -57,4 +66,13 @@ std::bitset<16> NasSm::getUplinkDataStatus() return res; } +std::bitset<16> NasSm::getPduSessionStatus() +{ + std::bitset<16> res{}; + for (int i = 1; i < 16; i++) + if (m_pduSessions[i]->psState == EPsState::ACTIVE) + res[i] = true; + return res; +} + } // namespace nr::ue diff --git a/src/ue/nas/sm/sm.hpp b/src/ue/nas/sm/sm.hpp index c8b78cab0..f5a39523e 100644 --- a/src/ue/nas/sm/sm.hpp +++ b/src/ue/nas/sm/sm.hpp @@ -52,7 +52,9 @@ class NasSm bool anyEmergencySession(); void handleUplinkStatusChange(int psi, bool isPending); bool anyUplinkDataPending(); + bool anyEmergencyUplinkDataPending(); std::bitset<16> getUplinkDataStatus(); + std::bitset<16> getPduSessionStatus(); /* Session Release */ void sendReleaseRequest(int psi); From 52b78fe28bdb6234a29dd8c3ace5685f3b91d8cb Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 23:36:02 +0300 Subject: [PATCH 062/116] Service request initiation --- src/ue/nas/mm/mm.hpp | 2 ++ src/ue/nas/mm/service.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 9c4dc808d..27e2c90db 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -44,6 +44,8 @@ class NasMm std::unique_ptr m_lastServiceRequest{}; // Indicates the last de-registration cause EDeregCause m_lastDeregCause{}; + // Indicates the last service request cause + EServiceReqCause m_lastServiceReqCause{}; // Last time PLMN search is triggered long m_lastPlmnSearchTrigger{}; // Registration attempt counter diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 24dae0167..8f5f2fdd7 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -105,6 +105,7 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) // Send the message and process the timers sendNasMessage(*request); m_lastServiceRequest = std::move(request); + m_lastServiceReqCause = reqCause; m_timers->t3517.start(); switchMmState(EMmState::MM_SERVICE_REQUEST_INITIATED, EMmSubState::MM_SERVICE_REQUEST_INITIATED_NA); } From 68e8d89625f8620e672ea577c52cf5948e3d86ac Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 23:51:25 +0300 Subject: [PATCH 063/116] Service accept handling --- src/ue/nas/mm/service.cpp | 47 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 8f5f2fdd7..e9cf0fcef 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -7,6 +7,7 @@ // #include "mm.hpp" +#include #include namespace nr::ue @@ -112,6 +113,50 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) void NasMm::receiveServiceAccept(const nas::ServiceAccept &msg) { + if (m_mmState != EMmState::MM_SERVICE_REQUEST_INITIATED) + { + m_logger->warn("Service Accept ignored since the MM state is not MM_SERVICE_REQUEST_INITIATED"); + sendMmStatus(nas::EMmCause::MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE); + return; + } + + if (m_lastServiceReqCause != EServiceReqCause::EMERGENCY_FALLBACK) + { + m_logger->info("Service Accept received"); + m_serCounter = 0; + m_timers->t3517.stop(); + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + } + else + { + // todo: emergency fallback + } + + // Handle PDU session status + if (msg.pduSessionStatus.has_value()) + { + auto statusInUe = m_sm->getPduSessionStatus(); + auto statusInNw = msg.pduSessionStatus->psi; + for (int i = 1; i < 16; i++) + if (statusInUe[i] && !statusInNw[i]) + m_sm->localReleaseSession(i); + } + + // Handle PDU session reactivation result + if (msg.pduSessionReactivationResult.has_value()) + { + // todo: not handled since non-3gpp access is not supported + } + + // Handle PDU session reactivation result error cause + if (msg.pduSessionReactivationResultErrorCause.has_value()) + { + for (auto &item : msg.pduSessionReactivationResultErrorCause->values) + m_logger->err("PDU session reactivation result error PSI[%d] cause[%s]", item.pduSessionId, + nas::utils::EnumToString(item.causeValue)); + } + + // Handle EAP message if (msg.eapMessage.has_value()) { if (msg.eapMessage->eap->code == eap::ECode::FAILURE) @@ -119,8 +164,6 @@ void NasMm::receiveServiceAccept(const nas::ServiceAccept &msg) else m_logger->warn("Network sent EAP with inconvenient type in ServiceAccept, ignoring EAP IE."); } - - // TODO } void NasMm::receiveServiceReject(const nas::ServiceReject &msg) From eae9085bc604620b3cabc56b0e152f9945223299 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 23:54:29 +0300 Subject: [PATCH 064/116] Service request handling --- 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 e9cf0fcef..25fbb3c64 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -15,6 +15,8 @@ namespace nr::ue void NasMm::sendServiceRequest(EServiceReqCause reqCause) { + m_logger->debug("Sending Service Request"); + auto request = std::make_unique(); if (reqCause == EServiceReqCause::IDLE_PAGING) From 5a88cd6f3b5832c6152a43700eef20db985bd947 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sun, 4 Apr 2021 23:59:10 +0300 Subject: [PATCH 065/116] Service request handling --- src/ue/nas/mm/service.cpp | 17 +++++++++++++---- src/ue/types.cpp | 29 +++++++++++++++++++++++++++++ src/ue/types.hpp | 1 + 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 25fbb3c64..d2785a098 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -15,7 +15,7 @@ namespace nr::ue void NasMm::sendServiceRequest(EServiceReqCause reqCause) { - m_logger->debug("Sending Service Request"); + m_logger->debug("Sending Service Request due to [%s]", ToJson(reqCause).str().c_str()); auto request = std::make_unique(); @@ -170,15 +170,24 @@ void NasMm::receiveServiceAccept(const nas::ServiceAccept &msg) void NasMm::receiveServiceReject(const nas::ServiceReject &msg) { + if (m_mmState != EMmState::MM_SERVICE_REQUEST_INITIATED) + { + m_logger->warn("Service Reject ignored since the MM state is not MM_SERVICE_REQUEST_INITIATED"); + sendMmStatus(nas::EMmCause::MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE); + return; + } + + auto cause = msg.mmCause.value; + m_logger->err("Service Request failed [%s]", nas::utils::EnumToString(cause)); + + // Handle EAP message if (msg.eapMessage.has_value()) { if (msg.eapMessage->eap->code == eap::ECode::FAILURE) receiveEapFailureMessage(*msg.eapMessage->eap); else - m_logger->warn("Network sent EAP with inconvenient type in ServiceAccept, ignoring EAP IE."); + m_logger->warn("Network sent EAP with inconvenient type in ServiceReject, ignoring EAP IE."); } - - // TODO } } // namespace nr::ue diff --git a/src/ue/types.cpp b/src/ue/types.cpp index e7a4ca4f4..5407800bd 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -243,4 +243,33 @@ 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 "?"; + } +} + } // namespace nr::ue diff --git a/src/ue/types.hpp b/src/ue/types.hpp index df6be70bd..f76fead11 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -495,5 +495,6 @@ Json ToJson(const UeTimers &v); Json ToJson(const ERegUpdateCause &v); Json ToJson(const EPsState &v); Json ToJson(const UePduSessionInfo &v); +Json ToJson(const EServiceReqCause &v); } // namespace nr::ue From aec7f601878e1bf6543bcb7d5f50af5629817c41 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 00:06:59 +0300 Subject: [PATCH 066/116] Service reject handling --- src/ue/nas/mm/service.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index d2785a098..f6d10dc22 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -177,9 +177,31 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) return; } + if (msg.sht == nas::ESecurityHeaderType::NOT_PROTECTED) + { + m_logger->warn("Not protected Service Reject message received"); + sendMmStatus(nas::EMmCause::UNSPECIFIED_PROTOCOL_ERROR); + return; + } + + // "On receipt of the SERVICE REJECT message, if the UE is in state 5GMM-SERVICE-REQUEST-INITIATED and the message + // is integrity protected, the UE shall reset the service request attempt counter and stop timer T3517 if running." + m_serCounter = 0; + m_timers->t3517.stop(); + auto cause = msg.mmCause.value; m_logger->err("Service Request failed [%s]", nas::utils::EnumToString(cause)); + // Handle PDU session status + if (msg.pduSessionStatus.has_value() && msg.sht != nas::ESecurityHeaderType::NOT_PROTECTED) + { + auto statusInUe = m_sm->getPduSessionStatus(); + auto statusInNw = msg.pduSessionStatus->psi; + for (int i = 1; i < 16; i++) + if (statusInUe[i] && !statusInNw[i]) + m_sm->localReleaseSession(i); + } + // Handle EAP message if (msg.eapMessage.has_value()) { From 08eb211717d699f5b7d341b51284c93d87316a7f Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 00:24:03 +0300 Subject: [PATCH 067/116] SM refactor --- src/ue/nas/sm/interface.cpp | 36 ------------------------------------ src/ue/nas/sm/resource.cpp | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/ue/nas/sm/interface.cpp b/src/ue/nas/sm/interface.cpp index af3676dab..139628469 100644 --- a/src/ue/nas/sm/interface.cpp +++ b/src/ue/nas/sm/interface.cpp @@ -39,40 +39,4 @@ void NasSm::onTimerTick() } } -bool NasSm::anyUplinkDataPending() -{ - auto status = getUplinkDataStatus(); - for (int i = 1; i < 16; i++) - if (status[i]) - return true; - return false; -} - -bool NasSm::anyEmergencyUplinkDataPending() -{ - auto status = getUplinkDataStatus(); - for (int i = 1; i < 16; i++) - if (status[i] && m_pduSessions[i]->isEmergency) - return true; - return false; -} - -std::bitset<16> NasSm::getUplinkDataStatus() -{ - std::bitset<16> res{}; - for (int i = 1; i < 16; i++) - if (m_pduSessions[i]->psState == EPsState::ACTIVE && m_pduSessions[i]->uplinkPending) - res[i] = true; - return res; -} - -std::bitset<16> NasSm::getPduSessionStatus() -{ - std::bitset<16> res{}; - for (int i = 1; i < 16; i++) - if (m_pduSessions[i]->psState == EPsState::ACTIVE) - res[i] = true; - return res; -} - } // namespace nr::ue diff --git a/src/ue/nas/sm/resource.cpp b/src/ue/nas/sm/resource.cpp index 14e566764..7ef7df24e 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -67,4 +67,40 @@ void NasSm::handleUplinkStatusChange(int psi, bool isPending) // TODO } +bool NasSm::anyUplinkDataPending() +{ + auto status = getUplinkDataStatus(); + for (int i = 1; i < 16; i++) + if (status[i]) + return true; + return false; +} + +bool NasSm::anyEmergencyUplinkDataPending() +{ + auto status = getUplinkDataStatus(); + for (int i = 1; i < 16; i++) + if (status[i] && m_pduSessions[i]->isEmergency) + return true; + return false; +} + +std::bitset<16> NasSm::getUplinkDataStatus() +{ + std::bitset<16> res{}; + for (int i = 1; i < 16; i++) + if (m_pduSessions[i]->psState == EPsState::ACTIVE && m_pduSessions[i]->uplinkPending) + res[i] = true; + return res; +} + +std::bitset<16> NasSm::getPduSessionStatus() +{ + std::bitset<16> res{}; + for (int i = 1; i < 16; i++) + if (m_pduSessions[i]->psState == EPsState::ACTIVE) + res[i] = true; + return res; +} + } // namespace nr::ue \ No newline at end of file From 4540dd43e0b7fcf25de1abeeae5dc8a76d767126 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 20:14:49 +0300 Subject: [PATCH 068/116] Service reject handling --- src/ue/nas/mm/service.cpp | 107 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index f6d10dc22..ebb22c2b1 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -210,6 +210,113 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) else m_logger->warn("Network sent EAP with inconvenient type in ServiceReject, ignoring EAP IE."); } + + /* Handle MM Cause */ + + 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::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) + switchUState(E5UState::U3_ROAMING_NOT_ALLOWED); + + if (cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK || + cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) + switchUState(E5UState::U2_NOT_UPDATED); + + if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || + cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED || + cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK || + cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::TA_NOT_ALLOWED || + cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) + { + m_usim->m_storedGuti = {}; + m_usim->m_lastVisitedRegisteredTai = {}; + m_usim->m_taiList = {}; + m_usim->m_currentNsCtx = {}; + m_usim->m_nonCurrentNsCtx = {}; + } + + if (cause == nas::EMmCause::IMPLICITY_DEREGISTERED) + { + m_usim->m_nonCurrentNsCtx = {}; + } + + if (cause == nas::EMmCause::PLMN_NOT_ALLOWED) + { + m_usim->m_equivalentPlmnList = {}; + } + + if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) + { + // TODO: add to forbidden plmn list + } + + if (cause == nas::EMmCause::TA_NOT_ALLOWED) + { + // TODO: add current tai to 5GS forbidden tracking areas for regional provision of service + } + + if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) + { + // TODO: add current tai to 5GS forbidden tracking areas for roaming + // TODO: remove current tai from stored tai list if present + } + + if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || + cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED) + { + m_usim->invalidate(); + } + + if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || + 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); + switchRmState(ERmState::RM_DEREGISTERED); + } + + if (cause == nas::EMmCause::IMPLICITY_DEREGISTERED) + { + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); + switchRmState(ERmState::RM_DEREGISTERED); + } + + if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) + { + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); + switchRmState(ERmState::RM_DEREGISTERED); + } + + if (cause == nas::EMmCause::TA_NOT_ALLOWED) + { + switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); + switchRmState(ERmState::RM_DEREGISTERED); + } + + if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA) + { + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); + switchRmState(ERmState::RM_REGISTERED); + } + + if (cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) + { + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_LIMITED_SERVICE); + switchRmState(ERmState::RM_REGISTERED); + } + + if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) + { + switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); + switchRmState(ERmState::RM_DEREGISTERED); + + setN1Capability(false); + } + + if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) + { + setN1Capability(false); + } } } // namespace nr::ue From f1442d1c10dd3ebf75c7240aece2bf37cd9e22b0 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 20:43:29 +0300 Subject: [PATCH 069/116] Service reject handling --- src/nas/enums.hpp | 3 +- src/nas/utils.cpp | 4 +-- src/ue/nas/mm/service.cpp | 60 +++++++++++++++++++++++++++++++++++++-- src/ue/types.cpp | 2 ++ src/ue/types.hpp | 3 +- 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/nas/enums.hpp b/src/nas/enums.hpp index 3c42fc1e6..d810aa58a 100644 --- a/src/nas/enums.hpp +++ b/src/nas/enums.hpp @@ -137,7 +137,7 @@ enum class EMmCause SEC_MODE_REJECTED_UNSPECIFIED = 0b00011000, NON_5G_AUTHENTICATION_UNACCEPTABLE = 0b00011010, N1_MODE_NOT_ALLOWED = 0b00011011, - RESTRICTED_NOT_SERVICE_AREA = 0b00011100, + RESTRICTED_SERVICE_AREA = 0b00011100, LADN_NOT_AVAILABLE = 0b00101011, MAX_PDU_SESSIONS_REACHED = 0b01000001, INSUFFICIENT_RESOURCES_FOR_SLICE_AND_DNN = 0b01000011, @@ -646,6 +646,7 @@ enum class EServiceType EMERGENCY_SERVICES = 0b0011, EMERGENCY_SERVICES_FALLBACK = 0b0100, HIGH_PRIORITY_ACCESS = 0b0101, + ELEVATED_SIGNALLING = 0b0110, UNUSED_SIGNALLING_1 = 0b0110, UNUSED_SIGNALLING_2 = 0b0111, UNUSED_SIGNALLING_3 = 0b1000, diff --git a/src/nas/utils.cpp b/src/nas/utils.cpp index a3c16fc5d..3363434a2 100644 --- a/src/nas/utils.cpp +++ b/src/nas/utils.cpp @@ -95,8 +95,8 @@ const char *EnumToString(EMmCause v) return "NON_5G_AUTHENTICATION_UNACCEPTABLE"; case EMmCause::N1_MODE_NOT_ALLOWED: return "N1_MODE_NOT_ALLOWED"; - case EMmCause::RESTRICTED_NOT_SERVICE_AREA: - return "RESTRICTED_NOT_SERVICE_AREA"; + case EMmCause::RESTRICTED_SERVICE_AREA: + return "RESTRICTED_SERVICE_AREA"; case EMmCause::LADN_NOT_AVAILABLE: return "LADN_NOT_AVAILABLE"; case EMmCause::MAX_PDU_SESSIONS_REACHED: diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index ebb22c2b1..3995b4210 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -170,7 +170,7 @@ void NasMm::receiveServiceAccept(const nas::ServiceAccept &msg) void NasMm::receiveServiceReject(const nas::ServiceReject &msg) { - if (m_mmState != EMmState::MM_SERVICE_REQUEST_INITIATED) + if (m_mmState != EMmState::MM_SERVICE_REQUEST_INITIATED || !m_lastServiceRequest) { m_logger->warn("Service Reject ignored since the MM state is not MM_SERVICE_REQUEST_INITIATED"); sendMmStatus(nas::EMmCause::MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE); @@ -192,6 +192,11 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) auto cause = msg.mmCause.value; m_logger->err("Service Request failed [%s]", nas::utils::EnumToString(cause)); + auto handleAbnormalCase = [this, cause]() { + m_logger->debug("Handling Service Reject abnormal case"); + // TODO + }; + // Handle PDU session status if (msg.pduSessionStatus.has_value() && msg.sht != nas::ESecurityHeaderType::NOT_PROTECTED) { @@ -269,7 +274,8 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || - cause == nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED || cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK) + 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); switchRmState(ERmState::RM_DEREGISTERED); @@ -317,6 +323,56 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) { setN1Capability(false); } + + if (cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK) + { + if (m_lastServiceReqCause != EServiceReqCause::EMERGENCY_FALLBACK) + { + // TODO: new initial registration + } + } + + if (cause == nas::EMmCause::IMPLICITY_DEREGISTERED) + { + if (hasEmergency()) + { + // TODO: new initial registration + } + } + + if (cause == nas::EMmCause::CONGESTION) + { + if (msg.t3346Value.has_value() && nas::utils::HasValue(*msg.t3346Value)) + { + if (!hasEmergency()) + { + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + switchRmState(ERmState::RM_REGISTERED); + + m_timers->t3517.stop(); + } + + m_timers->t3346.stop(); + + if (msg.sht != nas::ESecurityHeaderType::NOT_PROTECTED) + m_timers->t3346.start(*msg.t3346Value); + else + m_timers->t3346.start(nas::IEGprsTimer2{5}); + } + else + { + handleAbnormalCase(); + } + } + + if (cause == nas::EMmCause::RESTRICTED_SERVICE_AREA) + { + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); + switchRmState(ERmState::RM_REGISTERED); + + if (m_lastServiceRequest->serviceType.serviceType != nas::EServiceType::ELEVATED_SIGNALLING) + sendMobilityRegistration(ERegUpdateCause::RESTRICTED_SERVICE_AREA); + } } } // namespace nr::ue diff --git a/src/ue/types.cpp b/src/ue/types.cpp index 5407800bd..303d4dfc1 100644 --- a/src/ue/types.cpp +++ b/src/ue/types.cpp @@ -185,6 +185,8 @@ Json ToJson(const ERegUpdateCause &v) 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: diff --git a/src/ue/types.hpp b/src/ue/types.hpp index f76fead11..9dd1c5ddc 100644 --- a/src/ue/types.hpp +++ b/src/ue/types.hpp @@ -420,9 +420,10 @@ enum class ERegUpdateCause // when the UE receives an indication of "RRC Connection failure" from the lower layers and does not have signalling // pending (i.e. when the lower layer requests NAS signalling connection recovery) except for the case specified in // subclause 5.3.1.4; + CONNECTION_RECOVERY, // when the UE receives a fallback indication from the lower layers and does not have signalling pending (i.e. when // the lower layer requests NAS signalling connection recovery, see subclauses 5.3.1.4 and 5.3.1.2); - CONNECTION_RECOVERY, + FALLBACK_INDICATION, // when the UE changes the 5GMM capability or the S1 UE network capability or both MM_OR_S1_CAPABILITY_CHANGE, // when the UE's usage setting changes From 1b9cc7565a9130d0864d0dd18eb065fc6e331d9a Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 20:51:03 +0300 Subject: [PATCH 070/116] Service reject handling --- src/ue/nas/mm/base.cpp | 2 +- src/ue/nas/mm/mm.hpp | 2 +- src/ue/nas/mm/register.cpp | 6 ++++-- src/ue/nas/mm/service.cpp | 10 +++------- src/ue/nas/mm/timer.cpp | 2 +- src/utils/common_types.hpp | 10 ++++++++++ 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index ac7e94bd6..9b83bde0d 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -106,7 +106,7 @@ void NasMm::performMmCycle() if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) { if (!m_timers->t3346.isRunning()) - sendInitialRegistration(false, false); + sendInitialRegistration(EInitialRegCause::MM_DEREG_NORMAL_SERVICE); return; } diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 27e2c90db..08a8ca530 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -91,7 +91,7 @@ class NasMm void sendMobilityRegistration(ERegUpdateCause updateCause); private: /* Registration */ - void sendInitialRegistration(bool isEmergencyReg, bool dueToDereg); + void 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/register.cpp b/src/ue/nas/mm/register.cpp index 0159cd64a..b10189558 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -16,7 +16,7 @@ namespace nr::ue { -void NasMm::sendInitialRegistration(bool isEmergencyReg, bool dueToDereg) +void NasMm::sendInitialRegistration(EInitialRegCause regCause) { if (m_rmState != ERmState::RM_DEREGISTERED) { @@ -24,6 +24,8 @@ void NasMm::sendInitialRegistration(bool isEmergencyReg, bool dueToDereg) return; } + bool isEmergencyReg = regCause == EInitialRegCause::EMERGENCY_SERVICES; + // 5.5.1.2.7 Abnormal cases in the UE // a) Timer T3346 is running. if (m_timers->t3346.isRunning() && !isEmergencyReg && !hasEmergency()) @@ -33,7 +35,7 @@ void NasMm::sendInitialRegistration(bool isEmergencyReg, bool dueToDereg) bool highPriority = isHighPriority(); // The UE shall not start the registration procedure for initial registration in the following case - if (!highPriority && !dueToDereg) + if (!highPriority && regCause != EInitialRegCause::DUE_TO_DEREGISTRATION) { m_logger->debug("Initial registration canceled, T3346 is running"); return; diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 3995b4210..009ccb530 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -327,17 +327,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) - { - // TODO: new initial registration - } + sendInitialRegistration(EInitialRegCause::DUE_TO_SERVICE_REJECT); } if (cause == nas::EMmCause::IMPLICITY_DEREGISTERED) { - if (hasEmergency()) - { - // TODO: new initial registration - } + if (!hasEmergency()) + sendInitialRegistration(EInitialRegCause::DUE_TO_SERVICE_REJECT); } if (cause == nas::EMmCause::CONGESTION) diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index f464985fb..ce12160a4 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -29,7 +29,7 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) if (m_mmSubState == EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE) { logExpired(); - sendInitialRegistration(false, false); + sendInitialRegistration(EInitialRegCause::T3346_EXPIRY); } break; } diff --git a/src/utils/common_types.hpp b/src/utils/common_types.hpp index 337c00ec3..b2810583d 100644 --- a/src/utils/common_types.hpp +++ b/src/utils/common_types.hpp @@ -119,6 +119,16 @@ enum class EDeregCause ECALL_INACTIVITY, }; +enum class EInitialRegCause +{ + UNSPECIFIED, + EMERGENCY_SERVICES, + MM_DEREG_NORMAL_SERVICE, + T3346_EXPIRY, + DUE_TO_DEREGISTRATION, + DUE_TO_SERVICE_REJECT, +}; + struct GlobalNci { Plmn plmn{}; From 156c4ac7b5c072de1b6784f29ad4908e47ede268 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 21:02:17 +0300 Subject: [PATCH 071/116] Service reject handling --- src/ue/nas/mm/service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 009ccb530..41f22ca5b 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -253,7 +253,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { - // TODO: add to forbidden plmn list + nas::utils::AddToPlmnList(m_usim->m_forbiddenPlmnList, nas::utils::PlmnFrom(*m_usim->m_currentPlmn)); } if (cause == nas::EMmCause::TA_NOT_ALLOWED) From d83daf07c8ac8ac78107e991a09c8787a63a8f04 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 21:30:23 +0300 Subject: [PATCH 072/116] Service reject handling --- src/nas/utils.cpp | 55 ++++++++++++++++++++++++++++++++++++++- src/nas/utils.hpp | 4 ++- src/ue/nas/mm/radio.cpp | 8 +++++- src/ue/nas/mm/service.cpp | 6 ++--- src/ue/nas/usim.hpp | 4 ++- 5 files changed, 70 insertions(+), 7 deletions(-) diff --git a/src/nas/utils.cpp b/src/nas/utils.cpp index 3363434a2..d69eca31b 100644 --- a/src/nas/utils.cpp +++ b/src/nas/utils.cpp @@ -8,6 +8,7 @@ #include "utils.hpp" +#include #include namespace nas::utils @@ -262,7 +263,7 @@ IEDnn DnnFromApn(const std::string &apn) return dnn; } -void AddToPlmnList(IEPlmnList &list, VPlmn item) +void AddToPlmnList(IEPlmnList &list, const VPlmn &item) { if (!std::any_of(list.plmns.begin(), list.plmns.end(), [&item](auto &i) { return DeepEqualsV(i, item); })) list.plmns.push_back(item); @@ -381,4 +382,56 @@ bool ServiceAreaListForbidsTai(const VPartialServiceAreaList &list, const VTrack return false; } +void AddToTaiList(IE5gsTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai) +{ + if (!TaiListContains(list, tai)) + { + VPartialTrackingAreaIdentityList ls{}; + ls.list01 = VPartialTrackingAreaIdentityList01{tai.plmn, tai.tac}; + ls.present = 1; + list.list.push_back(ls); + } +} + +void RemoveFromTaiList(IE5gsTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai) +{ + list.list.erase(std::remove_if(list.list.begin(), list.list.end(), + [&tai](auto &itemList) { + return itemList.present == 1 && DeepEqualsV(itemList.list01->plmn, tai.plmn) && + (int)itemList.list01->tac == (int)tai.tac; + }), + list.list.end()); + + for (auto &itemList : list.list) + { + if (itemList.present == 0) + { + auto &list0 = itemList.list00; + if (DeepEqualsV(list0->plmn, tai.plmn)) + { + list0->tacs.erase(std::remove_if(list0->tacs.begin(), list0->tacs.end(), + [&tai](auto tac) { return (int)tac == (int)tai.tac; }), + list0->tacs.end()); + } + } + else if (itemList.present == 2) + { + auto &list2 = itemList.list10; + list2->tais.erase( + std::remove_if(list2->tais.begin(), list2->tais.end(), [&tai](auto &i) { return DeepEqualsV(i, tai); }), + list2->tais.end()); + } + } + + list.list.erase( + std::remove_if(list.list.begin(), list.list.end(), + [](auto &itemList) { return itemList.present == 0 && itemList.list00->tacs.empty(); }), + list.list.end()); + + list.list.erase( + std::remove_if(list.list.begin(), list.list.end(), + [](auto &itemList) { return itemList.present == 2 && itemList.list10->tais.empty(); }), + list.list.end()); +} + } // namespace nas::utils diff --git a/src/nas/utils.hpp b/src/nas/utils.hpp index 2470052df..7a62e86dd 100644 --- a/src/nas/utils.hpp +++ b/src/nas/utils.hpp @@ -24,7 +24,9 @@ SingleSlice SNssaiTo(const IESNssai &v); bool HasValue(const IEGprsTimer3 &v); bool HasValue(const IEGprsTimer2 &v); -void AddToPlmnList(IEPlmnList &list, VPlmn item); +void AddToPlmnList(IEPlmnList &list, const VPlmn &item); +void AddToTaiList(nas::IE5gsTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai); +void RemoveFromTaiList(nas::IE5gsTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai); bool PlmnListContains(const IEPlmnList &list, VPlmn item); bool PlmnListContains(const IEPlmnList &list, Plmn item); bool TaiListContains(const nas::IE5gsTrackingAreaIdentityList &list, const VTrackingAreaIdentity &tai); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 123f06056..2a965402e 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -68,7 +68,10 @@ void NasMm::handlePlmnSearchResponse(const std::vector &measu continue; } if (nas::utils::TaiListContains( - m_usim->m_forbiddenTaiList, + 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++; @@ -185,6 +188,8 @@ void NasMm::handleServingCellChange(const UeCellInfo &servingCell) 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}}; } void NasMm::handleRrcConnectionSetup() @@ -206,6 +211,7 @@ 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/service.cpp b/src/ue/nas/mm/service.cpp index 41f22ca5b..44a71dfe1 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -258,13 +258,13 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::TA_NOT_ALLOWED) { - // TODO: add current tai to 5GS forbidden tracking areas for regional provision of service + nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRps, *m_usim->m_currentTai); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - // TODO: add current tai to 5GS forbidden tracking areas for roaming - // TODO: remove current tai from stored tai list if present + nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRoaming, *m_usim->m_currentTai); + nas::utils::RemoveFromTaiList(m_usim->m_taiList, *m_usim->m_currentTai); } if (cause == nas::EMmCause::ILLEGAL_UE || cause == nas::EMmCause::ILLEGAL_ME || diff --git a/src/ue/nas/usim.hpp b/src/ue/nas/usim.hpp index 3a4c7595a..50c5f3c13 100644 --- a/src/ue/nas/usim.hpp +++ b/src/ue/nas/usim.hpp @@ -34,9 +34,11 @@ class Usim // Plmn related std::optional m_servingCell{}; std::optional m_currentPlmn{}; + std::optional m_currentTai{}; std::optional m_lastVisitedRegisteredTai{}; nas::IE5gsTrackingAreaIdentityList m_taiList{}; - nas::IE5gsTrackingAreaIdentityList m_forbiddenTaiList{}; + nas::IE5gsTrackingAreaIdentityList m_forbiddenTaiListRoaming{}; // 5GS 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 1a37ec66028c49628f20239fe05e4aa3c5053302 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 21:32:55 +0300 Subject: [PATCH 073/116] Registration reject abnormal case improvement --- 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 b10189558..a1b418098 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -544,7 +544,7 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - // TODO add to forbidden tai + nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRoaming, *m_usim->m_currentTai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) @@ -704,7 +704,7 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA || cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { - // TODO add to forbidden tai + nas::utils::AddToTaiList(m_usim->m_forbiddenTaiListRoaming, *m_usim->m_currentTai); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) From 7bb64878e9888290070f36a17012deba82de8707 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 21:38:27 +0300 Subject: [PATCH 074/116] Service reject abnormal case handling --- src/ue/nas/mm/service.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 44a71dfe1..9a7ba5569 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -192,9 +192,12 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) auto cause = msg.mmCause.value; m_logger->err("Service Request failed [%s]", nas::utils::EnumToString(cause)); - auto handleAbnormalCase = [this, cause]() { + auto handleAbnormalCase = [this]() { m_logger->debug("Handling Service Reject abnormal case"); - // TODO + + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + switchRmState(ERmState::RM_REGISTERED); + m_timers->t3517.stop(); }; // Handle PDU session status @@ -369,6 +372,18 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (m_lastServiceRequest->serviceType.serviceType != nas::EServiceType::ELEVATED_SIGNALLING) sendMobilityRegistration(ERegUpdateCause::RESTRICTED_SERVICE_AREA); } + + if (cause != nas::EMmCause::ILLEGAL_UE && cause != nas::EMmCause::ILLEGAL_ME && + cause != nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED && + cause != nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK && + cause != nas::EMmCause::IMPLICITY_DEREGISTERED && 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 && cause != nas::EMmCause::CONGESTION && + cause != nas::EMmCause::N1_MODE_NOT_ALLOWED && cause != nas::EMmCause::RESTRICTED_SERVICE_AREA && + cause != nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) + { + handleAbnormalCase(); + } } } // namespace nr::ue From 59c835071ed13d3a957ec7c1d034117988cbc4af Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 21:40:46 +0300 Subject: [PATCH 075/116] Service reject abnormal case handling --- src/ue/nas/mm/service.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 9a7ba5569..a4f7c9c3a 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -373,6 +373,13 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) sendMobilityRegistration(ERegUpdateCause::RESTRICTED_SERVICE_AREA); } + if (hasEmergency()) + { + // Spec says that upper layers should be informed as well, for additional action for emergency + // registration, but no need for now. + handleAbnormalCase(); + } + if (cause != nas::EMmCause::ILLEGAL_UE && cause != nas::EMmCause::ILLEGAL_ME && cause != nas::EMmCause::FIVEG_SERVICES_NOT_ALLOWED && cause != nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK && From 94d967a19ce5b6de8d29c045090137e87f62dd89 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 21:46:44 +0300 Subject: [PATCH 076/116] Service request abnormal case handling improvements --- src/ue/nas/mm/service.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index a4f7c9c3a..5ba5f1e92 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -17,6 +17,20 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) { m_logger->debug("Sending Service Request due to [%s]", ToJson(reqCause).str().c_str()); + // 5.6.1.7 Abnormal cases in the UE + // c) Timer T3346 is running. + if (m_timers->t3346.isRunning()) + { + if (reqCause != EServiceReqCause::IDLE_PAGING && + reqCause != EServiceReqCause::CONNECTED_3GPP_NOTIFICATION_N3GPP && + reqCause != EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP && !isHighPriority() && !hasEmergency() && + reqCause != EServiceReqCause::EMERGENCY_FALLBACK) + { + m_logger->debug("Service Request canceled, T3346 is running"); + return; + } + } + auto request = std::make_unique(); if (reqCause == EServiceReqCause::IDLE_PAGING) From c56364ac2675d8c5d82525291607bc4a5ecbe405 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 21:53:01 +0300 Subject: [PATCH 077/116] Service request abnormal case handling improvements --- src/ue/nas/mm/dereg.cpp | 7 +++++++ src/ue/nas/mm/register.cpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 50ff934e1..04f304b23 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -158,6 +158,13 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi forceIgnoreReregistration = true; } } + // 5.6.1.7 Abnormal cases in the UE (de-registration collision) + else if (m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) + { + // "UE shall progress the DEREGISTRATION REQUEST message and the service request procedure shall be aborted." + // (no specific action is required herein to abort service request procedure) + (void)0; + } bool reRegistrationRequired = msg.deRegistrationType.reRegistrationRequired == nas::EReRegistrationRequired::REQUIRED && diff --git a/src/ue/nas/mm/register.cpp b/src/ue/nas/mm/register.cpp index a1b418098..29eb1e1b1 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -125,6 +125,13 @@ void NasMm::sendMobilityRegistration(ERegUpdateCause updateCause) } } + // 5.6.1.7 Abnormal cases in the UE + // d) Registration procedure for mobility and periodic registration update is triggered + if (m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) + { + m_timers->t3517.stop(); + } + m_logger->debug("Sending %s with update cause [%s]", nas::utils::EnumToString(updateCause == ERegUpdateCause::T3512_EXPIRY ? nas::ERegistrationType::PERIODIC_REGISTRATION_UPDATING From 8bee2c2b2bacbf1eabf27c5ff7af0396c58fd7f4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 21:56:45 +0300 Subject: [PATCH 078/116] Service request dev. --- src/ue/nas/mm/mm.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 08a8ca530..027753a4f 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -136,8 +136,10 @@ class NasMm nas::IE5gsMobileIdentity generateSuci(); nas::IE5gsMobileIdentity getOrGeneratePreferredId(); - private: /* Service */ + public: /* Service */ void sendServiceRequest(EServiceReqCause reqCause); + + private: /* Service */ void receiveServiceAccept(const nas::ServiceAccept &msg); void receiveServiceReject(const nas::ServiceReject &msg); From a8b4fdd097491ee406742436f0c3c429f56206a2 Mon Sep 17 00:00:00 2001 From: aligungr Date: Mon, 5 Apr 2021 22:18:24 +0300 Subject: [PATCH 079/116] Service request dev. --- src/ue/nas/mm/service.cpp | 12 ++++++++++++ src/ue/nas/mm/timer.cpp | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 5ba5f1e92..afebd3f1a 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -18,6 +18,18 @@ void NasMm::sendServiceRequest(EServiceReqCause reqCause) m_logger->debug("Sending Service Request due to [%s]", ToJson(reqCause).str().c_str()); // 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) + { + m_logger->debug("Service Request canceled, T3346 is running"); + return; + } + } // c) Timer T3346 is running. if (m_timers->t3346.isRunning()) { diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index ce12160a4..75f157b80 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -87,6 +87,27 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) } break; } + case 3517: { + if (m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) + { + logExpired(); + + switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); + switchRmState(ERmState::RM_REGISTERED); + + if (m_cmState == ECmState::CM_IDLE && m_lastServiceReqCause != EServiceReqCause::EMERGENCY_FALLBACK) + { + if (!hasEmergency() && !isHighPriority() && m_lastServiceReqCause != EServiceReqCause::IDLE_PAGING && + m_lastServiceReqCause != EServiceReqCause::IDLE_3GPP_NOTIFICATION_N3GPP && + m_lastServiceReqCause != EServiceReqCause::CONNECTED_3GPP_NOTIFICATION_N3GPP) + m_serCounter++; + + if (m_serCounter >= 5) + m_timers->t3525.start(); + } + } + break; + } case 3519: { m_usim->m_storedSuci = {}; break; From 7c03eefd603804ee34559cac8eb75537305f8715 Mon Sep 17 00:00:00 2001 From: aligungr Date: Tue, 6 Apr 2021 22:33:05 +0300 Subject: [PATCH 080/116] T3521 bug fix --- src/ue/nas/mm/timer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ue/nas/mm/timer.cpp b/src/ue/nas/mm/timer.cpp index 75f157b80..502acb073 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -126,6 +126,8 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) else if (m_lastDeregistrationRequest->deRegistrationType.switchOff == nas::ESwitchOff::NORMAL_DE_REGISTRATION) switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); + + switchRmState(ERmState::RM_DEREGISTERED); } } else From d76d2453c15c24e1819dfd801bd0c910bab3a939 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 17:53:11 +0300 Subject: [PATCH 081/116] SD field removed from Open5gs sample configs --- config/open5gs-gnb.yaml | 1 - config/open5gs-ue.yaml | 1 - 2 files changed, 2 deletions(-) diff --git a/config/open5gs-gnb.yaml b/config/open5gs-gnb.yaml index 88e210dfe..d825a80c6 100644 --- a/config/open5gs-gnb.yaml +++ b/config/open5gs-gnb.yaml @@ -17,7 +17,6 @@ amfConfigs: # List of supported S-NSSAIs by this gNB slices: - sst: 1 - sd: 1 # Indicates whether or not SCTP stream number errors should be ignored. ignoreStreamIds: true diff --git a/config/open5gs-ue.yaml b/config/open5gs-ue.yaml index 7c1761793..d6779ed65 100644 --- a/config/open5gs-ue.yaml +++ b/config/open5gs-ue.yaml @@ -34,7 +34,6 @@ sessions: # Configured NSSAI for this UE by HPLMN configured-nssai: - sst: 1 - sd: 1 # Default Configured NSSAI for this UE default-nssai: From f0c8eec6179d081c260e8b35e8a5379f9fb0fa18 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 18:20:29 +0300 Subject: [PATCH 082/116] UE context release request added to gNB CLI --- src/app/cli_cmd.cpp | 13 +++++++++++++ src/app/cli_cmd.hpp | 6 +++++- src/gnb/app/cmd_handler.cpp | 14 +++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/app/cli_cmd.cpp b/src/app/cli_cmd.cpp index 8f88738bc..f8ec97502 100644 --- a/src/app/cli_cmd.cpp +++ b/src/app/cli_cmd.cpp @@ -150,6 +150,7 @@ static OrderedMap g_gnbCmdEntries = { {"amf-info", {"Show some status information about the given AMF", "", DefaultDesc, true}}, {"ue-list", {"List all UEs associated with the gNB", "", DefaultDesc, false}}, {"ue-count", {"Print the total number of UEs connected the this gNB", "", DefaultDesc, false}}, + {"ue-release", {"Request a UE context release for the given UE", "", DefaultDesc, false}}, }; static OrderedMap g_ueCmdEntries = { @@ -200,6 +201,18 @@ static std::unique_ptr GnbCliParseImpl(const std::string &subCmd, { return std::make_unique(GnbCliCommand::UE_COUNT); } + else if (subCmd == "ue-release") + { + auto cmd = std::make_unique(GnbCliCommand::UE_RELEASE_REQ); + if (options.positionalCount() == 0) + CMD_ERR("UE ID is expected") + if (options.positionalCount() > 1) + CMD_ERR("Only one UE ID is expected") + cmd->ueId = utils::ParseInt(options.getPositional(0)); + if (cmd->ueId <= 0) + CMD_ERR("Invalid UE ID") + return cmd; + } return nullptr; } diff --git a/src/app/cli_cmd.hpp b/src/app/cli_cmd.hpp index e46e5cda6..b980c675a 100644 --- a/src/app/cli_cmd.hpp +++ b/src/app/cli_cmd.hpp @@ -26,12 +26,16 @@ struct GnbCliCommand AMF_LIST, AMF_INFO, UE_LIST, - UE_COUNT + UE_COUNT, + UE_RELEASE_REQ, } present; // AMF_INFO int amfId{}; + // UE_RELEASE_REQ + int ueId{}; + explicit GnbCliCommand(PR present) : present(present) { } diff --git a/src/gnb/app/cmd_handler.cpp b/src/gnb/app/cmd_handler.cpp index 5572bacca..f24fec460 100644 --- a/src/gnb/app/cmd_handler.cpp +++ b/src/gnb/app/cmd_handler.cpp @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -131,6 +131,7 @@ void GnbCmdHandler::handleCmdImpl(NwGnbCliCommand &msg) for (auto &ue : m_base->ngapTask->m_ueCtx) { json.push(Json::Obj({ + {"ue-id", ue.first}, {"ran-ngap-id", ue.second->ranUeNgapId}, {"amf-ngap-id", ue.second->amfUeNgapId}, })); @@ -142,6 +143,17 @@ void GnbCmdHandler::handleCmdImpl(NwGnbCliCommand &msg) sendResult(msg.address, std::to_string(m_base->ngapTask->m_ueCtx.size())); break; } + case app::GnbCliCommand::UE_RELEASE_REQ: { + if (m_base->ngapTask->m_ueCtx.count(msg.cmd->ueId) == 0) + sendError(msg.address, "UE not found with given ID"); + else + { + auto ue = m_base->ngapTask->m_ueCtx[msg.cmd->ueId]; + m_base->ngapTask->sendContextRelease(ue->ctxId, NgapCause::RadioNetwork_unspecified); + sendResult(msg.address, "UE Context Release Request is sending for specified UE"); + } + break; + } } } From f7accb1828070429f3e61a4b20a1ff0998c8b971 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 18:21:42 +0300 Subject: [PATCH 083/116] UE context release request added to gNB CLI --- src/gnb/app/cmd_handler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gnb/app/cmd_handler.cpp b/src/gnb/app/cmd_handler.cpp index f24fec460..a3b94ccde 100644 --- a/src/gnb/app/cmd_handler.cpp +++ b/src/gnb/app/cmd_handler.cpp @@ -150,7 +150,7 @@ void GnbCmdHandler::handleCmdImpl(NwGnbCliCommand &msg) { auto ue = m_base->ngapTask->m_ueCtx[msg.cmd->ueId]; m_base->ngapTask->sendContextRelease(ue->ctxId, NgapCause::RadioNetwork_unspecified); - sendResult(msg.address, "UE Context Release Request is sending for specified UE"); + sendResult(msg.address, "Requesting UE context release"); } break; } From 383f512ab7f45482e9a1cf706e381959f04363e7 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 18:22:45 +0300 Subject: [PATCH 084/116] Service Request refactor --- src/ue/nas/mm/mm.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 027753a4f..08a8ca530 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -136,10 +136,8 @@ class NasMm nas::IE5gsMobileIdentity generateSuci(); nas::IE5gsMobileIdentity getOrGeneratePreferredId(); - public: /* Service */ - void sendServiceRequest(EServiceReqCause reqCause); - private: /* Service */ + void sendServiceRequest(EServiceReqCause reqCause); void receiveServiceAccept(const nas::ServiceAccept &msg); void receiveServiceReject(const nas::ServiceReject &msg); From 069fb23cc8dc4629661aac261b9b1a8b14149419 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 18:27:11 +0300 Subject: [PATCH 085/116] Service Request attempt counter reset on mobility registration --- 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 29eb1e1b1..690583d28 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -421,6 +421,10 @@ 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 + // registration update is successfully completed + m_serCounter = 0; + if (sendComplete) sendNasMessage(nas::RegistrationComplete{}); From 5938236d64acf52787b0df8d3f1f3ab267ccad4a Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 18:37:59 +0300 Subject: [PATCH 086/116] Service Request on uplink data pending --- src/ue/nas/mm/interface.cpp | 14 ++++++++++++++ src/ue/nas/mm/mm.hpp | 3 +++ src/ue/nas/sm/resource.cpp | 4 +++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index 4337ddca7..5cff8a5bb 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -10,6 +10,8 @@ #include +static constexpr const int64_t SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD = 1000; + namespace nr::ue { @@ -76,4 +78,16 @@ 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; + } +} + } // namespace nr::ue diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 08a8ca530..dd8dfa0ab 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -56,6 +56,8 @@ class NasMm bool m_registeredForEmergency{}; // Network feature support information nas::IE5gsNetworkFeatureSupport m_nwFeatureSupport{}; + // Last time Service Request needed indication for Data + long m_lastTimeServiceReqNeededIndForData{}; friend class UeCmdHandler; @@ -173,6 +175,7 @@ class NasMm void deliverUlTransport(const nas::UlNasTransport &msg); // used by SM bool isRegistered(); // used by SM bool isRegisteredForEmergency(); // used by SM + void serviceNeededForUplinkData(); // used by SM }; } // 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 7ef7df24e..34ce0b4eb 100644 --- a/src/ue/nas/sm/resource.cpp +++ b/src/ue/nas/sm/resource.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace nr::ue { @@ -64,7 +65,8 @@ void NasSm::handleUplinkStatusChange(int psi, bool isPending) m_pduSessions[psi]->uplinkPending = isPending; - // TODO + if (isPending) + m_mm->serviceNeededForUplinkData(); } bool NasSm::anyUplinkDataPending() From 00e4a33c46aecc7e502477346c2acd2879e8f011 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 18:39:29 +0300 Subject: [PATCH 087/116] Service Request on uplink data pending --- src/ue/nas/mm/interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index 5cff8a5bb..53c23a5ae 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -81,7 +81,7 @@ bool NasMm::isRegisteredForEmergency() void NasMm::serviceNeededForUplinkData() { auto currentTime = utils::CurrentTimeMillis(); - if (currentTime - m_lastTimeServiceReqNeededIndForData <= SERVICE_REQUEST_NEEDED_FOR_DATA_THRESHOLD) + 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); From 492086e0a3750f3806fdc4dbfffda32b56cc27ee Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 18:42:27 +0300 Subject: [PATCH 088/116] Old TODO removed --- src/ue/nas/mm/transport.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ue/nas/mm/transport.cpp b/src/ue/nas/mm/transport.cpp index fff9dbe5a..7f6ed8b0a 100644 --- a/src/ue/nas/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -18,8 +18,6 @@ namespace nr::ue void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) { - // TODO trigger on send - OctetString pdu{}; if (m_usim->m_currentNsCtx && (m_usim->m_currentNsCtx->integrity != nas::ETypeOfIntegrityProtectionAlgorithm::IA0 || From 74452fe7558cf6b96f37bc727f2860d4c0248ebb Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 18:54:41 +0300 Subject: [PATCH 089/116] Uplink NAS signalling pending handling --- src/ue/nas/mm/transport.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/ue/nas/mm/transport.cpp b/src/ue/nas/mm/transport.cpp index 7f6ed8b0a..29fe47cfb 100644 --- a/src/ue/nas/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -10,18 +10,32 @@ #include #include #include -#include #include +#include namespace nr::ue { +static bool IsInitialNasMessage(const nas::PlainMmMessage &msg) +{ + return msg.messageType == nas::EMessageType::REGISTRATION_REQUEST || + msg.messageType == nas::EMessageType::DEREGISTRATION_REQUEST_UE_ORIGINATING || + msg.messageType == nas::EMessageType::SERVICE_REQUEST; +} + void 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) + sendServiceRequest(EServiceReqCause::IDLE_UPLINK_SIGNAL_PENDING); + return; + } + OctetString pdu{}; - if (m_usim->m_currentNsCtx && - (m_usim->m_currentNsCtx->integrity != nas::ETypeOfIntegrityProtectionAlgorithm::IA0 || - m_usim->m_currentNsCtx->ciphering != nas::ETypeOfCipheringAlgorithm::EA0)) + if (m_usim->m_currentNsCtx && (m_usim->m_currentNsCtx->integrity != nas::ETypeOfIntegrityProtectionAlgorithm::IA0 || + m_usim->m_currentNsCtx->ciphering != nas::ETypeOfCipheringAlgorithm::EA0)) { auto secured = nas_enc::Encrypt(*m_usim->m_currentNsCtx, msg); nas::EncodeNasMessage(*secured, pdu); From f460d829363c189b73793f46a5cd0dff70473e96 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 19:16:17 +0300 Subject: [PATCH 090/116] NAS MM refactor --- src/ue/nas/mm/base.cpp | 37 +++++++++++++++---------------------- src/ue/nas/mm/dereg.cpp | 4 ---- src/ue/nas/mm/mm.hpp | 1 - src/ue/nas/mm/register.cpp | 6 ------ src/ue/nas/mm/service.cpp | 10 ---------- src/ue/nas/mm/timer.cpp | 4 ---- 6 files changed, 15 insertions(+), 47 deletions(-) diff --git a/src/ue/nas/mm/base.cpp b/src/ue/nas/mm/base.cpp index 9b83bde0d..f9ba16c3d 100644 --- a/src/ue/nas/mm/base.cpp +++ b/src/ue/nas/mm/base.cpp @@ -138,6 +138,21 @@ void NasMm::performMmCycle() void NasMm::switchMmState(EMmState state, EMmSubState subState) { + ERmState oldRmState = m_rmState; + if (state == EMmState::MM_DEREGISTERED || state == EMmState::MM_REGISTERED_INITIATED) + m_rmState = ERmState::RM_DEREGISTERED; + else if (state == EMmState::MM_REGISTERED || state == EMmState::MM_SERVICE_REQUEST_INITIATED || + state == EMmState::MM_DEREGISTERED_INITIATED) + m_rmState = ERmState::RM_REGISTERED; + + onSwitchRmState(oldRmState, m_rmState); + + if (m_base->nodeListener) + { + m_base->nodeListener->onSwitch(app::NodeType::UE, m_base->config->getNodeName(), app::StateType::RM, + ToJson(oldRmState).str(), ToJson(m_rmState).str()); + } + EMmState oldState = m_mmState; EMmSubState oldSubState = m_mmSubState; @@ -160,25 +175,6 @@ void NasMm::switchMmState(EMmState state, EMmSubState subState) triggerMmCycle(); } -void NasMm::switchRmState(ERmState state) -{ - ERmState oldState = m_rmState; - m_rmState = state; - - onSwitchRmState(oldState, m_rmState); - - if (m_base->nodeListener) - { - m_base->nodeListener->onSwitch(app::NodeType::UE, m_base->config->getNodeName(), app::StateType::RM, - ToJson(oldState).str(), ToJson(m_rmState).str()); - } - - // No need to log it - // m_logger->info("UE switches to state [%s]", RmStateName(state)); - - triggerMmCycle(); -} - void NasMm::switchCmState(ECmState state) { ECmState oldState = m_cmState; @@ -258,7 +254,6 @@ void NasMm::onSwitchCmState(ECmState oldState, ECmState newState) if (regType == nas::ERegistrationType::INITIAL_REGISTRATION || regType == nas::ERegistrationType::EMERGENCY_REGISTRATION) { - switchRmState(ERmState::RM_DEREGISTERED); switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); switchUState(E5UState::U2_NOT_UPDATED); @@ -282,8 +277,6 @@ void NasMm::onSwitchCmState(ECmState oldState, ECmState newState) else if (m_lastDeregistrationRequest->deRegistrationType.switchOff == nas::ESwitchOff::NORMAL_DE_REGISTRATION) switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); - - switchRmState(ERmState::RM_DEREGISTERED); } } } diff --git a/src/ue/nas/mm/dereg.cpp b/src/ue/nas/mm/dereg.cpp index 04f304b23..d40c72ff8 100644 --- a/src/ue/nas/mm/dereg.cpp +++ b/src/ue/nas/mm/dereg.cpp @@ -77,7 +77,6 @@ void NasMm::sendDeregistration(EDeregCause deregCause) switchMmState(EMmState::MM_DEREGISTERED_INITIATED, EMmSubState::MM_DEREGISTERED_INITIATED_NA); else { - switchRmState(ERmState::RM_DEREGISTERED); switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); } } @@ -100,8 +99,6 @@ void NasMm::receiveDeregistrationAccept(const nas::DeRegistrationAcceptUeOrigina m_sm->localReleaseAllSessions(); - switchRmState(ERmState::RM_DEREGISTERED); - if (m_lastDeregCause == EDeregCause::DISABLE_5G) switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); else @@ -181,7 +178,6 @@ void NasMm::receiveDeregistrationRequest(const nas::DeRegistrationRequestUeTermi } sendNasMessage(nas::DeRegistrationAcceptUeTerminated{}); - switchRmState(ERmState::RM_DEREGISTERED); // "Upon sending a DEREGISTRATION ACCEPT message, the UE shall delete the rejected NSSAI as specified in // subclause 4.6.2.2." diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index dd8dfa0ab..6bf5987cf 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -72,7 +72,6 @@ class NasMm void triggerMmCycle(); void performMmCycle(); void switchMmState(EMmState state, EMmSubState subState); - void switchRmState(ERmState state); 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/register.cpp b/src/ue/nas/mm/register.cpp index 690583d28..8a327e295 100644 --- a/src/ue/nas/mm/register.cpp +++ b/src/ue/nas/mm/register.cpp @@ -245,7 +245,6 @@ void NasMm::receiveInitialRegistrationAccept(const nas::RegistrationAccept &msg) // 5GMM-REGISTERED and set the 5GS update status to 5U1 UPDATED. resetRegAttemptCounter(); switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - switchRmState(ERmState::RM_REGISTERED); 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 @@ -356,7 +355,6 @@ void NasMm::receiveMobilityRegistrationAccept(const nas::RegistrationAccept &msg resetRegAttemptCounter(); m_serCounter = 0; switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NORMAL_SERVICE); - switchRmState(ERmState::RM_REGISTERED); switchUState(E5UState::U1_UPDATED); // "If the ACCEPT message included a T3512 value IE, the UE shall use the value in T3512 value IE as @@ -467,8 +465,6 @@ void NasMm::receiveInitialRegistrationReject(const nas::RegistrationReject &msg) nas::utils::EnumToString(msg.eapMessage->eap->code)); } - switchRmState(ERmState::RM_DEREGISTERED); - auto handleAbnormalCase = [this, regType, cause]() { m_logger->debug("Handling Registration Reject abnormal case"); @@ -618,8 +614,6 @@ void NasMm::receiveMobilityRegistrationReject(const nas::RegistrationReject &msg nas::utils::EnumToString(msg.eapMessage->eap->code)); } - switchRmState(ERmState::RM_DEREGISTERED); - auto handleAbnormalCase = [this, regType, cause]() { m_logger->debug("Handling Registration Reject abnormal case"); diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index afebd3f1a..736892e41 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -222,7 +222,6 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) m_logger->debug("Handling Service Reject abnormal case"); switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); - switchRmState(ERmState::RM_REGISTERED); m_timers->t3517.stop(); }; @@ -307,43 +306,36 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) cause == nas::EMmCause::UE_IDENTITY_CANNOT_BE_DERIVED_FROM_NETWORK) { switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); - switchRmState(ERmState::RM_DEREGISTERED); } if (cause == nas::EMmCause::IMPLICITY_DEREGISTERED) { switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NORMAL_SERVICE); - switchRmState(ERmState::RM_DEREGISTERED); } if (cause == nas::EMmCause::PLMN_NOT_ALLOWED || cause == nas::EMmCause::SERVING_NETWORK_NOT_AUTHORIZED) { switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_PLMN_SEARCH); - switchRmState(ERmState::RM_DEREGISTERED); } if (cause == nas::EMmCause::TA_NOT_ALLOWED) { switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_LIMITED_SERVICE); - switchRmState(ERmState::RM_DEREGISTERED); } if (cause == nas::EMmCause::ROAMING_NOT_ALLOWED_IN_TA) { switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_PLMN_SEARCH); - switchRmState(ERmState::RM_REGISTERED); } if (cause == nas::EMmCause::NO_SUITIBLE_CELLS_IN_TA) { switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_LIMITED_SERVICE); - switchRmState(ERmState::RM_REGISTERED); } if (cause == nas::EMmCause::N1_MODE_NOT_ALLOWED) { switchMmState(EMmState::MM_NULL, EMmSubState::MM_NULL_NA); - switchRmState(ERmState::RM_DEREGISTERED); setN1Capability(false); } @@ -372,7 +364,6 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (!hasEmergency()) { switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); - switchRmState(ERmState::RM_REGISTERED); m_timers->t3517.stop(); } @@ -393,7 +384,6 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) if (cause == nas::EMmCause::RESTRICTED_SERVICE_AREA) { switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NON_ALLOWED_SERVICE); - switchRmState(ERmState::RM_REGISTERED); 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 502acb073..2f75e2b8f 100644 --- a/src/ue/nas/mm/timer.cpp +++ b/src/ue/nas/mm/timer.cpp @@ -54,7 +54,6 @@ 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.. - switchRmState(ERmState::RM_DEREGISTERED); switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); switchUState(E5UState::U2_NOT_UPDATED); @@ -93,7 +92,6 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) logExpired(); switchMmState(EMmState::MM_REGISTERED, EMmSubState::MM_REGISTERED_NA); - switchRmState(ERmState::RM_REGISTERED); if (m_cmState == ECmState::CM_IDLE && m_lastServiceReqCause != EServiceReqCause::EMERGENCY_FALLBACK) { @@ -126,8 +124,6 @@ void NasMm::onTimerExpire(nas::NasTimer &timer) else if (m_lastDeregistrationRequest->deRegistrationType.switchOff == nas::ESwitchOff::NORMAL_DE_REGISTRATION) switchMmState(EMmState::MM_DEREGISTERED, EMmSubState::MM_DEREGISTERED_NA); - - switchRmState(ERmState::RM_DEREGISTERED); } } else From 049eab5aef5f0d57f7e07f2992bebceb38aeef41 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 19:29:48 +0300 Subject: [PATCH 091/116] NAS MM refactor --- src/ue/nas/mm/mm.hpp | 1 - src/ue/nas/mm/service.cpp | 6 +----- src/ue/nas/mm/transport.cpp | 15 +++++---------- src/ue/nas/sm/transport.cpp | 2 +- 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/ue/nas/mm/mm.hpp b/src/ue/nas/mm/mm.hpp index 6bf5987cf..869cb5f47 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -85,7 +85,6 @@ class NasMm void receiveMmMessage(const nas::PlainMmMessage &msg); void receiveDlNasTransport(const nas::DlNasTransport &msg); void receiveMmStatus(const nas::FiveGMmStatus &msg); - void receiveMmCause(const nas::IE5gMmCause &msg); void sendMmStatus(nas::EMmCause cause); public: /* Registration */ diff --git a/src/ue/nas/mm/service.cpp b/src/ue/nas/mm/service.cpp index 736892e41..27055cc9e 100644 --- a/src/ue/nas/mm/service.cpp +++ b/src/ue/nas/mm/service.cpp @@ -204,11 +204,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) } if (msg.sht == nas::ESecurityHeaderType::NOT_PROTECTED) - { m_logger->warn("Not protected Service Reject message received"); - sendMmStatus(nas::EMmCause::UNSPECIFIED_PROTOCOL_ERROR); - return; - } // "On receipt of the SERVICE REJECT message, if the UE is in state 5GMM-SERVICE-REQUEST-INITIATED and the message // is integrity protected, the UE shall reset the service request attempt counter and stop timer T3517 if running." @@ -216,7 +212,7 @@ void NasMm::receiveServiceReject(const nas::ServiceReject &msg) m_timers->t3517.stop(); auto cause = msg.mmCause.value; - m_logger->err("Service Request failed [%s]", nas::utils::EnumToString(cause)); + m_logger->err("Service Reject received with cause [%s]", nas::utils::EnumToString(cause)); auto handleAbnormalCase = [this]() { m_logger->debug("Handling Service Reject abnormal case"); diff --git a/src/ue/nas/mm/transport.cpp b/src/ue/nas/mm/transport.cpp index 29fe47cfb..bc601bc17 100644 --- a/src/ue/nas/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -115,7 +115,7 @@ void NasMm::receiveNasMessage(const nas::NasMessage &msg) if (!m_usim->m_currentNsCtx) { - m_logger->warn("Secured NAS message received while no security context"); + m_logger->err("Secured NAS message received while no security context"); sendMmStatus(nas::EMmCause::MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE); return; } @@ -203,7 +203,7 @@ void NasMm::receiveMmMessage(const nas::PlainMmMessage &msg) receiveDlNasTransport((const nas::DlNasTransport &)msg); break; default: - m_logger->err("Unhandled NAS MM message received: %d", (int)msg.messageType); + m_logger->err("Unhandled NAS MM message received [%d]", (int)msg.messageType); break; } } @@ -212,7 +212,7 @@ void NasMm::receiveDlNasTransport(const nas::DlNasTransport &msg) { if (msg.payloadContainerType.payloadContainerType != nas::EPayloadContainerType::N1_SM_INFORMATION) { - m_logger->err("Unhandled DL NAS Transport type: %d", (int)msg.payloadContainerType.payloadContainerType); + m_logger->err("Unhandled DL NAS Transport type [%d]", (int)msg.payloadContainerType.payloadContainerType); return; } @@ -229,7 +229,7 @@ void NasMm::receiveDlNasTransport(const nas::DlNasTransport &msg) void NasMm::sendMmStatus(nas::EMmCause cause) { - m_logger->warn("Sending MM Status with cause %s", nas::utils::EnumToString(cause)); + m_logger->warn("Sending MM Status with cause [%s]", nas::utils::EnumToString(cause)); nas::FiveGMmStatus m; m.mmCause.value = cause; @@ -238,12 +238,7 @@ void NasMm::sendMmStatus(nas::EMmCause cause) void NasMm::receiveMmStatus(const nas::FiveGMmStatus &msg) { - receiveMmCause(msg.mmCause); -} - -void NasMm::receiveMmCause(const nas::IE5gMmCause &msg) -{ - m_logger->err("MM cause received: %s", nas::utils::EnumToString(msg.value)); + m_logger->err("MM status received with cause [%s]", nas::utils::EnumToString(msg.mmCause.value)); } } // namespace nr::ue diff --git a/src/ue/nas/sm/transport.cpp b/src/ue/nas/sm/transport.cpp index 2a02abf19..6a406b6e6 100644 --- a/src/ue/nas/sm/transport.cpp +++ b/src/ue/nas/sm/transport.cpp @@ -70,7 +70,7 @@ void NasSm::receiveSmMessage(const nas::SmMessage &msg) void NasSm::receiveSmStatus(const nas::FiveGSmStatus &msg) { - m_logger->err("SM Status received: %s", nas::utils::EnumToString(msg.smCause.value)); + m_logger->err("SM Status received with cause [%s]", nas::utils::EnumToString(msg.smCause.value)); if (msg.smCause.value == nas::ESmCause::INVALID_PTI_VALUE) { From b588f769c9b70bbe0e7636228f357415ad466123 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 19:36:35 +0300 Subject: [PATCH 092/116] Plain NAS messages are accepted for some types --- src/ue/nas/mm/transport.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/ue/nas/mm/transport.cpp b/src/ue/nas/mm/transport.cpp index bc601bc17..f5d13e8e7 100644 --- a/src/ue/nas/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -18,9 +18,20 @@ namespace nr::ue static bool IsInitialNasMessage(const nas::PlainMmMessage &msg) { - return msg.messageType == nas::EMessageType::REGISTRATION_REQUEST || - msg.messageType == nas::EMessageType::DEREGISTRATION_REQUEST_UE_ORIGINATING || - msg.messageType == nas::EMessageType::SERVICE_REQUEST; + auto msgType = msg.messageType; + return msgType == nas::EMessageType::REGISTRATION_REQUEST || + msgType == nas::EMessageType::DEREGISTRATION_REQUEST_UE_ORIGINATING || + msgType == nas::EMessageType::SERVICE_REQUEST; +} + +static bool IsAcceptedWithoutIntegrity(const nas::PlainMmMessage &msg) +{ + auto msgType = msg.messageType; + return msgType == nas::EMessageType::IDENTITY_REQUEST || msgType == nas::EMessageType::AUTHENTICATION_REQUEST || + msgType == nas::EMessageType::AUTHENTICATION_RESULT || msgType == nas::EMessageType::AUTHENTICATION_REJECT || + msgType == nas::EMessageType::REGISTRATION_REJECT || + msgType == nas::EMessageType::DEREGISTRATION_ACCEPT_UE_TERMINATED || + msgType == nas::EMessageType::SERVICE_REJECT; } void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) @@ -73,9 +84,9 @@ void NasMm::receiveNasMessage(const nas::NasMessage &msg) if (mmMsg.sht == nas::ESecurityHeaderType::NOT_PROTECTED) { - // If any NAS signalling message is received as not integrity protected even though the secure exchange of NAS - // messages has been established by the network, then the NAS shall discard this message - if (m_usim->m_currentNsCtx) + // If any NAS signalling message is received as not integrity protected even though the secure exchange of NAS + // messages has been established by the network, then the NAS shall discard this message + if (m_usim->m_currentNsCtx && !IsAcceptedWithoutIntegrity((const nas::PlainMmMessage &)mmMsg)) { m_logger->err( "Not integrity protected NAS message received after security establishment. Ignoring received " From 68036296a79fc3267d5d4724de75ba4dd2994203 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 20:14:02 +0300 Subject: [PATCH 093/116] NGAP paging handling --- src/gnb/ngap/task.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gnb/ngap/task.hpp b/src/gnb/ngap/task.hpp index dbcdc7fe6..4b52378d4 100644 --- a/src/gnb/ngap/task.hpp +++ b/src/gnb/ngap/task.hpp @@ -31,6 +31,7 @@ extern "C" struct ASN_NGAP_AMFConfigurationUpdate; extern "C" struct ASN_NGAP_OverloadStart; extern "C" struct ASN_NGAP_OverloadStop; extern "C" struct ASN_NGAP_PDUSessionResourceReleaseCommand; +extern "C" struct ASN_NGAP_Paging; namespace nr::gnb { @@ -118,6 +119,7 @@ class NgapTask : public NtsTask /* Radio resource control */ void handleRadioLinkFailure(int ueId); + void receivePaging(int amfId, ASN_NGAP_Paging *msg); }; } // namespace nr::gnb \ No newline at end of file From 96f19d78c6d0e96bffbee496c38935e1211c2fb1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 20:14:15 +0300 Subject: [PATCH 094/116] NGAP paging handling --- src/gnb/ngap/transport.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gnb/ngap/transport.cpp b/src/gnb/ngap/transport.cpp index 788b5d9d3..36f7c1c6c 100644 --- a/src/gnb/ngap/transport.cpp +++ b/src/gnb/ngap/transport.cpp @@ -288,6 +288,9 @@ void NgapTask::handleSctpMessage(int amfId, uint16_t stream, const UniqueBuffer case ASN_NGAP_InitiatingMessage__value_PR_PDUSessionResourceReleaseCommand: receiveSessionResourceReleaseCommand(amf->ctxId, &value.choice.PDUSessionResourceReleaseCommand); break; + case ASN_NGAP_InitiatingMessage__value_PR_Paging: + receivePaging(amf->ctxId, &value.choice.Paging); + break; default: m_logger->err("Unhandled NGAP initiating-message received (%d)", value.present); break; From 173e1468a44fec237dd7d2cbffbe7db51b8089e4 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 20:35:56 +0300 Subject: [PATCH 095/116] NGAP paging handling --- src/asn/utils/utils.hpp | 8 ++++++++ src/gnb/ngap/radio.cpp | 30 ++++++++++++++++++++++++++++++ src/gnb/nts.hpp | 10 +++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/asn/utils/utils.hpp b/src/asn/utils/utils.hpp index 8bd4c23c4..22cef52ba 100644 --- a/src/asn/utils/utils.hpp +++ b/src/asn/utils/utils.hpp @@ -198,4 +198,12 @@ inline Unique WrapUnique(T *ptr, asn_TYPE_descriptor_t &desc) return asn::Unique(ptr, asn::Deleter{desc}); } +template +inline Unique UniqueCopy(const T &value, asn_TYPE_descriptor_t &desc) +{ + auto *ptr = New(); + DeepCopy(desc, value, ptr); + return WrapUnique(ptr, desc); +} + } // namespace asn \ No newline at end of file diff --git a/src/gnb/ngap/radio.cpp b/src/gnb/ngap/radio.cpp index 5c2acf1f9..10fa6f64b 100644 --- a/src/gnb/ngap/radio.cpp +++ b/src/gnb/ngap/radio.cpp @@ -13,6 +13,9 @@ #include #include +#include +#include + namespace nr::gnb { @@ -27,4 +30,31 @@ void NgapTask::handleRadioLinkFailure(int ueId) sendContextRelease(ueId, NgapCause::RadioNetwork_radio_connection_with_ue_lost); } +void NgapTask::receivePaging(int amfId, ASN_NGAP_Paging *msg) +{ + m_logger->debug("Paging received"); + + auto *amf = findAmfContext(amfId); + if (amf == nullptr) + return; + + auto *w = new NwGnbNgapToRrc(NwGnbNgapToRrc::PAGING); + + auto *ieUePagingIdentity = asn::ngap::GetProtocolIe(msg, ASN_NGAP_ProtocolIE_ID_id_UEPagingIdentity); + if (ieUePagingIdentity) + { + if (ieUePagingIdentity->UEPagingIdentity.present == ASN_NGAP_UEPagingIdentity_PR_fiveG_S_TMSI) + w->uePagingTmsi = asn::UniqueCopy(*ieUePagingIdentity->UEPagingIdentity.choice.fiveG_S_TMSI, + asn_DEF_ASN_NGAP_FiveG_S_TMSI); + } + + auto *ieTaiListForPaging = asn::ngap::GetProtocolIe(msg, ASN_NGAP_ProtocolIE_ID_id_TAIListForPaging); + if (ieTaiListForPaging) + { + w->taiListForPaging = asn::UniqueCopy(ieTaiListForPaging->TAIListForPaging, asn_DEF_ASN_NGAP_TAIListForPaging); + } + + m_base->rrcTask->push(w); +} + } // namespace nr::gnb diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 9b006d273..64248e637 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -8,8 +8,10 @@ #pragma once +#include "types.hpp" #include #include +#include #include #include #include @@ -18,7 +20,8 @@ #include #include -#include "types.hpp" +extern "C" struct ASN_NGAP_FiveG_S_TMSI; +extern "C" struct ASN_NGAP_TAIListForPaging; namespace nr::gnb { @@ -103,6 +106,7 @@ struct NwGnbNgapToRrc : NtsMessage RADIO_POWER_ON, NAS_DELIVERY, AN_RELEASE, + PAGING, } present; // NAS_DELIVERY @@ -112,6 +116,10 @@ struct NwGnbNgapToRrc : NtsMessage // NAS_DELIVERY OctetString pdu{}; + // PAGING + asn::Unique uePagingTmsi{}; + asn::Unique taiListForPaging{}; + explicit NwGnbNgapToRrc(PR present) : NtsMessage(NtsMessageType::GNB_NGAP_TO_RRC), present(present) { } From 46aa9088ec76a8dd6cb82d8f4f34d36a4c1d6d1a Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 20:39:47 +0300 Subject: [PATCH 096/116] RRC paging handling --- src/gnb/rrc/handler.cpp | 6 ++++++ src/gnb/rrc/task.cpp | 3 +++ src/gnb/rrc/task.hpp | 2 ++ 3 files changed, 11 insertions(+) diff --git a/src/gnb/rrc/handler.cpp b/src/gnb/rrc/handler.cpp index 1dd50204d..bfd4703b3 100644 --- a/src/gnb/rrc/handler.cpp +++ b/src/gnb/rrc/handler.cpp @@ -169,4 +169,10 @@ void GnbRrcTask::handleRadioLinkFailure(int ueId) m_ueCtx.erase(ueId); } +void GnbRrcTask::handlePaging(const asn::Unique &tmsi, + const asn::Unique &taiList) +{ + // 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 48b381d15..a3e58647b 100644 --- a/src/gnb/rrc/task.cpp +++ b/src/gnb/rrc/task.cpp @@ -69,6 +69,9 @@ void GnbRrcTask::onLoop() releaseConnection(w->ueId); break; } + case NwGnbNgapToRrc::PAGING: + handlePaging(w->uePagingTmsi, w->taiListForPaging); + break; } break; } diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 931fbd74c..0081608da 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -70,6 +70,8 @@ class GnbRrcTask : public NtsTask void deliverUplinkNas(int ueId, OctetString &&nasPdu); void releaseConnection(int ueId); void handleRadioLinkFailure(int ueId); + void handlePaging(const asn::Unique &tmsi, + const asn::Unique &taiList); void receiveUplinkInformationTransfer(int ueId, const ASN_RRC_ULInformationTransfer &msg); void receiveRrcSetupRequest(int ueId, const ASN_RRC_RRCSetupRequest &msg); From fee7dfd37c796df775df3f507391f7da7cb29e74 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 20:56:15 +0300 Subject: [PATCH 097/116] RRC paging handling --- src/gnb/ngap/radio.cpp | 23 ++++++++++++++--------- src/gnb/nts.hpp | 3 +-- src/gnb/rrc/task.hpp | 3 +-- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/gnb/ngap/radio.cpp b/src/gnb/ngap/radio.cpp index 10fa6f64b..655f26f59 100644 --- a/src/gnb/ngap/radio.cpp +++ b/src/gnb/ngap/radio.cpp @@ -38,20 +38,25 @@ void NgapTask::receivePaging(int amfId, ASN_NGAP_Paging *msg) if (amf == nullptr) return; - auto *w = new NwGnbNgapToRrc(NwGnbNgapToRrc::PAGING); - auto *ieUePagingIdentity = asn::ngap::GetProtocolIe(msg, ASN_NGAP_ProtocolIE_ID_id_UEPagingIdentity); - if (ieUePagingIdentity) + auto *ieTaiListForPaging = asn::ngap::GetProtocolIe(msg, ASN_NGAP_ProtocolIE_ID_id_TAIListForPaging); + + if (ieUePagingIdentity == nullptr || ieTaiListForPaging == nullptr || + ieUePagingIdentity->UEPagingIdentity.present != ASN_NGAP_UEPagingIdentity_PR_fiveG_S_TMSI) { - if (ieUePagingIdentity->UEPagingIdentity.present == ASN_NGAP_UEPagingIdentity_PR_fiveG_S_TMSI) - w->uePagingTmsi = asn::UniqueCopy(*ieUePagingIdentity->UEPagingIdentity.choice.fiveG_S_TMSI, - asn_DEF_ASN_NGAP_FiveG_S_TMSI); + m_logger->err("Invalid parameters received in Paging message"); + return; } - auto *ieTaiListForPaging = asn::ngap::GetProtocolIe(msg, ASN_NGAP_ProtocolIE_ID_id_TAIListForPaging); - if (ieTaiListForPaging) + auto *w = new NwGnbNgapToRrc(NwGnbNgapToRrc::PAGING); + w->uePagingTmsi = + ngap_encode::EncodeS(asn_DEF_ASN_NGAP_FiveG_S_TMSI, ieUePagingIdentity->UEPagingIdentity.choice.fiveG_S_TMSI); + w->taiListForPaging = asn::UniqueCopy(ieTaiListForPaging->TAIListForPaging, asn_DEF_ASN_NGAP_TAIListForPaging); + if (w->uePagingTmsi.length() == 0) { - w->taiListForPaging = asn::UniqueCopy(ieTaiListForPaging->TAIListForPaging, asn_DEF_ASN_NGAP_TAIListForPaging); + m_logger->err("FiveG-S-TMSI encoding failed"); + delete w; + return; } m_base->rrcTask->push(w); diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index 64248e637..df111cad5 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -20,7 +20,6 @@ #include #include -extern "C" struct ASN_NGAP_FiveG_S_TMSI; extern "C" struct ASN_NGAP_TAIListForPaging; namespace nr::gnb @@ -117,7 +116,7 @@ struct NwGnbNgapToRrc : NtsMessage OctetString pdu{}; // PAGING - asn::Unique uePagingTmsi{}; + OctetString uePagingTmsi{}; asn::Unique taiListForPaging{}; explicit NwGnbNgapToRrc(PR present) : NtsMessage(NtsMessageType::GNB_NGAP_TO_RRC), present(present) diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 0081608da..ba04b9476 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -70,8 +70,7 @@ class GnbRrcTask : public NtsTask void deliverUplinkNas(int ueId, OctetString &&nasPdu); void releaseConnection(int ueId); void handleRadioLinkFailure(int ueId); - void handlePaging(const asn::Unique &tmsi, - const asn::Unique &taiList); + void handlePaging(const OctetString &tmsi, const asn::Unique &taiList); void receiveUplinkInformationTransfer(int ueId, const ASN_RRC_ULInformationTransfer &msg); void receiveRrcSetupRequest(int ueId, const ASN_RRC_RRCSetupRequest &msg); From d362390720dd6cd5412d67eb75f1a5d6f0cc2b7e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 21:01:43 +0300 Subject: [PATCH 098/116] RRC paging handling --- src/gnb/rrc/channel.cpp | 113 +++------------------------------------- src/gnb/rrc/handler.cpp | 22 ++++++-- src/gnb/rrc/task.hpp | 9 +--- 3 files changed, 27 insertions(+), 117 deletions(-) diff --git a/src/gnb/rrc/channel.cpp b/src/gnb/rrc/channel.cpp index a004c5d1b..9880e7a64 100644 --- a/src/gnb/rrc/channel.cpp +++ b/src/gnb/rrc/channel.cpp @@ -28,42 +28,6 @@ void GnbRrcTask::handleUplinkRrc(int ueId, rrc::RrcChannel channel, const OctetS asn::Free(asn_DEF_ASN_RRC_BCCH_BCH_Message, pdu); break; } - case rrc::RrcChannel::BCCH_DL_SCH: { - auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_BCCH_DL_SCH_Message, rrcPdu); - if (pdu == nullptr) - m_logger->err("RRC BCCH-DL-SCH PDU decoding failed."); - else - receiveRrcMessage(ueId, pdu); - asn::Free(asn_DEF_ASN_RRC_BCCH_DL_SCH_Message, pdu); - break; - } - case rrc::RrcChannel::DL_CCCH: { - auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_DL_CCCH_Message, rrcPdu); - if (pdu == nullptr) - m_logger->err("RRC DL-CCCH PDU decoding failed."); - else - receiveRrcMessage(ueId, pdu); - asn::Free(asn_DEF_ASN_RRC_DL_CCCH_Message, pdu); - 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(ueId, 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(ueId, pdu); - asn::Free(asn_DEF_ASN_RRC_PCCH_Message, pdu); - break; - } case rrc::RrcChannel::UL_CCCH: { auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_UL_CCCH_Message, rrcPdu); if (pdu == nullptr) @@ -91,6 +55,11 @@ void GnbRrcTask::handleUplinkRrc(int ueId, rrc::RrcChannel channel, const OctetS asn::Free(asn_DEF_ASN_RRC_UL_DCCH_Message, pdu); break; } + case rrc::RrcChannel::PCCH: + case rrc::RrcChannel::BCCH_DL_SCH: + case rrc::RrcChannel::DL_CCCH: + case rrc::RrcChannel::DL_DCCH: + break; } } @@ -158,7 +127,7 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg) m_base->rlsTask->push(w); } -void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg) +void GnbRrcTask::sendRrcMessage(ASN_RRC_PCCH_Message *msg) { OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_PCCH_Message, msg); if (pdu.length() == 0) @@ -168,85 +137,17 @@ void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg) } auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); - w->ueId = ueId; + w->ueId = 0; w->channel = rrc::RrcChannel::PCCH; w->pdu = std::move(pdu); m_base->rlsTask->push(w); } -void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH_Message *msg) -{ - OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_UL_CCCH_Message, msg); - if (pdu.length() == 0) - { - m_logger->err("RRC UL-CCCH encoding failed."); - return; - } - - auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); - w->ueId = ueId; - w->channel = rrc::RrcChannel::UL_CCCH; - w->pdu = std::move(pdu); - m_base->rlsTask->push(w); -} - -void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_CCCH1_Message *msg) -{ - OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_UL_CCCH1_Message, msg); - if (pdu.length() == 0) - { - m_logger->err("RRC UL-CCCH1 encoding failed."); - return; - } - - auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); - w->ueId = ueId; - w->channel = rrc::RrcChannel::UL_CCCH1; - w->pdu = std::move(pdu); - m_base->rlsTask->push(w); -} - -void GnbRrcTask::sendRrcMessage(int ueId, ASN_RRC_UL_DCCH_Message *msg) -{ - OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_UL_DCCH_Message, msg); - if (pdu.length() == 0) - { - m_logger->err("RRC UL-DCCH encoding failed."); - return; - } - - auto *w = new NwGnbRrcToRls(NwGnbRrcToRls::RRC_PDU_DELIVERY); - w->ueId = ueId; - w->channel = rrc::RrcChannel::UL_DCCH; - w->pdu = std::move(pdu); - m_base->rlsTask->push(w); -} - void GnbRrcTask::receiveRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg) { // TODO } -void GnbRrcTask::receiveRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg) -{ - // TODO -} - -void GnbRrcTask::receiveRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg) -{ - // TODO -} - -void GnbRrcTask::receiveRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg) -{ - // TODO -} - -void GnbRrcTask::receiveRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg) -{ - // TODO -} - void GnbRrcTask::receiveRrcMessage(int ueId, ASN_RRC_UL_CCCH_Message *msg) { if (msg->message.present != ASN_RRC_UL_CCCH_MessageType_PR_c1) diff --git a/src/gnb/rrc/handler.cpp b/src/gnb/rrc/handler.cpp index bfd4703b3..d15e9e079 100644 --- a/src/gnb/rrc/handler.cpp +++ b/src/gnb/rrc/handler.cpp @@ -19,6 +19,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -169,10 +172,23 @@ void GnbRrcTask::handleRadioLinkFailure(int ueId) m_ueCtx.erase(ueId); } -void GnbRrcTask::handlePaging(const asn::Unique &tmsi, - const asn::Unique &taiList) +void GnbRrcTask::handlePaging(const OctetString &tmsi, const asn::Unique &taiList) { - // TODO + // Construct and send a Paging message + auto *pdu = asn::New(); + pdu->message.present = ASN_RRC_PCCH_MessageType_PR_c1; + pdu->message.choice.c1 = asn::NewFor(pdu->message.choice.c1); + pdu->message.choice.c1->present = ASN_RRC_PCCH_MessageType__c1_PR_paging; + auto &paging = pdu->message.choice.c1->choice.paging = asn::New(); + + auto *record = asn::New(); + record->ue_Identity.present = ASN_RRC_PagingUE_Identity_PR_ng_5G_S_TMSI; + asn::SetBitString(record->ue_Identity.choice.ng_5G_S_TMSI, tmsi); + + paging->pagingRecordList = asn::NewFor(paging->pagingRecordList); + asn::SequenceAdd(*paging->pagingRecordList, record); + + sendRrcMessage(pdu); } } // namespace nr::gnb \ No newline at end of file diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index ba04b9476..6ff00bd08 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -81,17 +81,10 @@ class GnbRrcTask : public NtsTask 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); - void sendRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg); - void sendRrcMessage(int ueId, ASN_RRC_UL_CCCH_Message *msg); - void sendRrcMessage(int ueId, ASN_RRC_UL_CCCH1_Message *msg); - void sendRrcMessage(int ueId, ASN_RRC_UL_DCCH_Message *msg); + void sendRrcMessage(ASN_RRC_PCCH_Message *msg); /* RRC channel receive message */ void receiveRrcMessage(int ueId, ASN_RRC_BCCH_BCH_Message *msg); - void receiveRrcMessage(int ueId, ASN_RRC_BCCH_DL_SCH_Message *msg); - void receiveRrcMessage(int ueId, ASN_RRC_DL_CCCH_Message *msg); - void receiveRrcMessage(int ueId, ASN_RRC_DL_DCCH_Message *msg); - void receiveRrcMessage(int ueId, ASN_RRC_PCCH_Message *msg); 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); From abf4ffa6903a67e95024094ee4bf5db718844c9b Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 21:29:55 +0300 Subject: [PATCH 099/116] RRC paging handling --- src/gnb/ngap/radio.cpp | 8 +------- src/gnb/nts.hpp | 3 ++- src/gnb/rrc/task.hpp | 3 ++- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/gnb/ngap/radio.cpp b/src/gnb/ngap/radio.cpp index 655f26f59..52fecfd3c 100644 --- a/src/gnb/ngap/radio.cpp +++ b/src/gnb/ngap/radio.cpp @@ -50,14 +50,8 @@ void NgapTask::receivePaging(int amfId, ASN_NGAP_Paging *msg) auto *w = new NwGnbNgapToRrc(NwGnbNgapToRrc::PAGING); w->uePagingTmsi = - ngap_encode::EncodeS(asn_DEF_ASN_NGAP_FiveG_S_TMSI, ieUePagingIdentity->UEPagingIdentity.choice.fiveG_S_TMSI); + 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); - if (w->uePagingTmsi.length() == 0) - { - m_logger->err("FiveG-S-TMSI encoding failed"); - delete w; - return; - } m_base->rrcTask->push(w); } diff --git a/src/gnb/nts.hpp b/src/gnb/nts.hpp index df111cad5..64248e637 100644 --- a/src/gnb/nts.hpp +++ b/src/gnb/nts.hpp @@ -20,6 +20,7 @@ #include #include +extern "C" struct ASN_NGAP_FiveG_S_TMSI; extern "C" struct ASN_NGAP_TAIListForPaging; namespace nr::gnb @@ -116,7 +117,7 @@ struct NwGnbNgapToRrc : NtsMessage OctetString pdu{}; // PAGING - OctetString uePagingTmsi{}; + asn::Unique uePagingTmsi{}; asn::Unique taiListForPaging{}; explicit NwGnbNgapToRrc(PR present) : NtsMessage(NtsMessageType::GNB_NGAP_TO_RRC), present(present) diff --git a/src/gnb/rrc/task.hpp b/src/gnb/rrc/task.hpp index 6ff00bd08..d8cb15319 100644 --- a/src/gnb/rrc/task.hpp +++ b/src/gnb/rrc/task.hpp @@ -70,7 +70,8 @@ class GnbRrcTask : public NtsTask void deliverUplinkNas(int ueId, OctetString &&nasPdu); void releaseConnection(int ueId); void handleRadioLinkFailure(int ueId); - void handlePaging(const OctetString &tmsi, const asn::Unique &taiList); + void handlePaging(const asn::Unique &tmsi, + const asn::Unique &taiList); void receiveUplinkInformationTransfer(int ueId, const ASN_RRC_ULInformationTransfer &msg); void receiveRrcSetupRequest(int ueId, const ASN_RRC_RRCSetupRequest &msg); From d81431d330b3715225a3d6b5da184bbb5097a0fc Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 21:38:27 +0300 Subject: [PATCH 100/116] uint16_t overload added to OctetString for appendOctet2 function --- src/utils/octet_string.cpp | 6 ++++++ src/utils/octet_string.hpp | 1 + 2 files changed, 7 insertions(+) diff --git a/src/utils/octet_string.cpp b/src/utils/octet_string.cpp index 186f16168..d3339b170 100644 --- a/src/utils/octet_string.cpp +++ b/src/utils/octet_string.cpp @@ -36,6 +36,12 @@ void OctetString::appendOctet2(octet2 v) m_data.push_back(v[1]); } +void OctetString::appendOctet2(uint16_t v) +{ + appendOctet(static_cast(v >> 8 & 0xFF)); + appendOctet(static_cast(v & 0xFF)); +} + void OctetString::appendOctet2(int v) { appendOctet2(octet2{v}); diff --git a/src/utils/octet_string.hpp b/src/utils/octet_string.hpp index 2ab6a6420..6e30a104c 100644 --- a/src/utils/octet_string.hpp +++ b/src/utils/octet_string.hpp @@ -40,6 +40,7 @@ class OctetString void appendOctet(int v); void appendOctet(int bigHalf, int littleHalf); void appendOctet2(octet2 v); + void appendOctet2(uint16_t v); void appendOctet2(int v); void appendOctet3(octet3 v); void appendOctet3(int v); From 6df4d7ad5edabce72461b97e2e80ff661ac254bb Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 21:38:39 +0300 Subject: [PATCH 101/116] RRC paging handling --- src/gnb/rrc/handler.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gnb/rrc/handler.cpp b/src/gnb/rrc/handler.cpp index d15e9e079..8ea559546 100644 --- a/src/gnb/rrc/handler.cpp +++ b/src/gnb/rrc/handler.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -172,7 +173,8 @@ void GnbRrcTask::handleRadioLinkFailure(int ueId) m_ueCtx.erase(ueId); } -void GnbRrcTask::handlePaging(const OctetString &tmsi, const asn::Unique &taiList) +void GnbRrcTask::handlePaging(const asn::Unique &tmsi, + const asn::Unique &taiList) { // Construct and send a Paging message auto *pdu = asn::New(); @@ -183,7 +185,15 @@ void GnbRrcTask::handlePaging(const OctetString &tmsi, const asn::Unique(); record->ue_Identity.present = ASN_RRC_PagingUE_Identity_PR_ng_5G_S_TMSI; - asn::SetBitString(record->ue_Identity.choice.ng_5G_S_TMSI, tmsi); + + OctetString tmsiOctets{}; + tmsiOctets.appendOctet2(bits::Ranged16({ + {10, asn::GetBitStringInt<10>(tmsi->aMFSetID)}, + {6, asn::GetBitStringInt<10>(tmsi->aMFPointer)}, + })); + tmsiOctets.append(asn::GetOctetString(tmsi->fiveG_TMSI)); + + asn::SetBitString(record->ue_Identity.choice.ng_5G_S_TMSI, tmsiOctets); paging->pagingRecordList = asn::NewFor(paging->pagingRecordList); asn::SequenceAdd(*paging->pagingRecordList, record); From 0c9771a31bf8dd9b52954ff399be204f5eac852e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 21:41:32 +0300 Subject: [PATCH 102/116] gNB RRC paging handling --- src/gnb/rls/handler.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/gnb/rls/handler.cpp b/src/gnb/rls/handler.cpp index 0247dc3e8..477c2927a 100644 --- a/src/gnb/rls/handler.cpp +++ b/src/gnb/rls/handler.cpp @@ -74,7 +74,16 @@ void GnbRlsTask::handleDownlinkDelivery(int ueId, rls::EPduType pduType, OctetSt resp.pduType = pduType; resp.pdu = std::move(pdu); resp.payload = std::move(payload); - sendRlsMessage(ueId, resp); + + if (ueId != 0) + { + sendRlsMessage(ueId, resp); + } + else + { + for (auto &ue : m_ueCtx) + sendRlsMessage(ue.first, resp); + } } } // namespace nr::gnb From 2a4de4baf64b84011d2d95f6bcccb948fc29e62e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 21:42:59 +0300 Subject: [PATCH 103/116] UE RRC refactor --- src/ue/rrc/channel.cpp | 119 ++--------------------------------------- src/ue/rrc/task.hpp | 7 --- 2 files changed, 3 insertions(+), 123 deletions(-) diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index ac0ffb143..d8ba0487d 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -68,34 +68,11 @@ void UeRrcTask::handleDownlinkRrc(rrc::RrcChannel channel, const OctetString &rr asn::Free(asn_DEF_ASN_RRC_PCCH_Message, pdu); break; } - case rrc::RrcChannel::UL_CCCH: { - auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_UL_CCCH_Message, rrcPdu); - if (pdu == nullptr) - m_logger->err("RRC UL-CCCH PDU decoding failed."); - else - receiveRrcMessage(pdu); - asn::Free(asn_DEF_ASN_RRC_UL_CCCH_Message, pdu); - break; - } - case rrc::RrcChannel::UL_CCCH1: { - auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_UL_CCCH1_Message, rrcPdu); - if (pdu == nullptr) - m_logger->err("RRC UL-CCCH1 PDU decoding failed."); - else - receiveRrcMessage(pdu); - asn::Free(asn_DEF_ASN_RRC_UL_CCCH1_Message, pdu); + case rrc::RrcChannel::UL_CCCH: + case rrc::RrcChannel::UL_CCCH1: + case rrc::RrcChannel::UL_DCCH: break; } - case rrc::RrcChannel::UL_DCCH: { - auto *pdu = rrc::encode::Decode(asn_DEF_ASN_RRC_UL_DCCH_Message, rrcPdu); - if (pdu == nullptr) - m_logger->err("RRC UL-DCCH PDU decoding failed."); - else - receiveRrcMessage(pdu); - asn::Free(asn_DEF_ASN_RRC_UL_DCCH_Message, pdu); - break; - } - } } void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) @@ -113,66 +90,6 @@ void UeRrcTask::sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg) m_base->rlsTask->push(nw); } -void UeRrcTask::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) - { - m_logger->err("RRC BCCH-DL-SCH encoding failed."); - return; - } - - auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); - nw->channel = rrc::RrcChannel::BCCH_DL_SCH; - nw->pdu = std::move(pdu); - m_base->rlsTask->push(nw); -} - -void UeRrcTask::sendRrcMessage(ASN_RRC_DL_CCCH_Message *msg) -{ - OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_DL_CCCH_Message, msg); - if (pdu.length() == 0) - { - m_logger->err("RRC DL-CCCH encoding failed."); - return; - } - - auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); - nw->channel = rrc::RrcChannel::DL_CCCH; - nw->pdu = std::move(pdu); - m_base->rlsTask->push(nw); -} - -void UeRrcTask::sendRrcMessage(ASN_RRC_DL_DCCH_Message *msg) -{ - OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_DL_DCCH_Message, msg); - if (pdu.length() == 0) - { - m_logger->err("RRC DL-DCCH encoding failed."); - return; - } - - auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); - nw->channel = rrc::RrcChannel::DL_DCCH; - nw->pdu = std::move(pdu); - m_base->rlsTask->push(nw); -} - -void UeRrcTask::sendRrcMessage(ASN_RRC_PCCH_Message *msg) -{ - OctetString pdu = rrc::encode::EncodeS(asn_DEF_ASN_RRC_PCCH_Message, msg); - if (pdu.length() == 0) - { - m_logger->err("RRC PCCH encoding failed."); - return; - } - - auto *nw = new NwUeRrcToRls(NwUeRrcToRls::RRC_PDU_DELIVERY); - nw->channel = rrc::RrcChannel::PCCH; - 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); @@ -271,34 +188,4 @@ void UeRrcTask::receiveRrcMessage(ASN_RRC_PCCH_Message *msg) // TODO } -void UeRrcTask::receiveRrcMessage(ASN_RRC_UL_CCCH_Message *msg) -{ - if (msg->message.present != ASN_RRC_UL_CCCH_MessageType_PR_c1) - return; - - auto &c1 = msg->message.choice.c1; - switch (c1->present) - { - case ASN_RRC_UL_CCCH_MessageType__c1_PR_NOTHING: - break; - case ASN_RRC_UL_CCCH_MessageType__c1_PR_rrcSetupRequest: - break; // todo - case ASN_RRC_UL_CCCH_MessageType__c1_PR_rrcResumeRequest: - break; // todo - case ASN_RRC_UL_CCCH_MessageType__c1_PR_rrcReestablishmentRequest: - break; // todo - case ASN_RRC_UL_CCCH_MessageType__c1_PR_rrcSystemInfoRequest: - break; // todo - } -} - -void UeRrcTask::receiveRrcMessage(ASN_RRC_UL_CCCH1_Message *msg) -{ - // TODO -} - -void UeRrcTask::receiveRrcMessage(ASN_RRC_UL_DCCH_Message *msg) -{ -} - } // namespace nr::ue diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index dd3be84fa..05e57e9d5 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -78,10 +78,6 @@ class UeRrcTask : public NtsTask /* RRC channel send message */ void sendRrcMessage(ASN_RRC_BCCH_BCH_Message *msg); - void sendRrcMessage(ASN_RRC_BCCH_DL_SCH_Message *msg); - void sendRrcMessage(ASN_RRC_DL_CCCH_Message *msg); - void sendRrcMessage(ASN_RRC_DL_DCCH_Message *msg); - void sendRrcMessage(ASN_RRC_PCCH_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); @@ -92,9 +88,6 @@ class UeRrcTask : public NtsTask 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(ASN_RRC_UL_CCCH_Message *msg); - void receiveRrcMessage(ASN_RRC_UL_CCCH1_Message *msg); - void receiveRrcMessage(ASN_RRC_UL_DCCH_Message *msg); }; } // namespace nr::ue From 4fa238211237be18e62af232fae232c0c7520ed1 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 21:45:31 +0300 Subject: [PATCH 104/116] UE RRC paging handling --- src/ue/rrc/channel.cpp | 13 ++++++++++++- src/ue/rrc/handler.cpp | 6 ++++++ src/ue/rrc/task.hpp | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ue/rrc/channel.cpp b/src/ue/rrc/channel.cpp index d8ba0487d..8c7dae2b8 100644 --- a/src/ue/rrc/channel.cpp +++ b/src/ue/rrc/channel.cpp @@ -185,7 +185,18 @@ void UeRrcTask::receiveRrcMessage(ASN_RRC_DL_DCCH_Message *msg) void UeRrcTask::receiveRrcMessage(ASN_RRC_PCCH_Message *msg) { - // TODO + if (msg->message.present != ASN_RRC_PCCH_MessageType_PR_c1) + return; + + auto &c1 = msg->message.choice.c1; + switch (c1->present) + { + case ASN_RRC_PCCH_MessageType__c1_PR_paging: + receivePaging(*c1->choice.paging); + break; + default: + break; + } } } // namespace nr::ue diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index a73a37142..3916c9793 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -131,4 +131,10 @@ void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) m_base->nasTask->push(new NwUeRrcToNas(NwUeRrcToNas::RRC_CONNECTION_RELEASE)); } +void UeRrcTask::receivePaging(const ASN_RRC_Paging &msg) +{ + // TODO + m_logger->err("Paging received"); +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/rrc/task.hpp b/src/ue/rrc/task.hpp index 05e57e9d5..96c669d2a 100644 --- a/src/ue/rrc/task.hpp +++ b/src/ue/rrc/task.hpp @@ -35,6 +35,7 @@ extern "C" struct ASN_RRC_RRCSetup; struct ASN_RRC_RRCReject; struct ASN_RRC_RRCRelease; + struct ASN_RRC_Paging; } namespace nr::ue @@ -73,6 +74,7 @@ class UeRrcTask : public NtsTask 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(); From 31337c434828fc0e30ac1e2534e1fe163ecda2a5 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 22:06:34 +0300 Subject: [PATCH 105/116] UE RRC paging handling --- src/ue/nas/mm/interface.cpp | 5 +++++ src/ue/nas/mm/mm.hpp | 1 + src/ue/nas/mm/radio.cpp | 5 +++++ src/ue/nts.hpp | 4 ++++ src/ue/rrc/handler.cpp | 25 +++++++++++++++++++++++-- 5 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/ue/nas/mm/interface.cpp b/src/ue/nas/mm/interface.cpp index 53c23a5ae..d1ff872fa 100644 --- a/src/ue/nas/mm/interface.cpp +++ b/src/ue/nas/mm/interface.cpp @@ -44,6 +44,11 @@ void NasMm::handleRrcEvent(const NwUeRrcToNas &msg) } 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 869cb5f47..bb5f5a160 100644 --- a/src/ue/nas/mm/mm.hpp +++ b/src/ue/nas/mm/mm.hpp @@ -152,6 +152,7 @@ class NasMm void handleRrcConnectionRelease(); void handleServingCellChange(const UeCellInfo &servingCell); void handleRadioLinkFailure(); + void handlePaging(const std::vector &tmsiIds); private: /* Access Control */ bool isHighPriority(); diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 2a965402e..ddd6e7265 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -228,4 +228,9 @@ void NasMm::localReleaseConnection() m_base->rrcTask->push(new NwUeNasToRrc(NwUeNasToRrc::LOCAL_RELEASE_CONNECTION)); } +void NasMm::handlePaging(const std::vector &tmsiIds) +{ + // TODO +} + } // namespace nr::ue \ No newline at end of file diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index ef613be8e..915223565 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -67,6 +67,7 @@ struct NwUeRrcToNas : NtsMessage RRC_CONNECTION_RELEASE, RADIO_LINK_FAILURE, SERVING_CELL_CHANGE, + PAGING, } present; // NAS_DELIVERY @@ -78,6 +79,9 @@ struct NwUeRrcToNas : NtsMessage // SERVING_CELL_CHANGE UeCellInfo servingCell{}; + // PAGING + std::vector pagingTmsi{}; + explicit NwUeRrcToNas(PR present) : NtsMessage(NtsMessageType::UE_RRC_TO_NAS), present(present) { } diff --git a/src/ue/rrc/handler.cpp b/src/ue/rrc/handler.cpp index 3916c9793..0c3974f04 100644 --- a/src/ue/rrc/handler.cpp +++ b/src/ue/rrc/handler.cpp @@ -15,6 +15,9 @@ #include #include +#include +#include +#include #include #include #include @@ -133,8 +136,26 @@ void UeRrcTask::receiveRrcRelease(const ASN_RRC_RRCRelease &msg) void UeRrcTask::receivePaging(const ASN_RRC_Paging &msg) { - // TODO - m_logger->err("Paging received"); + std::vector tmsiIds{}; + + asn::ForeachItem(*msg.pagingRecordList, [&tmsiIds](auto &pagingRecord) { + if (pagingRecord.ue_Identity.present == ASN_RRC_PagingUE_Identity_PR_ng_5G_S_TMSI) + { + auto recordTmsi = asn::GetOctetString(pagingRecord.ue_Identity.choice.ng_5G_S_TMSI); + auto tmsiOs = BitBuffer{recordTmsi.data()}; + + GutiMobileIdentity tmsi{}; + tmsi.amfSetId = tmsiOs.readBits(10); + tmsi.amfPointer = tmsiOs.readBits(6); + tmsi.tmsi = octet4{static_cast(tmsiOs.readBitsLong(32) & 0xFFFFFFFFu)}; + + tmsiIds.push_back(tmsi); + } + }); + + auto *w = new NwUeRrcToNas(NwUeRrcToNas::PAGING); + w->pagingTmsi = std::move(tmsiIds); + m_base->nasTask->push(w); } } // namespace nr::ue \ No newline at end of file From a657286142cae9f08e925af6de319dba7d65b473 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 22:18:45 +0300 Subject: [PATCH 106/116] OctetView refactor --- src/utils/octet.hpp | 16 ++++++++-------- src/utils/octet_view.hpp | 5 ----- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/utils/octet.hpp b/src/utils/octet.hpp index ba5a14825..23f8cdf37 100644 --- a/src/utils/octet.hpp +++ b/src/utils/octet.hpp @@ -42,7 +42,7 @@ struct octet return static_cast(value); } - inline bool bit(int index) const + [[nodiscard]] inline bool bit(int index) const { assert(index >= 0 && index <= 7); std::bitset<8> bitset = value; @@ -93,11 +93,6 @@ struct octet2 { return value; } - - explicit constexpr operator int16_t() const - { - return static_cast(value); - } }; struct octet3 @@ -171,15 +166,20 @@ struct octet4 return (value >> (24 - index * 8)) & 0xFF; } - explicit constexpr operator int32_t() const + inline explicit constexpr operator int32_t() const { return static_cast(value); } - explicit constexpr operator uint32_t() const + inline explicit constexpr operator uint32_t() const { return value; } + + inline bool operator==(const octet4 &other) const + { + return value == other.value; + } }; struct octet8 diff --git a/src/utils/octet_view.hpp b/src/utils/octet_view.hpp index 62c69eb89..aa44b06df 100644 --- a/src/utils/octet_view.hpp +++ b/src/utils/octet_view.hpp @@ -63,11 +63,6 @@ class OctetView return octet2{read(), read()}; } - inline int16_t read2S() const - { - return (int16_t)read2(); - } - inline uint16_t read2US() const { return (uint16_t)read2(); From c1e093e8549232a1a843fa89663043b3a3d08a66 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 22:19:03 +0300 Subject: [PATCH 107/116] NAS paging handling --- src/ue/nas/mm/radio.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index ddd6e7265..94a64b375 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -230,6 +230,26 @@ void NasMm::localReleaseConnection() void NasMm::handlePaging(const std::vector &tmsiIds) { + // Check received TMSI identities + if (m_usim->m_storedGuti.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) + { + tmsiMatches = true; + break; + } + } + + if (!tmsiMatches) + return; + + // Handle Paging message + m_logger->debug("Paging received"); // TODO } From 83db34468cab5c6a47bbba0d3507ef9c977d19ba Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 22:24:38 +0300 Subject: [PATCH 108/116] Paging procedure implementation --- src/ue/nas/mm/radio.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 94a64b375..7ca05fdfa 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -230,7 +230,6 @@ void NasMm::localReleaseConnection() void NasMm::handlePaging(const std::vector &tmsiIds) { - // Check received TMSI identities if (m_usim->m_storedGuti.type == nas::EIdentityType::NO_IDENTITY) return; bool tmsiMatches = false; @@ -248,9 +247,21 @@ void NasMm::handlePaging(const std::vector &tmsiIds) if (!tmsiMatches) return; - // Handle Paging message m_logger->debug("Paging received"); - // TODO + + m_timers->t3346.stop(); + + if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED || + m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) + { + m_logger->debug("Paging ignored"); + return; + } + + if (m_cmState == ECmState::CM_CONNECTED) + sendMobilityRegistration(ERegUpdateCause::PAGING_OR_NOTIFICATION); + else + sendServiceRequest(EServiceReqCause::IDLE_PAGING); } } // namespace nr::ue \ No newline at end of file From dfe78d5f9c0fdfbe3e16d4f323fcfea6fb540b58 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 22:33:00 +0300 Subject: [PATCH 109/116] Paging procedure implementation --- src/ue/nas/mm/radio.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ue/nas/mm/radio.cpp b/src/ue/nas/mm/radio.cpp index 7ca05fdfa..05471d765 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -247,17 +247,17 @@ void NasMm::handlePaging(const std::vector &tmsiIds) if (!tmsiMatches) return; - m_logger->debug("Paging received"); - m_timers->t3346.stop(); if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED || m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) { - m_logger->debug("Paging ignored"); + m_logger->debug("Ignoring received Paging. Already initiated another MM specific procedure or Service Request"); return; } + m_logger->debug("Responding to received Paging"); + if (m_cmState == ECmState::CM_CONNECTED) sendMobilityRegistration(ERegUpdateCause::PAGING_OR_NOTIFICATION); else From c2982a2e9162e7b2b7d7c7b28a70b9bfcc3db91f Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 22:40:16 +0300 Subject: [PATCH 110/116] Paging procedure implementation --- 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 05471d765..d0bdc469f 100644 --- a/src/ue/nas/mm/radio.cpp +++ b/src/ue/nas/mm/radio.cpp @@ -252,7 +252,7 @@ void NasMm::handlePaging(const std::vector &tmsiIds) if (m_mmState == EMmState::MM_REGISTERED_INITIATED || m_mmState == EMmState::MM_DEREGISTERED_INITIATED || m_mmState == EMmState::MM_SERVICE_REQUEST_INITIATED) { - m_logger->debug("Ignoring received Paging. Already initiated another MM specific procedure or Service Request"); + m_logger->debug("Ignoring received Paging, another procedure already initiated"); return; } From 65206b0f491f4a534b98071a25cb9a2619ee4dfb Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 22:45:51 +0300 Subject: [PATCH 111/116] Paging procedure implementation --- src/ue/nts.hpp | 3 ++- src/ue/rls/task.cpp | 3 +++ src/ue/rrc/task.cpp | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ue/nts.hpp b/src/ue/nts.hpp index 915223565..0946d49ce 100644 --- a/src/ue/nts.hpp +++ b/src/ue/nts.hpp @@ -120,7 +120,8 @@ struct NwUeRrcToRls : NtsMessage { PLMN_SEARCH_REQUEST, CELL_SELECTION_COMMAND, - RRC_PDU_DELIVERY + RRC_PDU_DELIVERY, + RESET_STI, } present; // CELL_SELECTION_COMMAND diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 7d629227e..ec4912e2c 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -64,6 +64,9 @@ void UeRlsTask::onLoop() deliverUplinkPdu(rls::EPduType::RRC, std::move(w->pdu), OctetString::FromOctet4(static_cast(w->channel))); break; + case NwUeRrcToRls::RESET_STI: + m_sti = utils::Random64(); + break; } break; } diff --git a/src/ue/rrc/task.cpp b/src/ue/rrc/task.cpp index d99c4bb89..571809bd0 100644 --- a/src/ue/rrc/task.cpp +++ b/src/ue/rrc/task.cpp @@ -63,6 +63,7 @@ void UeRrcTask::onLoop() 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; } case NwUeNasToRrc::CELL_SELECTION_COMMAND: { From 8a91c817f48690f2ff846cc9ec0a4821ecfaa8fd Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 22:48:14 +0300 Subject: [PATCH 112/116] Logging improvements --- src/gnb/ngap/interface.cpp | 4 ++-- src/gnb/rrc/handler.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gnb/ngap/interface.cpp b/src/gnb/ngap/interface.cpp index ccfc6835e..0f3002dc2 100644 --- a/src/gnb/ngap/interface.cpp +++ b/src/gnb/ngap/interface.cpp @@ -238,8 +238,8 @@ void NgapTask::sendErrorIndication(int amfId, NgapCause cause, int ueId) ieCause->value.present = ASN_NGAP_ErrorIndicationIEs__value_PR_Cause; ngap_utils::ToCauseAsn_Ref(cause, ieCause->value.choice.Cause); - m_logger->debug("Sending an error indication with cause: %s", - ngap_utils::CauseToString(ieCause->value.choice.Cause).c_str()); + m_logger->warn("Sending an error indication with cause: %s", + ngap_utils::CauseToString(ieCause->value.choice.Cause).c_str()); auto *pdu = asn::ngap::NewMessagePdu({ieCause}); diff --git a/src/gnb/rrc/handler.cpp b/src/gnb/rrc/handler.cpp index 8ea559546..c257058e9 100644 --- a/src/gnb/rrc/handler.cpp +++ b/src/gnb/rrc/handler.cpp @@ -120,7 +120,7 @@ void GnbRrcTask::receiveRrcSetupRequest(int ueId, const ASN_RRC_RRCSetupRequest asn::SetOctetString(rrcSetupIEs->masterCellGroup, rrc::encode::EncodeS(asn_DEF_ASN_RRC_CellGroupConfig, &masterCellGroup)); - m_logger->debug("Sending RRC Setup for UE[%d]", ueId); + m_logger->info("RRC Setup for UE[%d]", ueId); sendRrcMessage(ueId, pdu); } @@ -144,7 +144,7 @@ void GnbRrcTask::receiveRrcSetupComplete(int ueId, const ASN_RRC_RRCSetupComplet void GnbRrcTask::releaseConnection(int ueId) { - m_logger->debug("Releasing RRC connection for UE[%d]", ueId); + m_logger->info("Releasing RRC connection for UE[%d]", ueId); // Send RRC Release message auto *pdu = asn::New(); From eea0f10f35fbbe86e16557b935d149322547df1e Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 23:01:52 +0300 Subject: [PATCH 113/116] PLMN search response improvements --- src/ue/rls/measurement.cpp | 22 +++++++++++++++------- src/ue/rls/task.cpp | 3 ++- src/ue/rls/task.hpp | 1 + 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/ue/rls/measurement.cpp b/src/ue/rls/measurement.cpp index cc84f6c5e..9923d62f9 100644 --- a/src/ue/rls/measurement.cpp +++ b/src/ue/rls/measurement.cpp @@ -44,6 +44,20 @@ void UeRlsTask::onMeasurement() 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) @@ -77,13 +91,7 @@ void UeRlsTask::onCoverageChange(const std::vector &entered, const st void UeRlsTask::plmnSearchRequested() { - 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); + m_pendingPlmnResponse = true; } void UeRlsTask::handleCellSelectionCommand(const GlobalNci &cellId, bool isSuitable) diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index ec4912e2c..324f82f32 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -18,7 +18,8 @@ namespace nr::ue { UeRlsTask::UeRlsTask(TaskBase *base) - : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{}, m_servingCell{} + : m_base{base}, m_udpTask{}, m_cellSearchSpace{}, m_pendingMeasurements{}, m_activeMeasurements{}, + m_pendingPlmnResponse{}, m_servingCell{} { m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "rls"); diff --git a/src/ue/rls/task.hpp b/src/ue/rls/task.hpp index b56c35be3..4c3938952 100644 --- a/src/ue/rls/task.hpp +++ b/src/ue/rls/task.hpp @@ -34,6 +34,7 @@ class UeRlsTask : public NtsTask std::vector m_cellSearchSpace; std::unordered_map m_pendingMeasurements; std::unordered_map m_activeMeasurements; + bool m_pendingPlmnResponse; uint64_t m_sti; std::optional m_servingCell; From ee5a2c41fa321d1a6f4ed6fdfb677dd13faf2f92 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 23:14:20 +0300 Subject: [PATCH 114/116] PLMN search response improvements --- src/ue/rls/measurement.cpp | 2 ++ src/ue/rls/task.cpp | 24 +++++++++++++++++++----- src/ue/rls/task.hpp | 4 ++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/ue/rls/measurement.cpp b/src/ue/rls/measurement.cpp index 9923d62f9..38a5e1f25 100644 --- a/src/ue/rls/measurement.cpp +++ b/src/ue/rls/measurement.cpp @@ -96,6 +96,8 @@ void UeRlsTask::plmnSearchRequested() 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"); diff --git a/src/ue/rls/task.cpp b/src/ue/rls/task.cpp index 324f82f32..a1de7d1ab 100644 --- a/src/ue/rls/task.cpp +++ b/src/ue/rls/task.cpp @@ -11,15 +11,19 @@ #include #include -static const int TIMER_ID_MEASUREMENT = 1; -static const int TIMER_PERIOD_MEASUREMENT = 2000; +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_servingCell{} + m_pendingPlmnResponse{}, m_measurementPeriod{TIMER_PERIOD_MEASUREMENT_MIN}, m_servingCell{} { m_logger = m_base->logBase->makeUniqueLogger(m_base->config->getLoggerPrefix() + "rls"); @@ -39,7 +43,8 @@ void UeRlsTask::onStart() m_udpTask->start(); - setTimer(TIMER_ID_MEASUREMENT, TIMER_PERIOD_MEASUREMENT); + setTimer(TIMER_ID_MEASUREMENT, m_measurementPeriod); + setTimer(TIMER_ID_RAPID_LAUNCH, TIMER_PERIOD_RAPID_LAUNCH); onMeasurement(); } @@ -86,9 +91,13 @@ void UeRlsTask::onLoop() auto *w = dynamic_cast(msg); if (w->timerId == TIMER_ID_MEASUREMENT) { - setTimer(TIMER_ID_MEASUREMENT, TIMER_PERIOD_MEASUREMENT); + setTimer(TIMER_ID_MEASUREMENT, m_measurementPeriod); onMeasurement(); } + else if (w->timerId == TIMER_ID_RAPID_LAUNCH) + { + slowDownMeasurements(); + } break; } case NtsMessageType::UDP_SERVER_RECEIVE: { @@ -116,4 +125,9 @@ void UeRlsTask::onQuit() delete m_udpTask; } +void UeRlsTask::slowDownMeasurements() +{ + m_measurementPeriod = TIMER_PERIOD_MEASUREMENT_MAX; +} + } // namespace nr::ue diff --git a/src/ue/rls/task.hpp b/src/ue/rls/task.hpp index 4c3938952..0afb5c2ff 100644 --- a/src/ue/rls/task.hpp +++ b/src/ue/rls/task.hpp @@ -35,6 +35,7 @@ class UeRlsTask : public NtsTask 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; @@ -50,6 +51,9 @@ class UeRlsTask : public NtsTask 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); From 7023ee59897ae8fcf70324c92d9cf53f7385bf4a Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 23:32:27 +0300 Subject: [PATCH 115/116] Initial NAS encryption fixes --- src/ue/nas/enc.cpp | 27 ++++++++++----------------- src/ue/nas/enc.hpp | 2 +- src/ue/nas/mm/transport.cpp | 7 ++++++- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/ue/nas/enc.cpp b/src/ue/nas/enc.cpp index 4439f01f8..8f8db4a1c 100644 --- a/src/ue/nas/enc.cpp +++ b/src/ue/nas/enc.cpp @@ -14,12 +14,13 @@ namespace nr::ue::nas_enc { -static nas::ESecurityHeaderType MakeSecurityHeaderType(const NasSecurityContext &ctx, nas::EMessageType msgType) +static nas::ESecurityHeaderType MakeSecurityHeaderType(const NasSecurityContext &ctx, nas::EMessageType msgType, + bool bypassCiphering) { auto &encKey = ctx.keys.kNasEnc; auto &intKey = ctx.keys.kNasInt; - bool ciphered = encKey.length() > 0; + bool ciphered = !bypassCiphering && encKey.length() > 0; bool integrityProtected = intKey.length() > 0; if (!ciphered && !integrityProtected) @@ -64,7 +65,7 @@ static OctetString EncryptData(nas::ETypeOfCipheringAlgorithm alg, const NasCoun } static std::unique_ptr Encrypt(NasSecurityContext &ctx, OctetString &&plainNasMessage, - nas::EMessageType msgType) + nas::EMessageType msgType, bool bypassCiphering) { auto count = ctx.uplinkCount; auto is3gppAccess = ctx.is3gppAccess; @@ -73,12 +74,13 @@ static std::unique_ptr Encrypt(NasSecurityContext &ctx, O auto intAlg = ctx.integrity; auto encAlg = ctx.ciphering; - auto encryptedData = EncryptData(encAlg, count, is3gppAccess, plainNasMessage, encKey); + auto encryptedData = + bypassCiphering ? plainNasMessage.copy() : EncryptData(encAlg, count, is3gppAccess, plainNasMessage, encKey); auto mac = ComputeMac(intAlg, count, is3gppAccess, true, intKey, encryptedData); auto secured = std::make_unique(); secured->epd = nas::EExtendedProtocolDiscriminator::MOBILITY_MANAGEMENT_MESSAGES; - secured->sht = MakeSecurityHeaderType(ctx, msgType); + secured->sht = MakeSecurityHeaderType(ctx, msgType, bypassCiphering); secured->messageAuthenticationCode = octet4{mac}; secured->sequenceNumber = count.sqn; secured->plainNasMessage = std::move(encryptedData); @@ -120,24 +122,15 @@ static OctetString DecryptData(nas::ETypeOfCipheringAlgorithm alg, const NasCoun return msg; } -std::unique_ptr Encrypt(NasSecurityContext &ctx, const nas::PlainMmMessage &msg) +std::unique_ptr Encrypt(NasSecurityContext &ctx, const nas::PlainMmMessage &msg, + bool bypassCiphering) { nas::EMessageType msgType = msg.messageType; OctetString stream; nas::EncodeNasMessage(msg, stream); - return Encrypt(ctx, std::move(stream), msgType); -} - -std::unique_ptr Encrypt(NasSecurityContext &ctx, const nas::SmMessage &msg) -{ - nas::EMessageType msgType = msg.messageType; - - OctetString stream; - nas::EncodeNasMessage(msg, stream); - - return Encrypt(ctx, std::move(stream), msgType); + return Encrypt(ctx, std::move(stream), msgType, bypassCiphering); } std::unique_ptr Decrypt(NasSecurityContext &ctx, const nas::SecuredMmMessage &msg) diff --git a/src/ue/nas/enc.hpp b/src/ue/nas/enc.hpp index 2973585d1..e20b86830 100644 --- a/src/ue/nas/enc.hpp +++ b/src/ue/nas/enc.hpp @@ -14,7 +14,7 @@ namespace nr::ue::nas_enc { -std::unique_ptr Encrypt(NasSecurityContext &ctx, const nas::PlainMmMessage &msg); +std::unique_ptr Encrypt(NasSecurityContext &ctx, const nas::PlainMmMessage &msg, bool bypassCiphering); std::unique_ptr Decrypt(NasSecurityContext &ctx, const nas::SecuredMmMessage &msg); uint32_t ComputeMac(nas::ETypeOfIntegrityProtectionAlgorithm alg, NasCount count, bool is3gppAccess, diff --git a/src/ue/nas/mm/transport.cpp b/src/ue/nas/mm/transport.cpp index f5d13e8e7..0060e5a0b 100644 --- a/src/ue/nas/mm/transport.cpp +++ b/src/ue/nas/mm/transport.cpp @@ -34,6 +34,11 @@ static bool IsAcceptedWithoutIntegrity(const nas::PlainMmMessage &msg) msgType == nas::EMessageType::SERVICE_REJECT; } +static bool BypassCiphering(const nas::PlainMmMessage &msg) +{ + return IsInitialNasMessage(msg); +} + void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) { if (m_cmState == ECmState::CM_IDLE && !IsInitialNasMessage(msg)) @@ -48,7 +53,7 @@ void NasMm::sendNasMessage(const nas::PlainMmMessage &msg) if (m_usim->m_currentNsCtx && (m_usim->m_currentNsCtx->integrity != nas::ETypeOfIntegrityProtectionAlgorithm::IA0 || m_usim->m_currentNsCtx->ciphering != nas::ETypeOfCipheringAlgorithm::EA0)) { - auto secured = nas_enc::Encrypt(*m_usim->m_currentNsCtx, msg); + auto secured = nas_enc::Encrypt(*m_usim->m_currentNsCtx, msg, BypassCiphering(msg)); nas::EncodeNasMessage(*secured, pdu); } else From fec05fcc671128118f31650cd4aeda7b6b163804 Mon Sep 17 00:00:00 2001 From: aligungr Date: Sat, 17 Apr 2021 23:34:42 +0300 Subject: [PATCH 116/116] Release of v3.1.7 --- README.md | 2 +- src/utils/constants.hpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 997f6a63b..29e44673c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

- +

diff --git a/src/utils/constants.hpp b/src/utils/constants.hpp index edee487e1..25d8e80ab 100644 --- a/src/utils/constants.hpp +++ b/src/utils/constants.hpp @@ -15,10 +15,10 @@ struct cons // Version information static constexpr const uint8_t Major = 3; static constexpr const uint8_t Minor = 1; - static constexpr const uint8_t Patch = 6; + static constexpr const uint8_t Patch = 7; static constexpr const char *Project = "UERANSIM"; - static constexpr const char *Tag = "v3.1.6"; - static constexpr const char *Name = "UERANSIM v3.1.6"; + static constexpr const char *Tag = "v3.1.7"; + static constexpr const char *Name = "UERANSIM v3.1.7"; static constexpr const char *Owner = "ALİ GÜNGÖR"; // Some port values