diff --git a/dmr/DataPacket.cpp b/dmr/DataPacket.cpp index 25fa56dc..c42a6fb0 100644 --- a/dmr/DataPacket.cpp +++ b/dmr/DataPacket.cpp @@ -115,7 +115,14 @@ bool DataPacket::process(uint8_t* data, uint32_t len) // validate source RID if (!acl::AccessControl::validateSrcId(srcId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE_LC_HEADER denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); + if (m_lastRejectId == 0U || m_lastRejectId == srcId) { + LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE_LC_HEADER denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); + ::ActivityLog("DMR", true, "Slot %u RF voice rejection from %u to %s%u ", m_slot->m_slotNo, srcId, flco == FLCO_GROUP ? "TG " : "", dstId); + } + + m_slot->m_rfLastDstId = 0U; + m_slot->m_rfTGHang.stop(); + delete lc; return false; } @@ -123,12 +130,21 @@ bool DataPacket::process(uint8_t* data, uint32_t len) // validate target TID, if the target is a talkgroup if (flco == FLCO_GROUP) { if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE_LC_HEADER denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); + if (m_lastRejectId == 0U || m_lastRejectId == dstId) { + LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE_LC_HEADER denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); + ::ActivityLog("DMR", true, "Slot %u RF voice rejection from %u to TG %u ", m_slot->m_slotNo, srcId, dstId); + } + + m_slot->m_rfLastDstId = 0U; + m_slot->m_rfTGHang.stop(); + delete lc; return false; } } + m_lastRejectId = 0U; + if (m_verbose) { LogMessage(LOG_RF, "DMR Slot %u, DT_VOICE_LC_HEADER, srcId = %u, dstId = %u, FLCO = $%02X, FID = $%02X, PF = %u", m_slot->m_slotNo, lc->getSrcId(), lc->getDstId(), lc->getFLCO(), lc->getFID(), lc->getPF()); } @@ -196,7 +212,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len) Utils::dump(2U, "!!! *TX DMR Frame - DT_VOICE_LC_HEADER", data + 2U, DMR_FRAME_LENGTH_BYTES); } - ::ActivityLog("DMR", true, "Slot %u, received RF %svoice header from %u to %s%u", m_slot->m_slotNo, encrypted ? "encrypted " : "", srcId, flco == FLCO_GROUP ? "TG " : "", dstId); + ::ActivityLog("DMR", true, "Slot %u RF %svoice header from %u to %s%u", m_slot->m_slotNo, encrypted ? "encrypted " : "", srcId, flco == FLCO_GROUP ? "TG " : "", dstId); return true; } else if (dataType == DT_VOICE_PI_HEADER) { @@ -260,12 +276,12 @@ bool DataPacket::process(uint8_t* data, uint32_t len) } if (m_slot->m_rssi != 0U) { - ::ActivityLog("DMR", true, "Slot %u, received RF end of voice transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", + ::ActivityLog("DMR", true, "Slot %u RF end of voice transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slot->m_slotNo, float(m_slot->m_rfFrames) / 16.667F, float(m_slot->m_rfErrs * 100U) / float(m_slot->m_rfBits), m_slot->m_minRSSI, m_slot->m_maxRSSI, m_slot->m_aveRSSI / m_slot->m_rssiCount); } else { - ::ActivityLog("DMR", true, "Slot %u, received RF end of voice transmission, %.1f seconds, BER: %.1f%%", + ::ActivityLog("DMR", true, "Slot %u RF end of voice transmission, %.1f seconds, BER: %.1f%%", m_slot->m_slotNo, float(m_slot->m_rfFrames) / 16.667F, float(m_slot->m_rfErrs * 100U) / float(m_slot->m_rfBits)); } @@ -361,7 +377,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len) m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId); } - ::ActivityLog("DMR", true, "Slot %u received call alert request from %u to %u", m_slot->m_slotNo, srcId, dstId); + ::ActivityLog("DMR", true, "Slot %u call alert request from %u to %u", m_slot->m_slotNo, srcId, dstId); break; case CSBKO_ACK_RSP: if (m_verbose) { @@ -369,7 +385,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len) m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId); } - ::ActivityLog("DMR", true, "Slot %u received ack response from %u to %u", m_slot->m_slotNo, srcId, dstId); + ::ActivityLog("DMR", true, "Slot %u ack response from %u to %u", m_slot->m_slotNo, srcId, dstId); break; case CSBKO_EXT_FNCT: if (m_verbose) { @@ -379,22 +395,22 @@ bool DataPacket::process(uint8_t* data, uint32_t len) // generate activity log entry if (csbk.getCBF() == DMR_EXT_FNCT_CHECK) { - ::ActivityLog("DMR", true, "Slot %u received radio check request from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", true, "Slot %u radio check request from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_INHIBIT) { - ::ActivityLog("DMR", true, "Slot %u received radio inhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", true, "Slot %u radio inhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_UNINHIBIT) { - ::ActivityLog("DMR", true, "Slot %u received radio uninhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", true, "Slot %u radio uninhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_CHECK_ACK) { - ::ActivityLog("DMR", true, "Slot %u received radio check response from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", true, "Slot %u radio check response from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_INHIBIT_ACK) { - ::ActivityLog("DMR", true, "Slot %u received radio inhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", true, "Slot %u radio inhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_UNINHIBIT_ACK) { - ::ActivityLog("DMR", true, "Slot %u received radio uninhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", true, "Slot %u radio uninhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); } break; case CSBKO_PRECCSBK: @@ -476,13 +492,13 @@ bool DataPacket::process(uint8_t* data, uint32_t len) Utils::dump(2U, "!!! *TX DMR Frame - DT_DATA_HEADER", data + 2U, DMR_FRAME_LENGTH_BYTES); } - ::ActivityLog("DMR", true, "Slot %u, received RF data header from %u to %s%u, %u blocks", m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId, m_slot->m_rfFrames); + ::ActivityLog("DMR", true, "Slot %u RF data header from %u to %s%u, %u blocks", m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId, m_slot->m_rfFrames); ::memset(m_pduUserData, 0x00U, DMR_MAX_PDU_COUNT * DMR_MAX_PDU_LENGTH + 2U); m_pduDataOffset = 0U; if (m_slot->m_rfFrames == 0U) { - ::ActivityLog("DMR", true, "Slot %u, ended RF data transmission", m_slot->m_slotNo); + ::ActivityLog("DMR", true, "Slot %u ended RF data transmission", m_slot->m_slotNo); writeEndRF(); } @@ -662,7 +678,7 @@ void DataPacket::processNetwork(const data::Data& dmrData) Utils::dump(2U, "!!! *TX DMR Network Frame - DT_VOICE_LC_HEADER", data + 2U, DMR_FRAME_LENGTH_BYTES); } - ::ActivityLog("DMR", false, "Slot %u, received network voice header from %u to %s%u", m_slot->m_slotNo, srcId, flco == FLCO_GROUP ? "TG " : "", dstId); + ::ActivityLog("DMR", false, "Slot %u network voice header from %u to %s%u", m_slot->m_slotNo, srcId, flco == FLCO_GROUP ? "TG " : "", dstId); } else if (dataType == DT_VOICE_PI_HEADER) { if (m_slot->m_netState != RS_NET_AUDIO) { @@ -723,7 +739,7 @@ void DataPacket::processNetwork(const data::Data& dmrData) m_slot->setShortLC(m_slot->m_slotNo, dstId, m_netLC->getFLCO(), true); - ::ActivityLog("DMR", false, "Slot %u, received network late entry from %u to %s%u", + ::ActivityLog("DMR", false, "Slot %u network late entry from %u to %s%u", m_slot->m_slotNo, srcId, m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dstId); } @@ -788,7 +804,7 @@ void DataPacket::processNetwork(const data::Data& dmrData) // We've received the voice header and terminator haven't we? m_slot->m_netFrames += 2U; - ::ActivityLog("DMR", false, "Slot %u, received network end of voice transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", + ::ActivityLog("DMR", false, "Slot %u network end of voice transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slot->m_slotNo, float(m_slot->m_netFrames) / 16.667F, (m_slot->m_netLost * 100U) / m_slot->m_netFrames, float(m_slot->m_netErrs * 100U) / float(m_slot->m_netBits)); writeEndNet(); @@ -878,7 +894,7 @@ void DataPacket::processNetwork(const data::Data& dmrData) m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId); } - ::ActivityLog("DMR", false, "Slot %u received call alert request from %u to %u", m_slot->m_slotNo, srcId, dstId); + ::ActivityLog("DMR", false, "Slot %u call alert request from %u to %u", m_slot->m_slotNo, srcId, dstId); break; case CSBKO_ACK_RSP: if (m_verbose) { @@ -886,7 +902,7 @@ void DataPacket::processNetwork(const data::Data& dmrData) m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId); } - ::ActivityLog("DMR", false, "Slot %u received ack response from %u to %u", m_slot->m_slotNo, srcId, dstId); + ::ActivityLog("DMR", false, "Slot %u ack response from %u to %u", m_slot->m_slotNo, srcId, dstId); break; case CSBKO_EXT_FNCT: if (m_verbose) { @@ -896,22 +912,22 @@ void DataPacket::processNetwork(const data::Data& dmrData) // generate activity log entry if (csbk.getCBF() == DMR_EXT_FNCT_CHECK) { - ::ActivityLog("DMR", false, "Slot %u received radio check request from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", false, "Slot %u radio check request from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_INHIBIT) { - ::ActivityLog("DMR", false, "Slot %u received radio inhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", false, "Slot %u radio inhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_UNINHIBIT) { - ::ActivityLog("DMR", false, "Slot %u received radio uninhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", false, "Slot %u radio uninhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_CHECK_ACK) { - ::ActivityLog("DMR", false, "Slot %u received radio check response from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", false, "Slot %u radio check response from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_INHIBIT_ACK) { - ::ActivityLog("DMR", false, "Slot %u received radio inhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", false, "Slot %u radio inhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); } else if (csbk.getCBF() == DMR_EXT_FNCT_UNINHIBIT_ACK) { - ::ActivityLog("DMR", false, "Slot %u received radio uninhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); + ::ActivityLog("DMR", false, "Slot %u radio uninhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); } break; case CSBKO_PRECCSBK: @@ -975,14 +991,14 @@ void DataPacket::processNetwork(const data::Data& dmrData) Utils::dump(2U, "!!! *TX DMR Network Frame - DT_DATA_HEADER", data + 2U, DMR_FRAME_LENGTH_BYTES); } - ::ActivityLog("DMR", false, "Slot %u, received network data header from %u to %s%u, %u blocks", + ::ActivityLog("DMR", false, "Slot %u network data header from %u to %s%u, %u blocks", m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId, m_slot->m_netFrames); ::memset(m_pduUserData, 0x00U, DMR_MAX_PDU_COUNT * DMR_MAX_PDU_LENGTH + 2U); m_pduDataOffset = 0U; if (m_slot->m_netFrames == 0U) { - ::ActivityLog("DMR", false, "Slot %u, ended network data transmission", m_slot->m_slotNo); + ::ActivityLog("DMR", false, "Slot %u ended network data transmission", m_slot->m_slotNo); writeEndNet(); } } @@ -1082,6 +1098,7 @@ DataPacket::DataPacket(Slot* slot, network::BaseNetwork* network, bool dumpDataP m_netLC(NULL), m_pduUserData(NULL), m_pduDataOffset(0U), + m_lastRejectId(0U), m_dumpDataPacket(dumpDataPacket), m_repeatDataPacket(repeatDataPacket), m_dumpCSBKData(dumpCSBKData), diff --git a/dmr/DataPacket.h b/dmr/DataPacket.h index ed28bd9d..95973c79 100644 --- a/dmr/DataPacket.h +++ b/dmr/DataPacket.h @@ -77,6 +77,7 @@ namespace dmr uint8_t* m_pduUserData; uint32_t m_pduDataOffset; + uint32_t m_lastRejectId; bool m_dumpDataPacket; bool m_repeatDataPacket; diff --git a/dmr/Slot.cpp b/dmr/Slot.cpp index e2e12417..24546b71 100644 --- a/dmr/Slot.cpp +++ b/dmr/Slot.cpp @@ -152,11 +152,11 @@ bool Slot::processFrame(uint8_t *data, uint32_t len) if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) { if (m_rssi != 0U) { - ::ActivityLog("DMR", true, "Slot %u, RF voice transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", + ::ActivityLog("DMR", true, "Slot %u RF voice transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); } else { - ::ActivityLog("DMR", true, "Slot %u, RF voice transmission lost, %.1f seconds, BER: %.1f%%", + ::ActivityLog("DMR", true, "Slot %u RF voice transmission lost, %.1f seconds, BER: %.1f%%", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits)); } @@ -354,12 +354,12 @@ void Slot::clock() if (m_netState == RS_NET_AUDIO) { // We've received the voice header haven't we? m_netFrames += 1U; - ::ActivityLog("DMR", false, "Slot %u, network watchdog has expired, %.1f seconds, %u%% packet loss, BER: %.1f%%", + ::ActivityLog("DMR", false, "Slot %u network watchdog has expired, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); m_data->writeEndNet(true); } else { - ::ActivityLog("DMR", false, "Slot %u, network watchdog has expired", m_slotNo); + ::ActivityLog("DMR", false, "Slot %u network watchdog has expired", m_slotNo); m_data->writeEndNet(); } } @@ -547,13 +547,13 @@ void Slot::writeRF_Ext_Func(uint32_t func, uint32_t arg, uint32_t dstId) // generate activity log entry if (func == DMR_EXT_FNCT_CHECK) { - ::ActivityLog("DMR", true, "Slot %u received radio check request from %u to %u", m_slotNo, arg, dstId); + ::ActivityLog("DMR", true, "Slot %u radio check request from %u to %u", m_slotNo, arg, dstId); } else if (func == DMR_EXT_FNCT_INHIBIT) { - ::ActivityLog("DMR", true, "Slot %u received radio inhibit request from %u to %u", m_slotNo, arg, dstId); + ::ActivityLog("DMR", true, "Slot %u radio inhibit request from %u to %u", m_slotNo, arg, dstId); } else if (func == DMR_EXT_FNCT_UNINHIBIT) { - ::ActivityLog("DMR", true, "Slot %u received radio uninhibit request from %u to %u", m_slotNo, arg, dstId); + ::ActivityLog("DMR", true, "Slot %u radio uninhibit request from %u to %u", m_slotNo, arg, dstId); } uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; @@ -603,7 +603,7 @@ void Slot::writeRF_Call_Alrt(uint32_t srcId, uint32_t dstId) m_slotNo, srcId, dstId); } - ::ActivityLog("DMR", true, "Slot %u received call alert request from %u to %u", m_slotNo, srcId, dstId); + ::ActivityLog("DMR", true, "Slot %u call alert request from %u to %u", m_slotNo, srcId, dstId); uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); diff --git a/dmr/VoicePacket.cpp b/dmr/VoicePacket.cpp index 09bd751c..a9aacd83 100644 --- a/dmr/VoicePacket.cpp +++ b/dmr/VoicePacket.cpp @@ -395,7 +395,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) m_slot->setShortLC(m_slot->m_slotNo, dstId, flco, true); } - ::ActivityLog("DMR", true, "Slot %u, received RF late entry from %u to %s%u", m_slot->m_slotNo, srcId, flco == FLCO_GROUP ? "TG " : "", dstId); + ::ActivityLog("DMR", true, "Slot %u RF late entry from %u to %s%u", m_slot->m_slotNo, srcId, flco == FLCO_GROUP ? "TG " : "", dstId); return true; } } @@ -481,7 +481,7 @@ void VoicePacket::processNetwork(const data::Data& dmrData) m_slot->setShortLC(m_slot->m_slotNo, dstId, m_slot->m_data->m_netLC->getFLCO(), true); - ::ActivityLog("DMR", false, "Slot %u, received network late entry from %u to %s%u", + ::ActivityLog("DMR", false, "Slot %u network late entry from %u to %s%u", m_slot->m_slotNo, srcId, m_slot->m_data->m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dstId); } diff --git a/host/Host.cpp b/host/Host.cpp index beb11ade..2b2216e9 100644 --- a/host/Host.cpp +++ b/host/Host.cpp @@ -1009,7 +1009,6 @@ int Host::run() Thread::sleep(1U); } - ::ActivityLog("DVM", true, "Host is down and stopping"); setMode(HOST_STATE_QUIT); delete dmr; diff --git a/p25/Control.cpp b/p25/Control.cpp index 716654bd..71529ddf 100644 --- a/p25/Control.cpp +++ b/p25/Control.cpp @@ -787,20 +787,6 @@ void Control::writeRF_TDU(bool noNetwork) } } -/// -/// -/// -void Control::checkAndReject() -{ - if (m_rfState != RS_RF_LISTENING && m_rfState != RS_RF_DATA) { - LogWarning(LOG_RF, "rejected operation (not setting RF rejection)"); - } - else { - m_rfState = RS_RF_REJECTED; - LogWarning(LOG_RF, "rejected operation"); - } -} - /// /// Helper to set the busy status bits on P25 frame data. /// diff --git a/p25/Control.h b/p25/Control.h index 9d1c51a1..60d3a578 100644 --- a/p25/Control.h +++ b/p25/Control.h @@ -184,9 +184,6 @@ namespace p25 /// Helper to write a P25 TDU packet. void writeRF_TDU(bool noNetwork); - /// - void checkAndReject(); - /// Helper to set the busy status bits on P25 frame data. void setBusyBits(uint8_t* data, uint32_t ssOffset, bool b1, bool b2); /// Helper to add the busy status bits on P25 frame data. diff --git a/p25/DataPacket.cpp b/p25/DataPacket.cpp index d356adc6..07f68e36 100644 --- a/p25/DataPacket.cpp +++ b/p25/DataPacket.cpp @@ -317,7 +317,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len) } break; default: - ::ActivityLog("P25", true, "received RF data transmission from %u to %u, %u blocks", m_rfDataHeader.getLLId(), m_rfDataHeader.getLLId(), m_rfDataHeader.getBlocksToFollow()); + ::ActivityLog("P25", true, "RF data transmission from %u to %u, %u blocks", m_rfDataHeader.getLLId(), m_rfDataHeader.getLLId(), m_rfDataHeader.getBlocksToFollow()); if (m_repeatPDU) { if (m_verbose) { @@ -327,7 +327,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len) writeRF_PDU(); // re-generate PDU and send it on } - ::ActivityLog("P25", true, "end RF data transmission"); + ::ActivityLog("P25", true, "end of RF data transmission"); break; } @@ -379,6 +379,7 @@ bool DataPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, da } else if (dataType == P25_DT_DATA) { writeNet_PDU(); + ::ActivityLog("P25", false, "network data transmission from %u to %u, %u blocks", m_netDataHeader.getLLId(), m_netDataHeader.getLLId(), m_netDataHeader.getBlocksToFollow()); } if (m_p25->m_netState == RS_NET_DATA) { @@ -470,7 +471,7 @@ bool DataPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, da Utils::dump(2U, "!!! *TX P25 Frame - P25_DUID_PDU", pdu + 2U, newByteLength); } - ::ActivityLog("P25", true, "end RF data transmission"); + ::ActivityLog("P25", true, "end of RF data transmission"); m_netDataHeader.reset(); m_netSecondHeader.reset(); @@ -808,8 +809,6 @@ void DataPacket::writeNet_PDU_Header() return; } - ::ActivityLog("P25", true, "received network data transmission from %u to %u, %u blocks", m_netDataHeader.getLLId(), m_netDataHeader.getLLId(), m_netDataHeader.getBlocksToFollow()); - if (m_verbose) { LogMessage(LOG_NET, P25_PDU_STR ", ack = %u, outbound = %u, fmt = $%02X, sap = $%02X, fullMessage = %u, blocksToFollow = %u, padCount = %u, n = %u, seqNo = %u, hdrOffset = %u", m_netDataHeader.getAckNeeded(), m_netDataHeader.getOutbound(), m_netDataHeader.getFormat(), m_netDataHeader.getSAP(), m_netDataHeader.getFullMessage(), diff --git a/p25/TrunkPacket.cpp b/p25/TrunkPacket.cpp index 916ddb2b..d37d0f38 100644 --- a/p25/TrunkPacket.cpp +++ b/p25/TrunkPacket.cpp @@ -52,7 +52,7 @@ using namespace p25; if (!m_p25->m_control) { \ LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, unsupported service, srcId = %u", _SRCID); \ writeRF_TSDU_Deny(P25_DENY_RSN_SYS_UNSUPPORTED_SVC, _PCKT); \ - m_p25->checkAndReject(); \ + m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -62,7 +62,7 @@ using namespace p25; LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, RID rejection, srcId = %u", _SRCID); \ writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_VALID, _PCKT); \ denialInhibit(_SRCID); \ - m_p25->checkAndReject(); \ + m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -71,7 +71,7 @@ using namespace p25; if (!acl::AccessControl::validateSrcId(_DSTID)) { \ LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, RID rejection, dstId = %u", _DSTID); \ writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_NOT_VALID, _PCKT); \ - m_p25->checkAndReject(); \ + m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -80,7 +80,7 @@ using namespace p25; if (!acl::AccessControl::validateTGId(_DSTID)) { \ LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, TGID rejection, dstId = %u", _DSTID); \ writeRF_TSDU_Deny(P25_DENY_RSN_TGT_GROUP_NOT_VALID, _PCKT); \ - m_p25->checkAndReject(); \ + m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -90,7 +90,7 @@ using namespace p25; LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, RID not registered, srcId = %u", _SRCID); \ writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_AUTH, _PCKT); \ writeRF_TSDU_U_Reg_Cmd(_SRCID); \ - m_p25->checkAndReject(); \ + m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -100,7 +100,7 @@ using namespace p25; LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, RID not affiliated to TGID, srcId = %u, dstId = %u", _SRCID, _DSTID); \ writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_AUTH, _PCKT); \ writeRF_TSDU_U_Reg_Cmd(_SRCID); \ - m_p25->checkAndReject(); \ + m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -337,8 +337,6 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request), srcId = %u, dstId = %u", srcId, dstId); } - ::ActivityLog("P25", true, "received group grant request from %u to TG %u", srcId, dstId); - writeRF_TSDU_Grant(true, false); break; case TSBK_IOSP_UU_VCH: @@ -358,8 +356,6 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request), srcId = %u, dstId = %u", srcId, dstId); } - ::ActivityLog("P25", true, "received unit-to-unit grant request from %u to %u", srcId, dstId); - writeRF_TSDU_UU_Ans_Req(srcId, dstId); break; case TSBK_IOSP_UU_ANS: @@ -430,7 +426,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_STS_UPDT (Status Update), status = $%02X, srcId = %u", m_rfTSBK.getStatus(), srcId); } - ::ActivityLog("P25", true, "received status update from %u", srcId); + ::ActivityLog("P25", true, "status update from %u", srcId); if (!m_noStatusAck) { writeRF_TSDU_ACK_FNE(srcId, TSBK_IOSP_STS_UPDT, false, false); @@ -455,7 +451,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) writeRF_TSDU_ACK_FNE(srcId, TSBK_IOSP_MSG_UPDT, false, false); } - ::ActivityLog("P25", true, "received message update from %u", srcId); + ::ActivityLog("P25", true, "message update from %u", srcId); break; case TSBK_IOSP_CALL_ALRT: // validate the source RID @@ -478,7 +474,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_CALL_ALRT (Call Alert), srcId = %u, dstId = %u", srcId, dstId); } - ::ActivityLog("P25", true, "received call alert request from %u to %u", srcId, dstId); + ::ActivityLog("P25", true, "call alert request from %u to %u", srcId, dstId); writeRF_TSDU_Call_Alrt(srcId, dstId); break; @@ -494,7 +490,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) m_rfTSBK.getAIV(), m_rfTSBK.getService(), srcId, dstId); } - ::ActivityLog("P25", true, "received ack response from %u to %u", srcId, dstId); + ::ActivityLog("P25", true, "ack response from %u to %u", srcId, dstId); // bryanb: HACK -- for some reason, if the AIV is false and we have a dstId // its very likely srcId and dstId are swapped so we'll swap them @@ -512,7 +508,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) m_rfTSBK.getAIV(), m_rfTSBK.getService(), m_rfTSBK.getResponse(), srcId, dstId); } - ::ActivityLog("P25", true, "received cancel service request from %u", srcId); + ::ActivityLog("P25", true, "cancel service request from %u", srcId); writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_CAN_SRV_REQ, false, true); break; @@ -536,13 +532,13 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) // generate activity log entry if (m_rfTSBK.getExtendedFunction() == P25_EXT_FNCT_CHECK_ACK) { - ::ActivityLog("P25", true, "received radio check response from %u to %u", dstId, srcId); + ::ActivityLog("P25", true, "radio check response from %u to %u", dstId, srcId); } else if (m_rfTSBK.getExtendedFunction() == P25_EXT_FNCT_INHIBIT_ACK) { - ::ActivityLog("P25", true, "received radio inhibit response from %u to %u", dstId, srcId); + ::ActivityLog("P25", true, "radio inhibit response from %u to %u", dstId, srcId); } else if (m_rfTSBK.getExtendedFunction() == P25_EXT_FNCT_UNINHIBIT_ACK) { - ::ActivityLog("P25", true, "received radio uninhibit response from %u to %u", dstId, srcId); + ::ActivityLog("P25", true, "radio uninhibit response from %u to %u", dstId, srcId); } writeRF_TSDU_SBF(true); @@ -570,7 +566,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) m_rfTSBK.getPatchSuperGroupId()); } - ::ActivityLog("P25", true, "received group affiliation query response from %u to %s %u", srcId, "TG ", dstId); + ::ActivityLog("P25", true, "group affiliation query response from %u to %s %u", srcId, "TG ", dstId); break; case TSBK_ISP_U_DEREG_REQ: // make sure control data is supported @@ -738,7 +734,7 @@ bool TrunkPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, d m_netTSBK.getStatus(), srcId); } - ::ActivityLog("P25", false, "received status update from %u", srcId); + ::ActivityLog("P25", false, "status update from %u", srcId); break; case TSBK_IOSP_MSG_UPDT: // validate the source RID @@ -749,7 +745,7 @@ bool TrunkPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, d m_netTSBK.getMessage(), srcId, dstId); } - ::ActivityLog("P25", false, "received message update from %u", srcId); + ::ActivityLog("P25", false, "message update from %u", srcId); break; case TSBK_IOSP_CALL_ALRT: // validate the source RID @@ -768,7 +764,7 @@ bool TrunkPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, d LogMessage(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_CALL_ALRT (Call Alert), srcId = %u, dstId = %u", srcId, dstId); } - ::ActivityLog("P25", false, "received call alert request from %u to %u", srcId, dstId); + ::ActivityLog("P25", false, "call alert request from %u to %u", srcId, dstId); break; case TSBK_IOSP_ACK_RSP: // validate the source RID @@ -782,7 +778,7 @@ bool TrunkPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, d m_netTSBK.getAIV(), m_netTSBK.getService(), dstId, srcId); } - ::ActivityLog("P25", false, "received ack response from %u to %u", srcId, dstId); + ::ActivityLog("P25", false, "ack response from %u to %u", srcId, dstId); break; case TSBK_IOSP_EXT_FNCT: // validate the target RID @@ -1144,7 +1140,7 @@ void TrunkPacket::writeRF_TSDU_Call_Alrt(uint32_t srcId, uint32_t dstId) LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_CALL_ALRT (Call Alert), srcId = %u, dstId = %u", srcId, dstId); } - ::ActivityLog("P25", true, "received call alert request from %u to %u", srcId, dstId); + ::ActivityLog("P25", true, "call alert request from %u to %u", srcId, dstId); m_rfTSBK.setLCO(TSBK_IOSP_CALL_ALRT); m_rfTSBK.setSrcId(srcId); @@ -1177,13 +1173,13 @@ void TrunkPacket::writeRF_TSDU_Ext_Func(uint32_t func, uint32_t arg, uint32_t ds // generate activity log entry if (func == P25_EXT_FNCT_CHECK) { - ::ActivityLog("P25", true, "received radio check request from %u to %u", arg, dstId); + ::ActivityLog("P25", true, "radio check request from %u to %u", arg, dstId); } else if (func == P25_EXT_FNCT_INHIBIT) { - ::ActivityLog("P25", true, "received radio inhibit request from %u to %u", arg, dstId); + ::ActivityLog("P25", true, "radio inhibit request from %u to %u", arg, dstId); } else if (func == P25_EXT_FNCT_UNINHIBIT) { - ::ActivityLog("P25", true, "received radio uninhibit request from %u to %u", arg, dstId); + ::ActivityLog("P25", true, "radio uninhibit request from %u to %u", arg, dstId); } writeRF_TSDU_SBF(false); @@ -1202,7 +1198,7 @@ void TrunkPacket::writeRF_TSDU_Grp_Aff_Q(uint32_t dstId) LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_OSP_GRP_AFF_Q (Group Affiliation Query), dstId = %u", dstId); } - ::ActivityLog("P25", true, "received group affiliation query command from %u to %u", P25_WUID_SYS, dstId); + ::ActivityLog("P25", true, "group affiliation query command from %u to %u", P25_WUID_SYS, dstId); m_rfTSBK.setLCO(TSBK_OSP_GRP_AFF_Q); m_rfTSBK.setSrcId(P25_WUID_SYS); @@ -1220,7 +1216,7 @@ void TrunkPacket::writeRF_TSDU_U_Reg_Cmd(uint32_t dstId) LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_OSP_U_REG_CMD (Unit Registration Command), dstId = %u", dstId); } - ::ActivityLog("P25", true, "received unit registration command from %u to %u", P25_WUID_SYS, dstId); + ::ActivityLog("P25", true, "unit registration command from %u to %u", P25_WUID_SYS, dstId); m_rfTSBK.setLCO(TSBK_OSP_U_REG_CMD); m_rfTSBK.setSrcId(P25_WUID_SYS); @@ -1946,7 +1942,10 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip) if (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_rfState != RS_RF_DATA) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", m_rfTSBK.getDstId()); writeRF_TSDU_Deny(P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); - m_p25->checkAndReject(); + + ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); + m_p25->m_rfState = RS_RF_REJECTED; + m_rfTSBK.setLCO(lco); return false; } @@ -1954,7 +1953,10 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip) if (m_p25->m_netState != RS_NET_IDLE && m_rfTSBK.getDstId() == m_p25->m_netLastDstId) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", m_rfTSBK.getDstId()); writeRF_TSDU_Deny(P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); - m_p25->checkAndReject(); + + ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); + m_p25->m_rfState = RS_RF_REJECTED; + m_rfTSBK.setLCO(lco); return false; } @@ -1963,7 +1965,7 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip) if (m_p25->m_rfLastDstId != 0U) { if (m_p25->m_rfLastDstId != m_rfTSBK.getDstId() && (m_p25->m_rfTGHang.isRunning() && !m_p25->m_rfTGHang.hasExpired())) { writeRF_TSDU_Deny(P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); - m_p25->checkAndReject(); + m_p25->m_rfState = RS_RF_REJECTED; m_rfTSBK.setLCO(lco); return false; } @@ -1974,14 +1976,20 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip) if (grp) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) queued, no channels available, dstId = %u", m_rfTSBK.getDstId()); writeRF_TSDU_Queue(P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_IOSP_GRP_VCH); - m_p25->checkAndReject(); + + ::ActivityLog("P25", true, "group grant request from %u to TG %u queued", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); + m_p25->m_rfState = RS_RF_REJECTED; + m_rfTSBK.setLCO(lco); return false; } else { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) queued, no channels available, dstId = %u", m_rfTSBK.getDstId()); writeRF_TSDU_Queue(P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_IOSP_UU_VCH); - m_p25->checkAndReject(); + + ::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u queued", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); + m_p25->m_rfState = RS_RF_REJECTED; + m_rfTSBK.setLCO(lco); return false; } @@ -2010,6 +2018,8 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip) } if (grp) { + ::ActivityLog("P25", true, "group grant request from %u to TG %u", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); + if (m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Grant), emerg = %u, encrypt = %u, prio = %u, chNo = %u, srcId = %u, dstId = %u", m_rfTSBK.getEmergency(), m_rfTSBK.getEncrypted(), m_rfTSBK.getPriority(), m_rfTSBK.getGrpVchNo(), m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); @@ -2020,6 +2030,8 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip) writeRF_TSDU_SBF(true, true); } else { + ::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); + if (m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Grant), emerg = %u, encrypt = %u, prio = %u, chNo = %u, srcId = %u, dstId = %u", m_rfTSBK.getEmergency(), m_rfTSBK.getEncrypted(), m_rfTSBK.getPriority(), m_rfTSBK.getGrpVchNo(), m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); @@ -2126,20 +2138,23 @@ bool TrunkPacket::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId) // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_AFF (Group Affiliation Response) denial, RID rejection, srcId = %u", srcId); - m_rfTSBK.setResponse(P25_RSP_DENY); + ::ActivityLog("P25", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); + m_rfTSBK.setResponse(P25_RSP_REFUSED); } // validate the source RID is registered if (!hasSrcIdUnitReg(srcId) && m_verifyReg) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_AFF (Group Affiliation Response) denial, RID not registered, srcId = %u", srcId); - m_rfTSBK.setResponse(P25_RSP_DENY); + ::ActivityLog("P25", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); + m_rfTSBK.setResponse(P25_RSP_REFUSED); } // validate the talkgroup ID if (m_rfTSBK.getGroup()) { if (!acl::AccessControl::validateTGId(dstId)) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_AFF (Group Affiliation Response) denial, TGID rejection, dstId = %u", dstId); - m_rfTSBK.setResponse(P25_RSP_REFUSED); + ::ActivityLog("P25", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); + m_rfTSBK.setResponse(P25_RSP_DENY); } } @@ -2149,7 +2164,7 @@ bool TrunkPacket::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId) m_patchSuperGroup, srcId, dstId); } - ::ActivityLog("P25", true, "received group affiliation request from %u to %s %u", srcId, "TG ", dstId); + ::ActivityLog("P25", true, "group affiliation request from %u to %s %u", srcId, "TG ", dstId); ret = true; // update dynamic affiliation table @@ -2172,13 +2187,15 @@ void TrunkPacket::writeRF_TSDU_U_Reg_Rsp(uint32_t srcId) // validate the system ID if (m_rfTSBK.getSysId() != m_siteData.sysId()) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_U_REG (Unit Registration Response) denial, SYSID rejection, sysId = $%03X", m_rfTSBK.getSysId()); + ::ActivityLog("P25", true, "unit registration request from %u denied", srcId); m_rfTSBK.setResponse(P25_RSP_DENY); } // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_U_REG (Unit Registration Response) denial, RID rejection, srcId = %u", srcId); - m_rfTSBK.setResponse(P25_RSP_DENY); + ::ActivityLog("P25", true, "unit registration request from %u denied", srcId); + m_rfTSBK.setResponse(P25_RSP_REFUSED); } if (m_rfTSBK.getResponse() == P25_RSP_ACCEPT) { @@ -2187,7 +2204,7 @@ void TrunkPacket::writeRF_TSDU_U_Reg_Rsp(uint32_t srcId) m_rfTSBK.getSysId(), m_rfTSBK.getNetId()); } - ::ActivityLog("P25", true, "received unit registration request from %u", srcId); + ::ActivityLog("P25", true, "unit registration request from %u", srcId); // update dynamic unit registration table if (!hasSrcIdUnitReg(srcId)) { @@ -2219,7 +2236,7 @@ void TrunkPacket::writeRF_TSDU_U_Dereg_Ack(uint32_t srcId) srcId, m_rfTSBK.getSysId(), m_rfTSBK.getNetId()); } - ::ActivityLog("P25", true, "received unit deregistration request from %u", srcId); + ::ActivityLog("P25", true, "unit deregistration request from %u", srcId); // remove dynamic unit registration table entry if (std::find(m_unitRegTable.begin(), m_unitRegTable.end(), srcId) != m_unitRegTable.end()) { diff --git a/p25/VoicePacket.cpp b/p25/VoicePacket.cpp index c98beaa4..a9e5212e 100644 --- a/p25/VoicePacket.cpp +++ b/p25/VoicePacket.cpp @@ -222,10 +222,18 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { - LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId); - m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_VALID, (m_rfLC.getGroup() ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH)); - m_p25->m_trunk->denialInhibit(srcId); - m_p25->checkAndReject(); + if (m_lastRejectId == 0U || m_lastRejectId != srcId) { + LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId); + m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_VALID, (m_rfLC.getGroup() ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH)); + m_p25->m_trunk->denialInhibit(srcId); + + ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); + m_lastRejectId = srcId; + } + + m_p25->m_rfLastDstId = 0U; + m_p25->m_rfTGHang.stop(); + m_p25->m_rfState = RS_RF_REJECTED; return false; } @@ -233,18 +241,34 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) if (!m_rfLC.getGroup()) { // validate the target RID if (!acl::AccessControl::validateSrcId(dstId)) { - LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId); - m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_NOT_VALID, TSBK_IOSP_UU_VCH); - m_p25->checkAndReject(); + if (m_lastRejectId == 0 || m_lastRejectId != dstId) { + LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId); + m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_NOT_VALID, TSBK_IOSP_UU_VCH); + + ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); + m_lastRejectId = dstId; + } + + m_p25->m_rfLastDstId = 0U; + m_p25->m_rfTGHang.stop(); + m_p25->m_rfState = RS_RF_REJECTED; return false; } } else { // validate the target ID, if the target is a talkgroup if (!acl::AccessControl::validateTGId(dstId)) { - LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId); - m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_GROUP_NOT_VALID, TSBK_IOSP_GRP_VCH); - m_p25->checkAndReject(); + if (m_lastRejectId == 0 || m_lastRejectId != dstId) { + LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId); + m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_GROUP_NOT_VALID, TSBK_IOSP_GRP_VCH); + + ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); + m_lastRejectId = dstId; + } + + m_p25->m_rfLastDstId = 0U; + m_p25->m_rfTGHang.stop(); + m_p25->m_rfState = RS_RF_REJECTED; return false; } } @@ -254,15 +278,24 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) if (m_rfLC.getGroup() && m_p25->m_control) { if (!m_p25->m_trunk->hasSrcIdGrpAff(srcId, dstId) && m_p25->m_trunk->m_verifyAff) { - LogWarning(LOG_RF, P25_HDU_STR " denial, RID not affiliated to TGID, srcId = %u, dstId = %u", srcId, dstId); - m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_AUTH, TSBK_IOSP_GRP_VCH); - m_p25->m_trunk->writeRF_TSDU_U_Reg_Cmd(srcId); - m_p25->checkAndReject(); + if (m_lastRejectId == 0 || m_lastRejectId != srcId) { + LogWarning(LOG_RF, P25_HDU_STR " denial, RID not affiliated to TGID, srcId = %u, dstId = %u", srcId, dstId); + m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_AUTH, TSBK_IOSP_GRP_VCH); + m_p25->m_trunk->writeRF_TSDU_U_Reg_Cmd(srcId); + + ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); + m_lastRejectId = srcId; + } + + m_p25->m_rfLastDstId = 0U; + m_p25->m_rfTGHang.stop(); + m_p25->m_rfState = RS_RF_REJECTED; return false; } } - ::ActivityLog("P25", true, "received RF %svoice transmission from %u to %s%u", m_rfLC.getEncrypted() ? "encrypted ": "", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); + m_lastRejectId = 0U; + ::ActivityLog("P25", true, "RF %svoice transmission from %u to %s%u", m_rfLC.getEncrypted() ? "encrypted ": "", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); if (m_p25->m_control) { if (m_rfLC.getGroup() && (m_lastPatchGroup != dstId) && @@ -581,12 +614,12 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) if (m_p25->m_rfState == RS_RF_AUDIO) { if (m_p25->m_rssi != 0U) { - ::ActivityLog("P25", true, "received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI : -%u / -%u / -%u dBm", + ::ActivityLog("P25", true, "RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI : -%u / -%u / -%u dBm", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_p25->m_minRSSI, m_p25->m_maxRSSI, m_p25->m_aveRSSI / m_p25->m_rssiCount); } else { - ::ActivityLog("P25", true, "received RF end of transmission, %.1f seconds, BER: %.1f%%", + ::ActivityLog("P25", true, "RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); } @@ -842,6 +875,7 @@ VoicePacket::VoicePacket(Control* p25, network::BaseNetwork* network, bool debug m_lastDUID(P25_DUID_TDU), m_lastIMBE(NULL), m_hadVoice(false), + m_lastRejectId(0U), m_lastPatchGroup(0U), m_silenceThreshold(124U), m_verbose(verbose), @@ -1045,7 +1079,7 @@ void VoicePacket::writeNet_HDU(const lc::LC& control, const data::LowSpeedData& m_p25->m_trunk->writeRF_ControlData(255U, 0U, false); } - ::ActivityLog("P25", false, "received %snetwork transmission from %u to %s%u", m_netLC.getEncrypted() ? "encrypted " : "", srcId, group ? "TG " : "", dstId); + ::ActivityLog("P25", false, "network %svoice transmission from %u to %s%u", m_netLC.getEncrypted() ? "encrypted " : "", srcId, group ? "TG " : "", dstId); m_rfLC.reset(); m_rfLC.setMI(mi); diff --git a/p25/VoicePacket.h b/p25/VoicePacket.h index caf7feef..51f6441b 100644 --- a/p25/VoicePacket.h +++ b/p25/VoicePacket.h @@ -97,6 +97,7 @@ namespace p25 uint8_t m_lastDUID; uint8_t* m_lastIMBE; bool m_hadVoice; + uint32_t m_lastRejectId; uint32_t m_lastPatchGroup;