From b4f9b2d201ed38062e0c3742f8ea6e52b0538d98 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Sun, 11 Feb 2024 18:47:40 -0500 Subject: [PATCH] fix some issues with the "unsupported no no mode" that people continue to abuse; correct issue with calculating list offsets when announcing RID lists to the host; --- .../p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp | 13 ++++++++++- .../p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp | 14 +++++++++++- src/common/p25/lc/tsbk/TSBKFactory.cpp | 4 ++++ src/fne/network/FNENetwork.cpp | 22 ++++++++++--------- src/host/p25/packet/ControlSignaling.cpp | 3 +++ src/host/p25/packet/Voice.cpp | 6 ++--- 6 files changed, 47 insertions(+), 15 deletions(-) diff --git a/src/common/p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp b/src/common/p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp index 2e70b81d..f10c9811 100644 --- a/src/common/p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp +++ b/src/common/p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp @@ -41,7 +41,18 @@ bool OSP_GRP_VCH_GRANT_UPD::decode(const uint8_t* data, bool rawTSBK) { assert(data != nullptr); - /* stub */ + uint8_t tsbk[P25_TSBK_LENGTH_BYTES + 1U]; + ::memset(tsbk, 0x00U, P25_TSBK_LENGTH_BYTES); + + bool ret = TSBK::decode(data, tsbk, rawTSBK); + if (!ret) + return false; + + ulong64_t tsbkValue = TSBK::toValue(tsbk); + + m_grpVchId = (uint8_t)((tsbkValue >> 60) & 0xFU); // Channel ID + m_grpVchNo = (uint32_t)((tsbkValue >> 48) & 0xFFFU); // Channel Number + m_dstId = (uint32_t)((tsbkValue >> 32) & 0xFFFFU); // Talkgroup Address return true; } diff --git a/src/common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp b/src/common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp index e27d706b..1c4885e9 100644 --- a/src/common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp +++ b/src/common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp @@ -41,7 +41,19 @@ bool OSP_UU_VCH_GRANT_UPD::decode(const uint8_t* data, bool rawTSBK) { assert(data != nullptr); - /* stub */ + uint8_t tsbk[P25_TSBK_LENGTH_BYTES + 1U]; + ::memset(tsbk, 0x00U, P25_TSBK_LENGTH_BYTES); + + bool ret = TSBK::decode(data, tsbk, rawTSBK); + if (!ret) + return false; + + ulong64_t tsbkValue = TSBK::toValue(tsbk); + + m_grpVchId = (uint8_t)((tsbkValue >> 60) & 0xFU); // Channel ID + m_grpVchNo = (uint32_t)((tsbkValue >> 48) & 0xFFFU); // Channel Number + m_dstId = (uint32_t)((tsbkValue >> 24) & 0xFFFFFFU); // Target Address + m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Address return true; } diff --git a/src/common/p25/lc/tsbk/TSBKFactory.cpp b/src/common/p25/lc/tsbk/TSBKFactory.cpp index 3fd8f446..718579b5 100644 --- a/src/common/p25/lc/tsbk/TSBKFactory.cpp +++ b/src/common/p25/lc/tsbk/TSBKFactory.cpp @@ -175,8 +175,12 @@ std::unique_ptr TSBKFactory::createTSBK(const uint8_t* data, bool rawTSBK) switch (lco) { case TSBK_IOSP_GRP_VCH: return decode(new IOSP_GRP_VCH(), data, rawTSBK); + case TSBK_OSP_GRP_VCH_GRANT_UPD: + return decode(new OSP_GRP_VCH_GRANT_UPD(), data, rawTSBK); case TSBK_IOSP_UU_VCH: return decode(new IOSP_UU_VCH(), data, rawTSBK); + case TSBK_OSP_UU_VCH_GRANT_UPD: + return decode(new OSP_UU_VCH_GRANT_UPD(), data, rawTSBK); case TSBK_IOSP_UU_ANS: return decode(new IOSP_UU_ANS(), data, rawTSBK); case TSBK_ISP_SNDCP_CH_REQ: diff --git a/src/fne/network/FNENetwork.cpp b/src/fne/network/FNENetwork.cpp index f4a41c3f..0bf5e064 100644 --- a/src/fne/network/FNENetwork.cpp +++ b/src/fne/network/FNENetwork.cpp @@ -1115,10 +1115,11 @@ void FNENetwork::writeWhitelistRIDs(uint32_t peerId) size_t listSize = ridWhitelist.size(); if (chunkCnt > 1U) { listSize = MAX_RID_LIST_CHUNK; - } - if (i == chunkCnt - 1U) { - listSize = (chunkCnt * MAX_RID_LIST_CHUNK) - ridWhitelist.size(); + if (i == chunkCnt - 1U) { + // this is a disgusting dirty hack... + listSize = abs((i * MAX_RID_LIST_CHUNK) - ridWhitelist.size()); + } } if (listSize > ridWhitelist.size()) { @@ -1135,7 +1136,7 @@ void FNENetwork::writeWhitelistRIDs(uint32_t peerId) // write whitelisted IDs to whitelist payload uint32_t offs = 4U; for (uint32_t j = 0; j < listSize; j++) { - uint32_t id = ridWhitelist.at(j + (i * MAX_RID_LIST_CHUNK)); + uint32_t id = ridWhitelist.at(j + (i * listSize)); if (m_debug) LogDebug(LOG_NET, "PEER %u whitelisting RID %u (%d / %d)", peerId, id, i, j); @@ -1183,10 +1184,11 @@ void FNENetwork::writeBlacklistRIDs(uint32_t peerId) size_t listSize = ridBlacklist.size(); if (chunkCnt > 1U) { listSize = MAX_RID_LIST_CHUNK; - } - - if (i == chunkCnt - 1U) { - listSize = (chunkCnt * MAX_RID_LIST_CHUNK) - ridBlacklist.size(); + + if (i == chunkCnt - 1U) { + // this is a disgusting dirty hack... + listSize = abs((i * MAX_RID_LIST_CHUNK) - ridBlacklist.size()); + } } if (listSize > ridBlacklist.size()) { @@ -1200,10 +1202,10 @@ void FNENetwork::writeBlacklistRIDs(uint32_t peerId) __SET_UINT32(listSize, payload, 0U); - // write whitelisted IDs to whitelist payload + // write blacklisted IDs to blacklist payload uint32_t offs = 4U; for (uint32_t j = 0; j < listSize; j++) { - uint32_t id = ridBlacklist.at(j + (i * MAX_RID_LIST_CHUNK)); + uint32_t id = ridBlacklist.at(j + (i * listSize)); if (m_debug) LogDebug(LOG_NET, "PEER %u blacklisting RID %u (%d / %d)", peerId, id, i, j); diff --git a/src/host/p25/packet/ControlSignaling.cpp b/src/host/p25/packet/ControlSignaling.cpp index c562a753..bff12691 100644 --- a/src/host/p25/packet/ControlSignaling.cpp +++ b/src/host/p25/packet/ControlSignaling.cpp @@ -787,6 +787,9 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr } } return true; // don't allow this to write to the air + case TSBK_OSP_GRP_VCH_GRANT_UPD: + case TSBK_OSP_UU_VCH_GRANT_UPD: + return true; // don't allow this to write to the air case TSBK_IOSP_UU_ANS: { IOSP_UU_ANS* iosp = static_cast(tsbk.get()); diff --git a/src/host/p25/packet/Voice.cpp b/src/host/p25/packet/Voice.cpp index 0ac8228f..c3a5679c 100644 --- a/src/host/p25/packet/Voice.cpp +++ b/src/host/p25/packet/Voice.cpp @@ -445,7 +445,7 @@ bool Voice::process(uint8_t* data, uint32_t len) } for (int i = 0; i < 3; i++) - m_p25->m_control->writeRF_TSDU_SBF(osp.get(), false, false, false, false); + m_p25->m_control->writeRF_TSDU_SBF(osp.get(), true, false, false, false); } } @@ -548,7 +548,7 @@ bool Voice::process(uint8_t* data, uint32_t len) } for (int i = 0; i < 3; i++) - m_p25->m_control->writeRF_TSDU_SBF(osp.get(), false, false, false, false); + m_p25->m_control->writeRF_TSDU_SBF(osp.get(), true, false, false, false); } m_rfFrames = 0U; @@ -1537,7 +1537,7 @@ void Voice::writeNet_LDU1() } for (int i = 0; i < 6; i++) - m_p25->m_control->writeRF_TSDU_SBF(osp.get(), false, false, false, true); + m_p25->m_control->writeRF_TSDU_SBF(osp.get(), true, false, false, true); } }