correct missing handling of MBC_DATA for DMR;

pull/121/merge
Bryan Biedenkapp 3 weeks ago
parent 64529052ff
commit 07b0ebaf85

@ -115,6 +115,8 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType)
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType);
break; break;
@ -136,6 +138,8 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType)
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType);
break; break;
@ -151,6 +155,8 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType)
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType);
break; break;
@ -167,6 +173,8 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType)
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType);
break; break;
@ -245,6 +253,8 @@ bool CSBK::decode(const uint8_t* data, uint8_t* payload)
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBK::decode(), unhandled dataType = $%02X", m_dataType); LogError(LOG_DMR, "CSBK::decode(), unhandled dataType = $%02X", m_dataType);
break; break;
@ -266,6 +276,8 @@ bool CSBK::decode(const uint8_t* data, uint8_t* payload)
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBK::decode(), unhandled dataType = $%02X", m_dataType); LogError(LOG_DMR, "CSBK::decode(), unhandled dataType = $%02X", m_dataType);
break; break;
@ -318,6 +330,8 @@ void CSBK::encode(uint8_t* data, const uint8_t* payload)
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBK::encoded(), unhandled dataType = $%02X", m_dataType); LogError(LOG_DMR, "CSBK::encoded(), unhandled dataType = $%02X", m_dataType);
break; break;
@ -334,6 +348,8 @@ void CSBK::encode(uint8_t* data, const uint8_t* payload)
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBK::encode(), unhandled dataType = $%02X", m_dataType); LogError(LOG_DMR, "CSBK::encode(), unhandled dataType = $%02X", m_dataType);
break; break;

