From 4df235d1ffd9ec18cc33cf89730f3eccc1f30ac3 Mon Sep 17 00:00:00 2001 From: Lefucjusz Date: Mon, 4 Sep 2023 12:46:18 +0200 Subject: [PATCH] Revert "[MOS-977] Added VoLTE support in additional countries" This reverts commit b4568c32eb2a4b37e9dfbbe08c446430eee2145c. --- .../service-cellular/CMakeLists.txt | 8 +- .../src/ServiceCellularPriv.cpp | 6 +- .../service-cellular/src/volte/ImsiParser.cpp | 27 ------ .../service-cellular/src/volte/ImsiParser.hpp | 23 ----- .../src/volte/ImsiParserInterface.hpp | 19 ++++ .../src/volte/ImsiParserUS.cpp | 37 ++++++++ ...msiParser_Denmark.hpp => ImsiParserUS.hpp} | 9 +- .../src/volte/ImsiParser_Canada.hpp | 17 ---- .../src/volte/ImsiParser_Germany.hpp | 17 ---- .../src/volte/ImsiParser_GreatBritain.hpp | 34 ------- .../src/volte/ImsiParser_Netherlands.hpp | 17 ---- .../src/volte/ImsiParser_Poland.hpp | 32 ------- .../src/volte/ImsiParser_UnitedStates.hpp | 28 ------ .../src/volte/OperatorInfo.hpp | 22 +++++ .../src/volte/VolteAllowedList.cpp | 52 ---------- .../src/volte/VolteAllowedList.hpp | 24 ----- .../src/volte/VolteAllowedListInterface.hpp | 3 +- .../src/volte/VolteAllowedUSList.cpp | 37 ++++++++ ...ser_Austria.hpp => VolteAllowedUSList.hpp} | 12 +-- .../src/volte/VolteCapabilityHandler.cpp | 16 +++- .../src/volte/VolteCapabilityHandler.hpp | 7 +- .../tests/unittest_volteCapabilityHandler.cpp | 95 +++++++++++++++++-- pure_changelog.md | 1 - 23 files changed, 238 insertions(+), 305 deletions(-) delete mode 100644 module-services/service-cellular/src/volte/ImsiParser.cpp delete mode 100644 module-services/service-cellular/src/volte/ImsiParser.hpp create mode 100644 module-services/service-cellular/src/volte/ImsiParserInterface.hpp create mode 100644 module-services/service-cellular/src/volte/ImsiParserUS.cpp rename module-services/service-cellular/src/volte/{ImsiParser_Denmark.hpp => ImsiParserUS.hpp} (50%) delete mode 100644 module-services/service-cellular/src/volte/ImsiParser_Canada.hpp delete mode 100644 module-services/service-cellular/src/volte/ImsiParser_Germany.hpp delete mode 100644 module-services/service-cellular/src/volte/ImsiParser_GreatBritain.hpp delete mode 100644 module-services/service-cellular/src/volte/ImsiParser_Netherlands.hpp delete mode 100644 module-services/service-cellular/src/volte/ImsiParser_Poland.hpp delete mode 100644 module-services/service-cellular/src/volte/ImsiParser_UnitedStates.hpp create mode 100644 module-services/service-cellular/src/volte/OperatorInfo.hpp delete mode 100644 module-services/service-cellular/src/volte/VolteAllowedList.hpp create mode 100644 module-services/service-cellular/src/volte/VolteAllowedUSList.cpp rename module-services/service-cellular/src/volte/{ImsiParser_Austria.hpp => VolteAllowedUSList.hpp} (50%) diff --git a/module-services/service-cellular/CMakeLists.txt b/module-services/service-cellular/CMakeLists.txt index d09f56b26a571ee29ab5d3746b4d169e401a047c..63d1d87c0d0e2c7694ca7cf8c9b46a094280e287 100644 --- a/module-services/service-cellular/CMakeLists.txt +++ b/module-services/service-cellular/CMakeLists.txt @@ -17,9 +17,9 @@ set(SOURCES src/CSQHandler.cpp src/volte/VolteCapabilityHandler.cpp + src/volte/ImsiParserUS.cpp + src/volte/VolteAllowedUSList.cpp src/volte/VolteCapabilityHandlerCellular.cpp - src/volte/ImsiParser.cpp - src/volte/VolteAllowedList.cpp src/ussd/USSDHandler.cpp @@ -52,9 +52,7 @@ set(SOURCES requests/ColpRequest.cpp requests/CallWaitingRequest.cpp requests/CallBarringRequest.cpp - handler/RawATHandler.cpp - src/volte/VolteAllowedList.hpp -) + handler/RawATHandler.cpp) add_library(${PROJECT_NAME} STATIC ${SOURCES}) diff --git a/module-services/service-cellular/src/ServiceCellularPriv.cpp b/module-services/service-cellular/src/ServiceCellularPriv.cpp index c12d2a5ff79bef575f1af0cb0d7e7adadb4aeaad..8051e050da9019cc91a2705886af938990b9d48c 100644 --- a/module-services/service-cellular/src/ServiceCellularPriv.cpp +++ b/module-services/service-cellular/src/ServiceCellularPriv.cpp @@ -9,7 +9,8 @@ #include -#include +#include +#include #include #include @@ -45,7 +46,8 @@ namespace cellular::internal std::make_unique(), }, volteCapability{ - std::make_unique(std::make_unique(), + std::make_unique(std::make_unique(), + std::make_unique(), std::make_unique())}, ussdHandler{std::make_unique()} { diff --git a/module-services/service-cellular/src/volte/ImsiParser.cpp b/module-services/service-cellular/src/volte/ImsiParser.cpp deleted file mode 100644 index 5255677584ee93929e71ceae5060935f91fc7d27..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/ImsiParser.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#include "ImsiParser.hpp" - -namespace cellular -{ - auto service::ImsiParser::isAllowed(const std::string &imsi) const -> bool - { - if (operatorCodes.empty()) { - return false; - } - - for (auto const &code : operatorCodes) { - if (textStartsWith(imsi, code)) { - return true; - } - } - - return false; - } - - auto service::ImsiParser::textStartsWith(std::string_view text, std::string_view prefix) const -> bool - { - return !text.empty() && !prefix.empty() && std::equal(prefix.begin(), prefix.end(), text.begin()); - } -} // namespace cellular diff --git a/module-services/service-cellular/src/volte/ImsiParser.hpp b/module-services/service-cellular/src/volte/ImsiParser.hpp deleted file mode 100644 index a80e772dedea9f0b0d7e5bdfa139a6bb7d43fb8c..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/ImsiParser.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#pragma once - -#include -#include -#include - -namespace cellular::service -{ - class ImsiParser - { - public: - explicit ImsiParser(std::vector &&operatorList) : operatorCodes{operatorList} - {} - auto isAllowed(const std::string &imsi) const -> bool; - - private: - std::vector operatorCodes; - inline auto textStartsWith(std::string_view text, std::string_view prefix) const -> bool; - }; -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParserInterface.hpp b/module-services/service-cellular/src/volte/ImsiParserInterface.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9879b6a27e508b641fe4738ac9478c9f898de058 --- /dev/null +++ b/module-services/service-cellular/src/volte/ImsiParserInterface.hpp @@ -0,0 +1,19 @@ +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include "OperatorInfo.hpp" +#include +#include + +namespace cellular::service +{ + class ImsiParserInteface + { + public: + virtual ~ImsiParserInteface() = default; + + virtual auto parse(const std::string &imsi) -> std::optional = 0; + }; +} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParserUS.cpp b/module-services/service-cellular/src/volte/ImsiParserUS.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1cbd3313cac8165479f9f8ef3de4bc7eedc32dbb --- /dev/null +++ b/module-services/service-cellular/src/volte/ImsiParserUS.cpp @@ -0,0 +1,37 @@ +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "ImsiParserUS.hpp" +#include +#include +#include +#include + +namespace cellular::service +{ + constexpr auto usMccCount = 7; + const std::array usMcc{"310", "311", "312", "313", "314", "315", "316"}; + + auto ImsiParserUS::parse(const std::string &imsi) -> std::optional + { + constexpr auto mccSize = 3; + constexpr auto mncSize = 3; + + std::string mcc, mnc; + try { + mcc = imsi.substr(0, mccSize); + mnc = imsi.substr(mccSize, mncSize); + } + catch (const std::out_of_range &e) { + LOG_ERROR("[VoLTE] IMSI parsing error: %s", e.what()); + return std::nullopt; + } + + if (std::find(std::begin(usMcc), std::end(usMcc), mcc) == std::end(usMcc)) { + LOG_ERROR("[VoLTE] MCC not from USA"); + return std::nullopt; + } + + return OperatorInfo(mcc, mnc); + } +} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParser_Denmark.hpp b/module-services/service-cellular/src/volte/ImsiParserUS.hpp similarity index 50% rename from module-services/service-cellular/src/volte/ImsiParser_Denmark.hpp rename to module-services/service-cellular/src/volte/ImsiParserUS.hpp index 594185839d036d10db144456f14c6363f2385ee3..928f6c1ae1d1688770f926e4f0dfcb72bfb8b3f3 100644 --- a/module-services/service-cellular/src/volte/ImsiParser_Denmark.hpp +++ b/module-services/service-cellular/src/volte/ImsiParserUS.hpp @@ -3,14 +3,13 @@ #pragma once -#include "ImsiParser.hpp" +#include "ImsiParserInterface.hpp" namespace cellular::service { - struct ImsiParserDK : ImsiParser + class ImsiParserUS : public ImsiParserInteface { - explicit ImsiParserDK() - : ImsiParser(std::vector{"23801", "23802", "23806", "23820", "23866", "28801", "28802"}) - {} + public: + auto parse(const std::string &imsi) -> std::optional final; }; } // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParser_Canada.hpp b/module-services/service-cellular/src/volte/ImsiParser_Canada.hpp deleted file mode 100644 index 169c6ffb029ee3f483a7497765fbc3ff5985909d..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/ImsiParser_Canada.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#pragma once - -#include "ImsiParser.hpp" - -namespace cellular::service -{ - struct ImsiParserCA : ImsiParser - { - explicit ImsiParserCA() - : ImsiParser(std::vector{ - "302220", "302270", "302300", "302310", "302490", "302510", "302500", "302610", "302720", "302780"}) - {} - }; -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParser_Germany.hpp b/module-services/service-cellular/src/volte/ImsiParser_Germany.hpp deleted file mode 100644 index 46ff79818b221a1b5252baeee690f4c443ca4736..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/ImsiParser_Germany.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#pragma once - -#include "ImsiParser.hpp" - -namespace cellular::service -{ - struct ImsiParserDE : ImsiParser - { - explicit ImsiParserDE() - : ImsiParser(std::vector{ - "26201", "26206", "26202", "26204", "26209", "26203", "26205", "26208", "26223"}) - {} - }; -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParser_GreatBritain.hpp b/module-services/service-cellular/src/volte/ImsiParser_GreatBritain.hpp deleted file mode 100644 index 09c4c4bc2268a5a045715254dd669faad40d5a63..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/ImsiParser_GreatBritain.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#pragma once - -#include "ImsiParser.hpp" - -namespace cellular::service -{ - struct ImsiParserGB : ImsiParser - { - explicit ImsiParserGB() - : ImsiParser(std::vector{"23401", - "23410", - "23411", - "23403", - "23415", - "23420", - "23430", - "23433", - "23434", - "23450", - "23480", - "365010", - "348170", - "348770", - "34605", - "346001", - "346140", - "750001", - "26601"}) - {} - }; -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParser_Netherlands.hpp b/module-services/service-cellular/src/volte/ImsiParser_Netherlands.hpp deleted file mode 100644 index be83ea1c8671456a21c4f25a78eca22d5028cc3b..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/ImsiParser_Netherlands.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#pragma once - -#include "ImsiParser.hpp" - -namespace cellular::service -{ - struct ImsiParserNL : ImsiParser - { - explicit ImsiParserNL() - : ImsiParser(std::vector{ - "20402", "20404", "20406", "20407", "20408", "20410", "20416", "20420", "20433", "20418"}) - {} - }; -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParser_Poland.hpp b/module-services/service-cellular/src/volte/ImsiParser_Poland.hpp deleted file mode 100644 index be4fe36c7c0440548d4db439c40bbadf9f1a1107..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/ImsiParser_Poland.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#pragma once - -#include "ImsiParser.hpp" -#include - -namespace cellular::service -{ - struct ImsiParserPL : ImsiParser - { - explicit ImsiParserPL() - : ImsiParser(std::vector{"26001", - "26011", - "26002", - "26010", - "26034", - "26003", - "26015", - "26016", - "26017", - "26006", - "26045", - "26098", - "26008", - "26009", - "26012", - "26013"}) - {} - }; -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParser_UnitedStates.hpp b/module-services/service-cellular/src/volte/ImsiParser_UnitedStates.hpp deleted file mode 100644 index ee33bd3b6c0fc7903194b2d90d7382876efa4956..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/ImsiParser_UnitedStates.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#pragma once - -#include "ImsiParser.hpp" -#include - -namespace cellular::service -{ - struct ImsiParserUS : ImsiParser - { - explicit ImsiParserUS() - : ImsiParser(std::vector{"310053", - "310120", - "310260", - "310530", - "310770", - "311490", - "311660", - "311880", - "311882", - "312190", - "312250", - "312530"}) - {} - }; -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/OperatorInfo.hpp b/module-services/service-cellular/src/volte/OperatorInfo.hpp new file mode 100644 index 0000000000000000000000000000000000000000..ff78f2e067d59b12bffcc2df607f1a44c0a49e77 --- /dev/null +++ b/module-services/service-cellular/src/volte/OperatorInfo.hpp @@ -0,0 +1,22 @@ +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include + +namespace cellular::service +{ + struct OperatorInfo + { + OperatorInfo(const std::string &mcc, const std::string &mnc) : MCC(mcc), MNC(mnc) + {} + std::string MCC; + std::string MNC; + + friend bool operator==(const OperatorInfo &lhs, const OperatorInfo &rhs) + { + return lhs.MCC == rhs.MCC && lhs.MNC == rhs.MNC; + } + }; +} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/VolteAllowedList.cpp b/module-services/service-cellular/src/volte/VolteAllowedList.cpp index fc9f2a3dddad748f58ade62df59d5e439a94000a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/module-services/service-cellular/src/volte/VolteAllowedList.cpp +++ b/module-services/service-cellular/src/volte/VolteAllowedList.cpp @@ -1,52 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#include "VolteAllowedList.hpp" -#include "ImsiParser_Poland.hpp" -#include "ImsiParser_UnitedStates.hpp" -#include "ImsiParser_Netherlands.hpp" -#include "ImsiParser_Germany.hpp" -#include "ImsiParser_Denmark.hpp" -#include "ImsiParser_GreatBritain.hpp" -#include "ImsiParser_Canada.hpp" -#include "ImsiParser_Austria.hpp" - -#include "module-utils/log/Logger.hpp" - -namespace -{ - template - void pushBack(Container &container, Items &&...items) - { - (container.push_back(std::forward(items)), ...); - } -} // namespace - -namespace cellular::service -{ - auto VolteAllowedList::isVolteAllowed(const std::string &imsi) const -> bool - { - for (const auto &country : allowedList) { - if (country.isAllowed(imsi)) { - LOG_INFO("MCC supported, VoLTE allowed."); - return true; - } - } - - LOG_ERROR("MCC not supported, VoLTE not allowed."); - return false; - } - - void VolteAllowedList::buildList() - { - pushBack(allowedList, - ImsiParserPL(), - ImsiParserUS(), - ImsiParserDK(), - ImsiParserDE(), - ImsiParserNL(), - ImsiParserGB(), - ImsiParserCA(), - ImsiParserAT()); - } -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/VolteAllowedList.hpp b/module-services/service-cellular/src/volte/VolteAllowedList.hpp deleted file mode 100644 index 68e23dca0e47e3725ea886e99543f90684a8fbb5..0000000000000000000000000000000000000000 --- a/module-services/service-cellular/src/volte/VolteAllowedList.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#include "VolteAllowedListInterface.hpp" -#include "ImsiParser.hpp" -#include - -namespace cellular::service -{ - class VolteAllowedList : public VolteAllowedListInterface - { - public: - VolteAllowedList() - { - buildList(); - } - - auto isVolteAllowed(const std::string &imsi) const -> bool final; - - private: - void buildList(); - std::vector allowedList; - }; -} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/VolteAllowedListInterface.hpp b/module-services/service-cellular/src/volte/VolteAllowedListInterface.hpp index 9ce47474cf4ab237a2c6412f4fc47cfcdfaebc76..74bfdbd33cd31bceaf428976fbbe8c51de235514 100644 --- a/module-services/service-cellular/src/volte/VolteAllowedListInterface.hpp +++ b/module-services/service-cellular/src/volte/VolteAllowedListInterface.hpp @@ -3,6 +3,7 @@ #pragma once +#include "OperatorInfo.hpp" #include namespace cellular::service @@ -12,6 +13,6 @@ namespace cellular::service public: virtual ~VolteAllowedListInterface() = default; - virtual auto isVolteAllowed(const std::string &imsi) const -> bool = 0; + auto virtual isVolteAllowed(const OperatorInfo &operatorInfo) -> bool = 0; }; } // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/VolteAllowedUSList.cpp b/module-services/service-cellular/src/volte/VolteAllowedUSList.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6cf1f48c02cfdceb2b3ff19605ac33e292d5bf48 --- /dev/null +++ b/module-services/service-cellular/src/volte/VolteAllowedUSList.cpp @@ -0,0 +1,37 @@ +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "VolteAllowedUSList.hpp" +#include +#include +#include + +namespace cellular::service +{ + + constexpr auto allowedOperatorsCount = 12; + const std::array allowedOperators{OperatorInfo{"310", "053"}, + OperatorInfo{"310", "120"}, + OperatorInfo{"310", "260"}, + OperatorInfo{"310", "530"}, + OperatorInfo{"310", "770"}, + OperatorInfo{"311", "490"}, + OperatorInfo{"311", "660"}, + OperatorInfo{"311", "880"}, + OperatorInfo{"311", "882"}, + OperatorInfo{"312", "190"}, + OperatorInfo{"312", "250"}, + OperatorInfo{"312", "530"}}; + + auto VolteAllowedUSList::isVolteAllowed(const OperatorInfo &operatorInfo) -> bool + { + LOG_INFO("[VoLTE] trying to find MCC: %s, MNC: %s", operatorInfo.MCC.c_str(), operatorInfo.MNC.c_str()); + + if (std::find(std::begin(allowedOperators), std::end(allowedOperators), operatorInfo) == + std::end(allowedOperators)) { + LOG_ERROR("[VoLTE] unable to find MCC+MNC on list - VoLTE not allowed"); + return false; + } + return true; + } +} // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/ImsiParser_Austria.hpp b/module-services/service-cellular/src/volte/VolteAllowedUSList.hpp similarity index 50% rename from module-services/service-cellular/src/volte/ImsiParser_Austria.hpp rename to module-services/service-cellular/src/volte/VolteAllowedUSList.hpp index e803ea161649dd8bfff822a38018a746794f32c4..1d0b7b60657ec739a8e0777882779f2a18708bb1 100644 --- a/module-services/service-cellular/src/volte/ImsiParser_Austria.hpp +++ b/module-services/service-cellular/src/volte/VolteAllowedUSList.hpp @@ -3,16 +3,14 @@ #pragma once -#include "ImsiParser.hpp" +#include "VolteAllowedListInterface.hpp" +#include "OperatorInfo.hpp" namespace cellular::service { - ; - - struct ImsiParserAT : ImsiParser + class VolteAllowedUSList : public VolteAllowedListInterface { - explicit ImsiParserAT() - : ImsiParser(std::vector{"23201", "23203", "23213", "23205", "23210", "23207", "23208"}) - {} + public: + auto isVolteAllowed(const OperatorInfo &operatorInfo) -> bool final; }; } // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/VolteCapabilityHandler.cpp b/module-services/service-cellular/src/volte/VolteCapabilityHandler.cpp index d42d557a21efe9b92e43c4fe9a54fb706141912e..f7f0c4bcffaa91000219653d55ed84e58823cabc 100644 --- a/module-services/service-cellular/src/volte/VolteCapabilityHandler.cpp +++ b/module-services/service-cellular/src/volte/VolteCapabilityHandler.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "VolteCapabilityHandler.hpp" @@ -7,9 +7,11 @@ namespace cellular::service { - VolteCapabilityHandler::VolteCapabilityHandler(std::unique_ptr allowedList, + VolteCapabilityHandler::VolteCapabilityHandler(std::unique_ptr imsiParser, + std::unique_ptr allowedList, std::unique_ptr cellularInterface) - : allowedList(std::move(allowedList)), cellularInterface(std::move(cellularInterface)) + : imsiParser(std::move(imsiParser)), allowedList(std::move(allowedList)), + cellularInterface(std::move(cellularInterface)) {} auto VolteCapabilityHandler::isVolteAllowed(at::BaseChannel &channel) -> bool @@ -20,6 +22,12 @@ namespace cellular::service return false; } - return allowedList->isVolteAllowed(imsi.value()); + const auto operatorInfo = imsiParser->parse(imsi.value()); + if (not operatorInfo.has_value()) { + LOG_ERROR("[VoLTE] failed to parse IMSI - VoLTE not permitted"); + return false; + } + + return allowedList->isVolteAllowed(operatorInfo.value()); } } // namespace cellular::service diff --git a/module-services/service-cellular/src/volte/VolteCapabilityHandler.hpp b/module-services/service-cellular/src/volte/VolteCapabilityHandler.hpp index 5675ba9b6f6ac5636a56981694a4f14cea036d51..43ad98b01c6d53802111e6a7fd899d66c4726f4f 100644 --- a/module-services/service-cellular/src/volte/VolteCapabilityHandler.hpp +++ b/module-services/service-cellular/src/volte/VolteCapabilityHandler.hpp @@ -1,9 +1,10 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "VolteCapabiltyHandlerCellularInterface.hpp" +#include "ImsiParserInterface.hpp" #include "VolteAllowedListInterface.hpp" #include @@ -13,7 +14,8 @@ namespace cellular::service class VolteCapabilityHandler { public: - VolteCapabilityHandler(std::unique_ptr allowedList, + VolteCapabilityHandler(std::unique_ptr imsiParser, + std::unique_ptr allowedList, std::unique_ptr cellularInterface); /** Check if it is a possibility to enable VoLTE on current operator * @return true when VoLTE is allowed, false when not @@ -21,6 +23,7 @@ namespace cellular::service auto isVolteAllowed(at::BaseChannel &channel) -> bool; private: + std::unique_ptr imsiParser; std::unique_ptr allowedList; std::unique_ptr cellularInterface; }; diff --git a/module-services/service-cellular/tests/unittest_volteCapabilityHandler.cpp b/module-services/service-cellular/tests/unittest_volteCapabilityHandler.cpp index b86afdf411a5087065769cb6b3968615e36136a6..3ba8ff3b5e59279a6c3cb88b440d4f5b59634c6a 100644 --- a/module-services/service-cellular/tests/unittest_volteCapabilityHandler.cpp +++ b/module-services/service-cellular/tests/unittest_volteCapabilityHandler.cpp @@ -1,10 +1,11 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include #include -#include +#include +#include #include #include @@ -42,6 +43,80 @@ TEST_CASE("VoLTE Capability handler") static BaseChannelStub baseChannelStub; + SECTION("ImsiParserUS success - US IMSI") + { + using namespace cellular::service; + + cellular::service::ImsiParserUS parser; + std::string imsi("3111231234567890"); + + auto result = parser.parse(imsi); + + REQUIRE(result.has_value() == true); + REQUIRE(result.value().MCC == "311"); + REQUIRE(result.value().MNC == "123"); + } + + SECTION("ImsiParserUS failure - non US IMSI") + { + using namespace cellular::service; + + cellular::service::ImsiParserUS parser; + std::string imsi("2601231234567890"); + + auto result = parser.parse(imsi); + + REQUIRE(result.has_value() == false); + } + + SECTION("ImsiParserUS failure -too short IMSI") + { + using namespace cellular::service; + + cellular::service::ImsiParserUS parser; + std::string imsi("2601"); + + auto result = parser.parse(imsi); + + REQUIRE(result.has_value() == false); + } + + SECTION("VolteAllowedUSList success - TMobileUS IMSI") + { + using namespace cellular::service; + + VolteAllowedUSList list; + OperatorInfo operatorInfo{"310", "120"}; + + auto result = list.isVolteAllowed(operatorInfo); + + REQUIRE(result == true); + } + + SECTION("VolteAllowedUSList failure - non TMobileUS MCC") + { + using namespace cellular::service; + + VolteAllowedUSList list; + OperatorInfo operatorInfo{"210", "120"}; + + auto result = list.isVolteAllowed(operatorInfo); + + REQUIRE(result == false); + } + + SECTION("VolteAllowedUSList failure - non TMobileUS MNC") + { + using namespace cellular::service; + + VolteAllowedUSList list; + OperatorInfo operatorInfo{"310", "999"}; + + auto result = list.isVolteAllowed(operatorInfo); + + REQUIRE(result == false); + } + class MockTMobileUS : public cellular::service::VolteCapabilityCellularInterface { auto getImsi(at::BaseChannel &) -> std::optional override @@ -53,12 +128,14 @@ TEST_CASE("VoLTE Capability handler") SECTION("VolteCapabilityHandler succes = TMobileUS") { using namespace cellular::service; - VolteCapabilityHandler handler{std::make_unique(), std::make_unique()}; + VolteCapabilityHandler handler{std::make_unique(), + std::make_unique(), + std::make_unique()}; auto result = handler.isVolteAllowed(baseChannelStub); REQUIRE(result == true); } - class MockNotAllowedIMSI : public cellular::service::VolteCapabilityCellularInterface + class MockNonTMobileUS : public cellular::service::VolteCapabilityCellularInterface { auto getImsi(at::BaseChannel &) -> std::optional { @@ -66,10 +143,12 @@ TEST_CASE("VoLTE Capability handler") } }; - SECTION("VolteCapabilityHandler failure = not allowed IMSI") + SECTION("VolteCapabilityHandler failure = non TMobileUS") { using namespace cellular::service; - VolteCapabilityHandler handler{std::make_unique(), std::make_unique()}; + VolteCapabilityHandler handler{std::make_unique(), + std::make_unique(), + std::make_unique()}; auto result = handler.isVolteAllowed(baseChannelStub); REQUIRE(result == false); } @@ -85,7 +164,9 @@ TEST_CASE("VoLTE Capability handler") SECTION("VolteCapabilityHandler failure = failed to get imsi") { using namespace cellular::service; - VolteCapabilityHandler handler{std::make_unique(), std::make_unique()}; + VolteCapabilityHandler handler{std::make_unique(), + std::make_unique(), + std::make_unique()}; auto result = handler.isVolteAllowed(baseChannelStub); REQUIRE(result == false); } diff --git a/pure_changelog.md b/pure_changelog.md index 59a440be7a5684a080ae46d37676c375086768f7..67c896aa494f3f9c0b4465fc8b19fdd4bbff03aa 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -4,7 +4,6 @@ ### Added -* Added VoLTE support in Poland, Germany, Denmark, United Kingdom, Netherlands, Canada and Austria * Added extended information to crashdump filename * Added extended information to log filename * Added GUI screens informing about failed MMI/USSD request