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;