@ -55,6 +55,8 @@ std::unique_ptr<CSBK> CSBKFactory::createCSBK(const uint8_t* data, DataType::E d
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBKFactory::createCSBK(), unhandled dataType = $%02X", dataType); LogError(LOG_DMR, "CSBKFactory::createCSBK(), unhandled dataType = $%02X", dataType);
break; break;
@ -76,6 +78,8 @@ std::unique_ptr<CSBK> CSBKFactory::createCSBK(const uint8_t* data, DataType::E d
csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[10U] ^= CSBK_MBC_CRC_MASK[0U];
csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U];
break; break;
case DataType::MBC_DATA:
break;
default: default:
LogError(LOG_DMR, "CSBKFactory::createCSBK(), unhandled dataType = $%02X", dataType); LogError(LOG_DMR, "CSBKFactory::createCSBK(), unhandled dataType = $%02X", dataType);
break; break;
@ -86,34 +90,34 @@ std::unique_ptr<CSBK> CSBKFactory::createCSBK(const uint8_t* data, DataType::E d
switch (CSBKO) { switch (CSBKO) {
case CSBKO::BSDWNACT: case CSBKO::BSDWNACT:
return decode(new CSBK_BSDWNACT(), data); return decode(new CSBK_BSDWNACT(), data, dataType);
case CSBKO::UU_V_REQ: case CSBKO::UU_V_REQ:
return decode(new CSBK_UU_V_REQ(), data); return decode(new CSBK_UU_V_REQ(), data, dataType);
case CSBKO::UU_ANS_RSP: case CSBKO::UU_ANS_RSP:
return decode(new CSBK_UU_ANS_RSP(), data); return decode(new CSBK_UU_ANS_RSP(), data, dataType);
case CSBKO::PRECCSBK: case CSBKO::PRECCSBK:
return decode(new CSBK_PRECCSBK(), data); return decode(new CSBK_PRECCSBK(), data, dataType);
case CSBKO::RAND: // CSBKO::CALL_ALRT when FID == FID_MOT case CSBKO::RAND: // CSBKO::CALL_ALRT when FID == FID_MOT
switch (FID) switch (FID)
{ {
case FID_MOT: case FID_MOT:
return decode(new CSBK_CALL_ALRT(), data); return decode(new CSBK_CALL_ALRT(), data, dataType);
case FID_ETSI: case FID_ETSI:
default: default:
return decode(new CSBK_RAND(), data); return decode(new CSBK_RAND(), data, dataType);
} }
case CSBKO::EXT_FNCT: case CSBKO::EXT_FNCT:
return decode(new CSBK_EXT_FNCT(), data); return decode(new CSBK_EXT_FNCT(), data, dataType);
case CSBKO::NACK_RSP: case CSBKO::NACK_RSP:
return decode(new CSBK_NACK_RSP(), data); return decode(new CSBK_NACK_RSP(), data, dataType);
/** Tier 3 */ /** Tier 3 */
case CSBKO::ACK_RSP: case CSBKO::ACK_RSP:
return decode(new CSBK_ACK_RSP(), data); return decode(new CSBK_ACK_RSP(), data, dataType);
case CSBKO::BROADCAST: case CSBKO::BROADCAST:
return decode(new CSBK_BROADCAST(), data); return decode(new CSBK_BROADCAST(), data, dataType);
case CSBKO::MAINT: case CSBKO::MAINT:
return decode(new CSBK_MAINT(), data); return decode(new CSBK_MAINT(), data, dataType);
default: default:
LogError(LOG_DMR, "CSBKFactory::create(), unknown CSBK type, csbko = $%02X", CSBKO); LogError(LOG_DMR, "CSBKFactory::create(), unknown CSBK type, csbko = $%02X", CSBKO);
@ -129,11 +133,13 @@ std::unique_ptr<CSBK> CSBKFactory::createCSBK(const uint8_t* data, DataType::E d
/* Decode a CSBK. */ /* Decode a CSBK. */
std::unique_ptr<CSBK> CSBKFactory::decode(CSBK* csbk, const uint8_t* data) std::unique_ptr<CSBK> CSBKFactory::decode(CSBK* csbk, const uint8_t* data, DataType::E dataType)
{ {
assert(csbk != nullptr); assert(csbk != nullptr);
assert(data != nullptr); assert(data != nullptr);
csbk->setDataType(dataType);
if (!csbk->decode(data)) { if (!csbk->decode(data)) {
return nullptr; return nullptr;
} }

@ -84,7 +84,7 @@ namespace dmr
* @param[in] data Buffer containing CSBK packet data to decode. * @param[in] data Buffer containing CSBK packet data to decode.
* @returns CSBK* Instance of a CSBK representing the decoded data. * @returns CSBK* Instance of a CSBK representing the decoded data.
*/ */
static std::unique_ptr<CSBK> decode(CSBK* csbk, const uint8_t* data); static std::unique_ptr<CSBK> decode(CSBK* csbk, const uint8_t* data, defines::DataType::E dataType);
}; };
} // namespace csbk } // namespace csbk
} // namespace lc } // namespace lc

@ -622,7 +622,7 @@ void Control::writeRF_Call_Alrt(uint32_t slotNo, uint32_t srcId, uint32_t dstId)
bool Control::isBusy() const bool Control::isBusy() const
{ {
return (m_slot1->m_rfState != RS_RF_LISTENING || m_slot1->m_netState != RS_NET_IDLE) && return (m_slot1->m_rfState != RS_RF_LISTENING || m_slot1->m_netState != RS_NET_IDLE) ||
(m_slot2->m_rfState != RS_RF_LISTENING || m_slot2->m_netState != RS_NET_IDLE); (m_slot2->m_rfState != RS_RF_LISTENING || m_slot2->m_netState != RS_NET_IDLE);
} }

@ -289,7 +289,7 @@ bool Slot::processFrame(uint8_t *data, uint32_t len)
if (dataSync) { if (dataSync) {
DataType::E dataType = (DataType::E)(data[1U] & 0x0FU); DataType::E dataType = (DataType::E)(data[1U] & 0x0FU);
if (dataType == DataType::CSBK) { if (dataType == DataType::CSBK || dataType == DataType::MBC_HEADER || dataType == DataType::MBC_DATA) {
return m_control->process(data, len); return m_control->process(data, len);
} }
@ -495,7 +495,7 @@ void Slot::processNetwork(const data::NetData& dmrData)
// if *this slot* is the TSCC slot, stop processing after this point // if *this slot* is the TSCC slot, stop processing after this point
if (m_enableTSCC && m_dedicatedTSCC) if (m_enableTSCC && m_dedicatedTSCC)
{ {
if (dataType != DataType::CSBK) if (dataType != DataType::CSBK && dataType != DataType::MBC_HEADER && dataType != DataType::MBC_DATA)
return; return;
else { else {
if (m_slotNo != s_dmr->m_tsccSlotNo) if (m_slotNo != s_dmr->m_tsccSlotNo)
@ -507,6 +507,8 @@ void Slot::processNetwork(const data::NetData& dmrData)
switch (dataType) switch (dataType)
{ {
case DataType::CSBK: case DataType::CSBK:
case DataType::MBC_HEADER:
case DataType::MBC_DATA:
m_control->processNetwork(dmrData); m_control->processNetwork(dmrData);
break; break;
case DataType::VOICE_LC_HEADER: case DataType::VOICE_LC_HEADER:

@ -121,7 +121,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len)
slotType.setColorCode(m_slot->s_colorCode); slotType.setColorCode(m_slot->s_colorCode);
slotType.setDataType(dataType); slotType.setDataType(dataType);
if (dataType == DataType::CSBK) { if (dataType == DataType::CSBK || dataType == DataType::MBC_HEADER || dataType == DataType::MBC_DATA) {
// generate a new CSBK and check validity // generate a new CSBK and check validity
std::unique_ptr<lc::CSBK> csbk = CSBKFactory::createCSBK(data + 2U, dataType); std::unique_ptr<lc::CSBK> csbk = CSBKFactory::createCSBK(data + 2U, dataType);
if (csbk == nullptr) if (csbk == nullptr)
@ -369,7 +369,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len)
if (m_slot->s_duplex) if (m_slot->s_duplex)
m_slot->addFrame(data); m_slot->addFrame(data);
m_slot->writeNetwork(data, DataType::CSBK, gi ? FLCO::GROUP : FLCO::PRIVATE, srcId, dstId, 0U, 0U, true); m_slot->writeNetwork(data, dataType, gi ? FLCO::GROUP : FLCO::PRIVATE, srcId, dstId, 0U, 0U, true);
} }
return true; return true;
@ -387,7 +387,7 @@ void ControlSignaling::processNetwork(const data::NetData& dmrData)
uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U];
dmrData.getData(data + 2U); dmrData.getData(data + 2U);
if (dataType == DataType::CSBK) { if (dataType == DataType::CSBK || dataType == DataType::MBC_HEADER || dataType == DataType::MBC_DATA) {
std::unique_ptr<lc::CSBK> csbk = CSBKFactory::createCSBK(data + 2U, dataType); std::unique_ptr<lc::CSBK> csbk = CSBKFactory::createCSBK(data + 2U, dataType);
if (csbk == nullptr) { if (csbk == nullptr) {
LogError(LOG_NET, "DMR Slot %u, CSBK, unable to decode the network CSBK", m_slot->m_slotNo); LogError(LOG_NET, "DMR Slot %u, CSBK, unable to decode the network CSBK", m_slot->m_slotNo);

Loading…
Cancel
Save

Powered by TurnKey Linux.