diff --git a/edac/CRC.cpp b/edac/CRC.cpp index 895b234d..cdca1354 100644 --- a/edac/CRC.cpp +++ b/edac/CRC.cpp @@ -253,7 +253,7 @@ bool CRC::checkCCITT162(const uint8_t *in, uint32_t length) #if DEBUG_CRC uint16_t inCrc = (in[length - 2U] << 8) | (in[length - 1U] << 0); - LogDebug(LOG_HOST, "CRC::checkCCITT161(), crc = $%04X, in = $%04X, len = %u", crc16, inCrc, length); + LogDebug(LOG_HOST, "CRC::checkCCITT162(), crc = $%04X, in = $%04X, len = %u", crc16, inCrc, length); #endif return crc8[0U] == in[length - 1U] && crc8[1U] == in[length - 2U]; diff --git a/p25/data/DataBlock.cpp b/p25/data/DataBlock.cpp index 3c30d7a9..cf337af8 100644 --- a/p25/data/DataBlock.cpp +++ b/p25/data/DataBlock.cpp @@ -124,10 +124,6 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader header) ::memcpy(m_data, buffer + 2U, count); // Payload Data } -#if DEBUG_P25_PDU_DATA - Utils::dump(1U, "P25, DataBlock::decode(), Confirmed PDU Block Data", m_data, count); -#endif - // compute CRC-9 for the packet uint16_t calculated = edac::CRC::crc9(buffer, 144U); if (((crc ^ calculated) != 0) && ((crc ^ calculated) != 0x1FFU)) { @@ -136,6 +132,7 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader header) #if DEBUG_P25_PDU_DATA LogDebug(LOG_P25, "P25_DUID_PDU, fmt = $%02X, crc = $%04X, calculated = $%04X", m_fmt, crc, calculated); + Utils::dump(1U, "P25, DataBlock::decode(), Confirmed PDU Block Data", m_data, count); #endif } catch (...) { diff --git a/p25/data/DataHeader.cpp b/p25/data/DataHeader.cpp index c81853b6..a359f4e7 100644 --- a/p25/data/DataHeader.cpp +++ b/p25/data/DataHeader.cpp @@ -101,12 +101,12 @@ bool DataHeader::decode(const uint8_t* data) } #if DEBUG_P25_PDU_DATA - Utils::dump(1U, "P25, DataHeader::decode(), PDU Header Data", data, P25_PDU_HEADER_LENGTH_BYTES); + Utils::dump(1U, "P25, DataHeader::decode(), PDU Header Data", header, P25_PDU_HEADER_LENGTH_BYTES); #endif m_ackNeeded = (header[0U] & 0x40U) == 0x40U; // Acknowledge Needed m_outbound = (header[0U] & 0x20U) == 0x20U; // Inbound/Outbound - m_fmt = header[0U] & 0x1F; // Packet Format + m_fmt = header[0U] & 0x1FU; // Packet Format m_sap = header[1U] & 0x3FU; // Service Access Point @@ -193,7 +193,7 @@ void DataHeader::encode(uint8_t* data) (m_fmt & 0x1FU); // Packet Format header[1U] = m_sap & 0x3FU; // Service Access Point - header[1U] |= 0xC0; + header[1U] |= 0xC0U; header[2U] = m_mfId; // Mfg Id. diff --git a/p25/packet/Data.cpp b/p25/packet/Data.cpp index 65311d84..da79654b 100644 --- a/p25/packet/Data.cpp +++ b/p25/packet/Data.cpp @@ -290,7 +290,7 @@ bool Data::process(uint8_t* data, uint32_t len) LogMessage(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_REQ_CNCT (Registration Request Connect), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); } - m_connQueueTable[llId] = ipAddr; + m_connQueueTable[llId] = std::make_tuple(m_rfDataHeader.getMFId(), ipAddr); m_connTimerTable[llId] = Timer(1000U, CONN_WAIT_TIMEOUT); m_connTimerTable[llId].start(); @@ -569,11 +569,12 @@ void Data::clock(uint32_t ms) // handle PDU connection registration for (auto it = connToClear.begin(); it != connToClear.end(); ++it) { uint32_t llId = *it; - uint64_t ipAddr = m_connQueueTable[llId]; + uint8_t mfId = std::get<0>(m_connQueueTable[llId]); + uint64_t ipAddr = std::get<1>(m_connQueueTable[llId]); if (!acl::AccessControl::validateSrcId(llId)) { LogWarning(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_RSP_DENY (Registration Response Deny), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); - writeRF_PDU_Reg_Response(PDU_REG_TYPE_RSP_DENY, llId, ipAddr); + writeRF_PDU_Reg_Response(PDU_REG_TYPE_RSP_DENY, mfId, llId, ipAddr); } else { if (!hasLLIdFNEReg(llId)) { @@ -585,7 +586,7 @@ void Data::clock(uint32_t ms) LogMessage(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_RSP_ACCPT (Registration Response Accept), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); } - writeRF_PDU_Reg_Response(PDU_REG_TYPE_RSP_ACCPT, llId, ipAddr); + writeRF_PDU_Reg_Response(PDU_REG_TYPE_RSP_ACCPT, mfId, llId, ipAddr); } m_connQueueTable.erase(llId); @@ -833,9 +834,10 @@ void Data::writeRF_PDU_Buffered() /// Helper to write a PDU registration response. /// /// +/// /// /// -void Data::writeRF_PDU_Reg_Response(uint8_t regType, uint32_t llId, ulong64_t ipAddr) +void Data::writeRF_PDU_Reg_Response(uint8_t regType, uint8_t mfId, uint32_t llId, ulong64_t ipAddr) { if ((regType != PDU_REG_TYPE_RSP_ACCPT) && (regType != PDU_REG_TYPE_RSP_DENY)) return; @@ -850,11 +852,11 @@ void Data::writeRF_PDU_Reg_Response(uint8_t regType, uint32_t llId, ulong64_t ip DataHeader rspHeader = DataHeader(); rspHeader.setFormat(PDU_FMT_CONFIRMED); - rspHeader.setMFId(m_rfDataHeader.getMFId()); + rspHeader.setMFId(mfId); rspHeader.setAckNeeded(true); rspHeader.setOutbound(true); rspHeader.setSAP(PDU_SAP_REG); - rspHeader.setLLId(m_rfDataHeader.getLLId()); + rspHeader.setLLId(llId); rspHeader.setBlocksToFollow(1U); // Generate the PDU header and 1/2 rate Trellis diff --git a/p25/packet/Data.h b/p25/packet/Data.h index 4bdfeeb6..6b877316 100644 --- a/p25/packet/Data.h +++ b/p25/packet/Data.h @@ -110,7 +110,7 @@ namespace p25 std::unordered_map m_fneRegTable; - std::unordered_map m_connQueueTable; + std::unordered_map> m_connQueueTable; std::unordered_map m_connTimerTable; bool m_dumpPDUData; @@ -134,7 +134,7 @@ namespace p25 /// Helper to re-write a received P25 PDU packet. void writeRF_PDU_Buffered(); /// Helper to write a PDU registration response. - void writeRF_PDU_Reg_Response(uint8_t regType, uint32_t llId, ulong64_t ipAddr); + void writeRF_PDU_Reg_Response(uint8_t regType, uint8_t mfId, uint32_t llId, ulong64_t ipAddr); /// Helper to write a PDU acknowledge response. void writeRF_PDU_Ack_Response(uint8_t ackClass, uint8_t ackType, uint32_t llId, bool noNulls = false); };