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;

pull/51/head
Bryan Biedenkapp 2 years ago
parent 17d69cb950
commit b4f9b2d201

@ -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;
}

@ -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;
}

@ -175,8 +175,12 @@ std::unique_ptr<TSBK> 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:

@ -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);

@ -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<IOSP_UU_ANS*>(tsbk.get());

@ -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);
}
}

Loading…
Cancel
Save

Powered by TurnKey Linux.