From 13d918114996a239860e783b1ee80eb4ae34ecda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Zieli=C5=84ski?= Date: Mon, 21 Nov 2022 16:11:59 +0100 Subject: [PATCH] [MOS-811] Make SMS modem domain in line with voice Ditto --- .../service-cellular/src/VolteHandler.hpp | 58 ++++++++++++++++++- .../tests/unittest_volteHandler.cpp | 26 +++++++-- 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/module-services/service-cellular/src/VolteHandler.hpp b/module-services/service-cellular/src/VolteHandler.hpp index 68a3a746dff93e4ffd7a1f14145f0c8585862e8f..18bdd2826e7c4277b80c45bd224d736e2955f3d7 100644 --- a/module-services/service-cellular/src/VolteHandler.hpp +++ b/module-services/service-cellular/src/VolteHandler.hpp @@ -42,20 +42,31 @@ namespace cellular::service if (enable) { // according to Quectel, this setting doesn't have to be reset when disabling - constexpr std::uint8_t voiceDomainPacketSwitchedPreferred = 0x03; auto voiceDomainAnswer = - channel.cmd(factory(at::AT::QNVFW) + "\"/nv/item_files/modem/mmode/voice_domain_pref\"," + - utils::byteToHex(voiceDomainPacketSwitchedPreferred)); + channel.cmd(factory(at::AT::QNVFW) + NetworkServiceDomain(NetworkServiceDomain::Type::Voice)); if (!voiceDomainAnswer) { throw std::runtime_error("[VoLTE] failed to set voice domain before trying to enable VoLTE"); } + auto smsDomainAnswer = + channel.cmd(factory(at::AT::QNVFW) + NetworkServiceDomain(NetworkServiceDomain::Type::SmsViaIms)); + if (!smsDomainAnswer) { + throw std::runtime_error("[VoLTE] failed to set SMS domain before trying to enable VoLTE"); + } + // can be left as always on: doesn't disturb when VoLTE disabled auto qmbnAnswer = channel.cmd(factory(at::AT::QMBNCFG) + std::string("\"autosel\",1")); if (!qmbnAnswer) { throw std::runtime_error("[VoLTE] failed to enable MBN auto-select before trying to enable VoLTE"); } } + else { + auto smsDomainAnswer = + channel.cmd(factory(at::AT::QNVFW) + NetworkServiceDomain(NetworkServiceDomain::Type::SmsViaSgs)); + if (!smsDomainAnswer) { + throw std::runtime_error("[VoLTE] failed to reset SMS domain before trying to disable VoLTE"); + } + } auto imsCheckAnswer = channel.cmd(factory(AT::QCFG_IMS)); if (!imsCheckAnswer) { @@ -103,6 +114,47 @@ namespace cellular::service return isFirstRunAfterSwitch; } + struct NetworkServiceDomain + { + enum class Type + { + SmsViaIms, + SmsViaSgs, + Voice + }; + explicit NetworkServiceDomain(Type type) : type_{type} + { + switch (type) { + case Type::SmsViaSgs: + domain_ = "sms"; + preference_ = 0x00; + return; + case Type::SmsViaIms: + domain_ = "sms"; + preference_ = 0x01; + return; + case Type::Voice: + domain_ = "voice"; + preference_ = 0x03; + return; + default: + throw std::logic_error("unimplemented network service domain: " + + std::string(magic_enum::enum_name(type))); + } + } + + operator std::string() + { + return "\"/nv/item_files/modem/mmode/" + domain_ + "_domain_pref\"," + + utils::byteToHex(preference_); + } + + private: + std::string domain_; + Type type_; + std::uint8_t preference_; + }; + private: std::string imsStateToString(response::qcfg_ims::IMSState imsState) const { diff --git a/module-services/service-cellular/tests/unittest_volteHandler.cpp b/module-services/service-cellular/tests/unittest_volteHandler.cpp index 40e733e5310496e911ec4ec5645ae6158c8b780e..5241a0b59dd9ed9313d26f2d406943e1d23d560a 100644 --- a/module-services/service-cellular/tests/unittest_volteHandler.cpp +++ b/module-services/service-cellular/tests/unittest_volteHandler.cpp @@ -119,7 +119,10 @@ TEST_CASE("VoLTE handler test") SECTION("ThrowsAboutMbnAutoselectFailure_When_TryingToEnableVolte_And_AutoselectCommandRespondsNOK") { std::queue chain; - push(chain, std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QMBNCFG, DummyErrorResult{})); + push(chain, + std::make_pair(AT::QNVFW, DummyOkResult{}), + std::make_pair(AT::QNVFW, DummyOkResult{}), + std::make_pair(AT::QMBNCFG, DummyErrorResult{})); CommandSequentialChannel channel(std::move(chain)); VolteHandler handler; @@ -131,6 +134,7 @@ TEST_CASE("VoLTE handler test") { std::queue chain; push(chain, + std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QMBNCFG, DummyOkResult{}), std::make_pair(AT::QCFG_IMS, DummyErrorResult{})); @@ -145,6 +149,7 @@ TEST_CASE("VoLTE handler test") { std::queue chain; push(chain, + std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QMBNCFG, DummyOkResult{}), std::make_pair(AT::QCFG_IMS, DummyOkResult{})); @@ -159,6 +164,7 @@ TEST_CASE("VoLTE handler test") { std::queue chain; push(chain, + std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QMBNCFG, DummyOkResult{}), std::make_pair(AT::QCFG_IMS, DummyOkResult{})); @@ -172,7 +178,7 @@ TEST_CASE("VoLTE handler test") SECTION("ReturnsOk_When_TryingToDisableVolte_And_AlreadyDisabled") { std::queue chain; - push(chain, std::make_pair(AT::QCFG_IMS, DummyOkResult{})); + push(chain, std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QCFG_IMS, DummyOkResult{})); CommandSequentialChannel channel(std::move(chain)); VolteHandler> handler; @@ -183,7 +189,10 @@ TEST_CASE("VoLTE handler test") SECTION("ReturnsFalse_When_TryingToDisableVolte_And_WasEnabledBefore") { std::queue chain; - push(chain, std::make_pair(AT::QCFG_IMS, DummyOkResult{}), std::make_pair(AT::QCFG_IMS, DummyOkResult{})); + push(chain, + std::make_pair(AT::QNVFW, DummyOkResult{}), + std::make_pair(AT::QCFG_IMS, DummyOkResult{}), + std::make_pair(AT::QCFG_IMS, DummyOkResult{})); CommandSequentialChannel channel(std::move(chain)); VolteHandler> handler; @@ -194,7 +203,10 @@ TEST_CASE("VoLTE handler test") SECTION("ReturnsFalse_When_TryingToEnableVolte_And_WasEnabledBefore") { std::queue chain; - push(chain, std::make_pair(AT::QCFG_IMS, DummyOkResult{}), std::make_pair(AT::QCFG_IMS, DummyOkResult{})); + push(chain, + std::make_pair(AT::QNVFW, DummyOkResult{}), + std::make_pair(AT::QCFG_IMS, DummyOkResult{}), + std::make_pair(AT::QCFG_IMS, DummyOkResult{})); CommandSequentialChannel channel(std::move(chain)); VolteHandler> handler; @@ -205,7 +217,10 @@ TEST_CASE("VoLTE handler test") SECTION("ThrowsAboutImsFailure_When_DisablingVolte_And_ImsSteeringCommandFailed") { std::queue chain; - push(chain, std::make_pair(AT::QCFG_IMS, DummyOkResult{}), std::make_pair(AT::QCFG_IMS, DummyErrorResult{})); + push(chain, + std::make_pair(AT::QNVFW, DummyOkResult{}), + std::make_pair(AT::QCFG_IMS, DummyOkResult{}), + std::make_pair(AT::QCFG_IMS, DummyErrorResult{})); CommandSequentialChannel channel(std::move(chain)); VolteHandler> handler; @@ -217,6 +232,7 @@ TEST_CASE("VoLTE handler test") { std::queue chain; push(chain, + std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QNVFW, DummyOkResult{}), std::make_pair(AT::QMBNCFG, DummyOkResult{}), std::make_pair(AT::QCFG_IMS, DummyOkResult{}),