From dbc30e97b4f98239492565e8b0b09ad7dfc8ec5a Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Sat, 10 Oct 2026 14:50:31 -0400 Subject: [PATCH] correct DMR ACK_RSP dstId truncation; --- src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp | 2 +- tests/dmr/Tier3Lifecycle_Tests.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp b/src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp index faac3f75..ebec778e 100644 --- a/src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp +++ b/src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp @@ -45,7 +45,7 @@ bool CSBK_ACK_RSP::decode(const uint8_t* data) m_GI = (((csbkValue >> 56) & 0xFFU) & 0x40U) == 0x40U; // Group/Individual Flag m_reason = (uint8_t)((csbkValue >> 33) & 0xFFU); // Reason Code - m_dstId = (uint32_t)((csbkValue >> 24) & 0xFFFFU); // Target Radio Address + m_dstId = (uint32_t)((csbkValue >> 24) & 0xFFFFFFU); // Target Radio Address m_srcId = (uint32_t)(csbkValue & 0xFFFFFFU); // Source Radio Address return true; diff --git a/tests/dmr/Tier3Lifecycle_Tests.cpp b/tests/dmr/Tier3Lifecycle_Tests.cpp index 98cf968b..b4eba24f 100644 --- a/tests/dmr/Tier3Lifecycle_Tests.cpp +++ b/tests/dmr/Tier3Lifecycle_Tests.cpp @@ -10,6 +10,7 @@ #include "host/Defines.h" #include "common/dmr/DMRDefines.h" +#include "common/dmr/lc/csbk/CSBK_ACK_RSP.h" #include "common/dmr/lc/csbk/CSBK_MAINT.h" #include "common/dmr/lc/csbk/CSBK_P_CLEAR.h" #include "common/lookups/ChannelLookup.h" @@ -20,6 +21,25 @@ using namespace dmr::defines; using namespace dmr::lc::csbk; +TEST_CASE("DMR Tier III acknowledgement preserves 24-bit target addresses", "[dmr][tier3][csbk]") +{ + CSBK_ACK_RSP encoded; + encoded.setLastBlock(true); + encoded.setReason(ReasonCode::TS_ACK_RSN_MSG); + encoded.setResponse(0x55U); + encoded.setDstId(0xABCDEFU); + encoded.setSrcId(WUID_TSI); + + uint8_t burst[DMR_FRAME_LENGTH_BYTES] = { 0U }; + encoded.encode(burst); + + CSBK_ACK_RSP decoded; + decoded.setDataType(DataType::CSBK); + REQUIRE(decoded.decode(burst)); + CHECK(decoded.getDstId() == 0xABCDEFU); + CHECK(decoded.getSrcId() == WUID_TSI); +} + TEST_CASE("DMR Tier III maintenance preserves 24-bit addresses", "[dmr][tier3][csbk]") { CSBK_MAINT encoded;